diff --git a/app/(home)/docs/page.tsx b/app/(home)/docs/page.tsx
index 8fe07e8..7be8f4b 100644
--- a/app/(home)/docs/page.tsx
+++ b/app/(home)/docs/page.tsx
@@ -1,15 +1,8 @@
import Link from "next/link";
import {
- Database,
LayoutDashboard,
Terminal,
Code2,
- Waypoints,
- Hammer,
- Compass,
- Zap,
- ArrowRight,
- Book,
} from "lucide-react";
import { Card, Cards } from "fumadocs-ui/components/card";
import { createMetadata } from "@/lib/metadata";
@@ -18,7 +11,7 @@ export function generateMetadata() {
return createMetadata({
title: "Konnektr Docs - Documentation Portal",
description:
- "Everything you need to build, manage, and scale digital twin solutions with the Konnektr Platform.",
+ "Everything you need to build, manage, and scale with Konnektr platform tools.",
});
}
@@ -30,65 +23,11 @@ export default function DocsPage() {
Konnektr Docs
- Everything you need to build, manage, and scale digital twin solutions
- with the Konnektr Platform.
+ Documentation for Konnektr platform tools — control planes, Kubernetes operators, and expression languages.
-
-
-
-
- Konnektr Graph
-
-
- The heart of your digital twin ecosystem.
-
-
-
- Go to Graph Docs
-
-
-
-
- }
- />
- }
- />
- }
- />
- }
- />
-
-
-
-
-
-
Other Platform Tools
-
- Specialized tools to extend your digital twin capabilities.
-
-
-
+
KtrlPlane
- Cloud control plane for users, organizations, and resource
- management.
+ Cloud control plane for users, organizations, and resource management.
@@ -111,8 +49,7 @@ export default function DocsPage() {
DB Query Operator
- Bridge database state with Kubernetes infrastructure
- automatically.
+ Bridge database state with Kubernetes infrastructure automatically.
@@ -129,44 +66,6 @@ export default function DocsPage() {
-
-
-
- Soon
-
-
-
-
Konnektr Flow
-
- Real-time data orchestration and event processing engine.
-
-
-
-
-
-
-
-
- Ready to build?
-
-
- Deploy a managed Konnektr Graph instance in seconds and start modeling
- your physical assets digitally.
-
-
-
- Deploy Graph Now
-
-
- Read the Guide
-
-
);
diff --git a/app/(home)/layout.tsx b/app/(home)/layout.tsx
index a9ce820..186f74d 100644
--- a/app/(home)/layout.tsx
+++ b/app/(home)/layout.tsx
@@ -1,12 +1,6 @@
import { HomeLayout } from 'fumadocs-ui/layouts/home';
-import {
- NavbarMenu,
- NavbarMenuContent,
- NavbarMenuLink,
- NavbarMenuTrigger,
-} from "fumadocs-ui/layouts/home/navbar";
import { baseOptions, linkItems } from "@/lib/layout.shared";
-import { Book, ComponentIcon, Pencil, PlusIcon, Server, Database, LayoutDashboard, Terminal, Code2, Waypoints, Compass, Zap, Hammer } from "lucide-react";
+import { LayoutDashboard, Terminal, Code2 } from "lucide-react";
import Link from "next/link";
export default function Layout({ children }: LayoutProps<"/">) {
@@ -19,11 +13,6 @@ export default function Layout({ children }: LayoutProps<"/">) {
on: "menu",
text: "Documentation",
items: [
- {
- text: "Konnektr Graph",
- url: "/docs/graph",
- icon: ,
- },
{
text: "KtrlPlane",
url: "/docs/ktrlplane",
@@ -45,96 +34,12 @@ export default function Layout({ children }: LayoutProps<"/">) {
type: "custom",
on: "nav",
children: (
-
-
- Documentation
-
-
-
-
-
-
-
-
Konnektr Graph
-
- High-performance, Azure Digital Twins compatible graph
- database.
-
-
-
-
-
-
Quick Start
-
- Get your digital twin runtime running in minutes.
-
-
-
-
-
-
DTDL & Models
-
- Learn about Digital Twins Definition Language.
-
-
-
+
+ Documentation
+
),
},
...linkItems,
diff --git a/app/api/proxy/route.ts b/app/api/proxy/route.ts
deleted file mode 100644
index 081a8a8..0000000
--- a/app/api/proxy/route.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { openapi } from "@/lib/openapi";
-
-export const { GET, HEAD, PUT, POST, PATCH, DELETE } = openapi.createProxy({
- allowedOrigins: ["https://demo.api.graph.konnektr.io", "https://*.api.graph.konnektr.io"],
-});
diff --git a/app/global.css b/app/global.css
index c82a1ea..0d94382 100644
--- a/app/global.css
+++ b/app/global.css
@@ -1,7 +1,6 @@
@import 'tailwindcss';
@import 'fumadocs-ui/css/shadcn.css';
@import 'fumadocs-ui/css/preset.css';
-@import 'fumadocs-openapi/css/preset.css';
@custom-variant dark (&:is(.dark *));
diff --git a/components/api-page.client.tsx b/components/api-page.client.tsx
deleted file mode 100644
index 85c8bef..0000000
--- a/components/api-page.client.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-"use client";
-import { defineClientConfig } from "fumadocs-openapi/ui/client";
-
-export default defineClientConfig({
- // client-side config
-});
diff --git a/components/api-page.tsx b/components/api-page.tsx
deleted file mode 100644
index 74c28d8..0000000
--- a/components/api-page.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import { openapi } from "@/lib/openapi";
-import { createAPIPage } from "fumadocs-openapi/ui";
-import client from "./api-page.client";
-export const APIPage = createAPIPage(openapi, {
- client,
-});
diff --git a/content/blog/2025-12-19_introducing-konnektr-graph.mdx b/content/blog/2025-12-19_introducing-konnektr-graph.mdx
deleted file mode 100644
index 3071dc0..0000000
--- a/content/blog/2025-12-19_introducing-konnektr-graph.mdx
+++ /dev/null
@@ -1,188 +0,0 @@
----
-title: Introducing Konnektr Graph — open-source digital twins on PostgreSQL
-description: "We're launching Konnektr Graph: a semantic property graph database built on PostgreSQL + Apache AGE, compatible with the Azure Digital Twins API and designed for both digital twin systems and AI agents."
-date: 2025-12-19
-author: Niko Raes
----
-
-## The problem we kept running into
-
-If you've tried to build **digital twins** in a real enterprise environment, you've probably felt this tension:
-
-- You want a **graph database** because the world is connected: assets, locations, processes, sensors, people, constraints.
-- You want **operational boring** because this is infrastructure: backups, monitoring, HA, permissions, audits.
-- You want to avoid **vendor lock-in**, because “core system of record” and “can't migrate” shouldn't be in the same sentence.
-- You want data that's actually usable for **AI agents**: not a pile of unvalidated strings, but structured context that stays consistent over time.
-
-And yet, the options often force trade-offs:
-
-- Managed graph offerings can be great, but the moment your solution becomes critical, pricing and portability start to matter.
-- General-purpose graph engines sometimes come with new operational surfaces, new query languages, and new reliability concerns.
-- "AI memory" systems are frequently built on top of documents alone, which can be fine—until you need guarantees like *model validation*, *relationships*, and *governance*.
-
-We built Konnektr because we kept wanting the same thing: an open, reliable foundation for digital twin systems, without turning every project into a long-term platform bet.
-
-## The journey (and the “why” behind it)
-
-Konnektr didn't start as a “let's build a company” idea. It started as a recurring pattern we saw while working with digital twin projects: the moment you go from a proof-of-concept to production, the requirements get serious.
-
-You need:
-
-- A **model** (and a language to express it) so your team can agree on what a “Pump” or “Station” means.
-- A **graph** so you can traverse from one part of the system to another (and answer questions you didn't anticipate on day one).
-- A **platform** you can run for years, where upgrades and outages don't feel like existential risks.
-
-We spent a lot of time with the Azure Digital Twins ecosystem: DTDL models, the API surface, and the official SDKs. And while that experience was productive, it also highlighted a gap:
-
-> Many teams want the Azure Digital Twins developer experience, but they also want control: open source, portability, and predictable operations.
-
-So we decided to build Konnektr in the open—starting with the piece that everything else depends on: the graph.
-
-## What we built: Konnektr Graph
-
-Today we're launching **Konnektr Graph**, our flagship product and the first major building block of the Konnektr platform.
-
-Konnektr Graph is a **semantic property graph** database that:
-
-- Runs on **PostgreSQL** with **Apache AGE** for graph capabilities
-- Is **Azure Digital Twins API compatible**, so you can use the official Azure SDKs
-- Has **DTDL** model validation built in (because model drift is real)
-- Supports “read for AI agents” workflows via **hybrid vector + graph search**
-- Deploys in minutes as a managed service or as a self-hosted database
-- Uses **Apache 2.0** licensing and is fully open source
-
-If you've ever wished you could keep the same digital twin programming model while simplifying operations and keeping portability, this is for you.
-
-## Why PostgreSQL + Apache AGE?
-
-This was a deliberate choice, and it's central to how we think about infrastructure.
-
-### PostgreSQL is the “boring” we want
-
-PostgreSQL has earned its place in production stacks for a reason:
-
-- Reliability and durability are proven.
-- Your team already has tooling: migrations, backups, monitoring, observability, access control.
-- Your platform team can operate it without learning a brand new operational playbook.
-
-For infrastructure-critical systems—like digital twin platforms—**open source is non-negotiable**. PostgreSQL is one of the best examples of what open source looks like when it's trusted at the highest levels.
-
-### Extensions are a superpower, not a hack
-
-Digital twins rarely live alone. You often want the graph plus:
-
-- **pgvector** for AI embeddings and similarity search
-- **PostGIS** for spatial data (assets on a map, routes, zones, proximity)
-- Mature Postgres features: indexing, partitioning, roles, RLS, logical replication
-
-By building on Postgres, you can evolve your stack without replacing it.
-
-### Apache AGE gives us a property graph on Postgres
-
-Apache AGE adds property graph capabilities (nodes, edges, properties) as a Postgres extension. That matters because it keeps the “center of gravity” where most teams are already comfortable: PostgreSQL.
-
-We're intentionally focusing on a pragmatic sweet spot:
-
-- A property graph you can traverse and query efficiently
-- Without moving your data into a separate specialized system
-- While preserving the operational maturity of Postgres
-
-## Why Azure Digital Twins API compatibility?
-
-It's simple: we want developers to ship.
-
-The Azure Digital Twins API and SDKs are a well-known interface for building digital twin applications. A lot of teams have already written code around these clients, patterns, and models.
-
-Konnektr Graph is designed to be a **drop-in replacement** at the API level:
-
-- Use the official Azure SDKs for .NET, Python, and JavaScript
-- Keep your existing integration patterns
-- Typically, you only change configuration (like the service endpoint), not your application logic
-
-This also keeps the ecosystem approachable: you can onboard engineers faster, and you don't need to introduce an “exotic query language” as your primary API contract.
-
-## Model validation matters (especially for AI)
-
-A lot of systems look fine until you ask them to scale across teams.
-
-Without validation, digital twin graphs slowly accumulate inconsistencies:
-
-- Missing required properties
-- Twins created with the wrong model
-- Relationships that violate your domain rules
-- “Temporary” fields that become permanent
-
-DTDL-based validation gives you a way to keep a shared language between teams and tools—and it makes downstream use (including AI agent workflows) much more trustworthy.
-
-We're building Konnektr Graph to be a place where you can store context and still have confidence in it months later.
-
-## Who Konnektr Graph is for
-
-We built Konnektr Graph for developers and technical decision-makers who want a solid foundation for connected data.
-
-Some of the use cases we're targeting from day one:
-
-- **Digital twin infrastructure**: water networks, traffic systems, rail, smart cities
-- **IoT platforms**: device hierarchies, telemetry relationships, dependency graphs
-- **AI agent knowledge bases**: structured semantic context without the complexity of RDF-heavy stacks
-- **Complex business relationships**: org charts, supply chains, project dependencies, ownership and responsibility graphs
-
-If you need to answer questions like “what is impacted if this asset fails?” or “what does this sensor influence?” or “what should an agent consider before taking action?”, a semantic property graph is a strong fit.
-
-## Operational simplicity (because you'll run this for years)
-
-Konnektr Graph is meant to feel like a Postgres workload:
-
-- Standard PostgreSQL operations for backups and restores
-- Familiar monitoring and metrics pipelines
-- A clear path to production hardening (roles, permissions, HA patterns)
-
-You shouldn't have to choose between “graph” and “operational sanity.”
-
-## How to try it today
-
-You can get started in a few different ways:
-
-- Deploy Konnektr Graph (managed): https://ktrlplane.konnektr.io/resources/create?resource_type=Konnektr.Graph
-- Product page: https://konnektr.io/graph
-- Documentation: https://docs.konnektr.io
-- GitHub (source + issues): https://github.com/konnektr-io/pg-age-digitaltwins
-
-We also offer a simple pricing model for managed hosting:
-
-- Free tier: **500 twins**
-- Standard tier: **$99/month** with eventing and MCP server
-
-Self-hosting is always free.
-
-## Trade-offs and what's still evolving
-
-This is a launch, not a finish line.
-
-Building a semantic property graph on PostgreSQL + Apache AGE is powerful, but it comes with real engineering work:
-
-- Some workloads need careful indexing and query tuning (as they do in Postgres generally).
-- Compatibility is a journey: we're prioritizing the core Azure Digital Twins API surface and expanding coverage based on real user needs.
-- Hybrid search for AI agents is evolving fast; we're building the primitives, and we expect the community to help shape what “good” looks like in practice.
-
-Our promise is not "everything on day one." Our promise is openness, a strong foundation, and steady progress—made in public.
-
-## What's next for Konnektr
-
-Konnektr Graph is the first product in a broader open-source platform we're building:
-
-- **Assembler** — an AI-powered digital twin builder
-- **Flow** — real-time data and event orchestration
-- **Compass** — analytics and insights for digital twin systems
-
-The goal is a cohesive toolbox where you can go from “we have assets and telemetry” to “we have a governed twin graph and intelligent automation” without stitching together a dozen proprietary components.
-
-## Help us build this in public
-
-If Konnektr Graph resonates with you, we'd love your input—especially early, when it can shape the roadmap.
-
-- Try a deployment and tell us what felt easy or painful: https://konnektr.io/graph
-- Skim the docs and point out gaps: https://docs.konnektr.io
-- Open issues, request features, or contribute code: https://github.com/konnektr-io/pg-age-digitaltwins
-
-This is the beginning. If you're building digital twins, an IoT platform, or an AI agent system that needs trustworthy context, we'd love to build alongside you.
diff --git a/content/blog/2025-12-25_event-history.mdx b/content/blog/2025-12-25_event-history.mdx
deleted file mode 100644
index 2d78639..0000000
--- a/content/blog/2025-12-25_event-history.mdx
+++ /dev/null
@@ -1,284 +0,0 @@
----
-title: "Real-Time Events Meet Time-Travel Queries: Konnektr Graph's New Superpowers"
-description: "Announcing Event Notifications and Data History in Konnektr Graph: enabling temporal memory for digital twins and AI agents."
-date: 2025-12-25
-author: Niko Raes
----
-
-**Building the bridge between live digital twins and intelligent memory**
-
-Today we're announcing two major features for Konnektr Graph that transform it from a graph database into a complete temporal knowledge platform: **Event Notifications** and **Data History**. Together, they enable you to build reactive systems that respond to changes in real-time while maintaining perfect memory of everything that's ever happened.
-
-If you're building AI agents that need to reason about time, digital twins that trigger automation, or analytical systems that need to answer "what was the state at 3 AM last Tuesday?"—this changes everything.
-
-Available now for all Standard tier instances ($99/mo).
-
-## The Problem: Living in the Eternal Present
-
-Most graph databases give you a powerful snapshot of *right now*. Query the current state, traverse relationships, run analytics. But the moment something changes, the past is gone.
-
-This creates real problems:
-
-**For digital twin systems:**
-- "Which valve was open when the pressure spike occurred?"
-- "Show me the dependency chain as it existed before the network reconfiguration"
-- "What was the configuration of the system when this anomaly was detected?"
-
-**For AI agents:**
-- "What changed since you last checked?"
-- "Has this relationship existed before?"
-- "Show me the pattern of changes over the last week"
-
-**For reactive automation:**
-- "Trigger maintenance workflow when this twin's temperature exceeds threshold"
-- "Send alerts when critical relationships are deleted"
-- "Archive all changes to compliance storage in real-time"
-
-You need two capabilities that seem contradictory: **instant reactions** to changes, and **perfect memory** of historical state.
-
-## What We Built: Event Streams + Time Machine
-
-### Event Notifications: React to Change in Real-Time
-
-Every mutation in your graph—twin created, property updated, relationship deleted—now generates a real-time event notification that can be routed to:
-
-- **Kafka / Azure Event Hubs / Fabric Event Streams**: Stream to data pipelines, analytics platforms, or other microservices
-- **MQTT**: Integrate with IoT platforms and edge systems
-- **Webhooks**: Trigger automation, send alerts, or integrate with any HTTP endpoint
-- **Azure Data Explorer (Kusto) / Fabric Real-Time Intelligence**: Archive to time-series analytics
-
-Events conform to the CloudEvents 1.0 specification, making them interoperable with the entire cloud-native ecosystem.
-
-**Event types include:**
-- Twin lifecycle (create/delete)
-- Twin property changes (with JSON patch format)
-- Relationship lifecycle (create/delete)
-- Relationship property changes
-- Telemetry messages
-
-### Data History: Query Any Point in Time
-
-While events flow in real-time, Data History automatically archives every change to Azure Data Explorer (Kusto), Microsoft Fabric Real-Time Intelligence, or any Kafka-compatible endpoint where you can store it in your preferred database.
-
-This unlocks powerful capabilities:
-
-**Temporal queries:**
-```kusto
-// Reconstruct the graph as it existed at a specific timestamp
-AdtPropertyEvents
-| where TimeStamp <= datetime(2025-01-15 14:30:00)
-| summarize arg_max(TimeStamp, *) by Id, Key
-```
-
-**Change analysis:**
-```kusto
-// Find all twins whose temperature exceeded 80°C in the last 24 hours
-AdtPropertyEvents
-| where TimeStamp > ago(24h)
-| where Key == "temperature" and todouble(Value) > 80
-| distinct Id
-```
-
-**Impact tracing:**
-```kusto
-// Show relationship changes affecting a critical asset
-AdtRelationshipLifeCycleEvents
-| where Source == "CriticalPump_01" or Target == "CriticalPump_01"
-| where TimeStamp > ago(7d)
-| order by TimeStamp desc
-```
-
-## The Hybrid Graph Advantage: Where AI Meets Time
-
-Here's where things get interesting. Konnektr Graph isn't just a digital twin database—it's positioned at the intersection of **validated knowledge graphs** and **AI memory systems**.
-
-You can now:
-
-1. **Store vector embeddings** as twin properties (using PostgreSQL's pgvector)
-2. **Track changes to those embeddings** over time via Data History
-3. **Query historical graph structure** using graph reconstruction
-4. **React to changes** with AI agents via real-time event notifications
-
-### Use Case: Intelligent Maintenance Prediction
-
-Imagine a manufacturing digital twin where:
-
-1. Each asset twin has a `maintenanceContext` property containing a vector embedding of recent operational data
-2. When anomalies are detected, the twin's properties update
-3. **Event notification** triggers an AI agent to investigate
-4. The agent queries **Data History** to:
- - Reconstruct the graph topology at the time of the anomaly
- - Retrieve historical embeddings to understand normal vs. anomalous behavior
- - Perform similarity analysis across historical states
-5. The agent identifies patterns: "This failure mode happened 3 times before, always preceded by this relationship configuration"
-
-This is the power of **hybrid graph + vector + time-series** all working together.
-
-### Use Case: Compliance and Audit Trails
-
-For regulated industries, you need perfect auditability:
-
-- **Data History** archives every change with timestamps and context
-- Query "who changed what, when" across your entire digital twin estate
-- Prove compliance by reconstructing system state at any historical point
-- Export audit trails directly for regulatory reporting
-
-### Use Case: AI Agent Memory with Temporal Context
-
-AI agents need more than just current state—they need *memory of change*:
-
-- **Agent queries graph**: "Show me all sensors related to Zone-7"
-- **Event notification triggers**: "Temperature sensor in Zone-7 just updated"
-- **Agent checks history**: "Has this sensor's value changed this rapidly before?"
-- **Agent reasons temporally**: "Last time this happened, the downstream chiller failed 2 hours later"
-
-The combination of real-time events and historical queries gives agents genuine temporal reasoning ability.
-
-## Storage Options for Data History
-
-Data History uses an optimized event format that can be stored anywhere:
-
-**Azure Data Explorer / Fabric Real-Time Intelligence:**
-Kusto provides native graph query capabilities, allowing you to reconstruct historical graph topology and run graph algorithms on past data. Combined with vector similarity search, it's the most powerful option for temporal analytics.
-
-**Your Own Storage:**
-Route DataHistory events to Kafka, then store in:
-- PostgreSQL with TimescaleDB (time-series optimized)
-- InfluxDB (IoT telemetry focus)
-- ClickHouse (high-performance analytics)
-- Parquet files in data lakes (long-term archival)
-- Any database your team already operates
-
-The flexibility means you can choose the storage backend that fits your infrastructure and compliance requirements.
-
-## How Event Routing Works
-
-Konnektr Graph captures every change to your digital twin graph and routes those changes as CloudEvents to external systems.
-
-**Event Sinks** define where events should be sent—Kafka brokers, MQTT brokers, webhook endpoints, or Azure Data Explorer clusters. You configure connection details and authentication for each sink.
-
-**Event Routes** define which events flow to which sinks. You can have multiple routes to the same sink with different event formats:
-- `EventNotification` format: Full CloudEvents with complete details (for real-time monitoring and automation)
-- `DataHistory` format: Optimized flat structure for time-series storage (for historical analysis)
-
-All events conform to the CloudEvents 1.0 standard, making them interoperable with the entire cloud-native ecosystem—Azure Event Grid, Knative Eventing, Apache Kafka, AWS EventBridge, and any CloudEvents-compatible consumer.
-
-## Configuration: Simple and Secure
-
-### Managed (Konnektr Cloud)
-
-Setting up events is point-and-click in our platform:
-
-1. **Settings Tab**: Define event sinks (Kafka, Kusto, MQTT, Webhooks)
-2. **Event Routes Tab**: Configure which events go where
-3. **Deploy**: Changes apply instantly
-
-For Data History with Azure Data Explorer:
-1. Connect your cluster with secure service principal credentials
-2. We automatically create and manage the historical tables
-3. Start querying immediately
-
-All credentials are stored securely and never exposed.
-
-## Data History Tables: Your Time Machine
-
-When using Azure Data Explorer or Fabric, Data History creates three tables:
-
-**AdtPropertyEvents** - Twin property changes over time
-- Every property update with timestamp
-- Supports JSON values for complex properties
-
-**AdtTwinLifeCycleEvents** - Twin creation and deletion
-- Complete twin metadata at time of lifecycle event
-
-**AdtRelationshipLifeCycleEvents** - Relationship creation and deletion
-- Source and target twin IDs
-- Relationship type and when it changed
-
-You can query these tables to reconstruct your graph at any point in time. Check out our [Data History with Azure Data Explorer guide](/docs/graph/how-to-guides/data-history-kusto) for complete examples.
-
-Other stoerage options are already supported through Kafka routing. Direct integration with other databases is coming soon.
-
-## What This Means for Your Architecture
-
-**Before:**
-- Graph database for current state
-- Separate event bus for real-time reactions
-- Separate time-series DB for history
-- Complex integration to keep everything synchronized
-
-**After:**
-- Konnektr Graph handles event generation
-- Route to your choice of destinations
-- Single source of truth for all changes
-- Query current and historical state seamlessly
-
-## Real-World Use Case: Smart City Water Network
-
-A municipal water utility uses Konnektr Graph to manage their distribution network:
-
-**Real-Time Operations:**
-- Pressure sensor updates trigger events
-- AI agent monitors for leak patterns via event notifications
-- Webhook alerts maintenance teams when anomalies detected
-
-**Historical Analysis:**
-- Data History archives all sensor readings and valve state changes
-- Kusto queries identify seasonal patterns
-- Reconstruct network state during past incidents for root cause analysis
-
-**Predictive Maintenance:**
-- Agent retrieves 6 months of historical data from Kusto
-- Identifies pipes with degrading flow characteristics
-- Schedules maintenance before failures occur
-
-**Compliance Reporting:**
-- Export complete audit trail of all network changes
-- Prove compliance with water quality regulations
-- Show exact state of system during any inspection
-
-## Getting Started
-
-**Enable Event Notifications:**
-1. Navigate to your Graph instance settings
-2. Add event sinks (Kafka, MQTT, Webhooks)
-3. Configure event routes
-4. Events start flowing immediately
-
-**Enable Data History:**
-1. Connect Azure Data Explorer or Fabric Real-Time Intelligence
-2. Configure table names and ingestion policies
-3. Historical archiving begins automatically
-4. Query via Kusto Query Language (KQL)
-
-**Pricing:**
-- Event notifications: Included in Standard tier ($99/mo)
-- Data History: Requires Standard tier + your Kusto/Fabric costs
-- Self-hosted: Always free
-
-## Try It Today
-
-Event Notifications and Data History are available now for all Konnektr Graph Standard tier instances ($99/mo).
-
-- [**Deploy Graph with Events**](https://ktrlplane.konnektr.io/resources/create?resource_type=Konnektr.Graph&utm_source=blog&utm_medium=referral&utm_campaign=event-history-launch)
-- [**Documentation**](/docs/graph/concepts/event-routing)
-- [**Kusto Guide**](/docs/graph/how-to-guides/data-history-kusto)
-- [**GitHub**](https://github.com/konnektr-io/pg-age-digitaltwins)
-
-We're particularly interested in feedback from teams building:
-- AI agents that need temporal reasoning
-- Digital twin systems with compliance requirements
-- Reactive automation workflows
-- Time-series analytics on graph data
-
-## What's Next
-
-Event Notifications and Data History are the foundation for building digital twins that truly understand time. We're excited to see what you build with these capabilities.
-
-This transforms Konnektr Graph from a static database into a living, breathing knowledge system that remembers everything and reacts instantly.
-
-Welcome to the future of temporal graph intelligence.
-
----
-
-**About the Author**: Niko Raes is the founder of Konnektr and has been building digital twin and IoT platforms at Arcadis for years, with deep experience in linked data, ontologies, and real-world infrastructure monitoring.
\ No newline at end of file
diff --git a/content/blog/2025-12-30_context_graphs.mdx b/content/blog/2025-12-30_context_graphs.mdx
deleted file mode 100644
index 50aa650..0000000
--- a/content/blog/2025-12-30_context_graphs.mdx
+++ /dev/null
@@ -1,389 +0,0 @@
----
-title: "Building the Context Graph Layer: Why AI Agents Need More Than Systems of Record"
-description: "How validated semantic graphs with vector embeddings create the infrastructure for agent autonomy—capturing not just what happened, but why decisions were made."
-date: 2025-12-30
-author: Niko Raes
----
-
-Foundation Capital's recent piece "[Context Graphs: AI's Trillion-Dollar Opportunity](https://foundationcapital.com/context-graphs-ais-trillion-dollar-opportunity/)" articulates something we've been building toward since we started Konnektr: **AI agents need a new kind of infrastructure—one that captures not just what happened, but why it was allowed to happen.**
-
-The article struck a nerve in the AI community because it names a problem everyone building agents has encountered: **the decision trace gap**. When a VP approves a 20% discount over policy, when a support lead escalates a ticket, when an engineer makes an exception—the reasoning behind those decisions lives in Slack threads, Zoom calls, and hallway conversations. It's never systematically captured, never becomes searchable precedent, and never informs future agent behavior.
-
-As Jaya Gupta and Ashu Garg put it: "Rules tell an agent what should happen in general. Decision traces capture what happened in this specific case—we used X definition, under policy v3.2, with a VP exception, based on precedent Z, and here's what we changed."
-
-This is the infrastructure challenge of the agent era. And it's what we're solving with Konnektr Graph.
-
-## The Missing Layer: Context Graphs vs Systems of Record
-
-Systems of record (Salesforce, Workday, SAP) became trillion-dollar platforms by owning canonical data: customers, employees, transactions. They're optimized for storing **objects**—structured entities with defined schemas.
-
-But agents don't just need objects. They need **context**:
-- Who made this decision and why?
-- What was the state of the world at decision time?
-- What precedents governed this exception?
-- How did this relationship evolve over time?
-
-This is what Foundation Capital calls a **context graph**: "a living record of decision traces stitched across entities and time so precedent becomes searchable."
-
-The key insight: **context graphs are fundamentally different from systems of record**. They're:
-- **Cross-system by nature** - synthesizing data from CRM, billing, support, Slack, meetings
-- **Time-aware** - preserving not just current state, but how relationships evolved
-- **Decision-centric** - capturing why things happened, not just what happened
-- **Relationship-first** - connections between entities are as important as the entities themselves
-
-This is precisely what Konnektr Graph was designed for.
-
-## Why Validated Semantic Graphs Are the Foundation
-
-Here's where the architectural choice matters. Several companies are positioning themselves in this context graph space, but there's a critical question: **how do you ensure context remains trustworthy as agents both consume and generate it?**
-
-This is where Konnektr Graph's approach differs. We start with a principle: **agents need semantic structure they can trust**.
-
-### The Problem with Unstructured Context
-
-Most "AI memory" solutions today treat context as unstructured text with embeddings:
-1. Ingest documents, conversations, data
-2. Generate embeddings
-3. Store in vector database
-4. Retrieve via similarity search
-
-This works for retrieval, but it has a fatal flaw for agent autonomy: **there's no semantic validation**. When an agent writes new context (creates relationships, captures decisions, links precedents), nothing prevents:
-- Contradictory information
-- Broken references (entity deleted, relationships remain)
-- Invalid property types
-- Relationship mismatches
-
-As agents start **writing** to the context graph—not just reading from it—this becomes critical. You need schema validation or the graph degrades into noise.
-
-### Ontology Enforcement + Embeddings: The Hybrid Approach
-
-Konnektr Graph enforces ontologies through validated schemas. This means:
-
-**Entities are validated:**
-```json
-{
- "@type": "Interface",
- "@id": "dtmi:com:example:Customer;1",
- "contents": [
- {
- "@type": "Property",
- "name": "tier",
- "schema": {
- "@type": "Enum",
- "valueSchema": "string",
- "enumValues": [
- {"name": "enterprise"},
- {"name": "standard"},
- {"name": "startup"}
- ]
- }
- },
- {
- "@type": "Property",
- "name": "revenue",
- "schema": "double"
- },
- {
- "@type": "Property",
- "name": "embedding",
- "schema": "vector"
- },
- {
- "@type": "Relationship",
- "name": "hasContact",
- "target": "dtmi:com:example:Person;1"
- }
- ]
-}
-```
-
-**Relationships are constrained:**
-When an agent creates a relationship, the target type is validated. You can't link a Customer to a Building if the ontology says Customers only link to Persons, Accounts, and Contracts.
-
-**Properties have schemas:**
-If `tier` is defined as an enum ["enterprise", "standard", "startup"], an agent can't write `tier: "random_value"`.
-
-**But embeddings are still first-class:**
-We store vector embeddings as properties. Agents can:
-- Perform similarity search: "Find customers similar to this one"
-- Traverse relationships: "Get their account managers and recent support escalations"
-- Combine both: "Find similar customers who also have escalations in the last 30 days"
-
-This is the hybrid that makes context graphs work for autonomous agents: **semantic structure you can trust + vector search for similarity**.
-
-## The Deterministic Pipeline + Agent Augmentation Pattern
-
-Foundation Capital's piece describes how context graphs form. In practice, we see two complementary flows:
-
-### 1. Deterministic Ingestion (System of Record → Context Graph)
-
-Structured pipelines pull canonical data from systems of record:
-- **ERP** → entities (customers, contracts, invoices)
-- **CRM** → relationships (account ownership, contact history)
-- **Service Desk** → incidents, escalations, resolutions
-- **IoT/Telemetry** → asset status, sensor readings, operational state
-
-These are **deterministic transforms**: defined schemas, predictable mappings, validated on write. This forms the foundational layer—the entities and relationships agents need to ground their decisions.
-
-### 2. Agent Augmentation (Capturing Decision Context)
-
-Agents capture the **decision traces** that don't live in systems of record:
-- **Zoom/Slack/Email** → "VP approved exception because customer threatened to churn"
-- **Meeting transcripts** → "Engineering committed to fix in next sprint based on revenue impact"
-- **Exception approvals** → "Used policy v3.2, applied precedent from Account-123, approved by Sarah Chen"
-
-Agents write this context **into the same validated graph**:
-```json
-// Agent creates decision trace entity
-{
- "$dtId": "decision-20250130-001",
- "$metadata": { "$model": "dtmi:com:example:DecisionTrace;1" },
- "decisionType": "discount_approval",
- "policyVersion": "v3.2",
- "exceptionReason": "churn_risk",
- "approver": "sarah.chen@company.com",
- "precedent": "decision-20241115-042",
- "reasoning": "Customer has 3 P1 incidents in 30 days, threatened move to Competitor-X...",
- "embedding": [0.123, 0.456, ...] // Semantic embedding of reasoning
-}
-
-// Agent creates relationships
-decision-20250130-001 --appliedTo--> customer-789
-decision-20250130-001 --basedOn--> decision-20241115-042
-decision-20250130-001 --approvedBy--> employee-sarah-chen
-```
-
-The schema ensures:
-- Decision traces link to valid entities (customers, employees, policies)
-- Precedent chains are explicit and traversable
-- Future agents can query: "Show me all discount approvals for enterprise customers with churn risk in the last quarter"
-
-This is how **precedent becomes searchable**—the core promise of context graphs.
-
-## Real-World Architecture: How This Works in Practice
-
-Let's walk through a concrete example from Foundation Capital's piece: **renewal discount approval**.
-
-### The Scenario
-A renewal agent proposes a 20% discount for Customer-789, despite a 10% policy cap. The agent needs to:
-1. Understand customer context (tier, revenue, history)
-2. Check precedents (similar exceptions in the past)
-3. Gather evidence (recent incidents, Slack threads about churn risk)
-4. Get approval and capture the decision trace
-
-### With Konnektr Graph
-
-**Step 1: Query Current Context**
-The agent queries the validated graph for structured context:
-
-```cypher
-MATCH (customer:Customer {id: 'customer-789'})
-MATCH (customer)-[:hasContact]->(contact:Person)
-MATCH (customer)-[:hasAccount]->(account:Account)
-MATCH (account)-[:managedBy]->(am:Employee)
-MATCH (customer)-[incident:hasIncident]->(ticket:SupportTicket)
-WHERE ticket.createdAt > datetime() - duration('P30D')
-RETURN customer, contact, account, am, collect(ticket) as recent_incidents
-```
-
-This returns **validated, structured entities**—not text chunks. The agent knows:
-- Customer tier: "enterprise"
-- Account manager: "john.doe@company.com"
-- Recent incidents: 3 P1 tickets in last 30 days
-- Revenue: $2.4M ARR
-
-**Step 2: Find Similar Precedents**
-The agent performs hybrid vector + graph query:
-
-```cypher
-MATCH (decision:DecisionTrace)
-WHERE decision.decisionType = 'discount_approval'
- AND decision.exceptionReason = 'churn_risk'
- AND VectorDistance(decision.embedding, @currentContextEmbedding) < 0.3
-MATCH (decision)-[:appliedTo]->(precedentCustomer:Customer)
-WHERE precedentCustomer.tier = 'enterprise'
-RETURN decision, precedentCustomer
-ORDER BY decision.timestamp DESC
-LIMIT 5
-```
-
-This finds **semantically similar exceptions** (via vector search) that also match **structural criteria** (enterprise tier, churn risk). The agent discovers:
-- 2 prior cases where 20% discount was approved for enterprise customers with churn risk
-- Both had similar incident patterns (3+ P1 tickets)
-- Both preserved revenue >$2M
-
-**Step 3: Capture External Context**
-The agent ingests unstructured context (Slack thread, meeting transcript) and extracts entities/relationships:
-
-From Slack: *"Sarah Chen (VP Sales): Customer threatened to move to Competitor-X if we don't match their pricing. This is our largest account in the region."*
-
-Agent creates:
-```json
-{
- "$dtId": "context-slack-20250130",
- "$metadata": {"$model": "dtmi:com:example:ConversationContext;1"},
- "source": "slack",
- "channel": "#sales-escalations",
- "participants": ["sarah.chen@company.com", "john.doe@company.com"],
- "keyPoints": ["churn_threat", "competitor_pricing", "largest_regional_account"],
- "embedding": [...] // Semantic embedding
-}
-```
-
-Links to graph:
-```
-context-slack-20250130 --relatesTo--> customer-789
-context-slack-20250130 --involvesPerson--> employee-sarah-chen
-```
-
-**Step 4: Get Approval & Create Decision Trace**
-The agent routes to Sarah Chen for approval. When approved, it creates the decision trace:
-
-```json
-{
- "$dtId": "decision-20250130-001",
- "$metadata": {"$model": "dtmi:com:example:DecisionTrace;1"},
- "decisionType": "discount_approval",
- "requestedBy": "renewal-agent-v2",
- "approvedBy": "sarah.chen@company.com",
- "customerTier": "enterprise",
- "discountPercent": 20,
- "policyCapPercent": 10,
- "exceptionReason": "churn_risk",
- "policyVersion": "v3.2",
- "precedents": ["decision-20241115-042", "decision-20241203-018"],
- "supportingContext": ["context-slack-20250130", "incident-p1-789-001"],
- "reasoning": "Customer has 3 P1 incidents in 30 days, threatened move to Competitor-X, matches precedent from similar enterprise accounts. Revenue preservation ($2.4M ARR) justifies exception.",
- "embedding": [...] // Embedding of full reasoning
-}
-```
-
-Links to graph:
-```
-decision-20250130-001 --appliedTo--> customer-789
-decision-20250130-001 --approvedBy--> employee-sarah-chen
-decision-20250130-001 --basedOn--> decision-20241115-042
-decision-20250130-001 --basedOn--> decision-20241203-018
-decision-20250130-001 --referencedContext--> context-slack-20250130
-decision-20250130-001 --referencedIncident--> incident-p1-789-001
-```
-
-**Step 5: Precedent Becomes Searchable**
-Future agents can now query:
-- "Show all discount approvals >15% for enterprise customers with churn risk"
-- "Find decision traces where Sarah Chen approved exceptions to v3.2 policy"
-- "Get precedents involving Competitor-X pricing threats"
-
-The decision trace is **structurally linked** (validated relationships) and **semantically searchable** (vector embeddings).
-
-## Why Konnektr Graph?
-
-Foundation Capital's piece doesn't prescribe technology, but it implies requirements:
-- Cross-system entity resolution
-- Temporal state preservation
-- Relationship-first modeling
-- Scale to millions of entities
-- Validated schemas so agent-written context stays trustworthy
-
-We built Konnektr Graph specifically for this:
-
-**1. Validated Semantic Structure**
-Schema enforcement means agents can trust the context they read and write. Relationships are constrained, properties are typed, references are validated.
-
-**2. Hybrid Vector + Graph**
-Combine similarity search with relationship traversal in one query. No separate vector database to keep synchronized.
-
-**3. Built for Agent Autonomy**
-Agents don't just read—they write decision traces, capture context, create relationships. The graph validates everything at write time.
-
-**4. Open Source, Self-Hostable**
-100% open source. Audit the code, run on-premises, no vendor lock-in. Critical for enterprises building context graphs as competitive moats.
-
-**5. Production-Ready Infrastructure**
-Built on proven database technology. Transactional integrity, standard operations, scales to millions of entities.
-
-## Event Notifications & Data History: Keeping Context Fresh
-
-Foundation Capital emphasizes that capturing decision traces requires being **in the execution path at commit time**. This is where Konnektr Graph's event streaming capabilities matter.
-
-When an agent writes to the graph—whether deterministic ingestion or decision trace capture—Konnektr can stream those changes to external systems in real-time. This enables:
-
-**Context Graph Retention**
-As your graph grows, you may want to archive older entities while keeping recent context fresh. Event streams let you move historical data to cold storage while maintaining a working set in the operational graph.
-
-**Historical Analysis**
-Stream all changes to a time-series database (like Azure Data Explorer, InfluxDB, or TimescaleDB). This creates a complete audit trail of every decision, every relationship change, every context update. Analysts can query: "How did our discount approval patterns change over the last year?"
-
-**Reducing Hallucinations**
-By archiving complete decision history externally, you can provide agents with temporal context without bloating the operational graph. "Show me how we handled similar exceptions in Q3 2024" becomes queryable without loading all historical data into memory.
-
-**Multi-System Synchronization**
-Other systems can subscribe to graph changes and react accordingly. When a decision trace is created, trigger workflows in n8n, update dashboards, notify compliance systems, or propagate to downstream agents.
-
-This keeps the context graph as a **living system**—agents write to it, events flow from it, history is preserved externally, and the operational graph stays focused on current context.
-
-## What's Next: The Context Graph Ecosystem
-
-Foundation Capital's thesis is that context graphs will be trillion-dollar platforms—"systems of record for decisions, not just objects."
-
-We're building the **infrastructure layer** for that future. Specifically, the validated semantic graph layer that ensures context remains trustworthy as agents gain autonomy.
-
-We're not trying to be the whole stack. We're building the foundation that sits between:
-- **Below**: Systems of record (ERP, CRM, service desk)
-- **Above**: Agent orchestration, workflow engines, LLM applications
-
-We're the layer that ensures context remains validated, searchable, and actionable.
-
-If you're building agents that need to capture decision traces, we'd love to hear what patterns you're seeing. What context are your agents struggling to capture? What precedents do they wish they could query?
-
-## Why This Matters Now
-
-The timing is critical. As Foundation Capital notes: "Agents are shipping into real workflows—contract review, quote-to-cash, support resolution—and teams are hitting a wall that governance alone can't solve."
-
-The wall is **missing decision traces**. And unlike observability tools that capture execution traces for debugging, context graphs capture **organizational memory** for autonomy.
-
-Three trends make this urgent:
-
-**1. Agents Are Writing, Not Just Reading**
-Early LLM applications were retrieval-focused. Now agents are taking actions: approving discounts, escalating tickets, committing code. They're not just consuming context—they're creating it.
-
-**2. Multi-Agent Systems Need Shared Memory**
-When multiple agents coordinate (sales agent + support agent + finance agent), they need a shared understanding of entities, relationships, and precedents. Unstructured memory doesn't scale.
-
-**3. Compliance and Auditability**
-As agents make consequential decisions, organizations need audit trails: "Why was this exception allowed?" Context graphs make decisions explainable.
-
-## Building in the Open
-
-Konnektr Graph is 100% open source. We're building this infrastructure layer in the open because:
-- **Transparency matters** for infrastructure-critical systems
-- **Community input** makes the platform better
-- **No vendor lock-in** enables competitive moats built on top
-
-Foundation Capital's piece describes a market opportunity. We're building the infrastructure to enable it.
-
-If you're building agents that need to:
-- Understand complex entity relationships across systems
-- Capture and query decision traces
-- Combine semantic search with structural validation
-- Maintain auditability as agents gain autonomy
-
-Konnektr Graph was built for you.
-
----
-
-## Try It Today
-
-- **Deploy Konnektr Graph**: [ktrlplane.konnektr.io](https://ktrlplane.konnektr.io/resources/create?resource_type=Konnektr.Graph&utm_source=blog&utm_medium=referral&utm_campaign=context_graphs)
-- **Read the Docs**: [docs.konnektr.io](https://docs.konnektr.io/docs/graph)
-- **GitHub**: [github.com/konnektr-io/pg-age-digitaltwins](https://github.com/konnektr-io/pg-age-digitaltwins)
-
-The context graph layer is being built. We'd love your input as we build it.
-
----
-
-**About the Author**: Niko Raes is the founder of Konnektr and has spent years building digital twin and IoT platforms at Arcadis, working with semantic modeling, ontologies, and real-world infrastructure systems at scale. Konnektr Graph was born from the challenges of building agent-ready semantic infrastructure in production environments.
-
-**Further Reading**:
-- Foundation Capital: [Context Graphs: AI's Trillion-Dollar Opportunity](https://foundationcapital.com/context-graphs-ais-trillion-dollar-opportunity/)
-- Jamin Ball: [Long Live Systems of Record](https://cloudedjudgement.substack.com/p/clouded-judgement-121225-long-live)
\ No newline at end of file
diff --git a/content/blog/2026-01-06_graph-memory.mdx b/content/blog/2026-01-06_graph-memory.mdx
deleted file mode 100644
index f81237c..0000000
--- a/content/blog/2026-01-06_graph-memory.mdx
+++ /dev/null
@@ -1,387 +0,0 @@
----
-title: "Validated Semantic Memory for AI Agents: Introducing the Konnektr MCP Server"
-date: 2026-01-06
-author: "Niko Raes"
-description: "Why agents need schema-enforced graph memory, not just vector embeddings—and how the Konnektr MCP Server provides validated semantic context that agents can trust to both read and write."
-tags: ["AI Agents", "MCP", "Context Graphs", "Semantic Memory", "DTDL"]
----
-
-In our [recent post about context graphs](https://docs.konnektr.io/blog/2025-12-30_context_graphs), we described the infrastructure challenge of the agent era: **agents need more than systems of record—they need decision traces, precedent chains, and contextual memory that captures not just what happened, but why.**
-
-Today, we're releasing the **Konnektr MCP Server**—a Model Context Protocol implementation that gives agents direct access to validated semantic memory. Not just vector embeddings, but schema-enforced knowledge graphs where agents can trust the context they both consume and generate.
-
-## The Problem: Why Vector-Only Memory Fails Agents
-
-Most "AI memory" solutions today follow a simple pattern:
-1. Ingest documents and conversations
-2. Generate embeddings
-3. Store in vector database
-4. Retrieve via similarity search
-
-This works for RAG (Retrieval-Augmented Generation), but it breaks down when agents need to **write** memory, not just read it.
-
-### The Validation Gap
-
-When an agent writes new context—capturing a decision trace, linking entities, recording precedents—nothing prevents:
-
-- **Contradictory information**: Agent writes "Customer-789 is tier: premium" when another write says "tier: enterprise"
-- **Broken references**: Entity gets deleted but relationships pointing to it remain
-- **Invalid types**: Agent writes `temperature: "very hot"` when schema expects a number
-- **Relationship mismatches**: Agent links a Customer to a Building when ontology only allows Customers → Persons, Accounts
-
-Vector databases don't validate structure. Embeddings can contradict. References can break. **Context degrades into noise.**
-
-This is catastrophic for autonomous agents. If an agent can't trust its own memory, it can't make reliable decisions.
-
-## Validated Semantic Memory: The Schema-Enforced Approach
-
-Konnektr Graph enforces ontologies using DTDL (Digital Twins Definition Language). Every entity, property, and relationship must conform to a schema.
-
-When an agent writes to the graph through the MCP server:
-- **Entities are validated**: Properties must match defined types
-- **Relationships are constrained**: Can only link compatible entity types
-- **Schemas are enforced**: Invalid structures are rejected with detailed error messages
-
-But we don't sacrifice semantic search. **Embeddings are properties on entities**, not in a separate database. Agents get:
-- Vector similarity search (semantic)
-- Graph relationship traversal (structural)
-- Both combined in hybrid queries
-
-This is the foundation for agents that can trust their memory.
-
-## Introducing the Konnektr MCP Server
-
-The Model Context Protocol (MCP), created by Anthropic, provides a standard way for agents to access context—files, databases, APIs, knowledge bases. Our MCP server implements this protocol for Konnektr Graph.
-
-Instead of writing Cypher queries or managing API calls, agents use simple tools that handle:
-- Schema validation
-- Embedding generation
-- Hybrid search (vector + graph)
-- Ontology exploration
-
-Let's see how this works in practice.
-
-## How Agents Use Validated Semantic Memory
-
-### 1. Exploring the Ontology
-
-Before creating entities, agents explore available schemas:
-
-```python
-# Agent discovers what models exist
-models = await mcp_client.call_tool("list_models")
-# Returns: [{"id": "dtmi:example:Customer;1", "displayName": "Customer"}, ...]
-
-# Agent inspects a specific model
-customer_model = await mcp_client.call_tool("get_model", {
- "model_id": "dtmi:example:Customer;1"
-})
-# Returns full schema: properties, relationships, required fields
-```
-
-The agent now knows:
-- What properties `Customer` has (tier, revenue, etc.)
-- Which embeddings can be stored (descriptionEmbedding)
-- What relationships are allowed (hasContact → Person, hasAccount → Account)
-- What types are expected (tier is enum, revenue is number)
-
-**This is fundamentally different from vector-only approaches.** The agent understands structure before writing.
-
-### 2. Creating Validated Entities with Embeddings
-
-When an agent learns new information, it creates a validated entity:
-
-```python
-# Agent creates a customer with embedding
-result = await mcp_client.call_tool("create_or_replace_digital_twin", {
- "twin_id": "customer-789",
- "model_id": "dtmi:example:Customer;1",
- "properties": {
- "name": "Acme Corp",
- "tier": "enterprise",
- "revenue": 2400000
- },
- "embeddings": {
- "descriptionEmbedding": "Large enterprise customer in manufacturing. Primary contact is Sarah Chen. Recent churn risk due to 3 P1 incidents in last 30 days."
- }
-})
-```
-
-What happens behind the scenes:
-2. **Embedding generation**: Converts text to vector
-1. **Schema validation**: Graph API refuses data if it doesn't match model
-3. **Storage**: Embedding stored as an indexed property on the twin (not separate database)
-
-If the agent tries to add invalid properties or wrong types, the server **rejects it with a detailed error message**. The graph stays consistent.
-
-### 3. Hybrid Search: Vector Similarity + Graph Traversal
-
-Now the magic happens. Agents can query using both semantic similarity and structural relationships:
-
-```python
-# Find customers similar to a query, with graph context
-results = await mcp_client.call_tool("vector_search_with_graph", {
- "search_text": "customers at risk of churning due to service issues",
- "embedding_property": "descriptionEmbedding",
- "model_id": "dtmi:example:Customer;1",
- "include_graph_context": True,
- "limit": 5
-})
-```
-
-This returns:
-- **Semantically similar customers** (via vector search on embeddings)
-- **Related entities** via graph relationships (account managers, recent incidents, contracts)
-
-One query, structured context with semantic relevance.
-
-Compare this to vector-only RAG:
-```python
-# Traditional vector search
-docs = vector_db.search("customers at risk of churning", limit=5)
-# Returns: Unstructured text chunks with no guaranteed relationships
-```
-
-The agent gets floating text, no validated connections, no guarantee of accuracy.
-
-### 4. Agents Writing Decision Traces
-
-Here's where it gets powerful. When an agent makes a decision, it captures the trace as a validated entity:
-
-```python
-# Agent captures a discount approval decision
-decision = await mcp_client.call_tool("create_or_replace_digital_twin", {
- "twin_id": "decision-20250104-001",
- "model_id": "dtmi:example:DecisionTrace;1",
- "properties": {
- "decisionType": "discount_approval",
- "approvedBy": "sarah.chen@company.com",
- "discountPercent": 20,
- "policyVersion": "v3.2",
- "exceptionReason": "churn_risk"
- },
- "embeddings": {
- "reasoningEmbedding": "Customer threatened to move to Competitor-X. Three P1 incidents in 30 days. Matches precedent from Account-123. Revenue preservation ($2.4M) justifies exception."
- }
-})
-
-# Create validated relationships
-await mcp_client.call_tool("create_or_replace_relationship", {
- "relationship_id": "rel-decision-customer",
- "source_id": "decision-20250104-001",
- "target_id": "customer-789",
- "relationship_name": "appliedTo"
-})
-
-await mcp_client.call_tool("create_or_replace_relationship", {
- "relationship_id": "rel-decision-precedent",
- "source_id": "decision-20250104-001",
- "target_id": "decision-20241115-042",
- "relationship_name": "basedOn"
-})
-```
-
-Now:
-- The decision is **structurally linked** to the customer (validated relationship)
-- Precedent chain is **explicit and traversable**
-- Future agents can query: "Show decisions similar to this one" (vector) AND "Show all decisions affecting Customer-789" (graph)
-
-**This is the context graph pattern in action.** Deterministic data from systems of record + agent-augmented decision traces, all validated by schemas.
-
-### 5. Retrieving Context for New Decisions
-
-When a renewal agent encounters Customer-789 again, it retrieves rich context:
-
-```python
-# Hybrid query: semantic + structural
-context = await mcp_client.call_tool("query_digital_twins", {
- "query": """
- MATCH (customer:Twin {`$dtId`: 'customer-789'})
- MATCH (customer)-[:hasIncident]->(incident:Twin)
- WHERE incident.createdAt > datetime() - duration('P30D')
- MATCH (decision:Twin)-[:appliedTo]->(customer)
- WHERE decision.`$metadata`.`$model` = 'dtmi:example:DecisionTrace;1'
- RETURN customer, collect(incident) as recent_incidents, collect(decision) as past_decisions
- """
-})
-```
-
-The agent gets:
-- Validated customer properties
-- Recent incidents (with timestamps, severity, status)
-- Past decisions with reasoning embeddings
-
-All structured, all validated, all trustworthy.
-
-## The Technical Architecture
-
-### Why PostgreSQL + Apache AGE + pgvector?
-
-**PostgreSQL**: Your team already knows it. Standard operations, proven reliability.
-
-**Apache AGE**: Graph extension providing Cypher queries and graph algorithms.
-
-**pgvector**: Vector similarity search directly in PostgreSQL.
-
-**One database, three capabilities**: Graph traversal + vector search + relational queries.
-
-No separate vector database to synchronize. No eventual consistency. Atomic transactions for validated writes.
-
-### How Embedding Generation Works
-
-The MCP server handles embedding generation transparently:
-
-1. Agent provides **text content** in `embeddings` parameter
-2. Server generates vectors and stores them
-3. Embeddings stored as **properties on the twin**
-4. Available immediately for vector search
-
-Agents don't manage embeddings directly—the server handles vectorization while maintaining schema validation.
-
-### Schema Validation in Practice
-
-When an agent creates or updates a twin, the MCP server:
-
-1. **Validates model exists**: Checks DTDL model is defined
-2. **Validates properties**: All properties match schema (type, enum values, required fields)
-3. **Validates relationships**: Relationship types and targets are compatible
-4. **Rejects invalid writes**: Returns detailed error messages
-
-Example validation error:
-```json
-{
- "error": "Invalid property 'tier'. Expected enum ['enterprise', 'standard', 'startup'], got 'premium'",
- "model": "dtmi:example:Customer;1",
- "property": "tier"
-}
-```
-
-The agent learns from the error and retries with valid data. **The graph never degrades.**
-
-## Real-World Agent Patterns
-
-### Pattern 1: Support Agent with Precedent Memory
-
-Support agent encounters a technical issue. It:
-1. Searches for similar past incidents (vector similarity)
-2. Traverses relationships to find affected customers
-3. Retrieves decision traces showing how similar issues were resolved
-4. Captures new resolution as a decision trace for future reference
-
-The agent builds organizational memory over time.
-
-### Pattern 2: Sales Agent with Customer Context
-
-Renewal agent preparing for negotiation:
-1. Retrieves customer profile (validated properties)
-2. Gets related incidents, contracts, previous discount approvals
-3. Finds similar customers and their outcomes (vector search)
-4. Generates proposal based on precedent
-5. Captures approval decision as validated trace
-
-Next renewal cycle, this precedent informs future decisions.
-
-### Pattern 3: Infrastructure Agent with Dependency Awareness
-
-An agent managing server restarts:
-1. Queries graph: "What applications run on Server-01?"
-2. Traverses dependencies: "What downstream services depend on those apps?"
-3. Checks incident history: "Have similar restarts caused issues before?"
-4. Executes with validated understanding of impact
-
-The graph provides **structural awareness** that vector-only memory can't.
-
-## Integration with Agent Frameworks
-
-The MCP server works with any MCP-compatible client:
-
-### Claude Desktop / Cline
-Add to MCP settings:
-```json
-{
- "mcpServers": {
- "konnektr": {
- "url": "https://mcp.graph.konnektr.io/mcp?resource_id=your-graph-instance-id",
- }
- }
-}
-```
-
-### Google ADK (Agent Developer Kit)
-```python
-from google.adk.tools.mcp_tool import MCPToolset
-
-konnektr_tools = MCPToolset(
- connection_params=StreamableHTTPConnectionParams(
- url="https://mcp.graph.konnektr.io/mcp?resource_id=your-graph-instance-id",
- headers={
- "Authorization": f"Bearer {token}"
- }
- )
-)
-
-agent = Agent(
- model="gemini-2.0-flash",
- tools=[konnektr_tools],
- instruction="You have access to validated semantic memory via Konnektr..."
-)
-```
-
-### LangChain / LlamaIndex (via MCP)
-Coming soon: Native integration examples.
-
-### Custom Agents (REST API)
-The MCP server exposes standard HTTP/SSE endpoints for custom implementations.
-
-## Why This Matters for Agent Autonomy
-
-As agents move from retrieval assistants to autonomous decision-makers, memory architecture becomes critical.
-
-**Vector-only memory** worked for chatbots because humans verified every output. But autonomous agents need **validated semantic structure**:
-
-- **Trustworthy context**: Schema enforcement prevents contradictions
-- **Relationship awareness**: Graph traversal provides structural understanding
-- **Temporal precedent**: Decision traces create searchable organizational memory
-- **Hybrid intelligence**: Combine similarity (vector) with structure (graph)
-
-This is the infrastructure for agents that can **learn from decisions, not just documents**.
-
-## Getting Started
-
-The Konnektr MCP server is available now for all Konnektr Graph instances (Standard tier, $99/mo).
-
-### Quick Start
-
-1. **Deploy Konnektr Graph**: [ktrlplane.konnektr.io](https://ktrlplane.konnektr.io/resources/create?resource_type=Konnektr.Graph&utm_source=blog&utm_medium=referral&utm_campaign=graph-memory)
-2. **Enable MCP**: Configure in your Graph instance settings
-3. **Connect your agent**: Add MCP server to Claude Desktop or your agent framework
-4. **Define ontologies**: Create DTDL models for your domain (or use an agent to do it)
-5. **Let agents build memory**: Agents create validated entities and relationships
-
-### Documentation
-
-- **MCP Server Docs**: [docs.konnektr.io/docs/graph/concepts/mcp-server](https://docs.konnektr.io/docs/graph/concepts/mcp-server)
-- **DTDL Guide**: [docs.konnektr.io/docs/graph/concepts/dtdl](https://docs.konnektr.io/docs/graph/concepts/dtdl)
-- **API Reference**: [docs.konnektr.io/docs/graph/api](https://docs.konnektr.io/docs/graph/reference/api)
-
-### Example Repositories
-
-- **MCP Server Code**: [github.com/konnektr-io/pg-age-digitaltwins](https://github.com/konnektr-io/graph-mcp)
-- **Integration Examples**: Coming soon (Google ADK, LangChain, LlamaIndex)
-
-## What's Next
-
-We're building the validated semantic memory layer for autonomous agents. This MCP server is the first direct integration—agents can now read and write context with guaranteed structural integrity.
-
-Next, we're working on:
-- **Reference implementations** with popular agent frameworks
-- **Pattern libraries** for common agent architectures (support, sales, infrastructure)
-- **Collaboration primitives** for multi-agent systems sharing validated memory
-
-If you're building agents that need more than floating embeddings—agents that need validated semantic structure they can trust—we'd love to hear what you're building.
-
----
-
-**About Konnektr**: We're building the infrastructure layer for context graphs—validated semantic memory for AI agents. 100% open source, built on PostgreSQL, designed for agent autonomy.
-
-**Try it today**: [konnektr.io/graph](https://konnektr.io?utm_source=blog&utm_medium=referral&utm_campaign=graph-memory)
\ No newline at end of file
diff --git a/content/docs/graph/advanced-topics/authorization-architecture.mdx b/content/docs/graph/advanced-topics/authorization-architecture.mdx
deleted file mode 100644
index 433ae0b..0000000
--- a/content/docs/graph/advanced-topics/authorization-architecture.mdx
+++ /dev/null
@@ -1,530 +0,0 @@
----
-title: Authentication & Authorization
-description: How to authenticate and manage access to Konnektr Graph
----
-
-# Authentication & Authorization
-
-Konnektr Graph uses OAuth 2.1 with JWT Bearer tokens for authentication and fine-grained, permission-based authorization for access control.
-
-## Hosted Version (Recommended)
-
-When using the hosted Konnektr Graph service, authentication and authorization are fully managed for you.
-
-### Getting Your Credentials
-
-1. **Sign up** at [ktrlplane.konnektr.io](https://ktrlplane.konnektr.io)
-2. **Create a Graph resource** in your organization
-3. **Get your API credentials** from the resource dashboard
-
-Your credentials include:
-- **Client ID** - Identifies your application
-- **Client Secret** - Secret key for authentication
-- **Audience** - The API identifier (e.g., `https://graph.konnektr.io`)
-- **Authority** - The OAuth server URL (e.g., `https://auth.konnektr.io`)
-
-### Authenticating Requests
-
-Use OAuth 2.1 Client Credentials flow to get an access token:
-
-```bash
-curl -X POST https://auth.konnektr.io/oauth/token \
- -H "Content-Type: application/json" \
- -d '{
- "client_id": "YOUR_CLIENT_ID",
- "client_secret": "YOUR_CLIENT_SECRET",
- "audience": "https://graph.konnektr.io",
- "grant_type": "client_credentials"
- }'
-```
-
-Response:
-```json
-{
- "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
- "token_type": "Bearer",
- "expires_in": 86400
-}
-```
-
-Use the access token in all API requests:
-
-```bash
-curl https://your-resource-id.api.graph.konnektr.io/digitaltwins/twin-1 \
- -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
-```
-
-### Using Azure Digital Twins SDKs
-
-You can use the standard Azure Digital Twins SDKs with Konnektr Graph:
-
-```python
-# Python
-from azure.digitaltwins.core import DigitalTwinsClient
-from azure.core.credentials import AccessToken
-from datetime import datetime
-import requests
-
-# Get token from Konnektr Auth
-token_response = requests.post(
- "https://auth.konnektr.io/oauth/token",
- json={
- "client_id": "YOUR_CLIENT_ID",
- "client_secret": "YOUR_CLIENT_SECRET",
- "audience": "https://graph.konnektr.io",
- "grant_type": "client_credentials"
- }
-)
-access_token = token_response.json()["access_token"]
-
-# Create custom credential
-class StaticTokenCredential:
- def __init__(self, token):
- self.token = token
-
- def get_token(self, *scopes, **kwargs):
- expires_on = int(datetime.now().timestamp()) + 3600
- return AccessToken(self.token, expires_on)
-
-# Connect to Konnektr Graph
-client = DigitalTwinsClient(
- "https://your-resource-id.api.graph.konnektr.io",
- StaticTokenCredential(access_token)
-)
-
-# Use the client
-twin = client.get_digital_twin("my-twin-id")
-```
-
-### Managing Permissions
-
-Permissions are managed in the Konnektr Control Plane. See the [Access Control documentation](https://docs.konnektr.io/docs/ktrlplane/concepts/access-control) for details on:
-
-- Creating users and service accounts
-- Assigning roles and permissions
-- Managing organization and project access
-- Setting up custom permission policies
-
-**Common Permissions:**
-
-| Permission | Description |
-|------------|-------------|
-| `digitaltwins/read` | Read digital twins and components |
-| `digitaltwins/write` | Create and update digital twins |
-| `digitaltwins/delete` | Delete digital twins |
-| `digitaltwins/relationships/read` | Read relationships |
-| `digitaltwins/relationships/write` | Create and update relationships |
-| `digitaltwins/relationships/delete` | Delete relationships |
-| `models/read` | Read DTDL models |
-| `models/write` | Create and update models |
-| `query/read` | Execute Cypher queries |
-| `mcp/*` | Access MCP tools (for AI assistants) |
-
-### MCP Server Authentication
-
-When using the MCP Server for AI assistants, you need both an OAuth scope and permission:
-
-- **OAuth Scope**: `mcp:tools` (protocol-level access)
-- **Permission**: `mcp/*` (application-level access)
-
-Configure your MCP client with your credentials:
-
-```json
-{
- "mcpServers": {
- "konnektr-graph": {
- "url": "https://your-resource-id.mcp.graph.konnektr.io",
- "transport": {
- "type": "sse"
- },
- "auth": {
- "type": "oauth2",
- "token_url": "https://auth.konnektr.io/oauth/token",
- "client_id": "YOUR_CLIENT_ID",
- "client_secret": "YOUR_CLIENT_SECRET",
- "audience": "https://graph.konnektr.io",
- "scope": "mcp:tools"
- }
- }
- }
-}
-```
-
-## Self-Hosted Version
-
-When self-hosting Konnektr Graph, you need to configure your own authentication provider.
-
-### Supported Providers
-
-Konnektr Graph works with any OAuth 2.1 / OpenID Connect provider:
-
-- Auth0
-- Azure AD / Microsoft Entra ID
-- Keycloak
-- Okta
-- Custom OAuth 2.1 server
-
-### Configuration
-
-Set these environment variables or update `appsettings.json`:
-
-**API Service:**
-
-```bash
-# Enable authentication
-Authentication__Enabled=true
-Authentication__Authority=https://your-auth-provider.com
-Authentication__Audience=https://your-graph-api.com
-Authentication__Issuer=https://your-auth-provider.com/
-
-# Enable authorization
-Authorization__Enabled=true
-Authorization__Provider=Claims
-Authorization__PermissionsClaimName=permissions
-```
-
-**MCP Server:**
-
-```bash
-# Enable authentication
-Authentication__Enabled=true
-Authentication__Authority=https://your-auth-provider.com
-Authentication__Audience=https://your-graph-api.com
-Authentication__Issuer=https://your-auth-provider.com/
-
-# Enable authorization with MCP scopes
-Authorization__Enabled=true
-Authorization__Provider=Claims
-Authorization__PermissionsClaimName=permissions
-Authorization__RequiredScopes__0=mcp:tools
-
-# MCP metadata
-MCP__ServerName=My Graph MCP Server
-MCP__Version=1.0.0
-MCP__ResourceServerUrl=https://your-mcp-server.com
-```
-
-### JWT Token Requirements
-
-Your OAuth provider must issue JWT tokens with these claims:
-
-```json
-{
- "sub": "user-or-service-account-id",
- "aud": "https://your-graph-api.com",
- "iss": "https://your-auth-provider.com/",
- "scope": "mcp:tools",
- "permissions": [
- "digitaltwins/read",
- "digitaltwins/write",
- "mcp/*"
- ]
-}
-```
-
-**Required Claims:**
-- `sub` - Subject (user/service account identifier)
-- `aud` - Audience (must match your configured audience)
-- `iss` - Issuer (must match your configured issuer)
-
-**Optional but Recommended:**
-- `scope` - OAuth scopes (required for MCP: `mcp:tools`)
-- `permissions` - Array of permission strings
-
-### Permission Providers
-
-You can choose how permissions are provided:
-
-#### 1. JWT Claims (Default)
-
-Permissions are embedded in the JWT token's `permissions` claim:
-
-```json
-{
- "Authorization": {
- "Provider": "Claims",
- "PermissionsClaimName": "permissions"
- }
-}
-```
-
-**Pros:**
-- Fast (no external calls)
-- Works offline
-- Simple setup
-
-**Cons:**
-- Permissions baked into token (can't revoke until expiry)
-- Larger token size
-
-#### 2. API Provider
-
-Fetch permissions from an external API on each request:
-
-```json
-{
- "Authorization": {
- "Provider": "Api",
- "ApiProvider": {
- "BaseUrl": "https://your-permission-api.com",
- "CheckEndpoint": "/api/v1/permissions/check",
- "ResourceName": "graph-instance-123",
- "CacheExpirationMinutes": 5,
- "TimeoutSeconds": 10
- }
- }
-}
-```
-
-**Pros:**
-- Dynamic permissions (can revoke immediately)
-- Centralized permission management
-- Smaller token size
-
-**Cons:**
-- Requires external API call
-- Potential latency
-- Dependency on external service
-
-### Configuring Your Auth Provider
-
-#### Auth0 Example
-
-1. **Create an API** in Auth0 Dashboard
- - Name: `Konnektr Graph`
- - Identifier: `https://your-graph-api.com`
-
-2. **Create a Machine-to-Machine Application**
- - Authorize it for your API
- - Note the Client ID and Secret
-
-3. **Add Permissions** (in API settings)
- - Add each permission as a scope (e.g., `digitaltwins:read`, `mcp:tools`)
-
-4. **Configure Rules** (optional)
- - Add custom claims to include permissions array
-
-#### Azure AD Example
-
-1. **Register an Application**
- - Note the Application (client) ID
- - Create a client secret
-
-2. **Expose an API**
- - Set Application ID URI: `https://your-graph-api.com`
- - Add scopes for each permission
-
-3. **App Roles** (optional)
- - Define app roles for permission groups
- - Assign users/service principals to roles
-
-4. **Token Configuration**
- - Add optional claims to include permissions
-
-### OAuth Discovery
-
-Both API Service and MCP Server expose an OAuth discovery endpoint at:
-
-```
-/.well-known/oauth-protected-resource
-```
-
-This endpoint returns RFC 9728 Protected Resource Metadata:
-
-```json
-{
- "resource": "https://your-server.com",
- "authorization_servers": ["https://your-auth-provider.com"],
- "scopes_supported": ["mcp:tools", "mcp:resources"],
- "bearer_methods_supported": ["header"]
-}
-```
-
-## Error Responses
-
-Understanding error responses helps troubleshoot authentication and authorization issues.
-
-### 401 Unauthorized
-
-Returned when no valid JWT token is provided:
-
-```json
-{
- "error": "unauthorized",
- "error_description": "Authentication required. Please provide a valid Bearer token.",
- "resource_metadata": "https://your-server/.well-known/oauth-protected-resource"
-}
-```
-
-**HTTP Headers:**
-```
-WWW-Authenticate: Bearer realm="mcp", resource_metadata="https://..."
-```
-
-**Common Causes:**
-- Missing `Authorization` header
-- Expired token
-- Invalid token signature
-- Token from wrong issuer
-
-**Solution:** Get a fresh access token from your OAuth provider.
-
-### 403 Forbidden - Missing Scope (MCP Only)
-
-Returned when OAuth scope is missing:
-
-```json
-{
- "error": "insufficient_scope",
- "error_description": "Required scopes: mcp:tools",
- "scope": "mcp:tools"
-}
-```
-
-**Common Causes:**
-- Token doesn't include required OAuth scope
-- Scope not configured in OAuth provider
-
-**Solution:**
-- **Hosted:** Ensure your client credentials have `mcp:tools` scope assigned
-- **Self-hosted:** Configure your OAuth provider to include the scope in tokens
-
-### 403 Forbidden - Missing Permission
-
-Returned when permission is missing:
-
-```json
-{
- "type": "https://tools.ietf.org/html/rfc7231#section-6.5.3",
- "title": "Forbidden",
- "status": 403,
- "detail": "User lacks required permission: digitaltwins/read"
-}
-```
-
-**Common Causes:**
-- User/service account doesn't have required permission
-- Permission not included in JWT token
-- Permission API call failed (if using API provider)
-
-**Solution:**
-- **Hosted:** Assign permissions in [Konnektr Control Plane](https://docs.konnektr.io/docs/ktrlplane/concepts/access-control)
-- **Self-hosted:** Add permissions to JWT token or configure permission API
-
-## Troubleshooting
-
-### Debugging Authentication
-
-**Check your token:**
-
-```bash
-# Decode JWT (using jwt.io or jwt-cli)
-echo "YOUR_TOKEN" | jwt decode -
-
-# Verify claims:
-# - aud: Must match your configured audience
-# - iss: Must match your configured issuer
-# - exp: Must be in the future
-# - permissions: Must include required permissions
-```
-
-**Test authentication:**
-
-```bash
-# Try accessing a public endpoint
-curl https://your-server/.well-known/oauth-protected-resource
-
-# Try with your token
-curl -H "Authorization: Bearer YOUR_TOKEN" \
- https://your-server/digitaltwins/twin-1
-```
-
-### Common Issues
-
-**Issue: "401 Unauthorized" with valid token**
-
-Possible causes:
-- Token audience doesn't match configured audience
-- Token issuer doesn't match configured issuer
-- Clock skew (token not yet valid or expired)
-
-Solution: Check your `Authentication:Audience` and `Authentication:Issuer` configuration.
-
-**Issue: "403 Forbidden" for all requests**
-
-Possible causes:
-- Permissions not configured
-- Wrong permission claim name
-- Permission provider not working
-
-Solution:
-1. Check `Authorization:PermissionsClaimName` matches your token
-2. Verify permissions are in the token
-3. Check logs for permission provider errors
-
-**Issue: MCP client can't connect**
-
-Possible causes:
-- Wrong OAuth configuration
-- Missing `mcp:tools` scope
-- Network/firewall issues
-
-Solution:
-1. Verify OAuth endpoint URLs
-2. Check client credentials
-3. Ensure `mcp:tools` scope is requested and granted
-4. Test OAuth flow manually with curl
-
-### Enabling Debug Logging
-
-**Self-hosted only:**
-
-Add to `appsettings.Development.json`:
-
-```json
-{
- "Logging": {
- "LogLevel": {
- "Default": "Information",
- "Microsoft.AspNetCore.Authentication": "Debug",
- "Microsoft.AspNetCore.Authorization": "Debug",
- "AgeDigitalTwins.ServiceDefaults.Authorization": "Debug"
- }
- }
-}
-```
-
-This logs:
-- JWT validation steps
-- Permission checks
-- Authorization decisions
-
-## Security Best Practices
-
-### Token Management
-
-- **Rotate secrets regularly** - Change client secrets every 90 days
-- **Use short token expiry** - Keep tokens valid for 1 hour or less
-- **Secure token storage** - Never commit tokens to source control
-- **Use HTTPS only** - Always use encrypted connections
-
-### Permission Design
-
-- **Principle of least privilege** - Grant minimum permissions needed
-- **Separate read/write** - Don't use wildcards unless necessary
-- **Audit permissions** - Review access regularly
-- **Use service accounts** - Dedicated credentials for applications
-
-### Self-Hosted Considerations
-
-- **Secure OAuth provider** - Use established providers (Auth0, Azure AD)
-- **Monitor auth logs** - Watch for suspicious patterns
-- **Implement rate limiting** - Prevent brute force attacks
-- **Keep software updated** - Apply security patches promptly
-
-## Further Reading
-
-- [Konnektr Access Control](https://docs.konnektr.io/docs/ktrlplane/concepts/access-control) - Managing users and permissions in hosted version
-- [MCP OAuth Specification](https://spec.modelcontextprotocol.io/specification/2024-11-05/security/) - MCP security requirements
-- [RFC 9728: Protected Resource Metadata](https://www.rfc-editor.org/rfc/rfc9728.html) - OAuth discovery standard
-- [OAuth 2.1 Specification](https://datatracker.ietf.org/doc/html/draft-ietf-oauth-v2-1-10) - Latest OAuth standard
diff --git a/content/docs/graph/advanced-topics/logs-diagnostics.mdx b/content/docs/graph/advanced-topics/logs-diagnostics.mdx
deleted file mode 100644
index d696caf..0000000
--- a/content/docs/graph/advanced-topics/logs-diagnostics.mdx
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Logs & Diagnostics
-icon: Logs
----
-
-AgeDigitalTwins integrates with OpenTelemetry for tracing and diagnostics. This allows you to monitor the performance and health of your digital twins environment.
diff --git a/content/docs/graph/advanced-topics/meta.json b/content/docs/graph/advanced-topics/meta.json
deleted file mode 100644
index 6288963..0000000
--- a/content/docs/graph/advanced-topics/meta.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "title": "Advanced Topics",
- "icon": "Settings",
- "description": "Advanced configuration, performance, and security topics",
- "pages": [
- "authorization-architecture",
- "performance",
- "security",
- "logs-diagnostics"
- ]
-}
\ No newline at end of file
diff --git a/content/docs/graph/advanced-topics/performance.mdx b/content/docs/graph/advanced-topics/performance.mdx
deleted file mode 100644
index df528e5..0000000
--- a/content/docs/graph/advanced-topics/performance.mdx
+++ /dev/null
@@ -1,185 +0,0 @@
----
-title: Performance
-icon: Gauge
----
-
-Advanced performance tuning and scaling tips.
-
-## Rate Limiting
-
-The API service includes built-in rate limiting to protect against overload and ensure fair usage across clients. The system uses a simplified policy structure based on operation types and resource intensity.
-
-### Rate Limiting Policies
-
-The following rate limiting policies are applied per user/IP address:
-
-| Policy | Operation Types | Requests per Second | Queue Limit | Description |
-|--------|----------------|-------------------|-------------|-------------|
-| **Global** | All endpoints | 1,000 | 200 | Safety net across all APIs |
-| **Light Operations** | GET single items, list operations | 100 | 50 | Low-impact read operations |
-| **Medium Operations** | Query API, batch reads | 50 | 25 | Moderate resource usage |
-| **Heavy Operations** | Create/Update/Delete operations | 20 | 10 | High-impact write operations |
-| **Admin Operations** | Model management, job operations | 50 per minute | 25 | Administrative functions |
-
-### Endpoint Classifications
-
-- **Light Operations**: Digital twin GET, relationship GET, list operations
-- **Medium Operations**: Query API for graph traversals and searches
-- **Heavy Operations**: Digital twin CREATE/UPDATE/DELETE, relationship CREATE/UPDATE/DELETE
-- **Admin Operations**: Model management, import job management
-
-### Configuration
-
-All settings can be customized through the `Parameters` section in `appsettings.json`:
-
-```json
-{
- "Parameters": {
- // PostgreSQL Connection Settings
- "ConnectionIdleLifetime": 60,
- "ConnectionLifetime": 300,
- "MaxPoolSize": 100,
- "MinPoolSize": 0,
- "ConnectionTimeout": 15,
- "CommandTimeout": 30,
-
- // Rate Limiting Settings (per second unless noted)
- "GlobalPermitLimit": 1000,
- "GlobalWindowSeconds": 1,
- "LightOperationsPermitLimit": 100,
- "LightOperationsWindowSeconds": 1,
- "MediumOperationsPermitLimit": 50,
- "MediumOperationsWindowSeconds": 1,
- "HeavyOperationsPermitLimit": 20,
- "HeavyOperationsWindowSeconds": 1,
- "AdminOperationsPermitLimit": 50,
- "AdminOperationsWindowMinutes": 1, // Note: per minute
-
- // Database Protection Settings
- "MaxConcurrentRequestsPerUser": 50,
- "MaxQueryComplexityPerWindow": 20000,
- "BaseQueryComplexity": 1
- }
-}
-```
-
-### Environment Variable Support
-
-All parameters support environment variable overrides using the pattern `Parameters__`:
-
-```bash
-# PostgreSQL settings
-Parameters__MaxPoolSize=200
-Parameters__ConnectionTimeout=30
-
-# Rate limiting settings
-Parameters__GlobalPermitLimit=2000
-Parameters__LightOperationsPermitLimit=200
-Parameters__HeavyOperationsPermitLimit=50
-```
-
-### Error Response
-
-When rate limits are exceeded, the API returns HTTP 429 with details:
-
-```json
-{
- "error": "Rate limit exceeded",
- "message": "Too many requests. Please try again later.",
- "retryAfterSeconds": 1.0
-}
-```
-
-## PostgreSQL Performance Tuning
-
-For optimal performance, especially when using Apache AGE with digital twins data, proper PostgreSQL configuration is crucial.
-
-### Cluster Configuration
-
-When deploying PostgreSQL in a cluster (e.g., using CloudNativePG), consider these resource and storage configurations:
-
-```yaml
-cluster:
- instances: 3
- resources:
- limits:
- cpu: "2"
- memory: 3Gi
- requests:
- cpu: 50m
- memory: 1000Mi
- storage:
- size: 64Gi
- pvcTemplate:
- storageClassName: managed-csi-premium
- walStorage:
- enabled: true
- size: 64Gi
- pvcTemplate:
- storageClassName: managed-csi-premium
-```
-
-### PostgreSQL Parameters
-
-Key parameters for performance optimization:
-
-```yaml
-postgresql:
- parameters:
- # Connection Management
- max_connections: '200' # Adjust based on expected concurrent users
-
- # Memory Configuration
- shared_buffers: 512MB # 25% of available RAM for caching
-
- # WAL (Write-Ahead Logging) Configuration
- wal_compression: lz4 # Compress WAL files to save space
- max_wal_size: 2GB # Maximum WAL size before checkpoint
- min_wal_size: 512MB # Minimum WAL size to keep
- wal_keep_size: 512MB # WAL files to keep for replication
- max_slot_wal_keep_size: 1GB # WAL to keep for replication slots
-
- # Checkpoint Configuration
- checkpoint_flush_after: 2MB # Flush dirty pages incrementally
- wal_writer_flush_after: 2MB # WAL writer flush frequency
- checkpoint_completion_target: "0.9" # Spread checkpoint I/O
- checkpoint_timeout: 5min # Maximum time between checkpoints
-```
-
-### Performance Recommendations
-
-#### Memory Settings
-- **shared_buffers**: Set to 25% of available RAM (512MB for 2GB systems)
-- **effective_cache_size**: Set to 75% of total system memory
-- **work_mem**: Start with 4MB, increase for complex queries
-
-#### Connection Pool Settings
-- **max_connections**: Match your application's connection pool size
-- **Connection pooling**: Use PgBouncer or similar for high-concurrency scenarios
-
-#### WAL and Checkpointing
-- **wal_compression**: Use `lz4` for good compression with minimal CPU overhead
-- **checkpoint_completion_target**: Set to 0.9 to spread checkpoint I/O over time
-- **max_wal_size**: Increase for write-heavy workloads to reduce checkpoint frequency
-
-#### Storage Considerations
-- Use SSD storage for both data and WAL files
-- Separate WAL storage for better I/O performance
-- Use premium storage classes in cloud environments
-
-### Monitoring and Optimization
-
-Monitor these key metrics:
-- Connection usage and pool efficiency
-- Buffer hit ratio (target: >95%)
-- Checkpoint frequency and duration
-- WAL generation rate
-- Query performance and slow query logs
-
-### Apache AGE Specific Tuning
-
-For graph workloads with Apache AGE:
-- Increase `work_mem` for complex graph traversals
-- Monitor memory usage during large graph operations
-- Consider partitioning large graph datasets
-- Use appropriate indexes on graph node and edge properties
diff --git a/content/docs/graph/advanced-topics/security.mdx b/content/docs/graph/advanced-topics/security.mdx
deleted file mode 100644
index 6ec60b2..0000000
--- a/content/docs/graph/advanced-topics/security.mdx
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Security
-icon: Shield
----
-
-Security best practices and advanced topics.
diff --git a/content/docs/graph/concepts/components.mdx b/content/docs/graph/concepts/components.mdx
deleted file mode 100644
index e4d0f61..0000000
--- a/content/docs/graph/concepts/components.mdx
+++ /dev/null
@@ -1,376 +0,0 @@
----
-title: Components
-icon: Component
----
-
-Digital twin components in AgeDigitalTwins allow you to model complex entities by breaking them down into logical parts. Components provide a way to organize and manage different aspects of a digital twin, each with their own properties and telemetry.
-
-## Overview
-
-Components in AgeDigitalTwins follow the DTDL (Digital Twins Definition Language) specification and provide:
-
-- **Modular Design**: Break complex twins into manageable components
-- **Component-specific Operations**: Read, update, and manage individual components
-- **Component Telemetry**: Publish telemetry data specific to individual components
-- **DTDL Validation**: Validate component data against DTDL models
-- **Azure Digital Twins Compatibility**: Uses the same API patterns as Azure Digital Twins
-
-## How Components Work
-
-Components are defined in your DTDL models and represent logical parts of a digital twin:
-
-```json
-{
- "@id": "dtmi:example:Building;1",
- "@type": "Interface",
- "displayName": "Building",
- "contents": [
- {
- "@type": "Component",
- "name": "hvac",
- "schema": "dtmi:example:HVAC;1"
- },
- {
- "@type": "Component",
- "name": "lighting",
- "schema": "dtmi:example:LightingSystem;1"
- },
- {
- "@type": "Property",
- "name": "buildingName",
- "schema": "string"
- }
- ]
-}
-```
-
-## Working with Components
-
-### Getting Component Data
-
-Retrieve data for a specific component:
-
-```csharp
-// Get HVAC component data from a building twin
-var hvacData = await client.GetComponentAsync("building-001", "hvac");
-
-Console.WriteLine($"Set Point: {hvacData.SetPoint}°C");
-Console.WriteLine($"Current Temp: {hvacData.CurrentTemperature}°C");
-```
-
-### Updating Components
-
-Update specific properties within a component:
-
-```csharp
-// Update HVAC component settings
-var patch = new JsonPatchDocument();
-patch.Replace("/SetPoint", 22.5);
-patch.Replace("/Mode", "Auto");
-
-await client.UpdateComponentAsync("building-001", "hvac", patch);
-```
-
-You can also update with a structured object:
-
-```csharp
-// Update with an object
-var hvacUpdate = new {
- SetPoint = 23.0,
- Mode = "Heat",
- ScheduleEnabled = true
-};
-
-await client.UpdateComponentAsync("building-001", "hvac", hvacUpdate);
-```
-
-### Component Validation
-
-Components are automatically validated against their DTDL schema:
-
-```csharp
-try
-{
- // This will validate against the HVAC component schema
- await client.UpdateComponentAsync("building-001", "hvac", new {
- SetPoint = "invalid-temperature", // This will fail validation
- Mode = "InvalidMode" // This will also fail
- });
-}
-catch (ValidationException ex)
-{
- Console.WriteLine($"Validation failed: {ex.Message}");
-}
-```
-
-## Component Telemetry
-
-Components can publish their own telemetry data independently:
-
-```csharp
-// Publish HVAC component telemetry
-await client.PublishComponentTelemetryAsync("building-001", "hvac", new {
- actualTemperature = 22.8,
- energyUsage = 15.5,
- fanSpeed = 75,
- timestamp = DateTime.UtcNow
-});
-
-// Publish lighting component telemetry
-await client.PublishComponentTelemetryAsync("building-001", "lighting", new {
- brightnessLevel = 80,
- energyUsage = 5.2,
- motionDetected = true,
- timestamp = DateTime.UtcNow
-});
-```
-
-Component telemetry events include the component name in the subject:
-
-```json
-{
- "specversion": "1.0",
- "type": "Konnektr.DigitalTwins.Component.Telemetry",
- "source": "https://your-adt-instance/",
- "subject": "building-001/components/hvac",
- "data": {
- "actualTemperature": 22.8,
- "energyUsage": 15.5,
- "fanSpeed": 75,
- "timestamp": "2023-01-01T12:00:00Z"
- }
-}
-```
-
-## Component Events
-
-When you update components, lifecycle events are generated that include component context:
-
-### Component Update Event
-
-```json
-{
- "specversion": "1.0",
- "type": "Konnektr.DigitalTwins.Twin.Update",
- "source": "https://your-adt-instance/",
- "subject": "building-001",
- "data": {
- "modelId": "dtmi:example:Building;1",
- "patch": [
- {
- "op": "replace",
- "path": "/hvac/SetPoint",
- "value": 23.0
- }
- ]
- }
-}
-```
-
-## DTDL Component Definitions
-
-### Basic Component Schema
-
-```json
-{
- "@id": "dtmi:example:HVAC;1",
- "@type": "Interface",
- "displayName": "HVAC System",
- "contents": [
- {
- "@type": "Property",
- "name": "SetPoint",
- "schema": "double",
- "displayName": "Temperature Set Point",
- "description": "Desired temperature in Celsius"
- },
- {
- "@type": "Property",
- "name": "Mode",
- "schema": {
- "@type": "Enum",
- "valueSchema": "string",
- "enumValues": [
- { "name": "Off", "enumValue": "Off" },
- { "name": "Heat", "enumValue": "Heat" },
- { "name": "Cool", "enumValue": "Cool" },
- { "name": "Auto", "enumValue": "Auto" }
- ]
- }
- },
- {
- "@type": "Telemetry",
- "name": "ActualTemperature",
- "schema": "double",
- "displayName": "Actual Temperature"
- }
- ]
-}
-```
-
-### Complex Component with Nested Properties
-
-```json
-{
- "@id": "dtmi:example:LightingSystem;1",
- "@type": "Interface",
- "displayName": "Lighting System",
- "contents": [
- {
- "@type": "Property",
- "name": "Zones",
- "schema": {
- "@type": "Map",
- "mapKey": {
- "name": "ZoneId",
- "schema": "string"
- },
- "mapValue": {
- "name": "ZoneSettings",
- "schema": {
- "@type": "Object",
- "fields": [
- {
- "name": "brightness",
- "schema": "integer"
- },
- {
- "name": "colorTemperature",
- "schema": "integer"
- },
- {
- "name": "enabled",
- "schema": "boolean"
- }
- ]
- }
- }
- }
- }
- ]
-}
-```
-
-## Working with Nested Component Data
-
-When components contain complex nested structures, you can work with them using dynamic objects or strongly-typed classes:
-
-```csharp
-// Using dynamic object for flexibility
-dynamic lighting = await client.GetComponentAsync("building-001", "lighting");
-var zone1Brightness = lighting.Zones["zone1"].brightness;
-
-// Using strongly-typed class for validation
-public class LightingZoneSettings
-{
- public int Brightness { get; set; }
- public int ColorTemperature { get; set; }
- public bool Enabled { get; set; }
-}
-
-public class LightingComponent
-{
- public Dictionary Zones { get; set; }
-}
-
-var lightingComponent = await client.GetComponentAsync("building-001", "lighting");
-```
-
-## Component Best Practices
-
-### Design Guidelines
-
-1. **Logical Separation**: Group related properties and functionality into components
-2. **Single Responsibility**: Each component should have a clear, single purpose
-3. **Naming Consistency**: Use consistent naming conventions for component names and properties
-4. **Documentation**: Include clear descriptions in your DTDL schemas
-
-### Performance Considerations
-
-1. **Granular Updates**: Update specific components rather than entire twins when possible
-2. **Component Telemetry**: Use component-specific telemetry for better data organization
-3. **Validation**: Design component schemas for efficient validation
-4. **Indexing**: Consider indexing frequently accessed component properties
-
-### Error Handling
-
-```csharp
-try
-{
- var component = await client.GetComponentAsync("building-001", "hvac");
-}
-catch (DigitalTwinNotFoundException)
-{
- // Twin doesn't exist
-}
-catch (ComponentNotFoundException)
-{
- // Component doesn't exist on the twin
-}
-catch (ValidationException ex)
-{
- // Component data doesn't match schema
- Console.WriteLine($"Validation error: {ex.Message}");
-}
-```
-
-## Integration Patterns
-
-### IoT Device Integration
-
-Map physical device capabilities to digital twin components:
-
-```csharp
-// Map sensor data to appropriate components
-public async Task UpdateFromIoTDevice(string twinId, IoTDeviceData data)
-{
- // Update HVAC component from temperature sensor
- if (data.TemperatureSensor != null)
- {
- await client.UpdateComponentAsync(twinId, "hvac", new {
- ActualTemperature = data.TemperatureSensor.Value,
- LastUpdated = DateTime.UtcNow
- });
- }
-
- // Update lighting component from occupancy sensor
- if (data.OccupancySensor != null)
- {
- await client.UpdateComponentAsync(twinId, "lighting", new {
- OccupancyDetected = data.OccupancySensor.Occupied,
- LastMotion = data.OccupancySensor.LastMotionTime
- });
- }
-}
-```
-
-### System Integration
-
-Use components to integrate with external building management systems:
-
-```csharp
-// Sync with external BMS
-public async Task SyncWithBuildingManagementSystem(string buildingId)
-{
- var bmsData = await _bmsClient.GetBuildingDataAsync(buildingId);
-
- // Update each system component based on BMS data
- await client.UpdateComponentAsync(buildingId, "hvac", new {
- SetPoint = bmsData.HvacSetPoint,
- Mode = bmsData.HvacMode,
- ScheduleActive = bmsData.HvacScheduleEnabled
- });
-
- await client.UpdateComponentAsync(buildingId, "security", new {
- AlarmArmed = bmsData.SecurityArmed,
- AccessControlEnabled = bmsData.AccessControlActive
- });
-}
-```
-
-## See Also
-
-- [DTDL Reference](/concepts/dtdl) - Learn about Digital Twin Definition Language
-- [Validation](/concepts/validation) - Understand how component validation works
-- [Telemetry](/concepts/telemetry) - Learn about component-specific telemetry
-- [API Reference](/reference/api-reference) - Complete API documentation for component operations
diff --git a/content/docs/graph/concepts/dtdl.mdx b/content/docs/graph/concepts/dtdl.mdx
deleted file mode 100644
index 1cf72d8..0000000
--- a/content/docs/graph/concepts/dtdl.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: Digital Twins Definition Language (DTDL)
-icon: FileCode
----
-
-The Digital Twins Definition Language (DTDL) is a language for describing models and their relationships in a digital twin environment. AgeDigitalTwins supports DTDL versions 2 through 4, ensuring compatibility with a wide range of use cases.
-
-DTDL models define the structure, properties, and relationships of digital twins. These models are essential for creating a consistent and interoperable digital twin ecosystem.
-
-## References
-
-- [DTDL v4 Specification](https://github.com/Azure/opendigitaltwins-dtdl/blob/master/DTDL/v4/DTDL.v4.md)
-- [Azure Digital Twins Models Documentation](https://learn.microsoft.com/en-us/azure/digital-twins/concepts-models)
-
-## Generating DTDL Models from Ontologies
-
-DTDL models can be generated from linked data ontologies. Tools like [OntoManager](https://ontomanager.konnektr.io) simplify the management of linked data ontologies and will soon include a converter to DTDL.
diff --git a/content/docs/graph/concepts/event-route-config.png b/content/docs/graph/concepts/event-route-config.png
deleted file mode 100644
index 860f735..0000000
Binary files a/content/docs/graph/concepts/event-route-config.png and /dev/null differ
diff --git a/content/docs/graph/concepts/event-routing.mdx b/content/docs/graph/concepts/event-routing.mdx
deleted file mode 100644
index 831f2b8..0000000
--- a/content/docs/graph/concepts/event-routing.mdx
+++ /dev/null
@@ -1,592 +0,0 @@
----
-title: Event Routing & Data History
-icon: Shuffle
----
-
-Stream digital twin changes to external systems in real-time and archive complete history for temporal analysis.
-
-## Overview
-
-Event Routing in Konnektr Graph captures every change to your digital twin graph and routes those changes to external systems. This enables you to build:
-
-- **Reactive automation** - Trigger workflows when specific conditions occur
-- **Real-time monitoring** - Stream changes to dashboards and alerting systems
-- **Data pipelines** - Feed graph mutations to analytics platforms
-- **Historical analysis** - Archive complete timeline for temporal queries
-- **Audit logging** - Maintain compliance with perfect record-keeping
-- **AI agent triggers** - Notify agents when relevant state changes occur
-
-### Key Concepts
-
-**Event Sinks** define *where* events should be sent (Kafka broker, MQTT broker, webhook endpoint, Azure Data Explorer cluster, etc.). You configure connection details and authentication for each sink.
-
-**Event Routes** define *which events* flow to *which sinks*. You can have multiple routes pointing to the same sink, allowing you to route different event types or formats to the same destination.
-
-**Event Formats** determine the structure of emitted events:
-- `EventNotification` - Full CloudEvents format with complete details (real-time monitoring, automation)
-- `DataHistory` - Optimized format for time-series storage (historical analysis, compliance)
-
-## Event Types
-
-Konnektr Graph emits events for all graph mutations:
-
-| Event Type | Description | Example Use Case |
-|------------|-------------|------------------|
-| `Twin.Create` | Digital twin created | Log new asset registration |
-| `Twin.Update` | Twin property changed | Trigger alert if temperature exceeds threshold |
-| `Twin.Delete` | Digital twin deleted | Archive final state before removal |
-| `Relationship.Create` | Relationship established | Update dependency graph in external system |
-| `Relationship.Update` | Relationship property changed | Recalculate network topology |
-| `Relationship.Delete` | Relationship removed | Trigger impact analysis |
-| `Telemetry` | Custom telemetry message | Stream sensor readings to time-series DB |
-
-## Supported Destinations
-
-### Kafka / Azure Event Hubs / Fabric Event Streams
-
-Stream events to any Kafka-compatible endpoint including Apache Kafka, Azure Event Hubs, or Microsoft Fabric Event Streams.
-
-**Common use cases:**
-- Stream to data lakes (Databricks, Snowflake)
-- Feed real-time analytics (Flink, Spark Streaming)
-- Integrate with microservices architecture
-- Custom storage and processing pipelines
-
-### Azure Data Explorer (Kusto) / Fabric Real-Time Intelligence
-
-Archive events to Azure Data Explorer or Microsoft Fabric Real-Time Intelligence for time-series analytics, historical queries, and compliance.
-
-**Common use cases:**
-- Complete data history with temporal queries
-- Reconstruct graph state at any point in time
-- Compliance and audit logging
-- Trend analysis and pattern detection
-
-See [Data History with Azure Data Explorer](/docs/graph/guides/data-history-kusto) for detailed guide.
-
-### MQTT
-
-Publish events to MQTT brokers for IoT platform integration and edge systems.
-
-**Common use cases:**
-- Edge device synchronization
-- IoT platform integration (AWS IoT Core, Azure IoT Hub)
-- Pub/sub messaging for distributed systems
-
-### Webhooks
-
-Send HTTP POST requests to any endpoint for flexible integration.
-
-**Common use cases:**
-- Trigger serverless functions (Azure Functions, AWS Lambda)
-- Send notifications (Slack, Teams, PagerDuty)
-- Custom business logic and automation
-- CI/CD pipeline triggers
-
-## Configuration
-
-### Managed (Konnektr Cloud)
-
-Configure event routing through the Konnektr platform web interface.
-
-#### Step 1: Define Event Sinks
-
-1. Navigate to your Graph instance in ktrlplane
-2. Go to **Settings** > **Event Sinks**
-3. Click **Add Sink** and choose destination type
-4. Fill in connection details:
- - **Kafka**: Broker list, topic, SASL credentials (username/password or OAuth)
- - **Azure Data Explorer**: Ingestion URI, database name, service principal credentials
- - **MQTT**: Broker address, port, credentials
- - **Webhook**: Endpoint URL, authentication (Basic, Bearer, API Key, OAuth)
-5. Save the configuration
-
-Credentials are stored securely and never exposed in logs or UI.
-
-
-
-#### Step 2: Configure Event Routes
-
-1. Go to **Settings** > **Event Routes**
-2. Click **Add Route**
-3. Configure the route:
- - **Event Format**: Choose `EventNotification` (real-time) or `DataHistory` (historical)
- - **Destination Sink**: Select a configured sink
- - Optionally add filters (coming soon)
-4. Save and activate
-
-You can create multiple routes to the same sink with different formats. For example:
-- Route 1: `EventNotification` format → KafkaSink (for real-time monitoring)
-- Route 2: `DataHistory` format → KafkaSink (for archival processing)
-
-Events matching your routes will immediately start flowing to configured destinations.
-
-
-
-
-
-### Self-Hosted (Kubernetes / Helm)
-
-For self-hosted deployments, configure event routing in your Helm chart `values.yaml`:
-
-```yaml
-config:
- # Define event sinks
- eventSinks:
- kafka:
- - name: KafkaSink1
- brokerList: "kafka.example.com:9092"
- topic: "graph-events"
- saslMechanism: "PLAIN" # or OAUTHBEARER
- saslPassword:
- valueFrom:
- secretKeyRef:
- name: kafka-credentials
- key: password
-
- kusto:
- - name: AdxSink1
- ingestionUri: "https://ingest-cluster.region.kusto.windows.net"
- database: "GraphHistory"
- clientId:
- valueFrom:
- secretKeyRef:
- name: azure-sp-credentials
- key: clientId
- clientSecret:
- valueFrom:
- secretKeyRef:
- name: azure-sp-credentials
- key: clientSecret
- tenantId:
- valueFrom:
- secretKeyRef:
- name: azure-sp-credentials
- key: tenantId
-
- mqtt:
- - name: MqttBroker1
- broker: "mqtt.example.com"
- port: 8883
- topic: "graph/events"
- username:
- valueFrom:
- secretKeyRef:
- name: mqtt-credentials
- key: username
- password:
- valueFrom:
- secretKeyRef:
- name: mqtt-credentials
- key: password
-
- webhook:
- - name: WebhookEndpoint1
- url: "https://api.example.com/events"
- authenticationType: "Bearer"
- bearerToken:
- valueFrom:
- secretKeyRef:
- name: webhook-credentials
- key: token
-
- # Define event routes
- eventRoutes:
- - sinkName: KafkaSink1
- eventFormat: EventNotification # Real-time events
- - sinkName: AdxSink1
- eventFormat: DataHistory # Historical archive
- - sinkName: MqttBroker1
- eventFormat: EventNotification
- - sinkName: WebhookEndpoint1
- eventFormat: EventNotification
-
-Apply configuration:
-```bash
-helm upgrade my-graph konnektr/graph -f values.yaml
-```
-
-## Event Formats
-
-### EventNotification Format
-
-Full CloudEvents 1.0 format with complete event details. Use for real-time monitoring, automation, and general-purpose event streaming.
-
-**Example Twin.Update event:**
-```json
-{
- "specversion": "1.0",
- "type": "Konnektr.Graph.Twin.Update",
- "source": "https://my-instance.api.graph.konnektr.io",
- "id": "550e8400-e29b-41d4-a716-446655440000",
- "time": "2025-01-20T10:30:00Z",
- "subject": "sensor-temp-01",
- "datacontenttype": "application/json",
- "data": {
- "modelId": "dtmi:com:example:Sensor;1",
- "patch": [
- {"op": "replace", "path": "/temperature", "value": 72.5}
- ]
- }
-}
-```
-
-**CloudEvents Attributes:**
-
-| Attribute | Description |
-|-----------|-------------|
-| `specversion` | CloudEvents version (always "1.0") |
-| `type` | Event type (e.g., `Konnektr.Graph.Twin.Update`) |
-| `source` | URI of the Konnektr Graph instance |
-| `id` | Unique event identifier (UUID) |
-| `time` | ISO 8601 timestamp when event occurred |
-| `subject` | Twin ID or relationship ID affected |
-| `datacontenttype` | Content type of data (application/json) |
-| `data` | Event payload (format varies by event type) |
-
-### DataHistory Format
-
-Optimized flat format for time-series storage and historical analysis. Designed for efficient querying in analytics databases.
-
-**Example property update record:**
-```json
-{
- "TimeStamp": "2025-01-20T10:30:00Z",
- "ServiceId": "my-instance.api.graph.konnektr.io",
- "Id": "sensor-temp-01",
- "ModelId": "dtmi:com:example:Sensor;1",
- "Key": "temperature",
- "Value": 72.5,
- "RelationshipId": "",
- "RelationshipTarget": ""
-}
-```
-
-This format is optimized for:
-- Time-series databases (InfluxDB, TimescaleDB)
-- Analytics platforms (Azure Data Explorer, ClickHouse)
-- Columnar storage (Parquet files, data lakes)
-
-## Security & Authentication
-
-### Kafka Authentication
-
-**SASL/PLAIN:**
-```yaml
-eventSinks:
- kafka:
- - name: SecureKafka
- brokerList: "kafka.example.com:9092"
- topic: "events"
- saslMechanism: "PLAIN"
- # saslUsername and saslPassword via secrets
-```
-
-**SASL/OAUTHBEARER (Generic OAuth 2.0):**
-```yaml
-eventSinks:
- kafka:
- - name: OAuthKafka
- brokerList: "kafka.example.com:9092"
- topic: "events"
- saslMechanism: "OAUTHBEARER"
- oauthTokenEndpoint: "https://auth.example.com/oauth/token"
- oauthScope: "kafka.produce"
- # oauthClientId and oauthClientSecret via secrets
-```
-
-### Azure Data Explorer Authentication
-
-**Service Principal (Recommended):**
-```yaml
-eventSinks:
- kusto:
- - name: AdxSink
- ingestionUri: "https://ingest-cluster.region.kusto.windows.net"
- database: "GraphHistory"
- # clientId, clientSecret, tenantId via secrets
-```
-
-Required Azure role: **Database Ingestor** on target database.
-
-Grant via Azure CLI:
-```bash
-az kusto database principal-assignment create \
- --cluster-name \
- --database-name \
- --principal-id \
- --principal-type App \
- --role "Database Ingestor"
-```
-
-### MQTT Authentication
-
-```yaml
-eventSinks:
- mqtt:
- - name: SecureMqtt
- broker: "mqtt.example.com"
- port: 8883
- topic: "graph/events"
- # username and password via secrets
-```
-
-### Webhook Authentication
-
-**Bearer Token:**
-```yaml
-eventSinks:
- webhook:
- - name: BearerWebhook
- url: "https://api.example.com/events"
- authenticationType: "Bearer"
- # bearerToken via secrets
-```
-
-**Basic Authentication:**
-```yaml
-eventSinks:
- webhook:
- - name: BasicWebhook
- url: "https://api.example.com/events"
- authenticationType: "Basic"
- # username and password via secrets
-```
-
-**API Key:**
-```yaml
-eventSinks:
- webhook:
- - name: ApiKeyWebhook
- url: "https://api.example.com/events"
- authenticationType: "ApiKey"
- apiKeyHeader: "X-API-Key"
- # apiKey via secrets
-```
-
-**OAuth 2.0 Client Credentials:**
-```yaml
-eventSinks:
- webhook:
- - name: OAuthWebhook
- url: "https://api.example.com/events"
- authenticationType: "OAuth"
- oauthTokenEndpoint: "https://auth.example.com/oauth/token"
- oauthScope: "api.write"
- # oauthClientId and oauthClientSecret via secrets
-```
-
-### Injecting Secrets Securely
-
-For self-hosted deployments, always use Kubernetes secrets:
-
-```bash
-# Create secret
-kubectl create secret generic kafka-credentials \
- --from-literal=username='kafka-user' \
- --from-literal=password='your-password'
-
-# Reference in Helm
-extraEnv:
- - name: EventSinks__Kafka__0__SaslUsername
- valueFrom:
- secretKeyRef:
- name: kafka-credentials
- key: username
- - name: EventSinks__Kafka__0__SaslPassword
- valueFrom:
- secretKeyRef:
- name: kafka-credentials
- key: password
-```
-
-The path format follows .NET configuration conventions:
-- Pattern: `EventSinks______`
-- Example: `EventSinks__Kafka__0__SaslPassword` for first Kafka sink
-
-For managed deployments, credentials are entered securely in the ktrlplane UI and encrypted at rest.
-
-## Common Patterns
-
-### Pattern: Real-Time Monitoring + Historical Archive
-
-Route the same events to multiple destinations with different formats:
-
-```yaml
-eventRoutes:
- # Real-time dashboard updates
- - sinkName: KafkaSink
- eventFormat: EventNotification
-
- # Historical archive for compliance
- - sinkName: AdxSink
- eventFormat: DataHistory
-```
-
-### Pattern: Automation Trigger
-
-Trigger workflow when specific events occur:
-
-```yaml
-eventRoutes:
- - sinkName: WebhookSink
- eventFormat: EventNotification
-```
-
-Webhook endpoint evaluates event, checks conditions, triggers automation (e.g., Azure Logic App, AWS Step Functions, custom service).
-
-### Pattern: Custom Storage Backend
-
-Send DataHistory events to Kafka, then process and store in your database:
-
-```yaml
-eventRoutes:
- - sinkName: KafkaSink
- eventFormat: DataHistory
-```
-
-Kafka consumer reads events and writes to:
-- PostgreSQL with TimescaleDB extension (time-series)
-- InfluxDB (IoT telemetry focus)
-- ClickHouse (high-performance analytics)
-- Parquet files in data lake (long-term archival)
-
-### Pattern: AI Agent Notification
-
-Notify AI agents of relevant changes for immediate response:
-
-```yaml
-eventRoutes:
- - sinkName: AgentWebhook
- eventFormat: EventNotification
-```
-
-Agent receives webhook, queries Graph for full context, takes action based on temporal patterns.
-
-### Pattern: Multi-Region Replication
-
-Replicate events to secondary Graph instances for disaster recovery:
-
-```yaml
-eventRoutes:
- - sinkName: KafkaDRRegion
- eventFormat: EventNotification
-```
-
-Consumer in DR region ingests events and updates secondary Graph instance.
-
-## Use Cases
-
-### Digital Twin Data History
-
-Archive complete timeline of all digital twin changes for:
-- **Temporal queries** - "What was the state at 3 AM last Tuesday?"
-- **Change analysis** - "Which twins changed in the last 24 hours?"
-- **Root cause analysis** - Reconstruct system state during incidents
-- **Trend detection** - Identify patterns over time
-
-See [Data History with Azure Data Explorer](/docs/graph/guides/data-history-kusto) for complete guide with query examples.
-
-### Compliance & Audit Trails
-
-Maintain perfect record of all changes for regulated industries:
-- Immutable event log with complete history
-- Query "who changed what, when" across entire graph
-- Export audit trails for regulatory reporting
-- Prove compliance by reconstructing historical state
-
-### Reactive Automation
-
-Build event-driven systems that respond to graph changes:
-- Trigger maintenance workflows when thresholds exceeded
-- Send alerts when critical relationships deleted
-- Update external systems when twins created/modified
-- Orchestrate complex workflows based on graph state
-
-### Real-Time Monitoring
-
-Stream changes to dashboards and monitoring systems:
-- Live updates of asset status
-- Real-time relationship visualization
-- Alerting on anomalous changes
-- Operational intelligence dashboards
-
-### AI Agent Memory
-
-Give AI agents perfect memory of historical patterns:
-- "Has this anomaly occurred before?"
-- "What changed since you last checked?"
-- "Show me the pattern of changes over the last week"
-- Temporal reasoning for intelligent decision-making
-
-## Troubleshooting
-
-### Events Not Flowing
-
-**Check sink configuration:**
-- Verify connection details (URLs, ports, topics)
-- Confirm authentication credentials are correct
-- Test connectivity from your network to destination
-
-**Verify routes are active:**
-- Check that routes are enabled in settings
-- Confirm sink name in route matches configured sink
-
-**Review logs (self-hosted):**
-```bash
-kubectl logs | grep "EventRouting"
-```
-
-### Authentication Failures
-
-**For managed deployments:**
-- Re-enter credentials in ktrlplane UI
-- Verify service principal has required permissions
-
-**For self-hosted:**
-```bash
-# Verify secret exists
-kubectl get secret
-
-# Check environment variable injection
-kubectl describe pod | grep EventSinks
-```
-
-**For Azure Data Explorer:**
-```bash
-# Verify service principal permissions
-az kusto database principal-assignment list \
- --cluster-name \
- --database-name
-```
-
-### High Latency
-
-**Check destination capacity:**
-- Kafka: Verify partition count and consumer capacity
-- Webhooks: Check endpoint response times
-- MQTT: Verify broker capacity
-
-**For Azure Data Explorer:**
-- Consider switching ingestion policies (see Kusto guide)
-- Review cluster capacity and scaling
-
-**Network issues:**
-- Verify network path between Graph and destination
-- Check for firewall rules or network policies blocking traffic
-
-## Next Steps
-
-- **[Data History with Azure Data Explorer](../how-to-guides/data-history-kusto)** - Complete guide with temporal queries
-- **[Telemetry](telemetry)** - Send custom telemetry messages
-- **[Querying](querying.mdx)** - Query your graph effectively
-- **[Deployment Guide](../deployment-installation/hosted-konnektr)** - Deploy Konnektr Graph
-
-{/* ## Examples
-
-Browse complete examples in our GitHub repository:
-
-- [Kafka Integration Example](https://github.com/konnektr-io/examples/tree/main/kafka-events)
-- [Custom Storage Backend (InfluxDB)](https://github.com/konnektr-io/examples/tree/main/influxdb-history)
-- [Real-Time Dashboard with Webhooks](https://github.com/konnektr-io/examples/tree/main/webhook-dashboard)
-- [AI Agent Automation](https://github.com/konnektr-io/examples/tree/main/ai-agent-events) */}
\ No newline at end of file
diff --git a/content/docs/graph/concepts/event-sink-config.png b/content/docs/graph/concepts/event-sink-config.png
deleted file mode 100644
index 93c23fd..0000000
Binary files a/content/docs/graph/concepts/event-sink-config.png and /dev/null differ
diff --git a/content/docs/graph/concepts/mcp-server.mdx b/content/docs/graph/concepts/mcp-server.mdx
deleted file mode 100644
index 4bacd84..0000000
--- a/content/docs/graph/concepts/mcp-server.mdx
+++ /dev/null
@@ -1,99 +0,0 @@
----
-title: Model Context Protocol (MCP) Server
-icon: Cpu
----
-
-# Connecting to the Model Context Protocol (MCP) Server
-
-The Model Context Protocol (MCP) provides a standardized way for AI models and agents to interact with external tools and services. Konnektr Graph includes a built-in MCP server that exposes the Digital Twin capabilities as a set of tools that an AI agent can use.
-
-This allows an AI to directly query, create, update, and manage your digital twin graph in a structured and validated way.
-
-## Endpoint and Connection
-
-The shared MCP server is a single endpoint for all Konnektr Graph instances. You specify which graph instance you want to connect to by using the `resource_id` query parameter.
-
-**Endpoint URL:**
-```
-https://mcp.graph.konnektr.io/mcp?resource_id={your-resource-id}
-```
-
-- **`{your-resource-id}`**: The unique identifier for your Konnektr Graph instance.
-- **Transport**: The server supports `http_stream` (also known as Server-Sent Events or SSE).
-
-## Authentication
-
-The MCP server uses **OAuth 2.1 with Dynamic Client Registration**, as described in the [official MCP documentation](https://modelcontextprotocol.io/docs/tutorials/security/authorization).
-
-This is a secure, user-friendly approach that **does not require you to manually manage `client_id` or `client_secret`**. When your MCP client connects for the first time, it will be guided through a one-time browser-based authorization flow to grant access.
-
-## Connecting with `npx mcp-remote`
-
-For MCP clients that do not natively support remote HTTP endpoints or the OAuth 2.1 flow (e.g., some versions of Claude Desktop), you can use the `mcp-remote` tool to create a secure local proxy.
-
-### Client Configuration Example (Claude Desktop)
-
-Here is an example of how to configure a compatible MCP client, such as Claude Desktop:
-
-```json
-{
- "mcpServers": {
- "konnektr": {
- "command": "npx",
- "args": ["-y", "mcp-remote", "https://mcp.graph.konnektr.io/mcp?resource_id=your-resource-id"]
- }
- }
-}
-```
-The client only needs to know the URL and that the authentication type is `oauth2`. The rest is handled automatically.
-
-### Claude CLI Configuration
-
-To add the Konnektr Graph MCP server to your Claude CLI, use the following command:
-
-```bash
-claude mcp add konnektr --transport http https://mcp.graph.konnektr.io/mcp?resource_id=your-resource-id
-```
-
-This command sets up the connection named `konnektr` using HTTP transport to the specified MCP endpoint.
-
-
-### Gemini CLI Configuration
-For Gemini CLI, you can add the MCP server with a similar command:
-
-```bash
-gemini mcp add konnektr --transport http https://mcp.graph.konnektr.io/mcp?resource_id=your-resource-id
-```
-
-## Available Tools
-
-When an AI agent connects to the MCP server, it gains access to a suite of tools to interact with the digital twin graph.
-
-### Model Management
-- **`create_model`**: Creates a new DTDL model.
-- **`delete_model`**: Deletes a DTDL model.
-- **`get_model`**: Retrieves the full definition of a single DTDL model.
-- **`list_models`**: Lists all DTDL models in the graph.
-- **`search_models`**: Searches for DTDL models.
-
-### Digital Twin Management
-- **`create_or_replace_digital_twin`**: Creates or replaces a digital twin.
-- **`delete_digital_twin`**: Deletes a digital twin.
-- **`get_digital_twin`**: Retrieves a digital twin by its ID.
-- **`update_digital_twin`**: Updates a twin's properties using a JSON Patch.
-- **`search_digital_twins`**: Performs a semantic search for twins.
-
-### Relationship Management
-- **`create_or_replace_relationship`**: Creates or replaces a relationship between two twins.
-- **`delete_relationship`**: Deletes a relationship.
-- **`get_relationship`**: Retrieves a specific relationship.
-- **`list_relationships`**: Lists all outgoing relationships from a twin.
-- **`update_relationship`**: Updates a relationship's properties using a JSON Patch.
-
-### Querying
-- **`query_digital_twins`**: Executes a Cypher query against the graph.
-
-## See Also
-- [How-to Guide: Build a Business Twin with MCP](/how-to-guides/mcp-server-business-twin)
-- [Digital Twins Definition Language (DTDL)](/concepts/dtdl)
-- [Querying the Graph](/concepts/querying)
diff --git a/content/docs/graph/concepts/meta.json b/content/docs/graph/concepts/meta.json
deleted file mode 100644
index a160e3e..0000000
--- a/content/docs/graph/concepts/meta.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "title": "Concepts",
- "icon": "Lightbulb",
- "description": "Core concepts and fundamental understanding of Konnektr Graph",
- "pages": [
- "dtdl",
- "mcp-server",
- "querying",
- "validation",
- "event-routing",
- "telemetry",
- "components"
- ]
-}
\ No newline at end of file
diff --git a/content/docs/graph/concepts/querying.mdx b/content/docs/graph/concepts/querying.mdx
deleted file mode 100644
index 394fce5..0000000
--- a/content/docs/graph/concepts/querying.mdx
+++ /dev/null
@@ -1,48 +0,0 @@
----
-title: Querying the Graph
-icon: Search
----
-
-AgeDigitalTwins supports two query languages:
-
-1. **Azure Digital Twins Query Language**: Refer to the [official documentation](https://learn.microsoft.com/en-us/azure/digital-twins/concepts-query-language).
-2. **Cypher**: Built on Apache AGE, Cypher queries provide powerful graph querying capabilities.
-
-The used query language is automatically detected based on the query syntax.
-
-## Cypher Query Language for Digital Twins
-
-### Basic Queries
-
-- Find all twins:
-
- ```cypher
- MATCH (t:Twin) RETURN t;
- ```
-
-- Find relationships:
-
- ```cypher
- MATCH (t:Twin)-[r]->(m:Model) RETURN t, r, m;
- ```
-
-### Using `digitaltwins.is_of_model`
-
-- Find twins of a specific model:
-
- ```cypher
- MATCH (t:Twin) WHERE digitaltwins.is_of_model(t, 'dtmi:com:adt:dtsample:room;1') RETURN t;
- ```
-
-## ADT Query Functions and Cypher Equivalents
-
-| ADT Query Function | Cypher Equivalent |
-|---------------------|-------------------|
-| `IS_OF_MODEL` | `digitaltwins.is_of_model` |
-| `STARTSWITH` | `STARTS WITH` |
-| `ENDSWITH` | `ENDS WITH` |
-| `CONTAINS` | `CONTAINS` |
-| `IS_NULL` | `IS NULL` |
-| `IS_DEFINED` | `IS NOT NULL` |
-
-For more examples, refer to the [AdtQueryToCypherTests.cs](../src/AgeDigitalTwins.Test/AdtQueryToCypherTests.cs).
diff --git a/content/docs/graph/concepts/telemetry.mdx b/content/docs/graph/concepts/telemetry.mdx
deleted file mode 100644
index f032310..0000000
--- a/content/docs/graph/concepts/telemetry.mdx
+++ /dev/null
@@ -1,213 +0,0 @@
----
-title: Telemetry
-icon: Radio
----
-
-AgeDigitalTwins supports real-time telemetry publishing that enables you to send time-series data and measurements from your digital twins to external systems. This functionality is designed to be compatible with Azure Digital Twins telemetry patterns while leveraging PostgreSQL's efficient NOTIFY/LISTEN mechanism.
-
-## Overview
-
-Telemetry in AgeDigitalTwins provides:
-
-- **Real-time Publishing**: Send telemetry data immediately without waiting for database commits
-- **Component-specific Telemetry**: Publish telemetry for specific digital twin components
-- **Event Routing**: Route telemetry events to configured sinks (Kafka, Azure Data Explorer, MQTT)
-- **Azure Digital Twins Compatibility**: Uses the same API patterns as Azure Digital Twins
-- **High Performance**: Built on PostgreSQL NOTIFY/LISTEN for minimal latency
-
-## How Telemetry Works
-
-Telemetry in AgeDigitalTwins uses a different mechanism than lifecycle events:
-
-1. **Lifecycle Events** (twin/relationship creation, updates, deletes) are captured through PostgreSQL logical replication
-2. **Telemetry Events** are published directly through PostgreSQL NOTIFY/LISTEN for immediate delivery
-
-This dual approach ensures:
-
-- Lifecycle events are durable and replicated (important for maintaining state consistency)
-- Telemetry events are delivered with minimal latency (important for real-time monitoring)
-
-## Publishing Telemetry
-
-### Basic Telemetry
-
-Publish telemetry data for a digital twin:
-
-```csharp
-// Publish basic telemetry
-await client.PublishTelemetryAsync("sensor-001", new {
- temperature = 23.5,
- humidity = 45.2,
- timestamp = DateTime.UtcNow
-});
-```
-
-### Component Telemetry
-
-Publish telemetry for a specific component within a digital twin:
-
-```csharp
-// Publish component-specific telemetry
-await client.PublishComponentTelemetryAsync("building-floor-2", "hvac-system", new {
- setPoint = 22.0,
- actualTemp = 23.1,
- energyUsage = 150.5,
- timestamp = DateTime.UtcNow
-});
-```
-
-### With Message ID
-
-You can specify a custom message ID for tracking:
-
-```csharp
-// Publish with custom message ID
-await client.PublishTelemetryAsync("sensor-001", new {
- temperature = 23.5
-}, messageId: "sensor-001-reading-12345");
-```
-
-## Telemetry Event Format
-
-Telemetry events follow the CloudEvents specification and are routed through the same event system as lifecycle events:
-
-### Basic Telemetry Event
-
-```json
-{
- "specversion": "1.0",
- "type": "Konnektr.DigitalTwins.Telemetry",
- "source": "https://your-adt-instance/",
- "id": "12345678-1234-1234-1234-123456789012",
- "time": "2023-01-01T12:00:00Z",
- "datacontenttype": "application/json",
- "subject": "sensor-001",
- "data": {
- "temperature": 23.5,
- "humidity": 45.2,
- "timestamp": "2023-01-01T12:00:00Z"
- }
-}
-```
-
-### Component Telemetry Event
-
-```json
-{
- "specversion": "1.0",
- "type": "Konnektr.DigitalTwins.Component.Telemetry",
- "source": "https://your-adt-instance/",
- "id": "12345678-1234-1234-1234-123456789012",
- "time": "2023-01-01T12:00:00Z",
- "datacontenttype": "application/json",
- "subject": "building-floor-2/components/hvac-system",
- "data": {
- "setPoint": 22.0,
- "actualTemp": 23.1,
- "energyUsage": 150.5,
- "timestamp": "2023-01-01T12:00:00Z"
- }
-}
-```
-
-## Event Routing for Telemetry
-
-Telemetry events can be routed to the same sinks as lifecycle events. Configure telemetry routing in your event configuration:
-
-```yaml
-eventRoutes:
- - eventType: Telemetry
- sink: InfluxDbSink
- - eventType: ComponentTelemetry
- sink: KafkaSink
- - eventType: Telemetry
- sink: MqttSink
-```
-
-## Performance Considerations
-
-### High-Frequency Telemetry
-
-For high-frequency telemetry data:
-
-- **Batch Publishing**: Consider batching multiple telemetry points
-- **Component-based Routing**: Route different components to different sinks
-- **Sink Selection**: Use appropriate sinks for your data volume (e.g., InfluxDB for time-series, Kafka for real-time processing)
-
-### Event Processing
-
-The telemetry system is designed for high throughput:
-
-- Events are processed through a shared queue with batching
-- Multiple event consumers can process telemetry concurrently
-- PostgreSQL NOTIFY/LISTEN provides efficient event delivery
-- Failed events don't block subsequent processing
-
-## Telemetry vs Lifecycle Events
-
-| Aspect | Telemetry Events | Lifecycle Events |
-| -------------- | -------------------------------- | -------------------------------- |
-| **Purpose** | Time-series data, measurements | Entity creation/updates/deletion |
-| **Delivery** | PostgreSQL NOTIFY/LISTEN | PostgreSQL logical replication |
-| **Durability** | Ephemeral (not persisted) | Durable (replicated) |
-| **Latency** | Minimal (immediate) | Near real-time |
-| **Use Cases** | Sensor data, metrics, monitoring | State changes, auditing |
-| **Volume** | High frequency | Lower frequency |
-
-## Best Practices
-
-### Telemetry Design
-
-1. **Include Timestamps**: Always include timestamp data in your telemetry payload
-2. **Use Component Telemetry**: For complex twins, use component-specific telemetry for better organization
-3. **Consistent Schema**: Maintain consistent telemetry schemas for easier downstream processing
-4. **Message IDs**: Use meaningful message IDs for tracking and deduplication
-
-### Routing Strategy
-
-1. **Separate Sinks**: Consider using different sinks for telemetry vs lifecycle events
-2. **Time-Series Databases**: Route telemetry to time-series optimized databases (InfluxDB, TimescaleDB)
-3. **Real-time Processing**: Use Kafka/Event Hubs for real-time telemetry processing
-4. **Monitoring**: Set up monitoring for telemetry event volumes and processing rates
-
-## Integration Examples
-
-### IoT Sensor Integration
-
-```csharp
-// Example: Regular sensor reading publication
-public async Task PublishSensorReading(string twinId, SensorReading reading)
-{
- await client.PublishTelemetryAsync(twinId, new {
- temperature = reading.Temperature,
- humidity = reading.Humidity,
- pressure = reading.Pressure,
- batteryLevel = reading.BatteryLevel,
- signalStrength = reading.SignalStrength,
- timestamp = reading.Timestamp
- });
-}
-```
-
-### HVAC System Monitoring
-
-```csharp
-// Example: Component-based HVAC telemetry
-public async Task PublishHvacTelemetry(string buildingId, HvacData hvac)
-{
- await client.PublishComponentTelemetryAsync(buildingId, "hvac", new {
- setPointTemp = hvac.SetPoint,
- actualTemp = hvac.ActualTemperature,
- fanSpeed = hvac.FanSpeedPercent,
- energyConsumption = hvac.EnergyUsageKwh,
- mode = hvac.OperatingMode.ToString(),
- timestamp = DateTime.UtcNow
- });
-}
-```
-
-## See Also
-
-- [Event Routing](/concepts/event-routing) - Learn about routing telemetry events to external systems
-- [Components](/concepts/components) - Understand digital twin components for component telemetry
-- [API Reference](/reference/api-reference) - Complete API documentation for telemetry methods
diff --git a/content/docs/graph/concepts/validation.mdx b/content/docs/graph/concepts/validation.mdx
deleted file mode 100644
index 53faee4..0000000
--- a/content/docs/graph/concepts/validation.mdx
+++ /dev/null
@@ -1,19 +0,0 @@
----
-title: Data Model Validation
-icon: SquareCheck
----
-
-## Overview
-
-Data model validation is a critical feature of AgeDigitalTwins, distinguishing it from regular graph databases. Validation ensures that models and twins conform to the DTDL specifications, maintaining consistency and correctness in the digital twin environment.
-
-## Validation Process
-
-- **Models**: Validated during upload using the open-source [DTDLParser](https://github.com/Azure/opendigitaltwins-dtdl).
-- **Twins**: Validated when created or replaced. Validation after a patch operation is currently under development.
-
-## Key Benefits
-
-- Ensures data integrity.
-- Prevents invalid models or twins from being added to the graph.
-- Provides detailed error messages for debugging.
diff --git a/content/docs/graph/deployment-installation/comparison.mdx b/content/docs/graph/deployment-installation/comparison.mdx
deleted file mode 100644
index 0986d04..0000000
--- a/content/docs/graph/deployment-installation/comparison.mdx
+++ /dev/null
@@ -1,241 +0,0 @@
----
-title: Hosted vs Self-Hosted Comparison
-icon: Scale
-description: Choose the right deployment option for your digital twin solution - fully managed hosted platform or self-hosted deployment
----
-
-Konnektr Graph offers two deployment options to fit different needs. This guide will help you choose the right one for your use case.
-
-## Quick Recommendation
-
-**Most users should choose the Hosted Platform** - it's faster to deploy, fully managed, and includes enterprise features out of the box. Self-hosting is recommended only for advanced users with specific requirements.
-
----
-
-## Feature Comparison
-
-| Feature | Hosted Platform | Self-Hosted |
-|---------|----------------|-------------|
-| **Setup Time** | 5 minutes | 1-2 hours |
-| **Infrastructure Management** | Zero - fully managed | You manage everything |
-| **Automatic Updates** | ✅ Always latest version | ❌ Manual updates required |
-| **Scaling** | ✅ Automatic horizontal scaling | ⚠️ Manual configuration |
-| **High Availability** | ✅ Built-in (multi-zone) | ⚠️ You must configure |
-| **Monitoring & Alerting** | ✅ Included | ⚠️ You must set up |
-| **Backup & Recovery** | ✅ Automated daily backups | ⚠️ You must configure |
-| **Security Updates** | ✅ Automatic | ❌ Manual patching |
-| **Technical Support** | ✅ Included | ⚠️ Community-based |
-
----
-
-## API & SDK Compatibility
-
-| SDK/API | Hosted Platform | Self-Hosted |
-|---------|----------------|-------------|
-| **Azure Digital Twins SDK** (.NET, Python, JS) | ✅ Fully supported | ✅ Fully supported* |
-| **Native AgeDigitalTwins SDK** | ❌ Not available | ✅ Direct database access |
-| **REST API Compatibility** | ✅ 100% ADT-compatible | ✅ 100% ADT-compatible |
-| **MCP Protocol** | ✅ Available | ✅ Available |
-
-*Requires custom authentication configuration
-
----
-
-## Authentication & Security
-
-### Hosted Platform
-- **Auth0 Integration** - Managed authentication service
-- **JWT Token Validation** - Industry-standard security
-- **Role-Based Access Control** - Organization and project-level permissions
-- **HTTPS/TLS** - Automatic certificate management
-- **SOC 2 Compliance** - Enterprise security standards (coming soon)
-
-### Self-Hosted
-- **Bring Your Own Identity Provider** - Integrate with any OIDC/OAuth2 provider
-- **Custom Authentication Logic** - Full control over auth flow
-- **Network Policies** - Configure Kubernetes network policies
-- **Certificate Management** - Manual cert-manager setup
-- **Compliance** - You maintain compliance requirements
-
----
-
-## Event Streaming & Integration
-
-### Hosted Platform
-- **Pre-configured Event Sinks** - Kafka, Kusto, MQTT ready to use
-- **Managed Connectivity** - No firewall or network config needed
-- **Event History** - Built-in event retention
-- **CloudEvents Standard** - All events follow spec
-
-### Self-Hosted
-- **Custom Event Sinks** - Configure any sink you need
-- **Network Configuration** - Full control over event routing
-- **Data Sovereignty** - Events stay in your network
-- **Custom Transformations** - Modify event pipeline
-
----
-
-## Cost Considerations
-
-### Hosted Platform
-
-**Pricing Model:**
-- Pay-as-you-go based on usage
-- No infrastructure costs
-- Includes monitoring, backups, and support
-- Free tier available for development
-
-**Hidden Savings:**
-- No DevOps team time
-- No infrastructure maintenance
-- No upgrade planning
-- Automatic optimization
-
-**[View Pricing →](https://konnektr.io/graph)**
-
-### Self-Hosted
-
-**Infrastructure Costs:**
-- Kubernetes cluster (cloud or on-prem)
-- PostgreSQL with Apache AGE
-- Load balancers and ingress
-- Storage for backups
-- Monitoring tools (Prometheus, Grafana)
-
-**Operational Costs:**
-- DevOps engineer time
-- Database administration
-- Security patching
-- Backup management
-- Capacity planning
-
----
-
-## When to Choose Hosted Platform
-
-Choose the hosted platform if you:
-
-✅ Want to focus on building digital twin solutions, not infrastructure
-✅ Need to get started quickly (hours, not weeks)
-✅ Don't have dedicated DevOps resources
-✅ Want automatic scaling and high availability
-✅ Prefer predictable operational costs
-✅ Need enterprise-grade security and compliance
-✅ Want to use Azure Digital Twins SDKs (easiest path)
-
-**Example Use Cases:**
-- Smart building management solutions
-- IoT device fleet management
-- Industrial monitoring applications
-- Proof-of-concept and MVP projects
-- Startups and small teams
-
----
-
-## When to Choose Self-Hosted
-
-Choose self-hosting if you:
-
-✅ Need direct database access for custom queries
-✅ Have specific compliance requirements (data residency, air-gapped)
-✅ Want to use the native AgeDigitalTwins SDK
-✅ Already have Kubernetes infrastructure and expertise
-✅ Need to integrate with custom authentication systems
-✅ Require custom PostgreSQL extensions or configurations
-✅ Have dedicated DevOps and database teams
-
-**Example Use Cases:**
-- Highly regulated industries (healthcare, finance)
-- Air-gapped or offline environments
-- Custom graph algorithms and analytics
-- Large enterprises with existing Kubernetes platforms
-- Research projects requiring low-level access
-
----
-
-## Migration Path
-
-### Hosted to Self-Hosted
-
-If you start with the hosted platform and later need to self-host:
-
-1. **Export your DTDL models** via the API
-2. **Export digital twin data** using bulk export
-3. **Deploy self-hosted infrastructure** using our Helm charts
-4. **Import models and data** into your self-hosted instance
-5. **Update application endpoints** to point to your instance
-
-### Self-Hosted to Hosted
-
-If you start self-hosted and want to move to hosted:
-
-1. **Sign up for Konnektr Platform** at ktrlplane.konnektr.io
-2. **Create a new Graph resource**
-3. **Export data from self-hosted** using bulk export
-4. **Import into hosted instance** via API or UI
-5. **Update authentication** to use Auth0 credentials
-6. **Switch application endpoints** to hosted URLs
-
----
-
-## Getting Started
-
-### Start with Hosted (Recommended)
-
-1. Visit [ktrlplane.konnektr.io](https://ktrlplane.konnektr.io)
-2. Create your account (free)
-3. Create a new Graph resource
-4. Follow the [Quickstart Guide](../getting-started/quickstart)
-
-### Start with Self-Hosted
-
-1. Review the [Self-Host Deployment Guide](./self-host)
-2. Prepare your Kubernetes cluster
-3. Install via Helm chart
-4. Configure authentication and networking
-5. Follow the [SDK Reference](../reference/sdk)
-
----
-
-## Support Options
-
-### Hosted Platform
-- **Email Support** - Direct access to engineering team
-- **Documentation** - Comprehensive guides and tutorials
-- **Community** - GitHub Discussions and Slack
-- **SLA** - Uptime guarantees (Enterprise tier)
-
-### Self-Hosted
-- **Community Support** - GitHub Issues and Discussions
-- **Documentation** - Self-hosting guides and troubleshooting
-- **Commercial Support** - Available for enterprise customers
-- **Professional Services** - Custom deployment assistance
-
----
-
-## Frequently Asked Questions
-
-### Can I switch between hosted and self-hosted later?
-Yes! Both options use the same underlying technology and APIs, making migration straightforward. See the Migration Path section above.
-
-### Do both options support the same features?
-Yes, both have feature parity. The main difference is who manages the infrastructure and which SDKs you can use.
-
-### Is the self-hosted version truly open source?
-Yes! The entire codebase is Apache 2.0 licensed. You have full access to the source code and can modify it as needed.
-
-### What about vendor lock-in?
-Since we're built on standard PostgreSQL and Apache AGE, and support Azure Digital Twins APIs, you have multiple exit strategies and aren't locked into proprietary formats.
-
-### Can I use Azure Digital Twins SDKs with self-hosted?
-Yes, but you'll need to implement a custom credential provider for authentication. The hosted platform provides this out of the box.
-
----
-
-## Still Not Sure?
-
-Start with the hosted platform - it's free to try and you can always migrate to self-hosted later if your requirements change.
-
-**[Get Started with Hosted →](https://ktrlplane.konnektr.io)**
-
-**Questions?** [Open a GitHub Discussion](https://github.com/konnektr-io/pg-age-digitaltwins/discussions)
diff --git a/content/docs/graph/deployment-installation/hosted-konnektr.mdx b/content/docs/graph/deployment-installation/hosted-konnektr.mdx
deleted file mode 100644
index 730dbb9..0000000
--- a/content/docs/graph/deployment-installation/hosted-konnektr.mdx
+++ /dev/null
@@ -1,150 +0,0 @@
----
-title: Hosted Konnektr Graph
-icon: Cloud
----
-
-Deploy and manage Konnektr Graph as a fully managed service via the Konnektr platform. This is the recommended deployment option for most users.
-
-## Why Choose Hosted?
-
-- **No Infrastructure Management** - We handle PostgreSQL, Apache AGE, scaling, backups, and monitoring
-- **Enterprise Security** - Built-in Auth0 authentication and role-based access control
-- **Real-time Event Streaming** - Pre-configured Kafka and Kusto sinks
-- **Azure Digital Twins Compatible** - Use standard Azure Digital Twins SDKs
-- **Automatic Updates** - Always running the latest version with security patches
-
-## Getting Started
-
-### 1. Create Account & Organization
-
-1. Visit [ktrlplane.konnektr.io](https://ktrlplane.konnektr.io)
-2. Sign up for your Konnektr account
-3. Create or join an organization
-4. Set up your first project
-
-### 2. Deploy Konnektr Graph
-
-1. Navigate to your project dashboard
-2. Click "Create Resource" → "Konnektr Graph"
-3. Configure your graph:
- - **Name**: Unique identifier for your graph instance
- - **Region**: Choose your preferred deployment region
- - **Event Sinks**: Optional Kafka or Kusto configuration
- - **Event Routes**: Define event routing rules
-
-4. Click "Deploy" - your graph will be ready in ~2-3 minutes
-
-### 3. Access Your Graph
-
-Once deployed, you'll receive:
-- **API Endpoint**: `https://your-graph-name.api.graph.konnektr.io`
-- **Auth0 Domain**: `auth.konnektr.io`
-- **Audience**: `https://api.graph.konnektr.io`
-- **Swagger UI**: Interactive API documentation
-
-## Authentication Setup
-
-Konnektr Graph uses Auth0 for authentication. You'll need to implement a custom `TokenCredential` for Azure Digital Twins SDKs:
-
-```python
-# Python example
-from azure.digitaltwins.core import DigitalTwinsClient
-from your_auth import KonnektrTokenCredential
-
-credential = KonnektrTokenCredential(
- domain="auth.konnektr.io",
- client_id="your-client-id",
- client_secret="your-client-secret",
- audience="https://api.graph.konnektr.io"
-)
-
-client = DigitalTwinsClient(
- "https://your-graph-name.api.graph.konnektr.io",
- credential
-)
-```
-
-See [Azure SDK Integration](../how-to-guides/using-azure-digital-twins-sdks) for complete examples in Python, C#, and JavaScript.
-
-## Event Streaming Configuration
-
-### Kafka Sinks
-Stream real-time events to Apache Kafka:
-- **Broker List**: Your Kafka cluster endpoints
-- **Topic**: Target topic for digital twin events
-- **Authentication**: Uses OAUTHBEARER with federated credentials
-
-### Kusto Sinks
-Stream events to Azure Data Explorer or Microsoft Fabric:
-- **Ingestion URI**: Your ADX cluster ingestion endpoint
-- **Database**: Target database name
-- **Authentication**: Automatic with federated credentials
-
-### Event Formats
-Choose between:
-- **EventNotification**: Real-time twin state changes
-- **DataHistory**: Azure Digital Twins-compatible historical format
-
-## Resource Management
-
-From your KtrlPlane dashboard:
-
-- **Monitoring**: View metrics, health status, and performance
-- **Scaling**: Adjust compute and storage resources
-- **Configuration**: Update event sinks and routing rules
-- **Logs**: Access application and system logs
-- **Backup**: Automated daily backups with point-in-time recovery
-- **Access Control**: Manage user permissions and API keys
-
-## Pricing & Billing
-
-Konnektr Graph pricing is based on:
-- **Base Instance**: Monthly subscription per graph instance
-- **API Calls**: Per-request pricing for API operations
-- **Event Streaming**: Based on events per second throughput
-- **Storage**: Data storage and backup retention
-
-Contact [sales@konnektr.io](mailto:sales@konnektr.io) for detailed pricing and enterprise plans.
-
-## Support & SLA
-
-**Support Tiers:**
-- **Community**: GitHub issues and discussions
-- **Professional**: Email support with 24-hour response
-- **Enterprise**: Phone support with 2-hour response and dedicated CSM
-
-**Service Level Agreement:**
-- **Uptime**: 99.9% availability guarantee
-- **Performance**: Less than 100ms API response time (95th percentile)
-- **Recovery**: 4-hour RTO, 1-hour RPO for enterprise plans
-
-## Comparison: Hosted vs Self-Hosted
-
-| Feature | Hosted | Self-Hosted |
-|---------|--------|-------------|
-| **Setup Time** | 5 minutes | Hours to days |
-| **Management** | Fully managed | You manage everything |
-| **SDK Access** | Azure Digital Twins SDK | Azure + Direct SDK |
-| **Scaling** | Automatic | Manual configuration |
-| **Security** | Built-in Auth0 | You configure |
-| **Updates** | Automatic | Manual |
-| **Support** | Included | Community only |
-| **Cost** | Predictable monthly | Infrastructure + time |
-
-## Migration from Azure Digital Twins
-
-Migrating from Azure Digital Twins to hosted Konnektr Graph:
-
-1. **Models**: Export DTDL models and import via API (100% compatible)
-2. **Twins**: Use bulk export/import APIs
-3. **Code**: Replace `DefaultAzureCredential` with `KonnektrTokenCredential`
-4. **Endpoints**: Update endpoint URLs to your Konnektr Graph instance
-5. **Event Routing**: Configure equivalent Kafka/Kusto sinks
-
-See our [Migration Guide](../how-to-guides/migration-guide) for detailed steps.
-
-## Next Steps
-
-- [Quickstart](../getting-started/quickstart) - Get started in 5 minutes
-- [Azure SDK Integration](../how-to-guides/using-azure-digital-twins-sdks) - Complete SDK examples
-- [Event Routing](../concepts/event-routing) - Configure real-time streaming
diff --git a/content/docs/graph/deployment-installation/meta.json b/content/docs/graph/deployment-installation/meta.json
deleted file mode 100644
index 0964119..0000000
--- a/content/docs/graph/deployment-installation/meta.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "title": "Deployment & Installation",
- "icon": "Download",
- "description": "Deploy Konnektr Graph in various environments",
- "pages": [
- "hosted-konnektr",
- "comparison",
- "self-host",
- "performance"
- ]
-}
\ No newline at end of file
diff --git a/content/docs/graph/deployment-installation/performance.mdx b/content/docs/graph/deployment-installation/performance.mdx
deleted file mode 100644
index 32db626..0000000
--- a/content/docs/graph/deployment-installation/performance.mdx
+++ /dev/null
@@ -1,200 +0,0 @@
----
-title: Performance Tuning
-icon: Gauge
----
-
-This guide covers advanced performance tuning for self-hosted Konnektr Graph deployments. These optimizations require direct access to the PostgreSQL database and infrastructure configuration.
-
-
-
-
ℹ️
-
- Self-Hosted Only: This guide applies to self-hosted deployments where you have direct control over PostgreSQL configuration. For hosted Konnektr Graph, performance is automatically optimized.
-
-
-
-
-## Rate Limiting
-
-The API service includes built-in rate limiting to protect against overload and ensure fair usage across clients. The system uses a simplified policy structure based on operation types and resource intensity.
-
-### Rate Limiting Policies
-
-The following rate limiting policies are applied per user/IP address:
-
-| Policy | Operation Types | Requests per Second | Queue Limit | Description |
-|--------|----------------|-------------------|-------------|-------------|
-| **Global** | All endpoints | 1,000 | 200 | Safety net across all APIs |
-| **Light Operations** | GET single items, list operations | 100 | 50 | Low-impact read operations |
-| **Medium Operations** | Query API, batch reads | 50 | 25 | Moderate resource usage |
-| **Heavy Operations** | Create/Update/Delete operations | 20 | 10 | High-impact write operations |
-| **Admin Operations** | Model management, job operations | 50 per minute | 25 | Administrative functions |
-
-### Endpoint Classifications
-
-- **Light Operations**: Digital twin GET, relationship GET, list operations
-- **Medium Operations**: Query API for graph traversals and searches
-- **Heavy Operations**: Digital twin CREATE/UPDATE/DELETE, relationship CREATE/UPDATE/DELETE
-- **Admin Operations**: Model management, import job management
-
-### Configuration
-
-All settings can be customized through the `Parameters` section in `appsettings.json`:
-
-```json
-{
- "Parameters": {
- // PostgreSQL Connection Settings
- "ConnectionIdleLifetime": 60,
- "ConnectionLifetime": 300,
- "MaxPoolSize": 100,
- "MinPoolSize": 0,
- "ConnectionTimeout": 15,
- "CommandTimeout": 30,
-
- // Rate Limiting Settings (per second unless noted)
- "GlobalPermitLimit": 1000,
- "GlobalWindowSeconds": 1,
- "LightOperationsPermitLimit": 100,
- "LightOperationsWindowSeconds": 1,
- "MediumOperationsPermitLimit": 50,
- "MediumOperationsWindowSeconds": 1,
- "HeavyOperationsPermitLimit": 20,
- "HeavyOperationsWindowSeconds": 1,
- "AdminOperationsPermitLimit": 50,
- "AdminOperationsWindowMinutes": 1, // Note: per minute
-
- // Database Protection Settings
- "MaxConcurrentRequestsPerUser": 50,
- "MaxQueryComplexityPerWindow": 20000,
- "BaseQueryComplexity": 1
- }
-}
-```
-
-### Environment Variable Support
-
-All parameters support environment variable overrides using the pattern `Parameters__`:
-
-```bash
-# PostgreSQL settings
-Parameters__MaxPoolSize=200
-Parameters__ConnectionTimeout=30
-
-# Rate limiting settings
-Parameters__GlobalPermitLimit=2000
-Parameters__LightOperationsPermitLimit=200
-Parameters__HeavyOperationsPermitLimit=50
-```
-
-### Error Response
-
-When rate limits are exceeded, the API returns HTTP 429 with details:
-
-```json
-{
- "error": "Rate limit exceeded",
- "message": "Too many requests. Please try again later.",
- "retryAfterSeconds": 1.0
-}
-```
-
-## PostgreSQL Performance Tuning
-
-For optimal performance, especially when using Apache AGE with digital twins data, proper PostgreSQL configuration is crucial.
-
-### Cluster Configuration
-
-When deploying PostgreSQL in a cluster (e.g., using CloudNativePG), consider these resource and storage configurations:
-
-```yaml
-cluster:
- instances: 3
- resources:
- limits:
- cpu: "2"
- memory: 3Gi
- requests:
- cpu: 50m
- memory: 1000Mi
- storage:
- size: 64Gi
- pvcTemplate:
- storageClassName: managed-csi-premium
- walStorage:
- enabled: true
- size: 64Gi
- pvcTemplate:
- storageClassName: managed-csi-premium
-```
-
-### PostgreSQL Parameters
-
-Key parameters for performance optimization:
-
-```yaml
-postgresql:
- parameters:
- # Connection Management
- max_connections: '200' # Adjust based on expected concurrent users
-
- # Memory Configuration
- shared_buffers: 512MB # 25% of available RAM for caching
-
- # WAL (Write-Ahead Logging) Configuration
- wal_compression: lz4 # Compress WAL files to save space
- max_wal_size: 2GB # Maximum WAL size before checkpoint
- min_wal_size: 512MB # Minimum WAL size to keep
- wal_keep_size: 512MB # WAL files to keep for replication
- max_slot_wal_keep_size: 1GB # WAL to keep for replication slots
-
- # Checkpoint Configuration
- checkpoint_flush_after: 2MB # Flush dirty pages incrementally
- wal_writer_flush_after: 2MB # WAL writer flush frequency
- checkpoint_completion_target: "0.9" # Spread checkpoint I/O
- checkpoint_timeout: 5min # Maximum time between checkpoints
-```
-
-### Performance Recommendations
-
-#### Memory Settings
-- **shared_buffers**: Set to 25% of available RAM (512MB for 2GB systems)
-- **effective_cache_size**: Set to 75% of total system memory
-- **work_mem**: Start with 4MB, increase for complex queries
-
-#### Connection Pool Settings
-- **max_connections**: Match your application's connection pool size
-- **Connection pooling**: Use PgBouncer or similar for high-concurrency scenarios
-
-#### WAL and Checkpointing
-- **wal_compression**: Use `lz4` for good compression with minimal CPU overhead
-- **checkpoint_completion_target**: Set to 0.9 to spread checkpoint I/O over time
-- **max_wal_size**: Increase for write-heavy workloads to reduce checkpoint frequency
-
-#### Storage Considerations
-- Use SSD storage for both data and WAL files
-- Separate WAL storage for better I/O performance
-- Use premium storage classes in cloud environments
-
-### Monitoring and Optimization
-
-Monitor these key metrics:
-- Connection usage and pool efficiency
-- Buffer hit ratio (target: >95%)
-- Checkpoint frequency and duration
-- WAL generation rate
-- Query performance and slow query logs
-
-### Apache AGE Specific Tuning
-
-For graph workloads with Apache AGE:
-- Increase `work_mem` for complex graph traversals
-- Monitor memory usage during large graph operations
-- Consider partitioning large graph datasets
-- Use appropriate indexes on graph node and edge properties
-
-## Next Steps
-
-- [Self-Hosted Deployment](./self-host) - Complete deployment guide
-- [Security Configuration](../advanced-topics/security) - Production security setup
-- [Monitoring Setup](../advanced-topics/logs-diagnostics) - Observability and alerting
\ No newline at end of file
diff --git a/content/docs/graph/deployment-installation/self-host.mdx b/content/docs/graph/deployment-installation/self-host.mdx
deleted file mode 100644
index 309821e..0000000
--- a/content/docs/graph/deployment-installation/self-host.mdx
+++ /dev/null
@@ -1,277 +0,0 @@
----
-title: Self-Hosted Deployment
-icon: Sailboat
-description: Deploy Konnektr Graph in your own infrastructure for full control and direct database access. Recommended for advanced users who need custom configurations.
----
-
-## When to Self-Host
-
-Self-hosting Konnektr Graph is recommended for:
-
-- **Direct Database Access**: Need to use the native AgeDigitalTwins SDK
-- **Custom Authentication**: Want to integrate with your own identity provider
-- **Compliance Requirements**: Data must remain in your infrastructure
-- **Advanced Customization**: Need custom PostgreSQL extensions or configurations
-- **Air-Gapped Environments**: No internet connectivity requirements
-
-> **Most users should use [Hosted Konnektr Graph](./hosted-konnektr) instead** - it's faster to set up, fully managed, and includes enterprise features out of the box.
-
-## SDK Access Comparison
-
-| SDK Type | Hosted | Self-Hosted |
-|----------|---------|-------------|
-| **Azure Digital Twins SDK** | ✅ Recommended | ✅ With custom auth |
-| **Native AgeDigitalTwins SDK** | ❌ Not available | ✅ Direct database access |
-
-## Prerequisites
-
-- Kubernetes cluster (1.20+)
-- Helm 3.0+
-- PostgreSQL 13+ with Apache AGE extension
-- Storage provisioner for persistent volumes
-- Load balancer or ingress controller (for external access)
-
-## Helm Chart Deployment
-
-1. Add the Konnektr Helm repository:
- ```bash
- helm repo add konnektr https://konnektr-io.github.io/charts
- ```
-2. Install the AgeDigitalTwins chart:
- ```bash
- helm install my-agedigitaltwins konnektr/agedigitaltwins --values my-values.yaml
- ```
-3. Verify the installation:
- ```bash
- kubectl get pods
- ```
-
-### Helm Chart Configuration
-
-The Helm chart can be customized using a `values.yaml` file. Below are some of the most important configuration options:
-
-- `api.logLevel`: Set the log level (`Error`, `Warning`, `Information`, `Debug`, `Trace`).
-- `api.openTelemetry.enabled`: Enable OpenTelemetry integration.
-- `api.resources`: Set resource requests and limits for the API pods.
-- `api.service.type`: Service type (`ClusterIP`, `NodePort`, etc.).
-- `api.ingress.enabled`: Enable ingress for external access.
-- `cluster.instances`: Number of PostgreSQL instances.
-- `cluster.storage.size`: Persistent storage size for the database.
-- `backups.enabled`: Enable or disable backups.
-- `events.config.eventSinks`: Configure event sinks (Kafka, Kusto, MQTT, etc.).
-
-#### Example `values.yaml`
-
-```yaml
-api:
- logLevel: "Warning"
- resources:
- limits:
- cpu: 500m
- memory: 512Mi
- requests:
- cpu: 250m
- memory: 256Mi
- service:
- type: ClusterIP
- port: 8080
-cluster:
- instances: 2
- storage:
- size: 2Gi
-backups:
- enabled: false
-```
-
-For a full list of configuration options, see the `values.yaml` file in the Helm chart.
-
-## Using the Native AgeDigitalTwins SDK
-
-One key advantage of self-hosting is direct access to the native AgeDigitalTwins SDK, which connects directly to your PostgreSQL database:
-
-### Installation
-
-```bash
-dotnet add package AgeDigitalTwins
-```
-
-### Direct Database Connection
-
-```csharp
-using AgeDigitalTwins;
-using Npgsql;
-
-var connectionString = "Host=localhost;Username=postgres;Password=yourpassword;Database=agedb";
-var dataSource = NpgsqlDataSource.Create(connectionString);
-var client = new AgeDigitalTwinsClient(dataSource, "digitaltwins");
-
-// Direct database operations - no HTTP API layer
-var models = await client.GetModelsAsync();
-var twin = await client.GetDigitalTwinAsync("sensor-001");
-```
-
-### Benefits of Direct SDK
-
-- **Performance**: No HTTP API overhead - direct database queries
-- **Advanced Queries**: Full Cypher query support with complex graph traversals
-- **Bulk Operations**: Efficient batch inserts and updates
-- **Custom Extensions**: Access to underlying PostgreSQL and Apache AGE features
-- **Transaction Support**: Multi-operation transactions with rollback support
-
-## Authentication Options
-
-### Option 1: No Authentication (Development)
-```yaml
-api:
- authentication:
- enabled: false
-```
-
-### Option 2: JWT Validation
-```yaml
-api:
- authentication:
- enabled: true
- jwt:
- authority: "https://your-identity-provider.com"
- audience: "your-api-audience"
-```
-
-### Option 3: API Keys
-```yaml
-api:
- authentication:
- enabled: true
- apiKeys:
- - "your-api-key-1"
- - "your-api-key-2"
-```
-
-## Post-Deployment Setup
-
-### 1. Verify Installation
-```bash
-kubectl get pods -l app=agedigitaltwins
-kubectl logs -l app=agedigitaltwins-api
-```
-
-### 2. Test API Access
-```bash
-curl http://your-api-endpoint/health
-```
-
-### 3. Initialize with Sample Data
-Using the native SDK:
-```csharp
-// Upload a DTDL model
-var model = File.ReadAllText("room-model.json");
-await client.CreateModelsAsync(new[] { model });
-
-// Create a digital twin
-var twin = new { Temperature = 20.5, Humidity = 45.0 };
-await client.CreateOrReplaceDigitalTwinAsync("room-001", twin);
-```
-
-## Monitoring & Observability
-
-Self-hosted deployments include:
-
-- **Prometheus Metrics**: Built-in metrics endpoint at `/metrics`
-- **OpenTelemetry**: Distributed tracing support
-- **Health Checks**: Kubernetes-ready health endpoints
-- **Structured Logging**: JSON logs with correlation IDs
-
-### Example Prometheus Configuration
-```yaml
-apiVersion: v1
-kind: ConfigMap
-metadata:
- name: prometheus-config
-data:
- prometheus.yml: |
- scrape_configs:
- - job_name: 'agedigitaltwins'
- static_configs:
- - targets: ['agedigitaltwins-api:8080']
- metrics_path: '/metrics'
-```
-
-## Scaling Considerations
-
-### Horizontal Scaling
-```yaml
-api:
- replicaCount: 3
- autoscaling:
- enabled: true
- minReplicas: 2
- maxReplicas: 10
- targetCPUUtilizationPercentage: 70
-```
-
-### Database High Availability
-```yaml
-cluster:
- instances: 3
- postgresql:
- synchronous_mode: true
- max_connections: 200
-```
-
-## Migration to/from Hosted
-
-### From Hosted to Self-Hosted
-1. Export models and twins via Azure Digital Twins SDK
-2. Deploy self-hosted instance
-3. Import data using native SDK for better performance
-4. Update application connection strings
-
-### From Self-Hosted to Hosted
-1. Export models and twins using native SDK
-2. Create hosted Konnektr Graph instance
-3. Import data via Azure Digital Twins SDK
-4. Update authentication to use Auth0
-
-## Troubleshooting
-
-### Common Issues
-
-**Pod Crashes**
-```bash
-kubectl describe pod
-kubectl logs --previous
-```
-
-**Database Connection Issues**
-```bash
-kubectl exec -it -- psql -h -U postgres -d agedb -c "SELECT version();"
-```
-
-**Performance Problems**
-```bash
-kubectl top pods
-kubectl exec -it -- psql -c "SELECT * FROM pg_stat_activity;"
-```
-
-## Security Best Practices
-
-- **Network Policies**: Restrict pod-to-pod communication
-- **RBAC**: Use Kubernetes role-based access control
-- **Secrets Management**: Use Kubernetes secrets or external secret managers
-- **TLS**: Enable TLS for all external communications
-- **Database Security**: Use strong passwords and connection encryption
-
-## Support
-
-For self-hosted deployments:
-- **Community Support**: [GitHub Discussions](https://github.com/konnektr-io/pg-age-digitaltwins/discussions)
-- **Issues**: [GitHub Issues](https://github.com/konnektr-io/pg-age-digitaltwins/issues)
-- **Documentation**: [Advanced Topics](../advanced-topics/)
-
-For enterprise support and professional services, contact [support@konnektr.io](mailto:support@konnektr.io).
-
-## Next Steps
-
-- [Native SDK Reference](../reference/sdk) - Complete AgeDigitalTwins SDK documentation
-- [Advanced Configuration](../advanced-topics/performance) - Performance tuning
-- [Event Routing](../concepts/event-routing) - Set up real-time streaming
diff --git a/content/docs/graph/getting-started/meta.json b/content/docs/graph/getting-started/meta.json
deleted file mode 100644
index 49e20af..0000000
--- a/content/docs/graph/getting-started/meta.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "title": "Getting Started",
- "icon": "Rocket",
- "description": "Quick start guides and initial setup for Konnektr Graph",
- "pages": [
- "quickstart",
- "setup"
- ]
-}
\ No newline at end of file
diff --git a/content/docs/graph/getting-started/quickstart.mdx b/content/docs/graph/getting-started/quickstart.mdx
deleted file mode 100644
index d04b9b2..0000000
--- a/content/docs/graph/getting-started/quickstart.mdx
+++ /dev/null
@@ -1,285 +0,0 @@
----
-title: Quickstart
-icon: Zap
----
-
-## What is Konnektr Graph?
-
-Konnektr Graph is a high-performance, Azure Digital Twins-compatible digital twin runtime in our hosted cloud. It provides:
-
-- **Full ADT API compatibility** — use existing Azure Digital Twins SDKs
-- **Real-time eventing** — stream twin state changes
-- **Query engine** — powerful Cypher over Apache AGE
-- **Managed infrastructure** — no setup required
-
-## Prerequisites
-
-- A Konnektr account at ktrlplane.konnektr.io
-- A Graph resource provisioned from your organization dashboard
-- Auth0 client credentials (machine-to-machine app) for your organization
-
-## Get your Graph endpoint
-
-After your resource is deployed, you’ll receive a unique endpoint:
-
-```
-https://your-resource-id.api.graph.konnektr.io
-```
-
-You can open the Graph Explorer at:
-
-```
-https://explorer.graph.konnektr.io?x-adt-url=your-resource-id.api.graph.konnektr.io
-```
-
-## Authentication (Auth0)
-
-Konnektr Graph uses Auth0, not Azure AD. Do not use DefaultAzureCredential.
-
-Use these values for token requests:
-
-- Token endpoint: https://auth.konnektr.io/oauth/token
-- Audience: https://graph.konnektr.io
-- Grant type: client_credentials (M2M) or Device Code (user auth)
-
-## Copy‑paste code samples
-
-The following samples are concise and tested. They follow the same format you’ll find in the Konnektr Control Plane’s resource page.
-
-### cURL
-
-```bash
-# 1) Get an access token (Client Credentials)
-ACCESS_TOKEN=$(curl -s -X POST \
- -H "content-type: application/json" \
- -d '{
- "client_id": "YOUR_CLIENT_ID",
- "client_secret": "YOUR_CLIENT_SECRET",
- "audience": "https://graph.konnektr.io",
- "grant_type": "client_credentials"
- }' \
- https://auth.konnektr.io/oauth/token | jq -r .access_token)
-
-# 2) Upload a simple DTDL model (Room)
-curl -s -X POST \
- -H "authorization: Bearer $ACCESS_TOKEN" \
- -H "content-type: application/json" \
- --data '[
- {
- "@id": "dtmi:com:sample:Room;1",
- "@type": "Interface",
- "@context": ["dtmi:dtdl:context;3"],
- "displayName": "Room",
- "contents": [
- { "@type": "Property", "name": "name", "schema": "string" },
- { "@type": "Property", "name": "temperature", "schema": "double" }
- ]
- }
- ]' \
- https://your-resource-id.api.graph.konnektr.io/models
-
-# 3) Create a simple twin using that model
-curl -s -X PUT \
- -H "authorization: Bearer $ACCESS_TOKEN" \
- -H "content-type: application/json" \
- --data '{
- "$dtId": "room-1",
- "$metadata": { "$model": "dtmi:com:sample:Room;1" },
- "name": "Sample Room",
- "temperature": 21.5
- }' \
- https://your-resource-id.api.graph.konnektr.io/digitaltwins/room-1
-
-# 4) Query twins (returns the twin we just created)
-curl -s -X POST \
- -H "authorization: Bearer $ACCESS_TOKEN" \
- -H "content-type: application/json" \
- --data '{ "query": "SELECT * FROM digitaltwins" }' \
- https://your-resource-id.api.graph.konnektr.io/query
-```
-
-### Python
-
-```python
-# Install: pip install requests
-import requests
-
-# 1) Get access token
-token_url = "https://auth.konnektr.io/oauth/token"
-token_data = {
- "client_id": "YOUR_CLIENT_ID",
- "client_secret": "YOUR_CLIENT_SECRET",
- "audience": "https://graph.konnektr.io",
- "grant_type": "client_credentials"
-}
-token_response = requests.post(token_url, json=token_data)
-access_token = token_response.json().get("access_token")
-headers = {"Authorization": f"Bearer {access_token}", "Content-Type": "application/json"}
-
-# 2) Upload DTDL model
-models_url = "https://your-resource-id.api.graph.konnektr.io/models"
-model_payload = [
- {
- "@id": "dtmi:com:sample:Room;1",
- "@type": "Interface",
- "@context": ["dtmi:dtdl:context;3"],
- "displayName": "Room",
- "contents": [
- { "@type": "Property", "name": "name", "schema": "string" },
- { "@type": "Property", "name": "temperature", "schema": "double" }
- ]
- }
-]
-requests.post(models_url, json=model_payload, headers=headers)
-
-# 3) Create twin
-put_twin_url = "https://your-resource-id.api.graph.konnektr.io/digitaltwins/room-1"
-twin_payload = {
- "$dtId": "room-1",
- "$metadata": { "$model": "dtmi:com:sample:Room;1" },
- "name": "Sample Room",
- "temperature": 21.5
-}
-requests.put(put_twin_url, json=twin_payload, headers=headers)
-
-# 4) Query twins
-query_url = "https://your-resource-id.api.graph.konnektr.io/query"
-query_payload = {"query": "SELECT * FROM digitaltwins"}
-query_response = requests.post(query_url, json=query_payload, headers=headers)
-print(query_response.json())
-```
-
-### JavaScript/Node.js
-
-```javascript
-// Install: npm install axios
-import axios from 'axios';
-
-// 1) Get access token
-const tokenUrl = 'https://auth.konnektr.io/oauth/token';
-const tokenData = {
- client_id: 'YOUR_CLIENT_ID',
- client_secret: 'YOUR_CLIENT_SECRET',
- audience: 'https://graph.konnektr.io',
- grant_type: 'client_credentials'
-};
-const { data: token } = await axios.post(tokenUrl, tokenData);
-const accessToken = token.access_token;
-const headers = { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' };
-
-// 2) Upload DTDL model
-await axios.post('https://your-resource-id.api.graph.konnektr.io/models', [
- {
- '@id': 'dtmi:com:sample:Room;1',
- '@type': 'Interface',
- '@context': ['dtmi:dtdl:context;3'],
- displayName: 'Room',
- contents: [
- { '@type': 'Property', name: 'name', schema: 'string' },
- { '@type': 'Property', name: 'temperature', schema: 'double' }
- ]
- }
-], { headers });
-
-// 3) Create twin
-await axios.put('https://your-resource-id.api.graph.konnektr.io/digitaltwins/room-1', {
- '$dtId': 'room-1',
- '$metadata': { '$model': 'dtmi:com:sample:Room;1' },
- name: 'Sample Room',
- temperature: 21.5
-}, { headers });
-
-// 4) Query twins
-const { data } = await axios.post('https://your-resource-id.api.graph.konnektr.io/query', { query: 'SELECT * FROM digitaltwins' }, { headers });
-console.log(data);
-```
-
-### C#
-
-```csharp
-// Install: dotnet add package System.Net.Http.Json
-using System.Net.Http.Headers;
-using System.Net.Http.Json;
-using System.Text.Json;
-
-var http = new HttpClient();
-
-// 1) Get access token
-var tokenResp = await http.PostAsJsonAsync("https://auth.konnektr.io/oauth/token", new {
- client_id = "YOUR_CLIENT_ID",
- client_secret = "YOUR_CLIENT_SECRET",
- audience = "https://graph.konnektr.io",
- grant_type = "client_credentials"
-});
-var tokenJson = JsonDocument.Parse(await tokenResp.Content.ReadAsStringAsync());
-var accessToken = tokenJson.RootElement.GetProperty("access_token").GetString();
-http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
-
-// 2) Upload DTDL model
-var modelPayload = new [] {
- new {
- @id = "dtmi:com:sample:Room;1",
- @type = "Interface",
- @context = new [] { "dtmi:dtdl:context;3" },
- displayName = "Room",
- contents = new object[] {
- new { @type = "Property", name = "name", schema = "string" },
- new { @type = "Property", name = "temperature", schema = "double" }
- }
- }
-};
-await http.PostAsJsonAsync("https://your-resource-id.api.graph.konnektr.io/models", modelPayload);
-
-// 3) Create twin
-var twinPayload = new {
- $dtId = "room-1",
- $metadata = new { $model = "dtmi:com:sample:Room;1" },
- name = "Sample Room",
- temperature = 21.5
-};
-await http.PutAsJsonAsync("https://your-resource-id.api.graph.konnektr.io/digitaltwins/room-1", twinPayload);
-
-// 4) Query twins
-var queryPayload = new { query = "SELECT * FROM digitaltwins" };
-var queryResp = await http.PostAsJsonAsync("https://your-resource-id.api.graph.konnektr.io/query", queryPayload);
-Console.WriteLine(await queryResp.Content.ReadAsStringAsync());
-```
-
-## Test your connection
-
-```python
-# Basic connectivity test
-try:
- # Reuse "client" from your SDK setup if using Azure SDKs
- # For raw REST, you can call /models and count results
- import requests
- resp = requests.post("https://your-resource-id.api.graph.konnektr.io/query", json={"query": "SELECT * FROM models"}, headers=headers)
- print(f"✅ Connected successfully! Status: {resp.status_code}")
-except Exception as e:
- print(f"❌ Connection failed: {e}")
-```
-
-## First actions to try
-
-1. Upload DTDL models
-2. Create twins
-3. Build relationships
-4. Run queries
-5. Configure event routes and sinks
-
-See the how‑to guides for step‑by‑step examples.
-
-## Helpful links
-
-- Documentation: https://docs.konnektr.io/docs/graph/
-- API Reference: https://docs.konnektr.io/docs/graph/reference/api
-- Using Azure Digital Twins SDKs: https://docs.konnektr.io/docs/graph/how-to-guides/using-azure-digital-twins-sdks
-- Authentication guide: https://docs.konnektr.io/docs/graph/getting-started/authentication
-- Graph Explorer: https://explorer.graph.konnektr.io
-
-> Note: This page consolidates content that previously lived in "Quickstart" and "First Steps" for a simpler start.
-
-## Alternative deployment options
-
-- Self-Hosted: Need full control? See the self-hosted deployment guide
-- Migration: Coming from Azure Digital Twins? See the migration guide
diff --git a/content/docs/graph/getting-started/setup.mdx b/content/docs/graph/getting-started/setup.mdx
deleted file mode 100644
index b982057..0000000
--- a/content/docs/graph/getting-started/setup.mdx
+++ /dev/null
@@ -1,98 +0,0 @@
----
-title: Setup
-icon: Settings
----
-
-This guide walks you through setting up Konnektr Graph in our hosted environment via KtrlPlane.
-
-## Prerequisites
-
-- A Konnektr account at [ktrlplane.konnektr.io](https://ktrlplane.konnektr.io)
-- An organization and project set up in KtrlPlane
-
-## Creating a Graph Resource
-
-### 1. Access Resource Creation
-
-1. Log into your Konnektr dashboard
-2. Navigate to your organization
-3. Select or create a project
-4. Click "Create Resource"
-5. Choose "Konnektr Graph"
-
-### 2. Basic Configuration
-
-**Resource Name**: Choose a unique name for your graph instance. This will be part of your API endpoint.
-
-### 3. Event Sinks (Optional)
-
-Configure external systems to receive real-time events from your digital twins:
-
-#### Kafka Sink
-Stream events to Apache Kafka with federated credentials:
-- **Name**: Unique identifier for this sink
-- **Broker List**: Comma-separated list of Kafka brokers
-- **Topic**: Target Kafka topic
-- **SASL Mechanism**: Uses OAUTHBEARER with federated credentials
-
-#### Kusto Sink
-Stream events to Azure Data Explorer (Kusto) or Microsoft Fabric:
-- **Name**: Unique identifier for this sink
-- **Ingestion URI**: ADX cluster ingestion endpoint
-- **Database**: Target database name
-
-### 4. Event Routes (Optional)
-
-Define which events go to which sinks:
-
-- **Sink Name**: Select from configured sinks
-- **Event Format**:
- - `EventNotification`: Real-time twin state changes
- - `DataHistory`: Historical data format compatible with Azure Digital Twins
-
-### 5. Deploy Your Graph
-
-Click "Create Resource" to deploy your graph. The system will:
-
-1. Provision your graph database
-2. Configure Apache AGE with PostgreSQL
-3. Set up event routing infrastructure
-4. Generate your unique API endpoint
-
-## Resource Endpoints
-
-Once deployed, you'll have access to:
-
-- **API Endpoint**: `https://your-graph-name.api.graph.konnektr.io`
-- **Authentication**: Auth0 with audience `https://api.graph.konnektr.io`
-- **Documentation**: Swagger UI available at your endpoint
-
-## Authentication Setup
-
-Your graph uses Auth0 for authentication. You'll need to:
-
-1. Get your Auth0 domain: `auth.konnektr.io`
-2. Use audience: `https://api.graph.konnektr.io`
-3. Implement a custom TokenCredential for Azure SDKs
-
-See [First Steps](./first-steps) for detailed authentication examples.
-
-## Resource Management
-
-From your KtrlPlane dashboard, you can:
-
-- **Monitor**: View resource health and metrics
-- **Configure**: Update event sinks and routes
-- **Scale**: Adjust resource allocation
-- **Logs**: Access application logs and diagnostics
-- **Delete**: Remove the resource when no longer needed
-
-## Next Steps
-
-- [First Steps](./first-steps) - Connect and authenticate
-- [Using Azure SDKs](../how-to-guides/using-azure-digital-twins-sdks) - SDK integration examples
-
-### Deployment Alternatives
-
-- **Self-Hosted Option**: For full control and direct database access, see our [self-hosted deployment guide](../deployment-installation/self-host)
-- **Performance Optimization**: Self-hosted users can access [advanced performance tuning](../deployment-installation/performance)
diff --git a/content/docs/graph/how-to-guides/data-history-kusto.mdx b/content/docs/graph/how-to-guides/data-history-kusto.mdx
deleted file mode 100644
index d7b06c6..0000000
--- a/content/docs/graph/how-to-guides/data-history-kusto.mdx
+++ /dev/null
@@ -1,650 +0,0 @@
----
-title: Data History with Azure Data Explorer
-icon: DatabaseBackup
----
-
-Complete guide to archiving digital twin history in Azure Data Explorer (Kusto) or Microsoft Fabric Real-Time Intelligence for temporal queries and analytics.
-
-## Overview
-
-This guide shows you how to use [Event Routing](../concepts/event-routing) with Azure Data Explorer to create a complete, queryable history of your digital twin graph.
-
-Once configured, every change to your graph—property updates, twin lifecycle events, relationship changes—is automatically archived to Kusto tables optimized for time-series queries.
-
-### What You'll Learn
-
-- Configure Data History routing to Azure Data Explorer
-- Understand the data schema and tables
-- Run temporal queries to reconstruct historical state
-- Use Kusto's graph capabilities for historical analysis
-- Optimize performance and manage retention
-- Query vector embeddings across time
-
-## Prerequisites
-
-**Azure Data Explorer:**
-- Azure Data Explorer cluster with public network access
-- Database in the cluster
-- Service principal with **Database Ingestor** role
-
-**Microsoft Fabric (Alternative):**
-- Fabric workspace with Real-Time Intelligence enabled
-- KQL database created
-- Workspace permissions configured
-
-**Konnektr Graph:**
-- Standard tier ($99/mo) or higher
-- Access to Konnektr Portal for configuration
-
-## Setup
-
-### Step 1: Create Service Principal (Microsoft Entra)
-
-Create a service principal for authentication:
-
-```bash
-# Create service principal
-az ad sp create-for-rbac --name "konnektr-graph-history"
-
-# Note the output:
-# - appId (clientId)
-# - password (clientSecret)
-# - tenant (tenantId)
-```
-
-Grant Database Ingestor role:
-```bash
-az kusto database principal-assignment create \
- --cluster-name \
- --database-name \
- --principal-id \
- --principal-type App \
- --role "Database Ingestor"
-```
-
-### Step 2: Configure Event Sink
-
-In ktrlplane:
-
-1. Navigate to your Graph instance
-2. Go to **Settings** > **Event Sinks**
-3. Click **Add Sink** > **Azure Data Explorer**
-4. Enter configuration:
- - **Name**: `DataHistorySink`
- - **Ingestion URI**: `https://ingest-..kusto.windows.net`
- - **Database**: Your database name
- - **Client ID**: Service principal app ID
- - **Client Secret**: Service principal password
- - **Tenant ID**: Azure AD tenant ID
-5. Click **Test Connection** to verify
-6. Save
-
-### Step 3: Create Event Route
-
-1. Go to **Settings** > **Event Routes**
-2. Click **Add Route**
-3. Configure:
- - **Event Format**: `DataHistory`
- - **Destination Sink**: `DataHistorySink`
-4. Save and activate
-
-### Step 4: Verify Tables
-
-Konnektr automatically creates three tables in your database. Verify in Kusto query editor:
-
-```kusto
-.show tables
-```
-
-You should see:
-- `AdtPropertyEvents`
-- `AdtTwinLifeCycleEvents`
-- `AdtRelationshipLifeCycleEvents`
-
-Data will start flowing immediately. Check within a few minutes:
-
-```kusto
-AdtPropertyEvents
-| take 10
-```
-
-## Data Schema
-
-### AdtPropertyEvents
-
-Stores twin and relationship property changes over time.
-
-**Schema:**
-
-| Column | Type | Description |
-|--------|------|-------------|
-| `TimeStamp` | datetime | When property was updated |
-| `ServiceId` | string | Graph instance URI |
-| `Id` | string | Twin ID |
-| `ModelId` | string | DTDL model ID (DTMI) |
-| `Key` | string | Property name |
-| `Value` | dynamic | Property value (supports JSON) |
-| `RelationshipId` | string | Relationship ID (empty for twin properties) |
-| `RelationshipTarget` | string | Target twin ID (empty for twin properties) |
-
-**Example data:**
-
-| TimeStamp | Id | ModelId | Key | Value |
-|-----------|----|----|-----|-------|
-| 2025-01-20 10:30:00 | sensor-temp-01 | dtmi:com:example:Sensor;1 | temperature | 72.5 |
-| 2025-01-20 10:31:00 | sensor-temp-01 | dtmi:com:example:Sensor;1 | temperature | 73.2 |
-
-### AdtTwinLifeCycleEvents
-
-Stores twin creation and deletion events.
-
-**Schema:**
-
-| Column | Type | Description |
-|--------|------|-------------|
-| `TwinId` | string | Twin ID |
-| `Action` | string | `Create` or `Delete` |
-| `TimeStamp` | datetime | When event occurred |
-| `ServiceId` | string | Graph instance URI |
-| `ModelId` | string | DTDL model ID (DTMI) |
-
-**Example data:**
-
-| TwinId | Action | TimeStamp | ModelId |
-|--------|--------|-----------|---------|
-| pump-01 | Create | 2025-01-20 09:00:00 | dtmi:com:example:Pump;1 |
-| pump-02 | Create | 2025-01-20 09:05:00 | dtmi:com:example:Pump;1 |
-
-### AdtRelationshipLifeCycleEvents
-
-Stores relationship creation and deletion events.
-
-**Schema:**
-
-| Column | Type | Description |
-|--------|------|-------------|
-| `RelationshipId` | string | Relationship ID |
-| `Name` | string | Relationship name (type) |
-| `Action` | string | `Create` or `Delete` |
-| `TimeStamp` | datetime | When event occurred |
-| `ServiceId` | string | Graph instance URI |
-| `Source` | string | Source twin ID |
-| `Target` | string | Target twin ID |
-
-**Example data:**
-
-| RelationshipId | Name | Action | Source | Target |
-|----------------|------|--------|--------|--------|
-| rel-001 | feeds | Create | pump-01 | tank-01 |
-| rel-002 | monitors | Create | sensor-01 | pump-01 |
-
-## Temporal Queries
-
-### Current State Reconstruction
-
-Get current property values (most recent for each twin):
-
-```kusto
-AdtPropertyEvents
-| summarize arg_max(TimeStamp, *) by Id, Key
-| project Id, Key, Value, LastUpdate=TimeStamp
-```
-
-### Historical State at Specific Time
-
-Reconstruct all property values as they existed at a specific timestamp:
-
-```kusto
-let targetTime = datetime(2025-01-15 14:30:00);
-AdtPropertyEvents
-| where TimeStamp <= targetTime
-| summarize arg_max(TimeStamp, *) by Id, Key
-| project Id, Key, Value, TimeStamp
-```
-
-### Find Changes in Time Range
-
-Identify which twins changed within a period:
-
-```kusto
-AdtPropertyEvents
-| where TimeStamp between (datetime(2025-01-15 08:00) .. datetime(2025-01-15 17:00))
-| summarize ChangeCount=count(), Properties=make_set(Key) by Id, ModelId
-| order by ChangeCount desc
-```
-
-### Property History Over Time
-
-Track how a specific property evolved:
-
-```kusto
-AdtPropertyEvents
-| where Id == "sensor-temp-01"
-| where Key == "temperature"
-| project TimeStamp, Value
-| order by TimeStamp asc
-| render timechart
-```
-
-### Detect Anomalies
-
-Find twins where a property exceeded a threshold:
-
-```kusto
-AdtPropertyEvents
-| where Key == "temperature"
-| where todouble(Value) > 80
-| where TimeStamp > ago(24h)
-| project TimeStamp, Id, Temperature=todouble(Value)
-| order by TimeStamp desc
-```
-
-### Before/After Comparison
-
-Compare state before and after an incident:
-
-```kusto
-let incidentTime = datetime(2025-01-15 10:45:00);
-let beforeState = AdtPropertyEvents
- | where TimeStamp < incidentTime
- | summarize arg_max(TimeStamp, *) by Id, Key;
-let afterState = AdtPropertyEvents
- | where TimeStamp >= incidentTime and TimeStamp < incidentTime + 5m
- | summarize arg_max(TimeStamp, *) by Id, Key;
-beforeState
-| join kind=inner afterState on Id, Key
-| where Value != Value1
-| project Id, Key, BeforValue=Value, AfterValue=Value1, BeforeTime=TimeStamp, AfterTime=TimeStamp1
-```
-
-## Graph Reconstruction
-
-Kusto's [`make-graph`](https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/make-graph-operator) operator allows you to reconstruct your digital twin graph structure and run graph queries on historical data.
-
-### Create AdtGraph Function
-
-Create a function that reconstructs the current graph state:
-
-```kusto
-.create-or-alter function AdtGraph() {
- let twins = materialize(
- AdtTwinLifeCycleEvents
- | summarize arg_max(TimeStamp, *) by TwinId
- | where Action != 'Delete'
- );
- let twinIds = twins | project TwinId;
- let relationships = AdtRelationshipLifeCycleEvents
- | summarize arg_max(TimeStamp, *) by Source, Target
- | where Source in (twinIds) and Target in (twinIds)
- | where Action != 'Delete';
- relationships
- | make-graph Source-->Target with twins on TwinId
-}
-```
-
-### Query Current Graph
-
-Find all twins connected to a specific twin:
-
-```kusto
-AdtGraph()
-| graph-match (source)-[rel]->(target)
-where source.TwinId == "pump-01"
-| project Target=target.TwinId, Relationship=rel.Name
-```
-
-### Historical Graph Reconstruction
-
-Create a time-aware version that reconstructs the graph at a specific timestamp:
-
-```kusto
-.create-or-alter function AdtGraphAt(targetTime: datetime) {
- let twins = materialize(
- AdtTwinLifeCycleEvents
- | where TimeStamp <= targetTime
- | summarize arg_max(TimeStamp, *) by TwinId
- | where Action != 'Delete'
- );
- let twinIds = twins | project TwinId;
- let relationships = AdtRelationshipLifeCycleEvents
- | where TimeStamp <= targetTime
- | summarize arg_max(TimeStamp, *) by Source, Target
- | where Source in (twinIds) and Target in (twinIds)
- | where Action != 'Delete';
- relationships
- | make-graph Source-->Target with twins on TwinId
-}
-```
-
-Query the graph as it existed on January 15 at 10:00 AM:
-
-```kusto
-AdtGraphAt(datetime(2025-01-15 10:00:00))
-| graph-match (source)-[rel]->(target)
-where source.TwinId == "pump-01"
-| project Target=target.TwinId, Relationship=rel.Name
-```
-
-### Shortest Path Analysis
-
-Find shortest path between two assets at a historical timestamp:
-
-```kusto
-AdtGraphAt(datetime(2025-01-15 10:00:00))
-| graph-match (a)-[edge*1..5]->(b)
-where a.TwinId == "asset-a" and b.TwinId == "asset-b"
-| extend PathLength = array_length(edge)
-| summarize arg_min(PathLength, *) by a, b
-| project Path=edge, PathLength
-```
-
-### Impact Analysis
-
-Find all downstream assets affected by a failure at a historical time:
-
-```kusto
-let failureTime = datetime(2025-01-15 12:30:00);
-AdtGraphAt(failureTime)
-| graph-match (failed)-[feed*1..]->(affected)
-where failed.TwinId == "pump-01" and feed.Name == "feeds"
-| project AffectedAsset=affected.TwinId
-| distinct AffectedAsset
-```
-
-### Connected Components
-
-Identify isolated subgraphs at a specific time:
-
-```kusto
-AdtGraphAt(datetime(2025-01-15 10:00:00))
-| graph-match cycles=any (n1)-[*]-(n2)
-where n1.TwinId == n2.TwinId
-| project Component=n1.TwinId, Members=array_sort_asc(make_set(n2.TwinId))
-| distinct *
-```
-
-## Vector Embeddings and Similarity Search
-
-If you're storing vector embeddings as twin properties (using PostgreSQL's pgvector), those embeddings are also historized. Kusto supports vector operations for similarity analysis.
-
-### Find Similar Historical States
-
-```kusto
-// Get current embedding for a twin
-let currentEmbedding = AdtPropertyEvents
- | where Id == "pump-01"
- | where Key == "maintenanceEmbedding"
- | summarize arg_max(TimeStamp, *)
- | project Embedding=todynamic(Value);
-
-// Find historical states with similar embeddings
-AdtPropertyEvents
-| where Key == "maintenanceEmbedding"
-| where TimeStamp < ago(30d)
-| extend EmbeddingArray = todynamic(Value)
-| extend Similarity = series_cosine_similarity(
- EmbeddingArray,
- toscalar(currentEmbedding))
-| top 10 by Similarity desc
-| project TimeStamp, Id, Similarity
-```
-
-### Cluster Failure Modes by Embedding
-
-Group historical failures into clusters based on embedding similarity:
-
-```kusto
-AdtPropertyEvents
-| where Key == "failureStateEmbedding"
-| where TimeStamp > ago(180d)
-| extend Embedding = todynamic(Value)
-// Use K-means-like clustering or similarity grouping
-| summarize Occurrences=count(),
- Examples=take_any(Id, 3),
- AvgTimestamp=avg(TimeStamp)
- by hash(Embedding, 1000) % 5 // Simple bucketing by embedding hash
-| order by Occurrences desc
-```
-
-### Temporal Embedding Drift
-
-Track how an asset's embedding has changed over time:
-
-```kusto
-AdtPropertyEvents
-| where Id == "pump-01"
-| where Key == "stateEmbedding"
-| order by TimeStamp asc
-| extend PrevEmbedding = prev(todynamic(Value), 1)
-| extend CurrentEmbedding = todynamic(Value)
-| where isnotnull(PrevEmbedding)
-| extend Similarity = series_cosine_similarity(CurrentEmbedding, PrevEmbedding)
-| project TimeStamp, Similarity
-| render timechart
-```
-
-## Performance Optimization
-
-### Ingestion Performance
-
-**Streaming Ingestion** (Low latency, <4 GB/hour):
-```kusto
-.alter table AdtPropertyEvents policy streamingingestion enable
-.alter table AdtTwinLifeCycleEvents policy streamingingestion enable
-.alter table AdtRelationshipLifeCycleEvents policy streamingingestion enable
-```
-- Latency: <10 seconds
-- Best for: Real-time dashboards, immediate queries
-
-**Batch Ingestion** (High throughput, >4 GB/hour):
-```kusto
-.alter table AdtPropertyEvents policy ingestionbatching
-@'{"MaximumBatchingTimeSpan":"00:00:30", "MaximumNumberOfItems": 10000, "MaximumRawDataSizeMB": 1024}'
-```
-- Latency: 30 seconds - 15 minutes (configurable)
-- Best for: High-volume archival
-
-### Query Performance
-
-**Partition by Time:**
-```kusto
-.alter table AdtPropertyEvents policy partitioning
-@'{"PartitionKeys":[{"ColumnName":"TimeStamp","Kind":"UniformRange","Properties":{"RangeSize":"1.00:00:00"}}]}'
-```
-Partitions data by day—dramatically speeds up time-range queries.
-
-**Materialized View for Current State:**
-```kusto
-.create materialized-view LatestPropertyValues on table AdtPropertyEvents
-{
- AdtPropertyEvents
- | summarize arg_max(TimeStamp, *) by Id, Key
-}
-```
-Pre-aggregates latest values—instant "current state" queries without full table scan.
-
-**Update Policy for Real-Time Aggregations:**
-```kusto
-// Create target table for aggregated metrics
-.create table PropertyMetrics (
- Id: string,
- Key: string,
- Hour: datetime,
- AvgValue: real,
- MinValue: real,
- MaxValue: real
-)
-
-// Create update policy to aggregate on ingestion
-.alter table AdtPropertyEvents policy update
-@'[{"Source": "AdtPropertyEvents", "Query": "AdtPropertyEvents | where Key in (\"temperature\", \"pressure\") | summarize AvgValue=avg(todouble(Value)), MinValue=min(todouble(Value)), MaxValue=max(todouble(Value)) by Id, Key, Hour=bin(TimeStamp, 1h)", "IsEnabled": true, "IsTransactional": false}]'
-```
-
-## Data Retention
-
-Configure retention policies based on compliance and storage requirements:
-
-**Set Retention Period:**
-```kusto
-.alter-merge table AdtPropertyEvents policy retention
-@'{"SoftDeletePeriod":"365.00:00:00", "Recoverability":"Enabled"}'
-```
-Retains data for 365 days, then soft-deletes (recoverable for additional period).
-
-**Hot/Cold Cache:**
-```kusto
-.alter table AdtPropertyEvents policy caching hot = 30d
-```
-Keeps last 30 days in hot cache (fast queries), older data in cold storage (slower but cheaper).
-
-**Export Old Data to Data Lake:**
-```kusto
-.export async compressed to parquet (
- h@'https://storage.blob.core.windows.net/archive?'
-) with (namePrefix="history", includeHeaders="all") <|
- AdtPropertyEvents
- | where TimeStamp < ago(365d)
-```
-
-## Common Use Cases
-
-### Compliance Audit Trail
-
-**Requirement: Prove system state during inspection**
-
-```kusto
-let inspectionTime = datetime(2025-01-15 14:00:00);
-AdtPropertyEvents
-| where TimeStamp <= inspectionTime
-| summarize arg_max(TimeStamp, *) by Id, Key
-| where Id in ("critical-asset-01", "critical-asset-02")
-| project Id, Key, Value, LastUpdate=TimeStamp
-| order by Id, Key
-```
-
-Export to CSV/PDF for regulatory submission.
-
-### Root Cause Analysis
-
-**Incident: Pressure spike at 10:45 AM**
-
-```kusto
-let incidentTime = datetime(2025-01-15 10:45:00);
-
-// What changed in 5 minutes before incident?
-AdtPropertyEvents
-| where TimeStamp between ((incidentTime - 5m) .. incidentTime)
-| where Key in ("pressure", "flowRate", "valvePosition")
-| project TimeStamp, Id, Key, Value
-| order by TimeStamp asc
-```
-
-### Predictive Maintenance Pattern Matching
-
-**Find assets with degradation patterns similar to failed assets**
-
-```kusto
-// Define degradation pattern from known failure
-let failedPattern = AdtPropertyEvents
- | where Id == "pump-failed-01"
- | where Key == "vibration"
- | where TimeStamp between (ago(30d) .. ago(1d))
- | summarize Pattern=make_list(todouble(Value)) by bin(TimeStamp, 1h)
- | summarize FailedPattern=make_list(Pattern);
-
-// Find current assets with similar patterns
-AdtPropertyEvents
-| where Key == "vibration"
-| where TimeStamp > ago(30d)
-| summarize CurrentPattern=make_list(todouble(Value)) by Id, bin(TimeStamp, 1h)
-| summarize PatternList=make_list(CurrentPattern) by Id
-| extend Similarity = series_cosine_similarity(PatternList, toscalar(failedPattern))
-| where Similarity > 0.85
-| project Id, Similarity
-| order by Similarity desc
-```
-
-### AI Agent Historical Context
-
-**Agent query: "Has this anomaly type occurred before?"**
-
-```kusto
-// Current anomaly: Temperature spike to 95°C
-let anomalyThreshold = 95.0;
-AdtPropertyEvents
-| where Key == "temperature"
-| where todouble(Value) >= anomalyThreshold
-| where TimeStamp < ago(1h) // Historical only
-| summarize
- OccurrenceCount=count(),
- LastOccurrence=max(TimeStamp),
- AffectedTwins=dcount(Id),
- ExampleTwins=take_any(Id, 3)
-| project OccurrenceCount, LastOccurrence, AffectedTwins, ExampleTwins
-```
-
-Agent uses this to inform decision: "Yes, occurred 3 times before, last 2 weeks ago."
-
-## Troubleshooting
-
-### No Data Appearing
-
-**Check ingestion status:**
-```kusto
-.show ingestion failures
-| where Table in ("AdtPropertyEvents", "AdtTwinLifeCycleEvents", "AdtRelationshipLifeCycleEvents")
-| top 10 by FailedOn desc
-```
-
-**Verify event route:**
-- Confirm route is active in ktrlplane
-- Check `eventFormat` is set to `DataHistory`
-- Verify sink name matches
-
-**Test service principal permissions:**
-```bash
-az kusto database principal-assignment list \
- --cluster-name \
- --database-name
-```
-
-### High Ingestion Latency
-
-**Switch to streaming ingestion:**
-```kusto
-.alter table AdtPropertyEvents policy streamingingestion enable
-```
-
-**Reduce batching interval:**
-```kusto
-.alter table AdtPropertyEvents policy ingestionbatching
-@'{"MaximumBatchingTimeSpan":"00:00:10"}'
-```
-
-Wait 5-10 minutes for policy to take effect.
-
-### Slow Queries
-
-**Check if partitioning is enabled:**
-```kusto
-.show table AdtPropertyEvents policy partitioning
-```
-
-**Review recent slow queries:**
-```kusto
-.show queries
-| where Database == ""
-| where Duration > 10s
-| project StartedOn, Text, Duration
-| order by StartedOn desc
-```
-
-**Use materialized views for frequent queries:**
-See [Query Performance](#query-performance) section.
-
-## Next Steps
-
-- **[Event Routing](../concepts/event-routing)** - Configure other event destinations
-- **[Kusto Query Language Tutorial](https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/)** - Learn more KQL
-- **[Graph Operators in Kusto](https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/graph-operators)** - Advanced graph queries
-- **[Azure Data Explorer Best Practices](https://learn.microsoft.com/en-us/azure/data-explorer/best-practices)** - Optimization tips
\ No newline at end of file
diff --git a/content/docs/graph/how-to-guides/graph-explorer.mdx b/content/docs/graph/how-to-guides/graph-explorer.mdx
deleted file mode 100644
index 5db8b57..0000000
--- a/content/docs/graph/how-to-guides/graph-explorer.mdx
+++ /dev/null
@@ -1,291 +0,0 @@
----
-title: Using Graph Explorer
-icon: Network
----
-
-Graph Explorer is a web-based application for managing, querying, and visualizing your digital twin data. It supports both Konnektr Graph and Azure Digital Twins instances.
-
-## Access Graph Explorer
-
-For hosted Konnektr Graph instances, open Graph Explorer with your resource URL:
-
-```
-https://explorer.graph.konnektr.io?x-adt-host=your-resource-id.api.graph.konnektr.io
-```
-
-## Key Features
-
-- **Query Editor** - Write Cypher/SQL queries with syntax highlighting
-- **Multiple Views** - Table, graph network, and raw JSON visualization
-- **Model Browser** - Explore DTDL models in a hierarchical tree
-- **Inspector Panel** - Deep dive into twins, relationships, and models
-- **Relationship Management** - Create and manage twin relationships visually
-
-## User Interface
-
-Graph Explorer uses a three-panel layout:
-
-1. **Left Panel** - Browse DTDL models in a tree structure
-2. **Center Panel** - Query editor and results
-3. **Right Panel** - Inspector for detailed item views
-
-Click panel icons in the header to show/hide panels. Drag panel edges to resize.
-
-## Authentication
-
-### KtrlPlane Platform
-
-If you have a Konnektr Platform account:
-
-1. Click **Sign In** in the header
-2. Log in with your KtrlPlane credentials
-3. Your managed Graph resources appear automatically
-
-### Custom Connections
-
-For custom or Azure Digital Twins instances:
-
-1. Click **Connection Selector** → **+ Add Connection**
-2. Choose authentication method:
- - **None** - For local/open endpoints
- - **MSAL** - For Azure Digital Twins
- - **Auth0** - For custom Konnektr Graph instances
-3. Enter endpoint URL and credentials
-4. Click **Add Connection**
-
-## Working with Models
-
-### Viewing Models
-
-The left panel displays DTDL models in a tree:
-- Models that extend others appear as children
-- Badge shows twin count per model
-- Click any model to view details in Inspector
-
-### Importing Models
-
-**Method 1: Paste JSON**
-
-1. Click **+ Import** in Models panel
-2. Select **Paste JSON** tab
-3. Paste DTDL JSON (single model object or array)
-4. Click **Import**
-
-**Method 2: Upload Files**
-
-1. Click **+ Import**
-2. Select **Upload Files** tab
-3. Drag and drop `.json` files or click to browse
-4. Click **Import**
-
-### Creating Twins from Models
-
-1. Hover over a model in the tree
-2. Click the **+ Create Twin** icon
-3. Enter a Twin ID (or leave blank for auto-generation)
-4. Click **Create**
-
-## Querying Digital Twins
-
-### Writing Queries
-
-**Cypher Examples (Konnektr Graph):**
-
-```cypher
-// Get all twins
-MATCH (twin) RETURN twin
-
-// Get twins by model
-MATCH (twin)
-WHERE twin.$metadata.$model = 'dtmi:example:Building;1'
-RETURN twin
-
-// Get twins with relationships
-MATCH (source)-[rel]->(target)
-RETURN source, rel, target
-
-// Filter by property
-MATCH (twin)
-WHERE twin.temperature > 25
-RETURN twin
-```
-
-**SQL Examples (Azure Digital Twins):**
-
-```sql
--- Get all twins
-SELECT * FROM DIGITALTWINS
-
--- Get twins by model
-SELECT * FROM DIGITALTWINS
-WHERE IS_OF_MODEL('dtmi:example:Building;1')
-
--- Get relationships
-SELECT source, relationship, target
-FROM DIGITALTWINS source
-JOIN relationship ON source.$dtId = relationship.$sourceId
-JOIN target ON relationship.$targetId = target.$dtId
-```
-
-### Running Queries
-
-1. Type or paste query in the editor
-2. Click **Run Query**
-3. View results below
-
-### Query History
-
-Click **History** in the query toolbar to:
-- View recent queries with timestamps
-- One-click reload previous queries
-- Automatically persists across sessions
-
-## Visualizing Results
-
-Switch between three view modes:
-
-### Table View
-
-Structured table with:
-- **Display Names** (💬) - Human-readable property names from DTDL
-- **Layout Modes** - Simple, Grouped, Flat, or Expandable rows
-- **Pagination** - 50 rows per page
-- **Export** - Download results as CSV
-
-### Graph View
-
-Interactive network visualization:
-- Nodes represent digital twins (colored by model)
-- Edges show relationships
-- Click nodes to inspect
-- Auto-layout with circular arrangement
-
-Best for understanding relationships and network topology.
-
-### Raw View
-
-Unprocessed JSON response for debugging and verification.
-
-## Inspector Panel
-
-The Inspector shows detailed information for selected items.
-
-### Twin Inspector
-
-**Identity:**
-- Twin ID, Model ID, Metadata (ETag, upload time)
-
-**Properties:**
-- View and edit all twin properties inline
-- Click value to edit, press Enter to save
-- Type indicators and validation
-
-**Relationships:**
-- **Outgoing** - Relationships from this twin
-- **Incoming** - Relationships to this twin
-- Click to navigate between connected twins
-
-**Actions:**
-- Create new relationships
-- Edit properties
-- Delete relationships
-
-### Relationship Inspector
-
-**Details:**
-- Relationship ID and type
-- Source and target twins (clickable)
-- Visual arrow showing direction
-- Custom relationship properties
-
-### Model Inspector
-
-**Definition:**
-- Model ID, Display name, Description
-- Parent models (if using extends)
-
-**Contents:**
-- **Properties** - Data fields with types and schemas
-- **Relationships** - Allowed relationship types and targets
-- **Components** - Nested components
-- **Telemetry** - Telemetry definitions
-
-## Managing Relationships
-
-### Creating Relationships
-
-1. Open a twin in the Inspector
-2. Scroll to **Relationships** section
-3. Click **+ Create Relationship**
-4. Select relationship type and target twin
-5. Click **Create**
-
-**Target Twin Search:**
-- Type to search by ID, name, or display name
-- Automatically filtered by target model constraints
-- Select from dropdown
-
-### Deleting Relationships
-
-1. Open twin in Inspector
-2. Find relationship in **Relationships** section
-3. Click **delete icon** (🗑️)
-4. Confirm deletion
-
-## Best Practices
-
-### Query Performance
-
-- Use WHERE clauses early to reduce result sets
-- Limit results with `TOP (n)` or `LIMIT` for large datasets
-- Specify needed columns instead of `SELECT *`
-
-### Model Management
-
-- Use descriptive model IDs and display names
-- Add descriptions to document models
-- Version models in IDs (e.g., `dtmi:example:Room;1`)
-- Test models before creating production twins
-
-### Data Organization
-
-- Use consistent naming conventions for twin IDs
-- Choose meaningful property names
-- Use descriptive relationship names
-- Leverage model hierarchy with `extends`
-
-## Troubleshooting
-
-### Connection Issues
-
-**"Failed to connect to endpoint"**
-- Verify endpoint URL is correct
-- Check authentication credentials
-- Ensure Graph instance is running
-- Check network connectivity and firewalls
-
-**"Authentication failed"**
-- Re-enter credentials in connection settings
-- Verify you have correct permissions
-- Check token expiration (sign out and back in)
-- For KtrlPlane connections, refresh the connection list
-
-### Query Errors
-
-**"Query syntax error"**
-- Verify query syntax (Cypher for Konnektr Graph, SQL for Azure Digital Twins)
-- Check for typos in property names
-- Ensure model IDs are quoted and complete
-- Review query examples above
-
-**"No results returned"**
-- Verify twins exist matching your query
-- Check filter conditions
-- Try simpler query first (e.g., `SELECT * FROM DIGITALTWINS`)
-- Confirm correct connection is selected
-
-## Additional Resources
-
-- [Querying Concepts](../concepts/querying) - Query language reference
-- [DTDL Models](../concepts/dtdl) - Understanding model definitions
-- [Working with Relationships](../concepts/querying) - Relationship query patterns
diff --git a/content/docs/graph/how-to-guides/import-jobs.mdx b/content/docs/graph/how-to-guides/import-jobs.mdx
deleted file mode 100644
index 8062d50..0000000
--- a/content/docs/graph/how-to-guides/import-jobs.mdx
+++ /dev/null
@@ -1,157 +0,0 @@
----
-title: "Import Jobs"
-description: "How to use import jobs for bulk data ingestion with SAS tokens and cloud storage."
----
-
-# Import Jobs
-
-Import jobs allow you to bulk ingest data into Konnektr Graph using cloud storage blobs. This guide explains how import jobs work, how to use SAS tokens for Azure Blob Storage, and outlines future support for AWS S3 and Google Cloud Storage.
-
-## Overview
-
-An import job is a background process that reads data from an input blob (e.g., NDJSON, CSV) and writes results to an output blob. This is useful for bulk loading twins, relationships, or telemetry data.
-
-## Supported Storage Providers
-
-- **Azure Blob Storage (SAS tokens)**: Supported in hosted and self-hosted deployments.
-- **Managed Identity (Azure)**: Only available in self-hosted deployments.
-- **AWS S3**: Supported via S3 URIs and default AWS credentials or pre-signed URLs.
-- **Google Cloud Storage**: Supported via GCS URIs and default GCP credentials or signed URLs.
-
-## Using Azure Blob Storage (SAS Tokens)
-
-For hosted deployments, import jobs require Azure Blob Storage URIs with SAS tokens. SAS tokens grant temporary, scoped access to blobs without needing Azure credentials.
-
-**Example Blob URI:**
-```
-https://.blob.core.windows.net//?sv=...&sig=...
-```
-
-- The SAS token must be included in the URI query string.
-- Both input and output blob URIs must be accessible with the provided SAS token.
-- The SAS token must grant **read** permission for input blobs and **write** permission for output blobs (use `sp=r` and/or `sp=w` in the SAS token).
-- No Azure credentials or managed identity are required for hosted mode.
-
-## Using AWS S3
-
-Import jobs support AWS S3 URIs. You can use either the S3 URI format or HTTPS format:
-
-**Example S3 URIs:**
-```
-s3://my-bucket/my-object.ndjson
-https://my-bucket.s3.amazonaws.com/my-object.ndjson
-```
-
-- The application uses default AWS credentials (IAM role, environment variables, or AWS config).
-- You may also use pre-signed URLs for temporary access.
-- The credentials or signed URL must grant **read** permission for input blobs and **write** permission for output blobs.
-- For append/resume, the service downloads the existing object, appends new data, and re-uploads.
-
-## Using Google Cloud Storage
-
-Import jobs support Google Cloud Storage URIs. You can use either the GCS URI format or HTTPS format:
-
-**Example GCS URIs:**
-```
-gs://my-bucket/my-object.ndjson
-https://storage.googleapis.com/my-bucket/my-object.ndjson
-```
-
-- The application uses default GCP credentials (service account, environment variables, or GCP config).
-- You may also use signed URLs for temporary access.
-- The credentials or signed URL must grant **read** permission for input blobs and **write** permission for output blobs.
-- For append/resume, the service downloads the existing object, appends new data, and re-uploads.
-
-## How Import Jobs Work
-
-1. **Create an import job** via the API, providing:
- - `inputBlobUri`: The source blob URI (with SAS token, AWS credentials, or GCP credentials/signed URL).
- - `outputBlobUri`: The destination blob URI (with SAS token, AWS credentials, or GCP credentials/signed URL).
- - Additional job parameters as needed.
-2. The job runs in the background, reading from the input blob and writing results to the output blob.
-3. You can monitor job status, cancel, or resume jobs via the API. For S3 and GCS, resuming a job will append to the existing output object.
-
-## Required Permissions
-
-
-For all providers, you must ensure that:
-
-- **Input blob**: The credentials, SAS token, or signed URL must grant **read** access.
-- **Output blob**: The credentials, SAS token, or signed URL must grant **write** access.
-- For Azure SAS tokens, use the `sp=r` (read) and/or `sp=w` (write) permissions.
-- For AWS and GCS, ensure your IAM/service account policies allow the required operations.
-
-## NDJSON Format Requirements
-
-Import jobs require NDJSON files with a specific structure. Each section must be a line-delimited JSON object, in the following order:
-
-```
-{"Section": "Header"}
-{"fileVersion": "1.0.0", "author": "your-name", "organization": "your-org"}
-{"Section": "Models"}
-
-{"Section": "Twins"}
-
-{"Section": "Relationships"}
-
-```
-
-**Formatting Guidelines:**
-- All objects must be valid JSON and single-line (no embedded newlines).
-- The header section is required and should include metadata.
-- Models, twins, and relationships sections are optional but must follow the order above.
-- See the [Migration Guide](./migration-guide) for more details and code samples.
-
-### Example NDJSON Generator (.NET)
-
-```python title="ndjson_generator.py"
-import json
-
-def write_ndjson(models, twins, relationships, file_path, header=None):
- with open(file_path, 'w', encoding='utf-8') as f:
- # Header section
- f.write(json.dumps({"Section": "Header"}) + '\n')
- if header is None:
- header_obj = {"fileVersion": "1.0.0", "author": "authorName", "organization": "organization"}
- else:
- header_obj = header
- f.write(json.dumps(header_obj) + '\n')
-
- # Models section
- f.write(json.dumps({"Section": "Models"}) + '\n')
- for model in models:
- # model should be a dict or already serialized string
- if isinstance(model, str):
- f.write(model.strip().replace('\n', '') + '\n')
- else:
- f.write(json.dumps(model) + '\n')
-
- # Twins section
- f.write(json.dumps({"Section": "Twins"}) + '\n')
- for twin in twins:
- f.write(json.dumps(twin) + '\n')
-
- # Relationships section
- f.write(json.dumps({"Section": "Relationships"}) + '\n')
- for rel in relationships:
- f.write(json.dumps(rel) + '\n')
-```
-This function writes the NDJSON file in the required format. Pass lists of models, twins, and relationships as Python dicts or JSON strings. Each object is written on a single line.
-
-**Note:** Only NDJSON format is supported for import jobs. Do not use JSON-LD or other formats.
-
----
-
-## Future Support
-
-- Additional cloud providers and custom storage endpoints may be supported in future releases.
-
-## Notes
-
-- For self-hosted deployments, you may use managed identity for Azure Blob Storage if your environment supports it.
-- All blob URIs must be valid and accessible from the Konnektr Graph instance.
-- See the [API Reference](../reference/api) for endpoint details and request formats.
-
----
-
-For questions or troubleshooting, see [How-To Guides](./) or reach out via GitHub Discussions.
diff --git a/content/docs/graph/how-to-guides/mcp-server-business-twin.mdx b/content/docs/graph/how-to-guides/mcp-server-business-twin.mdx
deleted file mode 100644
index 52a12cc..0000000
--- a/content/docs/graph/how-to-guides/mcp-server-business-twin.mdx
+++ /dev/null
@@ -1,122 +0,0 @@
----
-title: Build a Business Twin with MCP
-icon: GraduationCap
----
-
-# How to Build a Self-Updating "Business Twin" with Konnektr and MCP
-
-This guide demonstrates how to turn Konnektr into a live, validated "Memory" for your AI agents.
-
-Using the **Model Context Protocol (MCP)**, you can connect AI agents (like Claude or Gemini) directly to your Konnektr Graph. This turns your database from a passive storage bucket into an active participant in your business workflows.
-
-In this example, we will model a **Smart Equipment System**, tracking **Employees** and their assigned **High-Value Assets**.
-
-## Prerequisites
-
-* A **Konnektr Graph** instance. The MCP server is available on "Standard" and higher tiers.
-* An **MCP Client** (e.g., Claude CLI, Claude Desktop, Gemini) that supports OAuth 2.1 or the `npx` command-line tool.
-
----
-
-## Part 1: Connecting to the Hosted MCP Server
-
-Your Konnektr Graph instance is accessible via the shared, secure MCP endpoint.
-
-### 1. Identify Your Endpoint
-The MCP server is hosted at:
-`https://mcp.graph.konnektr.io/mcp?resource_id={your-resource-id}`
-
-You must replace `{your-resource-id}` with the actual ID of your Konnektr Graph instance.
-
-### 2. Configure Your Client
-The MCP Server uses **OAuth 2.1 with Dynamic Client Registration**. You don't need to provide a `client_id` or `client_secret`. Your client will guide you through a one-time browser login to authorize access.
-
-**For Claude CLI:**
-
-```bash
-claude mcp add konnektr-graph --transport http https://mcp.graph.konnektr.io/mcp?resource_id=your-resource-id
-```
-
-**For Claude Desktop (and similar clients):**
-
-Edit your `claude_desktop_config.json` (or equivalent) with this simplified configuration:
-
-```json
-{
- "mcpServers": {
- "konnektr": {
- "command": "npx",
- "args": ["-y", "mcp-remote", "https://mcp.graph.konnektr.io/mcp?resource_id=your-resource-id"]
- }
- }
-}
-```
-
----
-
-## Part 2: Prompt Engineering for Twins
-
-The true power of Konnektr + MCP is that you don't need to write the code; you just need to guide the AI. By providing the right context, the LLM will design the schemas and populate the graph for you.
-
-### Task 1: Generate the "Constitution" (DTDL Models)
-
-Instead of manually writing JSON, ask the AI to design it. This ensures the data model is tailored to your specific needs.
-
-**User Prompt:**
-> "I want to track our internal equipment. We have Employees (name, department) and Smart Assets (description, status, embedding).
->
-> Assets can be 'active', 'maintenance', or 'retired'. An employee can have up to 5 assigned assets.
->
-> Please generate the DTDL models and upload them using `create_models`."
-
-**AI Action:**
-The AI will generate valid DTDL (Digital Twins Definition Language) and call the MCP tool. It knows that Konnektr enforces these schemas strictly—if it tries to add a property not in the model, the system will reject it.
-
-### Task 2: Populate the Graph Semantically
-
-**User Prompt:**
-> "Register a new asset: a 'NVIDIA DGX Station A100' for the AI Research team. It's active.
-> Assign it to Dr. Sarah Conner in the R&D department.
->
-> First, check if the models exist, then create the twins and the relationship. Use meaningful IDs like 'asset-dgx-01' and 'emp-sarah-c'."
-
-**AI Action:**
-1. Calls `get_models` to verify the schema.
-2. Calls `create_or_replace_digital_twin` twice.
-3. Calls `create_or_replace_relationship` to link them.
-
----
-
-## Part 3: Advanced Graph Queries
-
-The LLM can also perform complex analysis by writing Cypher queries. However, it needs to know the "rules of the graph" first to generate optimized queries.
-
-### The Query Workflow
-
-1. **Understand the Schema:** The LLM should first understand the structure of the graph by calling `list_models`.
-3. **Execute:** The LLM then writes and runs the query using `query_digital_twins` (the documentation for the tool includes the query rules).
-
-**User Prompt:**
-> "Who in the R&D department is holding high-performance computing assets? Search for assets mentioning 'DGX' or 'Computing'."
-
-**AI Action (Tool Call):**
-```json
-{
- "tool": "query_digital_twins",
- "arguments": {
- "query": "MATCH (emp:Twin)-[:assignedAsset]->(asset:Twin) WHERE emp.department = 'R&D' AND (asset.description CONTAINS 'DGX' OR asset.description CONTAINS 'Computing') RETURN emp.name, asset.description"
- }
-}
-```
-
----
-
-## Summary
-
-By connecting your AI directly to Konnektr via MCP, you create a **Self-Updating Knowledge Graph**.
-
-* **Validated:** The AI follows the DTDL "Constitution".
-* **Semantic:** Vector embeddings allow for hybrid search.
-* **Persistent:** Identities are stable across conversations.
-
-This is the foundation for a truly autonomous "Digital Twin of Organization".
diff --git a/content/docs/graph/how-to-guides/meta.json b/content/docs/graph/how-to-guides/meta.json
deleted file mode 100644
index f94eefa..0000000
--- a/content/docs/graph/how-to-guides/meta.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "title": "How-to Guides",
- "icon": "BookOpen",
- "description": "Step-by-step guides for common tasks and workflows",
- "pages": [
- "mcp-server-business-twin",
- "migration-guide",
- "using-azure-digital-twins-sdks",
- "graph-explorer",
- "import-jobs",
- "working-with-telemetry",
- "working-with-components"
- ]
-}
\ No newline at end of file
diff --git a/content/docs/graph/how-to-guides/migration-guide.mdx b/content/docs/graph/how-to-guides/migration-guide.mdx
deleted file mode 100644
index fc83efe..0000000
--- a/content/docs/graph/how-to-guides/migration-guide.mdx
+++ /dev/null
@@ -1,319 +0,0 @@
----
-title: Migration Guide
-icon: Replace
----
-
-This guide explains how to migrate your data from Azure Digital Twins to Konnektr Graph, or between different Konnektr Graph deployments.
-
-## Migration Scenarios
-
-### From Azure Digital Twins to Konnektr Graph
-Migrate from Azure Digital Twins to either hosted or self-hosted Konnektr Graph.
-
-### Between Konnektr Graph Deployments
-Move data between hosted and self-hosted Konnektr Graph instances.
-
-### From Other Digital Twin Platforms
-Migrate from other DTDL-compatible platforms.
-
-## 1. Choose Your Target Deployment
-
-### Option A: Hosted Konnektr Graph (Recommended)
-1. Create account at [ktrlplane.konnektr.io](https://ktrlplane.konnektr.io)
-2. Deploy a new Konnektr Graph resource
-3. Get your endpoint: `https://your-resource-id.api.graph.konnektr.io`
-4. Set up Auth0 authentication
-
-### Option B: Self-Hosted Konnektr Graph
-1. Deploy using [Self-Hosted Guide](../deployment-installation/self-host)
-2. Configure authentication (JWT, API keys, or development mode)
-3. Get your endpoint URL
-
-## 2. Migration Approaches
-
-### A. Using Azure Digital Twins SDKs (Recommended)
-
-The Azure Digital Twins SDK approach works for all scenarios and provides the easiest migration path:
-
-**Benefits:**
-- ✅ Works with both hosted and self-hosted Konnektr Graph
-- ✅ Handles all DTDL model complexities
-- ✅ Built-in retry logic and error handling
-- ✅ Same code works for Azure → Konnektr migration
-
-**Setup:**
-- **Source (Azure Digital Twins)**: Use `DefaultAzureCredential`
-- **Target (Hosted Konnektr Graph)**: Use custom Auth0 `TokenCredential`
-- **Target (Self-Hosted)**: Use custom JWT or API key `TokenCredential`
-
-> **Note:** See [Using Azure Digital Twins SDKs](./using-azure-digital-twins-sdks) for complete authentication setup.
-
-#### Example Migration Scripts
-
-
-
-
-```python title="copy_adt.py"
-# Example migration script for Python
-# This script copies models, twins, and relationships from Azure Digital Twins to AgeDigitalTwins
-
-from azure.identity import DefaultAzureCredential
-from azure.digitaltwins.core import DigitalTwinsClient
-import requests
-import json
-
-# Azure Digital Twins configuration
-adt_url = "https://your-adt-instance.api.eus.digitaltwins.azure.net"
-adt_client = DigitalTwinsClient(adt_url, DefaultAzureCredential())
-
-# AgeDigitalTwins configuration
-age_base_url = "https://your-resource-id.api.graph.konnektr.io"
-age_headers = {"Authorization": "Bearer your-token"}
-
-# Copy models
-def copy_models():
- models = adt_client.list_models(include_model_definition=True)
- for model in models:
- response = requests.post(f"{age_base_url}/models",
- json=model.serialize(),
- headers=age_headers)
- print(f"Copied model: {model.id}")
-
-# Copy twins
-def copy_twins():
- query = "SELECT * FROM digitaltwins"
- twins = adt_client.query_twins(query)
- for twin in twins:
- response = requests.put(f"{age_base_url}/digitaltwins/{twin['$dtId']}",
- json=twin,
- headers=age_headers)
- print(f"Copied twin: {twin['$dtId']}")
-
-# Copy relationships
-def copy_relationships():
- query = "SELECT * FROM relationships"
- relationships = adt_client.query_twins(query)
- for rel in relationships:
- response = requests.put(f"{age_base_url}/digitaltwins/{rel['$sourceId']}/relationships/{rel['$relationshipId']}",
- json=rel,
- headers=age_headers)
- print(f"Copied relationship: {rel['$relationshipId']}")
-
-if __name__ == "__main__":
- copy_models()
- copy_twins()
- copy_relationships()
-```
-
-**How to Run:**
-- Install `azure-identity` and `azure-digitaltwins-core` via pip
-- Run with `python copy_adt.py`
-
-
-
-
-```csharp title="copy_adt.cs"
-// Example migration script for C#
-using Azure.Core;
-using Azure.DigitalTwins.Core;
-using Azure.Identity;
-using System.Text.Json;
-
-public class AdtMigration
-{
- private readonly DigitalTwinsClient adtClient;
- private readonly HttpClient ageClient;
-
- public AdtMigration()
- {
- var credential = new DefaultAzureCredential();
- adtClient = new DigitalTwinsClient(
- new Uri("https://your-adt-instance.api.eus.digitaltwins.azure.net"),
- credential);
-
- ageClient = new HttpClient();
- ageClient.BaseAddress = new Uri("https://your-resource-id.api.graph.konnektr.io/");
- ageClient.DefaultRequestHeaders.Add("Authorization", "Bearer your-token");
- }
-
- public async Task CopyModelsAsync()
- {
- var options = new GetModelsOptions { IncludeModelDefinition = true };
- await foreach (var model in adtClient.GetModelsAsync(options))
- {
- var json = JsonSerializer.Serialize(model);
- var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
- await ageClient.PostAsync("models", content);
- Console.WriteLine($"Copied model: {model.Id}");
- }
- }
-
- public async Task CopyTwinsAsync()
- {
- var query = "SELECT * FROM digitaltwins";
- await foreach (var twin in adtClient.QueryAsync
-
-
-```javascript title="copy_adt.js"
-// Example migration script for JavaScript
-const { DigitalTwinsClient } = require('@azure/digital-twins-core');
-const { DefaultAzureCredential } = require('@azure/identity');
-const axios = require('axios');
-
-// Azure Digital Twins configuration
-const adtUrl = 'https://your-adt-instance.api.eus.digitaltwins.azure.net';
-const credential = new DefaultAzureCredential();
-const adtClient = new DigitalTwinsClient(adtUrl, credential);
-
-// AgeDigitalTwins configuration
-const ageBaseUrl = 'https://your-resource-id.api.graph.konnektr.io';
-const ageHeaders = { 'Authorization': 'Bearer your-token' };
-
-async function copyModels() {
- const models = adtClient.listModels({ includeModelDefinition: true });
- for await (const model of models) {
- await axios.post(`${ageBaseUrl}/models`, model, { headers: ageHeaders });
- console.log(`Copied model: ${model.id}`);
- }
-}
-
-async function copyTwins() {
- const query = 'SELECT * FROM digitaltwins';
- const twins = adtClient.queryTwins(query);
- for await (const twin of twins) {
- await axios.put(`${ageBaseUrl}/digitaltwins/${twin.$dtId}`, twin,
- { headers: ageHeaders });
- console.log(`Copied twin: ${twin.$dtId}`);
- }
-}
-
-async function copyRelationships() {
- const query = 'SELECT * FROM relationships';
- const relationships = adtClient.queryTwins(query);
- for await (const rel of relationships) {
- await axios.put(`${ageBaseUrl}/digitaltwins/${rel.$sourceId}/relationships/${rel.$relationshipId}`,
- rel, { headers: ageHeaders });
- console.log(`Copied relationship: ${rel.$relationshipId}`);
- }
-}
-
-async function main() {
- await copyModels();
- await copyTwins();
- await copyRelationships();
-}
-
-main().catch(console.error);
-```
-
-**How to Run:**
-- Install `@azure/identity` and `@azure/digital-twins-core` via npm
-- Run with `node copy_adt.js`
-
-
-
-
----
-
-### B. Exporting to NDJSON for Import Jobs
-
-For bulk migration, you must export your data to NDJSON format compatible with the Import Jobs API. The NDJSON file must follow a specific structure:
-
-#### NDJSON Format Structure
-
-Each section is a line-delimited JSON object. The required sections are:
-
-```
-{"Section": "Header"}
-{"fileVersion": "1.0.0", "author": "your-name", "organization": "your-org"}
-{"Section": "Models"}
-
-{"Section": "Twins"}
-
-{"Section": "Relationships"}
-
-```
-
-See [Azure Digital Twins Bulk Import NDJSON Generator](https://github.com/Azure-Samples/azure-digital-twins-getting-started/tree/main/bulk-import/ndjson-generator) for a .NET sample that generates NDJSON files.
-
-#### Example NDJSON Generator (.NET)
-
-```python title="ndjson_generator.py"
-import json
-
-def write_ndjson(models, twins, relationships, file_path, header=None):
- with open(file_path, 'w', encoding='utf-8') as f:
- # Header section
- f.write(json.dumps({"Section": "Header"}) + '\n')
- if header is None:
- header_obj = {"fileVersion": "1.0.0", "author": "authorName", "organization": "organization"}
- else:
- header_obj = header
- f.write(json.dumps(header_obj) + '\n')
-
- # Models section
- f.write(json.dumps({"Section": "Models"}) + '\n')
- for model in models:
- # model should be a dict or already serialized string
- if isinstance(model, str):
- f.write(model.strip().replace('\n', '') + '\n')
- else:
- f.write(json.dumps(model) + '\n')
-
- # Twins section
- f.write(json.dumps({"Section": "Twins"}) + '\n')
- for twin in twins:
- f.write(json.dumps(twin) + '\n')
-
- # Relationships section
- f.write(json.dumps({"Section": "Relationships"}) + '\n')
- for rel in relationships:
- f.write(json.dumps(rel) + '\n')
-```
-This function writes the NDJSON file in the required format. Pass lists of models, twins, and relationships as Python dicts or JSON strings. Each object is written on a single line.
-
-#### Authentication for Konnektr Graph
-
-When importing to Konnektr Graph, use Auth0 authentication (see [Using Azure Digital Twins SDKs](./using-azure-digital-twins-sdks)).
-
-**Important:** Do not use JSON-LD format for import jobs. Only NDJSON with the required headers and sections is supported.
-
----
-
-#### Steps
-1. Run the export script to generate `export.jsonld`.
-2. Upload the file to your blob storage account.
-3. Use the AgeDigitalTwins import API to import the data (see [API Reference](/reference/api-reference)).
-
----
-
-For more details on the import API and supported formats, see the [Reference documentation](/reference/api-reference).
diff --git a/content/docs/graph/how-to-guides/using-azure-digital-twins-sdks.mdx b/content/docs/graph/how-to-guides/using-azure-digital-twins-sdks.mdx
deleted file mode 100644
index 1c06669..0000000
--- a/content/docs/graph/how-to-guides/using-azure-digital-twins-sdks.mdx
+++ /dev/null
@@ -1,355 +0,0 @@
----
-title: Using Azure Digital Twins SDKs
-icon: Plug
----
-
-You can use the official Azure Digital Twins SDKs (Python, .NET, JavaScript) to connect to Konnektr Graph, as it is fully API-compatible with Azure Digital Twins.
-
-## Authentication with Konnektr Graph
-
-Konnektr Graph uses Auth0 for authentication instead of Azure AD, so you **cannot** use `DefaultAzureCredential` or other Azure identity providers. Instead, you must implement a custom `TokenCredential` that obtains tokens from Auth0.
-
-### Auth0 Configuration
-- **Domain**: `auth.konnektr.io`
-- **Audience**: `https://graph.konnektr.io`
-- **Grant Type**: `client_credentials` (service-to-service)
-
-## Python SDK
-
-### Custom TokenCredential Implementation
-
-```python
-import requests
-import time
-from azure.core.credentials import AccessToken, TokenCredential
-from azure.digitaltwins.core import DigitalTwinsClient
-
-class KonnektrTokenCredential(TokenCredential):
- def __init__(self, domain: str, client_id: str, client_secret: str, audience: str):
- self.domain = domain
- self.client_id = client_id
- self.client_secret = client_secret
- self.audience = audience
- self._token = None
- self._expires_on = 0
-
- def get_token(self, *scopes, **kwargs) -> AccessToken:
- if self._token and time.time() < self._expires_on - 300: # 5 min buffer
- return self._token
-
- url = f"https://{self.domain}/oauth/token"
- payload = {
- "client_id": self.client_id,
- "client_secret": self.client_secret,
- "audience": self.audience,
- "grant_type": "client_credentials"
- }
-
- response = requests.post(url, json=payload)
- response.raise_for_status()
-
- token_data = response.json()
- access_token = token_data["access_token"]
- expires_in = token_data["expires_in"]
-
- self._expires_on = time.time() + expires_in
- self._token = AccessToken(access_token, int(self._expires_on))
-
- return self._token
-```
-
-### Using the Python SDK
-
-```python
-from azure.digitaltwins.core import DigitalTwinsClient
-
-# Create credential
-credential = KonnektrTokenCredential(
- domain="auth.konnektr.io",
- client_id="your-client-id",
- client_secret="your-client-secret",
- audience="https://graph.konnektr.io"
-)
-
-# Create client
-client = DigitalTwinsClient(
- endpoint="https://your-resource-id.api.graph.konnektr.io",
- credential=credential
-)
-
-# Example operations
-try:
- # List models
- models = list(client.list_models())
- print(f"Found {len(models)} models")
-
- # Get a specific twin
- twin = client.get_digital_twin("twin-id")
- print(f"Twin: {twin}")
-
- # Create a twin
- twin_data = {
- "$metadata": {"$model": "dtmi:example:Room;1"},
- "Temperature": 20.0,
- "Humidity": 45.0
- }
- client.upsert_digital_twin("room-001", twin_data)
-
-except Exception as e:
- print(f"Error: {e}")
-```
-
-## .NET SDK
-
-### Custom TokenCredential Implementation
-
-```csharp
-using Azure.Core;
-using Azure.DigitalTwins.Core;
-using System.Text.Json;
-
-public class KonnektrTokenCredential : TokenCredential
-{
- private readonly string _domain;
- private readonly string _clientId;
- private readonly string _clientSecret;
- private readonly string _audience;
- private readonly HttpClient _httpClient;
-
- private AccessToken? _cachedToken;
- private DateTimeOffset _tokenExpiry;
-
- public KonnektrTokenCredential(string domain, string clientId, string clientSecret, string audience)
- {
- _domain = domain;
- _clientId = clientId;
- _clientSecret = clientSecret;
- _audience = audience;
- _httpClient = new HttpClient();
- }
-
- public override AccessToken GetToken(TokenRequestContext requestContext, CancellationToken cancellationToken)
- => GetTokenAsync(requestContext, cancellationToken).GetAwaiter().GetResult();
-
- public override async ValueTask GetTokenAsync(TokenRequestContext requestContext, CancellationToken cancellationToken)
- {
- if (_cachedToken.HasValue && DateTimeOffset.UtcNow < _tokenExpiry.AddMinutes(-5))
- return _cachedToken.Value;
-
- var tokenUrl = $"https://{_domain}/oauth/token";
- var payload = new
- {
- client_id = _clientId,
- client_secret = _clientSecret,
- audience = _audience,
- grant_type = "client_credentials"
- };
-
- var content = new StringContent(JsonSerializer.Serialize(payload), System.Text.Encoding.UTF8, "application/json");
- var response = await _httpClient.PostAsync(tokenUrl, content, cancellationToken);
- response.EnsureSuccessStatusCode();
-
- var responseContent = await response.Content.ReadAsStringAsync(cancellationToken);
- var tokenResponse = JsonSerializer.Deserialize(responseContent);
-
- _tokenExpiry = DateTimeOffset.UtcNow.AddSeconds(tokenResponse.expires_in);
- _cachedToken = new AccessToken(tokenResponse.access_token, _tokenExpiry);
-
- return _cachedToken.Value;
- }
-
- private class TokenResponse
- {
- public string access_token { get; set; }
- public int expires_in { get; set; }
- }
-}
-```
-
-### Using the .NET SDK
-
-```csharp
-using Azure.DigitalTwins.Core;
-using System.Text.Json;
-
-// Create credential
-var credential = new KonnektrTokenCredential(
- domain: "auth.konnektr.io",
- clientId: "your-client-id",
- clientSecret: "your-client-secret",
- audience: "https://graph.konnektr.io"
-);
-
-// Create client
-var client = new DigitalTwinsClient(
- new Uri("https://your-resource-id.api.graph.konnektr.io"),
- credential
-);
-
-try
-{
- // List models
- var models = client.GetModelsAsync();
- await foreach (var model in models)
- {
- Console.WriteLine($"Model: {model.Id}");
- }
-
- // Get a twin
- var twin = await client.GetDigitalTwinAsync("twin-id");
- Console.WriteLine($"Twin: {twin.Value}");
-
- // Create a twin
- var twinData = new
- {
- Metadata = new { Model = "dtmi:example:Room;1" },
- Temperature = 20.0,
- Humidity = 45.0
- };
-
- await client.UpsertDigitalTwinAsync("room-001", JsonSerializer.Serialize(twinData));
-}
-catch (Exception ex)
-{
- Console.WriteLine($"Error: {ex.Message}");
-}
-```
-
-## JavaScript/Node.js SDK
-
-### Custom TokenCredential Implementation
-
-```javascript
-const axios = require('axios');
-const { DigitalTwinsClient } = require('@azure/digital-twins-core');
-
-class KonnektrTokenCredential {
- constructor(domain, clientId, clientSecret, audience) {
- this.domain = domain;
- this.clientId = clientId;
- this.clientSecret = clientSecret;
- this.audience = audience;
- this.cachedToken = null;
- this.tokenExpiry = 0;
- }
-
- async getToken() {
- const now = Math.floor(Date.now() / 1000);
- if (this.cachedToken && now < this.tokenExpiry - 300) {
- return {
- token: this.cachedToken,
- expiresOnTimestamp: this.tokenExpiry * 1000
- };
- }
-
- const tokenUrl = `https://${this.domain}/oauth/token`;
- const payload = {
- client_id: this.clientId,
- client_secret: this.clientSecret,
- audience: this.audience,
- grant_type: 'client_credentials'
- };
-
- const response = await axios.post(tokenUrl, payload);
- const { access_token, expires_in } = response.data;
-
- this.cachedToken = access_token;
- this.tokenExpiry = now + expires_in;
-
- return {
- token: access_token,
- expiresOnTimestamp: this.tokenExpiry * 1000
- };
- }
-}
-```
-
-### Using the JavaScript SDK
-
-```javascript
-const { DigitalTwinsClient } = require('@azure/digital-twins-core');
-
-// Create credential
-const credential = new KonnektrTokenCredential(
- 'auth.konnektr.io',
- 'your-client-id',
- 'your-client-secret',
- 'https://graph.konnektr.io'
-);
-
-// Create client
-const client = new DigitalTwinsClient(
- 'https://your-resource-id.api.graph.konnektr.io',
- credential
-);
-
-async function example() {
- try {
- // List models
- const models = client.listModels();
- for await (const model of models) {
- console.log(`Model: ${model.id}`);
- }
-
- // Get a twin
- const twin = await client.getDigitalTwin('twin-id');
- console.log(`Twin:`, twin);
-
- // Create a twin
- const twinData = {
- $metadata: { $model: 'dtmi:example:Room;1' },
- Temperature: 20.0,
- Humidity: 45.0
- };
-
- await client.upsertDigitalTwin('room-001', JSON.stringify(twinData));
-
- } catch (error) {
- console.error(`Error: ${error.message}`);
- }
-}
-
-example();
-```
-
-## Environment Variables
-
-For security, store your credentials as environment variables:
-
-```bash
-# .env file
-KONNEKTR_CLIENT_ID=your-client-id
-KONNEKTR_CLIENT_SECRET=your-client-secret
-KONNEKTR_DOMAIN=auth.konnektr.io
-KONNEKTR_AUDIENCE=https://graph.konnektr.io
-KONNEKTR_ENDPOINT=https://your-resource-id.api.graph.konnektr.io
-```
-
-Then load them in your application:
-
-```python
-import os
-from dotenv import load_dotenv
-
-load_dotenv()
-
-credential = KonnektrTokenCredential(
- domain=os.getenv('KONNEKTR_DOMAIN'),
- client_id=os.getenv('KONNEKTR_CLIENT_ID'),
- client_secret=os.getenv('KONNEKTR_CLIENT_SECRET'),
- audience=os.getenv('KONNEKTR_AUDIENCE')
-)
-
-client = DigitalTwinsClient(os.getenv('KONNEKTR_ENDPOINT'), credential)
-```
-
-## Error Handling
-
-Common authentication errors and solutions:
-
-- **401 Unauthorized**: Check your client credentials and ensure they're valid
-- **403 Forbidden**: Verify your Auth0 application has the correct permissions
-- **Invalid audience**: Ensure you're using `https://graph.konnektr.io`
-- **Token expired**: The custom credential should handle renewal automatically
-
-> **Note:** Unlike Azure Digital Twins which uses Azure AD, Konnektr Graph requires Auth0 authentication. You cannot use Azure identity providers like `DefaultAzureCredential`, `AzureCliCredential`, or `ManagedIdentityCredential`.
diff --git a/content/docs/graph/how-to-guides/working-with-components.mdx b/content/docs/graph/how-to-guides/working-with-components.mdx
deleted file mode 100644
index b31c3d2..0000000
--- a/content/docs/graph/how-to-guides/working-with-components.mdx
+++ /dev/null
@@ -1,778 +0,0 @@
----
-title: Working with Components
-description: Learn how to create, manage, and update digital twin components in your applications
-icon: Puzzle
----
-
-This guide shows you how to work with digital twin components in AgeDigitalTwins, from basic component operations to advanced component-based architectures.
-
-## Prerequisites
-
-- AgeDigitalTwins SDK installed and configured
-- Understanding of [DTDL](/concepts/dtdl) component definitions
-- Digital twins with component-based DTDL models
-
-## Basic Component Operations
-
-### Getting Component Data
-
-Retrieve data for a specific component within a digital twin:
-
-```csharp
-using AgeDigitalTwins;
-
-var client = new AgeDigitalTwinsClient(connectionString);
-
-// Get component data as dynamic object
-dynamic hvacComponent = await client.GetComponentAsync("building-001", "hvac");
-Console.WriteLine($"Set Point: {hvacComponent.SetPoint}°C");
-Console.WriteLine($"Current Mode: {hvacComponent.Mode}");
-
-// Get component data as strongly-typed object
-var hvac = await client.GetComponentAsync("building-001", "hvac");
-Console.WriteLine($"Energy Usage: {hvac.EnergyUsage} kWh");
-```
-
-### Updating Component Properties
-
-Update specific properties within a component using JSON Patch:
-
-```csharp
-using Microsoft.AspNetCore.JsonPatch;
-
-// Create a JSON patch document
-var patch = new JsonPatchDocument();
-patch.Replace("/SetPoint", 22.5);
-patch.Replace("/Mode", "Auto");
-patch.Add("/ScheduleEnabled", true);
-
-// Apply the patch to the HVAC component
-await client.UpdateComponentAsync("building-001", "hvac", patch);
-```
-
-You can also update using an object:
-
-```csharp
-// Update with an anonymous object
-await client.UpdateComponentAsync("building-001", "hvac", new {
- SetPoint = 23.0,
- Mode = "Heat",
- FanSpeed = 75
-});
-
-// Update with a strongly-typed object
-var hvacUpdate = new HvacComponentUpdate
-{
- SetPoint = 21.5,
- Mode = "Cool",
- ScheduleEnabled = true
-};
-
-await client.UpdateComponentAsync("building-001", "hvac", hvacUpdate);
-```
-
-## Defining Component Models
-
-### Simple Component DTDL
-
-Define a basic component in your DTDL model:
-
-```json
-{
- "@id": "dtmi:example:HVAC;1",
- "@type": "Interface",
- "displayName": "HVAC System",
- "contents": [
- {
- "@type": "Property",
- "name": "SetPoint",
- "schema": "double",
- "displayName": "Temperature Set Point",
- "writable": true
- },
- {
- "@type": "Property",
- "name": "Mode",
- "schema": {
- "@type": "Enum",
- "valueSchema": "string",
- "enumValues": [
- { "name": "Off", "enumValue": "Off" },
- { "name": "Heat", "enumValue": "Heat" },
- { "name": "Cool", "enumValue": "Cool" },
- { "name": "Auto", "enumValue": "Auto" }
- ]
- },
- "writable": true
- },
- {
- "@type": "Telemetry",
- "name": "ActualTemperature",
- "schema": "double"
- }
- ]
-}
-```
-
-### Using the Component in a Twin Model
-
-Reference the component in your main twin model:
-
-```json
-{
- "@id": "dtmi:example:Building;1",
- "@type": "Interface",
- "displayName": "Smart Building",
- "contents": [
- {
- "@type": "Component",
- "name": "hvac",
- "schema": "dtmi:example:HVAC;1"
- },
- {
- "@type": "Component",
- "name": "lighting",
- "schema": "dtmi:example:LightingSystem;1"
- },
- {
- "@type": "Property",
- "name": "BuildingName",
- "schema": "string"
- }
- ]
-}
-```
-
-## Working with Strongly-Typed Components
-
-### Define Component Classes
-
-Create strongly-typed classes for your components:
-
-```csharp
-public class HvacComponent
-{
- public double SetPoint { get; set; }
- public string Mode { get; set; }
- public bool ScheduleEnabled { get; set; }
- public double ActualTemperature { get; set; }
- public int FanSpeed { get; set; }
- public double EnergyUsage { get; set; }
- public DateTime LastMaintenance { get; set; }
-}
-
-public class LightingComponent
-{
- public Dictionary Zones { get; set; }
- public bool MotionSensorEnabled { get; set; }
- public string Schedule { get; set; }
- public double TotalEnergyUsage { get; set; }
-}
-
-public class LightingZone
-{
- public int Brightness { get; set; }
- public int ColorTemperature { get; set; }
- public bool Enabled { get; set; }
- public DateTime LastMotion { get; set; }
-}
-```
-
-### Component CRUD Operations
-
-Create a service to manage components:
-
-```csharp
-public class ComponentManager
-{
- private readonly AgeDigitalTwinsClient _client;
- private readonly ILogger _logger;
-
- public ComponentManager(AgeDigitalTwinsClient client, ILogger logger)
- {
- _client = client;
- _logger = logger;
- }
-
- public async Task GetComponentAsync(string twinId, string componentName)
- {
- try
- {
- return await _client.GetComponentAsync(twinId, componentName);
- }
- catch (ComponentNotFoundException)
- {
- _logger.LogWarning("Component {ComponentName} not found on twin {TwinId}",
- componentName, twinId);
- throw;
- }
- }
-
- public async Task UpdateHvacSettings(string buildingId, double setPoint, string mode)
- {
- var hvacUpdate = new {
- SetPoint = setPoint,
- Mode = mode,
- LastUpdated = DateTime.UtcNow
- };
-
- await _client.UpdateComponentAsync(buildingId, "hvac", hvacUpdate);
-
- _logger.LogInformation("Updated HVAC settings for building {BuildingId}: {SetPoint}°C, {Mode}",
- buildingId, setPoint, mode);
- }
-
- public async Task UpdateLightingZone(string buildingId, string zoneName, int brightness, bool enabled)
- {
- var patch = new JsonPatchDocument();
- patch.Replace($"/Zones/{zoneName}/Brightness", brightness);
- patch.Replace($"/Zones/{zoneName}/Enabled", enabled);
- patch.Replace($"/Zones/{zoneName}/LastUpdated", DateTime.UtcNow);
-
- await _client.UpdateComponentAsync(buildingId, "lighting", patch);
-
- _logger.LogInformation("Updated lighting zone {ZoneName} in building {BuildingId}",
- zoneName, buildingId);
- }
-}
-```
-
-## Component Integration Patterns
-
-### Building Management System Integration
-
-Integrate components with external building management systems:
-
-```csharp
-public class BmsComponentSync
-{
- private readonly AgeDigitalTwinsClient _client;
- private readonly IBuildingManagementSystem _bms;
-
- public async Task SyncBuildingComponents(string buildingId)
- {
- // Get current BMS data
- var bmsData = await _bms.GetBuildingSystemsAsync(buildingId);
-
- // Update HVAC component
- if (bmsData.HvacSystem != null)
- {
- await _client.UpdateComponentAsync(buildingId, "hvac", new {
- SetPoint = bmsData.HvacSystem.SetPointTemperature,
- ActualTemperature = bmsData.HvacSystem.CurrentTemperature,
- Mode = bmsData.HvacSystem.OperatingMode,
- FanSpeed = bmsData.HvacSystem.FanSpeedPercent,
- EnergyUsage = bmsData.HvacSystem.CurrentEnergyUsage,
- LastUpdated = DateTime.UtcNow
- });
- }
-
- // Update lighting component
- if (bmsData.LightingSystem != null)
- {
- var lightingZones = bmsData.LightingSystem.Zones.ToDictionary(
- zone => zone.Name,
- zone => new {
- Brightness = zone.BrightnessLevel,
- Enabled = zone.IsEnabled,
- ColorTemperature = zone.ColorTemperature,
- LastMotion = zone.LastOccupancyTime
- }
- );
-
- await _client.UpdateComponentAsync(buildingId, "lighting", new {
- Zones = lightingZones,
- TotalEnergyUsage = bmsData.LightingSystem.TotalEnergyConsumption,
- LastUpdated = DateTime.UtcNow
- });
- }
-
- // Update security component
- if (bmsData.SecuritySystem != null)
- {
- await _client.UpdateComponentAsync(buildingId, "security", new {
- AlarmArmed = bmsData.SecuritySystem.IsArmed,
- AccessControlActive = bmsData.SecuritySystem.AccessControlEnabled,
- LastEvent = bmsData.SecuritySystem.LastSecurityEvent,
- CameraStatus = bmsData.SecuritySystem.CameraStatuses,
- LastUpdated = DateTime.UtcNow
- });
- }
- }
-}
-```
-
-### IoT Device Integration
-
-Map IoT device data to specific components:
-
-```csharp
-public class IoTComponentIntegration
-{
- private readonly AgeDigitalTwinsClient _client;
- private readonly ILogger _logger;
-
- public async Task ProcessSensorData(string deviceId, SensorData sensorData)
- {
- // Map device to twin and component
- var (twinId, componentName) = MapDeviceToComponent(deviceId);
-
- switch (sensorData.SensorType)
- {
- case SensorType.Temperature:
- await UpdateTemperatureSensor(twinId, componentName, sensorData);
- break;
-
- case SensorType.Occupancy:
- await UpdateOccupancySensor(twinId, componentName, sensorData);
- break;
-
- case SensorType.AirQuality:
- await UpdateAirQualitySensor(twinId, componentName, sensorData);
- break;
- }
- }
-
- private async Task UpdateTemperatureSensor(string twinId, string componentName, SensorData data)
- {
- await _client.UpdateComponentAsync(twinId, componentName, new {
- ActualTemperature = data.Temperature,
- Humidity = data.Humidity,
- LastReading = data.Timestamp,
- SensorStatus = data.Status
- });
-
- // Also publish telemetry
- await _client.PublishComponentTelemetryAsync(twinId, componentName, new {
- temperature = data.Temperature,
- humidity = data.Humidity,
- timestamp = data.Timestamp
- });
- }
-
- private async Task UpdateOccupancySensor(string twinId, string componentName, SensorData data)
- {
- var zoneName = data.Properties["zone"]?.ToString();
- if (zoneName != null)
- {
- var patch = new JsonPatchDocument();
- patch.Replace($"/Zones/{zoneName}/LastMotion", data.Timestamp);
- patch.Replace($"/Zones/{zoneName}/Occupied", data.Properties["occupied"]);
-
- await _client.UpdateComponentAsync(twinId, componentName, patch);
- }
- }
-
- private (string twinId, string componentName) MapDeviceToComponent(string deviceId)
- {
- // Implement your device mapping logic
- // This could query a database, use naming conventions, etc.
-
- if (deviceId.StartsWith("hvac-"))
- return (deviceId.Replace("hvac-", "building-"), "hvac");
-
- if (deviceId.StartsWith("light-"))
- return (deviceId.Replace("light-", "building-"), "lighting");
-
- return (deviceId, "sensors");
- }
-}
-```
-
-## Component Validation and Error Handling
-
-### Validation Against DTDL Schema
-
-Components are automatically validated against their DTDL schemas:
-
-```csharp
-public class ComponentValidator
-{
- private readonly AgeDigitalTwinsClient _client;
-
- public async Task ValidateAndUpdateComponent(string twinId, string componentName, T componentData)
- {
- try
- {
- await _client.UpdateComponentAsync(twinId, componentName, componentData);
- return true;
- }
- catch (ValidationException ex)
- {
- Console.WriteLine($"Validation failed: {ex.Message}");
-
- // Log specific validation errors
- foreach (var error in ex.ValidationErrors)
- {
- Console.WriteLine($"- {error.PropertyPath}: {error.ErrorMessage}");
- }
-
- return false;
- }
- catch (ComponentNotFoundException)
- {
- Console.WriteLine($"Component '{componentName}' not found on twin '{twinId}'");
- return false;
- }
- }
-}
-```
-
-### Safe Component Updates
-
-Implement safe update patterns:
-
-```csharp
-public class SafeComponentUpdater
-{
- private readonly AgeDigitalTwinsClient _client;
-
- public async Task SafeUpdateComponent(
- string twinId,
- string componentName,
- object updates)
- {
- try
- {
- // Get current component state
- var currentComponent = await _client.GetComponentAsync(twinId, componentName);
-
- // Apply updates
- await _client.UpdateComponentAsync(twinId, componentName, updates);
-
- return new ComponentUpdateResult
- {
- Success = true,
- Message = "Component updated successfully"
- };
- }
- catch (DigitalTwinNotFoundException)
- {
- return new ComponentUpdateResult
- {
- Success = false,
- Message = $"Twin '{twinId}' not found"
- };
- }
- catch (ComponentNotFoundException)
- {
- return new ComponentUpdateResult
- {
- Success = false,
- Message = $"Component '{componentName}' not found on twin '{twinId}'"
- };
- }
- catch (ValidationException ex)
- {
- return new ComponentUpdateResult
- {
- Success = false,
- Message = $"Validation failed: {ex.Message}",
- ValidationErrors = ex.ValidationErrors.ToList()
- };
- }
- catch (Exception ex)
- {
- return new ComponentUpdateResult
- {
- Success = false,
- Message = $"Unexpected error: {ex.Message}"
- };
- }
- }
-}
-
-public class ComponentUpdateResult
-{
- public bool Success { get; set; }
- public string Message { get; set; }
- public List ValidationErrors { get; set; } = new();
-}
-```
-
-## Component Telemetry Patterns
-
-### Scheduled Component Monitoring
-
-Implement scheduled monitoring for component health:
-
-```csharp
-public class ComponentMonitoringService
-{
- private readonly AgeDigitalTwinsClient _client;
- private readonly Timer _monitoringTimer;
-
- public ComponentMonitoringService(AgeDigitalTwinsClient client)
- {
- _client = client;
- _monitoringTimer = new Timer(MonitorComponents, null,
- TimeSpan.Zero, TimeSpan.FromMinutes(5));
- }
-
- private async void MonitorComponents(object state)
- {
- var buildings = await GetBuildingTwinIds();
-
- foreach (var buildingId in buildings)
- {
- await MonitorBuildingComponents(buildingId);
- }
- }
-
- private async Task MonitorBuildingComponents(string buildingId)
- {
- try
- {
- // Monitor HVAC health
- var hvac = await _client.GetComponentAsync(buildingId, "hvac");
- await _client.PublishComponentTelemetryAsync(buildingId, "hvac", new {
- healthStatus = CalculateHvacHealth(hvac),
- efficiency = CalculateHvacEfficiency(hvac),
- energyUsage = hvac.EnergyUsage,
- timestamp = DateTime.UtcNow
- });
-
- // Monitor lighting health
- var lighting = await _client.GetComponentAsync(buildingId, "lighting");
- await _client.PublishComponentTelemetryAsync(buildingId, "lighting", new {
- activeZones = lighting.Zones.Count(z => z.Value.Enabled),
- totalEnergyUsage = lighting.TotalEnergyUsage,
- averageBrightness = lighting.Zones.Values.Average(z => z.Brightness),
- timestamp = DateTime.UtcNow
- });
- }
- catch (Exception ex)
- {
- Console.WriteLine($"Error monitoring building {buildingId}: {ex.Message}");
- }
- }
-
- private string CalculateHvacHealth(HvacComponent hvac)
- {
- // Implement your health calculation logic
- var tempDifference = Math.Abs(hvac.SetPoint - hvac.ActualTemperature);
-
- if (tempDifference < 1.0) return "Excellent";
- if (tempDifference < 2.0) return "Good";
- if (tempDifference < 3.0) return "Fair";
- return "Poor";
- }
-
- private double CalculateHvacEfficiency(HvacComponent hvac)
- {
- // Implement efficiency calculation
- return hvac.EnergyUsage > 0 ? (hvac.SetPoint / hvac.EnergyUsage) * 100 : 0;
- }
-}
-```
-
-## Advanced Component Patterns
-
-### Component State Machines
-
-Implement state machines for complex component behavior:
-
-```csharp
-public class HvacStateMachine
-{
- private readonly AgeDigitalTwinsClient _client;
-
- public enum HvacState
- {
- Off,
- Heating,
- Cooling,
- Maintenance,
- Error
- }
-
- public async Task TransitionHvacState(string buildingId, HvacState newState, string reason = null)
- {
- var hvac = await _client.GetComponentAsync(buildingId, "hvac");
- var currentState = Enum.Parse(hvac.Mode);
-
- if (!IsValidTransition(currentState, newState))
- {
- throw new InvalidOperationException(
- $"Invalid state transition from {currentState} to {newState}");
- }
-
- await _client.UpdateComponentAsync(buildingId, "hvac", new {
- Mode = newState.ToString(),
- LastStateChange = DateTime.UtcNow,
- StateChangeReason = reason ?? "Manual",
- PreviousState = currentState.ToString()
- });
-
- // Publish state change telemetry
- await _client.PublishComponentTelemetryAsync(buildingId, "hvac", new {
- stateChange = new {
- from = currentState.ToString(),
- to = newState.ToString(),
- reason = reason,
- timestamp = DateTime.UtcNow
- }
- });
- }
-
- private bool IsValidTransition(HvacState from, HvacState to)
- {
- // Define valid state transitions
- return (from, to) switch
- {
- (HvacState.Off, HvacState.Heating) => true,
- (HvacState.Off, HvacState.Cooling) => true,
- (HvacState.Heating, HvacState.Off) => true,
- (HvacState.Heating, HvacState.Cooling) => true,
- (HvacState.Cooling, HvacState.Off) => true,
- (HvacState.Cooling, HvacState.Heating) => true,
- (_, HvacState.Maintenance) => true, // Can always go to maintenance
- (_, HvacState.Error) => true, // Can always go to error
- (HvacState.Maintenance, HvacState.Off) => true,
- (HvacState.Error, HvacState.Off) => true,
- _ => false
- };
- }
-}
-```
-
-### Component Dependency Management
-
-Handle dependencies between components:
-
-```csharp
-public class ComponentDependencyManager
-{
- private readonly AgeDigitalTwinsClient _client;
-
- public async Task UpdateWithDependencies(string buildingId, ComponentUpdate update)
- {
- switch (update.ComponentName)
- {
- case "hvac":
- await UpdateHvacWithDependencies(buildingId, update);
- break;
- case "lighting":
- await UpdateLightingWithDependencies(buildingId, update);
- break;
- }
- }
-
- private async Task UpdateHvacWithDependencies(string buildingId, ComponentUpdate update)
- {
- // Update HVAC component
- await _client.UpdateComponentAsync(buildingId, "hvac", update.Data);
-
- // Update dependent systems based on HVAC changes
- if (update.Data.GetType().GetProperty("Mode")?.GetValue(update.Data)?.ToString() == "Off")
- {
- // When HVAC is off, adjust lighting for energy savings
- await _client.UpdateComponentAsync(buildingId, "lighting", new {
- PowerSavingMode = true,
- MaxBrightness = 75 // Reduce max brightness when HVAC is off
- });
- }
-
- // Notify security system of HVAC changes
- await _client.UpdateComponentAsync(buildingId, "security", new {
- HvacStatus = update.Data.GetType().GetProperty("Mode")?.GetValue(update.Data),
- LastHvacUpdate = DateTime.UtcNow
- });
- }
-
- private async Task UpdateLightingWithDependencies(string buildingId, ComponentUpdate update)
- {
- await _client.UpdateComponentAsync(buildingId, "lighting", update.Data);
-
- // When lighting changes, update occupancy estimates
- var lighting = await _client.GetComponentAsync(buildingId, "lighting");
- var occupancyEstimate = EstimateOccupancy(lighting);
-
- await _client.UpdateComponentAsync(buildingId, "occupancy", new {
- EstimatedOccupancy = occupancyEstimate,
- LastUpdate = DateTime.UtcNow,
- Source = "Lighting"
- });
- }
-
- private int EstimateOccupancy(LightingComponent lighting)
- {
- // Simple occupancy estimation based on active lighting zones
- return lighting.Zones.Count(z => z.Value.Enabled && z.Value.Brightness > 20);
- }
-}
-
-public class ComponentUpdate
-{
- public string ComponentName { get; set; }
- public object Data { get; set; }
-}
-```
-
-## Performance and Best Practices
-
-### Efficient Component Queries
-
-Use efficient patterns for component operations:
-
-```csharp
-public class EfficientComponentOperations
-{
- private readonly AgeDigitalTwinsClient _client;
- private readonly MemoryCache _cache;
-
- public EfficientComponentOperations(AgeDigitalTwinsClient client)
- {
- _client = client;
- _cache = new MemoryCache(new MemoryCacheOptions
- {
- SizeLimit = 1000
- });
- }
-
- // Cache component data for read-heavy scenarios
- public async Task GetComponentWithCache(string twinId, string componentName,
- TimeSpan? cacheExpiry = null)
- {
- var cacheKey = $"{twinId}:{componentName}";
-
- if (_cache.TryGetValue(cacheKey, out T cachedValue))
- {
- return cachedValue;
- }
-
- var component = await _client.GetComponentAsync(twinId, componentName);
-
- _cache.Set(cacheKey, component, cacheExpiry ?? TimeSpan.FromMinutes(5));
-
- return component;
- }
-
- // Batch multiple component updates
- public async Task BatchUpdateComponents(string twinId,
- Dictionary componentUpdates)
- {
- var updateTasks = componentUpdates.Select(kvp =>
- _client.UpdateComponentAsync(twinId, kvp.Key, kvp.Value));
-
- await Task.WhenAll(updateTasks);
- }
-
- // Invalidate cache on updates
- public async Task UpdateComponentAndInvalidateCache(string twinId, string componentName,
- object update)
- {
- await _client.UpdateComponentAsync(twinId, componentName, update);
-
- var cacheKey = $"{twinId}:{componentName}";
- _cache.Remove(cacheKey);
- }
-}
-```
-
-## See Also
-
-- [Components Concepts](/concepts/components) - Understanding digital twin components
-- [DTDL Reference](/concepts/dtdl) - Component definition in DTDL
-- [Telemetry Guide](/how-to-guides/working-with-telemetry) - Publishing component telemetry
-- [Validation](/concepts/validation) - Component validation and error handling
diff --git a/content/docs/graph/how-to-guides/working-with-telemetry.mdx b/content/docs/graph/how-to-guides/working-with-telemetry.mdx
deleted file mode 100644
index 64fde8a..0000000
--- a/content/docs/graph/how-to-guides/working-with-telemetry.mdx
+++ /dev/null
@@ -1,522 +0,0 @@
----
-title: Working with Telemetry
-description: Learn how to implement telemetry publishing and routing in your digital twins applications
-icon: Activity
----
-
-This guide shows you how to implement telemetry functionality in your digital twins applications, from basic telemetry publishing to advanced event routing scenarios.
-
-## Prerequisites
-
-- AgeDigitalTwins SDK installed and configured
-- Digital twins created with appropriate DTDL models
-- Basic understanding of [Components](/concepts/components) (for component telemetry)
-- Event routing configured (see [Event Routing](/concepts/event-routing))
-
-## Basic Telemetry Publishing
-
-### Simple Telemetry
-
-Start with basic telemetry publishing for individual digital twins:
-
-```csharp
-using AgeDigitalTwins;
-
-// Initialize the client
-var client = new AgeDigitalTwinsClient(connectionString);
-
-// Publish basic sensor data
-await client.PublishTelemetryAsync("temperature-sensor-001", new {
- temperature = 23.5,
- humidity = 67.2,
- batteryLevel = 89,
- timestamp = DateTime.UtcNow
-});
-```
-
-### Component Telemetry
-
-For complex digital twins with components, publish telemetry for specific components:
-
-```csharp
-// Publish HVAC system telemetry
-await client.PublishComponentTelemetryAsync(
- twinId: "building-floor-2",
- componentName: "hvac-system",
- telemetryData: new {
- setPointTemperature = 22.0,
- actualTemperature = 23.1,
- fanSpeed = 75,
- energyConsumption = 125.5,
- operatingMode = "Auto",
- timestamp = DateTime.UtcNow
- }
-);
-```
-
-### With Custom Message IDs
-
-Use custom message IDs for tracking and deduplication:
-
-```csharp
-// Generate a unique message ID
-string messageId = $"sensor-001-{DateTime.UtcNow:yyyyMMddHHmmss}";
-
-await client.PublishTelemetryAsync("sensor-001", new {
- temperature = 24.1,
- timestamp = DateTime.UtcNow
-}, messageId: messageId);
-```
-
-## Implementing Telemetry Sources
-
-### IoT Device Integration
-
-Create a service to handle incoming IoT device data:
-
-```csharp
-public class IoTTelemetryService
-{
- private readonly AgeDigitalTwinsClient _client;
- private readonly ILogger _logger;
-
- public IoTTelemetryService(AgeDigitalTwinsClient client, ILogger logger)
- {
- _client = client;
- _logger = logger;
- }
-
- public async Task ProcessDeviceMessage(string deviceId, IoTDeviceMessage message)
- {
- try
- {
- // Map device ID to twin ID (implement your mapping logic)
- string twinId = await MapDeviceToTwin(deviceId);
-
- // Publish telemetry data
- await _client.PublishTelemetryAsync(twinId, new {
- temperature = message.Temperature,
- humidity = message.Humidity,
- pressure = message.Pressure,
- batteryLevel = message.BatteryLevel,
- signalStrength = message.SignalStrength,
- location = new {
- latitude = message.Latitude,
- longitude = message.Longitude
- },
- timestamp = message.Timestamp
- });
-
- _logger.LogInformation("Published telemetry for device {DeviceId} -> twin {TwinId}",
- deviceId, twinId);
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "Failed to publish telemetry for device {DeviceId}", deviceId);
- }
- }
-
- private async Task MapDeviceToTwin(string deviceId)
- {
- // Implement your device-to-twin mapping logic
- // This could query your twins, use a lookup table, etc.
- return $"sensor-{deviceId}";
- }
-}
-```
-
-### Building Management System Integration
-
-Integrate with existing building management systems:
-
-```csharp
-public class BmsIntegrationService
-{
- private readonly AgeDigitalTwinsClient _client;
- private readonly IExternalBmsClient _bmsClient;
- private readonly Timer _pollingTimer;
-
- public BmsIntegrationService(AgeDigitalTwinsClient client, IExternalBmsClient bmsClient)
- {
- _client = client;
- _bmsClient = bmsClient;
-
- // Poll BMS every 30 seconds
- _pollingTimer = new Timer(PollBmsData, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
- }
-
- private async void PollBmsData(object state)
- {
- try
- {
- var buildings = await _bmsClient.GetBuildingsAsync();
-
- foreach (var building in buildings)
- {
- // Publish HVAC telemetry
- if (building.HvacData != null)
- {
- await _client.PublishComponentTelemetryAsync(
- building.TwinId,
- "hvac",
- new {
- setPointTemp = building.HvacData.SetPoint,
- actualTemp = building.HvacData.ActualTemperature,
- fanSpeed = building.HvacData.FanSpeedPercent,
- energyUsage = building.HvacData.EnergyConsumption,
- mode = building.HvacData.Mode,
- timestamp = DateTime.UtcNow
- }
- );
- }
-
- // Publish lighting telemetry
- if (building.LightingData != null)
- {
- await _client.PublishComponentTelemetryAsync(
- building.TwinId,
- "lighting",
- new {
- totalBrightness = building.LightingData.AverageBrightness,
- energyUsage = building.LightingData.EnergyConsumption,
- zonesActive = building.LightingData.ActiveZones,
- motionDetected = building.LightingData.OccupancySensors.Any(x => x.Occupied),
- timestamp = DateTime.UtcNow
- }
- );
- }
- }
- }
- catch (Exception ex)
- {
- // Log error but continue polling
- Console.WriteLine($"BMS polling error: {ex.Message}");
- }
- }
-}
-```
-
-## Telemetry Event Routing
-
-### Configure Event Sinks
-
-Set up event routing to send telemetry to appropriate systems:
-
-```yaml
-# appsettings.json or configuration
-{
- "Events":
- {
- "Config":
- {
- "EventSinks":
- {
- "kafka":
- [
- {
- "name": "TelemetryKafka",
- "brokerList": "your-kafka-broker:9092",
- "topic": "digitaltwins-telemetry",
- "saslMechanism": "PLAIN",
- "saslUsername": "your-username",
- "saslPassword": "your-password",
- },
- ],
- "kusto":
- [
- {
- "name": "TelemetryAnalytics",
- "ingestionUri": "https://ingest-your-cluster.region.kusto.windows.net",
- "database": "DigitalTwinsAnalytics",
- },
- ],
- "mqtt":
- [
- {
- "name": "IoTMqtt",
- "broker": "your-mqtt-broker",
- "port": 1883,
- "topic": "digitaltwins/telemetry",
- "clientId": "agedt-telemetry",
- },
- ],
- },
- "EventRoutes":
- [
- { "eventType": "Telemetry", "sink": "TelemetryKafka" },
- {
- "eventType": "ComponentTelemetry",
- "sink": "TelemetryAnalytics",
- },
- { "eventType": "Telemetry", "sink": "IoTMqtt" },
- ],
- },
- },
-}
-```
-
-### Multiple Sink Routing
-
-Route the same telemetry to multiple sinks for different purposes:
-
-```yaml
-EventRoutes:
- # Send all telemetry to Kafka for real-time processing
- - eventType: "Telemetry"
- sink: "RealTimeKafka"
- - eventType: "ComponentTelemetry"
- sink: "RealTimeKafka"
-
- # Send all telemetry to Kusto for analytics
- - eventType: "Telemetry"
- sink: "AnalyticsKusto"
- - eventType: "ComponentTelemetry"
- sink: "AnalyticsKusto"
-
- # Send only component telemetry to MQTT for IoT integration
- - eventType: "ComponentTelemetry"
- sink: "IoTMqtt"
-```
-
-## Advanced Scenarios
-
-### Batch Telemetry Publishing
-
-For high-volume scenarios, consider batching telemetry data:
-
-```csharp
-public class BatchTelemetryService
-{
- private readonly AgeDigitalTwinsClient _client;
- private readonly ConcurrentQueue _telemetryQueue;
- private readonly Timer _batchTimer;
-
- public BatchTelemetryService(AgeDigitalTwinsClient client)
- {
- _client = client;
- _telemetryQueue = new ConcurrentQueue();
-
- // Process batches every 5 seconds
- _batchTimer = new Timer(ProcessBatch, null, TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(5));
- }
-
- public void QueueTelemetry(string twinId, object telemetryData, string componentName = null)
- {
- _telemetryQueue.Enqueue(new TelemetryItem
- {
- TwinId = twinId,
- Data = telemetryData,
- ComponentName = componentName,
- Timestamp = DateTime.UtcNow
- });
- }
-
- private async void ProcessBatch(object state)
- {
- var batch = new List();
-
- // Dequeue up to 100 items
- while (batch.Count < 100 && _telemetryQueue.TryDequeue(out var item))
- {
- batch.Add(item);
- }
-
- if (batch.Count == 0) return;
-
- // Process batch concurrently
- var tasks = batch.Select(async item =>
- {
- try
- {
- if (string.IsNullOrEmpty(item.ComponentName))
- {
- await _client.PublishTelemetryAsync(item.TwinId, item.Data);
- }
- else
- {
- await _client.PublishComponentTelemetryAsync(item.TwinId, item.ComponentName, item.Data);
- }
- }
- catch (Exception ex)
- {
- // Log individual failures but don't stop batch processing
- Console.WriteLine($"Failed to publish telemetry for {item.TwinId}: {ex.Message}");
- }
- });
-
- await Task.WhenAll(tasks);
- }
-}
-
-public class TelemetryItem
-{
- public string TwinId { get; set; }
- public object Data { get; set; }
- public string ComponentName { get; set; }
- public DateTime Timestamp { get; set; }
-}
-```
-
-### Error Handling and Retries
-
-Implement robust error handling for telemetry publishing:
-
-```csharp
-public class ResilientTelemetryService
-{
- private readonly AgeDigitalTwinsClient _client;
- private readonly ILogger _logger;
-
- public async Task PublishTelemetryWithRetry(string twinId, object telemetryData, int maxRetries = 3)
- {
- for (int attempt = 1; attempt <= maxRetries; attempt++)
- {
- try
- {
- await _client.PublishTelemetryAsync(twinId, telemetryData);
- _logger.LogDebug("Successfully published telemetry for {TwinId} on attempt {Attempt}",
- twinId, attempt);
- return;
- }
- catch (Exception ex) when (attempt < maxRetries)
- {
- _logger.LogWarning(ex, "Failed to publish telemetry for {TwinId} on attempt {Attempt}, retrying...",
- twinId, attempt);
-
- // Exponential backoff
- await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, attempt)));
- }
- catch (Exception ex)
- {
- _logger.LogError(ex, "Failed to publish telemetry for {TwinId} after {MaxRetries} attempts",
- twinId, maxRetries);
- throw;
- }
- }
- }
-}
-```
-
-## Performance Best Practices
-
-### High-Frequency Telemetry
-
-For high-frequency telemetry scenarios:
-
-1. **Use Async/Await Properly**:
-
- ```csharp
- // DON'T block on async operations
- client.PublishTelemetryAsync(twinId, data).Wait(); // ❌
-
- // DO use async/await
- await client.PublishTelemetryAsync(twinId, data); // ✅
- ```
-
-2. **Consider Fire-and-Forget for Non-Critical Data**:
-
- ```csharp
- // For high-volume, non-critical telemetry
- _ = Task.Run(async () => {
- try
- {
- await client.PublishTelemetryAsync(twinId, data);
- }
- catch (Exception ex)
- {
- _logger.LogWarning(ex, "Telemetry publish failed for {TwinId}", twinId);
- }
- });
- ```
-
-3. **Batch Related Data**:
-
- ```csharp
- // Instead of multiple calls
- await client.PublishTelemetryAsync(twinId, new { temperature = 23.5 });
- await client.PublishTelemetryAsync(twinId, new { humidity = 67.2 });
-
- // Combine into single call
- await client.PublishTelemetryAsync(twinId, new {
- temperature = 23.5,
- humidity = 67.2,
- timestamp = DateTime.UtcNow
- });
- ```
-
-### Monitoring and Diagnostics
-
-Monitor your telemetry publishing:
-
-```csharp
-public class TelemetryMetrics
-{
- private long _totalPublished = 0;
- private long _totalFailed = 0;
- private readonly Timer _metricsTimer;
-
- public TelemetryMetrics()
- {
- _metricsTimer = new Timer(LogMetrics, null, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1));
- }
-
- public void RecordSuccess() => Interlocked.Increment(ref _totalPublished);
- public void RecordFailure() => Interlocked.Increment(ref _totalFailed);
-
- private void LogMetrics(object state)
- {
- var published = Interlocked.Read(ref _totalPublished);
- var failed = Interlocked.Read(ref _totalFailed);
-
- Console.WriteLine($"Telemetry metrics - Published: {published}, Failed: {failed}, Success Rate: {(published / (double)(published + failed)):P2}");
- }
-}
-```
-
-## Troubleshooting
-
-### Common Issues
-
-1. **Telemetry Not Appearing in Sinks**
-
- - Check event routing configuration
- - Verify sink authentication and connectivity
- - Check telemetry event types match route configuration
-
-2. **High Latency**
-
- - Review batch processing settings
- - Check network connectivity to sinks
- - Consider using multiple sinks for load distribution
-
-3. **Missing Telemetry Data**
- - Implement proper error handling and logging
- - Check PostgreSQL NOTIFY/LISTEN configuration
- - Verify digital twin exists before publishing telemetry
-
-### Debugging Telemetry Flow
-
-Enable detailed logging to debug telemetry issues:
-
-```csharp
-// In your configuration
-services.AddLogging(builder =>
-{
- builder.AddConsole();
- builder.SetMinimumLevel(LogLevel.Debug);
-});
-
-// Add specific logging for telemetry
-services.Configure(options =>
-{
- options.AddFilter("AgeDigitalTwins.Events", LogLevel.Debug);
- options.AddFilter("AgeDigitalTwins.Telemetry", LogLevel.Debug);
-});
-```
-
-## See Also
-
-- [Telemetry Concepts](/concepts/telemetry) - Understanding telemetry in AgeDigitalTwins
-- [Event Routing](/concepts/event-routing) - Configuring event routing and sinks
-- [Components](/concepts/components) - Working with digital twin components
-- [Troubleshooting Guide](/how-to-guides/troubleshooting) - Common issues and solutions
diff --git a/content/docs/graph/introduction.mdx b/content/docs/graph/introduction.mdx
deleted file mode 100644
index 29b8a39..0000000
--- a/content/docs/graph/introduction.mdx
+++ /dev/null
@@ -1,53 +0,0 @@
----
-title: Konnektr Graph
-description: Azure Digital Twins-compatible digital twin platform that runs on PostgreSQL with Apache AGE. Available as a hosted service or self-hosted deployment.
----
-
-Konnektr Graph is a high-performance, Azure Digital Twins-compatible digital twin runtime that runs on PostgreSQL with the Apache AGE extension. Build scalable digital twin applications with full DTDL support, real-time eventing, and seamless integration using standard Azure Digital Twins SDKs.
-
-## 🌟 Hosted Platform (Recommended)
-
-Get started in minutes with our fully managed service at [ktrlplane.konnektr.io](https://ktrlplane.konnektr.io):
-
-- **Zero Infrastructure Management** - We handle all the complexity
-- **Azure Digital Twins SDK Compatible** - Use your existing code and skills
-- **Real-time Event Streaming** - Built-in Kafka and Kusto integration
-- **Enterprise Security** - Auth0 authentication with role-based access
-- **Automatic Scaling** - Scales with your digital twin workloads
-
-## Key Features
-
-- **Full Azure Digital Twins API Compatibility** - Seamless migration and SDK compatibility
-- **DTDL Support** - Complete Digital Twins Definition Language validation and modeling
-- **Real-time Eventing** - Stream twin state changes to Kafka, Azure Data Explorer, and more
-- **Graph Queries** - Powerful Cypher queries over your digital twin graph
-- **Component Management** - Hierarchical component modeling and validation
-- **High Performance** - Built on Apache AGE for enterprise-scale graph operations
-
-## Deployment Options
-
-### 🚀 Hosted (Recommended)
-Perfect for most users - fully managed, enterprise-ready platform:
-- [Quickstart Guide](./getting-started/quickstart) - Get started in 5 minutes
-- [Setup Guide](./getting-started/setup) - Detailed configuration options
-- [Azure SDK Integration](./how-to-guides/using-azure-digital-twins-sdks) - Use standard SDKs
-
-### 🛠️ Self-Hosted (Advanced)
-For users who need direct database access or custom deployment:
-- [Self-Hosted Deployment](./deployment-installation/self-host) - Kubernetes and Docker setup
-- [Direct SDK Usage](./reference/sdk) - Native AgeDigitalTwins SDK
-- [Advanced Configuration](./advanced-topics/) - Performance tuning and diagnostics
-
-## Getting Started
-
-Choose your path based on your needs:
-
-**Most Users** → [Hosted Quickstart](./getting-started/quickstart)
-**Advanced Users** → [Self-Hosted Setup](./deployment-installation/self-host)
-**Migrating from Azure** → [Azure SDK Guide](./how-to-guides/using-azure-digital-twins-sdks)
-
-## Resources
-
-- [GitHub Repository](https://github.com/konnektr-io/pg-age-digitaltwins)
-- [Community Support](https://github.com/konnektr-io/pg-age-digitaltwins/discussions)
-- [Report Issues](https://github.com/konnektr-io/pg-age-digitaltwins/issues)
diff --git a/content/docs/graph/meta.json b/content/docs/graph/meta.json
deleted file mode 100644
index 32cc6f0..0000000
--- a/content/docs/graph/meta.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "title": "Graph",
- "description": "Semantic graph database for digital twins and AI Agents",
- "root": true,
- "pages": [
- "introduction",
- "getting-started",
- "concepts",
- "how-to-guides",
- "deployment-installation",
- "advanced-topics",
- "reference"
- ]
-}
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/components/GetComponent.mdx b/content/docs/graph/reference/api/components/GetComponent.mdx
deleted file mode 100644
index 555d9a1..0000000
--- a/content/docs/graph/reference/api/components/GetComponent.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Retrieves a component from a digital twin by its name.
-full: true
-_openapi:
- method: GET
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/components/UpdateComponent.mdx b/content/docs/graph/reference/api/components/UpdateComponent.mdx
deleted file mode 100644
index 2da1dff..0000000
--- a/content/docs/graph/reference/api/components/UpdateComponent.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Updates a component on a digital twin using a JSON patch.
-full: true
-_openapi:
- method: PATCH
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/digital-twins/CreateOrReplaceDigitalTwin.mdx b/content/docs/graph/reference/api/digital-twins/CreateOrReplaceDigitalTwin.mdx
deleted file mode 100644
index fb55662..0000000
--- a/content/docs/graph/reference/api/digital-twins/CreateOrReplaceDigitalTwin.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Creates or replaces a digital twin by its ID.
-full: true
-_openapi:
- method: PUT
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/digital-twins/DeleteDigitalTwin.mdx b/content/docs/graph/reference/api/digital-twins/DeleteDigitalTwin.mdx
deleted file mode 100644
index 64f53ee..0000000
--- a/content/docs/graph/reference/api/digital-twins/DeleteDigitalTwin.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Deletes a digital twin by its ID.
-full: true
-_openapi:
- method: DELETE
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/digital-twins/GetDigitalTwin.mdx b/content/docs/graph/reference/api/digital-twins/GetDigitalTwin.mdx
deleted file mode 100644
index 6e3dbdf..0000000
--- a/content/docs/graph/reference/api/digital-twins/GetDigitalTwin.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Retrieves a digital twin by its ID.
-full: true
-_openapi:
- method: GET
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/digital-twins/UpdateDigitalTwin.mdx b/content/docs/graph/reference/api/digital-twins/UpdateDigitalTwin.mdx
deleted file mode 100644
index 1717691..0000000
--- a/content/docs/graph/reference/api/digital-twins/UpdateDigitalTwin.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Updates a digital twin by its ID.
-full: true
-_openapi:
- method: PATCH
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/import-jobs/CancelImportJob.mdx b/content/docs/graph/reference/api/import-jobs/CancelImportJob.mdx
deleted file mode 100644
index fdd6d45..0000000
--- a/content/docs/graph/reference/api/import-jobs/CancelImportJob.mdx
+++ /dev/null
@@ -1,19 +0,0 @@
----
-title: Cancel an import job
-full: true
-_openapi:
- method: POST
- toc: []
- structuredData:
- headings: []
- contents:
- - content: >-
- Cancels a running import job. Note that this will leave your instance
- in an unknown state as there won't be any rollback operation.
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-Cancels a running import job. Note that this will leave your instance in an unknown state as there won't be any rollback operation.
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/import-jobs/CreateImportJob.mdx b/content/docs/graph/reference/api/import-jobs/CreateImportJob.mdx
deleted file mode 100644
index dd47967..0000000
--- a/content/docs/graph/reference/api/import-jobs/CreateImportJob.mdx
+++ /dev/null
@@ -1,20 +0,0 @@
----
-title: Create and start a new import job
-full: true
-_openapi:
- method: PUT
- toc: []
- structuredData:
- headings: []
- contents:
- - content: >-
- Creates and starts a new import job. The job will run in the
- background and return immediately. Monitor job progress using the
- GetImportJob endpoint.
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-Creates and starts a new import job. The job will run in the background and return immediately. Monitor job progress using the GetImportJob endpoint.
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/import-jobs/DeleteImportJob.mdx b/content/docs/graph/reference/api/import-jobs/DeleteImportJob.mdx
deleted file mode 100644
index ecbc790..0000000
--- a/content/docs/graph/reference/api/import-jobs/DeleteImportJob.mdx
+++ /dev/null
@@ -1,19 +0,0 @@
----
-title: Delete an import job
-full: true
-_openapi:
- method: DELETE
- toc: []
- structuredData:
- headings: []
- contents:
- - content: >-
- Removes an import job from the system. This is a non-standard endpoint
- for cleanup purposes.
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-Removes an import job from the system. This is a non-standard endpoint for cleanup purposes.
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/import-jobs/GetImportJob.mdx b/content/docs/graph/reference/api/import-jobs/GetImportJob.mdx
deleted file mode 100644
index 69b6f6a..0000000
--- a/content/docs/graph/reference/api/import-jobs/GetImportJob.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: Get import job by ID
-full: true
-_openapi:
- method: GET
- toc: []
- structuredData:
- headings: []
- contents:
- - content: Retrieves the status and details of an import job by its ID.
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-Retrieves the status and details of an import job by its ID.
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/import-jobs/ListImportJobs.mdx b/content/docs/graph/reference/api/import-jobs/ListImportJobs.mdx
deleted file mode 100644
index 13c85b1..0000000
--- a/content/docs/graph/reference/api/import-jobs/ListImportJobs.mdx
+++ /dev/null
@@ -1,17 +0,0 @@
----
-title: List all import jobs
-full: true
-_openapi:
- method: GET
- toc: []
- structuredData:
- headings: []
- contents:
- - content: Retrieves a list of all import jobs with optional pagination.
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-Retrieves a list of all import jobs with optional pagination.
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/import-jobs/ResumeImportJob.mdx b/content/docs/graph/reference/api/import-jobs/ResumeImportJob.mdx
deleted file mode 100644
index 9547862..0000000
--- a/content/docs/graph/reference/api/import-jobs/ResumeImportJob.mdx
+++ /dev/null
@@ -1,19 +0,0 @@
----
-title: Resume an import job
-full: true
-_openapi:
- method: POST
- toc: []
- structuredData:
- headings: []
- contents:
- - content: >-
- Resumes an interrupted import job from its last checkpoint. The job
- must be in a resumable state (Running or Failed).
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-Resumes an interrupted import job from its last checkpoint. The job must be in a resumable state (Running or Failed).
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/models/CreateModels.mdx b/content/docs/graph/reference/api/models/CreateModels.mdx
deleted file mode 100644
index 4b7ebbe..0000000
--- a/content/docs/graph/reference/api/models/CreateModels.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Creates new models in the digital twins graph.
-full: true
-_openapi:
- method: POST
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/models/DeleteAllModels.mdx b/content/docs/graph/reference/api/models/DeleteAllModels.mdx
deleted file mode 100644
index d7426d4..0000000
--- a/content/docs/graph/reference/api/models/DeleteAllModels.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Deletes all models in the digital twins graph.
-full: true
-_openapi:
- method: DELETE
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/models/DeleteModel.mdx b/content/docs/graph/reference/api/models/DeleteModel.mdx
deleted file mode 100644
index d554842..0000000
--- a/content/docs/graph/reference/api/models/DeleteModel.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Deletes a specific model by its ID.
-full: true
-_openapi:
- method: DELETE
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/models/ListModels.mdx b/content/docs/graph/reference/api/models/ListModels.mdx
deleted file mode 100644
index f2a8969..0000000
--- a/content/docs/graph/reference/api/models/ListModels.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Lists all models in the digital twins graph.
-full: true
-_openapi:
- method: GET
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/query/Query.mdx b/content/docs/graph/reference/api/query/Query.mdx
deleted file mode 100644
index f11b0b1..0000000
--- a/content/docs/graph/reference/api/query/Query.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Executes a query against the digital twins graph with pagination.
-full: true
-_openapi:
- method: POST
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/relationships/CreateOrReplaceRelationship.mdx b/content/docs/graph/reference/api/relationships/CreateOrReplaceRelationship.mdx
deleted file mode 100644
index 46c3965..0000000
--- a/content/docs/graph/reference/api/relationships/CreateOrReplaceRelationship.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Creates or replaces a relationship for a digital twin.
-full: true
-_openapi:
- method: PUT
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/relationships/DeleteRelationship.mdx b/content/docs/graph/reference/api/relationships/DeleteRelationship.mdx
deleted file mode 100644
index d74733b..0000000
--- a/content/docs/graph/reference/api/relationships/DeleteRelationship.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Deletes a specific relationship for a digital twin.
-full: true
-_openapi:
- method: DELETE
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/relationships/GetRelationship.mdx b/content/docs/graph/reference/api/relationships/GetRelationship.mdx
deleted file mode 100644
index 0070118..0000000
--- a/content/docs/graph/reference/api/relationships/GetRelationship.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Retrieves a specific relationship by its ID.
-full: true
-_openapi:
- method: GET
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/relationships/ListIncomingRelationships.mdx b/content/docs/graph/reference/api/relationships/ListIncomingRelationships.mdx
deleted file mode 100644
index 5d2366b..0000000
--- a/content/docs/graph/reference/api/relationships/ListIncomingRelationships.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Lists all incoming relationships for a digital twin.
-full: true
-_openapi:
- method: GET
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/relationships/ListRelationships.mdx b/content/docs/graph/reference/api/relationships/ListRelationships.mdx
deleted file mode 100644
index a7b3028..0000000
--- a/content/docs/graph/reference/api/relationships/ListRelationships.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Lists all relationships for a digital twin.
-full: true
-_openapi:
- method: GET
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/relationships/UpdateRelationship.mdx b/content/docs/graph/reference/api/relationships/UpdateRelationship.mdx
deleted file mode 100644
index 3369f68..0000000
--- a/content/docs/graph/reference/api/relationships/UpdateRelationship.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Updates a specific relationship for a digital twin.
-full: true
-_openapi:
- method: PATCH
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/telemetry/PublishComponentTelemetry.mdx b/content/docs/graph/reference/api/telemetry/PublishComponentTelemetry.mdx
deleted file mode 100644
index 819e6c0..0000000
--- a/content/docs/graph/reference/api/telemetry/PublishComponentTelemetry.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Publishes telemetry data for a specific component of a digital twin.
-full: true
-_openapi:
- method: POST
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/api/telemetry/PublishTelemetry.mdx b/content/docs/graph/reference/api/telemetry/PublishTelemetry.mdx
deleted file mode 100644
index 00223c7..0000000
--- a/content/docs/graph/reference/api/telemetry/PublishTelemetry.mdx
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Publishes telemetry data for a digital twin.
-full: true
-_openapi:
- method: POST
- toc: []
- structuredData:
- headings: []
- contents: []
----
-
-{/* This file was generated by Fumadocs. Do not edit this file directly. Any changes should be made by running the generation command again. */}
-
-
\ No newline at end of file
diff --git a/content/docs/graph/reference/configuration.mdx b/content/docs/graph/reference/configuration.mdx
deleted file mode 100644
index f62b941..0000000
--- a/content/docs/graph/reference/configuration.mdx
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Configuration
-icon: SlidersVertical
----
-
-All configuration options and their usage.
diff --git a/content/docs/graph/reference/meta.json b/content/docs/graph/reference/meta.json
deleted file mode 100644
index 27ab2fc..0000000
--- a/content/docs/graph/reference/meta.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "title": "Reference",
- "icon": "Book",
- "description": "API reference, SDK documentation, and configuration options",
- "pages": [
- "api",
- "sdk",
- "configuration",
- "roadmap"
- ]
-}
\ No newline at end of file
diff --git a/content/docs/graph/reference/roadmap.mdx b/content/docs/graph/reference/roadmap.mdx
deleted file mode 100644
index e901aa4..0000000
--- a/content/docs/graph/reference/roadmap.mdx
+++ /dev/null
@@ -1,154 +0,0 @@
----
-title: Roadmap
-icon: Map
-description: Current development status and planned features for Konnektr Graph
----
-
-This page tracks the current implementation status and planned features for Konnektr Graph. We're actively developing and welcome community feedback on priorities.
-
-## 🎯 SDK Features
-
-### Digital Twins Operations
-- [x] Digital Twins CRUD operations
-- [x] Models CRUD operations
-- [x] Relationships CRUD operations
-- [x] Components management
-- [x] Telemetry publishing
-- [ ] Commands (planned)
-
-### Validation & Data Quality
-- [x] Model Validation with DTDLParser
-- [x] Twin Validation with DTDLParser
-- [x] Update Validation with DTDLParser
-- [ ] Relationship Validation with DTDLParser (planned)
-
-### Query Engine
-- [x] ADT Query Conversion (to Cypher)
- - [x] WHERE clauses
- - [x] MATCH patterns
- - [x] JOIN operations
- - [x] IS_OF_MODEL filtering
- - [x] String functions
- - [x] Type check functions
-
-### Core Infrastructure
-- [x] Error handling and exception management
-- [x] ETags for optimistic concurrency
-- [x] Pagination support
-- [x] Import Jobs (bulk operations)
-- [x] Delete Jobs (bulk operations)
-- [x] Diagnostics, Tracing and Prometheus metrics
-
----
-
-## 🌐 API Features
-
-### REST API Endpoints
-- [x] Digital Twins CRUD operations
-- [x] Models CRUD operations
-- [x] Relationships CRUD operations
-- [x] Components CRUD operations
-- [x] Telemetry publishing
-- [x] Import Jobs
-- [x] Delete Jobs
-
-### Security & Performance
-- [x] Authentication (JWT-based)
-- [ ] Authorization (role-based access control) (planned)
-- [x] OpenTelemetry support
-- [x] Rate Limiting
-- [x] Error Handling
-
----
-
-## 🤖 Model Context Protocol (MCP) Server
-
-Enable LLMs to interact with your digital twin graph:
-
-- [x] Models CRUD operations
-- [x] Digital Twins CRUD operations
-- [x] Relationships CRUD operations
-- [x] Authentication
-
----
-
-## 🚀 Deployment & Operations
-
-### Infrastructure
-- [x] Dockerize the API
-- [x] Helm chart for Kubernetes deployment
-- [x] PostgreSQL with Apache AGE integration
-- [x] Hosted platform (Konnektr Graph)
-
-### Monitoring & Observability
-- [x] OpenTelemetry integration
-- [x] Prometheus metrics
-- [x] Structured logging
-- [x] Health checks and readiness probes
-
----
-
-## 📡 Event Routing
-
-### Event Capture
-- [x] Logical replication connection with AgType parser
-- [x] Data History output (Azure Digital Twins format)
-- [x] Event Notification output
-- [x] Event Type Mappings
-- [x] CloudEvents format support
-
-### Event Sinks
-- [x] Kafka sink (including Azure Event Hubs)
-- [x] Kusto sink (Azure Data Explorer / Fabric Real-Time)
-- [x] MQTT sink
-- [ ] Postgres sink (planned)
-- [ ] Custom webhook sink (planned)
-
-### Event Processing
-- [ ] Event filtering by twin type (in progress)
-- [ ] Event filtering by property changes (planned)
-- [ ] Event transformation and enrichment (planned)
-- [ ] Dead letter queue handling (planned)
-
----
-
-## 📥 Data Ingestion
-
-Planned features for ingesting data into digital twins:
-
-- [ ] MQTT Ingestion (planned)
-- [ ] Kafka Ingestion (planned)
-- [ ] Ingestion Mapping configuration (planned)
-- [ ] CSV/JSON bulk import (planned)
-
----
-
-## 🔮 Future Enhancements
-
-### Developer Experience
-- [ ] Enhanced MCP capabilities for AI agents
-- [ ] Visual graph explorer UI
-
-### Integration & Ecosystem
-- [ ] More event sink types
-- [ ] Pre-built DTDL model libraries
-
----
-
-## 📝 Contributing to the Roadmap
-
-We welcome community input on our roadmap! If you have feature requests or want to contribute:
-
-1. **[Open a GitHub Issue](https://github.com/konnektr-io/pg-age-digitaltwins/issues)** - Propose new features
-2. **[Join Discussions](https://github.com/konnektr-io/pg-age-digitaltwins/discussions)** - Vote on priorities
-3. **[Submit a PR](https://github.com/konnektr-io/pg-age-digitaltwins/pulls)** - Implement features yourself
-
----
-
-## 📅 Release Notes
-
-Major milestones and releases are documented in our [GitHub Releases](https://github.com/konnektr-io/pg-age-digitaltwins/releases).
-
----
-
-*Last updated: November 2025*
diff --git a/content/docs/graph/reference/sdk.mdx b/content/docs/graph/reference/sdk.mdx
deleted file mode 100644
index c0fb3e5..0000000
--- a/content/docs/graph/reference/sdk.mdx
+++ /dev/null
@@ -1,218 +0,0 @@
----
-title: Native SDK Reference (Self-Hosted Only)
-icon: Code
----
-
-> **Note**: This SDK is only available for **self-hosted deployments**. For hosted Konnektr Graph, use the [Azure Digital Twins SDK](../how-to-guides/using-azure-digital-twins-sdks) instead.
-
-## Overview
-
-The AgeDigitalTwins SDK provides a .NET client for direct database access to your self-hosted Konnektr Graph instance. It connects directly to PostgreSQL with Apache AGE, bypassing the HTTP API layer for maximum performance.
-
-### When to Use This SDK
-
-✅ **Use the Native SDK when:**
-- You have a self-hosted Konnektr Graph deployment
-- You need maximum performance with direct database access
-- You want to perform bulk operations efficiently
-- You need advanced Cypher query capabilities
-- You require transaction support
-
-❌ **Don't use this SDK if:**
-- You're using hosted Konnektr Graph (not accessible)
-- You want to migrate to/from Azure Digital Twins easily
-- You prefer standard REST API patterns
-
-### Hosted vs Self-Hosted SDK Comparison
-
-| Feature | Hosted (Azure SDK) | Self-Hosted (Native SDK) |
-|---------|-------------------|---------------------------|
-| **Connection** | HTTPS REST API | Direct PostgreSQL |
-| **Authentication** | Auth0 JWT | Database credentials |
-| **Performance** | Good | Excellent |
-| **Bulk Operations** | Standard | Optimized |
-| **Transactions** | Not supported | Full support |
-| **Migration** | Easy to/from ADT | Custom required |
-
-## Installation
-
-To install the SDK, use the following NuGet command:
-
-```bash
-Install-Package AgeDigitalTwins
-```
-
-## Usage
-
-### Initialization
-
-```csharp
-using AgeDigitalTwins;
-using Npgsql;
-
-var connectionString = "Host=localhost;Username=postgres;Password=yourpassword;Database=agedb";
-var dataSource = NpgsqlDataSource.Create(connectionString);
-var client = new AgeDigitalTwinsClient(dataSource, "digitaltwins");
-```
-
-### Managing Digital Twins
-
-#### Create or Replace a Digital Twin
-
-```csharp
-var twin = new
-{
- $dtId = "room1",
- name = "Room 1",
- $metadata = new { $model = "dtmi:com:adt:dtsample:room;1" }
-};
-await client.CreateOrReplaceDigitalTwinAsync("room1", twin);
-```
-
-#### Get a Digital Twin
-
-```csharp
-var twin = await client.GetDigitalTwinAsync("room1");
-Console.WriteLine(twin);
-```
-
-#### Delete a Digital Twin
-
-```csharp
-await client.DeleteDigitalTwinAsync("room1");
-```
-
-### Querying the Graph
-
-#### Execute a Query
-
-```csharp
-var query = "SELECT * FROM DIGITALTWINS";
-await foreach (var result in client.QueryAsync(query))
-{
- Console.WriteLine(result);
-}
-```
-
-### Managing Models
-
-#### Create Models
-
-```csharp
-var models = new[]
-{
- "{ \"@id\": \"dtmi:com:adt:dtsample:room;1\", \"@type\": \"Interface\", \"displayName\": \"Room\" }"
-};
-await client.CreateModelsAsync(models);
-```
-
-#### List Models
-
-```csharp
-await foreach (var model in client.GetModelsAsync())
-{
- Console.WriteLine(model);
-}
-```
-
-#### Delete a Model
-
-```csharp
-await client.DeleteModelAsync("dtmi:com:adt:dtsample:room;1");
-```
-
-### Advanced Query Examples
-
-#### Complex Graph Traversal
-```csharp
-var query = @"
- MATCH (room:DigitalTwin {$dtId: 'room1'})
- MATCH (room)-[:contains]->(sensor:DigitalTwin)
- WHERE sensor.Temperature > 25.0
- RETURN room.$dtId, sensor.$dtId, sensor.Temperature
-";
-
-await foreach (var result in client.QueryAsync(query))
-{
- Console.WriteLine(result);
-}
-```
-
-#### Bulk Insert with Transaction
-```csharp
-using (var transaction = dataSource.CreateTransaction())
-{
- var client = new AgeDigitalTwinsClient(transaction, "digitaltwins");
-
- // Insert multiple twins in a transaction
- for (int i = 0; i < 1000; i++)
- {
- var twin = new { $dtId = $"sensor{i}", Temperature = 20.0 + i };
- await client.CreateOrReplaceDigitalTwinAsync($"sensor{i}", twin);
- }
-
- await transaction.CommitAsync();
-}
-```
-
-## Performance Benefits
-
-The native SDK provides significant performance advantages:
-
-- **Direct Database Access**: No HTTP serialization overhead
-- **Connection Pooling**: Efficient PostgreSQL connection management
-- **Bulk Operations**: Optimized batch inserts and updates
-- **Transactions**: ACID compliance with rollback support
-- **Streaming**: Memory-efficient query result streaming
-
-## Error Handling
-
-```csharp
-try
-{
- await client.CreateOrReplaceDigitalTwinAsync("twin1", twinData);
-}
-catch (AgeDigitalTwinsException ex) when (ex.ErrorCode == "ModelNotFound")
-{
- Console.WriteLine($"Model not found: {ex.Message}");
-}
-catch (NpgsqlException ex)
-{
- Console.WriteLine($"Database error: {ex.Message}");
-}
-```
-
-## Compatibility
-
-- **.NET 6.0+**: Full support for modern .NET
-- **Async/Await**: All operations are asynchronous
-- **PostgreSQL 13+**: Requires Apache AGE extension
-- **Connection Pooling**: Built-in Npgsql connection pooling
-
-## Migration Considerations
-
-### From Azure Digital Twins SDK to Native SDK
-
-```csharp
-// Before (Azure Digital Twins SDK)
-var client = new DigitalTwinsClient(endpoint, credential);
-var twin = await client.GetDigitalTwinAsync("twin1");
-
-// After (Native SDK)
-var client = new AgeDigitalTwinsClient(dataSource, "digitaltwins");
-var twin = await client.GetDigitalTwinAsync("twin1");
-```
-
-### From Native SDK to Azure Digital Twins SDK
-
-For migration to hosted Konnektr Graph or Azure Digital Twins, you'll need to:
-1. Replace database connections with HTTP endpoints
-2. Implement Auth0 or Azure AD authentication
-3. Update query syntax to ADT query language
-4. Handle API rate limits and pagination
-
-## Related Documentation
-
-- **For Hosted Users**: [Azure Digital Twins SDK Guide](../how-to-guides/using-azure-digital-twins-sdks)
-- **Self-Hosted Setup**: [Self-Hosted Deployment](../deployment-installation/self-host)
-- **Performance Tuning**: [Advanced Topics](../advanced-topics/performance)
diff --git a/content/docs/meta.json b/content/docs/meta.json
index 87290d0..14312c2 100644
--- a/content/docs/meta.json
+++ b/content/docs/meta.json
@@ -1,11 +1,9 @@
{
- "$schema": "..\\..\\.source\\json-schema\\docs.meta.json",
"title": "Konnektr",
"root": true,
"pages": [
- "graph",
"ktrlplane",
"db-query-operator",
"jexl"
]
-}
\ No newline at end of file
+}
diff --git a/content/openapi/graph/v1.json b/content/openapi/graph/v1.json
deleted file mode 100644
index 5be3507..0000000
--- a/content/openapi/graph/v1.json
+++ /dev/null
@@ -1,1202 +0,0 @@
-{
- "openapi": "3.1.1",
- "info": {
- "title": "AgeDigitalTwins.ApiService | v1",
- "version": "1.0.0"
- },
- "servers": [
- {
- "url": "https://demo.api.graph.konnektr.io/"
- }
- ],
- "paths": {
- "/query": {
- "post": {
- "tags": [
- "Query"
- ],
- "summary": "Executes a query against the digital twins graph with pagination.",
- "operationId": "Query",
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/QueryRequest"
- }
- }
- },
- "required": true
- },
- "responses": {
- "200": {
- "description": "OK",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/PageOfJsonDocument"
- }
- }
- }
- }
- }
- }
- },
- "/digitaltwins/{id}": {
- "get": {
- "tags": [
- "Digital Twins"
- ],
- "summary": "Retrieves a digital twin by its ID.",
- "operationId": "GetDigitalTwin",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "OK",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/BasicDigitalTwin"
- }
- }
- }
- }
- }
- },
- "put": {
- "tags": [
- "Digital Twins"
- ],
- "summary": "Creates or replaces a digital twin by its ID.",
- "operationId": "CreateOrReplaceDigitalTwin",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/BasicDigitalTwin"
- }
- }
- },
- "required": true
- },
- "responses": {
- "200": {
- "description": "OK",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/BasicDigitalTwin"
- }
- }
- }
- }
- }
- },
- "patch": {
- "tags": [
- "Digital Twins"
- ],
- "summary": "Updates a digital twin by its ID.",
- "operationId": "UpdateDigitalTwin",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/JsonPatch"
- }
- }
- },
- "required": true
- },
- "responses": {
- "200": {
- "description": "OK"
- }
- }
- },
- "delete": {
- "tags": [
- "Digital Twins"
- ],
- "summary": "Deletes a digital twin by its ID.",
- "operationId": "DeleteDigitalTwin",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "OK"
- }
- }
- }
- },
- "/digitaltwins/{twinId}/components/{componentName}": {
- "get": {
- "tags": [
- "Components"
- ],
- "summary": "Retrieves a component from a digital twin by its name.",
- "operationId": "GetComponent",
- "parameters": [
- {
- "name": "twinId",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "componentName",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "OK",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/BasicDigitalTwinComponent"
- }
- }
- }
- }
- }
- },
- "patch": {
- "tags": [
- "Components"
- ],
- "summary": "Updates a component on a digital twin using a JSON patch.",
- "operationId": "UpdateComponent",
- "parameters": [
- {
- "name": "twinId",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "componentName",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/JsonPatch"
- }
- }
- },
- "required": true
- },
- "responses": {
- "200": {
- "description": "OK"
- }
- }
- }
- },
- "/digitaltwins/{twinId}/telemetry": {
- "post": {
- "tags": [
- "Telemetry"
- ],
- "summary": "Publishes telemetry data for a digital twin.",
- "operationId": "PublishTelemetry",
- "parameters": [
- {
- "name": "twinId",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/JsonDocument"
- }
- }
- },
- "required": true
- },
- "responses": {
- "200": {
- "description": "OK"
- }
- }
- }
- },
- "/digitaltwins/{twinId}/telemetry/components/{componentName}": {
- "post": {
- "tags": [
- "Telemetry"
- ],
- "summary": "Publishes telemetry data for a specific component of a digital twin.",
- "operationId": "PublishComponentTelemetry",
- "parameters": [
- {
- "name": "twinId",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "componentName",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/JsonDocument"
- }
- }
- },
- "required": true
- },
- "responses": {
- "200": {
- "description": "OK"
- }
- }
- }
- },
- "/digitaltwins/{id}/incomingrelationships": {
- "get": {
- "tags": [
- "Relationships"
- ],
- "summary": "Lists all incoming relationships for a digital twin.",
- "operationId": "ListIncomingRelationships",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "OK"
- }
- }
- }
- },
- "/digitaltwins/{id}/relationships": {
- "get": {
- "tags": [
- "Relationships"
- ],
- "summary": "Lists all relationships for a digital twin.",
- "operationId": "ListRelationships",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "OK"
- }
- }
- }
- },
- "/digitaltwins/{id}/relationships/{relationshipId}": {
- "get": {
- "tags": [
- "Relationships"
- ],
- "summary": "Retrieves a specific relationship by its ID.",
- "operationId": "GetRelationship",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "relationshipId",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "OK",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/BasicRelationship"
- }
- }
- }
- }
- }
- },
- "put": {
- "tags": [
- "Relationships"
- ],
- "summary": "Creates or replaces a relationship for a digital twin.",
- "operationId": "CreateOrReplaceRelationship",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "relationshipId",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/BasicRelationship"
- }
- }
- },
- "required": true
- },
- "responses": {
- "200": {
- "description": "OK",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/BasicRelationship"
- }
- }
- }
- }
- }
- },
- "patch": {
- "tags": [
- "Relationships"
- ],
- "summary": "Updates a specific relationship for a digital twin.",
- "operationId": "UpdateRelationship",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "relationshipId",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/JsonPatch"
- }
- }
- },
- "required": true
- },
- "responses": {
- "200": {
- "description": "OK"
- }
- }
- },
- "delete": {
- "tags": [
- "Relationships"
- ],
- "summary": "Deletes a specific relationship for a digital twin.",
- "operationId": "DeleteRelationship",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- },
- {
- "name": "relationshipId",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "OK"
- }
- }
- }
- },
- "/models": {
- "get": {
- "tags": [
- "Models"
- ],
- "summary": "Lists all models in the digital twins graph.",
- "operationId": "ListModels",
- "responses": {
- "200": {
- "description": "OK"
- }
- }
- },
- "post": {
- "tags": [
- "Models"
- ],
- "summary": "Creates new models in the digital twins graph.",
- "operationId": "CreateModels",
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "type": "array"
- }
- }
- },
- "required": true
- },
- "responses": {
- "200": {
- "description": "OK",
- "content": {
- "application/json": {
- "schema": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/DigitalTwinsModelData"
- }
- }
- }
- }
- }
- }
- },
- "delete": {
- "tags": [
- "Models"
- ],
- "summary": "Deletes all models in the digital twins graph.",
- "operationId": "DeleteAllModels",
- "responses": {
- "200": {
- "description": "OK"
- }
- }
- }
- },
- "/models/{id}": {
- "delete": {
- "tags": [
- "Models"
- ],
- "summary": "Deletes a specific model by its ID.",
- "operationId": "DeleteModel",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "OK"
- }
- }
- }
- },
- "/jobs/imports/{id}": {
- "put": {
- "tags": [
- "Import Jobs"
- ],
- "summary": "Create and start a new import job",
- "description": "Creates and starts a new import job. The job will run in the background and return immediately. Monitor job progress using the GetImportJob endpoint.",
- "operationId": "CreateImportJob",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "requestBody": {
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ImportJobRequest"
- }
- }
- },
- "required": true
- },
- "responses": {
- "201": {
- "description": "Created",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ImportJob"
- }
- }
- }
- },
- "400": {
- "description": "Bad Request",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/ProblemDetails"
- }
- }
- }
- },
- "409": {
- "description": "Conflict",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/ProblemDetails"
- }
- }
- }
- }
- }
- },
- "get": {
- "tags": [
- "Import Jobs"
- ],
- "summary": "Get import job by ID",
- "description": "Retrieves the status and details of an import job by its ID.",
- "operationId": "GetImportJob",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "OK",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ImportJob"
- }
- }
- }
- },
- "404": {
- "description": "Not Found",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/ProblemDetails"
- }
- }
- }
- }
- }
- },
- "delete": {
- "tags": [
- "Import Jobs"
- ],
- "summary": "Delete an import job",
- "description": "Removes an import job from the system. This is a non-standard endpoint for cleanup purposes.",
- "operationId": "DeleteImportJob",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "204": {
- "description": "No Content"
- },
- "404": {
- "description": "Not Found",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/ProblemDetails"
- }
- }
- }
- }
- }
- }
- },
- "/jobs/imports": {
- "get": {
- "tags": [
- "Import Jobs"
- ],
- "summary": "List all import jobs",
- "description": "Retrieves a list of all import jobs with optional pagination.",
- "operationId": "ListImportJobs",
- "responses": {
- "200": {
- "description": "OK",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/PageWithNextLinkOfImportJob"
- }
- }
- }
- }
- }
- }
- },
- "/jobs/imports/{id}/cancel": {
- "post": {
- "tags": [
- "Import Jobs"
- ],
- "summary": "Cancel an import job",
- "description": "Cancels a running import job. Note that this will leave your instance in an unknown state as there won't be any rollback operation.",
- "operationId": "CancelImportJob",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "OK",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ImportJob"
- }
- }
- }
- },
- "404": {
- "description": "Not Found",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/ProblemDetails"
- }
- }
- }
- },
- "400": {
- "description": "Bad Request",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/ProblemDetails"
- }
- }
- }
- }
- }
- }
- },
- "/jobs/imports/{id}/resume": {
- "post": {
- "tags": [
- "Import Jobs"
- ],
- "summary": "Resume an import job",
- "description": "Resumes an interrupted import job from its last checkpoint. The job must be in a resumable state (Running or Failed).",
- "operationId": "ResumeImportJob",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "required": true,
- "schema": {
- "type": "string"
- }
- }
- ],
- "responses": {
- "200": {
- "description": "OK",
- "content": {
- "application/json": {
- "schema": {
- "$ref": "#/components/schemas/ImportJob"
- }
- }
- }
- },
- "404": {
- "description": "Not Found",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/ProblemDetails"
- }
- }
- }
- },
- "400": {
- "description": "Bad Request",
- "content": {
- "application/problem+json": {
- "schema": {
- "$ref": "#/components/schemas/ProblemDetails"
- }
- }
- }
- }
- }
- }
- }
- },
- "components": {
- "schemas": {
- "BasicDigitalTwin": {},
- "BasicDigitalTwinComponent": {},
- "BasicRelationship": {
- "type": "object",
- "properties": {
- "$relationshipId": {
- "type": "string"
- },
- "$targetId": {
- "type": "string"
- },
- "$sourceId": {
- "type": "string"
- },
- "$relationshipName": {
- "type": "string"
- },
- "$etag": {
- "type": [
- "null",
- "string"
- ]
- }
- }
- },
- "DigitalTwinsModelData": {
- "required": [
- "id",
- "model",
- "uploadTime",
- "displayName",
- "description",
- "bases",
- "descendants",
- "decommissioned",
- "embedding"
- ],
- "type": "object",
- "properties": {
- "id": {
- "type": "string"
- },
- "model": {
- "oneOf": [
- {
- "type": "null"
- },
- {
- "$ref": "#/components/schemas/JsonElement"
- }
- ]
- },
- "uploadTime": {
- "type": [
- "null",
- "string"
- ],
- "format": "date-time"
- },
- "displayName": {
- "type": "object",
- "additionalProperties": {
- "type": "string"
- }
- },
- "description": {
- "type": "object",
- "additionalProperties": {
- "type": "string"
- }
- },
- "bases": {
- "type": [
- "null",
- "array"
- ],
- "items": {
- "type": "string"
- }
- },
- "descendants": {
- "type": [
- "null",
- "array"
- ],
- "items": {
- "type": "string"
- }
- },
- "decommissioned": {
- "type": "boolean"
- },
- "embedding": {
- "type": [
- "null",
- "array"
- ],
- "items": {
- "pattern": "^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$",
- "type": [
- "number",
- "string"
- ],
- "format": "double"
- }
- }
- }
- },
- "ImportJob": {
- "type": "object",
- "properties": {
- "id": {
- "type": [
- "null",
- "string"
- ]
- },
- "status": {
- "$ref": "#/components/schemas/JobStatus"
- },
- "createdDateTime": {
- "type": "string",
- "format": "date-time"
- },
- "lastActionDateTime": {
- "type": "string",
- "format": "date-time"
- },
- "finishedDateTime": {
- "type": [
- "null",
- "string"
- ],
- "format": "date-time"
- },
- "purgeDateTime": {
- "type": [
- "null",
- "string"
- ],
- "format": "date-time"
- },
- "modelsCreated": {
- "pattern": "^-?(?:0|[1-9]\\d*)$",
- "type": [
- "integer",
- "string"
- ],
- "format": "int32"
- },
- "twinsCreated": {
- "pattern": "^-?(?:0|[1-9]\\d*)$",
- "type": [
- "integer",
- "string"
- ],
- "format": "int32"
- },
- "relationshipsCreated": {
- "pattern": "^-?(?:0|[1-9]\\d*)$",
- "type": [
- "integer",
- "string"
- ],
- "format": "int32"
- },
- "errorCount": {
- "pattern": "^-?(?:0|[1-9]\\d*)$",
- "type": [
- "integer",
- "string"
- ],
- "format": "int32"
- },
- "inputBlobUri": {
- "type": "string",
- "format": "uri"
- },
- "outputBlobUri": {
- "type": "string",
- "format": "uri"
- }
- }
- },
- "ImportJobRequest": {
- "type": "object",
- "properties": {
- "inputBlobUri": {
- "type": "string",
- "format": "uri"
- },
- "outputBlobUri": {
- "type": "string",
- "format": "uri"
- }
- }
- },
- "JobStatus": {
- "enum": [
- "notstarted",
- "running",
- "succeeded",
- "partiallySucceeded",
- "failed",
- "cancelled",
- "cancelling"
- ]
- },
- "JsonDocument": {},
- "JsonElement": {},
- "JsonPatch": {},
- "PageOfJsonDocument": {
- "type": "object",
- "properties": {
- "value": {
- "type": "array"
- },
- "continuationToken": {
- "type": [
- "null",
- "string"
- ]
- }
- }
- },
- "PageWithNextLinkOfImportJob": {
- "type": "object",
- "properties": {
- "nextLink": {
- "type": [
- "null",
- "string"
- ],
- "format": "uri"
- },
- "value": {
- "type": "array",
- "items": {
- "$ref": "#/components/schemas/ImportJob"
- }
- },
- "continuationToken": {
- "type": [
- "null",
- "string"
- ]
- }
- }
- },
- "ProblemDetails": {
- "type": "object",
- "properties": {
- "type": {
- "type": [
- "null",
- "string"
- ]
- },
- "title": {
- "type": [
- "null",
- "string"
- ]
- },
- "status": {
- "pattern": "^-?(?:0|[1-9]\\d*)$",
- "type": [
- "null",
- "integer",
- "string"
- ],
- "format": "int32"
- },
- "detail": {
- "type": [
- "null",
- "string"
- ]
- },
- "instance": {
- "type": [
- "null",
- "string"
- ]
- }
- }
- },
- "QueryRequest": {
- "type": "object",
- "properties": {
- "query": {
- "type": [
- "null",
- "string"
- ]
- },
- "continuationToken": {
- "type": [
- "null",
- "string"
- ]
- }
- }
- }
- }
- },
- "tags": [
- {
- "name": "Query"
- },
- {
- "name": "Digital Twins"
- },
- {
- "name": "Components"
- },
- {
- "name": "Telemetry"
- },
- {
- "name": "Relationships"
- },
- {
- "name": "Models"
- },
- {
- "name": "Import Jobs"
- }
- ]
-}
\ No newline at end of file
diff --git a/lib/openapi.ts b/lib/openapi.ts
index 6e9a7aa..dfbf79d 100644
--- a/lib/openapi.ts
+++ b/lib/openapi.ts
@@ -1,6 +1,2 @@
-import { createOpenAPI } from "fumadocs-openapi/server";
-
-export const openapi = createOpenAPI({
- input: ["./content/openapi/graph/v1.json"],
- proxyUrl: "/api/proxy",
-});
+// OpenAPI references have been removed (Graph was the only API documented).
+// This file is intentionally empty.
diff --git a/lib/source.tsx b/lib/source.tsx
index ff9cbf5..91ce20b 100644
--- a/lib/source.tsx
+++ b/lib/source.tsx
@@ -5,15 +5,13 @@ import {
loader,
multiple,
} from "fumadocs-core/source";
-import { openapiPlugin, openapiSource } from "fumadocs-openapi/server";
import { blog as blogPosts, docs } from "fumadocs-mdx:collections/server";
import { toFumadocsSource } from "fumadocs-mdx/runtime/server";
import { lucideIconsPlugin } from "fumadocs-core/source/lucide-icons";
-import { openapi } from "@/lib/openapi";
export const source = loader(docs.toFumadocsSource(), {
baseUrl: "/docs",
- plugins: [pageTreeCodeTitles(), lucideIconsPlugin(), openapiPlugin()],
+ plugins: [pageTreeCodeTitles(), lucideIconsPlugin()],
});
function pageTreeCodeTitles(): LoaderPlugin {
diff --git a/mdx-components.tsx b/mdx-components.tsx
index c94eee8..4ac3b06 100644
--- a/mdx-components.tsx
+++ b/mdx-components.tsx
@@ -1,7 +1,6 @@
import defaultMdxComponents from 'fumadocs-ui/mdx';
import * as TabsComponents from "fumadocs-ui/components/tabs";
import { Mermaid } from "@/components/mdx/mermaid";
-import { APIPage } from "@/components/api-page";
import type { MDXComponents } from "mdx/types";
export function getMDXComponents(components?: MDXComponents): MDXComponents {
@@ -9,7 +8,6 @@ export function getMDXComponents(components?: MDXComponents): MDXComponents {
...defaultMdxComponents,
...TabsComponents,
Mermaid,
- APIPage,
...components,
};
}
diff --git a/package.json b/package.json
index 20c80e8..ccb987b 100644
--- a/package.json
+++ b/package.json
@@ -22,7 +22,6 @@
"clsx": "^2.1.1",
"fumadocs-core": "16.2.5",
"fumadocs-mdx": "14.1.1",
- "fumadocs-openapi": "^10.1.4",
"fumadocs-ui": "16.2.5",
"lucide-react": "^0.556.0",
"mermaid": "^11.12.2",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2bab84e..c80aeb6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -10,22 +10,22 @@ importers:
dependencies:
'@next/third-parties':
specifier: ^16.0.10
- version: 16.0.10(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)
+ version: 16.2.9(next@16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)
'@radix-ui/react-collapsible':
specifier: ^1.1.12
- version: 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 1.1.14(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@radix-ui/react-popover':
specifier: ^1.1.15
- version: 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@radix-ui/react-presence':
specifier: ^1.1.5
- version: 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@radix-ui/react-scroll-area':
specifier: ^1.2.10
- version: 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
'@radix-ui/react-slot':
specifier: ^1.2.4
- version: 1.2.4(@types/react@19.2.7)(react@19.2.3)
+ version: 1.3.0(@types/react@19.2.17)(react@19.2.7)
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
@@ -34,71 +34,68 @@ importers:
version: 2.1.1
fumadocs-core:
specifier: 16.2.5
- version: 16.2.5(@types/react@19.2.7)(lucide-react@0.556.0(react@19.2.3))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.2.1)
+ version: 16.2.5(@types/react@19.2.17)(lucide-react@0.556.0(react@19.2.7))(next@16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3)
fumadocs-mdx:
specifier: 14.1.1
- version: 14.1.1(fumadocs-core@16.2.5(@types/react@19.2.7)(lucide-react@0.556.0(react@19.2.3))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.2.1))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)
- fumadocs-openapi:
- specifier: ^10.1.4
- version: 10.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(fumadocs-core@16.2.5(@types/react@19.2.7)(lucide-react@0.556.0(react@19.2.3))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.2.1))(fumadocs-ui@16.2.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(lucide-react@0.556.0(react@19.2.3))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)(zod@4.2.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 14.1.1(fumadocs-core@16.2.5(@types/react@19.2.17)(lucide-react@0.556.0(react@19.2.7))(next@16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3))(next@16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)
fumadocs-ui:
specifier: 16.2.5
- version: 16.2.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(lucide-react@0.556.0(react@19.2.3))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)(zod@4.2.1)
+ version: 16.2.5(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(lucide-react@0.556.0(react@19.2.7))(next@16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(tailwindcss@4.3.1)(zod@4.4.3)
lucide-react:
specifier: ^0.556.0
- version: 0.556.0(react@19.2.3)
+ version: 0.556.0(react@19.2.7)
mermaid:
specifier: ^11.12.2
- version: 11.12.2
+ version: 11.15.0
next:
specifier: 16.0.10
- version: 16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
next-themes:
specifier: ^0.4.6
- version: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ version: 0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
react:
specifier: ^19.2.1
- version: 19.2.3
+ version: 19.2.7
react-dom:
specifier: ^19.2.1
- version: 19.2.3(react@19.2.3)
+ version: 19.2.7(react@19.2.7)
scroll-into-view-if-needed:
specifier: ^3.1.0
version: 3.1.0
shiki:
specifier: ^3.20.0
- version: 3.20.0
+ version: 3.23.0
tailwind-merge:
specifier: ^3.4.0
- version: 3.4.0
+ version: 3.6.0
zod:
specifier: ^4.2.1
- version: 4.2.1
+ version: 4.4.3
devDependencies:
'@biomejs/biome':
specifier: ^2.3.8
- version: 2.3.10
+ version: 2.5.1
'@tailwindcss/postcss':
specifier: ^4.1.17
- version: 4.1.18
+ version: 4.3.1
'@types/mdx':
specifier: ^2.0.13
- version: 2.0.13
+ version: 2.0.14
'@types/node':
specifier: ^24.10.2
- version: 24.10.4
+ version: 24.13.2
'@types/react':
specifier: ^19.2.7
- version: 19.2.7
+ version: 19.2.17
'@types/react-dom':
specifier: ^19.2.3
- version: 19.2.3(@types/react@19.2.7)
+ version: 19.2.3(@types/react@19.2.17)
postcss:
specifier: ^8.5.6
- version: 8.5.6
+ version: 8.5.15
tailwindcss:
specifier: ^4.1.17
- version: 4.1.18
+ version: 4.3.1
typescript:
specifier: ^5.9.3
version: 5.9.3
@@ -112,274 +109,254 @@ packages:
'@antfu/install-pkg@1.1.0':
resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==}
- '@biomejs/biome@2.3.10':
- resolution: {integrity: sha512-/uWSUd1MHX2fjqNLHNL6zLYWBbrJeG412/8H7ESuK8ewoRoMPUgHDebqKrPTx/5n6f17Xzqc9hdg3MEqA5hXnQ==}
+ '@biomejs/biome@2.5.1':
+ resolution: {integrity: sha512-IXWLCxKmae+rI7LOHS1B3EbVisQ6GRAWbhN9msa6KjNCyFWrvKZWR4oUdinaNssrV852OrSHuSPa95h1GPJc7Q==}
engines: {node: '>=14.21.3'}
hasBin: true
- '@biomejs/cli-darwin-arm64@2.3.10':
- resolution: {integrity: sha512-M6xUjtCVnNGFfK7HMNKa593nb7fwNm43fq1Mt71kpLpb+4mE7odO8W/oWVDyBVO4ackhresy1ZYO7OJcVo/B7w==}
+ '@biomejs/cli-darwin-arm64@2.5.1':
+ resolution: {integrity: sha512-npqDzvqv7vFaWRiNN1Te71siRgPaqS9MpqgYCdP/CrUbkJ7ApezaeaKjueKHRN/JH/6lRjJQAHi8acQDCAz22w==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [darwin]
- '@biomejs/cli-darwin-x64@2.3.10':
- resolution: {integrity: sha512-Vae7+V6t/Avr8tVbFNjnFSTKZogZHFYl7MMH62P/J1kZtr0tyRQ9Fe0onjqjS2Ek9lmNLmZc/VR5uSekh+p1fg==}
+ '@biomejs/cli-darwin-x64@2.5.1':
+ resolution: {integrity: sha512-RgwTqPAM8g2tn1j+b5oRjF/DbSBX8a4gwojtuG9XuhfK7GgomvZ9+T+tqjXiVbjLEeGJOoL6VEk8mvRTVeSybw==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [darwin]
- '@biomejs/cli-linux-arm64-musl@2.3.10':
- resolution: {integrity: sha512-B9DszIHkuKtOH2IFeeVkQmSMVUjss9KtHaNXquYYWCjH8IstNgXgx5B0aSBQNr6mn4RcKKRQZXn9Zu1rM3O0/A==}
+ '@biomejs/cli-linux-arm64-musl@2.5.1':
+ resolution: {integrity: sha512-WMcvMLgByyTqVxGlq918NBBYliq9FRR9GAQVETHb+VjGVqXCZFfHlZHC1FX4ibuYY/Hg6TJE3rHU0xVrdJXNRw==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
- '@biomejs/cli-linux-arm64@2.3.10':
- resolution: {integrity: sha512-hhPw2V3/EpHKsileVOFynuWiKRgFEV48cLe0eA+G2wO4SzlwEhLEB9LhlSrVeu2mtSn205W283LkX7Fh48CaxA==}
+ '@biomejs/cli-linux-arm64@2.5.1':
+ resolution: {integrity: sha512-yhV35CzZh38VyMvTEXi3JTjxZBs++oCKK9KG8vB6VI5+uvQvZNR3BFWEKKzuOmx9DJJj7sQpZ4LQJcmbGTs3+Q==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
- '@biomejs/cli-linux-x64-musl@2.3.10':
- resolution: {integrity: sha512-QTfHZQh62SDFdYc2nfmZFuTm5yYb4eO1zwfB+90YxUumRCR171tS1GoTX5OD0wrv4UsziMPmrePMtkTnNyYG3g==}
+ '@biomejs/cli-linux-x64-musl@2.5.1':
+ resolution: {integrity: sha512-ANTowtlLmPYm5yeMckWY8Xzb9Ix+JJP3tgHR/n6xRj1VWyIzzWtfRfih9hv9VmClwadpBvZduISZIbBsIlYG3A==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [linux]
+ libc: [musl]
- '@biomejs/cli-linux-x64@2.3.10':
- resolution: {integrity: sha512-wwAkWD1MR95u+J4LkWP74/vGz+tRrIQvr8kfMMJY8KOQ8+HMVleREOcPYsQX82S7uueco60L58Wc6M1I9WA9Dw==}
+ '@biomejs/cli-linux-x64@2.5.1':
+ resolution: {integrity: sha512-J/7uHSX7NfoYDI7HijAkd8lnQIOrRb2W7j3X+tw4R+N5ExvXGsyXFiGdQcfcxfOmNQmZVSQOCDk757fwpzqQcg==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
- '@biomejs/cli-win32-arm64@2.3.10':
- resolution: {integrity: sha512-o7lYc9n+CfRbHvkjPhm8s9FgbKdYZu5HCcGVMItLjz93EhgJ8AM44W+QckDqLA9MKDNFrR8nPbO4b73VC5kGGQ==}
+ '@biomejs/cli-win32-arm64@2.5.1':
+ resolution: {integrity: sha512-zgXnKNgWPC4iPF7Y1lR3STUeCUuZRpD6IiOrC7TZTlh0Lx6FiVUT05myuMQHQ9D+1cc7uyMldi4forE6lp0ivQ==}
engines: {node: '>=14.21.3'}
cpu: [arm64]
os: [win32]
- '@biomejs/cli-win32-x64@2.3.10':
- resolution: {integrity: sha512-pHEFgq7dUEsKnqG9mx9bXihxGI49X+ar+UBrEIj3Wqj3UCZp1rNgV+OoyjFgcXsjCWpuEAF4VJdkZr3TrWdCbQ==}
+ '@biomejs/cli-win32-x64@2.5.1':
+ resolution: {integrity: sha512-6uxpR9hvaglANkZemeSiN/FhYgkGasrEGn267eXIWvjrjJ2LhDlk251IhjVJq6MXzkV2/bcXwLwSroLyPtqRZg==}
engines: {node: '>=14.21.3'}
cpu: [x64]
os: [win32]
- '@braintree/sanitize-url@7.1.1':
- resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==}
-
- '@chevrotain/cst-dts-gen@11.0.3':
- resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==}
-
- '@chevrotain/gast@11.0.3':
- resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==}
+ '@braintree/sanitize-url@7.1.2':
+ resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==}
- '@chevrotain/regexp-to-ast@11.0.3':
- resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==}
+ '@chevrotain/types@11.1.2':
+ resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==}
- '@chevrotain/types@11.0.3':
- resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==}
+ '@emnapi/runtime@1.11.1':
+ resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==}
- '@chevrotain/utils@11.0.3':
- resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==}
-
- '@emnapi/runtime@1.7.1':
- resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==}
-
- '@esbuild/aix-ppc64@0.27.2':
- resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==}
+ '@esbuild/aix-ppc64@0.27.7':
+ resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
- '@esbuild/android-arm64@0.27.2':
- resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==}
+ '@esbuild/android-arm64@0.27.7':
+ resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
- '@esbuild/android-arm@0.27.2':
- resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==}
+ '@esbuild/android-arm@0.27.7':
+ resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
- '@esbuild/android-x64@0.27.2':
- resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==}
+ '@esbuild/android-x64@0.27.7':
+ resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
- '@esbuild/darwin-arm64@0.27.2':
- resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==}
+ '@esbuild/darwin-arm64@0.27.7':
+ resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
- '@esbuild/darwin-x64@0.27.2':
- resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==}
+ '@esbuild/darwin-x64@0.27.7':
+ resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
- '@esbuild/freebsd-arm64@0.27.2':
- resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==}
+ '@esbuild/freebsd-arm64@0.27.7':
+ resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
- '@esbuild/freebsd-x64@0.27.2':
- resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==}
+ '@esbuild/freebsd-x64@0.27.7':
+ resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
- '@esbuild/linux-arm64@0.27.2':
- resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==}
+ '@esbuild/linux-arm64@0.27.7':
+ resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
- '@esbuild/linux-arm@0.27.2':
- resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==}
+ '@esbuild/linux-arm@0.27.7':
+ resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
- '@esbuild/linux-ia32@0.27.2':
- resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==}
+ '@esbuild/linux-ia32@0.27.7':
+ resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
- '@esbuild/linux-loong64@0.27.2':
- resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==}
+ '@esbuild/linux-loong64@0.27.7':
+ resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
- '@esbuild/linux-mips64el@0.27.2':
- resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==}
+ '@esbuild/linux-mips64el@0.27.7':
+ resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
- '@esbuild/linux-ppc64@0.27.2':
- resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==}
+ '@esbuild/linux-ppc64@0.27.7':
+ resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-riscv64@0.27.2':
- resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==}
+ '@esbuild/linux-riscv64@0.27.7':
+ resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
- '@esbuild/linux-s390x@0.27.2':
- resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==}
+ '@esbuild/linux-s390x@0.27.7':
+ resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
- '@esbuild/linux-x64@0.27.2':
- resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==}
+ '@esbuild/linux-x64@0.27.7':
+ resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
- '@esbuild/netbsd-arm64@0.27.2':
- resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==}
+ '@esbuild/netbsd-arm64@0.27.7':
+ resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
- '@esbuild/netbsd-x64@0.27.2':
- resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==}
+ '@esbuild/netbsd-x64@0.27.7':
+ resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
- '@esbuild/openbsd-arm64@0.27.2':
- resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==}
+ '@esbuild/openbsd-arm64@0.27.7':
+ resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
- '@esbuild/openbsd-x64@0.27.2':
- resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==}
+ '@esbuild/openbsd-x64@0.27.7':
+ resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
- '@esbuild/openharmony-arm64@0.27.2':
- resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==}
+ '@esbuild/openharmony-arm64@0.27.7':
+ resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
- '@esbuild/sunos-x64@0.27.2':
- resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==}
+ '@esbuild/sunos-x64@0.27.7':
+ resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
- '@esbuild/win32-arm64@0.27.2':
- resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==}
+ '@esbuild/win32-arm64@0.27.7':
+ resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
- '@esbuild/win32-ia32@0.27.2':
- resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==}
+ '@esbuild/win32-ia32@0.27.7':
+ resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
- '@esbuild/win32-x64@0.27.2':
- resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==}
+ '@esbuild/win32-x64@0.27.7':
+ resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
- '@floating-ui/core@1.7.3':
- resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==}
+ '@floating-ui/core@1.7.5':
+ resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==}
- '@floating-ui/dom@1.7.4':
- resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==}
+ '@floating-ui/dom@1.7.6':
+ resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==}
- '@floating-ui/react-dom@2.1.6':
- resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==}
+ '@floating-ui/react-dom@2.1.8':
+ resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==}
peerDependencies:
react: '>=16.8.0'
react-dom: '>=16.8.0'
- '@floating-ui/utils@0.2.10':
- resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
+ '@floating-ui/utils@0.2.11':
+ resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==}
'@formatjs/intl-localematcher@0.6.2':
resolution: {integrity: sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==}
- '@fumari/json-schema-to-typescript@2.0.0':
- resolution: {integrity: sha512-X0Wm3QJLj1Rtb1nY2exM6QwMXb9LGyIKLf35+n6xyltDDBLMECOC4R/zPaw3RwgFVmvRLSmLCd+ht4sKabgmNw==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- '@apidevtools/json-schema-ref-parser': 14.x.x
- prettier: 3.x.x
- peerDependenciesMeta:
- '@apidevtools/json-schema-ref-parser':
- optional: true
- prettier:
- optional: true
-
'@iconify/types@2.0.0':
resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
- '@iconify/utils@3.1.0':
- resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==}
+ '@iconify/utils@3.1.3':
+ resolution: {integrity: sha512-LPKOXPn/zV+zis1oOfGWogaXVpqUybF3ZS6SCZIsz8vg0ivVp9+fVqyYB7xq0aiST/VhUQYGO1qo6uoYSiEJqw==}
- '@img/colour@1.0.0':
- resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==}
+ '@img/colour@1.1.0':
+ resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
engines: {node: '>=18'}
'@img/sharp-darwin-arm64@0.34.5':
@@ -408,89 +385,105 @@ packages:
resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linux-arm@1.2.4':
resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==}
cpu: [arm]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linux-ppc64@1.2.4':
resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==}
cpu: [ppc64]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linux-riscv64@1.2.4':
resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==}
cpu: [riscv64]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linux-s390x@1.2.4':
resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==}
cpu: [s390x]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linux-x64@1.2.4':
resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@img/sharp-libvips-linuxmusl-arm64@1.2.4':
resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@img/sharp-libvips-linuxmusl-x64@1.2.4':
resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@img/sharp-linux-arm64@0.34.5':
resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@img/sharp-linux-arm@0.34.5':
resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm]
os: [linux]
+ libc: [glibc]
'@img/sharp-linux-ppc64@0.34.5':
resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [ppc64]
os: [linux]
+ libc: [glibc]
'@img/sharp-linux-riscv64@0.34.5':
resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [riscv64]
os: [linux]
+ libc: [glibc]
'@img/sharp-linux-s390x@0.34.5':
resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [s390x]
os: [linux]
+ libc: [glibc]
'@img/sharp-linux-x64@0.34.5':
resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@img/sharp-linuxmusl-arm64@0.34.5':
resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@img/sharp-linuxmusl-x64@0.34.5':
resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@img/sharp-wasm32@0.34.5':
resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==}
@@ -534,8 +527,8 @@ packages:
'@mdx-js/mdx@3.1.1':
resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==}
- '@mermaid-js/parser@0.6.3':
- resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==}
+ '@mermaid-js/parser@1.1.1':
+ resolution: {integrity: sha512-VuHdsYMK1bT6X2JbcAaWAhugTRvRBRyuZgd+c22swUeI9g/ntaxF7CY7dYarhZovofCbUNO0G7JesfmNtjYOCw==}
'@next/env@16.0.10':
resolution: {integrity: sha512-8tuaQkyDVgeONQ1MeT9Mkk8pQmZapMKFh5B+OrFUlG3rVmYTXcXlBetBgTurKXGaIZvkoqRT9JL5K3phXcgang==}
@@ -557,24 +550,28 @@ packages:
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
'@next/swc-linux-arm64-musl@16.0.10':
resolution: {integrity: sha512-llA+hiDTrYvyWI21Z0L1GiXwjQaanPVQQwru5peOgtooeJ8qx3tlqRV2P7uH2pKQaUfHxI/WVarvI5oYgGxaTw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
'@next/swc-linux-x64-gnu@16.0.10':
resolution: {integrity: sha512-AK2q5H0+a9nsXbeZ3FZdMtbtu9jxW4R/NgzZ6+lrTm3d6Zb7jYrWcgjcpM1k8uuqlSy4xIyPR2YiuUr+wXsavA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
'@next/swc-linux-x64-musl@16.0.10':
resolution: {integrity: sha512-1TDG9PDKivNw5550S111gsO4RGennLVl9cipPhtkXIFVwo31YZ73nEbLjNC8qG3SgTz/QZyYyaFYMeY4BKZR/g==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
+ libc: [musl]
'@next/swc-win32-arm64-msvc@16.0.10':
resolution: {integrity: sha512-aEZIS4Hh32xdJQbHz121pyuVZniSNoqDVx1yIr2hy+ZwJGipeqnMZBJHyMxv2tiuAXGx6/xpTcQJ6btIiBjgmg==}
@@ -588,24 +585,24 @@ packages:
cpu: [x64]
os: [win32]
- '@next/third-parties@16.0.10':
- resolution: {integrity: sha512-hu6M1uCiHyfVNv6m50Ix/5+vi4RfLkS4k5Ls7sjSN3aS9lZ6LRop9KTTKPbFfwh85p3Vlnq3fenh5HgL51UieA==}
+ '@next/third-parties@16.2.9':
+ resolution: {integrity: sha512-JZPGQRN8eQs2WMfBXOf6Zjrma+JIN0KyA24MvmIa3bUI4BwTaJ1UlxmYVc5ri6l30LQ8fPv6Kmx20447hCltrg==}
peerDependencies:
next: ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0-beta.0
react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
- '@orama/orama@3.1.17':
- resolution: {integrity: sha512-APwpZ+FTGMryo4QEeD6ti+Ei8suBkvxe8PeWdUcQHVfJDpjpt4c1dKojjNswcBmdeWSiiTYcnkKKH+yuo6727g==}
+ '@orama/orama@3.1.18':
+ resolution: {integrity: sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==}
engines: {node: '>= 20.0.0'}
- '@radix-ui/number@1.1.1':
- resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==}
+ '@radix-ui/number@1.1.2':
+ resolution: {integrity: sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig==}
- '@radix-ui/primitive@1.1.3':
- resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==}
+ '@radix-ui/primitive@1.1.4':
+ resolution: {integrity: sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ==}
- '@radix-ui/react-accordion@1.2.12':
- resolution: {integrity: sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA==}
+ '@radix-ui/react-accordion@1.2.14':
+ resolution: {integrity: sha512-iE8YB9nmTBH8zd73ofBISZ8JCzgMoMkATJr7qDwa6u5F1+7mTM81V6fa71jgZ65rpjVpecDf1vSnwIFP9Ly1zw==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -617,8 +614,8 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-arrow@1.1.7':
- resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==}
+ '@radix-ui/react-arrow@1.1.10':
+ resolution: {integrity: sha512-j2VTDz1vgCsmuG0k5lBfOcM8n5JPFqZBcMryasFjHYMhwxYL5SRUV5lMSUpRdNtw3D/Sv8pzJtrlAgkssYSsQQ==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -630,8 +627,8 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-collapsible@1.1.12':
- resolution: {integrity: sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA==}
+ '@radix-ui/react-collapsible@1.1.14':
+ resolution: {integrity: sha512-9bT+FvifX1FK2Mj6UEsTdyu0cN3JaA3KdfhaBao+ONrYFy/pyOy3TU1TNw7iOk1o+0hOEq67RojlUUmoFGwxyA==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -643,8 +640,8 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-collection@1.1.7':
- resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==}
+ '@radix-ui/react-collection@1.1.10':
+ resolution: {integrity: sha512-IVVz4EvBcKjrzKgof714qDnz/SzQAkLA2Emh5edlHbgcE6fNd3Un6CJLlaYcnm8N4JmAtzQgse4dOKxcD2yc9g==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -656,8 +653,8 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-compose-refs@1.1.2':
- resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==}
+ '@radix-ui/react-compose-refs@1.1.3':
+ resolution: {integrity: sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
@@ -665,8 +662,8 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-context@1.1.2':
- resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==}
+ '@radix-ui/react-context@1.1.4':
+ resolution: {integrity: sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
@@ -674,8 +671,8 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-dialog@1.1.15':
- resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==}
+ '@radix-ui/react-dialog@1.1.17':
+ resolution: {integrity: sha512-TDTYmpdq8dI2+Xgvgj9AJ8Ghqq+Eph/TRVEdaFQPDItIY+6QSkU7MJMeevw1568Yw/2Ijz8BTphPSP2XejKphw==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -687,8 +684,8 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-direction@1.1.1':
- resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==}
+ '@radix-ui/react-direction@1.1.2':
+ resolution: {integrity: sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
@@ -696,8 +693,8 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-dismissable-layer@1.1.11':
- resolution: {integrity: sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==}
+ '@radix-ui/react-dismissable-layer@1.1.13':
+ resolution: {integrity: sha512-2v+zNAWWe0ySxgC0D0yeXMPQ23xZVgXZTerTz+JKlmdRj6gfTqmCcR29jb6d290DezXPGgruHWDX/vYUebtErg==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -709,8 +706,8 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-focus-guards@1.1.3':
- resolution: {integrity: sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw==}
+ '@radix-ui/react-focus-guards@1.1.4':
+ resolution: {integrity: sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
@@ -718,8 +715,8 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-focus-scope@1.1.7':
- resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==}
+ '@radix-ui/react-focus-scope@1.1.10':
+ resolution: {integrity: sha512-Fas/lXQqhVvqwAb64s5RFeHiHYElZ6SUQbZaNd6EkfhP/Al7wTIQ9WIR4QVX475tlu5yFCEdDcJH6/UwsZjMWw==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -731,30 +728,17 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-id@1.1.1':
- resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-navigation-menu@1.2.14':
- resolution: {integrity: sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w==}
+ '@radix-ui/react-id@1.1.2':
+ resolution: {integrity: sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA==}
peerDependencies:
'@types/react': '*'
- '@types/react-dom': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
optional: true
- '@types/react-dom':
- optional: true
- '@radix-ui/react-popover@1.1.15':
- resolution: {integrity: sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA==}
+ '@radix-ui/react-navigation-menu@1.2.16':
+ resolution: {integrity: sha512-nJ0SkrSQgudyYhMiYeHA1ayLVuduEJCFLan1RZZN7c9kqzzCFLaU9kuy81uNtqzweM9YaQPgWzxi9MwQ9jZ04g==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -766,8 +750,8 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-popper@1.2.8':
- resolution: {integrity: sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw==}
+ '@radix-ui/react-popover@1.1.17':
+ resolution: {integrity: sha512-/YSAOdJ7YJvdn7bn5sdSx2egW+SKY+u7O5RyAVs94Ymrg2fg5QTSFPMRkzvhGyFuE4/qsmPBdrwYoZMZh/4f+g==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -779,8 +763,8 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-portal@1.1.9':
- resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==}
+ '@radix-ui/react-popper@1.3.1':
+ resolution: {integrity: sha512-bhnq/0DEPTi2lsOD3J5rTL65qUKHbKbhqHsmN9TMiclSXpipi651ooUKPPp6G5lF/WiHBdn1s0Wuqsn+myVAvw==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -792,8 +776,8 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-presence@1.1.5':
- resolution: {integrity: sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==}
+ '@radix-ui/react-portal@1.1.12':
+ resolution: {integrity: sha512-m309havGzsjLHHaIX50G5PlvRs3xkgPCsGk/5PTvYm8D5q33yG0J7w/712PTOhid7NTaFETtnSXjngHQavvhVw==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -805,8 +789,8 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-primitive@2.1.3':
- resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==}
+ '@radix-ui/react-presence@1.1.6':
+ resolution: {integrity: sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -818,8 +802,8 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-roving-focus@1.1.11':
- resolution: {integrity: sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA==}
+ '@radix-ui/react-primitive@2.1.6':
+ resolution: {integrity: sha512-wetd0QI77DbvrPpTAvH1SqOxsYF2wZe5TNxqwOd5Ty4XDpV3dpV0s8K/1MGMJBeY5o7lg8ub5VIt1Ub+yVen6g==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -831,8 +815,8 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-scroll-area@1.2.10':
- resolution: {integrity: sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A==}
+ '@radix-ui/react-roving-focus@1.1.13':
+ resolution: {integrity: sha512-9gkwneI0guf8JDmrFxPjJF6Ozzgioyw+/lonYNCwefS9ZHA05er0BVHiXr+LbWGHxUfczvMY6G1oiZZi1VzjRw==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -844,8 +828,8 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-select@2.2.6':
- resolution: {integrity: sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ==}
+ '@radix-ui/react-scroll-area@1.2.12':
+ resolution: {integrity: sha512-xuafVzQiTCLsyEjakowTdG3OgTXsmO7IdCiO77otIa+z44xoLNs9Do5eg7POFumIOCjtG6djfm6RKUKpUa/csA==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -857,8 +841,8 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-slot@1.2.3':
- resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==}
+ '@radix-ui/react-slot@1.3.0':
+ resolution: {integrity: sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
@@ -866,17 +850,8 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-slot@1.2.4':
- resolution: {integrity: sha512-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA==}
- peerDependencies:
- '@types/react': '*'
- react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
- peerDependenciesMeta:
- '@types/react':
- optional: true
-
- '@radix-ui/react-tabs@1.1.13':
- resolution: {integrity: sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A==}
+ '@radix-ui/react-tabs@1.1.15':
+ resolution: {integrity: sha512-kxc9gI6/HfcU4nfMMVS3AmQK414kbU1IE6UCJmMmxjhO3cRPXOyYnmvyKD+ODt7q56nRq9l7Wovi6uaGwKgMlg==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -888,8 +863,8 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/react-use-callback-ref@1.1.1':
- resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==}
+ '@radix-ui/react-use-callback-ref@1.1.2':
+ resolution: {integrity: sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
@@ -897,8 +872,8 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-use-controllable-state@1.2.2':
- resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==}
+ '@radix-ui/react-use-controllable-state@1.2.3':
+ resolution: {integrity: sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
@@ -906,8 +881,8 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-use-effect-event@0.0.2':
- resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==}
+ '@radix-ui/react-use-effect-event@0.0.3':
+ resolution: {integrity: sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
@@ -915,8 +890,8 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-use-escape-keydown@1.1.1':
- resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==}
+ '@radix-ui/react-use-escape-keydown@1.1.2':
+ resolution: {integrity: sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
@@ -924,8 +899,8 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-use-layout-effect@1.1.1':
- resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==}
+ '@radix-ui/react-use-layout-effect@1.1.2':
+ resolution: {integrity: sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
@@ -933,8 +908,8 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-use-previous@1.1.1':
- resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==}
+ '@radix-ui/react-use-previous@1.1.2':
+ resolution: {integrity: sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
@@ -942,8 +917,8 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-use-rect@1.1.1':
- resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==}
+ '@radix-ui/react-use-rect@1.1.2':
+ resolution: {integrity: sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
@@ -951,8 +926,8 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-use-size@1.1.1':
- resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==}
+ '@radix-ui/react-use-size@1.1.2':
+ resolution: {integrity: sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
@@ -960,8 +935,8 @@ packages:
'@types/react':
optional: true
- '@radix-ui/react-visually-hidden@1.2.3':
- resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==}
+ '@radix-ui/react-visually-hidden@1.2.6':
+ resolution: {integrity: sha512-jCE0WljWifTI4niIMCll06kGpsJTAPiZVU9H4WR1N6qW7At9ystHbN7dDB+we2xH535roFHj7qKS+RGj0FMDWQ==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -973,52 +948,32 @@ packages:
'@types/react-dom':
optional: true
- '@radix-ui/rect@1.1.1':
- resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==}
-
- '@scalar/helpers@0.2.2':
- resolution: {integrity: sha512-oGef7vvtz1KgCy34IaVcbMV99dEXjcGETJtwogT4MU8R7gnYDg6qSTh5200hWAGVO+Ai/6h9rlGVfgeHTzelfg==}
- engines: {node: '>=20'}
-
- '@scalar/json-magic@0.8.6':
- resolution: {integrity: sha512-alxGHRJXgaefvfv9IISxb11D2y9iVyN+2/1dLBg3jJildkCJCP6yaT5ESC9qB+YOZeuuxIF32gmk+CLwx38YnQ==}
- engines: {node: '>=20'}
-
- '@scalar/openapi-parser@0.23.7':
- resolution: {integrity: sha512-OEuP+RM74YT7S11K9yHwuPq7bUnj+8ywCV5few73FY1szr90y39yGreLPcAmZ+SeC0HPhP4ZGKIhBCeSmuSL6Q==}
- engines: {node: '>=20'}
-
- '@scalar/openapi-types@0.5.3':
- resolution: {integrity: sha512-m4n/Su3K01d15dmdWO1LlqecdSPKuNjuokrJLdiQ485kW/hRHbXW1QP6tJL75myhw/XhX5YhYAR+jrwnGjXiMw==}
- engines: {node: '>=20'}
+ '@radix-ui/rect@1.1.2':
+ resolution: {integrity: sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA==}
- '@scalar/openapi-upgrader@0.1.6':
- resolution: {integrity: sha512-XdrNZUr0ASLfR89OS2zP6enbq9f7UGQQxov+a3WF1Wz9DClniAL2ChJ2fbGOrqL5F2kjbV6Fw/iO3bsBTMyLZA==}
- engines: {node: '>=20'}
+ '@shikijs/core@3.23.0':
+ resolution: {integrity: sha512-NSWQz0riNb67xthdm5br6lAkvpDJRTgB36fxlo37ZzM2yq0PQFFzbd8psqC2XMPgCzo1fW6cVi18+ArJ44wqgA==}
- '@shikijs/core@3.20.0':
- resolution: {integrity: sha512-f2ED7HYV4JEk827mtMDwe/yQ25pRiXZmtHjWF8uzZKuKiEsJR7Ce1nuQ+HhV9FzDcbIo4ObBCD9GPTzNuy9S1g==}
+ '@shikijs/engine-javascript@3.23.0':
+ resolution: {integrity: sha512-aHt9eiGFobmWR5uqJUViySI1bHMqrAgamWE1TYSUoftkAeCCAiGawPMwM+VCadylQtF4V3VNOZ5LmfItH5f3yA==}
- '@shikijs/engine-javascript@3.20.0':
- resolution: {integrity: sha512-OFx8fHAZuk7I42Z9YAdZ95To6jDePQ9Rnfbw9uSRTSbBhYBp1kEOKv/3jOimcj3VRUKusDYM6DswLauwfhboLg==}
+ '@shikijs/engine-oniguruma@3.23.0':
+ resolution: {integrity: sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g==}
- '@shikijs/engine-oniguruma@3.20.0':
- resolution: {integrity: sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ==}
+ '@shikijs/langs@3.23.0':
+ resolution: {integrity: sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg==}
- '@shikijs/langs@3.20.0':
- resolution: {integrity: sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA==}
+ '@shikijs/rehype@3.23.0':
+ resolution: {integrity: sha512-GepKJxXHbXFfAkiZZZ+4V7x71Lw3s0ALYmydUxJRdvpKjSx9FOMSaunv6WRLFBXR6qjYerUq1YZQno+2gLEPwA==}
- '@shikijs/rehype@3.20.0':
- resolution: {integrity: sha512-/sqob3V/lJK0m2mZ64nkcWPN88im0D9atkI3S3PUBvtJZTHnJXVwZhHQFRDyObgEIa37IpHYHR3CuFtXB5bT2g==}
+ '@shikijs/themes@3.23.0':
+ resolution: {integrity: sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA==}
- '@shikijs/themes@3.20.0':
- resolution: {integrity: sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ==}
+ '@shikijs/transformers@3.23.0':
+ resolution: {integrity: sha512-F9msZVxdF+krQNSdQ4V+Ja5QemeAoTQ2jxt7nJCwhDsdF1JWS3KxIQXA3lQbyKwS3J61oHRUSv4jYWv3CkaKTQ==}
- '@shikijs/transformers@3.20.0':
- resolution: {integrity: sha512-PrHHMRr3Q5W1qB/42kJW6laqFyWdhrPF2hNR9qjOm1xcSiAO3hAHo7HaVyHE6pMyevmy3i51O8kuGGXC78uK3g==}
-
- '@shikijs/types@3.20.0':
- resolution: {integrity: sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw==}
+ '@shikijs/types@3.23.0':
+ resolution: {integrity: sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ==}
'@shikijs/vscode-textmate@10.0.2':
resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==}
@@ -1029,65 +984,69 @@ packages:
'@swc/helpers@0.5.15':
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
- '@tailwindcss/node@4.1.18':
- resolution: {integrity: sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==}
+ '@tailwindcss/node@4.3.1':
+ resolution: {integrity: sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==}
- '@tailwindcss/oxide-android-arm64@4.1.18':
- resolution: {integrity: sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==}
- engines: {node: '>= 10'}
+ '@tailwindcss/oxide-android-arm64@4.3.1':
+ resolution: {integrity: sha512-SVlyf61g374l5cHyg8x9kf5xmLcOaxvOTsbsqDnSsDJaKOEFZ7GCvi84VAVGpxojYOs1+3K6M0UjXfqPU8vmOQ==}
+ engines: {node: '>= 20'}
cpu: [arm64]
os: [android]
- '@tailwindcss/oxide-darwin-arm64@4.1.18':
- resolution: {integrity: sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==}
- engines: {node: '>= 10'}
+ '@tailwindcss/oxide-darwin-arm64@4.3.1':
+ resolution: {integrity: sha512-hVnWLwv+e/l7c4WKyVtHVrIPvYdqWHjRB3MDIqARynzFtnQg85kmQEFCbV9Ja0VVx4xXTIiDWY60Y7iz/iNoDA==}
+ engines: {node: '>= 20'}
cpu: [arm64]
os: [darwin]
- '@tailwindcss/oxide-darwin-x64@4.1.18':
- resolution: {integrity: sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==}
- engines: {node: '>= 10'}
+ '@tailwindcss/oxide-darwin-x64@4.3.1':
+ resolution: {integrity: sha512-Cf7abu0WVgbhU7ANgPUnSAvm7nCvMweusHb8FnaHlLfv/Caq4GYaEZg7ZImzzmjx4lIAfuS8q+eLIS7A7IzxIg==}
+ engines: {node: '>= 20'}
cpu: [x64]
os: [darwin]
- '@tailwindcss/oxide-freebsd-x64@4.1.18':
- resolution: {integrity: sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==}
- engines: {node: '>= 10'}
+ '@tailwindcss/oxide-freebsd-x64@4.3.1':
+ resolution: {integrity: sha512-ZZqzX2Y+GXtXXfqSfpJhDm60OoZfvLHLCgm+J7NVqgHHJjG/m9ugZI77RwTsVd4fnBJuCFP6Ae6kTJb71UdS8g==}
+ engines: {node: '>= 20'}
cpu: [x64]
os: [freebsd]
- '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18':
- resolution: {integrity: sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==}
- engines: {node: '>= 10'}
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1':
+ resolution: {integrity: sha512-/Ah/xik0LaMYfv9DZ0S/t4pBlBNYOcqtRwusjgovHkvT8ixueWCLyJjsaF5kQIckjb4IT8Q6K6p/iPmZMixYgg==}
+ engines: {node: '>= 20'}
cpu: [arm]
os: [linux]
- '@tailwindcss/oxide-linux-arm64-gnu@4.1.18':
- resolution: {integrity: sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==}
- engines: {node: '>= 10'}
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.1':
+ resolution: {integrity: sha512-gqdFoVJlw444GvpnheZLHmvTzSxI/cOUUh2KSNejQjTcYkW062SVD+En0rUgD+QV91bz1XGIGtt1HJd48xUGbQ==}
+ engines: {node: '>= 20'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
- '@tailwindcss/oxide-linux-arm64-musl@4.1.18':
- resolution: {integrity: sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==}
- engines: {node: '>= 10'}
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.1':
+ resolution: {integrity: sha512-Bwv9KwOvE0VKa86xPFif9b9c3Y1NxOV1P0gLti/IYaWEsQYZXDlxfGEtA8mdDZ7SG3wyNXAWYT5SIn3giL57oA==}
+ engines: {node: '>= 20'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
- '@tailwindcss/oxide-linux-x64-gnu@4.1.18':
- resolution: {integrity: sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==}
- engines: {node: '>= 10'}
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.1':
+ resolution: {integrity: sha512-Ymi8O8T15HYQdOUWUtTI6ldN0neHP85FC+Qz32xTcZ7iJXtem/x8ITev0o1e9e5rkqj4lONZfTRLvkmin1+tKg==}
+ engines: {node: '>= 20'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
- '@tailwindcss/oxide-linux-x64-musl@4.1.18':
- resolution: {integrity: sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==}
- engines: {node: '>= 10'}
+ '@tailwindcss/oxide-linux-x64-musl@4.3.1':
+ resolution: {integrity: sha512-M+P/91qJ6uILLw4k2G93GMDRAXj61SMvFQYt39AqvUqYgExXpLL5aepfns7sj4HiAQeolirQF9E0lzRvdf4zPQ==}
+ engines: {node: '>= 20'}
cpu: [x64]
os: [linux]
+ libc: [musl]
- '@tailwindcss/oxide-wasm32-wasi@4.1.18':
- resolution: {integrity: sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==}
+ '@tailwindcss/oxide-wasm32-wasi@4.3.1':
+ resolution: {integrity: sha512-zsM8uOeqvVGHsAXsJxsT28ttosFahLJKCLOTUBqRAtKnVgGSRitds9T432QiT8b77Yga7JIBkulIRRlJPtYhRA==}
engines: {node: '>=14.0.0'}
cpu: [wasm32]
bundledDependencies:
@@ -1098,24 +1057,24 @@ packages:
- '@emnapi/wasi-threads'
- tslib
- '@tailwindcss/oxide-win32-arm64-msvc@4.1.18':
- resolution: {integrity: sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==}
- engines: {node: '>= 10'}
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.1':
+ resolution: {integrity: sha512-aiNvSq9BsVk8V513lDKlrCFAgf8qBMPZTpgEhInL+NwQqs97mYmupVMrPrgBBSL8Pv/0zXu9MrMF9rMun1ZeNg==}
+ engines: {node: '>= 20'}
cpu: [arm64]
os: [win32]
- '@tailwindcss/oxide-win32-x64-msvc@4.1.18':
- resolution: {integrity: sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==}
- engines: {node: '>= 10'}
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.1':
+ resolution: {integrity: sha512-xDEyu1rg290472FEGaKHnzyDyh5QH+AlWvsU5hMoMtPpzmKlRI0jaYKCgSHDYtaQWZOYbMaduSyCwFwY4n1HmA==}
+ engines: {node: '>= 20'}
cpu: [x64]
os: [win32]
- '@tailwindcss/oxide@4.1.18':
- resolution: {integrity: sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==}
- engines: {node: '>= 10'}
+ '@tailwindcss/oxide@4.3.1':
+ resolution: {integrity: sha512-yVPyo8RNkabVr3O2EhHEE0Rewu7YKzc1DhIqfL46LKveFrmu9XbDazNOJY7/GRuvw1h6u3utWnR29H/p5JPlgA==}
+ engines: {node: '>= 20'}
- '@tailwindcss/postcss@4.1.18':
- resolution: {integrity: sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==}
+ '@tailwindcss/postcss@4.3.1':
+ resolution: {integrity: sha512-dNJuNbdEJT/SWRuXTYP1WSamelsz3ztkUsdtWQPjrexysrTpaEPM40P/71knXiXLYEojqPOEGitVLLpPMS5T6A==}
'@types/d3-array@3.2.2':
resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==}
@@ -1189,8 +1148,8 @@ packages:
'@types/d3-selection@3.0.11':
resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==}
- '@types/d3-shape@3.1.7':
- resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==}
+ '@types/d3-shape@3.1.8':
+ resolution: {integrity: sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==}
'@types/d3-time-format@4.0.3':
resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==}
@@ -1210,14 +1169,14 @@ packages:
'@types/d3@7.4.3':
resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==}
- '@types/debug@4.1.12':
- resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+ '@types/debug@4.1.13':
+ resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==}
'@types/estree-jsx@1.0.5':
resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
- '@types/estree@1.0.8':
- resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+ '@types/estree@1.0.9':
+ resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==}
'@types/geojson@7946.0.16':
resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==}
@@ -1225,28 +1184,25 @@ packages:
'@types/hast@3.0.4':
resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
- '@types/json-schema@7.0.15':
- resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
-
'@types/mdast@4.0.4':
resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
- '@types/mdx@2.0.13':
- resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==}
+ '@types/mdx@2.0.14':
+ resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==}
'@types/ms@2.1.0':
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
- '@types/node@24.10.4':
- resolution: {integrity: sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==}
+ '@types/node@24.13.2':
+ resolution: {integrity: sha512-fRa09kZTgu8o71KFcDjUFuc7F+dEbZYZmkI0mg5YBTRs0yMKjYHsq/c0urDKeDb+D5qVgXOdFcuu+DZPKOITwA==}
'@types/react-dom@19.2.3':
resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==}
peerDependencies:
'@types/react': ^19.2.0
- '@types/react@19.2.7':
- resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==}
+ '@types/react@19.2.17':
+ resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==}
'@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
@@ -1257,38 +1213,22 @@ packages:
'@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
- '@ungap/structured-clone@1.3.0':
- resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
+ '@ungap/structured-clone@1.3.2':
+ resolution: {integrity: sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA==}
+
+ '@upsetjs/venn.js@2.0.0':
+ resolution: {integrity: sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw==}
acorn-jsx@5.3.2:
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
- acorn@8.15.0:
- resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==}
+ acorn@8.17.0:
+ resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==}
engines: {node: '>=0.4.0'}
hasBin: true
- ajv-draft-04@1.0.0:
- resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==}
- peerDependencies:
- ajv: ^8.5.0
- peerDependenciesMeta:
- ajv:
- optional: true
-
- ajv-formats@3.0.1:
- resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
- peerDependencies:
- ajv: ^8.0.0
- peerDependenciesMeta:
- ajv:
- optional: true
-
- ajv@8.17.1:
- resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
-
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
@@ -1303,8 +1243,8 @@ packages:
bail@2.0.2:
resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
- caniuse-lite@1.0.30001760:
- resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==}
+ caniuse-lite@1.0.30001799:
+ resolution: {integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==}
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
@@ -1321,14 +1261,6 @@ packages:
character-reference-invalid@2.0.1:
resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
- chevrotain-allstar@0.3.1:
- resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==}
- peerDependencies:
- chevrotain: ^11.0.0
-
- chevrotain@11.0.3:
- resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==}
-
chokidar@5.0.0:
resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
engines: {node: '>= 20.19.0'}
@@ -1360,9 +1292,6 @@ packages:
compute-scroll-into-view@3.1.1:
resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==}
- confbox@0.1.8:
- resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
-
cose-base@1.0.3:
resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==}
@@ -1387,8 +1316,8 @@ packages:
peerDependencies:
cytoscape: ^3.2.0
- cytoscape@3.33.1:
- resolution: {integrity: sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==}
+ cytoscape@3.34.0:
+ resolution: {integrity: sha512-62rNSrioXw93uliKFBwjukeQyeWwH2PqDrTac31r2P6464u3AUvTk0xS4LVvT251g7IgkFunrI48ZEZGjywSOg==}
engines: {node: '>=0.10'}
d3-array@2.12.1:
@@ -1447,8 +1376,8 @@ packages:
resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==}
engines: {node: '>=12'}
- d3-format@3.1.0:
- resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==}
+ d3-format@3.1.2:
+ resolution: {integrity: sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==}
engines: {node: '>=12'}
d3-geo@3.1.1:
@@ -1530,11 +1459,11 @@ packages:
resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==}
engines: {node: '>=12'}
- dagre-d3-es@7.0.13:
- resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==}
+ dagre-d3-es@7.0.14:
+ resolution: {integrity: sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg==}
- dayjs@1.11.19:
- resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==}
+ dayjs@1.11.21:
+ resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==}
debug@4.4.3:
resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
@@ -1545,11 +1474,11 @@ packages:
supports-color:
optional: true
- decode-named-character-reference@1.2.0:
- resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==}
+ decode-named-character-reference@1.3.0:
+ resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==}
- delaunator@5.0.1:
- resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==}
+ delaunator@5.1.0:
+ resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==}
dequal@2.0.3:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
@@ -1565,21 +1494,24 @@ packages:
devlop@1.1.0:
resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
- dompurify@3.3.1:
- resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==}
+ dompurify@3.4.11:
+ resolution: {integrity: sha512-zhlUV12GsaRzMsf9q5M254YhA4+VuF0fG+QFqu6aYpoGlKtz+w8//jBcGVYBgQkR5GHjUomejY84AV+/uPbWdw==}
- enhanced-resolve@5.18.4:
- resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==}
+ enhanced-resolve@5.21.6:
+ resolution: {integrity: sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==}
engines: {node: '>=10.13.0'}
+ es-toolkit@1.48.1:
+ resolution: {integrity: sha512-wfnXlwd5I75eXRtdD2vuEs50xHHESECDsGD7yiQnfFVNoa5522NwXEbmgo98LfiukSQHs+mBM7/YG3qKJB9/mQ==}
+
esast-util-from-estree@2.0.0:
resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==}
esast-util-from-js@2.0.1:
resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==}
- esbuild@0.27.2:
- resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==}
+ esbuild@0.27.7:
+ resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==}
engines: {node: '>=18'}
hasBin: true
@@ -1614,16 +1546,6 @@ packages:
extend@3.0.2:
resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
- fast-deep-equal@3.1.3:
- resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
-
- fast-uri@3.1.0:
- resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==}
-
- fast-xml-parser@4.5.3:
- resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==}
- hasBin: true
-
fdir@6.5.0:
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
engines: {node: '>=12.0.0'}
@@ -1633,9 +1555,6 @@ packages:
picomatch:
optional: true
- foreach@2.0.6:
- resolution: {integrity: sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==}
-
fumadocs-core@16.2.5:
resolution: {integrity: sha512-u07n2oQJ2XaEQpWOdCyJnICYEasQiZhTFNf40C+Q2AJ3kKFeiz42mHccea0t/sjfBbO9pEDHyvZVHhSf/Cm3AA==}
peerDependencies:
@@ -1696,21 +1615,6 @@ packages:
vite:
optional: true
- fumadocs-openapi@10.1.4:
- resolution: {integrity: sha512-6ndLFEO4fsgIZxpYWljOGjIqvCiYzgSS00Izv8keM1Bm4XkwbPi0FEr60um2UwRJxw7/YXkNQxUv1+nTch9wXQ==}
- peerDependencies:
- '@scalar/api-client-react': '*'
- '@types/react': '*'
- fumadocs-core: ^16.2.0
- fumadocs-ui: ^16.2.0
- react: ^19.2.0
- react-dom: ^19.2.0
- peerDependenciesMeta:
- '@scalar/api-client-react':
- optional: true
- '@types/react':
- optional: true
-
fumadocs-ui@16.2.5:
resolution: {integrity: sha512-pn16BD2CTk5vfzkxkRzSCzXOxn6ldon5StrUoxV4v6TkizkV5R6AfEyfX0wknVuWRu/2wgec9dLh3qu4R82zTQ==}
peerDependencies:
@@ -1767,6 +1671,9 @@ packages:
engines: {node: '>=16.x'}
hasBin: true
+ import-meta-resolve@4.2.0:
+ resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==}
+
inline-style-parser@0.2.7:
resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==}
@@ -1793,120 +1700,103 @@ packages:
resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
engines: {node: '>=12'}
- jiti@2.6.1:
- resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==}
+ jiti@2.7.0:
+ resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==}
hasBin: true
- js-yaml@4.1.1:
- resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==}
+ js-yaml@4.2.0:
+ resolution: {integrity: sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==}
hasBin: true
- json-pointer@0.6.2:
- resolution: {integrity: sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw==}
-
- json-schema-traverse@1.0.0:
- resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
-
- jsonpointer@5.0.1:
- resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==}
- engines: {node: '>=0.10.0'}
-
- katex@0.16.27:
- resolution: {integrity: sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==}
+ katex@0.16.47:
+ resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==}
hasBin: true
khroma@2.1.0:
resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==}
- langium@3.3.1:
- resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==}
- engines: {node: '>=16.0.0'}
-
layout-base@1.0.2:
resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==}
layout-base@2.0.1:
resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==}
- leven@4.1.0:
- resolution: {integrity: sha512-KZ9W9nWDT7rF7Dazg8xyLHGLrmpgq2nVNFUckhqdW3szVP6YhCpp/RAnpmVExA9JvrMynjwSLVrEj3AepHR6ew==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-
- lightningcss-android-arm64@1.30.2:
- resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==}
+ lightningcss-android-arm64@1.32.0:
+ resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [android]
- lightningcss-darwin-arm64@1.30.2:
- resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==}
+ lightningcss-darwin-arm64@1.32.0:
+ resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [darwin]
- lightningcss-darwin-x64@1.30.2:
- resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==}
+ lightningcss-darwin-x64@1.32.0:
+ resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [darwin]
- lightningcss-freebsd-x64@1.30.2:
- resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==}
+ lightningcss-freebsd-x64@1.32.0:
+ resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [freebsd]
- lightningcss-linux-arm-gnueabihf@1.30.2:
- resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==}
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
engines: {node: '>= 12.0.0'}
cpu: [arm]
os: [linux]
- lightningcss-linux-arm64-gnu@1.30.2:
- resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==}
+ lightningcss-linux-arm64-gnu@1.32.0:
+ resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
+ libc: [glibc]
- lightningcss-linux-arm64-musl@1.30.2:
- resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==}
+ lightningcss-linux-arm64-musl@1.32.0:
+ resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
+ libc: [musl]
- lightningcss-linux-x64-gnu@1.30.2:
- resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==}
+ lightningcss-linux-x64-gnu@1.32.0:
+ resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
+ libc: [glibc]
- lightningcss-linux-x64-musl@1.30.2:
- resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==}
+ lightningcss-linux-x64-musl@1.32.0:
+ resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
+ libc: [musl]
- lightningcss-win32-arm64-msvc@1.30.2:
- resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==}
+ lightningcss-win32-arm64-msvc@1.32.0:
+ resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [win32]
- lightningcss-win32-x64-msvc@1.30.2:
- resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==}
+ lightningcss-win32-x64-msvc@1.32.0:
+ resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [win32]
- lightningcss@1.30.2:
- resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==}
+ lightningcss@1.32.0:
+ resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
engines: {node: '>= 12.0.0'}
- lodash-es@4.17.21:
- resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
-
- lodash-es@4.17.22:
- resolution: {integrity: sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==}
+ lodash-es@4.18.1:
+ resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==}
lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
@@ -1937,8 +1827,8 @@ packages:
mdast-util-find-and-replace@3.0.2:
resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==}
- mdast-util-from-markdown@2.0.2:
- resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==}
+ mdast-util-from-markdown@2.0.3:
+ resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==}
mdast-util-gfm-autolink-literal@2.0.1:
resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
@@ -1982,8 +1872,8 @@ packages:
mdast-util-to-string@4.0.0:
resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
- mermaid@11.12.2:
- resolution: {integrity: sha512-n34QPDPEKmaeCG4WDMGy0OT6PSyxKCfy2pJgShP+Qow2KLrvWjclwbc3yXfSIf4BanqWEhQEpngWwNp/XhZt6w==}
+ mermaid@11.15.0:
+ resolution: {integrity: sha512-pTMbcf3rWdtLiYGpmoTjHEpeY8seiy6sR+9nD7LOs8KfUbHE4lOUAprTRqRAcWSQ6MQpdX+YEsxShtGsINtPtw==}
micromark-core-commonmark@2.0.3:
resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==}
@@ -2090,14 +1980,11 @@ packages:
micromark@4.0.2:
resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==}
- mlly@1.8.0:
- resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
-
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
- nanoid@3.3.11:
- resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
+ nanoid@3.3.15:
+ resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
@@ -2136,14 +2023,11 @@ packages:
resolution: {integrity: sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- oniguruma-parser@0.12.1:
- resolution: {integrity: sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==}
-
- oniguruma-to-es@4.3.4:
- resolution: {integrity: sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA==}
+ oniguruma-parser@0.12.2:
+ resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==}
- openapi-sampler@1.6.2:
- resolution: {integrity: sha512-NyKGiFKfSWAZr4srD/5WDhInOWDhfml32h/FKUqLpEwKJt0kG0LGUU0MdyNkKrVGuJnw6DuPWq/sHCwAMpiRxg==}
+ oniguruma-to-es@4.3.6:
+ resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==}
package-manager-detector@1.6.0:
resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==}
@@ -2154,56 +2038,44 @@ packages:
path-data-parser@0.1.0:
resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==}
- path-to-regexp@8.3.0:
- resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==}
-
- pathe@2.0.3:
- resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+ path-to-regexp@8.4.2:
+ resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==}
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
- picomatch@4.0.3:
- resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+ picomatch@4.0.4:
+ resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
engines: {node: '>=12'}
- pkg-types@1.3.1:
- resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
-
points-on-curve@0.2.0:
resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==}
points-on-path@0.2.1:
resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==}
- postcss-selector-parser@7.1.1:
- resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==}
+ postcss-selector-parser@7.1.4:
+ resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==}
engines: {node: '>=4'}
postcss@8.4.31:
resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
engines: {node: ^10 || ^12 || >=14}
- postcss@8.5.6:
- resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
+ postcss@8.5.15:
+ resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==}
engines: {node: ^10 || ^12 || >=14}
- property-information@7.1.0:
- resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==}
-
- react-dom@19.2.3:
- resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==}
- peerDependencies:
- react: ^19.2.3
+ property-information@7.2.0:
+ resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==}
- react-hook-form@7.68.0:
- resolution: {integrity: sha512-oNN3fjrZ/Xo40SWlHf1yCjlMK417JxoSJVUXQjGdvdRCU07NTFei1i1f8ApUAts+IVh14e4EdakeLEA+BEAs/Q==}
- engines: {node: '>=18.0.0'}
+ react-dom@19.2.7:
+ resolution: {integrity: sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==}
peerDependencies:
- react: ^16.8.0 || ^17 || ^18 || ^19
+ react: ^19.2.7
- react-medium-image-zoom@5.4.0:
- resolution: {integrity: sha512-BsE+EnFVQzFIlyuuQrZ9iTwyKpKkqdFZV1ImEQN573QPqGrIUuNni7aF+sZwDcxlsuOMayCr6oO/PZR/yJnbRg==}
+ react-medium-image-zoom@5.4.8:
+ resolution: {integrity: sha512-72CIldEUaPejjcaDOYIeDsGlWzNKpmxyKgiPi1LBCkWCIGHDLlA2KTeo2uNtmN/m72Y3k/2uWDfon9SDiPbHaA==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -2238,8 +2110,8 @@ packages:
'@types/react':
optional: true
- react@19.2.3:
- resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==}
+ react@19.2.7:
+ resolution: {integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==}
engines: {node: '>=0.10.0'}
readdirp@5.0.0:
@@ -2290,12 +2162,8 @@ packages:
remark@15.0.1:
resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==}
- require-from-string@2.0.2:
- resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
- engines: {node: '>=0.10.0'}
-
- robust-predicates@3.0.2:
- resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==}
+ robust-predicates@3.0.3:
+ resolution: {integrity: sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA==}
roughjs@4.6.6:
resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==}
@@ -2306,17 +2174,14 @@ packages:
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
- sax@1.4.3:
- resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==}
-
scheduler@0.27.0:
resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
scroll-into-view-if-needed@3.1.0:
resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==}
- semver@7.7.3:
- resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==}
+ semver@7.8.5:
+ resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==}
engines: {node: '>=10'}
hasBin: true
@@ -2324,8 +2189,8 @@ packages:
resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
- shiki@3.20.0:
- resolution: {integrity: sha512-kgCOlsnyWb+p0WU+01RjkCH+eBVsjL1jOwUYWv0YDWkM2/A46+LDKVs5yZCUXjJG6bj4ndFoAg5iLIIue6dulg==}
+ shiki@3.23.0:
+ resolution: {integrity: sha512-55Dj73uq9ZXL5zyeRPzHQsK7Nbyt6Y10k5s7OjuFZGMhpp4r/rsLBH0o/0fstIzX1Lep9VxefWljK/SKCzygIA==}
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
@@ -2341,9 +2206,6 @@ packages:
stringify-entities@4.0.4:
resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
- strnum@1.1.2:
- resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==}
-
style-to-js@1.1.21:
resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==}
@@ -2363,28 +2225,28 @@ packages:
babel-plugin-macros:
optional: true
- stylis@4.3.6:
- resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==}
+ stylis@4.4.0:
+ resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==}
- tailwind-merge@3.4.0:
- resolution: {integrity: sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==}
+ tailwind-merge@3.6.0:
+ resolution: {integrity: sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==}
- tailwindcss@4.1.18:
- resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==}
+ tailwindcss@4.3.1:
+ resolution: {integrity: sha512-hk+TB1m+K8CYNrP6rjQaq/Y+4Zylwpa87mLYBKCunwnnQ9p+fHb7kmSfGqyEJoxF/O6CDyABWVFEafNSYKll+Q==}
- tapable@2.3.0:
- resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==}
+ tapable@2.3.3:
+ resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==}
engines: {node: '>=6'}
third-party-capital@1.0.20:
resolution: {integrity: sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA==}
- tinyexec@1.0.2:
- resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==}
+ tinyexec@1.2.4:
+ resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==}
engines: {node: '>=18'}
- tinyglobby@0.2.15:
- resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ tinyglobby@0.2.17:
+ resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
engines: {node: '>=12.0.0'}
trim-lines@3.0.1:
@@ -2393,8 +2255,8 @@ packages:
trough@2.2.0:
resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
- ts-dedent@2.2.0:
- resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==}
+ ts-dedent@2.3.0:
+ resolution: {integrity: sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg==}
engines: {node: '>=6.10'}
tslib@2.8.1:
@@ -2405,11 +2267,8 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
- ufo@1.6.1:
- resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==}
-
- undici-types@7.16.0:
- resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==}
+ undici-types@7.18.2:
+ resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
unified@11.0.5:
resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
@@ -2432,8 +2291,8 @@ packages:
unist-util-visit-parents@6.0.2:
resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==}
- unist-util-visit@5.0.0:
- resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+ unist-util-visit@5.1.0:
+ resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==}
use-callback-ref@1.3.3:
resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
@@ -2458,8 +2317,8 @@ packages:
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
- uuid@11.1.0:
- resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==}
+ uuid@14.0.1:
+ resolution: {integrity: sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew==}
hasBin: true
vfile-message@4.0.3:
@@ -2468,37 +2327,8 @@ packages:
vfile@6.0.3:
resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
- vscode-jsonrpc@8.2.0:
- resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==}
- engines: {node: '>=14.0.0'}
-
- vscode-languageserver-protocol@3.17.5:
- resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==}
-
- vscode-languageserver-textdocument@1.0.12:
- resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==}
-
- vscode-languageserver-types@3.17.5:
- resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==}
-
- vscode-languageserver@9.0.1:
- resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==}
- hasBin: true
-
- vscode-uri@3.0.8:
- resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
-
- xml-js@1.6.11:
- resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==}
- hasBin: true
-
- yaml@2.8.2:
- resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==}
- engines: {node: '>= 14.6'}
- hasBin: true
-
- zod@4.2.1:
- resolution: {integrity: sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==}
+ zod@4.4.3:
+ resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==}
zwitch@2.0.4:
resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
@@ -2510,179 +2340,160 @@ snapshots:
'@antfu/install-pkg@1.1.0':
dependencies:
package-manager-detector: 1.6.0
- tinyexec: 1.0.2
+ tinyexec: 1.2.4
- '@biomejs/biome@2.3.10':
+ '@biomejs/biome@2.5.1':
optionalDependencies:
- '@biomejs/cli-darwin-arm64': 2.3.10
- '@biomejs/cli-darwin-x64': 2.3.10
- '@biomejs/cli-linux-arm64': 2.3.10
- '@biomejs/cli-linux-arm64-musl': 2.3.10
- '@biomejs/cli-linux-x64': 2.3.10
- '@biomejs/cli-linux-x64-musl': 2.3.10
- '@biomejs/cli-win32-arm64': 2.3.10
- '@biomejs/cli-win32-x64': 2.3.10
-
- '@biomejs/cli-darwin-arm64@2.3.10':
+ '@biomejs/cli-darwin-arm64': 2.5.1
+ '@biomejs/cli-darwin-x64': 2.5.1
+ '@biomejs/cli-linux-arm64': 2.5.1
+ '@biomejs/cli-linux-arm64-musl': 2.5.1
+ '@biomejs/cli-linux-x64': 2.5.1
+ '@biomejs/cli-linux-x64-musl': 2.5.1
+ '@biomejs/cli-win32-arm64': 2.5.1
+ '@biomejs/cli-win32-x64': 2.5.1
+
+ '@biomejs/cli-darwin-arm64@2.5.1':
optional: true
- '@biomejs/cli-darwin-x64@2.3.10':
+ '@biomejs/cli-darwin-x64@2.5.1':
optional: true
- '@biomejs/cli-linux-arm64-musl@2.3.10':
+ '@biomejs/cli-linux-arm64-musl@2.5.1':
optional: true
- '@biomejs/cli-linux-arm64@2.3.10':
+ '@biomejs/cli-linux-arm64@2.5.1':
optional: true
- '@biomejs/cli-linux-x64-musl@2.3.10':
+ '@biomejs/cli-linux-x64-musl@2.5.1':
optional: true
- '@biomejs/cli-linux-x64@2.3.10':
+ '@biomejs/cli-linux-x64@2.5.1':
optional: true
- '@biomejs/cli-win32-arm64@2.3.10':
+ '@biomejs/cli-win32-arm64@2.5.1':
optional: true
- '@biomejs/cli-win32-x64@2.3.10':
+ '@biomejs/cli-win32-x64@2.5.1':
optional: true
- '@braintree/sanitize-url@7.1.1': {}
+ '@braintree/sanitize-url@7.1.2': {}
- '@chevrotain/cst-dts-gen@11.0.3':
- dependencies:
- '@chevrotain/gast': 11.0.3
- '@chevrotain/types': 11.0.3
- lodash-es: 4.17.21
+ '@chevrotain/types@11.1.2': {}
- '@chevrotain/gast@11.0.3':
- dependencies:
- '@chevrotain/types': 11.0.3
- lodash-es: 4.17.21
-
- '@chevrotain/regexp-to-ast@11.0.3': {}
-
- '@chevrotain/types@11.0.3': {}
-
- '@chevrotain/utils@11.0.3': {}
-
- '@emnapi/runtime@1.7.1':
+ '@emnapi/runtime@1.11.1':
dependencies:
tslib: 2.8.1
optional: true
- '@esbuild/aix-ppc64@0.27.2':
+ '@esbuild/aix-ppc64@0.27.7':
optional: true
- '@esbuild/android-arm64@0.27.2':
+ '@esbuild/android-arm64@0.27.7':
optional: true
- '@esbuild/android-arm@0.27.2':
+ '@esbuild/android-arm@0.27.7':
optional: true
- '@esbuild/android-x64@0.27.2':
+ '@esbuild/android-x64@0.27.7':
optional: true
- '@esbuild/darwin-arm64@0.27.2':
+ '@esbuild/darwin-arm64@0.27.7':
optional: true
- '@esbuild/darwin-x64@0.27.2':
+ '@esbuild/darwin-x64@0.27.7':
optional: true
- '@esbuild/freebsd-arm64@0.27.2':
+ '@esbuild/freebsd-arm64@0.27.7':
optional: true
- '@esbuild/freebsd-x64@0.27.2':
+ '@esbuild/freebsd-x64@0.27.7':
optional: true
- '@esbuild/linux-arm64@0.27.2':
+ '@esbuild/linux-arm64@0.27.7':
optional: true
- '@esbuild/linux-arm@0.27.2':
+ '@esbuild/linux-arm@0.27.7':
optional: true
- '@esbuild/linux-ia32@0.27.2':
+ '@esbuild/linux-ia32@0.27.7':
optional: true
- '@esbuild/linux-loong64@0.27.2':
+ '@esbuild/linux-loong64@0.27.7':
optional: true
- '@esbuild/linux-mips64el@0.27.2':
+ '@esbuild/linux-mips64el@0.27.7':
optional: true
- '@esbuild/linux-ppc64@0.27.2':
+ '@esbuild/linux-ppc64@0.27.7':
optional: true
- '@esbuild/linux-riscv64@0.27.2':
+ '@esbuild/linux-riscv64@0.27.7':
optional: true
- '@esbuild/linux-s390x@0.27.2':
+ '@esbuild/linux-s390x@0.27.7':
optional: true
- '@esbuild/linux-x64@0.27.2':
+ '@esbuild/linux-x64@0.27.7':
optional: true
- '@esbuild/netbsd-arm64@0.27.2':
+ '@esbuild/netbsd-arm64@0.27.7':
optional: true
- '@esbuild/netbsd-x64@0.27.2':
+ '@esbuild/netbsd-x64@0.27.7':
optional: true
- '@esbuild/openbsd-arm64@0.27.2':
+ '@esbuild/openbsd-arm64@0.27.7':
optional: true
- '@esbuild/openbsd-x64@0.27.2':
+ '@esbuild/openbsd-x64@0.27.7':
optional: true
- '@esbuild/openharmony-arm64@0.27.2':
+ '@esbuild/openharmony-arm64@0.27.7':
optional: true
- '@esbuild/sunos-x64@0.27.2':
+ '@esbuild/sunos-x64@0.27.7':
optional: true
- '@esbuild/win32-arm64@0.27.2':
+ '@esbuild/win32-arm64@0.27.7':
optional: true
- '@esbuild/win32-ia32@0.27.2':
+ '@esbuild/win32-ia32@0.27.7':
optional: true
- '@esbuild/win32-x64@0.27.2':
+ '@esbuild/win32-x64@0.27.7':
optional: true
- '@floating-ui/core@1.7.3':
+ '@floating-ui/core@1.7.5':
dependencies:
- '@floating-ui/utils': 0.2.10
+ '@floating-ui/utils': 0.2.11
- '@floating-ui/dom@1.7.4':
+ '@floating-ui/dom@1.7.6':
dependencies:
- '@floating-ui/core': 1.7.3
- '@floating-ui/utils': 0.2.10
+ '@floating-ui/core': 1.7.5
+ '@floating-ui/utils': 0.2.11
- '@floating-ui/react-dom@2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@floating-ui/react-dom@2.1.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
dependencies:
- '@floating-ui/dom': 1.7.4
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@floating-ui/dom': 1.7.6
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
- '@floating-ui/utils@0.2.10': {}
+ '@floating-ui/utils@0.2.11': {}
'@formatjs/intl-localematcher@0.6.2':
dependencies:
tslib: 2.8.1
- '@fumari/json-schema-to-typescript@2.0.0':
- dependencies:
- js-yaml: 4.1.1
-
'@iconify/types@2.0.0': {}
- '@iconify/utils@3.1.0':
+ '@iconify/utils@3.1.3':
dependencies:
'@antfu/install-pkg': 1.1.0
'@iconify/types': 2.0.0
- mlly: 1.8.0
+ import-meta-resolve: 4.2.0
- '@img/colour@1.0.0':
+ '@img/colour@1.1.0':
optional: true
'@img/sharp-darwin-arm64@0.34.5':
@@ -2767,7 +2578,7 @@ snapshots:
'@img/sharp-wasm32@0.34.5':
dependencies:
- '@emnapi/runtime': 1.7.1
+ '@emnapi/runtime': 1.11.1
optional: true
'@img/sharp-win32-arm64@0.34.5':
@@ -2800,11 +2611,11 @@ snapshots:
'@mdx-js/mdx@3.1.1':
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
'@types/estree-jsx': 1.0.5
'@types/hast': 3.0.4
- '@types/mdx': 2.0.13
- acorn: 8.15.0
+ '@types/mdx': 2.0.14
+ acorn: 8.17.0
collapse-white-space: 2.1.0
devlop: 1.1.0
estree-util-is-identifier-name: 3.0.0
@@ -2813,7 +2624,7 @@ snapshots:
hast-util-to-jsx-runtime: 2.3.6
markdown-extensions: 2.0.0
recma-build-jsx: 1.0.0
- recma-jsx: 1.0.1(acorn@8.15.0)
+ recma-jsx: 1.0.1(acorn@8.17.0)
recma-stringify: 1.0.0
rehype-recma: 1.0.0
remark-mdx: 3.1.1
@@ -2823,14 +2634,14 @@ snapshots:
unified: 11.0.5
unist-util-position-from-estree: 2.0.0
unist-util-stringify-position: 4.0.0
- unist-util-visit: 5.0.0
+ unist-util-visit: 5.1.0
vfile: 6.0.3
transitivePeerDependencies:
- supports-color
- '@mermaid-js/parser@0.6.3':
+ '@mermaid-js/parser@1.1.1':
dependencies:
- langium: 3.3.1
+ '@chevrotain/types': 11.1.2
'@next/env@16.0.10': {}
@@ -2858,467 +2669,403 @@ snapshots:
'@next/swc-win32-x64-msvc@16.0.10':
optional: true
- '@next/third-parties@16.0.10(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)':
+ '@next/third-parties@16.2.9(next@16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)':
dependencies:
- next: 16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- react: 19.2.3
+ next: 16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ react: 19.2.7
third-party-capital: 1.0.20
- '@orama/orama@3.1.17': {}
+ '@orama/orama@3.1.18': {}
- '@radix-ui/number@1.1.1': {}
+ '@radix-ui/number@1.1.2': {}
- '@radix-ui/primitive@1.1.3': {}
+ '@radix-ui/primitive@1.1.4': {}
- '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@radix-ui/react-accordion@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@radix-ui/primitive': 1.1.4
+ '@radix-ui/react-collapsible': 1.1.14(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-collection': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-direction': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
- '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@radix-ui/react-arrow@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
+
+ '@radix-ui/react-collapsible@1.1.14(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.4
+ '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
- '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@radix-ui/react-collection@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
- '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-compose-refs@1.1.3(@types/react@19.2.17)(react@19.2.7)':
dependencies:
- react: 19.2.3
+ react: 19.2.7
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- '@radix-ui/react-context@1.1.2(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-context@1.1.4(@types/react@19.2.17)(react@19.2.7)':
dependencies:
- react: 19.2.3
+ react: 19.2.7
optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.17
+
+ '@radix-ui/react-dialog@1.1.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.4
+ '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-dismissable-layer': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-focus-guards': 1.1.4(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-focus-scope': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-portal': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.7)
aria-hidden: 1.2.6
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
- react-remove-scroll: 2.7.2(@types/react@19.2.7)(react@19.2.3)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+ react-remove-scroll: 2.7.2(@types/react@19.2.17)(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
- '@radix-ui/react-direction@1.1.1(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-direction@1.1.2(@types/react@19.2.17)(react@19.2.7)':
dependencies:
- react: 19.2.3
+ react: 19.2.7
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@radix-ui/react-dismissable-layer@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@radix-ui/primitive': 1.1.4
+ '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-use-escape-keydown': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
- '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-focus-guards@1.1.4(@types/react@19.2.17)(react@19.2.7)':
dependencies:
- react: 19.2.3
+ react: 19.2.7
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@radix-ui/react-focus-scope@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
- '@radix-ui/react-id@1.1.1(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-id@1.1.2(@types/react@19.2.17)(react@19.2.7)':
dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
+ '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@types/react': 19.2.17
+
+ '@radix-ui/react-navigation-menu@1.2.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.4
+ '@radix-ui/react-collection': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-direction': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-dismissable-layer': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-use-previous': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-visually-hidden': 1.2.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
+
+ '@radix-ui/react-popover@1.1.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.4
+ '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-dismissable-layer': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-focus-guards': 1.1.4(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-focus-scope': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-popper': 1.3.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-portal': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.7)
aria-hidden: 1.2.6
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
- react-remove-scroll: 2.7.2(@types/react@19.2.7)(react@19.2.3)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+ react-remove-scroll: 2.7.2(@types/react@19.2.17)(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
- dependencies:
- '@floating-ui/react-dom': 2.1.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/rect': 1.1.1
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
+
+ '@radix-ui/react-popper@1.3.1(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-arrow': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-use-rect': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-use-size': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/rect': 1.1.2
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
- '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@radix-ui/react-portal@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
- '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@radix-ui/react-presence@1.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
- '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@radix-ui/react-primitive@2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
dependencies:
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
+
+ '@radix-ui/react-roving-focus@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.4
+ '@radix-ui/react-collection': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-direction': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
- dependencies:
- '@radix-ui/number': 1.1.1
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
+
+ '@radix-ui/react-scroll-area@1.2.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@radix-ui/number': 1.1.2
+ '@radix-ui/primitive': 1.1.4
+ '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-direction': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
- dependencies:
- '@radix-ui/number': 1.1.1
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-slot': 1.2.3(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- aria-hidden: 1.2.6
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
- react-remove-scroll: 2.7.2(@types/react@19.2.7)(react@19.2.3)
- optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
-
- '@radix-ui/react-slot@1.2.3(@types/react@19.2.7)(react@19.2.3)':
- dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
- '@radix-ui/react-slot@1.2.4(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-slot@1.3.0(@types/react@19.2.17)(react@19.2.7)':
dependencies:
- '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
+ '@radix-ui/react-compose-refs': 1.1.3(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
optionalDependencies:
- '@types/react': 19.2.7
-
- '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
- dependencies:
- '@radix-ui/primitive': 1.1.3
- '@radix-ui/react-context': 1.1.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-id': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@types/react': 19.2.17
+
+ '@radix-ui/react-tabs@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.4
+ '@radix-ui/react-context': 1.1.4(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-direction': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-id': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-roving-focus': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-use-controllable-state': 1.2.3(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
- '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-use-callback-ref@1.1.2(@types/react@19.2.17)(react@19.2.7)':
dependencies:
- react: 19.2.3
+ react: 19.2.7
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-use-controllable-state@1.2.3(@types/react@19.2.17)(react@19.2.7)':
dependencies:
- '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
+ '@radix-ui/react-use-effect-event': 0.0.3(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-use-effect-event@0.0.3(@types/react@19.2.17)(react@19.2.7)':
dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
+ '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-use-escape-keydown@1.1.2(@types/react@19.2.17)(react@19.2.7)':
dependencies:
- '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
+ '@radix-ui/react-use-callback-ref': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-use-layout-effect@1.1.2(@types/react@19.2.17)(react@19.2.7)':
dependencies:
- react: 19.2.3
+ react: 19.2.7
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-use-previous@1.1.2(@types/react@19.2.17)(react@19.2.7)':
dependencies:
- react: 19.2.3
+ react: 19.2.7
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-use-rect@1.1.2(@types/react@19.2.17)(react@19.2.7)':
dependencies:
- '@radix-ui/rect': 1.1.1
- react: 19.2.3
+ '@radix-ui/rect': 1.1.2
+ react: 19.2.7
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- '@radix-ui/react-use-size@1.1.1(@types/react@19.2.7)(react@19.2.3)':
+ '@radix-ui/react-use-size@1.1.2(@types/react@19.2.17)(react@19.2.7)':
dependencies:
- '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- react: 19.2.3
+ '@radix-ui/react-use-layout-effect': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ react: 19.2.7
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
+ '@radix-ui/react-visually-hidden@1.2.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)':
dependencies:
- '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ '@radix-ui/react-primitive': 2.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
- '@types/react-dom': 19.2.3(@types/react@19.2.7)
+ '@types/react': 19.2.17
+ '@types/react-dom': 19.2.3(@types/react@19.2.17)
- '@radix-ui/rect@1.1.1': {}
-
- '@scalar/helpers@0.2.2': {}
-
- '@scalar/json-magic@0.8.6':
- dependencies:
- '@scalar/helpers': 0.2.2
- yaml: 2.8.2
-
- '@scalar/openapi-parser@0.23.7':
- dependencies:
- '@scalar/json-magic': 0.8.6
- '@scalar/openapi-types': 0.5.3
- '@scalar/openapi-upgrader': 0.1.6
- ajv: 8.17.1
- ajv-draft-04: 1.0.0(ajv@8.17.1)
- ajv-formats: 3.0.1(ajv@8.17.1)
- jsonpointer: 5.0.1
- leven: 4.1.0
- yaml: 2.8.2
-
- '@scalar/openapi-types@0.5.3':
- dependencies:
- zod: 4.2.1
-
- '@scalar/openapi-upgrader@0.1.6':
- dependencies:
- '@scalar/openapi-types': 0.5.3
+ '@radix-ui/rect@1.1.2': {}
- '@shikijs/core@3.20.0':
+ '@shikijs/core@3.23.0':
dependencies:
- '@shikijs/types': 3.20.0
+ '@shikijs/types': 3.23.0
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
hast-util-to-html: 9.0.5
- '@shikijs/engine-javascript@3.20.0':
+ '@shikijs/engine-javascript@3.23.0':
dependencies:
- '@shikijs/types': 3.20.0
+ '@shikijs/types': 3.23.0
'@shikijs/vscode-textmate': 10.0.2
- oniguruma-to-es: 4.3.4
+ oniguruma-to-es: 4.3.6
- '@shikijs/engine-oniguruma@3.20.0':
+ '@shikijs/engine-oniguruma@3.23.0':
dependencies:
- '@shikijs/types': 3.20.0
+ '@shikijs/types': 3.23.0
'@shikijs/vscode-textmate': 10.0.2
- '@shikijs/langs@3.20.0':
+ '@shikijs/langs@3.23.0':
dependencies:
- '@shikijs/types': 3.20.0
+ '@shikijs/types': 3.23.0
- '@shikijs/rehype@3.20.0':
+ '@shikijs/rehype@3.23.0':
dependencies:
- '@shikijs/types': 3.20.0
+ '@shikijs/types': 3.23.0
'@types/hast': 3.0.4
hast-util-to-string: 3.0.1
- shiki: 3.20.0
+ shiki: 3.23.0
unified: 11.0.5
- unist-util-visit: 5.0.0
+ unist-util-visit: 5.1.0
- '@shikijs/themes@3.20.0':
+ '@shikijs/themes@3.23.0':
dependencies:
- '@shikijs/types': 3.20.0
+ '@shikijs/types': 3.23.0
- '@shikijs/transformers@3.20.0':
+ '@shikijs/transformers@3.23.0':
dependencies:
- '@shikijs/core': 3.20.0
- '@shikijs/types': 3.20.0
+ '@shikijs/core': 3.23.0
+ '@shikijs/types': 3.23.0
- '@shikijs/types@3.20.0':
+ '@shikijs/types@3.23.0':
dependencies:
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
@@ -3331,74 +3078,74 @@ snapshots:
dependencies:
tslib: 2.8.1
- '@tailwindcss/node@4.1.18':
+ '@tailwindcss/node@4.3.1':
dependencies:
'@jridgewell/remapping': 2.3.5
- enhanced-resolve: 5.18.4
- jiti: 2.6.1
- lightningcss: 1.30.2
+ enhanced-resolve: 5.21.6
+ jiti: 2.7.0
+ lightningcss: 1.32.0
magic-string: 0.30.21
source-map-js: 1.2.1
- tailwindcss: 4.1.18
+ tailwindcss: 4.3.1
- '@tailwindcss/oxide-android-arm64@4.1.18':
+ '@tailwindcss/oxide-android-arm64@4.3.1':
optional: true
- '@tailwindcss/oxide-darwin-arm64@4.1.18':
+ '@tailwindcss/oxide-darwin-arm64@4.3.1':
optional: true
- '@tailwindcss/oxide-darwin-x64@4.1.18':
+ '@tailwindcss/oxide-darwin-x64@4.3.1':
optional: true
- '@tailwindcss/oxide-freebsd-x64@4.1.18':
+ '@tailwindcss/oxide-freebsd-x64@4.3.1':
optional: true
- '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18':
+ '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.1':
optional: true
- '@tailwindcss/oxide-linux-arm64-gnu@4.1.18':
+ '@tailwindcss/oxide-linux-arm64-gnu@4.3.1':
optional: true
- '@tailwindcss/oxide-linux-arm64-musl@4.1.18':
+ '@tailwindcss/oxide-linux-arm64-musl@4.3.1':
optional: true
- '@tailwindcss/oxide-linux-x64-gnu@4.1.18':
+ '@tailwindcss/oxide-linux-x64-gnu@4.3.1':
optional: true
- '@tailwindcss/oxide-linux-x64-musl@4.1.18':
+ '@tailwindcss/oxide-linux-x64-musl@4.3.1':
optional: true
- '@tailwindcss/oxide-wasm32-wasi@4.1.18':
+ '@tailwindcss/oxide-wasm32-wasi@4.3.1':
optional: true
- '@tailwindcss/oxide-win32-arm64-msvc@4.1.18':
+ '@tailwindcss/oxide-win32-arm64-msvc@4.3.1':
optional: true
- '@tailwindcss/oxide-win32-x64-msvc@4.1.18':
+ '@tailwindcss/oxide-win32-x64-msvc@4.3.1':
optional: true
- '@tailwindcss/oxide@4.1.18':
+ '@tailwindcss/oxide@4.3.1':
optionalDependencies:
- '@tailwindcss/oxide-android-arm64': 4.1.18
- '@tailwindcss/oxide-darwin-arm64': 4.1.18
- '@tailwindcss/oxide-darwin-x64': 4.1.18
- '@tailwindcss/oxide-freebsd-x64': 4.1.18
- '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.18
- '@tailwindcss/oxide-linux-arm64-gnu': 4.1.18
- '@tailwindcss/oxide-linux-arm64-musl': 4.1.18
- '@tailwindcss/oxide-linux-x64-gnu': 4.1.18
- '@tailwindcss/oxide-linux-x64-musl': 4.1.18
- '@tailwindcss/oxide-wasm32-wasi': 4.1.18
- '@tailwindcss/oxide-win32-arm64-msvc': 4.1.18
- '@tailwindcss/oxide-win32-x64-msvc': 4.1.18
-
- '@tailwindcss/postcss@4.1.18':
+ '@tailwindcss/oxide-android-arm64': 4.3.1
+ '@tailwindcss/oxide-darwin-arm64': 4.3.1
+ '@tailwindcss/oxide-darwin-x64': 4.3.1
+ '@tailwindcss/oxide-freebsd-x64': 4.3.1
+ '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.1
+ '@tailwindcss/oxide-linux-arm64-gnu': 4.3.1
+ '@tailwindcss/oxide-linux-arm64-musl': 4.3.1
+ '@tailwindcss/oxide-linux-x64-gnu': 4.3.1
+ '@tailwindcss/oxide-linux-x64-musl': 4.3.1
+ '@tailwindcss/oxide-wasm32-wasi': 4.3.1
+ '@tailwindcss/oxide-win32-arm64-msvc': 4.3.1
+ '@tailwindcss/oxide-win32-x64-msvc': 4.3.1
+
+ '@tailwindcss/postcss@4.3.1':
dependencies:
'@alloc/quick-lru': 5.2.0
- '@tailwindcss/node': 4.1.18
- '@tailwindcss/oxide': 4.1.18
- postcss: 8.5.6
- tailwindcss: 4.1.18
+ '@tailwindcss/node': 4.3.1
+ '@tailwindcss/oxide': 4.3.1
+ postcss: 8.5.15
+ tailwindcss: 4.3.1
'@types/d3-array@3.2.2': {}
@@ -3465,7 +3212,7 @@ snapshots:
'@types/d3-selection@3.0.11': {}
- '@types/d3-shape@3.1.7':
+ '@types/d3-shape@3.1.8':
dependencies:
'@types/d3-path': 3.1.1
@@ -3510,22 +3257,22 @@ snapshots:
'@types/d3-scale': 4.0.9
'@types/d3-scale-chromatic': 3.1.0
'@types/d3-selection': 3.0.11
- '@types/d3-shape': 3.1.7
+ '@types/d3-shape': 3.1.8
'@types/d3-time': 3.0.4
'@types/d3-time-format': 4.0.3
'@types/d3-timer': 3.0.2
'@types/d3-transition': 3.0.9
'@types/d3-zoom': 3.0.8
- '@types/debug@4.1.12':
+ '@types/debug@4.1.13':
dependencies:
'@types/ms': 2.1.0
'@types/estree-jsx@1.0.5':
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
- '@types/estree@1.0.8': {}
+ '@types/estree@1.0.9': {}
'@types/geojson@7946.0.16': {}
@@ -3533,25 +3280,23 @@ snapshots:
dependencies:
'@types/unist': 3.0.3
- '@types/json-schema@7.0.15': {}
-
'@types/mdast@4.0.4':
dependencies:
'@types/unist': 3.0.3
- '@types/mdx@2.0.13': {}
+ '@types/mdx@2.0.14': {}
'@types/ms@2.1.0': {}
- '@types/node@24.10.4':
+ '@types/node@24.13.2':
dependencies:
- undici-types: 7.16.0
+ undici-types: 7.18.2
- '@types/react-dom@19.2.3(@types/react@19.2.7)':
+ '@types/react-dom@19.2.3(@types/react@19.2.17)':
dependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- '@types/react@19.2.7':
+ '@types/react@19.2.17':
dependencies:
csstype: 3.2.3
@@ -3562,28 +3307,18 @@ snapshots:
'@types/unist@3.0.3': {}
- '@ungap/structured-clone@1.3.0': {}
-
- acorn-jsx@5.3.2(acorn@8.15.0):
- dependencies:
- acorn: 8.15.0
-
- acorn@8.15.0: {}
-
- ajv-draft-04@1.0.0(ajv@8.17.1):
- optionalDependencies:
- ajv: 8.17.1
+ '@ungap/structured-clone@1.3.2': {}
- ajv-formats@3.0.1(ajv@8.17.1):
+ '@upsetjs/venn.js@2.0.0':
optionalDependencies:
- ajv: 8.17.1
+ d3-selection: 3.0.0
+ d3-transition: 3.0.1(d3-selection@3.0.0)
- ajv@8.17.1:
+ acorn-jsx@5.3.2(acorn@8.17.0):
dependencies:
- fast-deep-equal: 3.1.3
- fast-uri: 3.1.0
- json-schema-traverse: 1.0.0
- require-from-string: 2.0.2
+ acorn: 8.17.0
+
+ acorn@8.17.0: {}
argparse@2.0.1: {}
@@ -3595,7 +3330,7 @@ snapshots:
bail@2.0.2: {}
- caniuse-lite@1.0.30001760: {}
+ caniuse-lite@1.0.30001799: {}
ccount@2.0.1: {}
@@ -3607,20 +3342,6 @@ snapshots:
character-reference-invalid@2.0.1: {}
- chevrotain-allstar@0.3.1(chevrotain@11.0.3):
- dependencies:
- chevrotain: 11.0.3
- lodash-es: 4.17.22
-
- chevrotain@11.0.3:
- dependencies:
- '@chevrotain/cst-dts-gen': 11.0.3
- '@chevrotain/gast': 11.0.3
- '@chevrotain/regexp-to-ast': 11.0.3
- '@chevrotain/types': 11.0.3
- '@chevrotain/utils': 11.0.3
- lodash-es: 4.17.21
-
chokidar@5.0.0:
dependencies:
readdirp: 5.0.0
@@ -3643,8 +3364,6 @@ snapshots:
compute-scroll-into-view@3.1.1: {}
- confbox@0.1.8: {}
-
cose-base@1.0.3:
dependencies:
layout-base: 1.0.2
@@ -3657,17 +3376,17 @@ snapshots:
csstype@3.2.3: {}
- cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.1):
+ cytoscape-cose-bilkent@4.1.0(cytoscape@3.34.0):
dependencies:
cose-base: 1.0.3
- cytoscape: 3.33.1
+ cytoscape: 3.34.0
- cytoscape-fcose@2.2.0(cytoscape@3.33.1):
+ cytoscape-fcose@2.2.0(cytoscape@3.34.0):
dependencies:
cose-base: 2.2.0
- cytoscape: 3.33.1
+ cytoscape: 3.34.0
- cytoscape@3.33.1: {}
+ cytoscape@3.34.0: {}
d3-array@2.12.1:
dependencies:
@@ -3699,7 +3418,7 @@ snapshots:
d3-delaunay@6.0.4:
dependencies:
- delaunator: 5.0.1
+ delaunator: 5.1.0
d3-dispatch@3.0.1: {}
@@ -3726,7 +3445,7 @@ snapshots:
d3-quadtree: 3.0.1
d3-timer: 3.0.1
- d3-format@3.1.0: {}
+ d3-format@3.1.2: {}
d3-geo@3.1.1:
dependencies:
@@ -3761,7 +3480,7 @@ snapshots:
d3-scale@4.0.2:
dependencies:
d3-array: 3.2.4
- d3-format: 3.1.0
+ d3-format: 3.1.2
d3-interpolate: 3.0.1
d3-time: 3.1.0
d3-time-format: 4.1.0
@@ -3818,7 +3537,7 @@ snapshots:
d3-ease: 3.0.1
d3-fetch: 3.0.1
d3-force: 3.0.0
- d3-format: 3.1.0
+ d3-format: 3.1.2
d3-geo: 3.1.1
d3-hierarchy: 3.1.2
d3-interpolate: 3.0.1
@@ -3836,24 +3555,24 @@ snapshots:
d3-transition: 3.0.1(d3-selection@3.0.0)
d3-zoom: 3.0.0
- dagre-d3-es@7.0.13:
+ dagre-d3-es@7.0.14:
dependencies:
d3: 7.9.0
- lodash-es: 4.17.22
+ lodash-es: 4.18.1
- dayjs@1.11.19: {}
+ dayjs@1.11.21: {}
debug@4.4.3:
dependencies:
ms: 2.1.3
- decode-named-character-reference@1.2.0:
+ decode-named-character-reference@1.3.0:
dependencies:
character-entities: 2.0.2
- delaunator@5.0.1:
+ delaunator@5.1.0:
dependencies:
- robust-predicates: 3.0.2
+ robust-predicates: 3.0.3
dequal@2.0.3: {}
@@ -3865,14 +3584,16 @@ snapshots:
dependencies:
dequal: 2.0.3
- dompurify@3.3.1:
+ dompurify@3.4.11:
optionalDependencies:
'@types/trusted-types': 2.0.7
- enhanced-resolve@5.18.4:
+ enhanced-resolve@5.21.6:
dependencies:
graceful-fs: 4.2.11
- tapable: 2.3.0
+ tapable: 2.3.3
+
+ es-toolkit@1.48.1: {}
esast-util-from-estree@2.0.0:
dependencies:
@@ -3884,44 +3605,44 @@ snapshots:
esast-util-from-js@2.0.1:
dependencies:
'@types/estree-jsx': 1.0.5
- acorn: 8.15.0
+ acorn: 8.17.0
esast-util-from-estree: 2.0.0
vfile-message: 4.0.3
- esbuild@0.27.2:
+ esbuild@0.27.7:
optionalDependencies:
- '@esbuild/aix-ppc64': 0.27.2
- '@esbuild/android-arm': 0.27.2
- '@esbuild/android-arm64': 0.27.2
- '@esbuild/android-x64': 0.27.2
- '@esbuild/darwin-arm64': 0.27.2
- '@esbuild/darwin-x64': 0.27.2
- '@esbuild/freebsd-arm64': 0.27.2
- '@esbuild/freebsd-x64': 0.27.2
- '@esbuild/linux-arm': 0.27.2
- '@esbuild/linux-arm64': 0.27.2
- '@esbuild/linux-ia32': 0.27.2
- '@esbuild/linux-loong64': 0.27.2
- '@esbuild/linux-mips64el': 0.27.2
- '@esbuild/linux-ppc64': 0.27.2
- '@esbuild/linux-riscv64': 0.27.2
- '@esbuild/linux-s390x': 0.27.2
- '@esbuild/linux-x64': 0.27.2
- '@esbuild/netbsd-arm64': 0.27.2
- '@esbuild/netbsd-x64': 0.27.2
- '@esbuild/openbsd-arm64': 0.27.2
- '@esbuild/openbsd-x64': 0.27.2
- '@esbuild/openharmony-arm64': 0.27.2
- '@esbuild/sunos-x64': 0.27.2
- '@esbuild/win32-arm64': 0.27.2
- '@esbuild/win32-ia32': 0.27.2
- '@esbuild/win32-x64': 0.27.2
+ '@esbuild/aix-ppc64': 0.27.7
+ '@esbuild/android-arm': 0.27.7
+ '@esbuild/android-arm64': 0.27.7
+ '@esbuild/android-x64': 0.27.7
+ '@esbuild/darwin-arm64': 0.27.7
+ '@esbuild/darwin-x64': 0.27.7
+ '@esbuild/freebsd-arm64': 0.27.7
+ '@esbuild/freebsd-x64': 0.27.7
+ '@esbuild/linux-arm': 0.27.7
+ '@esbuild/linux-arm64': 0.27.7
+ '@esbuild/linux-ia32': 0.27.7
+ '@esbuild/linux-loong64': 0.27.7
+ '@esbuild/linux-mips64el': 0.27.7
+ '@esbuild/linux-ppc64': 0.27.7
+ '@esbuild/linux-riscv64': 0.27.7
+ '@esbuild/linux-s390x': 0.27.7
+ '@esbuild/linux-x64': 0.27.7
+ '@esbuild/netbsd-arm64': 0.27.7
+ '@esbuild/netbsd-x64': 0.27.7
+ '@esbuild/openbsd-arm64': 0.27.7
+ '@esbuild/openbsd-x64': 0.27.7
+ '@esbuild/openharmony-arm64': 0.27.7
+ '@esbuild/sunos-x64': 0.27.7
+ '@esbuild/win32-arm64': 0.27.7
+ '@esbuild/win32-ia32': 0.27.7
+ '@esbuild/win32-x64': 0.27.7
escape-string-regexp@5.0.0: {}
estree-util-attach-comments@3.0.0:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
estree-util-build-jsx@3.0.1:
dependencies:
@@ -3934,7 +3655,7 @@ snapshots:
estree-util-scope@1.0.0:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
devlop: 1.1.0
estree-util-to-js@2.0.0:
@@ -3945,7 +3666,7 @@ snapshots:
estree-util-value-to-estree@3.5.0:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
estree-util-visit@2.0.0:
dependencies:
@@ -3954,30 +3675,20 @@ snapshots:
estree-walker@3.0.3:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
extend@3.0.2: {}
- fast-deep-equal@3.1.3: {}
-
- fast-uri@3.1.0: {}
-
- fast-xml-parser@4.5.3:
- dependencies:
- strnum: 1.1.2
-
- fdir@6.5.0(picomatch@4.0.3):
+ fdir@6.5.0(picomatch@4.0.4):
optionalDependencies:
- picomatch: 4.0.3
+ picomatch: 4.0.4
- foreach@2.0.6: {}
-
- fumadocs-core@16.2.5(@types/react@19.2.7)(lucide-react@0.556.0(react@19.2.3))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.2.1):
+ fumadocs-core@16.2.5(@types/react@19.2.17)(lucide-react@0.556.0(react@19.2.7))(next@16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3):
dependencies:
'@formatjs/intl-localematcher': 0.6.2
- '@orama/orama': 3.1.17
- '@shikijs/rehype': 3.20.0
- '@shikijs/transformers': 3.20.0
+ '@orama/orama': 3.1.18
+ '@shikijs/rehype': 3.23.0
+ '@shikijs/transformers': 3.23.0
estree-util-value-to-estree: 3.5.0
github-slugger: 2.0.0
hast-util-to-estree: 3.1.3
@@ -3985,107 +3696,75 @@ snapshots:
image-size: 2.0.2
negotiator: 1.0.0
npm-to-yarn: 3.0.1
- path-to-regexp: 8.3.0
+ path-to-regexp: 8.4.2
remark: 15.0.1
remark-gfm: 4.0.1
remark-rehype: 11.1.2
scroll-into-view-if-needed: 3.1.0
- shiki: 3.20.0
- unist-util-visit: 5.0.0
+ shiki: 3.23.0
+ unist-util-visit: 5.1.0
optionalDependencies:
- '@types/react': 19.2.7
- lucide-react: 0.556.0(react@19.2.3)
- next: 16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
- zod: 4.2.1
+ '@types/react': 19.2.17
+ lucide-react: 0.556.0(react@19.2.7)
+ next: 16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+ zod: 4.4.3
transitivePeerDependencies:
- supports-color
- fumadocs-mdx@14.1.1(fumadocs-core@16.2.5(@types/react@19.2.7)(lucide-react@0.556.0(react@19.2.3))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.2.1))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3):
+ fumadocs-mdx@14.1.1(fumadocs-core@16.2.5(@types/react@19.2.17)(lucide-react@0.556.0(react@19.2.7))(next@16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3))(next@16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7):
dependencies:
'@mdx-js/mdx': 3.1.1
'@standard-schema/spec': 1.1.0
chokidar: 5.0.0
- esbuild: 0.27.2
+ esbuild: 0.27.7
estree-util-value-to-estree: 3.5.0
- fumadocs-core: 16.2.5(@types/react@19.2.7)(lucide-react@0.556.0(react@19.2.3))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.2.1)
- js-yaml: 4.1.1
+ fumadocs-core: 16.2.5(@types/react@19.2.17)(lucide-react@0.556.0(react@19.2.7))(next@16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3)
+ js-yaml: 4.2.0
mdast-util-to-markdown: 2.1.2
picocolors: 1.1.1
- picomatch: 4.0.3
+ picomatch: 4.0.4
remark-mdx: 3.1.1
- tinyexec: 1.0.2
- tinyglobby: 0.2.15
+ tinyexec: 1.2.4
+ tinyglobby: 0.2.17
unified: 11.0.5
unist-util-remove-position: 5.0.0
- unist-util-visit: 5.0.0
+ unist-util-visit: 5.1.0
vfile: 6.0.3
- zod: 4.2.1
- optionalDependencies:
- next: 16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- react: 19.2.3
- transitivePeerDependencies:
- - supports-color
-
- fumadocs-openapi@10.1.4(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(fumadocs-core@16.2.5(@types/react@19.2.7)(lucide-react@0.556.0(react@19.2.3))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.2.1))(fumadocs-ui@16.2.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(lucide-react@0.556.0(react@19.2.3))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)(zod@4.2.1))(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
- dependencies:
- '@fumari/json-schema-to-typescript': 2.0.0
- '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-select': 2.2.6(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-slot': 1.2.4(@types/react@19.2.7)(react@19.2.3)
- '@scalar/json-magic': 0.8.6
- '@scalar/openapi-parser': 0.23.7
- ajv: 8.17.1
- class-variance-authority: 0.7.1
- fumadocs-core: 16.2.5(@types/react@19.2.7)(lucide-react@0.556.0(react@19.2.3))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.2.1)
- fumadocs-ui: 16.2.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(lucide-react@0.556.0(react@19.2.3))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)(zod@4.2.1)
- github-slugger: 2.0.0
- hast-util-to-jsx-runtime: 2.3.6
- js-yaml: 4.1.1
- next-themes: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- openapi-sampler: 1.6.2
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
- react-hook-form: 7.68.0(react@19.2.3)
- remark: 15.0.1
- remark-rehype: 11.1.2
- xml-js: 1.6.11
+ zod: 4.4.3
optionalDependencies:
- '@types/react': 19.2.7
+ next: 16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ react: 19.2.7
transitivePeerDependencies:
- - '@apidevtools/json-schema-ref-parser'
- - '@types/react-dom'
- - prettier
- supports-color
- fumadocs-ui@16.2.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(lucide-react@0.556.0(react@19.2.3))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.18)(zod@4.2.1):
- dependencies:
- '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-direction': 1.1.1(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- '@radix-ui/react-slot': 1.2.4(@types/react@19.2.7)(react@19.2.3)
- '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ fumadocs-ui@16.2.5(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(lucide-react@0.556.0(react@19.2.7))(next@16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(tailwindcss@4.3.1)(zod@4.4.3):
+ dependencies:
+ '@radix-ui/react-accordion': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-collapsible': 1.1.14(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-dialog': 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-direction': 1.1.2(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-navigation-menu': 1.2.16(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-popover': 1.1.17(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-presence': 1.1.6(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-scroll-area': 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ '@radix-ui/react-slot': 1.3.0(@types/react@19.2.17)(react@19.2.7)
+ '@radix-ui/react-tabs': 1.1.15(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
class-variance-authority: 0.7.1
- fumadocs-core: 16.2.5(@types/react@19.2.7)(lucide-react@0.556.0(react@19.2.3))(next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.2.1)
+ fumadocs-core: 16.2.5(@types/react@19.2.17)(lucide-react@0.556.0(react@19.2.7))(next@16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react-dom@19.2.7(react@19.2.7))(react@19.2.7)(zod@4.4.3)
lodash.merge: 4.6.2
- next-themes: 0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- postcss-selector-parser: 7.1.1
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
- react-medium-image-zoom: 5.4.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
+ next-themes: 0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ postcss-selector-parser: 7.1.4
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+ react-medium-image-zoom: 5.4.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
scroll-into-view-if-needed: 3.1.0
- tailwind-merge: 3.4.0
+ tailwind-merge: 3.6.0
optionalDependencies:
- '@types/react': 19.2.7
- next: 16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
- tailwindcss: 4.1.18
+ '@types/react': 19.2.17
+ next: 16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7)
+ tailwindcss: 4.3.1
transitivePeerDependencies:
- '@mixedbread/sdk'
- '@orama/core'
@@ -4108,7 +3787,7 @@ snapshots:
hast-util-to-estree@3.1.3:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
'@types/estree-jsx': 1.0.5
'@types/hast': 3.0.4
comma-separated-tokens: 2.0.3
@@ -4119,7 +3798,7 @@ snapshots:
mdast-util-mdx-expression: 2.0.1
mdast-util-mdx-jsx: 3.2.0
mdast-util-mdxjs-esm: 2.0.1
- property-information: 7.1.0
+ property-information: 7.2.0
space-separated-tokens: 2.0.2
style-to-js: 1.1.21
unist-util-position: 5.0.0
@@ -4136,14 +3815,14 @@ snapshots:
hast-util-whitespace: 3.0.0
html-void-elements: 3.0.0
mdast-util-to-hast: 13.2.1
- property-information: 7.1.0
+ property-information: 7.2.0
space-separated-tokens: 2.0.2
stringify-entities: 4.0.4
zwitch: 2.0.4
hast-util-to-jsx-runtime@2.3.6:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
'@types/hast': 3.0.4
'@types/unist': 3.0.3
comma-separated-tokens: 2.0.3
@@ -4153,7 +3832,7 @@ snapshots:
mdast-util-mdx-expression: 2.0.1
mdast-util-mdx-jsx: 3.2.0
mdast-util-mdxjs-esm: 2.0.1
- property-information: 7.1.0
+ property-information: 7.2.0
space-separated-tokens: 2.0.2
style-to-js: 1.1.21
unist-util-position: 5.0.0
@@ -4177,6 +3856,8 @@ snapshots:
image-size@2.0.2: {}
+ import-meta-resolve@4.2.0: {}
+
inline-style-parser@0.2.7: {}
internmap@1.0.1: {}
@@ -4196,100 +3877,80 @@ snapshots:
is-plain-obj@4.1.0: {}
- jiti@2.6.1: {}
+ jiti@2.7.0: {}
- js-yaml@4.1.1:
+ js-yaml@4.2.0:
dependencies:
argparse: 2.0.1
- json-pointer@0.6.2:
- dependencies:
- foreach: 2.0.6
-
- json-schema-traverse@1.0.0: {}
-
- jsonpointer@5.0.1: {}
-
- katex@0.16.27:
+ katex@0.16.47:
dependencies:
commander: 8.3.0
khroma@2.1.0: {}
- langium@3.3.1:
- dependencies:
- chevrotain: 11.0.3
- chevrotain-allstar: 0.3.1(chevrotain@11.0.3)
- vscode-languageserver: 9.0.1
- vscode-languageserver-textdocument: 1.0.12
- vscode-uri: 3.0.8
-
layout-base@1.0.2: {}
layout-base@2.0.1: {}
- leven@4.1.0: {}
-
- lightningcss-android-arm64@1.30.2:
+ lightningcss-android-arm64@1.32.0:
optional: true
- lightningcss-darwin-arm64@1.30.2:
+ lightningcss-darwin-arm64@1.32.0:
optional: true
- lightningcss-darwin-x64@1.30.2:
+ lightningcss-darwin-x64@1.32.0:
optional: true
- lightningcss-freebsd-x64@1.30.2:
+ lightningcss-freebsd-x64@1.32.0:
optional: true
- lightningcss-linux-arm-gnueabihf@1.30.2:
+ lightningcss-linux-arm-gnueabihf@1.32.0:
optional: true
- lightningcss-linux-arm64-gnu@1.30.2:
+ lightningcss-linux-arm64-gnu@1.32.0:
optional: true
- lightningcss-linux-arm64-musl@1.30.2:
+ lightningcss-linux-arm64-musl@1.32.0:
optional: true
- lightningcss-linux-x64-gnu@1.30.2:
+ lightningcss-linux-x64-gnu@1.32.0:
optional: true
- lightningcss-linux-x64-musl@1.30.2:
+ lightningcss-linux-x64-musl@1.32.0:
optional: true
- lightningcss-win32-arm64-msvc@1.30.2:
+ lightningcss-win32-arm64-msvc@1.32.0:
optional: true
- lightningcss-win32-x64-msvc@1.30.2:
+ lightningcss-win32-x64-msvc@1.32.0:
optional: true
- lightningcss@1.30.2:
+ lightningcss@1.32.0:
dependencies:
detect-libc: 2.1.2
optionalDependencies:
- lightningcss-android-arm64: 1.30.2
- lightningcss-darwin-arm64: 1.30.2
- lightningcss-darwin-x64: 1.30.2
- lightningcss-freebsd-x64: 1.30.2
- lightningcss-linux-arm-gnueabihf: 1.30.2
- lightningcss-linux-arm64-gnu: 1.30.2
- lightningcss-linux-arm64-musl: 1.30.2
- lightningcss-linux-x64-gnu: 1.30.2
- lightningcss-linux-x64-musl: 1.30.2
- lightningcss-win32-arm64-msvc: 1.30.2
- lightningcss-win32-x64-msvc: 1.30.2
-
- lodash-es@4.17.21: {}
-
- lodash-es@4.17.22: {}
+ lightningcss-android-arm64: 1.32.0
+ lightningcss-darwin-arm64: 1.32.0
+ lightningcss-darwin-x64: 1.32.0
+ lightningcss-freebsd-x64: 1.32.0
+ lightningcss-linux-arm-gnueabihf: 1.32.0
+ lightningcss-linux-arm64-gnu: 1.32.0
+ lightningcss-linux-arm64-musl: 1.32.0
+ lightningcss-linux-x64-gnu: 1.32.0
+ lightningcss-linux-x64-musl: 1.32.0
+ lightningcss-win32-arm64-msvc: 1.32.0
+ lightningcss-win32-x64-msvc: 1.32.0
+
+ lodash-es@4.18.1: {}
lodash.merge@4.6.2: {}
longest-streak@3.1.0: {}
- lucide-react@0.556.0(react@19.2.3):
+ lucide-react@0.556.0(react@19.2.7):
dependencies:
- react: 19.2.3
+ react: 19.2.7
magic-string@0.30.21:
dependencies:
@@ -4308,11 +3969,11 @@ snapshots:
unist-util-is: 6.0.1
unist-util-visit-parents: 6.0.2
- mdast-util-from-markdown@2.0.2:
+ mdast-util-from-markdown@2.0.3:
dependencies:
'@types/mdast': 4.0.4
'@types/unist': 3.0.3
- decode-named-character-reference: 1.2.0
+ decode-named-character-reference: 1.3.0
devlop: 1.1.0
mdast-util-to-string: 4.0.0
micromark: 4.0.2
@@ -4337,7 +3998,7 @@ snapshots:
dependencies:
'@types/mdast': 4.0.4
devlop: 1.1.0
- mdast-util-from-markdown: 2.0.2
+ mdast-util-from-markdown: 2.0.3
mdast-util-to-markdown: 2.1.2
micromark-util-normalize-identifier: 2.0.1
transitivePeerDependencies:
@@ -4346,7 +4007,7 @@ snapshots:
mdast-util-gfm-strikethrough@2.0.0:
dependencies:
'@types/mdast': 4.0.4
- mdast-util-from-markdown: 2.0.2
+ mdast-util-from-markdown: 2.0.3
mdast-util-to-markdown: 2.1.2
transitivePeerDependencies:
- supports-color
@@ -4356,7 +4017,7 @@ snapshots:
'@types/mdast': 4.0.4
devlop: 1.1.0
markdown-table: 3.0.4
- mdast-util-from-markdown: 2.0.2
+ mdast-util-from-markdown: 2.0.3
mdast-util-to-markdown: 2.1.2
transitivePeerDependencies:
- supports-color
@@ -4365,14 +4026,14 @@ snapshots:
dependencies:
'@types/mdast': 4.0.4
devlop: 1.1.0
- mdast-util-from-markdown: 2.0.2
+ mdast-util-from-markdown: 2.0.3
mdast-util-to-markdown: 2.1.2
transitivePeerDependencies:
- supports-color
mdast-util-gfm@3.1.0:
dependencies:
- mdast-util-from-markdown: 2.0.2
+ mdast-util-from-markdown: 2.0.3
mdast-util-gfm-autolink-literal: 2.0.1
mdast-util-gfm-footnote: 2.1.0
mdast-util-gfm-strikethrough: 2.0.0
@@ -4388,7 +4049,7 @@ snapshots:
'@types/hast': 3.0.4
'@types/mdast': 4.0.4
devlop: 1.1.0
- mdast-util-from-markdown: 2.0.2
+ mdast-util-from-markdown: 2.0.3
mdast-util-to-markdown: 2.1.2
transitivePeerDependencies:
- supports-color
@@ -4401,7 +4062,7 @@ snapshots:
'@types/unist': 3.0.3
ccount: 2.0.1
devlop: 1.1.0
- mdast-util-from-markdown: 2.0.2
+ mdast-util-from-markdown: 2.0.3
mdast-util-to-markdown: 2.1.2
parse-entities: 4.0.2
stringify-entities: 4.0.4
@@ -4412,7 +4073,7 @@ snapshots:
mdast-util-mdx@3.0.0:
dependencies:
- mdast-util-from-markdown: 2.0.2
+ mdast-util-from-markdown: 2.0.3
mdast-util-mdx-expression: 2.0.1
mdast-util-mdx-jsx: 3.2.0
mdast-util-mdxjs-esm: 2.0.1
@@ -4426,7 +4087,7 @@ snapshots:
'@types/hast': 3.0.4
'@types/mdast': 4.0.4
devlop: 1.1.0
- mdast-util-from-markdown: 2.0.2
+ mdast-util-from-markdown: 2.0.3
mdast-util-to-markdown: 2.1.2
transitivePeerDependencies:
- supports-color
@@ -4440,12 +4101,12 @@ snapshots:
dependencies:
'@types/hast': 3.0.4
'@types/mdast': 4.0.4
- '@ungap/structured-clone': 1.3.0
+ '@ungap/structured-clone': 1.3.2
devlop: 1.1.0
micromark-util-sanitize-uri: 2.0.1
trim-lines: 3.0.1
unist-util-position: 5.0.0
- unist-util-visit: 5.0.0
+ unist-util-visit: 5.1.0
vfile: 6.0.3
mdast-util-to-markdown@2.1.2:
@@ -4457,39 +4118,40 @@ snapshots:
mdast-util-to-string: 4.0.0
micromark-util-classify-character: 2.0.1
micromark-util-decode-string: 2.0.1
- unist-util-visit: 5.0.0
+ unist-util-visit: 5.1.0
zwitch: 2.0.4
mdast-util-to-string@4.0.0:
dependencies:
'@types/mdast': 4.0.4
- mermaid@11.12.2:
+ mermaid@11.15.0:
dependencies:
- '@braintree/sanitize-url': 7.1.1
- '@iconify/utils': 3.1.0
- '@mermaid-js/parser': 0.6.3
+ '@braintree/sanitize-url': 7.1.2
+ '@iconify/utils': 3.1.3
+ '@mermaid-js/parser': 1.1.1
'@types/d3': 7.4.3
- cytoscape: 3.33.1
- cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.1)
- cytoscape-fcose: 2.2.0(cytoscape@3.33.1)
+ '@upsetjs/venn.js': 2.0.0
+ cytoscape: 3.34.0
+ cytoscape-cose-bilkent: 4.1.0(cytoscape@3.34.0)
+ cytoscape-fcose: 2.2.0(cytoscape@3.34.0)
d3: 7.9.0
d3-sankey: 0.12.3
- dagre-d3-es: 7.0.13
- dayjs: 1.11.19
- dompurify: 3.3.1
- katex: 0.16.27
+ dagre-d3-es: 7.0.14
+ dayjs: 1.11.21
+ dompurify: 3.4.11
+ es-toolkit: 1.48.1
+ katex: 0.16.47
khroma: 2.1.0
- lodash-es: 4.17.22
marked: 16.4.2
roughjs: 4.6.6
- stylis: 4.3.6
- ts-dedent: 2.2.0
- uuid: 11.1.0
+ stylis: 4.4.0
+ ts-dedent: 2.3.0
+ uuid: 14.0.1
micromark-core-commonmark@2.0.3:
dependencies:
- decode-named-character-reference: 1.2.0
+ decode-named-character-reference: 1.3.0
devlop: 1.1.0
micromark-factory-destination: 2.0.1
micromark-factory-label: 2.0.1
@@ -4566,7 +4228,7 @@ snapshots:
micromark-extension-mdx-expression@3.0.1:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
devlop: 1.1.0
micromark-factory-mdx-expression: 2.0.3
micromark-factory-space: 2.0.1
@@ -4577,7 +4239,7 @@ snapshots:
micromark-extension-mdx-jsx@3.0.2:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
devlop: 1.1.0
estree-util-is-identifier-name: 3.0.0
micromark-factory-mdx-expression: 2.0.3
@@ -4594,7 +4256,7 @@ snapshots:
micromark-extension-mdxjs-esm@3.0.0:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
devlop: 1.1.0
micromark-core-commonmark: 2.0.3
micromark-util-character: 2.1.1
@@ -4606,8 +4268,8 @@ snapshots:
micromark-extension-mdxjs@3.0.0:
dependencies:
- acorn: 8.15.0
- acorn-jsx: 5.3.2(acorn@8.15.0)
+ acorn: 8.17.0
+ acorn-jsx: 5.3.2(acorn@8.17.0)
micromark-extension-mdx-expression: 3.0.1
micromark-extension-mdx-jsx: 3.0.2
micromark-extension-mdx-md: 2.0.0
@@ -4630,7 +4292,7 @@ snapshots:
micromark-factory-mdx-expression@2.0.3:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
devlop: 1.1.0
micromark-factory-space: 2.0.1
micromark-util-character: 2.1.1
@@ -4685,7 +4347,7 @@ snapshots:
micromark-util-decode-string@2.0.1:
dependencies:
- decode-named-character-reference: 1.2.0
+ decode-named-character-reference: 1.3.0
micromark-util-character: 2.1.1
micromark-util-decode-numeric-character-reference: 2.0.2
micromark-util-symbol: 2.0.1
@@ -4694,7 +4356,7 @@ snapshots:
micromark-util-events-to-acorn@2.0.3:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
'@types/unist': 3.0.3
devlop: 1.1.0
estree-util-visit: 2.0.0
@@ -4731,9 +4393,9 @@ snapshots:
micromark@4.0.2:
dependencies:
- '@types/debug': 4.1.12
+ '@types/debug': 4.1.13
debug: 4.4.3
- decode-named-character-reference: 1.2.0
+ decode-named-character-reference: 1.3.0
devlop: 1.1.0
micromark-core-commonmark: 2.0.3
micromark-factory-space: 2.0.1
@@ -4751,33 +4413,26 @@ snapshots:
transitivePeerDependencies:
- supports-color
- mlly@1.8.0:
- dependencies:
- acorn: 8.15.0
- pathe: 2.0.3
- pkg-types: 1.3.1
- ufo: 1.6.1
-
ms@2.1.3: {}
- nanoid@3.3.11: {}
+ nanoid@3.3.15: {}
negotiator@1.0.0: {}
- next-themes@0.4.6(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
+ next-themes@0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
dependencies:
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
- next@16.0.10(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
+ next@16.0.10(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
dependencies:
'@next/env': 16.0.10
'@swc/helpers': 0.5.15
- caniuse-lite: 1.0.30001760
+ caniuse-lite: 1.0.30001799
postcss: 8.4.31
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
- styled-jsx: 5.1.6(react@19.2.3)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
+ styled-jsx: 5.1.6(react@19.2.7)
optionalDependencies:
'@next/swc-darwin-arm64': 16.0.10
'@next/swc-darwin-x64': 16.0.10
@@ -4794,20 +4449,14 @@ snapshots:
npm-to-yarn@3.0.1: {}
- oniguruma-parser@0.12.1: {}
+ oniguruma-parser@0.12.2: {}
- oniguruma-to-es@4.3.4:
+ oniguruma-to-es@4.3.6:
dependencies:
- oniguruma-parser: 0.12.1
+ oniguruma-parser: 0.12.2
regex: 6.1.0
regex-recursion: 6.0.2
- openapi-sampler@1.6.2:
- dependencies:
- '@types/json-schema': 7.0.15
- fast-xml-parser: 4.5.3
- json-pointer: 0.6.2
-
package-manager-detector@1.6.0: {}
parse-entities@4.0.2:
@@ -4815,26 +4464,18 @@ snapshots:
'@types/unist': 2.0.11
character-entities-legacy: 3.0.0
character-reference-invalid: 2.0.1
- decode-named-character-reference: 1.2.0
+ decode-named-character-reference: 1.3.0
is-alphanumerical: 2.0.1
is-decimal: 2.0.1
is-hexadecimal: 2.0.1
path-data-parser@0.1.0: {}
- path-to-regexp@8.3.0: {}
-
- pathe@2.0.3: {}
+ path-to-regexp@8.4.2: {}
picocolors@1.1.1: {}
- picomatch@4.0.3: {}
-
- pkg-types@1.3.1:
- dependencies:
- confbox: 0.1.8
- mlly: 1.8.0
- pathe: 2.0.3
+ picomatch@4.0.4: {}
points-on-curve@0.2.0: {}
@@ -4843,80 +4484,76 @@ snapshots:
path-data-parser: 0.1.0
points-on-curve: 0.2.0
- postcss-selector-parser@7.1.1:
+ postcss-selector-parser@7.1.4:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
postcss@8.4.31:
dependencies:
- nanoid: 3.3.11
+ nanoid: 3.3.15
picocolors: 1.1.1
source-map-js: 1.2.1
- postcss@8.5.6:
+ postcss@8.5.15:
dependencies:
- nanoid: 3.3.11
+ nanoid: 3.3.15
picocolors: 1.1.1
source-map-js: 1.2.1
- property-information@7.1.0: {}
+ property-information@7.2.0: {}
- react-dom@19.2.3(react@19.2.3):
+ react-dom@19.2.7(react@19.2.7):
dependencies:
- react: 19.2.3
+ react: 19.2.7
scheduler: 0.27.0
- react-hook-form@7.68.0(react@19.2.3):
- dependencies:
- react: 19.2.3
-
- react-medium-image-zoom@5.4.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
+ react-medium-image-zoom@5.4.8(react-dom@19.2.7(react@19.2.7))(react@19.2.7):
dependencies:
- react: 19.2.3
- react-dom: 19.2.3(react@19.2.3)
+ react: 19.2.7
+ react-dom: 19.2.7(react@19.2.7)
- react-remove-scroll-bar@2.3.8(@types/react@19.2.7)(react@19.2.3):
+ react-remove-scroll-bar@2.3.8(@types/react@19.2.17)(react@19.2.7):
dependencies:
- react: 19.2.3
- react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.3)
+ react: 19.2.7
+ react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.2.7)
tslib: 2.8.1
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- react-remove-scroll@2.7.2(@types/react@19.2.7)(react@19.2.3):
+ react-remove-scroll@2.7.2(@types/react@19.2.17)(react@19.2.7):
dependencies:
- react: 19.2.3
- react-remove-scroll-bar: 2.3.8(@types/react@19.2.7)(react@19.2.3)
- react-style-singleton: 2.2.3(@types/react@19.2.7)(react@19.2.3)
+ react: 19.2.7
+ react-remove-scroll-bar: 2.3.8(@types/react@19.2.17)(react@19.2.7)
+ react-style-singleton: 2.2.3(@types/react@19.2.17)(react@19.2.7)
tslib: 2.8.1
- use-callback-ref: 1.3.3(@types/react@19.2.7)(react@19.2.3)
- use-sidecar: 1.1.3(@types/react@19.2.7)(react@19.2.3)
+ use-callback-ref: 1.3.3(@types/react@19.2.17)(react@19.2.7)
+ use-sidecar: 1.1.3(@types/react@19.2.17)(react@19.2.7)
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- react-style-singleton@2.2.3(@types/react@19.2.7)(react@19.2.3):
+ react-style-singleton@2.2.3(@types/react@19.2.17)(react@19.2.7):
dependencies:
get-nonce: 1.0.1
- react: 19.2.3
+ react: 19.2.7
tslib: 2.8.1
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- react@19.2.3: {}
+ react@19.2.7: {}
readdirp@5.0.0: {}
recma-build-jsx@1.0.0:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
estree-util-build-jsx: 3.0.1
vfile: 6.0.3
- recma-jsx@1.0.1(acorn@8.15.0):
+ recma-jsx@1.0.1(acorn@8.17.0):
dependencies:
- acorn: 8.15.0
- acorn-jsx: 5.3.2(acorn@8.15.0)
+ acorn: 8.17.0
+ acorn-jsx: 5.3.2(acorn@8.17.0)
estree-util-to-js: 2.0.0
recma-parse: 1.0.0
recma-stringify: 1.0.0
@@ -4924,14 +4561,14 @@ snapshots:
recma-parse@1.0.0:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
esast-util-from-js: 2.0.1
unified: 11.0.5
vfile: 6.0.3
recma-stringify@1.0.0:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
estree-util-to-js: 2.0.0
unified: 11.0.5
vfile: 6.0.3
@@ -4948,7 +4585,7 @@ snapshots:
rehype-recma@1.0.0:
dependencies:
- '@types/estree': 1.0.8
+ '@types/estree': 1.0.9
'@types/hast': 3.0.4
hast-util-to-estree: 3.1.3
transitivePeerDependencies:
@@ -4975,7 +4612,7 @@ snapshots:
remark-parse@11.0.0:
dependencies:
'@types/mdast': 4.0.4
- mdast-util-from-markdown: 2.0.2
+ mdast-util-from-markdown: 2.0.3
micromark-util-types: 2.0.2
unified: 11.0.5
transitivePeerDependencies:
@@ -5004,9 +4641,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
- require-from-string@2.0.2: {}
-
- robust-predicates@3.0.2: {}
+ robust-predicates@3.0.3: {}
roughjs@4.6.6:
dependencies:
@@ -5019,22 +4654,20 @@ snapshots:
safer-buffer@2.1.2: {}
- sax@1.4.3: {}
-
scheduler@0.27.0: {}
scroll-into-view-if-needed@3.1.0:
dependencies:
compute-scroll-into-view: 3.1.1
- semver@7.7.3:
+ semver@7.8.5:
optional: true
sharp@0.34.5:
dependencies:
- '@img/colour': 1.0.0
+ '@img/colour': 1.1.0
detect-libc: 2.1.2
- semver: 7.7.3
+ semver: 7.8.5
optionalDependencies:
'@img/sharp-darwin-arm64': 0.34.5
'@img/sharp-darwin-x64': 0.34.5
@@ -5062,14 +4695,14 @@ snapshots:
'@img/sharp-win32-x64': 0.34.5
optional: true
- shiki@3.20.0:
+ shiki@3.23.0:
dependencies:
- '@shikijs/core': 3.20.0
- '@shikijs/engine-javascript': 3.20.0
- '@shikijs/engine-oniguruma': 3.20.0
- '@shikijs/langs': 3.20.0
- '@shikijs/themes': 3.20.0
- '@shikijs/types': 3.20.0
+ '@shikijs/core': 3.23.0
+ '@shikijs/engine-javascript': 3.23.0
+ '@shikijs/engine-oniguruma': 3.23.0
+ '@shikijs/langs': 3.23.0
+ '@shikijs/themes': 3.23.0
+ '@shikijs/types': 3.23.0
'@shikijs/vscode-textmate': 10.0.2
'@types/hast': 3.0.4
@@ -5084,8 +4717,6 @@ snapshots:
character-entities-html4: 2.1.0
character-entities-legacy: 3.0.0
- strnum@1.1.2: {}
-
style-to-js@1.1.21:
dependencies:
style-to-object: 1.0.14
@@ -5094,41 +4725,39 @@ snapshots:
dependencies:
inline-style-parser: 0.2.7
- styled-jsx@5.1.6(react@19.2.3):
+ styled-jsx@5.1.6(react@19.2.7):
dependencies:
client-only: 0.0.1
- react: 19.2.3
+ react: 19.2.7
- stylis@4.3.6: {}
+ stylis@4.4.0: {}
- tailwind-merge@3.4.0: {}
+ tailwind-merge@3.6.0: {}
- tailwindcss@4.1.18: {}
+ tailwindcss@4.3.1: {}
- tapable@2.3.0: {}
+ tapable@2.3.3: {}
third-party-capital@1.0.20: {}
- tinyexec@1.0.2: {}
+ tinyexec@1.2.4: {}
- tinyglobby@0.2.15:
+ tinyglobby@0.2.17:
dependencies:
- fdir: 6.5.0(picomatch@4.0.3)
- picomatch: 4.0.3
+ fdir: 6.5.0(picomatch@4.0.4)
+ picomatch: 4.0.4
trim-lines@3.0.1: {}
trough@2.2.0: {}
- ts-dedent@2.2.0: {}
+ ts-dedent@2.3.0: {}
tslib@2.8.1: {}
typescript@5.9.3: {}
- ufo@1.6.1: {}
-
- undici-types@7.16.0: {}
+ undici-types@7.18.2: {}
unified@11.0.5:
dependencies:
@@ -5155,7 +4784,7 @@ snapshots:
unist-util-remove-position@5.0.0:
dependencies:
'@types/unist': 3.0.3
- unist-util-visit: 5.0.0
+ unist-util-visit: 5.1.0
unist-util-stringify-position@4.0.0:
dependencies:
@@ -5166,30 +4795,30 @@ snapshots:
'@types/unist': 3.0.3
unist-util-is: 6.0.1
- unist-util-visit@5.0.0:
+ unist-util-visit@5.1.0:
dependencies:
'@types/unist': 3.0.3
unist-util-is: 6.0.1
unist-util-visit-parents: 6.0.2
- use-callback-ref@1.3.3(@types/react@19.2.7)(react@19.2.3):
+ use-callback-ref@1.3.3(@types/react@19.2.17)(react@19.2.7):
dependencies:
- react: 19.2.3
+ react: 19.2.7
tslib: 2.8.1
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
- use-sidecar@1.1.3(@types/react@19.2.7)(react@19.2.3):
+ use-sidecar@1.1.3(@types/react@19.2.17)(react@19.2.7):
dependencies:
detect-node-es: 1.1.0
- react: 19.2.3
+ react: 19.2.7
tslib: 2.8.1
optionalDependencies:
- '@types/react': 19.2.7
+ '@types/react': 19.2.17
util-deprecate@1.0.2: {}
- uuid@11.1.0: {}
+ uuid@14.0.1: {}
vfile-message@4.0.3:
dependencies:
@@ -5201,29 +4830,6 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.3
- vscode-jsonrpc@8.2.0: {}
-
- vscode-languageserver-protocol@3.17.5:
- dependencies:
- vscode-jsonrpc: 8.2.0
- vscode-languageserver-types: 3.17.5
-
- vscode-languageserver-textdocument@1.0.12: {}
-
- vscode-languageserver-types@3.17.5: {}
-
- vscode-languageserver@9.0.1:
- dependencies:
- vscode-languageserver-protocol: 3.17.5
-
- vscode-uri@3.0.8: {}
-
- xml-js@1.6.11:
- dependencies:
- sax: 1.4.3
-
- yaml@2.8.2: {}
-
- zod@4.2.1: {}
+ zod@4.4.3: {}
zwitch@2.0.4: {}
diff --git a/public/graph-icon.png b/public/graph-icon.png
deleted file mode 100644
index dc821bc..0000000
Binary files a/public/graph-icon.png and /dev/null differ
diff --git a/scripts/generate-docs.ts b/scripts/generate-docs.ts
deleted file mode 100644
index 1b51de0..0000000
--- a/scripts/generate-docs.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { generateFiles } from "fumadocs-openapi";
-import { openapi } from "@/lib/openapi";
-void generateFiles({
- input: openapi,
- output: "./content/docs/graph/reference/api",
- // we recommend to enable it
- // make sure your endpoint description doesn't break MDX syntax.
- includeDescription: true,
- groupBy: "tag",
-});