diff --git a/.changeset/config.json b/.changeset/config.json index 1ac0bc9..5b08542 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -7,5 +7,10 @@ "access": "public", "baseBranch": "main", "updateInternalDependencies": "patch", - "ignore": ["@work-sdk/web"] + "ignore": [ + "@work-sdk/web", + "@work-sdk/video", + "@work-sdk/example-approval-cli", + "@work-sdk/example-webhook-bot" + ] } diff --git a/.gitignore b/.gitignore index bef70db..2221bb6 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,3 @@ coverage !.env.example npm-debug.log* work/ - -.vercel diff --git a/CHANGELOG.md b/CHANGELOG.md index 826b187..b3b26e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.5.0 — 2026-07-24 + +- Return action-specific commit receipts: `commit()` narrows its result type to + the prepared action (`CommitResultFor`), and replay receipts are validated + against the prepared action before being returned. +- Added compile-time API contract tests and a release gate that runs + package-lint and tarball smoke checks before publishing. + ## 0.4.0 — 2026-07-24 - Replaced the distributed-idempotency `get`/`set` recipe with an atomic @@ -24,6 +32,12 @@ landing-page documentation to describe real guarantees instead of overpromising exactly-once behavior. +## 0.3.1 — 2026-07-24 + +- Improved package discovery and evaluation with issue-tracker search metadata, + a credential-free safe-write example, a provider comparison, and clearer + guidance on when to use Work SDK. + ## 0.3.0 — 2026-07-24 - Added a GitLab.com and GitLab Self-Managed adapter with private-token and OAuth auth, search, pagination, Markdown notes, guarded labels, explicit issue-type maps, readback verification, and optimistic revision checks. diff --git a/apps/web/.gitignore b/apps/web/.gitignore index e985853..6f91e0c 100644 --- a/apps/web/.gitignore +++ b/apps/web/.gitignore @@ -1 +1,2 @@ .vercel +.source/ diff --git a/apps/web/app/api/search/route.ts b/apps/web/app/api/search/route.ts new file mode 100644 index 0000000..84ede84 --- /dev/null +++ b/apps/web/app/api/search/route.ts @@ -0,0 +1,5 @@ +import { createFromSource } from "fumadocs-core/search/server"; + +import { source } from "@/lib/source"; + +export const { GET } = createFromSource(source); diff --git a/apps/web/app/docs/[[...slug]]/page.tsx b/apps/web/app/docs/[[...slug]]/page.tsx new file mode 100644 index 0000000..1466b3f --- /dev/null +++ b/apps/web/app/docs/[[...slug]]/page.tsx @@ -0,0 +1,58 @@ +import type { Metadata } from "next"; +import { notFound } from "next/navigation"; +import { + DocsBody, + DocsDescription, + DocsPage, + DocsTitle, +} from "fumadocs-ui/layouts/docs/page"; + +import { createPageMetadata } from "@/lib/site"; +import { source } from "@/lib/source"; +import { getMDXComponents } from "@/mdx-components"; + +interface PageProps { + params: Promise<{ slug?: string[] }>; +} + +export default async function DocPage(props: PageProps) { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + const MDX = page.data.body; + + return ( + 0 }} + toc={page.data.toc} + > + {page.data.title} + {page.data.description} + + + + + ); +} + +export function generateStaticParams() { + return source.generateParams(); +} + +export async function generateMetadata(props: PageProps): Promise { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) notFound(); + + return createPageMetadata({ + title: page.data.seoTitle ?? page.data.title, + description: page.data.description ?? "", + path: page.url as `/${string}`, + ...(page.data.keywords ? { keywords: page.data.keywords } : {}), + }); +} diff --git a/apps/web/app/docs/concepts/safe-writes/page.tsx b/apps/web/app/docs/concepts/safe-writes/page.tsx deleted file mode 100644 index 1e66039..0000000 --- a/apps/web/app/docs/concepts/safe-writes/page.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import type { Metadata } from "next"; - -import { CodeBlock, DocsCallout, DocsNext, DocsShell } from "@/components/docs-shell"; -import { createPageMetadata } from "@/lib/site"; - -export const metadata: Metadata = createPageMetadata({ - title: "Safe writes for AI agents", - description: "Understand Work SDK's prepare, inspect, and commit protocol for idempotent, conflict-safe work tracker writes.", - path: "/docs/concepts/safe-writes", - keywords: ["safe AI agent writes", "idempotent API writes", "optimistic concurrency"], -}); - -const anatomy = `type PreparedWorkChange = - | { action: "create"; input: CreateWorkItemInput; targetId?: never } - | { action: "update"; input: UpdateWorkItemInput; - targetId: string; current: WorkItem; expectedRevision: string } - | { action: "comment"; input: AddCommentInput; - targetId: string; current: WorkItem; expectedRevision: string }; - -// Every variant also contains provider, changes, warnings, summary, -// preparedAt, id, and an integrity fingerprint.`; - -const conflict = `try { - await work.commit(change, { idempotencyKey }); -} catch (error) { - if (error instanceof WorkConflictError) { - // Never patch the old plan or force the write. - const replacement = await work.prepareUpdate(change.targetId!, change.input); - return requestApproval(replacement); - } - throw error; -}`; - -export default function SafeWritesPage() { - return -

Why a protocol?

A direct API call combines intent, provider translation, authorization, and an irreversible effect. Agents are especially vulnerable to retry ambiguity and stale context. Work SDK separates decision time from mutation time.

Normalized intent→Prepared plan→Policy / approval→Provider write
-

Prepared plan anatomy

Plans are serializable and contain no credentials. The current snapshot explains the diff; expectedRevision makes the later commit conditional.

-

Integrity fingerprint

The fingerprint covers every signed plan field. If application code or an agent mutates the reviewed input, changes, warnings, target, or revision, commit rejects the plan before any provider request.

The fingerprint detects accidental mutation. It is not a user-authentication signature and should not be treated as one across untrusted boundaries.

-

Concurrency guarantees

Update and comment plans capture the item's opaque revision. Commit re-reads the item and fails closed if it changed. capabilities.concurrency reports whether the final provider mutation is atomic, uses a best-effort preflight, or has no protection. Azure DevOps updates use an atomic JSON Patch test /rev; GitHub, GitLab, Linear, and Jira retain a small read-to-write race window.

-

Idempotency

The default memory store atomically coordinates retries inside one process. Serverless, clustered, and job systems must supply a durable store with an atomic claim. Keys should identify the business event, for example github:webhook:delivery-123:comment, not the attempt. Work SDK binds each key to the normalized provider, action, target, and input.

Same key + completed intentReturn the stored receipt with replayed: true.
Same key + active intentFail with WorkInFlightError; do not start a second write.
Uncertain provider outcomeFail with WorkAmbiguousCommitError and require reconciliation.
Same key + different intentFail with WorkConflictError before a provider mutation.

Durability alone is insufficient. A store implemented as separate get and set operations can still duplicate writes across workers.

-

Warnings and approval

Warnings describe lossy mappings, ambiguous values, unsupported fields, or provider limitations. Commit requires acceptWarnings: true when warnings exist, forcing the caller to acknowledge them explicitly.

Acceptance means “the caller reviewed this risk.” It does not make an impossible provider operation possible; an adapter can still reject invalid or unsupported input.

- -
; -} diff --git a/apps/web/app/docs/docs.css b/apps/web/app/docs/docs.css new file mode 100644 index 0000000..6e3900a --- /dev/null +++ b/apps/web/app/docs/docs.css @@ -0,0 +1,24 @@ +@import "tailwindcss"; +@import "fumadocs-ui/css/neutral.css"; +@import "fumadocs-ui/css/preset.css"; + +.work-docs-layout { + --fd-layout-width: 1400px; + min-height: calc(100dvh - 68px); + background: var(--bg); +} + +.work-docs-layout #nd-sidebar { + border-color: var(--line); + background: color-mix(in srgb, var(--bg) 94%, transparent); +} + +.work-docs-layout #nd-page { + min-width: 0; +} + +@media (max-width: 760px) { + .work-docs-layout { + min-height: calc(100dvh - 62px); + } +} diff --git a/apps/web/app/docs/examples/page.tsx b/apps/web/app/docs/examples/page.tsx deleted file mode 100644 index 3cf6ec8..0000000 --- a/apps/web/app/docs/examples/page.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import type { Metadata } from "next"; - -import { CodeBlock, DocsCallout, DocsNext, DocsShell } from "@/components/docs-shell"; -import { createPageMetadata, site } from "@/lib/site"; - -export const metadata: Metadata = createPageMetadata({ - title: "TypeScript example apps", - description: "Run complete Work SDK example applications locally with fake credentials, then connect GitHub, GitLab, Linear, Jira, or Azure DevOps.", - path: "/docs/examples", - keywords: ["Work SDK examples", "TypeScript webhook bot", "AI agent approval CLI"], -}); - -const approvalEnv = `WORK_PROVIDER=azure-devops -WORK_ITEM_ID=42 -WORK_TARGET_STATE=Ready for validation - -# Fake values — replace only in your private .env -AZURE_DEVOPS_ORGANIZATION=acme-example -AZURE_DEVOPS_PROJECT=Platform -AZURE_DEVOPS_AUTH=entra -AZURE_DEVOPS_TOKEN=azure_example_not_a_real_token`; - -const webhookEvent = `{ - "id": "deploy_example_20260712_001", - "status": "succeeded", - "environment": "staging", - "commit": "4cae7d53fb5d2da17ec7a4f342e28c31e95fdcb2", - "url": "https://deployments.example.com/runs/deploy_example_20260712_001" -}`; - -export default function ExamplesPage() { - return ( - -

Every committed token, account, domain, project, and webhook secret in these examples is intentionally fake. Both apps default to WORK_PROVIDER=memory and make no external network request.

- -
-

Safe fake credentials

-

Each app includes a tracked .env.example. Copy it to the ignored .env file, select one provider, and replace only that provider's values. Fake values consistently contain example or use reserved example domains.

- -
- -
-

Example 01

-

Interactive approval CLI

-

A terminal application that prepares an update, prints the exact diff and warnings, asks for explicit approval, and commits the reviewed plan with a stable idempotency key. Typing anything except yes exits without a provider mutation.

-
Prepare→Print diff→Type yes→Commit
-

Run the local demo

- -

Connect a provider

- -

Browse the Approval CLI source →

-
- -
-

Example 02

-

Idempotent deployment webhook bot

-

A small HTTP service built with Node core APIs. It verifies an HMAC-SHA256 signature, validates a deployment event, prepares a Markdown comment, and uses the event ID as a business-stable idempotency key. Repeated deliveries return replayed: true.

- -

Run both sides locally

- -

The app also exposes GET /health, rejects invalid signatures before a provider call, limits request bodies to 64 KiB, and returns small JSON receipts.

-

Browse the Webhook Bot source →

-
- -
-

Before production

-
- - - - - -
Demo defaultProduction replacement
Memory adapterAuthenticated GitHub, GitLab, Linear, Jira, or Azure DevOps adapter
Memory idempotency storeTransactional database or conditional durable store with atomic claims
Local fake webhook secretSecret-manager value with rotation
Direct HTTP processingQueue, retry policy, reconciliation, and dead-letter handling
Console outputStructured redacted logs and audit receipts
-
- - -
- ); -} diff --git a/apps/web/app/docs/getting-started/page.tsx b/apps/web/app/docs/getting-started/page.tsx deleted file mode 100644 index b61820c..0000000 --- a/apps/web/app/docs/getting-started/page.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import type { Metadata } from "next"; - -import { CodeBlock, DocsCallout, DocsNext, DocsShell } from "@/components/docs-shell"; -import { createPageMetadata } from "@/lib/site"; - -export const metadata: Metadata = createPageMetadata({ - title: "Getting started with Work SDK", - description: "Install the Work SDK TypeScript package and complete your first provider read and safe write.", - path: "/docs/getting-started", - keywords: ["install Work SDK", "TypeScript SDK quickstart", "work-sdk npm"], -}); - -const configure = `import { createWorkClient } from "work-sdk"; -import { linear } from "work-sdk/linear"; - -export const work = createWorkClient({ - adapter: linear({ - apiKey: process.env.LINEAR_API_KEY!, - teamId: process.env.LINEAR_TEAM_ID!, - }), -});`; - -const read = `const item = await work.get("ENG-123"); - -console.log({ - id: item.identifier, - state: item.state, // normalized - stateName: item.stateName, // provider-native - revision: item.revision, // opaque: never parse it -}); - -const page = await work.list({ - state: ["unstarted", "started"], - labels: ["reliability"], - limit: 25, -});`; - -const write = `const change = await work.prepareComment("ENG-123", { - body: "Implemented and verified in staging.", -}); - -// Persist or render this plan before committing it. -console.log(change.summary); -console.table(change.changes); - -const receipt = await work.commit(change, { - idempotencyKey: "deploy:2026-07-12:ENG-123", -}); - -console.log(receipt.replayed);`; - -export default function GettingStartedPage() { - return -

Requirements

  • Node.js 20 or newer
  • TypeScript 5+ recommended
  • Server-side credentials for at least one provider

Do not instantiate authenticated adapters in browser bundles. Provider tokens must never enter client-side code, model prompts, prepared plans, or logs.

-

Install

The package has zero runtime dependencies and publishes ESM, CommonJS, and declarations for every subpath.

-

Configure a client

Create one client per provider configuration. The adapter owns credentials and provider-specific routing; the client owns safe-write semantics.

-

Read normalized work

Use normalized fields for portable behavior and stateName or raw when a provider-native detail matters.

-

Write safely

A repeated successful idempotency key returns the stored receipt with replayed: true instead of performing the mutation again.

-

Production checklist

  • Use a durable IdempotencyStore with an atomic claim across processes.
  • Inspect every warning before setting acceptWarnings: true.
  • On WorkConflictError, discard the plan and prepare again.
  • On WorkAmbiguousCommitError, reconcile provider state before another write.
  • Pass AbortSignal from request or job cancellation.
  • Check work.capabilities before exposing optional actions.
- -
; -} diff --git a/apps/web/app/docs/guides/agents/page.tsx b/apps/web/app/docs/guides/agents/page.tsx deleted file mode 100644 index 2ed4cf9..0000000 --- a/apps/web/app/docs/guides/agents/page.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import type { Metadata } from "next"; - -import { CodeBlock, DocsCallout, DocsNext, DocsShell } from "@/components/docs-shell"; -import { createPageMetadata } from "@/lib/site"; - -export const metadata: Metadata = createPageMetadata({ - title: "AI agent integration guide", - description: "Design safe coding-agent tools with prepared changes, approval gates, idempotency, and conflict recovery.", - path: "/docs/guides/agents", - keywords: ["AI agent tools", "coding agent SDK", "human approval workflow"], -}); - -const tool = `const prepareUpdateTool = { - name: "prepare_work_item_update", - description: "Prepare, but do not commit, a work-item update.", - inputSchema: updateSchemaFor(work.capabilities), - execute: ({ id, update }, { signal }) => - work.prepareUpdate(id, update, { signal }), -}; - -const commitTool = { - name: "commit_approved_work_change", - description: "Commit an already approved prepared change.", - inputSchema: approvedChangeReferenceSchema, - execute: async ({ approvalId }, { signal }) => { - const { change, idempotencyKey } = await approvals.consume(approvalId); - return work.commit(change, { idempotencyKey, acceptWarnings: true, signal }); - }, -};`; - -export default function AgentsGuidePage() { - return -

Separate prepare and commit

A single “update ticket” tool hides the most important boundary. Prefer a proposal tool that returns a plan and a commit tool that accepts only a trusted approval reference.

Do not let the model manufacture acceptWarnings, approval IDs, stored plans, or idempotency keys. Resolve those values inside trusted code.

-

Derive schemas from capabilities

Remove unsupported fields at tool-construction time. Limit single-assignee providers to one entry and hide comments, parents, priorities, or states when the configured adapter cannot represent them.

-

Approval records

Store the entire prepared change, the displayed summary/diff, actor, policy result, timestamp, and approval scope. Commit the exact stored plan; never rebuild it from a model-produced summary.

Approval binds to fingerprintIf any signed plan field changes, commit fails and approval must restart.
-

Business-derived keys

Use stable trigger identity. Random attempt IDs defeat replay protection; vague keys can incorrectly deduplicate distinct effects.

-

Conflict recovery

When another actor changes the item after inspection, surface the conflict to the agent or user, prepare again from current state, show the new diff, and obtain new approval. Never mutate expectedRevision or force the stale write.

-

Operational rules

  1. Credentials never enter prompts, tool results, or prepared-plan storage.
  2. Read tools may be broader than write tools.
  3. Prepare before any externally visible mutation.
  4. Inspect all warnings and exact field changes.
  5. Require policy or human approval where impact warrants it.
  6. Commit stored plans with durable idempotency keys.
  7. Redact provider details before returning errors to a model.
  8. Audit receipts, not secrets or raw authorization data.
- -
; -} diff --git a/apps/web/app/docs/guides/testing/page.tsx b/apps/web/app/docs/guides/testing/page.tsx deleted file mode 100644 index 1ef153f..0000000 --- a/apps/web/app/docs/guides/testing/page.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import type { Metadata } from "next"; - -import { CodeBlock, DocsCallout, DocsShell } from "@/components/docs-shell"; -import { createPageMetadata } from "@/lib/site"; - -export const metadata: Metadata = createPageMetadata({ - title: "Testing Work SDK integrations", - description: "Test Work SDK clients, AI agent flows, and custom issue tracker adapters deterministically.", - path: "/docs/guides/testing", - keywords: ["Work SDK testing", "issue tracker adapter tests", "AI agent integration tests"], -}); - -const memory = `import { createWorkClient } from "work-sdk"; -import { memoryWorkAdapter, workItemFixture } from "work-sdk/testing"; - -const adapter = memoryWorkAdapter({ - items: [workItemFixture({ - id: "42", - identifier: "TEST-42", - title: "Initial title", - })], - now: () => new Date("2026-01-01T00:00:00Z"), -}); - -const work = createWorkClient({ - adapter, - now: () => new Date("2026-01-01T00:00:00Z"), -});`; - -const mockFetch = `const fetch = vi.fn(async (input, init) => { - const url = new URL(String(input)); - - if (url.pathname.endsWith("/_apis/wit/wiql")) { - return Response.json({ workItems: [{ id: 42 }] }); - } - - return Response.json(azureWorkItemFixture); -}); - -const adapter = azureDevOps({ - organization: "acme", - project: "Platform", - fetch, -});`; - -export default function TestingGuidePage() { - return -

Memory adapter

The memory adapter implements the full contract, clones returned values, advances revisions, supports capability overrides, and honors abort signals.

-

Test critical scenarios

  • Prepared plan contains the expected exact diff.
  • Mutating a plan causes fingerprint rejection.
  • Warnings block commit until explicitly acknowledged.
  • A repeated completed key returns replayed: true.
  • Two independent clients sharing one store perform one mutation.
  • A lost provider response becomes WorkAmbiguousCommitError and blocks retry.
  • A stale revision raises WorkConflictError.
  • Abort signals prevent provider calls.
-

Provider protocol tests

Every first-party adapter accepts an injected WHATWG-compatible fetch. Assert URLs, authentication, escaped queries, request bodies, pagination, readback, and error normalization without network traffic.

Prefer real Request, Response, and Headers objects in mocks. They catch casing, status, body-consumption, and header behavior that plain objects hide.

-

Custom adapter contract

The repository exports a reusable internal conformance suite for first-party development. External adapters should verify the same invariants: stable identity, cloned reads, pagination, revision advancement, conflicts, comments, and cancellation.

- -
; -} diff --git a/apps/web/app/docs/layout.tsx b/apps/web/app/docs/layout.tsx new file mode 100644 index 0000000..3fe4ebe --- /dev/null +++ b/apps/web/app/docs/layout.tsx @@ -0,0 +1,23 @@ +import type { ReactNode } from "react"; +import { DocsLayout } from "fumadocs-ui/layouts/docs"; + +import { site } from "@/lib/site"; +import { source } from "@/lib/source"; + +import "./docs.css"; + +export default function DocumentationLayout({ children }: Readonly<{ children: ReactNode }>) { + return ( + + {children} + + ); +} diff --git a/apps/web/app/docs/page.tsx b/apps/web/app/docs/page.tsx deleted file mode 100644 index 605c653..0000000 --- a/apps/web/app/docs/page.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import type { Metadata } from "next"; -import Link from "next/link"; - -import { CodeBlock, DocsCallout, DocsNext, DocsShell } from "@/components/docs-shell"; -import { createPageMetadata } from "@/lib/site"; - -export const metadata: Metadata = createPageMetadata({ - title: "Documentation", - description: "Learn Work SDK from first install through production-safe agent writes across GitHub, GitLab, Linear, Jira, and Azure DevOps.", - path: "/docs", - keywords: ["Work SDK documentation", "TypeScript issue tracker SDK", "AI agent work item API"], -}); - -const firstWrite = `import { createWorkClient } from "work-sdk"; -import { github } from "work-sdk/github"; - -const work = createWorkClient({ - adapter: github({ - owner: "acme", - repo: "api", - token: process.env.GITHUB_TOKEN!, - }), -}); - -const change = await work.prepareUpdate("481", { - state: "closed", -}); - -console.log(change.changes, change.warnings); - -const result = await work.commit(change, { - idempotencyKey: "merge:acme/api#481", -});`; - -export default function DocsPage() { - return ( - -

Work SDK is a local TypeScript library. Credentials stay in your process and requests go directly to the configured tracker.

- -
-

Choose a path

-
- 01

Build your first integration

Install the package, configure a provider, read an item, and commit a safe update.

- 02

Add Azure DevOps

Configure Entra or PAT auth, custom processes, WIQL search, priorities, and parent links.

- 03

Give it to an agent

Design narrow tools, approval gates, stable idempotency keys, and conflict recovery.

- 04

Look up the API

Review every client method, normalized type, capability, and commit receipt.

- 05

Run a real example app

Try an approval CLI or signed webhook bot locally with safe fake credentials.

-
-
- -
-

Your first safe write

-

Provider adapters are separate subpath exports. Your application gets one normalized client without pulling unused provider code into the bundle.

- - -

prepareUpdate reads the current item and creates an integrity-protected plan. No provider mutation occurs until commit.

-
- -
-

The mental model

-
    -
  1. Prepare intent.Validate input, read current state, calculate an exact diff, and capture the expected revision.
  2. -
  3. Inspect consequences.Evaluate field changes and provider warnings in code, an approval UI, or an agent policy.
  4. -
  5. Commit once.Verify the plan fingerprint and revision, then write with a stable idempotency key.
  6. -
-
- -
-

Provider support

-
- - - - - -
ProviderImportProtocolDistinctive behavior
GitHub Issueswork-sdk/githubRESTOpen/closed state reasons, multiple assignees
GitLabwork-sdk/gitlabREST v4Self-Managed, guarded labels, explicit type maps
Linearwork-sdk/linearGraphQLCursor pagination, team workflow resolution
Jira Cloudwork-sdk/jiraREST v3ADF rich text, workflow transitions
Azure DevOpswork-sdk/azure-devopsREST + WIQLJSON Patch revisions, custom processes, parent relations
-
- - -
- ); -} diff --git a/apps/web/app/docs/providers/azure-devops/page.tsx b/apps/web/app/docs/providers/azure-devops/page.tsx deleted file mode 100644 index 14fc42c..0000000 --- a/apps/web/app/docs/providers/azure-devops/page.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import type { Metadata } from "next"; - -import { CodeBlock, DocsCallout, DocsNext, DocsShell } from "@/components/docs-shell"; -import { createPageMetadata } from "@/lib/site"; - -export const metadata: Metadata = createPageMetadata({ - title: "Azure DevOps TypeScript SDK adapter", - description: "Configure Azure DevOps authentication, work-item normalization, WIQL search, JSON Patch revisions, and safe writes.", - path: "/docs/providers/azure-devops", - keywords: ["Azure DevOps TypeScript SDK", "Azure DevOps work items API", "WIQL SDK"], -}); - -const entra = `import { createWorkClient } from "work-sdk"; -import { azureDevOps } from "work-sdk/azure-devops"; - -const work = createWorkClient({ - adapter: azureDevOps({ - organization: "acme", - project: "Platform", - auth: { type: "entra", token: accessToken }, - }), -});`; - -const customProcess = `const adapter = azureDevOps({ - organization: "acme", - project: "Platform", - auth: { type: "entra", token: accessToken }, - - // Provider state name → normalized read/filter state - stateMap: { - "Ready for validation": "started", - "Released": "completed", - }, - - // Normalized write state → one concrete tenant state - stateNameByCanonical: { - completed: "Released", - }, - - // Provider type name → normalized read kind - workItemTypeMap: { - "Customer Request": "story", - }, - - // Normalized create kind → tenant-specific provider type - workItemTypeByKind: { - story: "Product Backlog Item", - }, - - defaultWorkItemType: "Task", -});`; - -const operations = `const page = await work.list({ - query: "retry webhook", - state: "started", - labels: ["reliability"], - limit: 50, -}); - -const change = await work.prepareUpdate("42", { - state: "Ready for validation", // exact Azure state name - priority: "high", // maps to Azure priority 2 - assigneeIds: ["ada@example.com"], - labels: ["sdk", "agent-safe"], - parentId: "10", -}); - -await work.commit(change, { - idempotencyKey: "release:42:validation", -});`; - -export default function AzureDevOpsPage() { - return -

Setup

The adapter targets Azure DevOps REST API 7.1. The organization and project are path-scoped, so an accidentally supplied foreign project is rejected rather than silently redirected.

-

Authentication

Microsoft Entra ID

Use Entra access tokens for production applications, service principals, or managed identities.

Personal access token

PATs are convenient for local scripts and prototypes. They are sent as Basic credentials with an empty username.

PATs are long-lived credentials. Prefer Entra tokens in production, scope credentials to work-item access, rotate them, and keep them out of browser code and agent context.

-

Custom processes

Azure organizations can rename states and introduce custom work-item types. Reads must map provider names to the portable model; creates need the reverse mapping. Work SDK keeps both directions explicit.

Built-in defaults cover common Agile, Scrum, and Basic process names. Custom entries extend or override those case-insensitive defaults.

-

Read, search, and write

Provider-native state values remain accepted. Canonical writes such as completed use stateNameByCanonical; if several tenant names map to the same canonical state and no inverse is configured, the adapter fails as ambiguous instead of guessing.

-

Field mapping

- -
Work SDKAzure DevOpsNotes
titleSystem.TitleRequired on create
descriptionSystem.DescriptionReturned as provider HTML
stateNameSystem.StateExact provider state
priorityMicrosoft.VSTS.Common.Priorityurgent/high/medium/low → 1/2/3/4
assigneeIds[0]System.AssignedToIdentity ID, email, or resolvable name
labelsSystem.TagsSemicolon-separated provider field
parentIdHierarchy-Reverse relationExisting parent replaced atomically
revisionrevOpaque string to consumers
-

WIQL search and pagination

list builds an escaped WIQL query, fetches ordered IDs, and hydrates pages through the batch work-item endpoint. Cursors are opaque and scoped to this adapter.

  • Maximum page size: 100
  • WIQL window: 20,000 results
  • Batch hydration: at most 100 items per SDK page
  • State filters use the configured state-name map

WIQL offset pagination is not a snapshot. For long-running crawls, items changing between pages can move in the order. Use targeted filters and restart a crawl when strict snapshot semantics matter.

-

Native revision protection

Prepared updates capture Azure's numeric rev. Commit first rechecks the normalized revision, then sends a JSON Patch test operation against /rev in the same mutation request. A stale write fails as WorkConflictError.

-

Azure DevOps Server and proxies

apiBaseUrl replaces https://dev.azure.com/{organization}. Point it at the collection root; the adapter appends the encoded project and API paths.

-

Known boundaries

  • Boards, iterations, area paths, attachments, relations other than parent, and custom fields are outside the portable v0.x model.
  • Descriptions are preserved as provider HTML; Work SDK does not perform lossy HTML-to-Markdown conversion.
  • Identity writes depend on Azure DevOps resolving the supplied ID, email, or name.
  • Provider rules can modify fields. The adapter verifies important returned fields and fails closed on mismatches.
- -
; -} diff --git a/apps/web/app/docs/providers/github/page.tsx b/apps/web/app/docs/providers/github/page.tsx deleted file mode 100644 index d450f13..0000000 --- a/apps/web/app/docs/providers/github/page.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import type { Metadata } from "next"; - -import { CodeBlock, DocsCallout, DocsNext, DocsShell } from "@/components/docs-shell"; -import { createPageMetadata } from "@/lib/site"; - -export const metadata: Metadata = createPageMetadata({ - title: "GitHub Issues adapter", - description: "Configure the Work SDK GitHub Issues adapter, understand identifiers, permissions, state mappings, assignees, revisions, and safe writes.", - path: "/docs/providers/github", - keywords: ["GitHub Issues TypeScript SDK", "GitHub issue agent", "GitHub safe writes"], -}); - -const setup = `import { createWorkClient } from "work-sdk"; -import { github } from "work-sdk/github"; - -export const work = createWorkClient({ - adapter: github({ - owner: "octo-org", - repo: "product", - token: process.env.GITHUB_TOKEN!, - }), -});`; - -export default function GitHubProviderPage() { - return -

Configure

The token stays in your process and requests go directly to api.github.com. Inject fetch in tests or when your runtime requires a custom transport.

-

Permissions

Fine-grained personal access tokens need repository access plus read and write permission for Issues. GitHub App installation tokens are preferable for multi-tenant applications because each installation has an explicit repository boundary.

Never expose a GitHub token to a browser or to an untrusted model prompt. Keep the Work SDK client in a server process or isolated tool runtime.

-

Identifiers

idThe decimal issue number as a string, for example "481".
identifierA readable repository-qualified value such as octo-org/product#481.
revisionA deterministic readback fingerprint used for preflight conflict detection.
-

Field mapping

Work SDKGitHubNotes
stateopen / closedCompleted maps to closed; custom workflow states are not available.
assigneeIdsloginsMultiple assignees are supported when the repository allows them.
labelslabel namesUnknown labels are rejected instead of silently created.
kindissuePull requests are excluded from list results.
-

Safe write

0, -});`} label="close-issue.ts" />

The returned receipt is narrowed to UpdateCommitResult. GitHub cannot atomically test an issue revision during the write, so update concurrency is reported as preflight, not atomic.

-

Limits and escape hatches

  • GitHub Projects fields are outside the portable issue contract.
  • Issue types and organization-specific metadata remain available through raw for reads.
  • Repository rules and token permissions can reject an action even when the adapter capability is true.
- -
; -} diff --git a/apps/web/app/docs/providers/gitlab/page.tsx b/apps/web/app/docs/providers/gitlab/page.tsx deleted file mode 100644 index a4eb863..0000000 --- a/apps/web/app/docs/providers/gitlab/page.tsx +++ /dev/null @@ -1,126 +0,0 @@ -import type { Metadata } from "next"; - -import { CodeBlock, DocsCallout, DocsNext, DocsShell } from "@/components/docs-shell"; -import { createPageMetadata } from "@/lib/site"; - -export const metadata: Metadata = createPageMetadata({ - title: "GitLab Issues TypeScript SDK adapter", - description: "Connect Work SDK to GitLab.com or GitLab Self-Managed with guarded labels, explicit auth, safe issue mappings, pagination, comments, and revision checks.", - path: "/docs/providers/gitlab", - keywords: ["GitLab Issues TypeScript SDK", "GitLab Self-Managed API", "GitLab AI agent integration"], -}); - -const basic = `import { createWorkClient } from "work-sdk"; -import { gitlab } from "work-sdk/gitlab"; - -const work = createWorkClient({ - adapter: gitlab({ - project: "acme/platform", - token: process.env.GITLAB_TOKEN!, - }), -});`; - -const oauth = `gitlab({ - project: 77, - auth: { - type: "oauth", - token: process.env.GITLAB_OAUTH_TOKEN!, - }, -});`; - -const selfManaged = `gitlab({ - project: "platform/backend", - token: process.env.GITLAB_TOKEN!, - apiBaseUrl: "https://gitlab.example.com/api/v4", -});`; - -const kindMap = `gitlab({ - project: "acme/platform", - token: process.env.GITLAB_TOKEN!, - issueTypeByKind: { - bug: "issue", - story: "issue", - }, -});`; - -const guardedLabels = `const change = await work.prepareCreate({ - title: "Reconcile deployment result", - labels: ["agent-safe"], -}); - -// The adapter first verifies that "agent-safe" already exists. -// Missing labels fail before GitLab can create them as a side effect. -await work.commit(change, { - idempotencyKey: "deployment:run_123:issue", -});`; - -export default function GitLabPage() { - return ( - -
-

Configure the adapter

- -

project accepts a numeric GitLab project ID or a full path such as group/subgroup/project. Work SDK URL-encodes the path exactly once and keeps issue IDs project-scoped.

-
- -
-

Authentication

-

The token shorthand sends a GitLab private-token header and works with personal, project, or group access tokens where the GitLab tier permits them. Use explicit OAuth auth when the credential is an OAuth access token.

- -

token and auth are mutually exclusive. Credentials belong in server-side environment variables and never in browser code, prompts, prepared plans, or logs.

-
- -
-

GitLab Self-Managed

- -

Point apiBaseUrl at the instance REST v4 root. Rate limits, enabled issue types, tiers, and access-token rules can differ from GitLab.com, so treat instance policy as runtime configuration rather than SDK defaults.

-
- -
-

Guarded labels

-

GitLab creates missing labels when an issue write includes them. That is a second side effect hidden inside a normal issue mutation, so Work SDK resolves project labels first and rejects unknown values by default.

- -

Set allowCreateLabels: true only when the application policy explicitly allows label creation. The option changes a safety boundary and should not be enabled merely to suppress validation errors.

-
- -
-

Issue types

-

GitLab REST exposes issue, task, incident, and test_case. Work SDK maps issue and task directly. Bug, story, epic, and subtask have no universal GitLab equivalent and fail unless you configure an explicit map.

- -
- -
-

Assignees

-

Use numeric GitLab user IDs in assigneeIds. Multiple assignees are tier-dependent and remain disabled by default. Set multipleAssignees: true only after confirming the target instance supports the behavior.

-
- -
-

Search and pagination

-

list forwards text search, assignee username, labels, and opened/closed state filters. The adapter uses opaque gitlab:page:… cursors and reads X-Next-Page or the standard Link header without depending on total-count headers.

- -
- -
-

Concurrency and retries

-

The adapter fingerprints the issue fields that affect normalized behavior, then re-reads immediately before an update. GitLab REST does not expose an atomic issue revision precondition, so a small race window remains between that read and the PUT request.

-

On WorkConflictError, discard the plan and prepare again. Always use a durable idempotency store for distributed workers because GitLab issue writes do not provide a universal native idempotency key.

-
- - -
- ); -} diff --git a/apps/web/app/docs/providers/jira/page.tsx b/apps/web/app/docs/providers/jira/page.tsx deleted file mode 100644 index ec7f46d..0000000 --- a/apps/web/app/docs/providers/jira/page.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import type { Metadata } from "next"; - -import { CodeBlock, DocsCallout, DocsNext, DocsShell } from "@/components/docs-shell"; -import { createPageMetadata } from "@/lib/site"; - -export const metadata: Metadata = createPageMetadata({ - title: "Jira Cloud adapter", - description: "Configure the Work SDK Jira Cloud adapter, discover transitions, map ADF content, priorities, parents, and safe agent writes.", - path: "/docs/providers/jira", - keywords: ["Jira Cloud TypeScript SDK", "Jira agent tools", "Jira transition API"], -}); - -const setup = `import { createWorkClient } from "work-sdk"; -import { jira } from "work-sdk/jira"; - -export const work = createWorkClient({ - adapter: jira({ - baseUrl: "https://example.atlassian.net", - email: "agent@example.com", - apiToken: process.env.JIRA_API_TOKEN!, - projectKey: "ENG", - }), -});`; - -export default function JiraProviderPage() { - return -

Configure

baseUrl is your Jira Cloud tenant root without a trailing REST path. projectKey supplies the default project for creates and search.

-

Authentication

Basic authentication uses the Atlassian account email and an API token, not the account password. OAuth 2.0 applications can provide a bearer token through the adapter's supported auth configuration.

Jira API tokens often span more projects than an individual tool needs. Run the client in a server boundary and use a dedicated account with the narrowest practical project permissions.

-

Workflow transitions

Jira does not update status like an ordinary field. The adapter reads available transitions for the issue, resolves the requested normalized or display state, and then invokes the matching transition ID.

Requested completed→Available transitions→Done / transition 31

If no unambiguous transition exists, preparation or commit fails instead of choosing a similarly named state.

-

Content and fields

Work SDKJira CloudBehavior
descriptionADF documentPlain text is converted conservatively.
commentADF documentThe normalized body remains plain text.
prioritypriority name / IDResolved against tenant metadata.
parentIdparent issue keySupported when the issue type allows it.
kindissue typeMaps task, bug, story, epic, and subtask.
-

Safe write

The receipt is an UpdateCommitResult. The adapter re-reads the issue revision before writing, but Jira's multi-request transition flow still has a race window and is reported as preflight concurrency.

-

Limits

  • Required custom fields cannot be inferred across tenants.
  • Rich ADF structures beyond conservative text conversion remain provider-specific.
  • Workflow validators, conditions, and automation can reject an otherwise valid transition.
- -
; -} diff --git a/apps/web/app/docs/providers/linear/page.tsx b/apps/web/app/docs/providers/linear/page.tsx deleted file mode 100644 index 3f48662..0000000 --- a/apps/web/app/docs/providers/linear/page.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import type { Metadata } from "next"; - -import { CodeBlock, DocsCallout, DocsNext, DocsShell } from "@/components/docs-shell"; -import { createPageMetadata } from "@/lib/site"; - -export const metadata: Metadata = createPageMetadata({ - title: "Linear adapter", - description: "Configure the Work SDK Linear adapter with team-aware states, labels, priorities, pagination, and safe agent writes.", - path: "/docs/providers/linear", - keywords: ["Linear TypeScript SDK", "Linear issue agent", "Linear API adapter"], -}); - -const setup = `import { createWorkClient } from "work-sdk"; -import { linear } from "work-sdk/linear"; - -export const work = createWorkClient({ - adapter: linear({ - apiKey: process.env.LINEAR_API_KEY!, - teamId: "team_01JEXAMPLE", - }), -});`; - -export default function LinearProviderPage() { - return -

Configure

Use a personal API key for a single workspace or an OAuth access token for an installed application. teamId provides the default team for creates and state resolution.

-

Teams and identifiers

get accepts a Linear UUID or readable identifier such as ENG-123. Creates need a team from the adapter or input.project. List cursors are opaque GraphQL cursors and must be passed back unchanged.

State and label names are scoped by workspace and team. Resolve them through the adapter rather than hard-coding internal Linear IDs in an agent prompt.

-

States and priorities

Work SDKLinear
backlogWorkflow state type backlog
unstartedWorkflow state type unstarted
startedWorkflow state type started
completedWorkflow state type completed
urgent / high / medium / low / noneNative priority 1–4 or 0

The normalized state is portable. stateName preserves the workspace's exact display name, such as “In review”.

-

Safe write

Prepared changes include the current Linear issue and revision fingerprint. A final read blocks a stale plan before mutation; Linear does not expose an atomic compare-and-set for this adapter, so the guarantee remains preflight.

-

Limits

  • Linear supports one assignee in the portable contract.
  • Custom fields and project milestones remain provider-specific.
  • Workspace permissions and team membership still apply to every request.
- -
; -} diff --git a/apps/web/app/docs/providers/page.tsx b/apps/web/app/docs/providers/page.tsx deleted file mode 100644 index 40ec2a9..0000000 --- a/apps/web/app/docs/providers/page.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import type { Metadata } from "next"; - -import { CodeBlock, DocsCallout, DocsNext, DocsShell } from "@/components/docs-shell"; -import { createPageMetadata } from "@/lib/site"; - -export const metadata: Metadata = createPageMetadata({ - title: "GitHub, GitLab, Linear, Jira, and Azure DevOps adapters", - description: "Configure and compare Work SDK adapters for GitHub Issues, GitLab, Linear, Jira Cloud, and Azure DevOps.", - path: "/docs/providers", - keywords: ["GitHub Linear Jira SDK", "Azure DevOps TypeScript SDK", "issue tracker adapters"], -}); - -const providers = `import { github } from "work-sdk/github"; -import { gitlab } from "work-sdk/gitlab"; -import { linear } from "work-sdk/linear"; -import { jira } from "work-sdk/jira"; -import { azureDevOps } from "work-sdk/azure-devops";`; - -export default function ProvidersPage() { - return -

Provider entry points

Subpath exports keep provider implementations independently tree-shakeable. All adapters return the same WorkAdapter contract.

-

Capability matrix

- -
CapabilityGitHubGitLabLinearJiraAzure DevOps
Create / updateYesYesYesYesYes
CommentsMarkdownMarkdownMarkdownADFMarkdown
Custom statesNoNoYesYesYes
PrioritiesNo universal fieldNo universal fieldNativeNative1–4 mapping
Multiple assigneesYesOpt-inNoNoNo
Parent linksNoNoYesYesYes
SearchNot in adapterREST searchGraphQL filtersJQLWIQL
ConcurrencyReadback revisionReadback revisionReadback revisionReadback revisionNative /rev test
-

GitHub Issues

The adapter excludes pull requests from issue results, maps open/closed reasons, verifies fields through readback, and supports multiple assignees. GitHub Projects fields are intentionally outside the portable issue contract.

-

GitLab

The REST v4 adapter supports GitLab.com and Self-Managed. It validates labels before writes, requires explicit mappings for non-native issue kinds, and keeps tier-dependent multiple assignees opt-in.

-

Linear

Linear uses cursor pagination, one assignee, native priorities, and team-specific workflow states. The adapter resolves state and label names against provider metadata before a mutation.

-

Jira Cloud

Jira status changes are transitions, not ordinary field updates. The adapter discovers available transitions and converts conservative text content to Atlassian Document Format.

-

Azure DevOps

Azure DevOps uses WIQL for discovery and JSON Patch for mutation. Custom processes can redefine state and work-item type names, so the adapter exposes explicit normalization maps.

-

Provider escape hatches

Every normalized item, user, project, and comment can retain raw. Use it for reads that are not portable. For provider-specific writes outside the adapter contract, build a narrow custom tool instead of mutating raw and pretending the operation is normalized.

Capability flags describe adapter-level support. Tenant workflow rules and user permissions can still reject an individual operation.

-
; -} diff --git a/apps/web/app/docs/reference/client/page.tsx b/apps/web/app/docs/reference/client/page.tsx deleted file mode 100644 index 1648faa..0000000 --- a/apps/web/app/docs/reference/client/page.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import type { Metadata } from "next"; - -import { CodeBlock, DocsCallout, DocsNext, DocsShell } from "@/components/docs-shell"; -import { createPageMetadata } from "@/lib/site"; - -export const metadata: Metadata = createPageMetadata({ - title: "WorkClient API reference", - description: "Reference for WorkClient TypeScript methods, inputs, outputs, provider capabilities, prepared changes, and idempotency stores.", - path: "/docs/reference/client", - keywords: ["WorkClient API", "Work SDK TypeScript reference", "prepared work changes"], -}); - -const createClient = `function createWorkClient(options: { - adapter: WorkAdapter; - idempotencyStore?: IdempotencyStore; - now?: () => Date; -}): WorkClient;`; - -export default function ClientReferencePage() { - return -

createWorkClient

adapter is required. The default idempotency store is process-local memory. now exists for deterministic testing and should normally be omitted.

-

Read methods

get(id, options?)

`} />

Returns one normalized item or throws WorkNotFoundError. IDs are adapter-native: a GitHub issue number, Linear ID or identifier, Jira key, or Azure work-item ID.

list(input?, options?)

>`} />

Returns an opaque provider cursor. Never construct or parse cursors; pass nextCursor back unchanged.

-

Prepare methods

prepareCreate(input)Plan a new item without writing it.prepareUpdate(id, input, options?)Read current state and calculate a changed-field diff.prepareComment(id, input, options?)Read the target and plan a comment.

Create plans do not have an expected revision. Update and comment plans capture the current item and opaque revision.

-

commit(change, options?)

( - change: TChange, - options?: { - idempotencyKey?: string; - acceptWarnings?: boolean; - signal?: AbortSignal; - }, -): Promise>`} />

Commit validates provider identity, fingerprint integrity, warning acknowledgement, idempotency state, and revision before calling the adapter. The receipt follows the prepared action: create plans return CreateCommitResult, updates return UpdateCommitResult, and comments return CommentCommitResult with a required comment.

If a mutation starts and the provider outcome becomes uncertain, Work SDK stores an ambiguous state and throws WorkAmbiguousCommitError. Reconcile the provider result before another write; never blind-retry that key.

-

Core types

TypePurpose
WorkItemNormalized item plus provider state name, opaque revision, URL, and optional raw payload.
WorkCommentNormalized body, author, timestamps, and raw payload.
PreparedWorkChangeSerializable, fingerprinted plan for one create, update, or comment.
CommitResultDiscriminated union of create, update, and comment receipts with replay flag and commit time.
CommitResultFor<T>Maps a prepared change type to its exact action-specific receipt.
WorkPage<T>Items plus an optional opaque next cursor.
WorkWarningStructured provider limitation or lossy/ambiguous mapping notice.
-

Capabilities

work.capabilities is an immutable snapshot. Inspect it when building tools or UIs so unsupported actions are absent rather than offered and rejected later.

optimisticConcurrency remains as a deprecated compatibility Boolean. New code should use the action-specific concurrency object.

-

IdempotencyStore

;\n complete(key: string, leaseId: string, result: CommitResult): MaybePromise;\n abandon(key: string, leaseId: string, outcome: "retryable" | "ambiguous"): MaybePromise;\n}`} />

The client prefixes keys with the provider. acquire must be atomic across every worker using the store; use a transaction, compare-and-swap, unique insert, or conditional put. A durable get followed by set is not sufficient.

completedReplay the stored receipt without a provider call.
in-flightThrow WorkInFlightError; another worker owns the claim.
ambiguousThrow WorkAmbiguousCommitError; reconcile before retrying.
- -
; -} diff --git a/apps/web/app/docs/reference/errors/page.tsx b/apps/web/app/docs/reference/errors/page.tsx deleted file mode 100644 index 6faa723..0000000 --- a/apps/web/app/docs/reference/errors/page.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import type { Metadata } from "next"; - -import { CodeBlock, DocsCallout, DocsNext, DocsShell } from "@/components/docs-shell"; -import { createPageMetadata } from "@/lib/site"; - -export const metadata: Metadata = createPageMetadata({ - title: "Error handling reference", - description: "Handle authentication, authorization, rate limit, conflict, validation, and unsupported errors consistently across work trackers.", - path: "/docs/reference/errors", - keywords: ["Work SDK errors", "API conflict handling", "issue tracker rate limits"], -}); - -const handling = `import { - WorkAmbiguousCommitError, - WorkAuthenticationError, - WorkConflictError, - WorkInFlightError, - WorkRateLimitError, - WorkValidationError, -} from "work-sdk"; - -try { - return await work.commit(change, { idempotencyKey }); -} catch (error) { - if (error instanceof WorkAuthenticationError) { - return refreshCredentials(); - } - if (error instanceof WorkRateLimitError) { - return retryAfter(error.retryAfterMs); - } - if (error instanceof WorkConflictError) { - return prepareAgainAndRequestApproval(); - } - if (error instanceof WorkInFlightError) { - return retryAfterCurrentOwner(); - } - if (error instanceof WorkAmbiguousCommitError) { - return reconcileProviderBeforeAnyRetry(error.details); - } - if (error instanceof WorkValidationError) { - return rejectToolInput(error.details); - } - throw error; -}`; - -export default function ErrorsPage() { - return -

Error hierarchy

ClassCodeTypical response
WorkAuthenticationErrorauthenticationRefresh or replace credentials; do not blind-retry.
WorkAuthorizationErrorauthorizationRequest scope/permission or remove the action.
WorkNotFoundErrornot_foundVerify target and visibility.
WorkRateLimitErrorrate_limitRetry after the supplied delay with jitter.
WorkConflictErrorconflictRe-read, prepare a new plan, request approval again.
WorkInFlightErrorin_flightWait for the current claim owner, then reuse the same key.
WorkAmbiguousCommitErrorambiguousReconcile provider state; never blind-retry.
WorkUnsupportedErrorunsupportedChange the tool schema or provider strategy.
WorkValidationErrorvalidationFix input; retrying unchanged input is wrong.
WorkErrorprovider / networkInspect cause and provider policy.
-

Shared fields

-

Typed handling

-

Retry policy

  • Rate limit: retry after retryAfterMs, add jitter, preserve the idempotency key.
  • In flight: wait for the claim owner and reuse the same key.
  • Ambiguous: do not retry; reconcile the provider and durable record.
  • Conflict: never retry the same plan; prepare and approve again.
  • Validation/unsupported: do not retry unchanged input.
  • Authentication: refresh credentials before another attempt.

A timeout cannot prove whether the remote provider committed a write. Work SDK records that uncertainty explicitly and blocks another mutation until application reconciliation resolves it.

-

Logging and redaction

Log class, code, provider, status, retry delay, and a correlation ID. Treat details and cause as potentially sensitive because providers can echo field values or request context. Never log adapter options or authorization headers.

- -
; -} diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css index b7fb004..28307d3 100644 --- a/apps/web/app/globals.css +++ b/apps/web/app/globals.css @@ -31,6 +31,13 @@ * { box-sizing: border-box; } html { overflow-x: clip; scroll-behavior: smooth; scroll-padding-top: 88px; } +/* Tailwind's preflight loads with the /docs styles and strips heading weights and + list styles globally; set them explicitly so pages outside /docs render the same + whether or not the visitor navigated through the docs. */ +h1, h2, h3, h4, h5, h6 { font-weight: 700; } +.article-body ul, .article-body ol { margin: 16px 0; padding-left: 26px; } +.article-body ul { list-style: disc; } +.article-body ol { list-style: decimal; } body { margin: 0; overflow-x: clip; background: var(--bg); color: var(--ink); font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; -webkit-font-smoothing: antialiased; } button, input { font: inherit; } a { color: inherit; text-decoration: none; } @@ -280,11 +287,6 @@ tbody th { font-weight: 570; } .article-cta > div:last-child { display: flex; flex-wrap: wrap; gap: 9px; } /* Documentation */ -.docs-layout { display: grid; grid-template-columns: 230px minmax(0, 740px) 1fr; gap: 55px; align-items: start; padding-block: 68px 110px; } -.docs-sidebar { position: sticky; top: 100px; min-width: 0; } -.docs-search-trigger { display: grid; width: 100%; grid-template-columns: auto 1fr auto; align-items: center; gap: 8px; margin-bottom: 23px; border: 1px solid var(--line); border-radius: 8px; background: var(--surface); color: var(--muted); cursor: pointer; padding: 9px 10px; text-align: left; } -.docs-search-trigger:hover { border-color: var(--line-strong); color: var(--ink); } -.docs-search-trigger kbd { border: 1px solid var(--line); border-radius: 4px; background: var(--bg); color: var(--faint); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 8px; padding: 3px 5px; } .docs-search-backdrop { position: fixed; inset: 0; z-index: 100; display: grid; place-items: start center; background: rgba(0, 0, 0, .68); backdrop-filter: blur(8px); padding: min(14vh, 120px) 18px 18px; } .docs-search-dialog { width: min(610px, 100%); overflow: hidden; border: 1px solid var(--line-strong); border-radius: 13px; background: #101311; box-shadow: 0 30px 100px rgba(0, 0, 0, .55); } .docs-search-field { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; border-bottom: 1px solid var(--line); } @@ -297,17 +299,7 @@ tbody th { font-weight: 570; } .docs-search-results a:hover { background: var(--surface-raised); } .docs-search-results small { color: var(--faint); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 9px; text-transform: uppercase; } .docs-search-results p { color: var(--faint); padding: 14px; font-size: 13px; } -.docs-sidebar p { margin: 24px 0 10px; color: var(--faint); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 9px; font-weight: 750; letter-spacing: .08em; text-transform: uppercase; } -.docs-sidebar p:first-child { margin-top: 0; } -.docs-sidebar a { display: block; border-radius: 6px; color: var(--muted); font-size: 12px; padding: 7px 9px; } -.docs-sidebar a:hover { background: var(--surface); color: var(--ink); } -.docs-sidebar a[aria-current="page"] { background: var(--surface-raised); color: var(--ink); font-weight: 680; } -.docs-sidebar .docs-search-results a { display: flex; align-items: center; justify-content: space-between; color: var(--muted); font-size: 13px; padding: 12px 13px; } -.docs-sidebar .docs-search-results a:hover { background: var(--surface-raised); color: var(--ink); } -.docs-nav-group { margin: 0; } -.docs-nav-scroll { min-width: 0; } .docs-content { min-width: 0; } -.docs-content .breadcrumb { color: var(--faint); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 10px; } .docs-content h1 { margin: 22px 0 17px; font-size: 52px; letter-spacing: -.055em; } .docs-lead { margin: 0 0 45px; color: var(--muted); font-size: 17px; line-height: 1.7; } .docs-content section { scroll-margin-top: 100px; margin-top: 62px; } @@ -318,17 +310,7 @@ tbody th { font-weight: 570; } .docs-content pre { position: relative; overflow-x: auto; border: 1px solid #2d322f; border-radius: 11px; background: var(--code-bg); color: var(--code-ink); padding: 22px; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 11px; line-height: 1.75; } .docs-content pre code { border: 0; background: transparent; color: inherit; padding: 0; } .docs-content :not(pre) > code { border: 1px solid var(--line); border-radius: 5px; background: var(--surface); color: var(--ink); padding: 2px 5px; font-size: .86em; } -.docs-callout { border-left: 3px solid var(--primary); border-radius: 0 8px 8px 0; background: var(--primary-soft); padding: 13px 16px; } -.docs-callout p { margin: 0; color: #40488a; font-size: 12px; } -.docs-callout.warning { border-left-color: var(--warning); background: var(--warning-soft); } -.docs-callout.warning p { color: var(--warning); } -.docs-toc { position: sticky; top: 100px; border-left: 1px solid var(--line); padding-left: 22px; } -.docs-toc p { color: var(--faint); font-size: 10px; font-weight: 700; text-transform: uppercase; } -.docs-toc a { display: block; margin: 10px 0; color: var(--muted); font-size: 11px; } -.docs-code { position: relative; margin: 18px 0; } -.docs-code pre { margin: 0; padding-top: 38px; } -.docs-code-label { position: absolute; left: 16px; top: 13px; z-index: 2; color: #7f8781; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 8px; letter-spacing: .08em; text-transform: uppercase; } -.docs-code-copy { position: absolute; right: 10px; top: 9px; z-index: 2; } +.docs-content .docs-code pre { margin: 0; border: 0; border-radius: 0; background: transparent; padding: 0 18px; } .docs-card-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; } .docs-content .docs-card { min-height: 178px; border: 1px solid var(--line); border-radius: 11px; background: var(--surface); color: var(--ink); padding: 20px; text-decoration: none; transition: border-color .18s ease, transform .18s ease; } .docs-content .docs-card:hover { border-color: var(--primary); transform: translateY(-2px); } @@ -374,8 +356,6 @@ tbody th { font-weight: 570; } .workflow-section .shell { padding: 48px 32px; } .article-layout { grid-template-columns: minmax(0, 760px); } .article-toc { display: none; } - .docs-layout { grid-template-columns: 190px minmax(0, 1fr); gap: 40px; } - .docs-toc { display: none; } } @media (max-width: 760px) { @@ -417,13 +397,6 @@ tbody th { font-weight: 570; } .article-body p, .article-body li { font-size: 15px; } .article-rules li, .article-cta { grid-template-columns: 1fr; gap: 8px; } .article-body pre { padding: 20px; font-size: 11px; } - .docs-layout { grid-template-columns: 1fr; padding-top: 34px; } - .docs-sidebar { position: static; display: block; overflow: visible; border-bottom: 0; padding-bottom: 12px; } - .docs-search-trigger { margin-bottom: 12px; } - .docs-nav-scroll { display: flex; width: 100%; max-width: 100%; overflow-x: auto; gap: 4px; border-bottom: 1px solid var(--line); padding-bottom: 12px; scrollbar-width: thin; } - .docs-nav-group { display: flex; flex: none; } - .docs-sidebar p { display: none; } - .docs-sidebar a { flex: none; } .docs-content h1 { font-size: 42px; } .docs-card-grid { grid-template-columns: 1fr; } .docs-steps li { grid-template-columns: 1fr; gap: 6px; } @@ -444,8 +417,6 @@ tbody th { font-weight: 570; } .button.secondary { background: var(--surface); } .provider-list .github { background: #edf1ee; } .workflow-section { background-image: linear-gradient(#202420 1px, transparent 1px), linear-gradient(90deg, #202420 1px, transparent 1px); } - .docs-callout p { color: #bdc3ff; } - .docs-callout.warning p { color: #e8c57f; } .article-callout p { color: #bdc3ff; } ::selection { background: #4651a7; color: white; } } diff --git a/apps/web/app/guides/agent-safe-work-tracker-writes/page.tsx b/apps/web/app/guides/agent-safe-work-tracker-writes/page.tsx index 637c804..140502e 100644 --- a/apps/web/app/guides/agent-safe-work-tracker-writes/page.tsx +++ b/apps/web/app/guides/agent-safe-work-tracker-writes/page.tsx @@ -163,8 +163,8 @@ export default function AgentSafeWritesGuide() { GitHub IssuesRe-read and compare the normalized revision before mutationState is open/closed while project workflows may live elsewhere GitLabRe-read and compare before mutationUnknown labels can become new project labels unless writes are guarded - LinearRe-read and compare update timestampsStates are team-specific identifiers, not portable names - Jira CloudRe-read plus provider version checks where availableStatus changes are transitions; fields depend on project configuration + LinearRe-read and compare an opaque revision fingerprint before mutationStates are team-specific identifiers, not portable names + Jira CloudRe-read and compare an opaque revision fingerprint before mutationStatus changes are transitions; fields depend on project configuration Azure DevOpsAtomic JSON Patch revision testWork-item types, states, and fields depend on the process template diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 6cc790f..1d174e2 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -1,5 +1,6 @@ import type { Metadata, Viewport } from "next"; import type { ReactNode } from "react"; +import { RootProvider } from "fumadocs-ui/provider/next"; import { SiteAnalytics } from "@/components/site-analytics"; import { SiteFooter, SiteHeader } from "@/components/site-shell"; @@ -70,15 +71,17 @@ export const viewport: Viewport = { export default function RootLayout({ children }: Readonly<{ children: ReactNode }>) { return ( - + - - Skip to content - - - {children} - - + + + Skip to content + + + {children} + + + ); diff --git a/apps/web/app/llms-full.txt/route.ts b/apps/web/app/llms-full.txt/route.ts index e82418e..0e47087 100644 --- a/apps/web/app/llms-full.txt/route.ts +++ b/apps/web/app/llms-full.txt/route.ts @@ -1,6 +1,6 @@ -import { llmsFull } from "@/lib/machine-content"; +import { llmsFull } from "@/lib/llms"; import { textResponse } from "@/lib/responses"; -export function GET() { - return textResponse(llmsFull); +export async function GET() { + return textResponse(await llmsFull()); } diff --git a/apps/web/app/llms.txt/route.ts b/apps/web/app/llms.txt/route.ts index b5818b8..8933d05 100644 --- a/apps/web/app/llms.txt/route.ts +++ b/apps/web/app/llms.txt/route.ts @@ -1,6 +1,6 @@ -import { llmsIndex } from "@/lib/machine-content"; +import { llmsIndex } from "@/lib/llms"; import { textResponse } from "@/lib/responses"; export function GET() { - return textResponse(llmsIndex); + return textResponse(llmsIndex()); } diff --git a/apps/web/app/sitemap.ts b/apps/web/app/sitemap.ts index b692ebd..b98bfb6 100644 --- a/apps/web/app/sitemap.ts +++ b/apps/web/app/sitemap.ts @@ -1,24 +1,13 @@ import type { MetadataRoute } from "next"; import { site } from "@/lib/site"; +import { source } from "@/lib/source"; export default function sitemap(): MetadataRoute.Sitemap { - const docs = [ - "/docs", - "/docs/getting-started", - "/docs/examples", - "/docs/concepts/safe-writes", - "/docs/providers", - "/docs/providers/github", - "/docs/providers/gitlab", - "/docs/providers/linear", - "/docs/providers/jira", - "/docs/providers/azure-devops", - "/docs/reference/client", - "/docs/reference/errors", - "/docs/guides/agents", - "/docs/guides/testing", - ]; + const docs = source + .getPages() + .map((page) => page.url) + .sort((a, b) => (a === "/docs" ? -1 : b === "/docs" ? 1 : a.localeCompare(b))); return [ { url: site.url, changeFrequency: "weekly", priority: 1 }, { url: `${site.url}/guides/agent-safe-work-tracker-writes`, changeFrequency: "monthly", priority: 0.9 }, diff --git a/apps/web/components/copy-button.tsx b/apps/web/components/copy-button.tsx deleted file mode 100644 index b3c8b9c..0000000 --- a/apps/web/components/copy-button.tsx +++ /dev/null @@ -1,34 +0,0 @@ -"use client"; - -import { useEffect, useRef, useState } from "react"; - -import { CheckIcon, CopyIcon } from "@/components/icons"; - -export function CopyButton({ label = "Copy", text }: { label?: string; text: string }) { - const [copied, setCopied] = useState(false); - const timer = useRef | null>(null); - - useEffect(() => () => { - if (timer.current) clearTimeout(timer.current); - }, []); - - async function copy() { - try { - await navigator.clipboard.writeText(text); - window.workSdkTrack?.("landing-cta", { action: "copy-code", location: "documentation", target: "example" }); - setCopied(true); - if (timer.current) clearTimeout(timer.current); - timer.current = setTimeout(() => setCopied(false), 1500); - } catch { - window.workSdkTrack?.("landing-cta", { action: "copy-code-failed", location: "documentation", target: "example" }); - setCopied(false); - } - } - - return ( - - ); -} diff --git a/apps/web/components/docs-navigation.tsx b/apps/web/components/docs-navigation.tsx deleted file mode 100644 index b47913f..0000000 --- a/apps/web/components/docs-navigation.tsx +++ /dev/null @@ -1,27 +0,0 @@ -"use client"; - -import Link from "next/link"; -import { usePathname } from "next/navigation"; - -export const docsNavigation = [ - { label: "Start", links: [["Overview", "/docs"], ["Getting started", "/docs/getting-started"], ["Example apps", "/docs/examples"]] }, - { label: "Concepts", links: [["Safe writes", "/docs/concepts/safe-writes"], ["Providers", "/docs/providers"]] }, - { label: "Providers", links: [["GitHub", "/docs/providers/github"], ["GitLab", "/docs/providers/gitlab"], ["Linear", "/docs/providers/linear"], ["Jira", "/docs/providers/jira"], ["Azure DevOps", "/docs/providers/azure-devops"]] }, - { label: "Reference", links: [["Client API", "/docs/reference/client"], ["Errors", "/docs/reference/errors"]] }, - { label: "Guides", links: [["Agent integration", "/docs/guides/agents"], ["Testing", "/docs/guides/testing"]] }, -] as const; - -export function DocsNavigation() { - const pathname = usePathname(); - - return docsNavigation.map((group) => ( -
-

{group.label}

- {group.links.map(([label, href]) => ( - - {label} - - ))} -
- )); -} diff --git a/apps/web/components/docs-next.tsx b/apps/web/components/docs-next.tsx new file mode 100644 index 0000000..2062aea --- /dev/null +++ b/apps/web/components/docs-next.tsx @@ -0,0 +1,5 @@ +import Link from "next/link"; + +export function DocsNext({ href, label, description }: { href: string; label: string; description: string }) { + return Next{label} →{description}; +} diff --git a/apps/web/components/docs-search.tsx b/apps/web/components/docs-search.tsx deleted file mode 100644 index 3f087fc..0000000 --- a/apps/web/components/docs-search.tsx +++ /dev/null @@ -1,77 +0,0 @@ -"use client"; - -import Link from "next/link"; -import { useEffect, useMemo, useRef, useState } from "react"; -import { createPortal } from "react-dom"; - -import { docsNavigation } from "@/components/docs-navigation"; - -const pages = docsNavigation.flatMap((group) => - group.links.map(([label, href]) => ({ label, href, group: group.label })), -); - -export function DocsSearch() { - const [open, setOpen] = useState(false); - const [query, setQuery] = useState(""); - const inputRef = useRef(null); - const results = useMemo(() => { - const needle = query.trim().toLowerCase(); - return needle - ? pages.filter((page) => `${page.group} ${page.label}`.toLowerCase().includes(needle)) - : pages; - }, [query]); - - useEffect(() => { - function onKeyDown(event: KeyboardEvent) { - if ((event.ctrlKey || event.metaKey) && event.key.toLowerCase() === "k") { - event.preventDefault(); - setOpen(true); - } - if (event.key === "Escape") setOpen(false); - } - window.addEventListener("keydown", onKeyDown); - return () => window.removeEventListener("keydown", onKeyDown); - }, []); - - useEffect(() => { - if (open) inputRef.current?.focus(); - else setQuery(""); - }, [open]); - - return ( - <> - - {open ? createPortal( -
setOpen(false)} role="presentation"> -
event.stopPropagation()} role="dialog"> -
- - setQuery(event.target.value)} - placeholder="Search guides, providers, and API reference…" - ref={inputRef} - type="search" - value={query} - /> - -
-
- {results.length ? results.map((page) => ( - setOpen(false)} data-analytics-action="docs-search-result" data-analytics-destination={page.href}> - {page.label} - {page.group} - - )) :

No documentation page found.

} -
-
-
, - document.body, - ) : null} - - ); -} diff --git a/apps/web/components/docs-shell.tsx b/apps/web/components/docs-shell.tsx deleted file mode 100644 index 032f07e..0000000 --- a/apps/web/components/docs-shell.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import Link from "next/link"; -import type { ReactNode } from "react"; - -import { CopyButton } from "@/components/copy-button"; -import { DocsNavigation } from "@/components/docs-navigation"; -import { DocsSearch } from "@/components/docs-search"; - -export interface TocItem { id: string; label: string } - -interface DocsShellProps { - breadcrumb: string; - title: string; - description: string; - toc?: readonly TocItem[]; - children: ReactNode; -} - -export function DocsShell({ breadcrumb, title, description, toc = [], children }: DocsShellProps) { - return ( -
- -
-

Docs / {breadcrumb}

-

{title}

-

{description}

- {children} -
- -
- ); -} - -export function CodeBlock({ code, label }: { code: string; label?: string }) { - return ( -
- {label ? {label} : null} -
{code}
-
-
- ); -} - -export function DocsCallout({ children, tone = "info" }: { children: ReactNode; tone?: "info" | "warning" }) { - return
{children}
; -} - -export function DocsNext({ href, label, description }: { href: string; label: string; description: string }) { - return Next{label} →{description}; -} diff --git a/apps/web/content/docs/concepts/safe-writes.mdx b/apps/web/content/docs/concepts/safe-writes.mdx new file mode 100644 index 0000000..96e0e6f --- /dev/null +++ b/apps/web/content/docs/concepts/safe-writes.mdx @@ -0,0 +1,81 @@ +--- +title: Prepare. Inspect. Commit. +description: Work SDK turns a provider mutation into a reviewable value before it becomes a side effect. Integrity, optimistic concurrency, and idempotency each protect a different failure boundary. +seoTitle: Safe writes for AI agents +keywords: + - safe AI agent writes + - idempotent API writes + - optimistic concurrency +--- + +## Why a protocol? [#why] + +A direct API call combines intent, provider translation, authorization, and an irreversible effect. Agents are especially vulnerable to retry ambiguity and stale context. Work SDK separates decision time from mutation time. + +Normalized intent → Prepared plan → Policy / approval → Provider write + +## Prepared plan anatomy [#anatomy] + +```ts title="simplified type" +type PreparedWorkChange = + | { action: "create"; input: CreateWorkItemInput; targetId?: never } + | { action: "update"; input: UpdateWorkItemInput; + targetId: string; current: WorkItem; expectedRevision: string } + | { action: "comment"; input: AddCommentInput; + targetId: string; current: WorkItem; expectedRevision: string }; + +// Every variant also contains provider, changes, warnings, summary, +// preparedAt, id, and an integrity fingerprint. +``` + +Plans are serializable and contain no credentials. The `current` snapshot explains the diff; `expectedRevision` makes the later commit conditional. + +## Integrity fingerprint [#integrity] + +The fingerprint covers every signed plan field. If application code or an agent mutates the reviewed input, changes, warnings, target, or revision, `commit` rejects the plan before any provider request. + + +The fingerprint detects accidental mutation. It is not a user-authentication signature and should not be treated as one across untrusted boundaries. + + +## Concurrency guarantees [#concurrency] + +Update and comment plans capture the item's opaque revision. Commit re-reads the item and fails closed if it changed. `capabilities.concurrency` reports whether the final provider mutation is `atomic`, uses a best-effort `preflight`, or has no protection. Azure DevOps updates use an atomic JSON Patch `test /rev`; GitHub, GitLab, Linear, and Jira retain a small read-to-write race window. + +```ts title="conflict-recovery.ts" +try { + await work.commit(change, { idempotencyKey }); +} catch (error) { + if (error instanceof WorkConflictError) { + // Never patch the old plan or force the write. + const replacement = await work.prepareUpdate(change.targetId!, change.input); + return requestApproval(replacement); + } + throw error; +} +``` + +Every `WorkError` also carries a stable machine-readable `code` (`WorkErrorCode`), such as `"conflict"` for `WorkConflictError`. In CommonJS or mixed ESM/CJS module graphs, where `instanceof` can fail across entry points, `error.code` is the reliable discriminator. + +## Idempotency [#idempotency] + +The default memory store atomically coordinates retries inside one process. Serverless, clustered, and job systems must supply a durable store with an atomic claim. Keys should identify the business event, for example `github:webhook:delivery-123:comment`, not the attempt. Work SDK binds each key to the normalized provider, action, target, and input. + +- **Same key + completed intent** — Return the stored receipt with `replayed: true`. +- **Same key + active intent** — Fail with `WorkInFlightError`; do not start a second write. +- **Uncertain provider outcome** — Fail with `WorkAmbiguousCommitError` and require reconciliation. +- **Same key + different intent** — Fail with `WorkConflictError` before a provider mutation. + + +Durability alone is insufficient. A store implemented as separate `get` and `set` operations can still duplicate writes across workers. + + +## Warnings and approval [#warnings] + +Warnings describe lossy mappings, ambiguous values, unsupported fields, or provider limitations. Commit requires `acceptWarnings: true` when warnings exist, forcing the caller to acknowledge them explicitly. + + +Acceptance means "the caller reviewed this risk." It does not make an impossible provider operation possible; an adapter can still reject invalid or unsupported input. + + + diff --git a/apps/web/content/docs/examples.mdx b/apps/web/content/docs/examples.mdx new file mode 100644 index 0000000..3148903 --- /dev/null +++ b/apps/web/content/docs/examples.mdx @@ -0,0 +1,94 @@ +--- +title: Example applications +description: Complete Node applications that run without credentials against an in-memory provider. Copy the supplied fake environment file when you are ready to connect a real GitHub, GitLab, Linear, Jira, or Azure DevOps project. +seoTitle: TypeScript example apps +keywords: + - Work SDK examples + - TypeScript webhook bot + - AI agent approval CLI +--- + +Every committed token, account, domain, project, and webhook secret in these examples is intentionally fake. Both apps default to `WORK_PROVIDER=memory` and make no external network request. + +## Safe fake credentials [#safety] + +Each app includes a tracked `.env.example`. Copy it to the ignored `.env` file, select one provider, and replace only that provider's values. Fake values consistently contain `example` or use reserved example domains. + +```bash title=".env.example excerpt" +WORK_PROVIDER=azure-devops +WORK_ITEM_ID=42 +WORK_TARGET_STATE=Ready for validation + +# Fake values — replace only in your private .env +AZURE_DEVOPS_ORGANIZATION=acme-example +AZURE_DEVOPS_PROJECT=Platform +AZURE_DEVOPS_AUTH=entra +AZURE_DEVOPS_TOKEN=azure_example_not_a_real_token +``` + +Example 01 + +## Interactive approval CLI [#approval-cli] + +A terminal application that prepares an update, prints the exact diff and warnings, asks for explicit approval, and commits the reviewed plan with a stable idempotency key. Typing anything except `yes` exits without a provider mutation. + +Prepare → Print diff → Type yes → Commit + +### Run the local demo + +```bash title="Terminal" +pnpm --filter @work-sdk/example-approval-cli start +``` + +### Connect a provider + +```bash title="Terminal" +cd examples/approval-cli +cp .env.example .env +# Edit .env locally +pnpm start:env +``` + +[Browse the Approval CLI source →](https://github.com/arturict/work-sdk/tree/main/examples/approval-cli) + +Example 02 + +## Idempotent deployment webhook bot [#webhook-bot] + +A small HTTP service built with Node core APIs. It verifies an HMAC-SHA256 signature, validates a deployment event, prepares a Markdown comment, and uses the event ID as a business-stable idempotency key. Repeated deliveries return `replayed: true`. + +```json title="deployment.succeeded.json" +{ + "id": "deploy_example_20260712_001", + "status": "succeeded", + "environment": "staging", + "commit": "4cae7d53fb5d2da17ec7a4f342e28c31e95fdcb2", + "url": "https://deployments.example.com/runs/deploy_example_20260712_001" +} +``` + +### Run both sides locally + +```bash title="Terminal" +# Terminal 1 +pnpm --filter @work-sdk/example-webhook-bot start + +# Terminal 2 +pnpm --filter @work-sdk/example-webhook-bot send-demo +``` + +The app also exposes `GET /health`, rejects invalid signatures before a provider call, limits request bodies to 64 KiB, and returns small JSON receipts. + +[Browse the Webhook Bot source →](https://github.com/arturict/work-sdk/tree/main/examples/webhook-bot) + +## Before production [#production] + +| Demo default | Production replacement | +| --- | --- | +| Memory adapter | Authenticated GitHub, GitLab, Linear, Jira, or Azure DevOps adapter | +| Memory idempotency store | Transactional database or conditional durable store with atomic claims | +| Local fake webhook secret | Secret-manager value with rotation | +| Direct HTTP processing | Queue, retry policy, reconciliation, and dead-letter handling | +| Console output | Structured redacted logs and audit receipts | + + diff --git a/apps/web/content/docs/getting-started.mdx b/apps/web/content/docs/getting-started.mdx new file mode 100644 index 0000000..e40112f --- /dev/null +++ b/apps/web/content/docs/getting-started.mdx @@ -0,0 +1,95 @@ +--- +title: Build your first integration +description: Go from package installation to an inspectable, idempotency-coordinated provider write. This guide uses Linear, but the client lifecycle is identical for every adapter. +seoTitle: Getting started with Work SDK +keywords: + - install Work SDK + - TypeScript SDK quickstart + - work-sdk npm +--- + +## Requirements [#requirements] + +- Node.js 20 or newer +- TypeScript 5+ recommended +- Server-side credentials for at least one provider + + +Do not instantiate authenticated adapters in browser bundles. Provider tokens must never enter client-side code, model prompts, prepared plans, or logs. + + +## Install [#install] + +```bash title="npm" +npm install work-sdk +``` + +The package has zero runtime dependencies and publishes ESM, CommonJS, and declarations for every subpath. + +## Configure a client [#configure] + +```ts title="work.ts" +import { createWorkClient } from "work-sdk"; +import { linear } from "work-sdk/linear"; + +export const work = createWorkClient({ + adapter: linear({ + apiKey: process.env.LINEAR_API_KEY!, + teamId: process.env.LINEAR_TEAM_ID!, + }), +}); +``` + +Create one client per provider configuration. The adapter owns credentials and provider-specific routing; the client owns safe-write semantics. + +## Read normalized work [#read] + +```ts title="read.ts" +const item = await work.get("ENG-123"); + +console.log({ + id: item.identifier, + state: item.state, // normalized + stateName: item.stateName, // provider-native + revision: item.revision, // opaque: never parse it +}); + +const page = await work.list({ + state: ["unstarted", "started"], + labels: ["reliability"], + limit: 25, +}); +``` + +Use normalized fields for portable behavior and `stateName` or `raw` when a provider-native detail matters. + +## Write safely [#write] + +```ts title="comment.ts" +const change = await work.prepareComment("ENG-123", { + body: "Implemented and verified in staging.", +}); + +// Persist or render this plan before committing it. +console.log(change.summary); +console.table(change.changes); + +const receipt = await work.commit(change, { + idempotencyKey: "deploy:2026-07-12:ENG-123", +}); + +console.log(receipt.replayed); +``` + +A repeated successful idempotency key returns the stored receipt with `replayed: true` instead of performing the mutation again. + +## Production checklist [#production] + +- Use a durable `IdempotencyStore` with an atomic claim across processes. +- Inspect every warning before setting `acceptWarnings: true`. +- On `WorkConflictError`, discard the plan and prepare again. +- On `WorkAmbiguousCommitError`, reconcile provider state before another write. +- Pass `AbortSignal` from request or job cancellation. +- Check `work.capabilities` before exposing optional actions. + + diff --git a/apps/web/content/docs/guides/agents.mdx b/apps/web/content/docs/guides/agents.mdx new file mode 100644 index 0000000..c67ef73 --- /dev/null +++ b/apps/web/content/docs/guides/agents.mdx @@ -0,0 +1,78 @@ +--- +title: Give agents narrow, safe tools +description: Separate planning from authority. Let an agent propose normalized intent, but keep reviewed plans, approval records, idempotency keys, and provider credentials in trusted application code. +seoTitle: AI agent integration guide +keywords: + - AI agent tools + - coding agent SDK + - human approval workflow +--- + +## Separate prepare and commit [#boundaries] + +A single "update ticket" tool hides the most important boundary. Prefer a proposal tool that returns a plan and a commit tool that accepts only a trusted approval reference. + +```ts title="agent-tools.ts" +const prepareUpdateTool = { + name: "prepare_work_item_update", + description: "Prepare, but do not commit, a work-item update.", + inputSchema: updateSchemaFor(work.capabilities), + execute: ({ id, update }, { signal }) => + work.prepareUpdate(id, update, { signal }), +}; + +const commitTool = { + name: "commit_approved_work_change", + description: "Commit an already approved prepared change.", + inputSchema: approvedChangeReferenceSchema, + execute: async ({ approvalId }, { signal }) => { + const { change, idempotencyKey } = await approvals.consume(approvalId); + return work.commit(change, { idempotencyKey, acceptWarnings: true, signal }); + }, +}; +``` + + +Do not let the model manufacture `acceptWarnings`, approval IDs, stored plans, or idempotency keys. Resolve those values inside trusted code. + + +## Derive schemas from capabilities [#schemas] + +Remove unsupported fields at tool-construction time. Limit single-assignee providers to one entry and hide comments, parents, priorities, or states when the configured adapter cannot represent them. + +## Approval records [#approval] + +Store the entire prepared change, the displayed summary/diff, actor, policy result, timestamp, and approval scope. Commit the exact stored plan; never rebuild it from a model-produced summary. + +**Approval binds to fingerprint** — If any signed plan field changes, commit fails and approval must restart. + +## Business-derived keys [#idempotency] + +```ts +const idempotencyKey = [ + "agent", + run.triggerId, + change.action, + change.provider, + change.targetId ?? "new", +].join(":"); +``` + +Use stable trigger identity. Random attempt IDs defeat replay protection; vague keys can incorrectly deduplicate distinct effects. + +## Conflict recovery [#conflicts] + +When another actor changes the item after inspection, surface the conflict to the agent or user, prepare again from current state, show the new diff, and obtain new approval. Never mutate `expectedRevision` or force the stale write. + +## Operational rules [#rules] + +1. Credentials never enter prompts, tool results, or prepared-plan storage. +2. Read tools may be broader than write tools. +3. Prepare before any externally visible mutation. +4. Inspect all warnings and exact field changes. +5. Require policy or human approval where impact warrants it. +6. Commit stored plans with durable idempotency keys. +7. Redact provider details before returning errors to a model. +8. Audit receipts, not secrets or raw authorization data. + + diff --git a/apps/web/content/docs/guides/testing.mdx b/apps/web/content/docs/guides/testing.mdx new file mode 100644 index 0000000..7d1ac6a --- /dev/null +++ b/apps/web/content/docs/guides/testing.mdx @@ -0,0 +1,145 @@ +--- +title: Fast, deterministic tests +description: Use the memory adapter for application and agent behavior, inject fetch for provider protocol tests, and run the shared contract against custom adapters. No live credentials are required. +seoTitle: Testing Work SDK integrations +keywords: + - Work SDK testing + - issue tracker adapter tests + - AI agent integration tests +--- + +## Memory adapter [#memory] + +```ts title="test-setup.ts" +import { createWorkClient } from "work-sdk"; +import { memoryWorkAdapter, workItemFixture } from "work-sdk/testing"; + +const adapter = memoryWorkAdapter({ + items: [workItemFixture({ + id: "42", + identifier: "TEST-42", + title: "Initial title", + })], + now: () => new Date("2026-01-01T00:00:00Z"), +}); + +const work = createWorkClient({ + adapter, + now: () => new Date("2026-01-01T00:00:00Z"), +}); +``` + +The memory adapter implements the full contract, clones returned values, advances revisions, supports capability overrides, and honors abort signals. + +## Fixtures and capability overrides [#fixtures] + +`work-sdk/testing` also exports `workCommentFixture` and `fullWorkCapabilities` alongside `workItemFixture`. Both fixtures return a complete, valid object and deep-clone any overrides you pass: + +```ts title="fixtures.ts" +import { + fullWorkCapabilities, + memoryWorkAdapter, + workCommentFixture, + workItemFixture, +} from "work-sdk/testing"; + +const item = workItemFixture({ id: "7", state: "started", stateName: "In Progress" }); +const comment = workCommentFixture({ body: "Deploy scheduled." }); + +// Every capability enabled; concurrency is { update: "atomic", comment: "preflight" }. +console.log(fullWorkCapabilities.optimisticConcurrency); // true + +// Override capabilities to test unsupported-operation handling. +const readOnly = memoryWorkAdapter({ + capabilities: { create: false, update: false, comments: false }, +}); +``` + +`fullWorkCapabilities` is a frozen `WorkCapabilities` value with every feature enabled. `memoryWorkAdapter` merges its `capabilities` option over `fullWorkCapabilities`, so you only specify the flags you want to change. Operations disabled this way throw `WorkUnsupportedError`, letting you assert how your application and agent code degrade per provider. + +## Inspecting recorded calls [#calls] + +The adapter returned by `memoryWorkAdapter` is a `MemoryWorkAdapter`, which extends `WorkAdapter` with a recording and inspection API: + +- `calls` — an array of `MemoryAdapterCall` entries, one per adapter invocation in order. +- `items` — a `ReadonlyMap` snapshot of stored items (values are clones). +- `comments` — a `ReadonlyMap` snapshot of stored comments. +- `seed(items)` — insert additional items into the store. +- `clearCalls()` — reset the call log while keeping items and comments. +- `clear()` — reset items, comments, the call log, and internal id counters. + +Each `MemoryAdapterCall` records the `operation` (`"list"`, `"get"`, `"create"`, `"update"`, or `"addComment"`), a cloned copy of the input, the `signal` (if any), and — for updates — the `expectedRevision` passed by the caller. + +```ts title="inspect-calls.test.ts" +import { memoryWorkAdapter, workItemFixture } from "work-sdk/testing"; + +const adapter = memoryWorkAdapter(); +adapter.seed([workItemFixture({ id: "42", identifier: "TEST-42", title: "Initial title" })]); + +await adapter.update("42", { title: "New title" }, { expectedRevision: "1" }); + +expect(adapter.calls).toEqual([ + { + operation: "update", + id: "42", + input: { title: "New title" }, + expectedRevision: "1", + signal: undefined, + }, +]); +expect(adapter.items.get("42")?.revision).toBe("2"); + +adapter.clearCalls(); // forget recorded calls, keep state +adapter.clear(); // reset everything +``` + +## Test critical scenarios [#scenarios] + +- Prepared plan contains the expected exact diff. +- Mutating a plan causes fingerprint rejection. +- Warnings block commit until explicitly acknowledged. +- A repeated completed key returns `replayed: true`. +- Two independent clients sharing one store perform one mutation. +- A lost provider response becomes `WorkAmbiguousCommitError` and blocks retry. +- A stale revision raises `WorkConflictError`. +- Abort signals prevent provider calls. + +## Provider protocol tests [#fetch] + +Every first-party adapter accepts an injected WHATWG-compatible `fetch`. Assert URLs, authentication, escaped queries, request bodies, pagination, readback, and error normalization without network traffic. + +```ts title="azure-adapter.test.ts" +const fetch = vi.fn(async (input, init) => { + const url = new URL(String(input)); + + if (url.pathname.endsWith("/_apis/wit/wiql")) { + return Response.json({ workItems: [{ id: 42 }] }); + } + + return Response.json(azureWorkItemFixture); +}); + +const adapter = azureDevOps({ + organization: "acme", + project: "Platform", + fetch, +}); +``` + + +Prefer real `Request`, `Response`, and `Headers` objects in mocks. They catch casing, status, body-consumption, and header behavior that plain objects hide. + + +## Custom adapter contract [#contract] + +The repository exports a reusable internal conformance suite for first-party development. External adapters should verify the same invariants: stable identity, cloned reads, pagination, revision advancement, conflicts, comments, and cancellation. + +## Recommended test pyramid [#recommended] + +| Layer | Purpose | Network | +| --- | --- | --- | +| Core unit tests | Plans, integrity, warnings, idempotency, conflicts | None | +| Adapter protocol tests | Exact provider requests and responses | Injected fetch | +| Package smoke | ESM/CJS/types/subpath exports after packing | Local install | +| Sandbox integration | Tenant permissions and workflow metadata | Provider test tenant | +| Production canary | Credential and API drift detection | Read-only or isolated target | diff --git a/apps/web/content/docs/index.mdx b/apps/web/content/docs/index.mdx new file mode 100644 index 0000000..63f13fd --- /dev/null +++ b/apps/web/content/docs/index.mdx @@ -0,0 +1,70 @@ +--- +title: Work SDK documentation +description: One typed interface for reading and safely writing work across GitHub Issues, GitLab, Linear, Jira Cloud, and Azure DevOps. Start with a provider, then adopt the prepare → inspect → commit protocol where side effects matter. +seoTitle: Documentation +keywords: + - Work SDK documentation + - TypeScript issue tracker SDK + - AI agent work item API +--- + +Work SDK is a local TypeScript library. Credentials stay in your process and requests go directly to the configured tracker. + +## Choose a path [#choose-a-path] + +1. **[Build your first integration](/docs/getting-started)** — Install the package, configure a provider, read an item, and commit a safe update. +2. **[Add Azure DevOps](/docs/providers/azure-devops)** — Configure Entra or PAT auth, custom processes, WIQL search, priorities, and parent links. +3. **[Give it to an agent](/docs/guides/agents)** — Design narrow tools, approval gates, stable idempotency keys, and conflict recovery. +4. **[Look up the API](/docs/reference/client)** — Review every client method, normalized type, capability, and commit receipt. +5. **[Run a real example app](/docs/examples)** — Try an approval CLI or signed webhook bot locally with safe fake credentials. + +## Your first safe write [#first-write] + +Provider adapters are separate subpath exports. Your application gets one normalized client without pulling unused provider code into the bundle. + +```bash title="Terminal" +npm install work-sdk +``` + +```ts title="safe-update.ts" +import { createWorkClient } from "work-sdk"; +import { github } from "work-sdk/github"; + +const work = createWorkClient({ + adapter: github({ + owner: "acme", + repo: "api", + token: process.env.GITHUB_TOKEN!, + }), +}); + +const change = await work.prepareUpdate("481", { + state: "closed", +}); + +console.log(change.changes, change.warnings); + +const result = await work.commit(change, { + idempotencyKey: "merge:acme/api#481", +}); +``` + +`prepareUpdate` reads the current item and creates an integrity-protected plan. No provider mutation occurs until `commit`. + +## The mental model [#mental-model] + +1. **Prepare intent.** Validate input, read current state, calculate an exact diff, and capture the expected revision. +2. **Inspect consequences.** Evaluate field changes and provider warnings in code, an approval UI, or an agent policy. +3. **Commit once.** Verify the plan fingerprint and revision, then write with a stable idempotency key. + +## Provider support [#support] + +| Provider | Import | Protocol | Distinctive behavior | +| --- | --- | --- | --- | +| GitHub Issues | `work-sdk/github` | REST | Open/closed state reasons, multiple assignees | +| GitLab | `work-sdk/gitlab` | REST v4 | Self-Managed, guarded labels, explicit type maps | +| Linear | `work-sdk/linear` | GraphQL | Cursor pagination, team workflow resolution | +| Jira Cloud | `work-sdk/jira` | REST v3 | ADF rich text, workflow transitions | +| Azure DevOps | `work-sdk/azure-devops` | REST + WIQL | JSON Patch revisions, custom processes, parent relations | + + diff --git a/apps/web/content/docs/meta.json b/apps/web/content/docs/meta.json new file mode 100644 index 0000000..5859cfd --- /dev/null +++ b/apps/web/content/docs/meta.json @@ -0,0 +1,24 @@ +{ + "root": true, + "pages": [ + "---Start---", + "index", + "getting-started", + "examples", + "---Concepts---", + "concepts/safe-writes", + "providers/index", + "---Providers---", + "providers/github", + "providers/gitlab", + "providers/linear", + "providers/jira", + "providers/azure-devops", + "---Reference---", + "reference/client", + "reference/errors", + "---Guides---", + "guides/agents", + "guides/testing" + ] +} diff --git a/apps/web/content/docs/providers/azure-devops.mdx b/apps/web/content/docs/providers/azure-devops.mdx new file mode 100644 index 0000000..6e860c1 --- /dev/null +++ b/apps/web/content/docs/providers/azure-devops.mdx @@ -0,0 +1,162 @@ +--- +title: Azure DevOps +description: A first-class Azure Boards adapter with Entra and PAT authentication, WIQL discovery, custom-process normalization, Markdown comments, priority mapping, hierarchy links, and native revision checks. +seoTitle: Azure DevOps TypeScript SDK adapter +keywords: + - Azure DevOps TypeScript SDK + - Azure DevOps work items API + - WIQL SDK +--- + +## Setup [#setup] + +```ts title="azure-work.ts" +import { createWorkClient } from "work-sdk"; +import { azureDevOps } from "work-sdk/azure-devops"; + +const work = createWorkClient({ + adapter: azureDevOps({ + organization: "acme", + project: "Platform", + auth: { type: "entra", token: accessToken }, + }), +}); +``` + +The adapter targets Azure DevOps REST API 7.1. The organization and project are path-scoped, so an accidentally supplied foreign project is rejected rather than silently redirected. An optional `fetch` option accepts a custom `WorkFetch` implementation when you need to route requests through instrumented or proxied HTTP clients. + +## Authentication [#authentication] + +### Microsoft Entra ID + +Use Entra access tokens for production applications, service principals, or managed identities. + +```ts +auth: { type: "entra", token: accessToken } +``` + +### Personal access token + +PATs are convenient for local scripts and prototypes. They are sent as Basic credentials with an empty username. + +```ts +auth: { type: "pat", token: process.env.AZURE_DEVOPS_PAT! } +``` + + +PATs are long-lived credentials. Prefer Entra tokens in production, scope credentials to work-item access, rotate them, and keep them out of browser code and agent context. + + +## Custom processes [#custom-processes] + +Azure organizations can rename states and introduce custom work-item types. Reads must map provider names to the portable model; creates need the reverse mapping. Work SDK keeps both directions explicit. + +```ts title="custom-process.ts" +const adapter = azureDevOps({ + organization: "acme", + project: "Platform", + auth: { type: "entra", token: accessToken }, + + // Provider state name → normalized read/filter state + stateMap: { + "Ready for validation": "started", + "Released": "completed", + }, + + // Normalized write state → one concrete tenant state + stateNameByCanonical: { + completed: "Released", + }, + + // Provider type name → normalized read kind + workItemTypeMap: { + "Customer Request": "story", + }, + + // Normalized create kind → tenant-specific provider type + workItemTypeByKind: { + story: "Product Backlog Item", + }, + + defaultWorkItemType: "Task", +}); +``` + +Built-in defaults cover common Agile, Scrum, and Basic process names. Custom entries extend or override those case-insensitive defaults. + +## Read, search, and write [#operations] + +```ts title="azure-operations.ts" +const page = await work.list({ + query: "retry webhook", + state: "started", + labels: ["reliability"], + limit: 50, +}); + +const change = await work.prepareUpdate("42", { + state: "Ready for validation", // exact Azure state name + priority: "high", // maps to Azure priority 2 + assigneeIds: ["ada@example.com"], + labels: ["sdk", "agent-safe"], + parentId: "10", +}); + +await work.commit(change, { + idempotencyKey: "release:42:validation", +}); +``` + +Provider-native state values remain accepted. Canonical writes such as `completed` use `stateNameByCanonical`; if several tenant names map to the same canonical state and no inverse is configured, the adapter fails as ambiguous instead of guessing. + +## Field mapping [#fields] + +| Work SDK | Azure DevOps | Notes | +| --- | --- | --- | +| `title` | `System.Title` | Required on create | +| `description` | `System.Description` | Returned as provider HTML | +| `stateName` | `System.State` | Exact provider state | +| `priority` | `Microsoft.VSTS.Common.Priority` | urgent/high/medium/low → 1/2/3/4 | +| `assigneeIds[0]` | `System.AssignedTo` | Identity ID, email, or resolvable name | +| `labels` | `System.Tags` | Semicolon-separated provider field | +| `parentId` | Hierarchy-Reverse relation | Existing parent replaced atomically | +| `revision` | `rev` | Opaque string to consumers | + +## WIQL search and pagination [#pagination] + +`list` builds an escaped WIQL query, fetches ordered IDs, and hydrates pages through the batch work-item endpoint. Cursors are opaque and scoped to this adapter. + +- Maximum page size: 100 +- WIQL window: 20,000 results +- Batch hydration: at most 100 items per SDK page +- State filters use the configured state-name map + + +WIQL offset pagination is not a snapshot. For long-running crawls, items changing between pages can move in the order. Use targeted filters and restart a crawl when strict snapshot semantics matter. + + +## Native revision protection [#concurrency] + +Prepared updates capture Azure's numeric `rev`. Commit first rechecks the normalized revision, then sends a JSON Patch `test` operation against `/rev` in the same mutation request. A stale write fails as `WorkConflictError`. + +## Azure DevOps Server and proxies [#server] + +`apiBaseUrl` replaces `https://dev.azure.com/{organization}`. Point it at the collection root; the adapter appends the encoded project and API paths. + +```ts +azureDevOps({ + organization: "collection-label", + project: "Platform", + apiBaseUrl: "https://devops.example.com/tfs/DefaultCollection", + auth: { type: "pat", token }, +}) +``` + +## Known boundaries [#limitations] + +- Boards, iterations, area paths, attachments, relations other than parent, and custom fields are outside the portable v0.x model. +- Descriptions are preserved as provider HTML; Work SDK does not perform lossy HTML-to-Markdown conversion. +- Identity writes depend on Azure DevOps resolving the supplied ID, email, or name. +- Provider rules can modify fields. The adapter verifies important returned fields and fails closed on mismatches. + + diff --git a/apps/web/content/docs/providers/github.mdx b/apps/web/content/docs/providers/github.mdx new file mode 100644 index 0000000..42cf2b2 --- /dev/null +++ b/apps/web/content/docs/providers/github.mdx @@ -0,0 +1,85 @@ +--- +title: GitHub Issues +description: Use issue numbers as IDs, keep pull requests out of issue results, and treat open or closed as GitHub's portable state boundary. +seoTitle: GitHub Issues adapter +keywords: + - GitHub Issues TypeScript SDK + - GitHub issue agent + - GitHub safe writes +--- + +## Configure [#configure] + +```ts title="work.ts" +import { createWorkClient } from "work-sdk"; +import { github } from "work-sdk/github"; + +export const work = createWorkClient({ + adapter: github({ + owner: "octo-org", + repo: "product", + token: process.env.GITHUB_TOKEN!, + }), +}); +``` + +The token stays in your process. Requests go to `api.github.com` by default; set `apiBaseUrl` to target a GitHub Enterprise Server instance instead. Inject `fetch` in tests or when your runtime requires a custom transport. + +| Option | Required | Description | +| --- | --- | --- | +| `token` | No | Bearer token sent with each request. Omit it for unauthenticated reads of public repositories. | +| `owner` | Yes | Repository owner (user or organization login). | +| `repo` | Yes | Repository name. | +| `apiBaseUrl` | No | REST API base URL, default `https://api.github.com`. Point it at your GitHub Enterprise Server API endpoint to use GHES. | +| `fetch` | No | Custom fetch implementation, default `globalThis.fetch`. Useful for tests, proxies, or custom transports. | + +## Permissions [#permissions] + +Fine-grained personal access tokens need repository access plus read and write permission for Issues. GitHub App installation tokens are preferable for multi-tenant applications because each installation has an explicit repository boundary. + + +Never expose a GitHub token to a browser or to an untrusted model prompt. Keep the Work SDK client in a server process or isolated tool runtime. + + +## Identifiers [#identifiers] + +- **`id`** — The decimal issue number as a string, for example `"481"`. +- **`identifier`** — A readable repository-qualified value such as `octo-org/product#481`. +- **`revision`** — A deterministic readback fingerprint used for preflight conflict detection. + +## Field mapping [#mapping] + +| Work SDK | GitHub | Notes | +| --- | --- | --- | +| state | `open` / `closed` | Completed maps to closed; custom workflow states are not available. | +| assigneeIds | logins | Multiple assignees are supported when the repository allows them. | +| labels | label names | Label names are passed through as-is; GitHub may create labels that do not exist yet. Labels dropped because the token lacks permission fail readback verification. | +| kind | issue type | GitHub issue types map to `bug`, `task`, `story`, and `epic` on read (anything else is `issue`), and `kind` sets the issue type on create. Pull requests are excluded from list results. | + +## Safe write [#safe-write] + +```ts title="close-issue.ts" +const change = await work.prepareUpdate("481", { + state: "completed", + labels: ["ready-to-ship"], +}); + +for (const warning of change.warnings) { + console.warn(warning.code, warning.message); +} + +const result = await work.commit(change, { + idempotencyKey: "release:product#481", + acceptWarnings: change.warnings.length > 0, +}); +``` + +The returned receipt is narrowed to `UpdateCommitResult`. GitHub cannot atomically test an issue revision during the write, so update concurrency is reported as `preflight`, not `atomic`. + +## Limits and escape hatches [#limits] + +- GitHub Projects fields are outside the portable issue contract. +- Organization-specific metadata remains available through `raw` for reads. +- Repository rules and token permissions can reject an action even when the adapter capability is true. + + diff --git a/apps/web/content/docs/providers/gitlab.mdx b/apps/web/content/docs/providers/gitlab.mdx new file mode 100644 index 0000000..c62d540 --- /dev/null +++ b/apps/web/content/docs/providers/gitlab.mdx @@ -0,0 +1,116 @@ +--- +title: GitLab +description: Use one conservative REST v4 adapter for GitLab.com and GitLab Self-Managed. The defaults favor visible failures over silent provider-side creation or lossy type guesses. +seoTitle: GitLab Issues TypeScript SDK adapter +keywords: + - GitLab Issues TypeScript SDK + - GitLab Self-Managed API + - GitLab AI agent integration +--- + +## Configure the adapter [#configure] + +```ts title="work.ts" +import { createWorkClient } from "work-sdk"; +import { gitlab } from "work-sdk/gitlab"; + +const work = createWorkClient({ + adapter: gitlab({ + project: "acme/platform", + token: process.env.GITLAB_TOKEN!, + }), +}); +``` + +`project` accepts a numeric GitLab project ID or a full path such as `group/subgroup/project`. Work SDK URL-encodes the path exactly once and keeps issue IDs project-scoped. The adapter also accepts an optional `fetch` implementation for custom transports, proxies, or tests. + +## Authentication [#authentication] + +The `token` shorthand sends a GitLab private-token header and works with personal, project, or group access tokens where the GitLab tier permits them. Use explicit OAuth auth when the credential is an OAuth access token. + +```ts title="OAuth" +gitlab({ + project: 77, + auth: { + type: "oauth", + token: process.env.GITLAB_OAUTH_TOKEN!, + }, +}); +``` + +`token` and `auth` are mutually exclusive. Credentials belong in server-side environment variables and never in browser code, prompts, prepared plans, or logs. + +## GitLab Self-Managed [#self-managed] + +```ts title="self-managed.ts" +gitlab({ + project: "platform/backend", + token: process.env.GITLAB_TOKEN!, + apiBaseUrl: "https://gitlab.example.com/api/v4", +}); +``` + +Point `apiBaseUrl` at the instance REST v4 root. Rate limits, enabled issue types, tiers, and access-token rules can differ from GitLab.com, so treat instance policy as runtime configuration rather than SDK defaults. + +## Guarded labels [#labels] + +GitLab creates missing labels when an issue write includes them. That is a second side effect hidden inside a normal issue mutation, so Work SDK resolves project labels first and rejects unknown values by default. + +```ts title="create-issue.ts" +const change = await work.prepareCreate({ + title: "Reconcile deployment result", + labels: ["agent-safe"], +}); + +// The adapter first verifies that "agent-safe" already exists. +// Missing labels fail before GitLab can create them as a side effect. +await work.commit(change, { + idempotencyKey: "deployment:run_123:issue", +}); +``` + +Set `allowCreateLabels: true` only when the application policy explicitly allows label creation. The option changes a safety boundary and should not be enabled merely to suppress validation errors. + +## Issue types [#types] + +GitLab REST exposes `issue`, `task`, `incident`, and `test_case`. Work SDK maps issue and task directly. Bug, story, epic, and subtask have no universal GitLab equivalent and fail unless you configure an explicit map. + +```ts title="explicit-kind-map.ts" +gitlab({ + project: "acme/platform", + token: process.env.GITLAB_TOKEN!, + issueTypeByKind: { + bug: "issue", + story: "issue", + }, +}); +``` + +## Assignees [#assignees] + +Use numeric GitLab user IDs in `assigneeIds`. Multiple assignees are tier-dependent and remain disabled by default. Set `multipleAssignees: true` only after confirming the target instance supports the behavior. + +## Search and pagination [#pagination] + +`list` forwards text search, assignee username, labels, and opened/closed state filters. The adapter uses opaque `gitlab:page:…` cursors and reads `X-Next-Page` or the standard Link header without depending on total-count headers. + +```ts title="list.ts" +const page = await work.list({ + query: "deployment", + labels: ["agent-safe"], + state: ["unstarted", "completed"], + limit: 50, +}); + +if (page.nextCursor) { + await work.list({ cursor: page.nextCursor, limit: 50 }); +} +``` + +## Concurrency and retries [#concurrency] + +The adapter fingerprints the issue fields that affect normalized behavior, then re-reads immediately before an update. GitLab REST does not expose an atomic issue revision precondition, so a small race window remains between that read and the PUT request. + +On `WorkConflictError`, discard the plan and prepare again. Always use a durable idempotency store for distributed workers because GitLab issue writes do not provide a universal native idempotency key. + + diff --git a/apps/web/content/docs/providers/index.mdx b/apps/web/content/docs/providers/index.mdx new file mode 100644 index 0000000..f20bf84 --- /dev/null +++ b/apps/web/content/docs/providers/index.mdx @@ -0,0 +1,110 @@ +--- +title: One contract, honest differences +description: Adapters normalize the portable work-item model while preserving provider-native state names, raw payloads, capabilities, and failure behavior. The goal is portability without pretending every tracker works the same way. +seoTitle: GitHub, GitLab, Linear, Jira, and Azure DevOps adapters +keywords: + - GitHub Linear Jira SDK + - Azure DevOps TypeScript SDK + - issue tracker adapters +--- + +## Provider entry points [#imports] + +```ts title="providers.ts" +import { github } from "work-sdk/github"; +import { gitlab } from "work-sdk/gitlab"; +import { linear } from "work-sdk/linear"; +import { jira } from "work-sdk/jira"; +import { azureDevOps } from "work-sdk/azure-devops"; +``` + +Subpath exports keep provider implementations independently tree-shakeable. All adapters return the same `WorkAdapter` contract. + +## Capability matrix [#matrix] + +| Capability | GitHub | GitLab | Linear | Jira | Azure DevOps | +| --- | --- | --- | --- | --- | --- | +| Create / update | Yes | Yes | Yes | Yes | Yes | +| Comments | Markdown | Markdown | Markdown | ADF | Markdown | +| Custom states | No | No | Yes | Yes | Yes | +| Priorities | No universal field | No universal field | Native | Native | 1–4 mapping | +| Multiple assignees | Yes | Opt-in | No | No | No | +| Parent links | No | No | Yes | Yes | Yes | +| Search | Not in adapter | REST search | GraphQL filters | JQL | WIQL | +| Concurrency | Readback revision | Readback revision | Readback revision | Readback revision | Native `/rev` test | + +## GitHub Issues [#github] + +```ts +github({ + owner: "acme", + repo: "web", + token: process.env.GITHUB_TOKEN, +}) +``` + +The adapter excludes pull requests from issue results, maps open/closed reasons, verifies fields through readback, and supports multiple assignees. GitHub Projects fields are intentionally outside the portable issue contract. + + + +## GitLab [#gitlab] + +```ts +gitlab({ + project: "acme/platform", + token: process.env.GITLAB_TOKEN!, + // apiBaseUrl: "https://gitlab.example.com/api/v4", +}) +``` + +The REST v4 adapter supports GitLab.com and Self-Managed. It validates labels before writes, requires explicit mappings for non-native issue kinds, and keeps tier-dependent multiple assignees opt-in. + + + +## Linear [#linear] + +```ts +linear({ + apiKey: process.env.LINEAR_API_KEY!, + teamId: "team-id", +}) +``` + +Linear uses cursor pagination, one assignee, native priorities, and team-specific workflow states. The adapter resolves state and label names against provider metadata before a mutation. + + + +## Jira Cloud [#jira] + +```ts +jira({ + baseUrl: "https://acme.atlassian.net", + email: process.env.JIRA_EMAIL!, + apiToken: process.env.JIRA_API_TOKEN!, + projectKey: "ENG", +}) +``` + +Jira status changes are transitions, not ordinary field updates. The adapter discovers available transitions and converts conservative text content to Atlassian Document Format. + + + +## Azure DevOps [#azure] + +```ts +azureDevOps({ + organization: "acme", + project: "Platform", + auth: { type: "entra", token: accessToken }, +}) +``` + +Azure DevOps uses WIQL for discovery and JSON Patch for mutation. Custom processes can redefine state and work-item type names, so the adapter exposes explicit normalization maps. + + + +## Provider escape hatches [#escape-hatches] + +Every normalized item, user, project, and comment can retain `raw`. Use it for reads that are not portable. For provider-specific writes outside the adapter contract, build a narrow custom tool instead of mutating `raw` and pretending the operation is normalized. + +Capability flags describe adapter-level support. Tenant workflow rules and user permissions can still reject an individual operation. diff --git a/apps/web/content/docs/providers/jira.mdx b/apps/web/content/docs/providers/jira.mdx new file mode 100644 index 0000000..6d44a35 --- /dev/null +++ b/apps/web/content/docs/providers/jira.mdx @@ -0,0 +1,91 @@ +--- +title: Jira Cloud +description: Jira status updates are workflow transitions, descriptions use Atlassian Document Format, and project configuration decides which writes are valid. +seoTitle: Jira Cloud adapter +keywords: + - Jira Cloud TypeScript SDK + - Jira agent tools + - Jira transition API +--- + +## Configure [#configure] + +```ts title="work.ts" +import { createWorkClient } from "work-sdk"; +import { jira } from "work-sdk/jira"; + +export const work = createWorkClient({ + adapter: jira({ + baseUrl: "https://example.atlassian.net", + email: "agent@example.com", + apiToken: process.env.JIRA_API_TOKEN!, + projectKey: "ENG", + }), +}); +``` + +`baseUrl` is your Jira Cloud tenant root without a trailing REST path. `projectKey` supplies the default project for creates and search. + +| Option | Type | Behavior | +| --- | --- | --- | +| `baseUrl` | `string` | Jira Cloud tenant root without a trailing REST path. | +| `projectKey` | `string` | Default project for creates and search. | +| `email` | `string` | Atlassian account email for basic authentication (paired with `apiToken`). | +| `apiToken` | `string` | Atlassian API token for basic authentication (paired with `email`). | +| `accessToken` | `string` | OAuth 2.0 bearer token. Mutually exclusive with `email`/`apiToken`. | +| `issueType` | `string` | Default issue type for creates when `kind` does not map to one. Defaults to `"Task"`. | +| `priorityNameByCanonical` | `Partial>` | Maps normalized priorities to tenant-specific or localized Jira priority names. | + +## Authentication [#auth] + +Basic authentication uses the Atlassian account email and an API token, not the account password. OAuth 2.0 applications can provide a bearer token through `accessToken`; configure either `accessToken` or `email`/`apiToken`, not both. + + +Jira API tokens often span more projects than an individual tool needs. Run the client in a server boundary and use a dedicated account with the narrowest practical project permissions. + + +## Workflow transitions [#transitions] + +Jira does not update `status` like an ordinary field. The adapter reads available transitions for the issue, resolves the requested normalized or display state, and then invokes the matching transition ID. + +Requested **completed** → Available transitions → **Done** / transition 31 + +If no unambiguous transition exists, preparation or commit fails instead of choosing a similarly named state. + +## Content and fields [#content] + +| Work SDK | Jira Cloud | Behavior | +| --- | --- | --- | +| description | ADF document | Plain text is converted conservatively. | +| comment | ADF document | The normalized body remains plain text. | +| priority | priority name / ID | Resolved against tenant metadata; override names with `priorityNameByCanonical`. | +| parentId | parent issue key | Supported when the issue type allows it. | +| kind | issue type | Maps task, bug, story, epic, and subtask; other creates use the configured `issueType`. | + +## Safe write [#safe-write] + +```ts title="transition-jira.ts" +const change = await work.prepareUpdate("ENG-42", { + state: "completed", + description: "Validated by the release agent.", +}); + +if (change.warnings.length) { + await requestHumanApproval(change); +} + +const receipt = await work.commit(change, { + idempotencyKey: "deploy:2026-07-24:ENG-42", + acceptWarnings: true, +}); +``` + +The receipt is an `UpdateCommitResult`. The adapter re-reads the issue revision before writing, but Jira's multi-request transition flow still has a race window and is reported as preflight concurrency. + +## Limits [#limits] + +- Required custom fields cannot be inferred across tenants. +- Rich ADF structures beyond conservative text conversion remain provider-specific. +- Workflow validators, conditions, and automation can reject an otherwise valid transition. + + diff --git a/apps/web/content/docs/providers/linear.mdx b/apps/web/content/docs/providers/linear.mdx new file mode 100644 index 0000000..803794f --- /dev/null +++ b/apps/web/content/docs/providers/linear.mdx @@ -0,0 +1,70 @@ +--- +title: Linear +description: Resolve team-specific workflows before mutation and keep Linear's native priorities, cursor pagination, and parent links behind the normalized contract. +seoTitle: Linear adapter +keywords: + - Linear TypeScript SDK + - Linear issue agent + - Linear API adapter +--- + +## Configure [#configure] + +```ts title="work.ts" +import { createWorkClient } from "work-sdk"; +import { linear } from "work-sdk/linear"; + +export const work = createWorkClient({ + adapter: linear({ + apiKey: process.env.LINEAR_API_KEY!, + teamId: "team_01JEXAMPLE", + }), +}); +``` + +The adapter accepts five options: `apiKey` (personal API key for a single workspace), `accessToken` (OAuth access token for an installed application, an alternative to `apiKey`), `teamId`, `endpoint` (custom GraphQL endpoint), and `fetch` (custom fetch implementation). `teamId` provides the default team for creates and state resolution. + +## Teams and identifiers [#teams] + +`get` accepts a Linear UUID or readable identifier such as `ENG-123`. Creates require the `teamId` adapter option: without it, `capabilities.create` is `false` and `prepareCreate` fails with `WorkUnsupportedError`. `input.project` maps to `projectId` — a Linear project assignment — and never substitutes for a team. List cursors are opaque GraphQL cursors and must be passed back unchanged. + + +State and label names are scoped by workspace and team. Resolve them through the adapter rather than hard-coding internal Linear IDs in an agent prompt. + + +## States and priorities [#states] + +| Work SDK | Linear | +| --- | --- | +| backlog | Workflow state type `backlog` | +| unstarted | Workflow state type `unstarted` | +| started | Workflow state type `started` | +| completed | Workflow state type `completed` | +| canceled | Workflow state type `canceled` | +| urgent / high / medium / low / none | Native priority 1–4 or 0 | + +The normalized `state` is portable. `stateName` preserves the workspace's exact display name, such as "In review". + +## Safe write [#safe-write] + +```ts title="complete-linear-issue.ts" +const change = await work.prepareUpdate("ENG-123", { + state: "Done", + priority: "high", + parentId: "ENG-100", +}); + +const receipt = await work.commit(change, { + idempotencyKey: "agent-run:42:ENG-123", +}); +``` + +Prepared changes include the current Linear issue and revision fingerprint. A final read blocks a stale plan before mutation; Linear does not expose an atomic compare-and-set for this adapter, so the guarantee remains preflight. + +## Limits [#limits] + +- Linear supports one assignee in the portable contract. +- Custom fields and project milestones remain provider-specific. +- Workspace permissions and team membership still apply to every request. + + diff --git a/apps/web/content/docs/reference/client.mdx b/apps/web/content/docs/reference/client.mdx new file mode 100644 index 0000000..222d383 --- /dev/null +++ b/apps/web/content/docs/reference/client.mdx @@ -0,0 +1,137 @@ +--- +title: Client API reference +description: The complete normalized client surface. Provider adapters implement transport and mapping; WorkClient adds validation, plans, revisions, warning acknowledgement, and idempotency. +seoTitle: WorkClient API reference +keywords: + - WorkClient API + - Work SDK TypeScript reference + - prepared work changes +--- + +## `createWorkClient` [#create] + +```ts +function createWorkClient(options: { + adapter: WorkAdapter; + idempotencyStore?: IdempotencyStore; + now?: () => Date; +}): WorkClient; +``` + +`adapter` is required. The default idempotency store is process-local memory. `now` exists for deterministic testing and should normally be omitted. + +## Read methods [#reads] + +### `get(id, options?)` + +```ts +get(id: string, options?: { signal?: AbortSignal }): Promise +``` + +Returns one normalized item or throws `WorkNotFoundError`. IDs are adapter-native: a GitHub issue number, GitLab issue IID, Linear ID or identifier, Jira key, or Azure work-item ID. + +### `list(input?, options?)` + +```ts +list(input?: { + project?: string; assignee?: string; + state?: WorkItemState | WorkItemState[]; + labels?: string[]; query?: string; + limit?: number; cursor?: string; +}, options?: { signal?: AbortSignal }): Promise> +``` + +Returns an opaque provider cursor. Never construct or parse cursors; pass `nextCursor` back unchanged. + +## Prepare methods [#prepare] + +- `prepareCreate(input)` — Plan a new item without writing it. +- `prepareUpdate(id, input, options?)` — Read current state and calculate a changed-field diff. +- `prepareComment(id, input, options?)` — Read the target and plan a comment. + +Create plans do not have an expected revision. Update and comment plans capture the current item and opaque revision. + +## `commit(change, options?)` [#commit] + +```ts +commit( + change: TChange, + options?: { + idempotencyKey?: string; + acceptWarnings?: boolean; + signal?: AbortSignal; + }, +): Promise> +``` + +Commit validates provider identity, fingerprint integrity, warning acknowledgement, idempotency state, and revision before calling the adapter. The receipt follows the prepared action: create plans return `CreateCommitResult`, updates return `UpdateCommitResult`, and comments return `CommentCommitResult` with a required `comment`. + +```ts title="typed-receipt.ts" +const change = await work.prepareComment("ENG-42", { + body: "Validated in staging.", +}); + +const receipt = await work.commit(change); +receipt.action; // "comment" +receipt.comment.body; // string, not optional +``` + + +If a mutation starts and the provider outcome becomes uncertain, Work SDK stores an ambiguous state and throws `WorkAmbiguousCommitError`. Reconcile the provider result before another write; never blind-retry that key. + + +## Core types [#types] + +| Type | Purpose | +| --- | --- | +| `WorkItem` | Normalized item plus provider state name, opaque revision, URL, and optional raw payload. | +| `WorkComment` | Normalized body, author, timestamps, and raw payload. | +| `PreparedWorkChange` | Serializable, fingerprinted plan for one create, update, or comment. | +| `CommitResult` | Discriminated union of create, update, and comment receipts with replay flag and commit time. | +| `CommitResultFor` | Maps a prepared change type to its exact action-specific receipt. | +| `WorkPage` | Items plus an optional opaque next cursor. | +| `WorkWarning` | Structured provider limitation or lossy/ambiguous mapping notice. | + +## Capabilities [#capabilities] + +`work.capabilities` is an immutable snapshot. Inspect it when building tools or UIs so unsupported actions are absent rather than offered and rejected later. + +```ts +if (work.capabilities.parentLinks) { + tools.push(updateParentTool(work)); +} + +if (!work.capabilities.multipleAssignees) { + schema.assigneeIds = z.array(z.string()).max(1); +} + +switch (work.capabilities.concurrency.update) { + case "atomic": // provider rejects races in the write itself + case "preflight": // SDK re-reads, but a small race window remains + case "none": +} +``` + +`optimisticConcurrency` remains as a deprecated compatibility Boolean. New code should use the action-specific `concurrency` object. + +## `IdempotencyStore` [#store] + +```ts +interface IdempotencyStore { + acquire(key: string, intentFingerprint: string): MaybePromise< + | { status: "acquired"; leaseId: string } + | { status: "completed"; result: CommitResult } + | { status: "in-flight" | "ambiguous" | "conflict" } + >; + complete(key: string, leaseId: string, result: CommitResult): MaybePromise; + abandon(key: string, leaseId: string, outcome: "retryable" | "ambiguous"): MaybePromise; +} +``` + +The client prefixes keys with the provider. `acquire` must be atomic across every worker using the store; use a transaction, compare-and-swap, unique insert, or conditional put. A durable `get` followed by `set` is not sufficient. + +- **completed** — Replay the stored receipt without a provider call. +- **in-flight** — Throw `WorkInFlightError`; another worker owns the claim. +- **ambiguous** — Throw `WorkAmbiguousCommitError`; reconcile before retrying. + + diff --git a/apps/web/content/docs/reference/errors.mdx b/apps/web/content/docs/reference/errors.mdx new file mode 100644 index 0000000..ae27d22 --- /dev/null +++ b/apps/web/content/docs/reference/errors.mdx @@ -0,0 +1,93 @@ +--- +title: Normalized errors +description: Every provider maps transport and domain failures into stable classes. Branch on classes or codes, retain the provider context, and choose retry behavior deliberately. +seoTitle: Error handling reference +keywords: + - Work SDK errors + - API conflict handling + - issue tracker rate limits +--- + +## Error hierarchy [#hierarchy] + +| Class | Code | Typical response | +| --- | --- | --- | +| `WorkAuthenticationError` | authentication | Refresh or replace credentials; do not blind-retry. | +| `WorkAuthorizationError` | authorization | Request scope/permission or remove the action. | +| `WorkNotFoundError` | not_found | Verify target and visibility. | +| `WorkRateLimitError` | rate_limit | Retry after the supplied delay with jitter. | +| `WorkConflictError` | conflict | Re-read, prepare a new plan, request approval again. | +| `WorkInFlightError` | in_flight | Wait for the current claim owner, then reuse the same key. | +| `WorkAmbiguousCommitError` | ambiguous | Reconcile provider state; never blind-retry. | +| `WorkUnsupportedError` | unsupported | Change the tool schema or provider strategy. | +| `WorkValidationError` | validation | Fix input; retrying unchanged input is wrong. | +| `WorkError` | provider / network | Inspect cause and provider policy. | + +## Shared fields [#fields] + +```ts +error.code // stable WorkErrorCode +error.provider // github | linear | jira | azure-devops | gitlab | custom +error.status // provider HTTP status when available +error.retryAfterMs // normalized delay for rate limits +error.details // parsed provider or validation context +error.cause // standard Error cause chain +``` + +## Typed handling [#handling] + +When class identity is not guaranteed — for example in CommonJS or mixed ESM+CJS graphs where the same class can be loaded twice through different entry points — prefer branching on `error.code` (`WorkErrorCode`) as the discriminator; it is a plain string and stays reliable everywhere. The `instanceof` example below works whenever your app resolves a single copy of `work-sdk`, but keep that caveat in mind. + +```ts title="error-policy.ts" +import { + WorkAmbiguousCommitError, + WorkAuthenticationError, + WorkConflictError, + WorkInFlightError, + WorkRateLimitError, + WorkValidationError, +} from "work-sdk"; + +try { + return await work.commit(change, { idempotencyKey }); +} catch (error) { + if (error instanceof WorkAuthenticationError) { + return refreshCredentials(); + } + if (error instanceof WorkRateLimitError) { + return retryAfter(error.retryAfterMs); + } + if (error instanceof WorkConflictError) { + return prepareAgainAndRequestApproval(); + } + if (error instanceof WorkInFlightError) { + return retryAfterCurrentOwner(); + } + if (error instanceof WorkAmbiguousCommitError) { + return reconcileProviderBeforeAnyRetry(error.details); + } + if (error instanceof WorkValidationError) { + return rejectToolInput(error.details); + } + throw error; +} +``` + +## Retry policy [#retry] + +- **Rate limit:** retry after `retryAfterMs`, add jitter, preserve the idempotency key. +- **In flight:** wait for the claim owner and reuse the same key. +- **Ambiguous:** do not retry; reconcile the provider and durable record. +- **Conflict:** never retry the same plan; prepare and approve again. +- **Validation/unsupported:** do not retry unchanged input. +- **Authentication:** refresh credentials before another attempt. + + +A timeout cannot prove whether the remote provider committed a write. Work SDK records that uncertainty explicitly and blocks another mutation until application reconciliation resolves it. + + +## Logging and redaction [#redaction] + +Log class, code, provider, status, retry delay, and a correlation ID. Treat `details` and `cause` as potentially sensitive because providers can echo field values or request context. Never log adapter options or authorization headers. + + diff --git a/apps/web/lib/llms.ts b/apps/web/lib/llms.ts new file mode 100644 index 0000000..e22cc74 --- /dev/null +++ b/apps/web/lib/llms.ts @@ -0,0 +1,60 @@ +import { agentGuide, markdownHomepage } from "@/lib/machine-content"; +import { site } from "@/lib/site"; +import { source } from "@/lib/source"; + +interface TreeNode { + type?: string; + url?: string; + children?: TreeNode[]; + index?: TreeNode; +} + +function orderedPages() { + const rank = new Map(); + let position = 0; + const walk = (node: TreeNode) => { + if (node.type === "page" && node.url) rank.set(node.url, position++); + if (node.index) walk(node.index); + node.children?.forEach(walk); + }; + walk(source.pageTree as TreeNode); + return [...source.getPages()].sort( + (a, b) => (rank.get(a.url) ?? Number.MAX_SAFE_INTEGER) - (rank.get(b.url) ?? Number.MAX_SAFE_INTEGER), + ); +} + +export function llmsIndex(): string { + const docsLinks = orderedPages() + .map((page) => `- [${page.data.title}](${site.url}${page.url}): ${page.data.description ?? ""}`.trimEnd()) + .join("\n"); + + return `# Work SDK + +> Agent-safe TypeScript SDK for GitHub Issues, GitLab, Linear, Jira, and Azure DevOps. + +## Primary documentation + +${docsLinks} +- [Markdown homepage](${site.url}/index.md): concise project overview and quick example +- [Agent guide](${site.url}/agents.md): operational rules for coding agents +- [Full machine context](${site.url}/llms-full.txt): combined project and agent documentation + +## Project + +- [Source](${site.github}) +- [npm package](${site.npm}) + +Work SDK is a local library, not a hosted service. Applications bring their own provider credentials. +`; +} + +export async function llmsFull(): Promise { + const pages = await Promise.all( + orderedPages().map(async (page) => { + const body = await page.data.getText("processed"); + return `# ${page.data.title}\nURL: ${site.url}${page.url}\n\n${body}`; + }), + ); + + return [llmsIndex(), markdownHomepage, agentGuide, ...pages].join("\n---\n\n"); +} diff --git a/apps/web/lib/machine-content.ts b/apps/web/lib/machine-content.ts index 598d38f..303f01d 100644 --- a/apps/web/lib/machine-content.ts +++ b/apps/web/lib/machine-content.ts @@ -113,36 +113,3 @@ Keep GitHub and GitLab tokens, Linear API keys, Jira API tokens, Azure DevOps En Read the complete documentation at ${site.url}/docs. `; -export const llmsIndex = `# Work SDK - -> Agent-safe TypeScript SDK for GitHub Issues, GitLab, Linear, Jira, and Azure DevOps. - -## Primary documentation - -- [Documentation](${site.url}/docs): guided documentation index -- [Getting started](${site.url}/docs/getting-started): first read and safe write -- [Example apps](${site.url}/docs/examples): runnable approval CLI and signed webhook bot with fake credentials -- [Safe writes](${site.url}/docs/concepts/safe-writes): integrity, concurrency, warnings, and idempotency -- [Providers](${site.url}/docs/providers): capability and semantic comparison -- [GitHub](${site.url}/docs/providers/github): permissions, identifiers, mappings, and safe writes -- [GitLab](${site.url}/docs/providers/gitlab): GitLab.com, Self-Managed, auth, guarded labels, types, and concurrency -- [Linear](${site.url}/docs/providers/linear): teams, workflow states, priorities, and safe writes -- [Jira Cloud](${site.url}/docs/providers/jira): authentication, transitions, ADF, and workflow limits -- [Azure DevOps](${site.url}/docs/providers/azure-devops): auth, custom processes, WIQL, and JSON Patch -- [Client reference](${site.url}/docs/reference/client): methods and normalized types -- [Errors](${site.url}/docs/reference/errors): error classes and retry policy -- [Agent guide](${site.url}/docs/guides/agents): safe tool and approval boundaries -- [Testing guide](${site.url}/docs/guides/testing): memory adapter and protocol tests -- [Markdown homepage](${site.url}/index.md): concise project overview and quick example -- [Agent guide](${site.url}/agents.md): operational rules for coding agents -- [Full machine context](${site.url}/llms-full.txt): combined project and agent documentation - -## Project - -- [Source](${site.github}) -- [npm package](${site.npm}) - -Work SDK is a local library, not a hosted service. Applications bring their own provider credentials. -`; - -export const llmsFull = `${llmsIndex}\n---\n\n${markdownHomepage}\n---\n\n${agentGuide}`; diff --git a/apps/web/lib/source.ts b/apps/web/lib/source.ts new file mode 100644 index 0000000..bc92fdd --- /dev/null +++ b/apps/web/lib/source.ts @@ -0,0 +1,8 @@ +import { loader } from "fumadocs-core/source"; + +import { docs } from "@/.source/server"; + +export const source = loader({ + baseUrl: "/docs", + source: docs.toFumadocsSource(), +}); diff --git a/apps/web/mdx-components.tsx b/apps/web/mdx-components.tsx new file mode 100644 index 0000000..bdc25a0 --- /dev/null +++ b/apps/web/mdx-components.tsx @@ -0,0 +1,14 @@ +import { Callout } from "fumadocs-ui/components/callout"; +import defaultMdxComponents from "fumadocs-ui/mdx"; +import type { MDXComponents } from "mdx/types"; + +import { DocsNext } from "@/components/docs-next"; + +export function getMDXComponents(components?: MDXComponents): MDXComponents { + return { + ...defaultMdxComponents, + Callout, + DocsNext, + ...components, + }; +} diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts index dcf4784..7b33401 100644 --- a/apps/web/next.config.ts +++ b/apps/web/next.config.ts @@ -1,3 +1,4 @@ +import { createMDX } from "fumadocs-mdx/next"; import type { NextConfig } from "next"; const nextConfig: NextConfig = { @@ -5,4 +6,6 @@ const nextConfig: NextConfig = { reactStrictMode: true, }; -export default nextConfig; +const withMDX = createMDX(); + +export default withMDX(nextConfig); diff --git a/apps/web/package.json b/apps/web/package.json index 70b3a9b..718d248 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -8,19 +8,27 @@ "start": "next start", "check": "tsc --noEmit", "test": "node --test tests/*.test.mjs", - "clean": "rimraf .next" + "clean": "rimraf .next", + "postinstall": "fumadocs-mdx" }, "dependencies": { + "@types/mdx": "^2.0.14", "@vercel/analytics": "^2.0.1", + "fumadocs-core": "16.12.1", + "fumadocs-mdx": "^15.2.3", + "fumadocs-ui": "16.12.1", "next": "^16.2.11", "react": "^19.2.0", - "react-dom": "^19.2.0" + "react-dom": "^19.2.0", + "zod": "^4.4.3" }, "devDependencies": { + "@tailwindcss/postcss": "4.3.3", "@types/node": "^24.10.0", "@types/react": "^19.2.0", "@types/react-dom": "^19.2.0", "rimraf": "^6.0.1", + "tailwindcss": "4.3.3", "typescript": "^5.9.3" } } diff --git a/apps/web/postcss.config.mjs b/apps/web/postcss.config.mjs new file mode 100644 index 0000000..c2ddf74 --- /dev/null +++ b/apps/web/postcss.config.mjs @@ -0,0 +1,5 @@ +export default { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; diff --git a/apps/web/source.config.ts b/apps/web/source.config.ts new file mode 100644 index 0000000..9eb4dd8 --- /dev/null +++ b/apps/web/source.config.ts @@ -0,0 +1,17 @@ +import { defineConfig, defineDocs, frontmatterSchema } from "fumadocs-mdx/config"; +import { z } from "zod"; + +export const docs = defineDocs({ + dir: "content/docs", + docs: { + schema: frontmatterSchema.extend({ + seoTitle: z.string().optional(), + keywords: z.array(z.string()).optional(), + }), + postprocess: { + includeProcessedMarkdown: true, + }, + }, +}); + +export default defineConfig(); diff --git a/apps/web/tests/site.test.mjs b/apps/web/tests/site.test.mjs index e7f2c3d..385a016 100644 --- a/apps/web/tests/site.test.mjs +++ b/apps/web/tests/site.test.mjs @@ -151,7 +151,10 @@ test("agent discovery describes every provider and machine-readable resource", a assert.match(agentCard, /llms_full/); assert.match(agentCard, /safe_write_protocol/); assert.match(machineContent, /Provider comparison/); - assert.match(machineContent, /`\$\{llmsIndex\}/); + const llms = await read("lib/llms.ts"); + assert.match(llms, /llmsIndex/); + assert.match(llms, /getText\("processed"\)/); + assert.match(llms, /source/); }); test("interactive controls expose accessible state", async () => { @@ -198,44 +201,41 @@ test("company marks come from locally cached SVGL assets", async () => { assert.match(sources, /SVGL registry/); }); -test("documentation has guided learning, provider, reference, and testing routes", async () => { - const routes = [ - "app/docs/getting-started/page.tsx", - "app/docs/examples/page.tsx", - "app/docs/concepts/safe-writes/page.tsx", - "app/docs/providers/page.tsx", - "app/docs/providers/github/page.tsx", - "app/docs/providers/gitlab/page.tsx", - "app/docs/providers/linear/page.tsx", - "app/docs/providers/jira/page.tsx", - "app/docs/providers/azure-devops/page.tsx", - "app/docs/reference/client/page.tsx", - "app/docs/reference/errors/page.tsx", - "app/docs/guides/agents/page.tsx", - "app/docs/guides/testing/page.tsx", +test("documentation content is MDX-sourced with generated navigation, search, and sitemap", async () => { + const slugs = [ + "index", + "getting-started", + "examples", + "concepts/safe-writes", + "providers/index", + "providers/github", + "providers/gitlab", + "providers/linear", + "providers/jira", + "providers/azure-devops", + "reference/client", + "reference/errors", + "guides/agents", + "guides/testing", ]; - await Promise.all(routes.map(async (route) => { - const page = await read(route); - assert.match(page, /DocsShell/, route); - assert.match(page, /createPageMetadata/, route); + await Promise.all(slugs.map(async (slug) => { + const page = await read(`content/docs/${slug}.mdx`); + assert.match(page, /^---\ntitle: .+/, slug); + assert.match(page, /\ndescription: .+/, slug); })); - assert.match(await read("app/docs/page.tsx"), /createPageMetadata/); - const navigation = await read("components/docs-navigation.tsx"); - const search = await read("components/docs-search.tsx"); - assert.match(navigation, /aria-current/); - assert.match(navigation, /\/docs\/providers\/github/); - assert.match(navigation, /\/docs\/providers\/linear/); - assert.match(navigation, /\/docs\/providers\/jira/); - assert.match(search, /Ctrl K/); - assert.match(search, /role="dialog"/); + const meta = JSON.parse(await read("content/docs/meta.json")); + const navEntries = meta.pages.filter((entry) => !entry.startsWith("---")); + assert.deepEqual([...navEntries].sort(), [...slugs].sort()); + const layout = await read("app/docs/layout.tsx"); + assert.match(layout, /fumadocs-ui\/layouts\/docs/); + assert.match(layout, /source\.pageTree/); + assert.match(await read("app/layout.tsx"), /RootProvider/); + const docPage = await read("app/docs/[[...slug]]/page.tsx"); + assert.match(docPage, /generateStaticParams/); + assert.match(docPage, /createPageMetadata/); + assert.match(await read("app/api/search/route.ts"), /createFromSource/); const sitemap = await read("app/sitemap.ts"); - assert.match(sitemap, /providers\/github/); - assert.match(sitemap, /providers\/linear/); - assert.match(sitemap, /providers\/jira/); - assert.match(sitemap, /providers\/azure-devops/); - assert.match(sitemap, /providers\/gitlab/); - assert.match(sitemap, /guides\/testing/); - assert.match(sitemap, /docs\/examples/); + assert.match(sitemap, /source[\s\S]*getPages/); }); test("engineering guide is crawlable, substantive, and linked from the homepage", async () => { diff --git a/docs/idempotency.md b/docs/idempotency.md index 9237c45..5c47fec 100644 --- a/docs/idempotency.md +++ b/docs/idempotency.md @@ -1,6 +1,6 @@ # Atomic idempotency stores -Work SDK v0.4 uses an atomic claim protocol. A durable store is not safe merely +Work SDK (v0.4 and later) uses an atomic claim protocol. A durable store is not safe merely because its values survive restarts: two workers must not both observe a missing key and then write to the provider. diff --git a/packages/work-sdk/src/github.ts b/packages/work-sdk/src/github.ts index 497efa3..5bd931c 100644 --- a/packages/work-sdk/src/github.ts +++ b/packages/work-sdk/src/github.ts @@ -19,7 +19,6 @@ import type { WorkComment, WorkItem, WorkItemKind, - WorkItemPriority, WorkItemState, WorkPage, WorkUser, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 20cab08..6705d79 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,7 +34,7 @@ importers: devDependencies: '@remotion/eslint-config-flat': specifier: 4.0.499 - version: 4.0.499(eslint@9.19.0)(typescript@5.9.3) + version: 4.0.499(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3) '@types/react': specifier: 19.2.7 version: 19.2.7 @@ -43,7 +43,7 @@ importers: version: 0.0.166 eslint: specifier: 9.19.0 - version: 9.19.0 + version: 9.19.0(jiti@2.7.0) prettier: specifier: 3.8.1 version: 3.8.1 @@ -53,9 +53,21 @@ importers: apps/web: dependencies: + '@types/mdx': + specifier: ^2.0.14 + version: 2.0.14 '@vercel/analytics': specifier: ^2.0.1 version: 2.0.1(next@16.2.11(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7) + fumadocs-core: + specifier: 16.12.1 + version: 16.12.1(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.26.0(react@19.2.7))(next@16.2.11(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: ^15.2.3 + version: 15.2.3(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.17)(fumadocs-core@16.12.1(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.26.0(react@19.2.7))(next@16.2.11(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.2.11(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0)) + fumadocs-ui: + specifier: 16.12.1 + version: 16.12.1(@types/mdx@2.0.14)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(fumadocs-core@16.12.1(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.26.0(react@19.2.7))(next@16.2.11(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.2.11(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.3) next: specifier: ^16.2.11 version: 16.2.11(react-dom@19.2.7(react@19.2.7))(react@19.2.7) @@ -65,7 +77,13 @@ importers: react-dom: specifier: ^19.2.0 version: 19.2.7(react@19.2.7) + zod: + specifier: ^4.4.3 + version: 4.4.3 devDependencies: + '@tailwindcss/postcss': + specifier: 4.3.3 + version: 4.3.3 '@types/node': specifier: ^24.10.0 version: 24.13.3 @@ -78,6 +96,9 @@ importers: rimraf: specifier: ^6.0.1 version: 6.1.3 + tailwindcss: + specifier: 4.3.3 + version: 4.3.3 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -104,7 +125,7 @@ importers: version: 24.13.3 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.7(vitest@3.2.7(@types/node@24.13.3)(terser@5.49.0)) + version: 3.2.7(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0)) publint: specifier: ^0.3.12 version: 0.3.21 @@ -113,16 +134,20 @@ importers: version: 6.1.3 tsup: specifier: ^8.5.0 - version: 8.5.1(postcss@8.5.12)(typescript@5.9.3) + version: 8.5.1(jiti@2.7.0)(postcss@8.5.12)(typescript@5.9.3)(yaml@2.9.0) typescript: specifier: ^5.9.3 version: 5.9.3 vitest: specifier: ^3.2.4 - version: 3.2.7(@types/node@24.13.3)(terser@5.49.0) + version: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0) packages: + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -488,6 +513,39 @@ packages: resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.8.0': + resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} + + '@floating-ui/dom@1.8.0': + resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==} + + '@floating-ui/react-dom@2.1.9': + resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.12': + resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==} + + '@fuma-translate/react@1.0.2': + resolution: {integrity: sha512-uOiOtBx3nRXR8Nu1GzBf1tApgF1FErDBTHxRIAQeyQdyOoZbrNRN6H4kDCWObY4qyGeGbHydG0DHzgeUgFDMIw==} + peerDependencies: + '@types/react': '*' + react: ^19.2.0 + react-dom: ^19.2.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@fumadocs/tailwind@0.1.1': + resolution: {integrity: sha512-BnPe52UxSaG8yKlHMKBxXw8h6GpK5qO55ci6+Qd5JnquTvIw6SpfbC1P+qAi82PuPWv1KZAWY8bxRk4+x9ctXw==} + peerDependencies: + tailwindcss: ^4.0.0 + peerDependenciesMeta: + tailwindcss: + optional: true + '@humanfs/core@0.19.2': resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} @@ -715,6 +773,9 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + '@mediabunny/aac-encoder@1.50.8': resolution: {integrity: sha512-A5Se/LZd6RmYq/h36lBMSEsHvsyW8d0toR7FrAwpsFYbK+DVQYf90KiBT1Aw/mzLXx8/ypIOORJnd1sVZqOvJQ==} peerDependencies: @@ -818,6 +879,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@orama/orama@3.1.18': + resolution: {integrity: sha512-a61ljmRVVyG5MC/698C8/FfFDw5a8LOIvyOLW5fztgUXqUpc1jOfQzOitSCbge657OgXXThmY3Tk8fpiDb4UcA==} + engines: {node: '>= 20.0.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -826,6 +891,362 @@ packages: resolution: {integrity: sha512-edgyN2pP07uXiP4tJs0s8KVmU8M8i60YPbbI0/WDeok1mIJHRXz+CgD8I0nelwDkoCh3EWL/G5kGfbuHjsdbvw==} engines: {node: '>=18'} + '@radix-ui/number@1.1.3': + resolution: {integrity: sha512-Road2bidD0uu/1BGDOWNdPI06g0lIRy6IF9GZcIrDK2KGItfor8IQwQa+yM2ERgHM1MmHxaxpTzk0/Jp42lNfA==} + + '@radix-ui/primitive@1.1.7': + resolution: {integrity: sha512-rqWnm76nYT8HoNNqEjpgJ7Pw/DrBj5iBTrmEPo6HTX5+VJyBNOqTdv4g89G63HuR5g0AaENoAcH7Is5fF2kZ8Q==} + + '@radix-ui/react-accordion@1.2.18': + resolution: {integrity: sha512-CGuUFvhjScXBF/bhjaU9xlgai2ikYqJRazXhMzngoUaZI7QaxAw24Ae3S/pR0b69p8GqW6i+CKJmx9JPNnZ4QQ==} + 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-arrow@1.1.13': + resolution: {integrity: sha512-0Q310knIY0K+mkmncU9FxLggfW7V49Ok2oY+iu27KkERTsQXxYCIC8XW5QoK4w7Jp1z00vT5xj3oxTcn7QlcTg==} + 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-collapsible@1.1.18': + resolution: {integrity: sha512-aNMp8humfYzWERz5gxGb/eLNkB0ZthypLbNlNolzdgzFTeN78e/rnn9rxCdOaSsg/zClTOJ/OkjXYx9PUEPATw==} + 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-collection@1.1.13': + resolution: {integrity: sha512-Q8xYqNRFObXPmi45bFSkGdM2JA5hjBeYGFqzg6lZR3wp6b+cciraVq8DdneTabtws+uOYqjmsvmKOufk/M9Cyg==} + 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-compose-refs@1.1.4': + resolution: {integrity: sha512-pWJo6lQAfR6uy1n7ii7PaCc9dLPwTXDYbQpORZU5B548Aqvl2pP1SM1vJGKyxIFqZMHRopRO4CQYX2iXAIB5jA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.2.1': + resolution: {integrity: sha512-EraVbFjiIjibpLr6EjvEDmSCYJU2SlKDMiO+qEK/D9GOWnQoAQlpQo2occGYC1UM9MBeEx5Bek3UtW/Qi57vAg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.21': + resolution: {integrity: sha512-h+7qMDDmZJ8qTSPrwNyKb/PACY0ehtN8QOBlCz+C2C1jgehKekdhmHddG9YQk8BF/sHJqglPjte+jA1Jrp9HcA==} + 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-direction@1.1.3': + resolution: {integrity: sha512-OdgAA/xb6WOQMKNn0mtbYoruMG6YMaBOnq+evWxSpMmiEMBdeFZawnIWRfPPeVXCRm+0lnN8jpJLjhD7/UIxWw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.17': + resolution: {integrity: sha512-QAXwa38pG0xNAYh1pjdSaf86NrkqsMoDNmget/Y7X8O8E/C3Iqlj9GAPE4DfX9BPLXc7WH2TWSzMRnIoCdcjzQ==} + 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-focus-guards@1.1.5': + resolution: {integrity: sha512-UQvlB7L/BYh3P8MLvwZnQkH521EDos40Rwnbt5+Qpg4Vbk0z3xJjRUmR6+aka4aT1IQQXFdO5bNPoE7cvFl5xQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.14': + resolution: {integrity: sha512-/x4htnJfmW53MplkrePaDpf1o/rN1C++g88WpVobULXbSyC19NtLkXmewuJ/HCaceSmfKDNL5gOXcBGnuAvnvQ==} + 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-id@1.1.3': + resolution: {integrity: sha512-f/Wxm0ctyMymUJK0fqTSQlm85rbzdAkoNbPXJQ5+6caowVO8Yx+NWGjGz/oGhs/D+WIbbQpOrU0hU2Li2/42xQ==} + 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.20': + resolution: {integrity: sha512-in/exCQPatmmBmQZrtQkK4UrysEp8VGEuw5o8Bx3ozxbfg7DBb4H5j3DgxGz4N59J02NRVzhsWFtujZgy5ue3w==} + 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.21': + resolution: {integrity: sha512-+AJ7P5oRcFqFtv7MaCD8fOuK3l5qQBAMdWEOnUOYd3JfHOeIUe7TnHHSSP15CtWwH4KrotyDCTzodOIoONh8vw==} + 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-popper@1.3.5': + resolution: {integrity: sha512-6hLng2Rs45IZcvZ31BNvMeaFEMMEbtsog4xPcb8LZrGfyoV9fdAXqB9UKhLpTHtL0+E2DhSr6VW54Tehd6ksAQ==} + 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-portal@1.1.15': + resolution: {integrity: sha512-kAfBVJUKNNKZuyGQXXG6rKolAV2KAmxxVkPXJgoq9dEFTl39286RufHQFNTL8rzha4vP8159BJ6hMGpB+bqv7A==} + 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-presence@1.1.9': + resolution: {integrity: sha512-LTi1v05bprIb8/GSY/GWusI0jfsYjQ3CD3Nin8o7jVxnpHzVQfzjOQJoJTQkE9bdmOnsS7SFdhkXiBv8PrYnxw==} + 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-primitive@2.1.8': + resolution: {integrity: sha512-DOlK1BdcIeYYUcFkSYFka4v1h95XTov93b0jCgW1EEiZuIhdwHY2NlE1teLIh+p0uBsuZI5A+voay+iVWpprfA==} + 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-roving-focus@1.1.17': + resolution: {integrity: sha512-YdJmjETw7Py+4Nziv71jgZ6fH7xQgB5p+pQ5rV8Iufyrm0RHSijec/UV1zPfQoK/YcfzB9nOl/2bi1zf1SjRMQ==} + 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-scroll-area@1.2.16': + resolution: {integrity: sha512-kEcmCenIJ+W5xlCv1u9VKDdPmzzGyfrJwEneY+02GH+lJRXrGpkiTkyjrfkspuRw6DXt4uduwT5c4xD8HTv27Q==} + 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-slot@1.3.1': + resolution: {integrity: sha512-Bu/aAQHFFh6/QAvXAeUMurJ9fbW0JUIqlojU/yBXZ7cAVqy75Y7JYYyuCr9zLNF0p4WWoJYV54CTUIf4l7FzTw==} + 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.19': + resolution: {integrity: sha512-4wbGf98pX2ZwYqHMVB/dakeMPyH4xSJ9MSDaCCWXlIpYt0VYY6mtZxKSTiGS/F3tk0yrEYmXE1V8uwG7TxDCcQ==} + 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-use-callback-ref@1.1.3': + resolution: {integrity: sha512-AUS7HoBBAncIsGMLNG+CcpLuJ+JIBbZzmyM8Qdb1eIThX0AlhSSC6wn40xfBlPE+ypx/vSSiRWnklUAjy3U3UA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.5': + resolution: {integrity: sha512-UB1dXpxvHjR48poyKdKdTm7jT0kp3elkUKdKQiOkirlbYumqXinSJtrjDsr9maXNPvL12bKI4CDSmydms/9Aeg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.4': + resolution: {integrity: sha512-XYcfa6wlXDCwQtePuEiPmXLSAhGL4DWtedSyRgGbG3y10mw+OnrLp6SyeY1gJFMiYF0Dx0nMAX9InylKbLEFQQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-is-hydrated@0.1.2': + resolution: {integrity: sha512-2+gAVu9uaSLbopCTvvuWX9MIgEOlyqXC1Ok+KLCO7cZPSHLENs7dL0KbFQUGFIcFKmDW/bmaQRJtd8E3cnMRUw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.3': + resolution: {integrity: sha512-rDiah9wvtqihWtWz02XreeRKIxt2EJF8y5D9rtY9l5A2zxePAtcPiOMpDugNRw5bFHz+1/8viVoc7ZVKiJknCw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.3': + resolution: {integrity: sha512-kbefNKla5AGhgvMqrg/qS7mYVLXTEHQLqoFIS03nKN2dAfQQ5PK5Tp+2LxS7BV6a6l4HHv4jTg6rtV2Uajwe2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.3': + resolution: {integrity: sha512-W0GSYZFKEfi6raMiMEfJSngvVbFDIyxtW5JuVg5NoQBY59l0dVQVGLbhog/tOdwq0qtZ+TXuX1ikSNan4/IZXA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.3': + resolution: {integrity: sha512-jJq6tQQLvO/z4uWbztjwPV+1a/+H4rCaWypasLB/ac8DEdd6+p7dIm7o3F6P2KZPGkPMqD4s5424EdAdoU+GLA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.9': + resolution: {integrity: sha512-seuZXNZVCz1kLSQMRO/TdNOSahBI3S5nXE4jzO7u7aFRWQlMAnwyrr8vKMkEU115fCLEyzR2YyjnP+aRMxK34w==} + 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/rect@1.1.3': + resolution: {integrity: sha512-JtyZR+mqgBibTo8xea3B6ZRmzZiM/YeVBtUkas6zMuXjAlfIFIW2FgqeM9eLyvEaYX66vr6DJMK+4U6LV0KhNw==} + '@remotion/bundler@4.0.499': resolution: {integrity: sha512-88C7WxlC9DSxEOSnJL/HV7Xl16OIKnEzl90BvIM083pNBA/laAEJvryaXmSQ3FuI5CSGuVA336YgboOWagqmAg==} peerDependencies: @@ -1158,10 +1579,44 @@ packages: webpack-hot-middleware: optional: true + '@shikijs/core@4.3.1': + resolution: {integrity: sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==} + engines: {node: '>=20'} + + '@shikijs/engine-javascript@4.3.1': + resolution: {integrity: sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==} + engines: {node: '>=20'} + + '@shikijs/engine-oniguruma@4.3.1': + resolution: {integrity: sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==} + engines: {node: '>=20'} + + '@shikijs/langs@4.3.1': + resolution: {integrity: sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.3.1': + resolution: {integrity: sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==} + engines: {node: '>=20'} + + '@shikijs/themes@4.3.1': + resolution: {integrity: sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==} + engines: {node: '>=20'} + + '@shikijs/types@4.3.1': + resolution: {integrity: sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==} + engines: {node: '>=20'} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@svgr/babel-plugin-add-jsx-attribute@8.0.0': resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} engines: {node: '>=14'} @@ -1233,33 +1688,143 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@tybys/wasm-util@0.10.3': - resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@tailwindcss/node@4.3.3': + resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} - '@types/chai@5.2.3': - resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@tailwindcss/oxide-android-arm64@4.3.3': + resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@tailwindcss/oxide-darwin-arm64@4.3.3': + resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] - '@types/dom-mediacapture-transform@0.1.12': - resolution: {integrity: sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==} + '@tailwindcss/oxide-darwin-x64@4.3.3': + resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] - '@types/dom-webcodecs@0.1.13': - resolution: {integrity: sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==} + '@tailwindcss/oxide-freebsd-x64@4.3.3': + resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] - '@types/estree@1.0.9': + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@tailwindcss/oxide-linux-x64-musl@4.3.3': + resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@tailwindcss/oxide-wasm32-wasi@4.3.3': + resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.3.3': + resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==} + engines: {node: '>= 20'} + + '@tailwindcss/postcss@4.3.3': + resolution: {integrity: sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==} + + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/dom-mediacapture-transform@0.1.12': + resolution: {integrity: sha512-d7/QsLRwF864A5mgIM/YrfiglHoYn7zgCcAoJgW404r+2DwnNr7EBbLnCWpmOMgH8y0te73L1AV6H1bmauaWFw==} + + '@types/dom-webcodecs@0.1.13': + resolution: {integrity: sha512-O5hkiFIcjjszPIYyUSyvScyvrBoV3NOEEZx/pMlsu44TKzWNkLVBBxnxJz42in5n3QIolYOcBYFCPZZ0h8SkwQ==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + '@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.14': + resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -1277,6 +1842,12 @@ packages: '@types/react@19.2.7': resolution: {integrity: sha512-MWtvHrGZLFttgeEj28VXHxpmwYbor/ATPYbBfSFZEIRK0ecCFLl2Qo55z52Hss+UV9CRN7trSeq1zbgx7YDWWg==} + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/web@0.0.166': resolution: {integrity: sha512-qvY/TzK1WuxfeACL3Zzw+gMivGiIynRKH98nLET7ACzTRTX8CWMA6LQJ9WayIHvTBU1JeFCBRIBjsxhGz4TfHQ==} @@ -1327,6 +1898,9 @@ packages: resolution: {integrity: sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.3': + resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} + '@vercel/analytics@2.0.1': resolution: {integrity: sha512-MTQG6V9qQrt1tsDeF+2Uoo5aPjqbVPys1xvnIftXSJYG2SrwXRHnqEvVoYID7BTruDz4lCd2Z7rM1BdkUehk2g==} peerDependencies: @@ -1445,6 +2019,75 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@yuku-analyzer/binding-android-arm64@0.8.7': + resolution: {integrity: sha512-pzJ++UMCZEV4s6SP3Ryvj+snWP8s7aTXFkSXRyeBF4RSALftPzfqYssHdGOmOH2QnRAtyOhhg64tdjeSGJvYRg==} + cpu: [arm64] + os: [android] + + '@yuku-analyzer/binding-darwin-arm64@0.8.7': + resolution: {integrity: sha512-vymR7Us3i/HJvUxA1N5sKCrrn2mXw/Xvzbt66zlRyGPDmkUzFCrn34OqodR/zctmD1JhaFlv+Ur6xNNPRIid/w==} + cpu: [arm64] + os: [darwin] + + '@yuku-analyzer/binding-darwin-x64@0.8.7': + resolution: {integrity: sha512-aX1xy6wJeI2QN/ipu9B6/dzz6RmHQ5+Ty6uyf9csqYZDnY4/U2GsDskYQIRysc2Cuh+GNnvuO5xCXxiqkmVEcw==} + cpu: [x64] + os: [darwin] + + '@yuku-analyzer/binding-freebsd-x64@0.8.7': + resolution: {integrity: sha512-5LT2KkjK0zBI2s3VoSyGPSs9Ey7rWPxWkCyFgZXoszQOkAk2z0biP+DLzb9zw6flmwwCCiyeZRqM65srfo8l1Q==} + cpu: [x64] + os: [freebsd] + + '@yuku-analyzer/binding-linux-arm-gnu@0.8.7': + resolution: {integrity: sha512-4haNlVk624QoNSKIneoH9JKu5SvfD+Hkxg490HUS5pfFuWwoXT3zOmAdfwPMsSH0bNIkFO7GqtwDZ9EVpyzepw==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@yuku-analyzer/binding-linux-arm-musl@0.8.7': + resolution: {integrity: sha512-7HwJHVFtrufB5qHHL1PSDPr/j6uoNLwbwxa04QzsbpcbbzfDUbT37loHPu5u0NuetRUlV+TqXDlX6OpXcM8hKQ==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@yuku-analyzer/binding-linux-arm64-gnu@0.8.7': + resolution: {integrity: sha512-yUEgxEPuDVBO+nkDw8qbssYA8oHu82Q0da+C7rGyVplmjlKa5DhBnMMagTEjFZx4jNDVWnGHJreUCSeGL0x/gQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@yuku-analyzer/binding-linux-arm64-musl@0.8.7': + resolution: {integrity: sha512-2X7EwxPbgdNRqgMwtxOnNOGEmdm1RS8PD2Q5cOxj8cEZD4fy7yHHeSDoEdBOyrJtHzbG6jQB6CeReO1okb/S7Q==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@yuku-analyzer/binding-linux-x64-gnu@0.8.7': + resolution: {integrity: sha512-k/iQFK1gAvaHLzXXZ3/+g48wT5YB6MfikPb+juGCd9HzyPMUSBCy44rz6nT+xoWnnxmBoeBUywA4CvWCWZFTtg==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@yuku-analyzer/binding-linux-x64-musl@0.8.7': + resolution: {integrity: sha512-gTfYHx3cg8FERTYsg1dQrQFTutcWJ7wTp8YToyAJnZMbUCkcyuwUiWNYaEHyF0xIb+PsG7HfD+BLWhRRom5qKg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@yuku-analyzer/binding-win32-arm64@0.8.7': + resolution: {integrity: sha512-XDCWZZztOvdTtPNaU5EzrrV0dmMugdZ+Qdq5INeiGhGW5hD0TuCBIIXK7wTmRM6NcKarGlyBP5SYkiAuw6+slg==} + cpu: [arm64] + os: [win32] + + '@yuku-analyzer/binding-win32-x64@0.8.7': + resolution: {integrity: sha512-VtSH1pWuk3bo+BiUAtzYa4Ku1r/10CO14QvkGpRhDcFck8sIf7ox+wiucyKNKcf+srWCYxR1hO+wn5N3BdtFdw==} + cpu: [x64] + os: [win32] + + '@yuku-toolchain/types@0.8.7': + resolution: {integrity: sha512-2Z53dNxAJL6UvFoIrDZvYf3zlO8s4VJK4O2hhaB4mXVwwpX/7ajtss3cmfqKvamlNLWyt9FSWs4eoYdlbxpnHA==} + acorn-import-phases@1.0.4: resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} engines: {node: '>=10.13.0'} @@ -1513,6 +2156,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -1528,6 +2175,13 @@ packages: ast-v8-to-istanbul@0.3.12: resolution: {integrity: sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==} + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1595,6 +2249,9 @@ packages: caniuse-lite@1.0.30001806: resolution: {integrity: sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==} + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} @@ -1611,6 +2268,18 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chardet@2.2.0: resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} @@ -1622,6 +2291,10 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} @@ -1629,6 +2302,9 @@ packages: cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + cli-highlight@2.1.11: resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} engines: {node: '>=8.0.0', npm: '>=5.0.0'} @@ -1644,6 +2320,17 @@ packages: cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + cnfast@0.0.8: + resolution: {integrity: sha512-EjXKMfGfdwtV4AcNSQ6AwQaVzpC1B7IxeiwA3FlhTXz+YFlMKVi4c1JX9tgD2QOlahQXjB8KUXrBaYG+3v871Q==} + hasBin: true + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1651,6 +2338,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} @@ -1662,6 +2352,9 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + compute-scroll-into-view@3.1.1: + resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1717,6 +2410,9 @@ packages: supports-color: optional: true + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -1728,6 +2424,10 @@ packages: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -1736,6 +2436,12 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1774,6 +2480,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -1790,6 +2500,12 @@ packages: es-module-lexer@2.3.1: resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + 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.28.1: resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} @@ -1803,6 +2519,10 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -1854,6 +2574,27 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-value-to-estree@3.5.0: + resolution: {integrity: sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -1873,6 +2614,9 @@ packages: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} engines: {node: '>=12.0.0'} + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -1937,6 +2681,20 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + framer-motion@12.42.2: + resolution: {integrity: sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -1953,6 +2711,122 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + fumadocs-core@16.12.1: + resolution: {integrity: sha512-6NnDxUqe0hIiShbWjqvLXvPYV0n0gi01UHmDAkDs5KVcfxfgOPz5bAbj45JDY0Ykq39Mr8z1xRt9h/HwIhe8fw==} + peerDependencies: + '@mdx-js/mdx': '*' + '@mixedbread/sdk': 0.x.x + '@orama/core': 1.x.x + '@oramacloud/client': 2.x.x + '@tanstack/react-router': 1.x.x + '@types/estree-jsx': '*' + '@types/hast': '*' + '@types/mdast': '*' + '@types/react': '*' + algoliasearch: 5.x.x + flexsearch: '*' + lucide-react: '*' + next: 16.x.x + react: ^19.2.0 + react-dom: ^19.2.0 + react-router: 7.x.x || 8.x.x + waku: '*' + zod: 4.x.x + peerDependenciesMeta: + '@mdx-js/mdx': + optional: true + '@mixedbread/sdk': + optional: true + '@orama/core': + optional: true + '@oramacloud/client': + optional: true + '@tanstack/react-router': + optional: true + '@types/estree-jsx': + optional: true + '@types/hast': + optional: true + '@types/mdast': + optional: true + '@types/react': + optional: true + algoliasearch: + optional: true + flexsearch: + optional: true + lucide-react: + optional: true + next: + optional: true + react: + optional: true + react-dom: + optional: true + react-router: + optional: true + waku: + optional: true + zod: + optional: true + + fumadocs-mdx@15.2.3: + resolution: {integrity: sha512-zulK4WKXZcnbiipdvWtKcBClZn8/RekIjZu+/MmuMX3lpiXki485ABhJiJqFQmtD8W59WBN+V/4ydr4TvSoLkQ==} + hasBin: true + peerDependencies: + '@fumadocs/satteri': 0.x.x + '@types/mdast': '*' + '@types/mdx': '*' + '@types/react': '*' + fumadocs-core: ^16.7.0 + mdast-util-directive: '*' + next: ^15.3.0 || ^16.0.0 + react: ^19.2.0 + rolldown: '*' + satteri: ^0.9.4 + vite: 7.x.x || 8.x.x + peerDependenciesMeta: + '@fumadocs/satteri': + optional: true + '@types/mdast': + optional: true + '@types/mdx': + optional: true + '@types/react': + optional: true + mdast-util-directive: + optional: true + next: + optional: true + react: + optional: true + rolldown: + optional: true + satteri: + optional: true + vite: + optional: true + + fumadocs-ui@16.12.1: + resolution: {integrity: sha512-/YYERe99PJYw09RiYmCetdcu9uIjrUff+uoYk1EzgTLNtKlt2FNJJCcWYykG76wWlT28hXRs1bt8eFVq9dIU9w==} + peerDependencies: + '@types/mdx': '*' + '@types/react': '*' + fumadocs-core: 16.12.1 + next: 16.x.x + react: ^19.2.0 + react-dom: ^19.2.0 + takumi-js: '*' + peerDependenciesMeta: + '@types/mdx': + optional: true + '@types/react': + optional: true + next: + optional: true + takumi-js: + optional: true + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -1961,10 +2835,17 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2003,6 +2884,33 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} @@ -2012,6 +2920,9 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + human-id@4.2.0: resolution: {integrity: sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA==} hasBin: true @@ -2042,9 +2953,21 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -2062,10 +2985,17 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -2108,6 +3038,10 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -2172,38 +3106,115 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] - load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] - loader-runner@4.3.2: - resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} - engines: {node: '>=6.11.5'} + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] - lodash.sortby@4.7.0: + 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.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.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.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + loader-runner@4.3.2: + resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} + engines: {node: '>=6.11.5'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} @@ -2224,9 +3235,17 @@ packages: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} + lucide-react@1.26.0: + resolution: {integrity: sha512-raglYVR2+VkMfJL158krjVmE+rV5ST2lzA/KQm1FRSjMHT4MnWaegHxoVEpmc2So3nOEhp9oGejJwAPX8MoAjg==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@1.2.0: + resolution: {integrity: sha512-ptco+HFxTLgjafSLim2LojBSwfg5feBjd+SqyiwdGkzC38UPdZy3zgrHMI2CoTf5fJL38tbHMYWVzIH8BxGqJw==} + magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -2234,6 +3253,13 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marked-terminal@7.3.0: resolution: {integrity: sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==} engines: {node: '>=16.0.0'} @@ -2245,6 +3271,54 @@ packages: engines: {node: '>= 16'} hasBin: true + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + 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==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mediabunny@1.50.8: resolution: {integrity: sha512-LgykLyQzhdpo0V2yw3UXmOpj+b4JAGdpHBwsPE6kjSt8Za0d1VllD+FV7EGHBcdV4+oHUAo+yrqbVAWxNSDCPQ==} @@ -2259,6 +3333,111 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} + + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -2296,6 +3475,26 @@ packages: mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + motion-dom@12.42.2: + resolution: {integrity: sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==} + + motion-utils@12.39.0: + resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} + + motion@12.42.2: + resolution: {integrity: sha512-Atvv11yUKIid41cVrRBDVX5m8tF8kNpExRSlbpt6APClhDjtwQssgFHhQzejxw7/7YYbjHSPKBVbHo05BuJT5Q==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -2317,6 +3516,12 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + next@16.2.11: resolution: {integrity: sha512-B339zaqbyK8cmxhoAvLrcwoabwCP1wz21zSzfqxqXAemTu2BXnH7tQnfcglKv1vnMUIDBc+Hth7XODQriTZiRQ==} engines: {node: '>=20.9.0'} @@ -2353,6 +3558,10 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + npm-to-yarn@3.1.0: + resolution: {integrity: sha512-9gNsO/JB3LeWOZXBX09cKMsCPwVcu1ExIf+GUuTN9G+0zZvLIK0nU9+lE9jue3MSKAxPdrh0rO072mWNvciqeQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -2361,6 +3570,12 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -2413,6 +3628,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -2426,6 +3644,9 @@ packages: parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2546,6 +3767,9 @@ packages: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + publint@0.3.21: resolution: {integrity: sha512-OqejcnMV6E9zel2oCrUOJEiiFkGiAAni0A6ibfQNh1k9Gu5z4F+Yso8lllam7AzmV6Do0vp7u3UpZNRBwuXaHQ==} engines: {node: '>=18'} @@ -2575,6 +3799,36 @@ packages: resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.2: + resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react@19.2.3: resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} engines: {node: '>=0.10.0'} @@ -2591,10 +3845,61 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} + recast@0.23.11: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} + + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} + + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + remark@15.0.1: + resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==} + remotion@4.0.499: resolution: {integrity: sha512-QX5B1XDFBQpr8mYUBqhgCrH0cQJmqfI7zA46k9CsZhri/H9quXObYQBgeNDcxUhoulVvOOjVQqp5d0RAwB94HA==} peerDependencies: @@ -2648,6 +3953,9 @@ packages: resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -2674,6 +3982,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@4.3.1: + resolution: {integrity: sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==} + engines: {node: '>=20'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -2718,6 +4030,9 @@ packages: engines: {node: '>= 8'} deprecated: The work that was done in this beta branch won't be included in future versions + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -2741,6 +4056,9 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2770,6 +4088,12 @@ packages: peerDependencies: webpack: ^5.27.0 + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -2803,6 +4127,9 @@ packages: svg-parser@2.0.4: resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + tailwindcss@4.3.3: + resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} + tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} @@ -2883,6 +4210,10 @@ packages: resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==} engines: {node: '>=18'} + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + engines: {node: '>=18'} + tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} @@ -2914,6 +4245,12 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -2976,6 +4313,30 @@ packages: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} engines: {node: '>=4'} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -2989,6 +4350,26 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -2996,6 +4377,15 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -3073,6 +4463,9 @@ packages: resolution: {integrity: sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==} engines: {node: '>=10.13.0'} + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -3137,6 +4530,11 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -3149,11 +4547,22 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yuku-analyzer@0.8.7: + resolution: {integrity: sha512-nyPXcwwRPEggJqxIP28GeLKPjk9oGUuBlS4I0KfFrezNe93Ie9WIlOYRI42bo+MmZoxH238XHoPy0IZdwZIBxA==} + + yuku-ast@0.8.7: + resolution: {integrity: sha512-h6+4bDfyootiMB9vckk5uKo5r5j0GHrkr17FQTDNfEsFT3DWlN9uu1HJwQwc64pgmLCI945fWM3lbTIqxjT3GQ==} + zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + snapshots: + '@alloc/quick-lru@5.2.0': {} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -3538,9 +4947,9 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@9.19.0)': + '@eslint-community/eslint-utils@4.10.1(eslint@9.19.0(jiti@2.7.0))': dependencies: - eslint: 9.19.0 + eslint: 9.19.0(jiti@2.7.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -3584,6 +4993,34 @@ snapshots: '@eslint/core': 0.13.0 levn: 0.4.1 + '@floating-ui/core@1.8.0': + dependencies: + '@floating-ui/utils': 0.2.12 + + '@floating-ui/dom@1.8.0': + dependencies: + '@floating-ui/core': 1.8.0 + '@floating-ui/utils': 0.2.12 + + '@floating-ui/react-dom@2.1.9(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + '@floating-ui/dom': 1.8.0 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + + '@floating-ui/utils@0.2.12': {} + + '@fuma-translate/react@1.0.2(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7)': + dependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.17 + + '@fumadocs/tailwind@0.1.1(tailwindcss@4.3.3)': + optionalDependencies: + tailwindcss: 4.3.3 + '@humanfs/core@0.19.2': dependencies: '@humanfs/types': 0.15.0 @@ -3769,6 +5206,36 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 + '@mdx-js/mdx@3.1.1': + dependencies: + '@types/estree': 1.0.9 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@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 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + 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.17.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.6 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + transitivePeerDependencies: + - supports-color + '@mediabunny/aac-encoder@1.50.8(mediabunny@1.50.8)': dependencies: mediabunny: 1.50.8 @@ -3851,6 +5318,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 + '@orama/orama@3.1.18': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -3858,28 +5327,381 @@ snapshots: dependencies: tinyexec: 1.2.4 - '@remotion/bundler@4.0.499(@swc/helpers@0.5.15)(postcss@8.5.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + '@radix-ui/number@1.1.3': {} + + '@radix-ui/primitive@1.1.7': {} + + '@radix-ui/react-accordion@1.2.18(@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: - '@remotion/media-parser': 4.0.499 - '@remotion/studio': 4.0.499(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@remotion/studio-shared': 4.0.499(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - '@remotion/timeline-utils': 4.0.499 - '@rspack/core': 1.7.11(@swc/helpers@0.5.15) - '@rspack/plugin-react-refresh': 1.6.1(react-refresh@0.18.0) - css-loader: 7.1.4(@rspack/core@1.7.11(@swc/helpers@0.5.15))(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.12)) - esbuild: 0.28.1 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - react-refresh: 0.18.0 - remotion: 4.0.499(react-dom@19.2.3(react@19.2.3))(react@19.2.3) - style-loader: 4.0.0(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.12)) - webpack: 5.105.0(esbuild@0.28.1)(postcss@8.5.12) - transitivePeerDependencies: - - '@minify-html/node' - - '@swc/core' - - '@swc/css' - - '@swc/helpers' - - '@swc/html' + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-collapsible': 1.1.18(@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.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-compose-refs': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.2.1(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-direction': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-id': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.8(@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.5(@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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-arrow@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/react-primitive': 2.1.8(@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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-collapsible@1.1.18(@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.7 + '@radix-ui/react-compose-refs': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.2.1(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-id': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-presence': 1.1.9(@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.8(@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.5(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-collection@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/react-compose-refs': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.2.1(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.8(@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.1(@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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-compose-refs@1.1.4(@types/react@19.2.17)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-context@1.2.1(@types/react@19.2.17)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-dialog@1.1.21(@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.7 + '@radix-ui/react-compose-refs': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.2.1(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-dismissable-layer': 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-focus-guards': 1.1.5(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-focus-scope': 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-id': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-portal': 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) + '@radix-ui/react-presence': 1.1.9(@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.8(@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.1(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.5(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.3(@types/react@19.2.17)(react@19.2.7) + aria-hidden: 1.2.6 + 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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-direction@1.1.3(@types/react@19.2.17)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-dismissable-layer@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.7 + '@radix-ui/react-compose-refs': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.8(@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.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-effect-event': 0.0.4(@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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-focus-guards@1.1.5(@types/react@19.2.17)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-focus-scope@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/react-compose-refs': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.8(@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.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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-id@1.1.3(@types/react@19.2.17)(react@19.2.7)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.3(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-navigation-menu@1.2.20(@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.7 + '@radix-ui/react-collection': 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-compose-refs': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.2.1(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-direction': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-dismissable-layer': 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-id': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-presence': 1.1.9(@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.8(@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.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.5(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-previous': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-visually-hidden': 1.2.9(@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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-popover@1.1.21(@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.7 + '@radix-ui/react-compose-refs': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.2.1(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-dismissable-layer': 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-focus-guards': 1.1.5(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-focus-scope': 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-id': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-popper': 1.3.5(@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.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) + '@radix-ui/react-presence': 1.1.9(@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.8(@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.1(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.5(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.3(@types/react@19.2.17)(react@19.2.7) + aria-hidden: 1.2.6 + 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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-popper@1.3.5(@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.9(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@radix-ui/react-arrow': 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-compose-refs': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.2.1(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.8(@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.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-rect': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-size': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/rect': 1.1.3 + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-portal@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/react-primitive': 2.1.8(@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.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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-presence@1.1.9(@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-use-layout-effect': 1.1.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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-primitive@2.1.8(@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.3.1(@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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-roving-focus@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.7 + '@radix-ui/react-collection': 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-compose-refs': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.2.1(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-direction': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-id': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-primitive': 2.1.8(@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.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-controllable-state': 1.2.5(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-is-hydrated': 0.1.2(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-scroll-area@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/number': 1.1.3 + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-context': 1.2.1(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-direction': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-presence': 1.1.9(@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.8(@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.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-slot@1.3.1(@types/react@19.2.17)(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-compose-refs': 1.1.4(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-tabs@1.1.19(@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.7 + '@radix-ui/react-context': 1.2.1(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-direction': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-id': 1.1.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-presence': 1.1.9(@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.8(@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.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-use-controllable-state': 1.2.5(@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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/react-use-callback-ref@1.1.3(@types/react@19.2.17)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-controllable-state@1.2.5(@types/react@19.2.17)(react@19.2.7)': + dependencies: + '@radix-ui/primitive': 1.1.7 + '@radix-ui/react-use-effect-event': 0.0.4(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-use-layout-effect': 1.1.3(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-effect-event@0.0.4(@types/react@19.2.17)(react@19.2.7)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.3(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-is-hydrated@0.1.2(@types/react@19.2.17)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-layout-effect@1.1.3(@types/react@19.2.17)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-previous@1.1.3(@types/react@19.2.17)(react@19.2.7)': + dependencies: + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-rect@1.1.3(@types/react@19.2.17)(react@19.2.7)': + dependencies: + '@radix-ui/rect': 1.1.3 + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-use-size@1.1.3(@types/react@19.2.17)(react@19.2.7)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.3(@types/react@19.2.17)(react@19.2.7) + react: 19.2.7 + optionalDependencies: + '@types/react': 19.2.17 + + '@radix-ui/react-visually-hidden@1.2.9(@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.8(@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.17 + '@types/react-dom': 19.2.3(@types/react@19.2.17) + + '@radix-ui/rect@1.1.3': {} + + '@remotion/bundler@4.0.499(@swc/helpers@0.5.15)(postcss@8.5.12)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': + dependencies: + '@remotion/media-parser': 4.0.499 + '@remotion/studio': 4.0.499(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@remotion/studio-shared': 4.0.499(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@remotion/timeline-utils': 4.0.499 + '@rspack/core': 1.7.11(@swc/helpers@0.5.15) + '@rspack/plugin-react-refresh': 1.6.1(react-refresh@0.18.0) + css-loader: 7.1.4(@rspack/core@1.7.11(@swc/helpers@0.5.15))(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.12)) + esbuild: 0.28.1 + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) + react-refresh: 0.18.0 + remotion: 4.0.499(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + style-loader: 4.0.0(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.12)) + webpack: 5.105.0(esbuild@0.28.1)(postcss@8.5.12) + transitivePeerDependencies: + - '@minify-html/node' + - '@swc/core' + - '@swc/css' + - '@swc/helpers' + - '@swc/html' - bufferutil - clean-css - cssnano @@ -3957,10 +5779,10 @@ snapshots: '@remotion/drag-and-drop@4.0.499': {} - '@remotion/eslint-config-flat@4.0.499(eslint@9.19.0)(typescript@5.9.3)': + '@remotion/eslint-config-flat@4.0.499(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3)': dependencies: - eslint: 9.19.0 - typescript-eslint: 8.21.0(eslint@9.19.0)(typescript@5.9.3) + eslint: 9.19.0(jiti@2.7.0) + typescript-eslint: 8.21.0(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3) transitivePeerDependencies: - supports-color - typescript @@ -4235,8 +6057,50 @@ snapshots: html-entities: 2.6.0 react-refresh: 0.18.0 + '@shikijs/core@4.3.1': + dependencies: + '@shikijs/primitive': 4.3.1 + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + + '@shikijs/primitive@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/themes@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + + '@shikijs/types@4.3.1': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/vscode-textmate@10.0.2': {} + '@sindresorhus/is@4.6.0': {} + '@standard-schema/spec@1.1.0': {} + '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -4311,6 +6175,75 @@ snapshots: dependencies: tslib: 2.8.1 + '@tailwindcss/node@4.3.3': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.24.3 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.3 + + '@tailwindcss/oxide-android-arm64@4.3.3': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.3.3': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.3.3': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.3.3': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.3.3': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + optional: true + + '@tailwindcss/oxide@4.3.3': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-x64': 4.3.3 + '@tailwindcss/oxide-freebsd-x64': 4.3.3 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.3 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-x64-musl': 4.3.3 + '@tailwindcss/oxide-wasm32-wasi': 4.3.3 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 + + '@tailwindcss/postcss@4.3.3': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.3.3 + '@tailwindcss/oxide': 4.3.3 + postcss: 8.5.12 + tailwindcss: 4.3.3 + '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 @@ -4321,6 +6254,10 @@ snapshots: '@types/deep-eql': 4.0.2 assertion-error: 2.0.1 + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} '@types/dom-mediacapture-transform@0.1.12': @@ -4339,10 +6276,26 @@ snapshots: '@types/estree': 1.0.9 '@types/json-schema': 7.0.15 + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.9 + '@types/estree@1.0.9': {} + '@types/hast@3.0.5': + 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.14': {} + + '@types/ms@2.1.0': {} + '@types/node@12.20.55': {} '@types/node@24.13.3': @@ -4361,17 +6314,21 @@ snapshots: dependencies: csstype: 3.2.3 + '@types/unist@2.0.11': {} + + '@types/unist@3.0.3': {} + '@types/web@0.0.166': {} - '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.9.3))(eslint@9.19.0)(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3))(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.21.0(eslint@9.19.0)(typescript@5.9.3) + '@typescript-eslint/parser': 8.21.0(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/type-utils': 8.21.0(eslint@9.19.0)(typescript@5.9.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.19.0)(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.21.0(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.21.0 - eslint: 9.19.0 + eslint: 9.19.0(jiti@2.7.0) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -4380,14 +6337,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.9.3)': + '@typescript-eslint/parser@8.21.0(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.21.0 '@typescript-eslint/types': 8.21.0 '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.21.0 debug: 4.4.3 - eslint: 9.19.0 + eslint: 9.19.0(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -4397,12 +6354,12 @@ snapshots: '@typescript-eslint/types': 8.21.0 '@typescript-eslint/visitor-keys': 8.21.0 - '@typescript-eslint/type-utils@8.21.0(eslint@9.19.0)(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.21.0(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3)': dependencies: '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.19.0)(typescript@5.9.3) + '@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.19.0 + eslint: 9.19.0(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -4424,13 +6381,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.21.0(eslint@9.19.0)(typescript@5.9.3)': + '@typescript-eslint/utils@8.21.0(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@9.19.0) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.19.0(jiti@2.7.0)) '@typescript-eslint/scope-manager': 8.21.0 '@typescript-eslint/types': 8.21.0 '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.9.3) - eslint: 9.19.0 + eslint: 9.19.0(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -4440,12 +6397,14 @@ snapshots: '@typescript-eslint/types': 8.21.0 eslint-visitor-keys: 4.2.1 + '@ungap/structured-clone@1.3.3': {} + '@vercel/analytics@2.0.1(next@16.2.11(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)': optionalDependencies: next: 16.2.11(react-dom@19.2.7(react@19.2.7))(react@19.2.7) react: 19.2.7 - '@vitest/coverage-v8@3.2.7(vitest@3.2.7(@types/node@24.13.3)(terser@5.49.0))': + '@vitest/coverage-v8@3.2.7(vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -4460,7 +6419,7 @@ snapshots: std-env: 3.10.0 test-exclude: 7.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.7(@types/node@24.13.3)(terser@5.49.0) + vitest: 3.2.7(@types/debug@4.1.13)(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -4472,13 +6431,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.7(vite@7.3.6(@types/node@24.13.3)(terser@5.49.0))': + '@vitest/mocker@3.2.7(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 3.2.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.6(@types/node@24.13.3)(terser@5.49.0) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0) '@vitest/pretty-format@3.2.7': dependencies: @@ -4586,17 +6545,55 @@ snapshots: '@xtuc/long@4.2.2': {} - acorn-import-phases@1.0.4(acorn@8.17.0): - dependencies: - acorn: 8.17.0 + '@yuku-analyzer/binding-android-arm64@0.8.7': + optional: true - acorn-jsx@5.3.2(acorn@8.17.0): - dependencies: - acorn: 8.17.0 + '@yuku-analyzer/binding-darwin-arm64@0.8.7': + optional: true - acorn@8.17.0: {} + '@yuku-analyzer/binding-darwin-x64@0.8.7': + optional: true - ajv-formats@2.1.1(ajv@8.20.0): + '@yuku-analyzer/binding-freebsd-x64@0.8.7': + optional: true + + '@yuku-analyzer/binding-linux-arm-gnu@0.8.7': + optional: true + + '@yuku-analyzer/binding-linux-arm-musl@0.8.7': + optional: true + + '@yuku-analyzer/binding-linux-arm64-gnu@0.8.7': + optional: true + + '@yuku-analyzer/binding-linux-arm64-musl@0.8.7': + optional: true + + '@yuku-analyzer/binding-linux-x64-gnu@0.8.7': + optional: true + + '@yuku-analyzer/binding-linux-x64-musl@0.8.7': + optional: true + + '@yuku-analyzer/binding-win32-arm64@0.8.7': + optional: true + + '@yuku-analyzer/binding-win32-x64@0.8.7': + optional: true + + '@yuku-toolchain/types@0.8.7': {} + + acorn-import-phases@1.0.4(acorn@8.17.0): + dependencies: + acorn: 8.17.0 + + acorn-jsx@5.3.2(acorn@8.17.0): + dependencies: + acorn: 8.17.0 + + acorn@8.17.0: {} + + ajv-formats@2.1.1(ajv@8.20.0): optionalDependencies: ajv: 8.20.0 @@ -4643,6 +6640,10 @@ snapshots: argparse@2.0.1: {} + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + array-union@2.1.0: {} assertion-error@2.0.1: {} @@ -4657,6 +6658,10 @@ snapshots: estree-walker: 3.0.3 js-tokens: 10.0.0 + astring@1.9.0: {} + + bail@2.0.2: {} + balanced-match@1.0.2: {} balanced-match@4.0.4: {} @@ -4711,6 +6716,8 @@ snapshots: caniuse-lite@1.0.30001806: {} + ccount@2.0.1: {} + chai@5.3.3: dependencies: assertion-error: 2.0.1 @@ -4728,6 +6735,14 @@ snapshots: char-regex@1.0.2: {} + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + + character-entities@2.0.2: {} + + character-reference-invalid@2.0.1: {} + chardet@2.2.0: {} check-error@2.1.3: {} @@ -4736,10 +6751,18 @@ snapshots: dependencies: readdirp: 4.1.2 + chokidar@5.0.0: + dependencies: + readdirp: 5.1.1 + chrome-trace-event@1.0.4: {} cjs-module-lexer@1.4.3: {} + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + cli-highlight@2.1.11: dependencies: chalk: 4.1.2 @@ -4763,18 +6786,28 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clsx@2.1.1: {} + + cnfast@0.0.8: {} + + collapse-white-space@2.1.0: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 color-name@1.1.4: {} + comma-separated-tokens@2.0.3: {} + commander@10.0.1: {} commander@2.20.3: {} commander@4.1.1: {} + compute-scroll-into-view@3.1.1: {} + concat-map@0.0.1: {} confbox@0.1.8: {} @@ -4820,16 +6853,27 @@ snapshots: dependencies: ms: 2.1.3 + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + deep-eql@5.0.2: {} deep-is@0.1.4: {} define-lazy-prop@2.0.0: {} + dequal@2.0.3: {} + detect-indent@6.1.0: {} - detect-libc@2.1.2: - optional: true + detect-libc@2.1.2: {} + + detect-node-es@1.1.0: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 dir-glob@3.0.1: dependencies: @@ -4864,6 +6908,8 @@ snapshots: entities@4.5.0: {} + entities@6.0.1: {} + environment@1.1.0: {} error-ex@1.3.4: @@ -4878,6 +6924,20 @@ snapshots: es-module-lexer@2.3.1: {} + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.17.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.3 + esbuild@0.28.1: optionalDependencies: '@esbuild/aix-ppc64': 0.28.1 @@ -4911,6 +6971,8 @@ snapshots: escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -4925,9 +6987,9 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.19.0: + eslint@9.19.0(jiti@2.7.0): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@9.19.0) + '@eslint-community/eslint-utils': 4.10.1(eslint@9.19.0(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.19.2 '@eslint/core': 0.10.0 @@ -4961,6 +7023,8 @@ snapshots: minimatch: 3.1.5 natural-compare: 1.4.0 optionator: 0.9.4 + optionalDependencies: + jiti: 2.7.0 transitivePeerDependencies: - supports-color @@ -4984,6 +7048,39 @@ snapshots: estraverse@5.3.0: {} + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.9 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.6 + + estree-util-value-to-estree@3.5.0: + dependencies: + '@types/estree': 1.0.9 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.9 @@ -5006,6 +7103,8 @@ snapshots: expect-type@1.4.0: {} + extend@3.0.2: {} + extendable-error@0.1.7: {} fast-deep-equal@3.1.3: {} @@ -5070,6 +7169,15 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + framer-motion@12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + motion-dom: 12.42.2 + motion-utils: 12.39.0 + tslib: 2.8.1 + optionalDependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -5087,12 +7195,118 @@ snapshots: fsevents@2.3.3: optional: true + fumadocs-core@16.12.1(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.26.0(react@19.2.7))(next@16.2.11(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: + '@orama/orama': 3.1.18 + estree-util-value-to-estree: 3.5.0 + github-slugger: 2.0.0 + hast-util-to-estree: 3.1.3 + hast-util-to-jsx-runtime: 2.3.6 + mdast-util-mdx: 3.0.0 + mdast-util-to-markdown: 2.1.2 + npm-to-yarn: 3.1.0 + remark: 15.0.1 + remark-gfm: 4.0.1 + remark-rehype: 11.1.2 + scroll-into-view-if-needed: 3.1.0 + shiki: 4.3.1 + tinyglobby: 0.2.17 + unified: 11.0.5 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + yaml: 2.9.0 + optionalDependencies: + '@mdx-js/mdx': 3.1.1 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@types/react': 19.2.17 + lucide-react: 1.26.0(react@19.2.7) + next: 16.2.11(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@15.2.3(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.17)(fumadocs-core@16.12.1(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.26.0(react@19.2.7))(next@16.2.11(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.2.11(react-dom@19.2.7(react@19.2.7))(react@19.2.7))(react@19.2.7)(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0)): + dependencies: + '@mdx-js/mdx': 3.1.1 + '@standard-schema/spec': 1.1.0 + chokidar: 5.0.0 + esbuild: 0.28.1 + estree-util-value-to-estree: 3.5.0 + fumadocs-core: 16.12.1(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.26.0(react@19.2.7))(next@16.2.11(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) + github-slugger: 2.0.0 + magic-string: 1.2.0 + mdast-util-mdx: 3.0.0 + picocolors: 1.1.1 + picomatch: 4.0.5 + tinyexec: 1.3.0 + tinyglobby: 0.2.17 + unified: 11.0.5 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + yaml: 2.9.0 + yuku-analyzer: 0.8.7 + zod: 4.4.3 + optionalDependencies: + '@types/mdast': 4.0.4 + '@types/mdx': 2.0.14 + '@types/react': 19.2.17 + next: 16.2.11(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + react: 19.2.7 + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0) + transitivePeerDependencies: + - supports-color + + fumadocs-ui@16.12.1(@types/mdx@2.0.14)(@types/react-dom@19.2.3(@types/react@19.2.17))(@types/react@19.2.17)(fumadocs-core@16.12.1(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.26.0(react@19.2.7))(next@16.2.11(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.2.11(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.3): + dependencies: + '@fuma-translate/react': 1.0.2(@types/react@19.2.17)(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + '@fumadocs/tailwind': 0.1.1(tailwindcss@4.3.3) + '@radix-ui/react-accordion': 1.2.18(@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.18(@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.21(@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.3(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-navigation-menu': 1.2.20(@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.21(@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.9(@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.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-slot': 1.3.1(@types/react@19.2.17)(react@19.2.7) + '@radix-ui/react-tabs': 1.1.19(@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 + cnfast: 0.0.8 + fumadocs-core: 16.12.1(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.17)(lucide-react@1.26.0(react@19.2.7))(next@16.2.11(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) + lucide-react: 1.26.0(react@19.2.7) + motion: 12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + next-themes: 0.4.6(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) + react-remove-scroll: 2.7.2(@types/react@19.2.17)(react@19.2.7) + rehype-raw: 7.0.0 + scroll-into-view-if-needed: 3.1.0 + shiki: 4.3.1 + unist-util-visit: 5.1.0 + optionalDependencies: + '@types/mdx': 2.0.14 + '@types/react': 19.2.17 + next: 16.2.11(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - '@types/react-dom' + - tailwindcss + gensync@1.0.0-beta.2: {} get-caller-file@2.0.5: {} + get-nonce@1.0.1: {} + get-stream@6.0.1: {} + github-slugger@2.0.0: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -5135,12 +7349,122 @@ snapshots: has-flag@4.0.0: {} + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.2.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.5 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.3 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.9 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + 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.9 + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.5 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + highlight.js@10.7.3: {} html-entities@2.6.0: {} html-escaper@2.0.2: {} + html-void-elements@3.0.0: {} + human-id@4.2.0: {} human-signals@2.1.0: {} @@ -5162,8 +7486,19 @@ snapshots: imurmurhash@0.1.4: {} + inline-style-parser@0.2.7: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + is-arrayish@0.2.1: {} + is-decimal@2.0.1: {} + is-docker@2.2.1: {} is-extglob@2.1.1: {} @@ -5174,8 +7509,12 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-hexadecimal@2.0.1: {} + is-number@7.0.0: {} + is-plain-obj@4.1.0: {} + is-stream@2.0.1: {} is-subdir@1.2.0: @@ -5223,6 +7562,8 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 + jiti@2.7.0: {} + joycon@3.1.1: {} js-tokens@10.0.0: {} @@ -5233,123 +7574,613 @@ snapshots: js-yaml@3.15.0: dependencies: - argparse: 1.0.10 - esprima: 4.0.1 + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.3.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kiwi-schema@0.5.0: {} + + kleur@3.0.3: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + 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 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + load-tsconfig@0.2.5: {} + + loader-runner@4.3.2: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + lodash.sortby@4.7.0: {} + + lodash.startcase@4.4.0: {} + + longest-streak@3.1.0: {} + + loupe@3.2.1: {} + + lower-case@2.0.2: + dependencies: + tslib: 2.8.1 + + lru-cache@10.4.3: {} + + lru-cache@11.5.2: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + lucide-react@1.26.0(react@19.2.7): + dependencies: + react: 19.2.7 + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magic-string@1.2.0: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magicast@0.3.5: + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + source-map-js: 1.2.1 + + make-dir@4.0.0: + dependencies: + semver: 7.8.5 + + markdown-extensions@2.0.0: {} + + markdown-table@3.0.4: {} + + marked-terminal@7.3.0(marked@9.1.6): + dependencies: + ansi-escapes: 7.3.0 + ansi-regex: 6.2.2 + chalk: 5.6.2 + cli-highlight: 2.1.11 + cli-table3: 0.6.5 + marked: 9.1.6 + node-emoji: 2.2.0 + supports-hyperlinks: 3.2.0 + + marked@9.1.6: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.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.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 + + mdast-util-gfm-footnote@2.1.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-strikethrough@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-table@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-task-list-item@2.0.0: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + 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.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color - js-yaml@4.3.0: + mdast-util-mdx-expression@2.0.1: dependencies: - argparse: 2.0.1 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color - jsesc@3.1.0: {} + mdast-util-mdx-jsx@3.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color - json-buffer@3.0.1: {} + mdast-util-mdx@3.0.0: + dependencies: + 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 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color - json-parse-even-better-errors@2.3.1: {} + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color - json-schema-traverse@0.4.1: {} + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 - json-schema-traverse@1.0.0: {} + mdast-util-to-hast@13.2.1: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.3 + 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.1.0 + vfile: 6.0.3 - json-stable-stringify-without-jsonify@1.0.1: {} + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + 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.1.0 + zwitch: 2.0.4 - json5@2.2.3: {} + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.4 - jsonfile@4.0.0: - optionalDependencies: - graceful-fs: 4.2.11 + mediabunny@1.50.8: + dependencies: + '@types/dom-mediacapture-transform': 0.1.12 + '@types/dom-webcodecs': 0.1.13 - keyv@4.5.4: + memfs@3.4.3: dependencies: - json-buffer: 3.0.1 + fs-monkey: 1.0.3 - kiwi-schema@0.5.0: {} + merge-stream@2.0.0: {} - kleur@3.0.3: {} + merge2@1.4.1: {} - levn@0.4.1: + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm@3.0.0: + dependencies: + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-mdx-expression@3.0.1: dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - lilconfig@3.1.3: {} + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - lines-and-columns@1.2.4: {} + micromark-extension-mdx-jsx@3.0.2: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 - load-tsconfig@0.2.5: {} + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.2 - loader-runner@4.3.2: {} + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 - locate-path@5.0.0: + micromark-extension-mdxjs@3.0.0: dependencies: - p-locate: 4.1.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 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 - locate-path@6.0.0: + micromark-factory-destination@2.0.1: dependencies: - p-locate: 5.0.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - lodash.merge@4.6.2: {} + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - lodash.sortby@4.7.0: {} + micromark-factory-mdx-expression@2.0.3: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 - lodash.startcase@4.4.0: {} + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 - loupe@3.2.1: {} + micromark-factory-title@2.0.1: + dependencies: + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - lower-case@2.0.2: + micromark-factory-whitespace@2.0.1: dependencies: - tslib: 2.8.1 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - lru-cache@10.4.3: {} + micromark-util-character@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - lru-cache@11.5.2: {} + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 - lru-cache@5.1.1: + micromark-util-classify-character@2.0.1: dependencies: - yallist: 3.1.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - lru-cache@6.0.0: + micromark-util-combine-extensions@2.0.1: dependencies: - yallist: 4.0.0 + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 - magic-string@0.30.21: + micromark-util-decode-numeric-character-reference@2.0.2: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + micromark-util-symbol: 2.0.1 - magicast@0.3.5: + micromark-util-decode-string@2.0.1: dependencies: - '@babel/parser': 7.29.7 - '@babel/types': 7.29.7 - source-map-js: 1.2.1 + 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 - make-dir@4.0.0: + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: dependencies: - semver: 7.8.5 + '@types/estree': 1.0.9 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 - marked-terminal@7.3.0(marked@9.1.6): + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: dependencies: - ansi-escapes: 7.3.0 - ansi-regex: 6.2.2 - chalk: 5.6.2 - cli-highlight: 2.1.11 - cli-table3: 0.6.5 - marked: 9.1.6 - node-emoji: 2.2.0 - supports-hyperlinks: 3.2.0 + micromark-util-symbol: 2.0.1 - marked@9.1.6: {} + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 - mediabunny@1.50.8: + micromark-util-sanitize-uri@2.0.1: dependencies: - '@types/dom-mediacapture-transform': 0.1.12 - '@types/dom-webcodecs': 0.1.13 + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - memfs@3.4.3: + micromark-util-subtokenize@2.1.0: dependencies: - fs-monkey: 1.0.3 + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - merge-stream@2.0.0: {} + micromark-util-symbol@2.0.1: {} - merge2@1.4.1: {} + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + transitivePeerDependencies: + - supports-color micromatch@4.0.8: dependencies: @@ -5387,6 +8218,20 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.4 + motion-dom@12.42.2: + dependencies: + motion-utils: 12.39.0 + + motion-utils@12.39.0: {} + + motion@12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + framer-motion: 12.42.2(react-dom@19.2.7(react@19.2.7))(react@19.2.7) + tslib: 2.8.1 + optionalDependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + mri@1.2.0: {} ms@2.1.3: {} @@ -5403,6 +8248,11 @@ snapshots: neo-async@2.6.2: {} + next-themes@0.4.6(react-dom@19.2.7(react@19.2.7))(react@19.2.7): + dependencies: + react: 19.2.7 + react-dom: 19.2.7(react@19.2.7) + next@16.2.11(react-dom@19.2.7(react@19.2.7))(react@19.2.7): dependencies: '@next/env': 16.2.11 @@ -5445,12 +8295,22 @@ snapshots: dependencies: path-key: 3.1.1 + npm-to-yarn@3.1.0: {} + object-assign@4.1.1: {} onetime@5.1.2: dependencies: mimic-fn: 2.1.0 + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -5504,6 +8364,16 @@ snapshots: dependencies: callsites: 3.1.0 + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.3.0 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.29.7 @@ -5519,6 +8389,10 @@ snapshots: parse5@6.0.1: {} + parse5@7.3.0: + dependencies: + entities: 6.0.1 + path-exists@4.0.0: {} path-key@3.1.1: {} @@ -5555,11 +8429,13 @@ snapshots: mlly: 1.8.2 pathe: 2.0.3 - postcss-load-config@6.0.1(postcss@8.5.12): + postcss-load-config@6.0.1(jiti@2.7.0)(postcss@8.5.12)(yaml@2.9.0): dependencies: lilconfig: 3.1.3 optionalDependencies: + jiti: 2.7.0 postcss: 8.5.12 + yaml: 2.9.0 postcss-modules-extract-imports@3.1.0(postcss@8.5.12): dependencies: @@ -5606,6 +8482,8 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 + property-information@7.2.0: {} + publint@0.3.21: dependencies: '@publint/pack': 0.1.5 @@ -5631,6 +8509,33 @@ snapshots: react-refresh@0.18.0: {} + react-remove-scroll-bar@2.3.8(@types/react@19.2.17)(react@19.2.7): + dependencies: + 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.17 + + react-remove-scroll@2.7.2(@types/react@19.2.17)(react@19.2.7): + dependencies: + 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.17)(react@19.2.7) + use-sidecar: 1.1.3(@types/react@19.2.17)(react@19.2.7) + optionalDependencies: + '@types/react': 19.2.17 + + react-style-singleton@2.2.3(@types/react@19.2.17)(react@19.2.7): + dependencies: + get-nonce: 1.0.1 + react: 19.2.7 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.17 + react@19.2.3: {} react@19.2.7: {} @@ -5644,6 +8549,8 @@ snapshots: readdirp@4.1.2: {} + readdirp@5.1.1: {} + recast@0.23.11: dependencies: ast-types: 0.16.1 @@ -5652,6 +8559,109 @@ snapshots: tiny-invariant: 1.3.3 tslib: 2.8.1 + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.9 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.17.0): + dependencies: + 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 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@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.9 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.5 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.9 + '@types/hast': 3.0.5 + hast-util-to-estree: 3.1.3 + transitivePeerDependencies: + - supports-color + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.1.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + remark@15.0.1: + dependencies: + '@types/mdast': 4.0.4 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color + remotion@4.0.499(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: react: 19.2.3 @@ -5722,6 +8732,10 @@ snapshots: ajv-formats: 2.1.1(ajv@8.20.0) ajv-keywords: 5.1.0(ajv@8.20.0) + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.1 + semver@6.3.1: {} semver@7.5.3: @@ -5769,6 +8783,17 @@ snapshots: shebang-regex@3.0.0: {} + shiki@4.3.1: + dependencies: + '@shikijs/core': 4.3.1 + '@shikijs/engine-javascript': 4.3.1 + '@shikijs/engine-oniguruma': 4.3.1 + '@shikijs/langs': 4.3.1 + '@shikijs/themes': 4.3.1 + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + siginfo@2.0.0: {} signal-exit@3.0.7: {} @@ -5803,6 +8828,8 @@ snapshots: dependencies: whatwg-url: 7.1.0 + space-separated-tokens@2.0.2: {} + spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -5828,6 +8855,11 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.2.0 + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -5850,6 +8882,14 @@ snapshots: dependencies: webpack: 5.105.0(esbuild@0.28.1)(postcss@8.5.12) + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + styled-jsx@5.1.6(react@19.2.7): dependencies: client-only: 0.0.1 @@ -5880,11 +8920,13 @@ snapshots: svg-parser@2.0.4: {} + tailwindcss@4.3.3: {} + tapable@2.3.3: {} term-size@2.2.1: {} - terser-webpack-plugin@5.6.1(esbuild@0.28.1)(postcss@8.5.12)(webpack@5.105.0(postcss@8.5.12)): + terser-webpack-plugin@5.6.1(esbuild@0.28.1)(postcss@8.5.12)(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.12)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 @@ -5924,6 +8966,8 @@ snapshots: tinyexec@1.2.4: {} + tinyexec@1.3.0: {} + tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.5) @@ -5947,6 +8991,10 @@ snapshots: tree-kill@1.2.2: {} + trim-lines@3.0.1: {} + + trough@2.2.0: {} + ts-api-utils@2.5.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -5955,7 +9003,7 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(postcss@8.5.12)(typescript@5.9.3): + tsup@8.5.1(jiti@2.7.0)(postcss@8.5.12)(typescript@5.9.3)(yaml@2.9.0): dependencies: bundle-require: 5.1.0(esbuild@0.28.1) cac: 6.7.14 @@ -5966,7 +9014,7 @@ snapshots: fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.5.12) + postcss-load-config: 6.0.1(jiti@2.7.0)(postcss@8.5.12)(yaml@2.9.0) resolve-from: 5.0.0 rollup: 4.62.2 source-map: 0.7.6 @@ -5987,12 +9035,12 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.21.0(eslint@9.19.0)(typescript@5.9.3): + typescript-eslint@8.21.0(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0)(typescript@5.9.3))(eslint@9.19.0)(typescript@5.9.3) - '@typescript-eslint/parser': 8.21.0(eslint@9.19.0)(typescript@5.9.3) - '@typescript-eslint/utils': 8.21.0(eslint@9.19.0)(typescript@5.9.3) - eslint: 9.19.0 + '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3))(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/parser': 8.21.0(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3) + '@typescript-eslint/utils': 8.21.0(eslint@9.19.0(jiti@2.7.0))(typescript@5.9.3) + eslint: 9.19.0(jiti@2.7.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -6007,6 +9055,48 @@ snapshots: unicode-emoji-modifier-base@1.0.0: {} + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + 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 + universalify@0.1.2: {} update-browserslist-db@1.2.3(browserslist@4.28.7): @@ -6019,17 +9109,47 @@ snapshots: dependencies: punycode: 2.3.1 + use-callback-ref@1.3.3(@types/react@19.2.17)(react@19.2.7): + dependencies: + react: 19.2.7 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.17 + + use-sidecar@1.1.3(@types/react@19.2.17)(react@19.2.7): + dependencies: + detect-node-es: 1.1.0 + react: 19.2.7 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.2.17 + util-deprecate@1.0.2: {} validate-npm-package-name@5.0.1: {} - vite-node@3.2.4(@types/node@24.13.3)(terser@5.49.0): + vfile-location@5.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 + + vfile-message@4.0.3: + dependencies: + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite-node@3.2.4(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.6(@types/node@24.13.3)(terser@5.49.0) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -6044,7 +9164,7 @@ snapshots: - tsx - yaml - vite@7.3.6(@types/node@24.13.3)(terser@5.49.0): + vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0): dependencies: esbuild: 0.28.1 fdir: 6.5.0(picomatch@4.0.5) @@ -6055,13 +9175,16 @@ snapshots: optionalDependencies: '@types/node': 24.13.3 fsevents: 2.3.3 + jiti: 2.7.0 + lightningcss: 1.32.0 terser: 5.49.0 + yaml: 2.9.0 - vitest@3.2.7(@types/node@24.13.3)(terser@5.49.0): + vitest@3.2.7(@types/debug@4.1.13)(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.7 - '@vitest/mocker': 3.2.7(vite@7.3.6(@types/node@24.13.3)(terser@5.49.0)) + '@vitest/mocker': 3.2.7(vite@7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0)) '@vitest/pretty-format': 3.2.7 '@vitest/runner': 3.2.7 '@vitest/snapshot': 3.2.7 @@ -6079,10 +9202,11 @@ snapshots: tinyglobby: 0.2.17 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.6(@types/node@24.13.3)(terser@5.49.0) - vite-node: 3.2.4(@types/node@24.13.3)(terser@5.49.0) + vite: 7.3.6(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0) + vite-node: 3.2.4(@types/node@24.13.3)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.49.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: + '@types/debug': 4.1.13 '@types/node': 24.13.3 transitivePeerDependencies: - jiti @@ -6102,6 +9226,8 @@ snapshots: dependencies: graceful-fs: 4.2.11 + web-namespaces@2.0.1: {} + webidl-conversions@4.0.2: {} webpack-sources@3.5.1: {} @@ -6130,7 +9256,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.6.1(esbuild@0.28.1)(postcss@8.5.12)(webpack@5.105.0(postcss@8.5.12)) + terser-webpack-plugin: 5.6.1(esbuild@0.28.1)(postcss@8.5.12)(webpack@5.105.0(esbuild@0.28.1)(postcss@8.5.12)) watchpack: 2.5.2 webpack-sources: 3.5.1 transitivePeerDependencies: @@ -6184,6 +9310,8 @@ snapshots: yallist@4.0.0: {} + yaml@2.9.0: {} + yargs-parser@20.2.9: {} yargs@16.2.2: @@ -6198,4 +9326,28 @@ snapshots: yocto-queue@0.1.0: {} + yuku-analyzer@0.8.7: + dependencies: + '@yuku-toolchain/types': 0.8.7 + yuku-ast: 0.8.7 + optionalDependencies: + '@yuku-analyzer/binding-android-arm64': 0.8.7 + '@yuku-analyzer/binding-darwin-arm64': 0.8.7 + '@yuku-analyzer/binding-darwin-x64': 0.8.7 + '@yuku-analyzer/binding-freebsd-x64': 0.8.7 + '@yuku-analyzer/binding-linux-arm-gnu': 0.8.7 + '@yuku-analyzer/binding-linux-arm-musl': 0.8.7 + '@yuku-analyzer/binding-linux-arm64-gnu': 0.8.7 + '@yuku-analyzer/binding-linux-arm64-musl': 0.8.7 + '@yuku-analyzer/binding-linux-x64-gnu': 0.8.7 + '@yuku-analyzer/binding-linux-x64-musl': 0.8.7 + '@yuku-analyzer/binding-win32-arm64': 0.8.7 + '@yuku-analyzer/binding-win32-x64': 0.8.7 + + yuku-ast@0.8.7: + dependencies: + '@yuku-toolchain/types': 0.8.7 + zod@4.4.3: {} + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 37cdb5e..084b211 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -7,33 +7,6 @@ allowBuilds: esbuild: true sharp: true -minimumReleaseAgeExclude: - - '@remotion/bundler@4.0.499' - - '@remotion/canvas-capture@4.0.499' - - '@remotion/cli@4.0.499' - - '@remotion/compositor-darwin-arm64@4.0.499' - - '@remotion/compositor-darwin-x64@4.0.499' - - '@remotion/compositor-linux-arm64-gnu@4.0.499' - - '@remotion/compositor-linux-arm64-musl@4.0.499' - - '@remotion/compositor-linux-x64-gnu@4.0.499' - - '@remotion/compositor-linux-x64-musl@4.0.499' - - '@remotion/compositor-win32-x64-msvc@4.0.499' - - '@remotion/drag-and-drop@4.0.499' - - '@remotion/eslint-config-flat@4.0.499' - - '@remotion/licensing@4.0.499' - - '@remotion/media-parser@4.0.499' - - '@remotion/media-utils@4.0.499' - - '@remotion/player@4.0.499' - - '@remotion/renderer@4.0.499' - - '@remotion/streaming@4.0.499' - - '@remotion/studio-server@4.0.499' - - '@remotion/studio-shared@4.0.499' - - '@remotion/studio@4.0.499' - - '@remotion/timeline-utils@4.0.499' - - '@remotion/web-renderer@4.0.499' - - '@remotion/zod-types@4.0.499' - - remotion@4.0.499 - overrides: esbuild: 0.28.1 postcss: 8.5.12