diff --git a/.github/workflows/deploy-docs.yaml b/.github/workflows/deploy-docs.yaml deleted file mode 100644 index 9693b943c6..0000000000 --- a/.github/workflows/deploy-docs.yaml +++ /dev/null @@ -1,30 +0,0 @@ -name: Deploy Docs - -on: - push: - branches: - - main - paths: - - "apps/docs/**" - -jobs: - deploy: - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Setup Bun and install dependencies - uses: ./.github/actions/setup-bun - - - name: Build - run: bun run build - working-directory: apps/docs - - - name: Deploy to Cloudflare Pages - run: bunx wrangler pages deploy dist/client --project-name=decocms-docs - working-directory: apps/docs - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CF_API_TOKEN }} - CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CF_ACCOUNT_ID }} diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 46decf1e70..4fdeb475a1 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -10,7 +10,6 @@ on: paths-ignore: - "apps/api/package.json" - ".github/**" - - "apps/docs/**" - "**/*.md" pull_request: branches: @@ -61,7 +60,7 @@ jobs: while IFS= read -r f; do [ -z "$f" ] && continue case "$f" in - .github/*|apps/docs/*|deploy/*|*.md) ;; + .github/*|deploy/*|*.md) ;; *) relevant=true; break ;; esac done <<< "$FILES" diff --git a/.github/workflows/multi-pod.yml b/.github/workflows/multi-pod.yml index c87d4f388a..e2f622124d 100644 --- a/.github/workflows/multi-pod.yml +++ b/.github/workflows/multi-pod.yml @@ -9,7 +9,6 @@ on: paths-ignore: - "apps/api/package.json" - ".github/**" - - "apps/docs/**" - "**/*.md" pull_request: # Multi-pod tests are slow (~7-10 min cold image build + serialized diff --git a/.github/workflows/resilience.yml b/.github/workflows/resilience.yml index 87da4ff863..32529b7b51 100644 --- a/.github/workflows/resilience.yml +++ b/.github/workflows/resilience.yml @@ -9,7 +9,6 @@ on: paths-ignore: - "apps/api/package.json" - ".github/**" - - "apps/docs/**" - "**/*.md" workflow_dispatch: diff --git a/.github/workflows/sandbox-daemon.yml b/.github/workflows/sandbox-daemon.yml index ee1fc5ab16..73e412eac3 100644 --- a/.github/workflows/sandbox-daemon.yml +++ b/.github/workflows/sandbox-daemon.yml @@ -16,7 +16,6 @@ on: paths-ignore: - "apps/api/package.json" - ".github/**" - - "apps/docs/**" - "**/*.md" pull_request: branches: diff --git a/.github/workflows/storage-integration.yml b/.github/workflows/storage-integration.yml index 4f6c79f6f5..fb85d8f990 100644 --- a/.github/workflows/storage-integration.yml +++ b/.github/workflows/storage-integration.yml @@ -20,7 +20,6 @@ on: paths-ignore: - "apps/api/package.json" - ".github/**" - - "apps/docs/**" - "**/*.md" pull_request: branches: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8f6fad220a..b6486ce9e6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,7 +10,6 @@ on: paths-ignore: - "apps/api/package.json" - ".github/**" - - "apps/docs/**" - "**/*.md" pull_request: branches: @@ -78,7 +77,7 @@ jobs: while IFS= read -r f; do [ -z "$f" ] && continue case "$f" in - .github/*|apps/docs/*|deploy/*|*.md) ;; + .github/*|deploy/*|*.md) ;; *) relevant=true ;; esac case "$f" in diff --git a/.gitignore b/.gitignore index 000488b989..94b1958a11 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,6 @@ # GSD workflow state .planning/ -# Local-only architecture diagram tooling (generates the standalone html -# from architecture-model.ts; the committed docs use ArchitectureDiagram.astro). -/architecture.html -apps/docs/scripts/gen-architecture-html.ts -apps/docs/scripts/architecture-runtime.js - # Logs logs *.log @@ -103,7 +97,7 @@ packages/e2e/screenshots/ .github/screenshots/ .github/pr-assets/ -# Generated docs (root-level only, not apps/docs/). Use /docs/* not /docs +# Generated docs (root-level only). Use /docs/* not /docs # so we can un-ignore specific subdirs below — git won't traverse into an # ignored directory. /docs/* diff --git a/.oxlintrc.json b/.oxlintrc.json index 7fe5863e61..c494cee796 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -13,7 +13,6 @@ "./plugins/ban-git-provider-reachthrough.js", "./plugins/ensure-tailwind-design-system-tokens.js" ], - "ignorePatterns": ["apps/docs/*"], "rules": { "unicorn/no-useless-fallback-in-spread": "off", "no-unused-expressions": "off", diff --git a/AGENTS.md b/AGENTS.md index 97455ad9f0..0147c4f941 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -93,8 +93,14 @@ rewriting Git history does not revoke them. ## Documentation -`apps/docs/` describes intended system behavior and architecture. When code -differs, preserve the specification and identify the implementation gap. +Public product documentation lives in +[docs-tanstack](https://github.com/deco-sites/docs-tanstack) and is published at +[Studio documentation](https://docs.decocms.com/studio). Update product guides +and architecture there. When code differs, preserve the specification and +identify the implementation gap. + +Keep workspace setup, contributor guidance, and implementation plans in this +repository's READMEs and engineering documents. Keep each instruction in one place. Put task-specific guidance near its owner and link to it here with a condition for reading it. Let code, schemas, and diff --git a/README.md b/README.md index 0bc8358a13..10fe4bf8c7 100644 --- a/README.md +++ b/README.md @@ -174,6 +174,13 @@ Every tool call gets input/output validation, access control, audit logging, and --- +## Documentation + +[Studio documentation](https://docs.decocms.com/studio) lives in +[docs-tanstack](https://github.com/deco-sites/docs-tanstack), alongside the +Storefront documentation. Update public product guides and architecture there. +Workspace READMEs and engineering plans stay here with the implementation. + ## Project Structure ### Applications @@ -181,7 +188,6 @@ Every tool call gets input/output validation, access control, audit logging, and | Workspace | Purpose | | --- | --- | | [`apps/api`](./apps/api/README.md) | Hono API, authentication, tools, storage, migrations, and the `deco` CLI | -| [`apps/docs`](./apps/docs/README.md) | Astro documentation site | | [`apps/native`](./apps/native/README.md) | Tauri desktop app and local Rust runtime | | [`apps/web`](./apps/web/README.md) | Vite and React 19 administration interface | diff --git a/apps/docs/.gitignore b/apps/docs/.gitignore deleted file mode 100644 index fafe8e6886..0000000000 --- a/apps/docs/.gitignore +++ /dev/null @@ -1,32 +0,0 @@ -# Environment files -.env -.env.production -.dev.vars - -# Build files -view-build/ -dist -dist-ssr -dist/ -.nitro -.tanstack - -# Node modules -node_modules -node_modules/ - -# Generated types -.astro/ - -# Logs -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* - -# macOS-specific files -.DS_Store - -# Other -*.local -count.txt diff --git a/apps/docs/README.md b/apps/docs/README.md deleted file mode 100644 index f80ab9da90..0000000000 --- a/apps/docs/README.md +++ /dev/null @@ -1,165 +0,0 @@ -# Studio Documentation - -Publishes current and legacy deco Studio documentation with Astro. - -| Attribute | Value | -| --- | --- | -| Workspace | `@decocms/docs` (`apps/docs`) | -| Kind | Astro documentation site | -| Runtime | Node.js 22+ | -| Distribution | Static site on Cloudflare Pages | - -## Overview - -This workspace builds the public Studio documentation as a static Astro site. -It supports versioned product content, English and Brazilian Portuguese -locales, MDX pages, React-enhanced components, and redirects for historical -URLs. - -Documentation under `apps/docs` describes the intended system design and -behavior. It is both product documentation and a target specification. When the -implementation and documentation differ, do not weaken the documentation to -match an incomplete implementation. - -## Responsibilities - -- Publish current Studio guides, concepts, self-hosting instructions, and API - reference content. -- Preserve the legacy `deco-chat` documentation set alongside the current - `deco-studio` set. -- Generate versioned and localized routes for `en` and `pt-br`. -- Render MDX through the shared documentation layouts and components. -- Maintain navigation, product metadata, locale strings, syntax highlighting, - styles, and static assets. -- Redirect legacy and `latest` URLs to stable versioned destinations. -- Produce the static `dist/client` bundle deployed to Cloudflare Pages. - -## Usage - -Install dependencies and start the documentation server from the repository -root: - -```bash -bun install -bun run --cwd=apps/docs dev -``` - -The site runs at `http://localhost:4000`. - -Validate and build the static site with: - -```bash -bun run --cwd=apps/docs check -bun run --cwd=apps/docs build -``` - -The build output is `apps/docs/dist/client`. - -Deploy with Wrangler after authenticating to the Cloudflare account that owns -the `decocms-docs` Pages project: - -```bash -bun run --cwd=apps/docs deploy -``` - -## Architecture - -Astro uses `client` as its source root. The content collection loads every MDX -file under `client/src/content`, and the route layer interprets the first two -path segments as product version and locale. - -```text -client/src/content///.mdx - | - v - Astro content collection - | - v - versioned and localized routes - | - v - dist/client -``` - -Key paths: - -| Path | Purpose | -| --- | --- | -| `astro.config.mjs` | Astro root, output, Markdown, React, Tailwind, and port configuration | -| `client/src/content/` | Versioned MDX source content | -| `client/src/content.config.ts` | Content loader and frontmatter schema | -| `client/src/pages/` | Static route generation and compatibility redirects | -| `client/src/config/versions.ts` | Product versions, labels, roots, and latest-version selection | -| `client/src/i18n/` | Supported locales and translated interface strings | -| `client/src/layouts/` | Page-level documentation layouts | -| `client/src/components/` | Astro and React rendering components | -| `client/src/styles/` | Site and Markdown presentation | -| `client/public/` | Static assets and hosting redirects | - -The current version ID is `deco-studio`. `deco-chat` remains available as the -legacy documentation version. `/latest/...` and unversioned locale URLs redirect -to the configured current version. - -## Development - -Create content at: - -```text -apps/docs/client/src/content///.mdx -``` - -Every document must satisfy the content schema: - -```yaml ---- -title: Page title -description: A concise page description -icon: optional-icon-name ---- -``` - -Use `bun run --cwd=apps/docs check` while editing. It runs `astro sync` before -TypeScript so generated content types stay current. Run -`bun run --cwd=apps/docs build` before review to catch route generation, -frontmatter, and rendering failures. This workspace does not define a separate -test script; type checking and the production build are its focused validation -steps. - -When adding a product documentation version, update -`client/src/config/versions.ts` and add matching content roots. When adding -locale-aware interface text, update `client/src/i18n/ui.ts`. - -## Boundaries - -- `apps/docs` owns documentation content and the documentation site's - presentation; it does not own Studio API or web runtime behavior. -- Treat current documentation as the intended contract, even when application - work is still converging on it. -- Do not import implementation from `apps/api/src` or `apps/web/src`. Link to - source or public contracts when implementation context is useful. -- Keep product-version compatibility in the route layer. Do not copy stale - content into the current version solely to preserve an old URL. -- Update English and Brazilian Portuguese counterparts together when a page - exists in both locales. -- Keep commands executable from the repository root and identify the workspace - explicitly. - -## Content conventions - -- Use clear Studio terminology and present tense. -- Put the current product documentation under `deco-studio`. -- Keep historical product behavior under `deco-chat` and label it as legacy. -- Store reusable presentation in `client/src/components` or - `client/src/layouts`, not inside repeated MDX markup. -- Put files that must retain their public name in `client/public`. -- Add redirects in the route files only when an existing public URL needs - compatibility. - -## Related documentation - -- [Studio API](../api/README.md) -- [Studio web app](../web/README.md) -- [Repository guidelines and documentation philosophy](../../AGENTS.md) -- [Project overview](../../README.md) -- [Astro documentation](https://docs.astro.build/) -- [Cloudflare Pages deployment documentation](https://developers.cloudflare.com/pages/) diff --git a/apps/docs/astro.config.mjs b/apps/docs/astro.config.mjs deleted file mode 100644 index 5bc0545d03..0000000000 --- a/apps/docs/astro.config.mjs +++ /dev/null @@ -1,39 +0,0 @@ -// @ts-check -import { defineConfig } from "astro/config"; -import tailwindcss from "@tailwindcss/vite"; - -import mdx from "@astrojs/mdx"; - -import react from "@astrojs/react"; - -// https://astro.build/config -export default defineConfig({ - root: "client", - server: { - port: 4000, - }, - outDir: "dist/client/", - publicDir: "client/public", - srcDir: "client/src", - integrations: [mdx(), react()], - vite: { - plugins: [ - // @ts-ignore: tailwindcss plugin type issue - tailwindcss(), - ], - server: { - hmr: { - clientPort: 4000, - }, - }, - }, - markdown: { - shikiConfig: { - themes: { - light: "github-light", - dark: "github-dark", - }, - defaultColor: "light", - }, - }, -}); diff --git a/apps/docs/client/public/_redirects b/apps/docs/client/public/_redirects deleted file mode 100644 index 1baf2dfaa2..0000000000 --- a/apps/docs/client/public/_redirects +++ /dev/null @@ -1,18 +0,0 @@ -# Root redirects -/ /deco-studio/en/studio/quickstart 302 -/latest /deco-studio/en/studio/quickstart 302 -/deco-studio /deco-studio/en/studio/quickstart 302 -/deco-chat /deco-chat/en/getting-started/ai-builders 302 -/en /deco-studio/en/studio/quickstart 302 -/pt-br /deco-studio/pt-br/studio/quickstart 302 -/deco-studio/en /deco-studio/en/studio/quickstart 302 -/deco-studio/pt-br /deco-studio/pt-br/studio/quickstart 302 -/deco-chat/en /deco-chat/en/getting-started/ai-builders 302 -/deco-chat/pt-br /deco-chat/pt-br/getting-started/ai-builders 302 - -# Legacy version redirects (old URLs) -/2026-03-10/* /deco-studio/:splat 302 -/2025-10-10/* /deco-chat/:splat 302 - -# Rewrite /latest/* to current version -/latest/* /deco-studio/:splat 302 diff --git a/apps/docs/client/public/favicon.ico b/apps/docs/client/public/favicon.ico deleted file mode 100644 index 9d2fba1bd3..0000000000 Binary files a/apps/docs/client/public/favicon.ico and /dev/null differ diff --git a/apps/docs/client/public/favicon.svg b/apps/docs/client/public/favicon.svg deleted file mode 100644 index e96387abd1..0000000000 --- a/apps/docs/client/public/favicon.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/apps/docs/client/public/logos/deco-dark.svg b/apps/docs/client/public/logos/deco-dark.svg deleted file mode 100644 index 27002906f9..0000000000 --- a/apps/docs/client/public/logos/deco-dark.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/apps/docs/client/public/logos/deco-light.svg b/apps/docs/client/public/logos/deco-light.svg deleted file mode 100644 index e96387abd1..0000000000 --- a/apps/docs/client/public/logos/deco-light.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - diff --git a/apps/docs/client/public/og-image.png b/apps/docs/client/public/og-image.png deleted file mode 100644 index 427f35f13f..0000000000 Binary files a/apps/docs/client/public/og-image.png and /dev/null differ diff --git a/apps/docs/client/public/screenshots/roles-permissions.png b/apps/docs/client/public/screenshots/roles-permissions.png deleted file mode 100644 index db37257d80..0000000000 Binary files a/apps/docs/client/public/screenshots/roles-permissions.png and /dev/null differ diff --git a/apps/docs/client/src/components/ArchitectureDiagram.astro b/apps/docs/client/src/components/ArchitectureDiagram.astro deleted file mode 100644 index be336d817e..0000000000 --- a/apps/docs/client/src/components/ArchitectureDiagram.astro +++ /dev/null @@ -1,89 +0,0 @@ ---- -// Static, server-rendered architecture diagram. No client JS. -// All data + layout come from the single source of truth: architecture-model.ts -// (shared with the interactive standalone architecture.html generator). -import { computeLayout } from "./architecture-model"; - -const { zones, subzones, nodes, edges, legend } = computeLayout(); ---- - -
-
- - - - - - - - {zones.map((z) => ( - - - {z.label} - {z.sub} - - ))} - {subzones.map((z) => ( - - - {z.label} - - ))} - - {edges.map((e) => ( - - ))} - - {nodes.map((n) => ( - - {n.replicas && [2, 1].map((s) => ( - - ))} - {n.shape ? ( - - ) : ( - - )} - {n.label} - {n.tag && {n.tag}} - {n.replicas && ×N · scales independently} - - ))} - -
-
- {legend.map((l) => ( - {l.name} - ))} -
-
Request path, agent runs and sandboxes across the edge, cloud cluster and desktop tiers.
-
- - diff --git a/apps/docs/client/src/components/architecture-model.ts b/apps/docs/client/src/components/architecture-model.ts deleted file mode 100644 index 04f1d5bb20..0000000000 --- a/apps/docs/client/src/components/architecture-model.ts +++ /dev/null @@ -1,723 +0,0 @@ -// Single source of truth for the Studio architecture diagram. -// Consumed by ArchitectureDiagram.astro (static SVG, docs) and by -// scripts/gen-architecture-html.ts (standalone interactive architecture.html). -// Update the diagram HERE — both outputs derive from this file. - -const TIER: Record = { - edge: "#94a3b8", - web: "#22d3ee", - api: "#38bdf8", - worker: "#a78bfa", - mcp: "#2dd4bf", - file: "#a3e635", - db: "#34d399", - nats: "#fbbf24", - sbx: "#fb7185", - pub: "#fb923c", - llm: "#f0abfc", - desk: "#c4b5fd", -}; - -const ZONES = [ - { - x: 24, - y: 150, - w: 140, - h: 790, - label: "Edge", - sub: "public internet", - stroke: "rgba(148,163,184,.30)", - fill: "rgba(148,163,184,.03)", - }, - { - x: 182, - y: 150, - w: 992, - h: 790, - label: "Cloud Cluster", - sub: "kubernetes", - stroke: "rgba(56,189,248,.24)", - fill: "rgba(56,189,248,.03)", - }, - { - x: 1192, - y: 150, - w: 384, - h: 790, - label: "Desktop", - sub: "native app · laptop", - stroke: "rgba(168,130,255,.28)", - fill: "rgba(168,130,255,.045)", - }, -]; - -const SUBZONES = [ - { x: 620, y: 782, w: 556, h: 150, label: "Cloud Sandbox · pod" }, -]; - -export type Node = { - x: number; - y: number; - w: number; - h: number; - tier: string; - label: string; - tag?: string; - shape?: "cyl" | "hex"; - replicas?: boolean; - ext?: boolean; - role?: string; - desc?: string; - facts?: [string, string][]; -}; - -const NODES: Record = { - s3: { - x: 470, - y: 96, - w: 128, - h: 54, - tier: "file", - ext: true, - label: "Object Store", - tag: "s3 · external", - role: "Blob backend", - desc: "S3-compatible object storage behind the file routes. Holds uploads, generated assets and offloaded large payloads.", - facts: [ - ["Type", "S3-compatible"], - ["Behind", "file routes"], - ], - }, - llm: { - x: 760, - y: 96, - w: 128, - h: 54, - tier: "llm", - ext: true, - label: "LLM", - tag: "anthropic · external", - role: "Model provider", - desc: "Model providers called by hosted Decopilot, hosted Claude Code inside AgentSandbox, or a native coding CLI. Hosted credentials are injected per run; native CLIs use the user's local authentication.", - facts: [ - ["Models", "Claude"], - ["Called by", "hosted / native harness"], - ], - }, - dmcp: { - x: 1004, - y: 96, - w: 140, - h: 54, - tier: "mcp", - ext: true, - label: "Downstream MCP", - tag: "tool servers · external", - role: "MCP servers", - desc: "The actual MCP tool servers. Reached two ways: the API's MCP proxy forwards external-client traffic here over HTTP; the worker's agent loop connects directly in-process via a PassthroughClient bridge — no HTTP hop inside Studio.", - facts: [ - ["Reached by", "proxy (HTTP)"], - ["+ worker", "in-process bridge"], - ], - }, - - client: { - x: 94, - y: 330, - w: 118, - h: 58, - tier: "edge", - label: "Client", - tag: "browser / mcp", - role: "Cursor · Claude · UI", - desc: "Browser UI and external MCP clients (Cursor, Claude, VS Code). Origin of every request — app traffic and MCP-over-HTTP.", - facts: [ - ["Speaks", "HTTP + MCP"], - ["Hits", "Cloudflare edge"], - ], - }, - cf: { - x: 94, - y: 510, - w: 118, - h: 58, - tier: "edge", - label: "CF", - tag: "edge / cdn", - role: "Cloudflare", - desc: "Edge layer. TLS termination, static SPA caching, DDoS and bot mitigation. First hop for all traffic, including sandbox preview.", - facts: [ - ["TLS", "terminated here"], - ["Caches", "SPA assets"], - ], - }, - nlb: { - x: 94, - y: 690, - w: 118, - h: 58, - tier: "edge", - label: "NLB", - tag: "l4 lb", - role: "Network Load Balancer", - desc: "L4 balancer fronting the cluster. Routes to the web (front-door) pods; the frontDoorLabels selector decides which pods receive ingress.", - facts: [ - ["Layer", "L4 / TCP"], - ["Targets", "web pods"], - ["Cutover", "frontDoorLabels"], - ], - }, - - web: { - x: 305, - y: 545, - w: 146, - h: 64, - tier: "web", - label: "Web", - tag: "nginx · spa", - replicas: true, - role: "Web tier", - desc: "nginx serving the React 19 SPA and reverse-proxying /api, /mcp, /oauth-proxy, /.well-known to the API Service. Split from the API (front-door split) so the static front door deploys and scales on its own.", - facts: [ - ["Image", "ghcr…/studio/web"], - ["Port", "8080"], - ["Proxies →", "API Service"], - ["Scales", "independently"], - ], - }, - api: { - x: 485, - y: 360, - w: 148, - h: 64, - tier: "api", - label: "API", - tag: "hono · role=api", - replicas: true, - role: "App server", - desc: "Hono server: HTTP routes, Better Auth, MCP proxy, access control. Enqueues hosted runs onto DBOS queues and tails NATS to stream output back to the UI. Hosted sandbox lifecycle is fixed to AgentSandbox. Does NOT run the agent loop. Stateless.", - facts: [ - ["Runtime", "Hono / Bun"], - ["Role", "enqueue + serve"], - ["State", "in Postgres"], - ["Scales", "independently"], - ], - }, - worker: { - x: 485, - y: 645, - w: 148, - h: 64, - tier: "worker", - label: "Worker", - tag: "role=worker · dbos", - replicas: true, - role: "Run executor", - desc: "STUDIO_DISPATCH_ROLE=worker. Dequeues DBOS queues selected by listenQueues. Decopilot runs its model loop in-process; hosted Claude Code is dispatched into the managed AgentSandbox. Both publish through the same fenced JetStream/projector pipeline. Calls MCP tools in-process and the sandbox daemon for fs/git/bash. Scales horizontally, with separate queue caps for in-process and sandbox-hosted harnesses.", - facts: [ - ["Drives", "hosted harness dispatch"], - ["Queues", "DBOS listenQueues (env)"], - ["MCP", "in-process bridge"], - ["Scales", "horizontally · per-queue"], - ], - }, - mcpproxy: { - x: 705, - y: 300, - w: 150, - h: 60, - tier: "mcp", - label: "MCP Proxy", - tag: "api routes", - role: "MCP gateway (API-served)", - desc: "API HTTP routes exposing MCP to external clients: /mcp/virtual-mcp/:id (aggregated agent), /mcp/:connectionId (single-connection proxy), /oauth-proxy/* and /.well-known. Called by external IDEs. The worker does NOT use these — it talks MCP in-process.", - facts: [ - ["Serves", "external MCP clients"], - ["Routes", "/mcp/* · /oauth-proxy"], - ["Not used by", "worker"], - ], - }, - files: { - x: 705, - y: 470, - w: 150, - h: 60, - tier: "file", - label: "Files / Storage", - tag: "api · /files /fs", - role: "File + object-storage", - desc: "/api/:org/files/*, uploads, object-storage presigned GET/PUT, and /api/:org/fs/* (the org-fs WebDAV backend). Called by BOTH the API (serving clients) and the worker (agent tools), and by the sandbox org-fs mounts. Backed by S3.", - facts: [ - ["Called by", "API + Worker + Org FS"], - ["Routes", "/files · presigned · /fs"], - ["Backend", "S3"], - ], - }, - nats: { - x: 930, - y: 300, - w: 124, - h: 82, - tier: "nats", - shape: "hex", - label: "NATS", - tag: "messaging", - role: "Live message bus", - desc: "Live infra (not the dormant event-bus feature). Holds the fenced JetStream run log consumed by /stream and the durable projector, carries cross-pod cancellation, and stores shared MCP-list cache and connection-circuit state in JetStream KV.", - facts: [ - ["Run log", "/stream + projector"], - ["Core NATS", "cross-pod cancel"], - ["KV", "MCP cache + circuits"], - ], - }, - db: { - x: 930, - y: 505, - w: 122, - h: 88, - tier: "db", - shape: "cyl", - label: "DB", - tag: "postgres", - role: "System of record", - desc: "PostgreSQL via Kysely. Orgs, connections, vault, audit, threads + messages, sandbox_runner_state — plus the DBOS queues and workflow_status journal that make runs durable and recoverable.", - facts: [ - ["Engine", "PostgreSQL"], - ["ORM", "Kysely"], - ["Holds", "state + DBOS queues"], - ["Recovery", "DBOS journal"], - ], - }, - gateway: { - x: 300, - y: 858, - w: 132, - h: 54, - tier: "edge", - label: "Gateway", - tag: "k8s gateway api", - role: "Preview ingress", - desc: "Kubernetes Gateway API (Istio) — the ingress for sandbox preview traffic. Cloudflare fronts it as the LB; the Gateway routes .preview. via an HTTPRoute to the sandbox pod's daemon (:9000).", - facts: [ - ["Type", "Istio Gateway API"], - ["Fronted by", "Cloudflare (LB)"], - ["Routes", "*.preview. → daemon"], - ], - }, - daemonctl: { - x: 710, - y: 852, - w: 158, - h: 60, - tier: "sbx", - label: "Daemon API", - tag: "protected · /_sandbox/*", - role: "Sandbox control API", - desc: "The in-pod daemon's protected control surface (Bearer DAEMON_TOKEN, port 9000): fs ops (read/write/edit/bash/grep), git (status/diff/publish), exec scripts, setup (clone→install→start), tasks, SSE events, harness dispatch. Reached over k8s port-forward. Called by the worker (agent fs/git/bash tools) and the API (UI setup + events). Relays org-fs config to the sidecar via /_sandbox/orgfs-config.", - facts: [ - ["Auth", "Bearer DAEMON_TOKEN"], - ["Port", "9000"], - ["Called by", "Worker + API"], - ["Ops", "fs · git · bash · setup"], - ], - }, - orgfsc: { - x: 900, - y: 852, - w: 132, - h: 56, - tier: "file", - label: "Org FS", - tag: "mount · sidecar", - role: "Org filesystem mount", - desc: "The org filesystem mounted into the cloud sandbox at /org/. A privileged SIDECAR container runs rclone (NFS/FUSE) against the daemon's loopback WebDAV; config is delivered post-bind via /_sandbox/orgfs-config (warm-pool claims reject spec.env). Backend: /api/:org/fs/* → S3.", - facts: [ - ["Mount", "rclone → WebDAV"], - ["Cluster", "privileged sidecar"], - ["Backend", "/api/:org/fs → S3"], - ], - }, - daemonprev: { - x: 1085, - y: 852, - w: 152, - h: 60, - tier: "pub", - label: "Preview", - tag: "public", - role: "Public dev-server preview", - desc: "The daemon's catch-all reverse-proxy serving the running dev server — the live app preview. Public by handle (the subdomain is the secret); /_sandbox/* is actively rejected here. Reached at .preview. through Cloudflare (LB) → the k8s Gateway (HTTPRoute) → the daemon. Injects HMR bootstrap.", - facts: [ - ["Auth", "none — handle = secret"], - ["Front", "CF → k8s Gateway"], - ["URL", "handle.preview."], - ], - }, - - localapi: { - x: 1300, - y: 340, - w: 158, - h: 62, - tier: "desk", - label: "local-api", - tag: "axum · embedded", - role: "Native control API", - desc: "Embedded in the Tauri app on one authenticated loopback origin. Proxies shared data and MCP traffic to Studio, but intercepts native-only thread, harness, sandbox, filesystem, Git, terminal, task, and preview routes locally.", - facts: [ - ["Origin", "authenticated loopback"], - ["Upstream", "Studio API"], - ["Owns", "native-only routes"], - ], - }, - nativecli: { - x: 1300, - y: 560, - w: 158, - h: 62, - tier: "desk", - label: "Native Harness", - tag: "pty · local cli", - role: "Desktop coding agent", - desc: "The user's Claude Code, Codex, or OpenCode CLI, launched by local-api in the thread's local worktree. Provider authentication stays on the machine; scoped MCP reaches Studio through the local API's upstream proxy.", - facts: [ - ["Harnesses", "Claude · Codex · OpenCode"], - ["Process", "interactive PTY"], - ["MCP", "local-api → Studio"], - ], - }, - dsbx: { - x: 1290, - y: 800, - w: 152, - h: 62, - tier: "sbx", - label: "Desktop Sandbox", - tag: "local-api", - role: "Desktop sandbox", - desc: "A SandboxManager-owned local worktree and setup runtime, one per handle. The native webview's lifecycle and filesystem calls terminate in local-api, which reports local-api; preview is served through .localhost:.", - facts: [ - ["Runs on", "laptop"], - ["Preview", "handle.localhost"], - ["Control", "local-api interception"], - ], - }, - orgfsd: { - x: 1460, - y: 800, - w: 140, - h: 56, - tier: "file", - label: "Org FS", - tag: "mount · daemon", - role: "Org filesystem mount", - desc: "The org filesystem mounted on the laptop at /org/. No sidecar — local-api resolves and maintains the mount directly. Backend: it calls Studio's /api/:org/fs/* routes (the same S3 store as the cloud sandbox).", - facts: [ - ["Mount", "rclone → WebDAV"], - ["Desktop", "local-api, no sidecar"], - ["Backend", "/api/:org/fs → S3"], - ], - }, -}; - -// from, to, kind -const EDGES: [string, string, string][] = [ - ["client", "cf", "req"], - ["cf", "nlb", "req"], - ["nlb", "web", "req"], - ["web", "api", "req"], - ["api", "mcpproxy", "ctrl"], - ["mcpproxy", "dmcp", "ctrl"], - ["worker", "dmcp", "inproc"], - ["api", "files", "ctrl"], - ["worker", "files", "ctrl"], - ["files", "s3", "ctrl"], - ["api", "worker", "ctrl"], - ["api", "db", "ctrl"], - ["worker", "db", "ctrl"], - ["api", "nats", "ctrl"], - ["worker", "nats", "ctrl"], - ["worker", "llm", "model"], - ["worker", "daemonctl", "ctrl"], - ["api", "daemonctl", "ctrl"], - ["cf", "gateway", "public"], - ["gateway", "daemonprev", "public"], - ["daemonctl", "orgfsc", "ctrl"], - ["orgfsc", "files", "ctrl"], - ["dsbx", "orgfsd", "ctrl"], - ["localapi", "api", "mcp"], - ["localapi", "nativecli", "ctrl"], - ["localapi", "dsbx", "ctrl"], - ["nativecli", "llm", "model"], - ["nativecli", "dsbx", "ctrl"], -]; - -const EDGE_STYLE: Record< - string, - { stroke: string; dash?: string; w: number; op: number } -> = { - req: { stroke: "#465268", w: 1.5, op: 0.55 }, - ctrl: { stroke: "#465268", w: 1.5, op: 0.5 }, - model: { stroke: TIER.llm, dash: "2 5", w: 1.4, op: 0.45 }, - bridge: { stroke: TIER.desk, dash: "7 5", w: 1.8, op: 0.7 }, - mcp: { stroke: "#52607a", dash: "3 6", w: 1.4, op: 0.4 }, - inproc: { stroke: TIER.mcp, dash: "2 4", w: 1.4, op: 0.5 }, - public: { stroke: TIER.pub, dash: "6 5", w: 1.5, op: 0.6 }, -}; - -// manual margin routes for long cross-diagram edges -const ROUTES: Record = { - "gateway>daemonprev": [ - { x: 300, y: 885 }, - { x: 300, y: 1002 }, - { x: 1085, y: 1002 }, - { x: 1085, y: 882 }, - ], - "localapi>api": [ - { x: 1300, y: 529 }, - { x: 1300, y: 128 }, - { x: 485, y: 128 }, - { x: 485, y: 328 }, - ], -}; - -// ordered traces for the interactive html (ignored by the static SVG) -const SCENARIOS = [ - { - id: "req", - label: "Request path", - color: TIER.web, - steps: [ - ["client", "cf"], - ["cf", "nlb"], - ["nlb", "web"], - ["web", "api"], - ["api", "db"], - ], - }, - { - id: "mcp", - label: "External MCP client", - color: TIER.mcp, - steps: [ - ["client", "cf"], - ["cf", "nlb"], - ["nlb", "web"], - ["web", "api"], - ["api", "mcpproxy"], - ["mcpproxy", "dmcp"], - ], - }, - { - id: "cloud", - label: "Cloud decopilot run", - color: TIER.worker, - steps: [ - ["web", "api"], - ["api", "worker"], - ["worker", "llm"], - ["worker", "dmcp"], - ["worker", "files"], - ["files", "s3"], - ["worker", "daemonctl"], - ["worker", "db"], - ["worker", "nats"], - ["nats", "api"], - ], - }, - { - id: "desktop", - label: "Native desktop run", - color: TIER.desk, - steps: [ - ["localapi", "nativecli"], - ["nativecli", "llm"], - ["nativecli", "dsbx"], - ["localapi", "api"], - ], - }, - { - id: "sandbox", - label: "Sandbox preview + control", - color: TIER.sbx, - steps: [ - ["client", "cf"], - ["cf", "gateway"], - ["gateway", "daemonprev"], - ["api", "daemonctl"], - ["worker", "daemonctl"], - ], - }, - { - id: "orgfs", - label: "Org filesystem mount", - color: TIER.file, - steps: [ - ["daemonctl", "orgfsc"], - ["orgfsc", "files"], - ["files", "s3"], - ["dsbx", "orgfsd"], - ], - }, -]; - -const LEGEND: [string, string][] = [ - ["edge", "Edge"], - ["web", "Web"], - ["api", "API"], - ["worker", "Worker"], - ["mcp", "MCP"], - ["file", "Files"], - ["db", "Postgres"], - ["nats", "NATS"], - ["sbx", "Sandbox"], - ["pub", "Preview"], - ["llm", "LLM"], - ["desk", "Desktop"], -]; - -// ---------- layout math ---------- -const NORMAL: Record = { - r: [1, 0], - l: [-1, 0], - t: [0, -1], - b: [0, 1], -}; -function sides(a: Node, b: Node): [string, string] { - const dx = b.x - a.x, - dy = b.y - a.y; - if (Math.abs(dx) >= Math.abs(dy)) return dx > 0 ? ["r", "l"] : ["l", "r"]; - return dy > 0 ? ["b", "t"] : ["t", "b"]; -} -function anchor(n: Node, side: string, f: number) { - const hw = n.w / 2, - hh = n.h / 2; - if (side === "r") return { x: n.x + hw, y: n.y - hh + f * n.h, n: NORMAL.r }; - if (side === "l") return { x: n.x - hw, y: n.y - hh + f * n.h, n: NORMAL.l }; - if (side === "t") return { x: n.x - hw + f * n.w, y: n.y - hh, n: NORMAL.t }; - return { x: n.x - hw + f * n.w, y: n.y + hh, n: NORMAL.b }; -} -function roundedPath(pts: { x: number; y: number }[], r = 16) { - let d = `M${pts[0].x},${pts[0].y}`; - for (let i = 1; i < pts.length - 1; i++) { - const p = pts[i], - a = pts[i - 1], - b = pts[i + 1]; - const v1 = { x: p.x - a.x, y: p.y - a.y }, - v2 = { x: b.x - p.x, y: b.y - p.y }; - const l1 = Math.hypot(v1.x, v1.y) || 1, - l2 = Math.hypot(v2.x, v2.y) || 1; - const rr = Math.min(r, l1 / 2, l2 / 2); - const s = { x: p.x - (v1.x / l1) * rr, y: p.y - (v1.y / l1) * rr }; - const e = { x: p.x + (v2.x / l2) * rr, y: p.y + (v2.y / l2) * rr }; - d += ` L${s.x.toFixed(1)},${s.y.toFixed(1)} Q${p.x},${p.y} ${e.x.toFixed(1)},${e.y.toFixed(1)}`; - } - const last = pts[pts.length - 1]; - d += ` L${last.x},${last.y}`; - return d; -} - -type EM = { - from: string; - to: string; - kind: string; - sa: string; - sb: string; - fa?: number; - fb?: number; - routed?: { x: number; y: number }[]; -}; - -function shapePath(n: Node): string | null { - if (n.shape === "cyl") { - const w = n.w, - h = n.h, - rx = w / 2, - ry = 10; - return `M${-rx},${-h / 2 + ry} a${rx},${ry} 0 0 1 ${w},0 v${h - 2 * ry} a${rx},${ry} 0 0 1 ${-w},0 Z`; - } - if (n.shape === "hex") { - const w = n.w / 2, - h = n.h / 2, - c = 18; - return `M${-w + c},${-h} H${w - c} L${w},0 L${w - c},${h} H${-w + c} L${-w},0 Z`; - } - return null; -} - -// Resolve all geometry from the data above. Returned objects are plain and -// JSON-serialisable so the generator can embed them straight into the html. -export function computeLayout() { - const edgeMeta: EM[] = []; - const buckets: Record = {}; - EDGES.forEach((e, i) => { - const routed = ROUTES[e[0] + ">" + e[1]]; - const [af, bf] = sides(NODES[e[0]], NODES[e[1]]); - edgeMeta.push({ from: e[0], to: e[1], kind: e[2], sa: af, sb: bf, routed }); - if (routed) return; - (buckets[e[0] + "|" + af] ||= []).push({ i, end: "a" }); - (buckets[e[1] + "|" + bf] ||= []).push({ i, end: "b" }); - }); - Object.entries(buckets).forEach(([key, list]) => { - const side = key.split("|")[1]; - list.sort((p, q) => { - const op = - p.end === "a" ? NODES[edgeMeta[p.i].to] : NODES[edgeMeta[p.i].from]; - const oq = - q.end === "a" ? NODES[edgeMeta[q.i].to] : NODES[edgeMeta[q.i].from]; - return side === "t" || side === "b" ? op.x - oq.x : op.y - oq.y; - }); - const n = list.length; - list.forEach((it, k) => { - const f = (k + 1) / (n + 1); - if (it.end === "a") edgeMeta[it.i].fa = f; - else edgeMeta[it.i].fb = f; - }); - }); - const pathFor = (m: EM) => { - if (m.routed) return roundedPath(m.routed); - const A = NODES[m.from], - B = NODES[m.to]; - const p1 = anchor(A, m.sa, m.fa ?? 0.5), - p2 = anchor(B, m.sb, m.fb ?? 0.5); - const dist = Math.hypot(p2.x - p1.x, p2.y - p1.y); - const k = Math.min(160, Math.max(48, dist * 0.4)); - const c1 = { x: p1.x + p1.n[0] * k, y: p1.y + p1.n[1] * k }; - const c2 = { x: p2.x + p2.n[0] * k, y: p2.y + p2.n[1] * k }; - return `M${p1.x.toFixed(1)},${p1.y.toFixed(1)} C${c1.x.toFixed(1)},${c1.y.toFixed(1)} ${c2.x.toFixed(1)},${c2.y.toFixed(1)} ${p2.x.toFixed(1)},${p2.y.toFixed(1)}`; - }; - - const edges = edgeMeta.map((m) => ({ - from: m.from, - to: m.to, - kind: m.kind, - d: pathFor(m), - ...EDGE_STYLE[m.kind], - })); - const nodes = Object.entries(NODES).map(([id, n]) => ({ - id, - x: n.x, - y: n.y, - w: n.w, - h: n.h, - tier: n.tier, - col: TIER[n.tier], - label: n.label, - tag: n.tag ?? null, - shape: shapePath(n), - replicas: !!n.replicas, - ext: !!n.ext, - role: n.role ?? "", - desc: n.desc ?? "", - facts: n.facts ?? [], - })); - return { - zones: ZONES, - subzones: SUBZONES, - nodes, - edges, - legend: LEGEND.map(([t, name]) => ({ name, col: TIER[t] })), - scenarios: SCENARIOS, - }; -} diff --git a/apps/docs/client/src/components/atoms/Button.tsx b/apps/docs/client/src/components/atoms/Button.tsx deleted file mode 100644 index acdefc47bb..0000000000 --- a/apps/docs/client/src/components/atoms/Button.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import type { HTMLAttributes, ReactNode } from "react"; - -type ButtonVariant = - | "default" - | "destructive" - | "outline" - | "secondary" - | "ghost" - | "link"; - -type ButtonSize = "default" | "sm" | "lg" | "icon"; - -interface ButtonProps extends HTMLAttributes { - variant?: ButtonVariant; - size?: ButtonSize; - asChild?: boolean; - children?: ReactNode; - disabled?: boolean; - type?: "button" | "submit" | "reset"; -} - -function getButtonClasses( - variant: ButtonVariant = "default", - size: ButtonSize = "default", -): string { - // Base classes - const baseClasses = - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-xl text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] cursor-pointer"; - - // Variant classes - const variantClasses = { - default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", - destructive: - "bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20", - outline: - "border text-foreground bg-background shadow-xs hover:bg-accent hover:text-accent-foreground border-border", - secondary: - "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80", - ghost: "hover:bg-accent hover:text-accent-foreground", - link: "text-primary underline-offset-4 hover:underline", - }; - - // Size classes - const sizeClasses = { - default: "h-10 px-4 py-2", - sm: "h-8 gap-1.5 px-3", - lg: "h-10 px-6", - icon: "size-10", - }; - - return `${baseClasses} ${variantClasses[variant]} ${sizeClasses[size]}`; -} - -export function Button({ - className = "", - variant = "default", - size = "default", - children, - disabled = false, - type = "button", - ...props -}: ButtonProps) { - const buttonClasses = getButtonClasses(variant, size); - - return ( - - ); -} diff --git a/apps/docs/client/src/components/atoms/Icon.tsx b/apps/docs/client/src/components/atoms/Icon.tsx deleted file mode 100644 index f6120c3549..0000000000 --- a/apps/docs/client/src/components/atoms/Icon.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import type { HTMLAttributes } from "react"; -import * as LucideIcons from "lucide-react"; -import React from "react"; - -export interface Props extends HTMLAttributes { - /** - * The name of the icon. - */ - name: string; - /** - * The size of the icon. - */ - size?: number; -} - -/** - * Uses Lucide React icons. - * For available icons, see: https://lucide.dev/icons - * Use the exact component name without "Icon" suffix (e.g., "MoveUpRight", "Folder", "FileText") - */ -export function Icon({ name, size = 16, style, className, ...props }: Props) { - // Use the name directly as the component name - const LucideIcon = LucideIcons[name as keyof typeof LucideIcons]; - - if (!LucideIcon) { - console.warn( - `Icon "${name}" not found in Lucide React. Available icons:`, - Object.keys(LucideIcons).slice(0, 10), - ); - return null; - } - - // Use proper typing for the Lucide component - const IconComponent = LucideIcon as React.ComponentType<{ - size?: number; - className?: string; - style?: React.CSSProperties; - }>; - - return React.createElement(IconComponent, { - size, - className, - style, - ...props, - }); -} diff --git a/apps/docs/client/src/components/atoms/Logo.tsx b/apps/docs/client/src/components/atoms/Logo.tsx deleted file mode 100644 index c18b68090c..0000000000 --- a/apps/docs/client/src/components/atoms/Logo.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { useEffect, useState } from "react"; -import decoLight from "../../../public/logos/deco-light.svg?url"; -import decoDark from "../../../public/logos/deco-dark.svg?url"; - -interface LogoProps { - className?: string; - width?: number; - height?: number; -} - -export function Logo({ className = "", width = 68, height = 28 }: LogoProps) { - const [isDark, setIsDark] = useState(false); - const [isClient, setIsClient] = useState(false); - - useEffect(() => { - setIsClient(true); - - const checkTheme = () => { - const _html = document.documentElement; - const savedTheme = localStorage.getItem("theme") || "auto"; - - let isDarkTheme = false; - - if (savedTheme === "auto") { - // Use system preference - isDarkTheme = globalThis.matchMedia( - "(prefers-color-scheme: dark)", - ).matches; - } else { - isDarkTheme = savedTheme === "dark"; - } - - setIsDark(isDarkTheme); - }; - - // Check initial theme - checkTheme(); - - // Watch for theme changes - const observer = new MutationObserver((mutations) => { - mutations.forEach((mutation) => { - if ( - mutation.type === "attributes" && - mutation.attributeName === "data-theme" - ) { - checkTheme(); - } - }); - }); - - observer.observe(document.documentElement, { - attributes: true, - attributeFilter: ["data-theme"], - }); - - // Listen for system theme changes - const mediaQuery = globalThis.matchMedia("(prefers-color-scheme: dark)"); - mediaQuery.addEventListener("change", checkTheme); - - return () => { - observer.disconnect(); - mediaQuery.removeEventListener("change", checkTheme); - }; - }, []); - - // Show light logo by default during SSR - if (!isClient) { - return ( -
- Deco -
- ); - } - - return ( -
- Deco -
- ); -} diff --git a/apps/docs/client/src/components/atoms/Select.tsx b/apps/docs/client/src/components/atoms/Select.tsx deleted file mode 100644 index a4e265f95c..0000000000 --- a/apps/docs/client/src/components/atoms/Select.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import type { SelectHTMLAttributes } from "react"; -import { Icon } from "./Icon"; - -interface SelectOption { - value: string; - label: string; - icon?: string; -} - -interface SelectProps - extends Omit, "children"> { - options: SelectOption[]; - placeholder?: string; - icon?: string; - className?: string; - selectClassName?: string; -} - -export function Select({ - options, - placeholder, - icon, - className = "", - selectClassName = "", - ...props -}: SelectProps) { - return ( -
-
- {icon && ( -
- -
- )} - -
- -
-
-
- ); -} diff --git a/apps/docs/client/src/components/markdown/Blockquote.astro b/apps/docs/client/src/components/markdown/Blockquote.astro deleted file mode 100644 index a361b00cce..0000000000 --- a/apps/docs/client/src/components/markdown/Blockquote.astro +++ /dev/null @@ -1,10 +0,0 @@ ---- -const props = Astro.props; ---- - -
- -
diff --git a/apps/docs/client/src/components/markdown/Code.astro b/apps/docs/client/src/components/markdown/Code.astro deleted file mode 100644 index 2259188e86..0000000000 --- a/apps/docs/client/src/components/markdown/Code.astro +++ /dev/null @@ -1,10 +0,0 @@ ---- -const props = Astro.props; ---- - - - - diff --git a/apps/docs/client/src/components/markdown/Img.astro b/apps/docs/client/src/components/markdown/Img.astro deleted file mode 100644 index 08890047d0..0000000000 --- a/apps/docs/client/src/components/markdown/Img.astro +++ /dev/null @@ -1,23 +0,0 @@ ---- -const props = Astro.props; -const { src, alt, title } = props; ---- - -
-
- {alt} - { - title && ( -
-

{title}

-
- ) - } -
-
diff --git a/apps/docs/client/src/components/markdown/Pre.astro b/apps/docs/client/src/components/markdown/Pre.astro deleted file mode 100644 index d21198ce8a..0000000000 --- a/apps/docs/client/src/components/markdown/Pre.astro +++ /dev/null @@ -1,5 +0,0 @@ ---- -const props = Astro.props; ---- - -
diff --git a/apps/docs/client/src/components/markdown/Table.astro b/apps/docs/client/src/components/markdown/Table.astro deleted file mode 100644 index be764fe34c..0000000000 --- a/apps/docs/client/src/components/markdown/Table.astro +++ /dev/null @@ -1,9 +0,0 @@ ---- -const props = Astro.props; ---- - -
- - -
-
diff --git a/apps/docs/client/src/components/markdown/Tbody.astro b/apps/docs/client/src/components/markdown/Tbody.astro deleted file mode 100644 index 41b4779a1e..0000000000 --- a/apps/docs/client/src/components/markdown/Tbody.astro +++ /dev/null @@ -1,7 +0,0 @@ ---- -const props = Astro.props; ---- - - - - diff --git a/apps/docs/client/src/components/markdown/Td.astro b/apps/docs/client/src/components/markdown/Td.astro deleted file mode 100644 index b9f5daa2f5..0000000000 --- a/apps/docs/client/src/components/markdown/Td.astro +++ /dev/null @@ -1,7 +0,0 @@ ---- -const props = Astro.props; ---- - - - - diff --git a/apps/docs/client/src/components/markdown/Th.astro b/apps/docs/client/src/components/markdown/Th.astro deleted file mode 100644 index 2d5295e60f..0000000000 --- a/apps/docs/client/src/components/markdown/Th.astro +++ /dev/null @@ -1,10 +0,0 @@ ---- -const props = Astro.props; ---- - - - - diff --git a/apps/docs/client/src/components/markdown/Thead.astro b/apps/docs/client/src/components/markdown/Thead.astro deleted file mode 100644 index 9c049bc05c..0000000000 --- a/apps/docs/client/src/components/markdown/Thead.astro +++ /dev/null @@ -1,7 +0,0 @@ ---- -const props = Astro.props; ---- - - - - diff --git a/apps/docs/client/src/components/markdown/Tr.astro b/apps/docs/client/src/components/markdown/Tr.astro deleted file mode 100644 index bb70d92c9c..0000000000 --- a/apps/docs/client/src/components/markdown/Tr.astro +++ /dev/null @@ -1,7 +0,0 @@ ---- -const props = Astro.props; ---- - - - - diff --git a/apps/docs/client/src/components/ui/Accordion.tsx b/apps/docs/client/src/components/ui/Accordion.tsx deleted file mode 100644 index 7b01311b39..0000000000 --- a/apps/docs/client/src/components/ui/Accordion.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import React, { useState } from "react"; -import { Icon } from "../atoms/Icon"; - -interface AccordionProps { - title: string; - children: React.ReactNode; - defaultOpen?: boolean; - icon?: string; -} - -export function Accordion({ - title, - children, - defaultOpen = false, - icon = "Bolt", -}: AccordionProps) { - const [isOpen, setIsOpen] = useState(defaultOpen); - - return ( -
- - {isOpen && ( -
-
{children}
-
- )} -
- ); -} diff --git a/apps/docs/client/src/components/ui/AccordionGroup.tsx b/apps/docs/client/src/components/ui/AccordionGroup.tsx deleted file mode 100644 index bf230c2758..0000000000 --- a/apps/docs/client/src/components/ui/AccordionGroup.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import React from "react"; - -interface AccordionGroupProps { - children: React.ReactNode; -} - -export function AccordionGroup({ children }: AccordionGroupProps) { - return ( -
- {children} -
- ); -} diff --git a/apps/docs/client/src/components/ui/BaseHead.astro b/apps/docs/client/src/components/ui/BaseHead.astro deleted file mode 100644 index 6cb8a779b6..0000000000 --- a/apps/docs/client/src/components/ui/BaseHead.astro +++ /dev/null @@ -1,19 +0,0 @@ ---- -import { siteConfig } from "../../config/site"; -const { title, description } = Astro.props; -const formattedTitle = title ? `${title} - Deco CMS` : "Deco CMS"; -const metaDescription = description || siteConfig.description; -const ogImage = siteConfig.ogImage; ---- - -{formattedTitle} - - - - - - - - - - \ No newline at end of file diff --git a/apps/docs/client/src/components/ui/Callout.astro b/apps/docs/client/src/components/ui/Callout.astro deleted file mode 100644 index 06599b2c45..0000000000 --- a/apps/docs/client/src/components/ui/Callout.astro +++ /dev/null @@ -1,62 +0,0 @@ ---- -import { Icon } from "../atoms/Icon"; - -interface Props { - type?: "info" | "warning" | "error" | "success" | "tip" | "note"; -} - -const { type = "info" } = Astro.props; - -const calloutConfig = { - info: { - icon: "Info", - bgColor: "bg-[var(--callout-info-bg)]", - borderColor: "border-[var(--callout-info-border)]", - textColor: "text-[var(--callout-info-text)]", - }, - warning: { - icon: "AlertTriangle", - bgColor: "bg-[var(--callout-warning-bg)]", - borderColor: "border-[var(--callout-warning-border)]", - textColor: "text-[var(--callout-warning-text)]", - }, - error: { - icon: "AlertCircle", - bgColor: "bg-[var(--callout-error-bg)]", - borderColor: "border-[var(--callout-error-border)]", - textColor: "text-[var(--callout-error-text)]", - }, - success: { - icon: "Check", - bgColor: "bg-[var(--callout-success-bg)]", - borderColor: "border-[var(--callout-success-border)]", - textColor: "text-[var(--callout-success-text)]", - }, - tip: { - icon: "Lightbulb", - bgColor: "bg-[var(--callout-tip-bg)]", - borderColor: "border-[var(--callout-tip-border)]", - textColor: "text-[var(--callout-tip-text)]", - }, - note: { - icon: "Info", - bgColor: "bg-[var(--callout-note-bg)]", - borderColor: "border-[var(--callout-note-border)]", - textColor: "text-[var(--callout-note-text)]", - }, -}; - -const config = calloutConfig[type]; ---- - -
-
- -
- -
-
-
- diff --git a/apps/docs/client/src/components/ui/Card.astro b/apps/docs/client/src/components/ui/Card.astro deleted file mode 100644 index 0e525dcd27..0000000000 --- a/apps/docs/client/src/components/ui/Card.astro +++ /dev/null @@ -1,57 +0,0 @@ ---- -import { Icon } from "../atoms/Icon"; - -interface Props { - title: string; - description?: string; - icon?: string; - layout?: "horizontal" | "vertical"; - action?: { - label: string; - href: string; - }; -} - -const { - title, - description, - icon = "Info", - layout = "horizontal", - action, -} = Astro.props; ---- - -
-
- - -
-
- {title} - { - description && ( -

{description}

- ) - } -
- - -
- - { - action && ( - - ) - } -
-
diff --git a/apps/docs/client/src/components/ui/Footer.astro b/apps/docs/client/src/components/ui/Footer.astro deleted file mode 100644 index 27a0f90e71..0000000000 --- a/apps/docs/client/src/components/ui/Footer.astro +++ /dev/null @@ -1,6 +0,0 @@ ---- ---- - -
-

Footer

-
\ No newline at end of file diff --git a/apps/docs/client/src/components/ui/LanguageSelector.tsx b/apps/docs/client/src/components/ui/LanguageSelector.tsx deleted file mode 100644 index 553fa592db..0000000000 --- a/apps/docs/client/src/components/ui/LanguageSelector.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import React from "react"; -import { navigate } from "astro:transitions/client"; -import { Icon } from "../atoms/Icon"; -import { Select } from "../atoms/Select"; - -interface LanguageSelectorProps { - locale: string; - className?: string; - compact?: boolean; - disabled?: boolean; -} - -export function LanguageSelector({ - locale, - className, - compact, - disabled, -}: LanguageSelectorProps) { - const languageOptions = compact - ? [ - { value: "en", label: "EN" }, - { value: "pt-br", label: "PT" }, - ] - : [ - { value: "en", label: "English" }, - { value: "pt-br", label: "Português" }, - ]; - - const handleChange = (event: React.ChangeEvent) => { - if (disabled) return; - const newLocale = event.target.value; - // Path is /{version}/{locale}/{...slug} - replace only the locale segment - const currentPath = globalThis.location.pathname; - const newPath = currentPath.replace(/^(\/[^/]+)\/[^/]+/, `$1/${newLocale}`); - navigate(newPath); - }; - - if (compact) { - return ( -
- -
- -
-
- ); - } - - return ( - - - - - - {status &&

{status}

} - - ); -} -``` - -**Benefícios principais:** -- **Type safety** - TypeScript conhece todas as assinaturas de tools -- **Sem camada de API** - Chamadas de função diretas -- **Auto-complete** - IDE sugere tools disponíveis - -Execute `npm run gen:self` após adicionar tools para atualizar tipos. - -## Adicionando Rotas - -TanStack Router provê roteamento type-safe. Para adicionar uma nova página: - -1. Crie `/view/src/routes/minha-pagina.tsx`: -```tsx -import { createRoute } from "@tanstack/react-router"; -import { rootRoute } from "../main"; - -export const minhaPaginaRoute = createRoute({ - getParentRoute: () => rootRoute, - path: "/minha-pagina", - component: MinhaPagina, -}); - -function MinhaPagina() { - return
Conteúdo da Minha Página
; -} -``` - -2. Registre em `/view/src/main.tsx`: -```tsx -import { minhaPaginaRoute } from "./routes/minha-pagina"; - -const routeTree = rootRoute.addChildren([ - indexRoute, - minhaPaginaRoute, // Adicione sua rota -]); -``` - -3. Navegue usando `Link`: -```tsx -import { Link } from "@tanstack/react-router"; - -Ir para Minha Página -``` - -## Estilização com Tailwind - -Tailwind v4 está configurado por padrão. Use classes utilitárias: - -```tsx -
-

Título

-

Texto de descrição

- -
-``` - -Use `src/components/ui/` para componentes reutilizáveis (botões, formulários, etc.). Você pode integrar qualquer sistema de design ou biblioteca de componentes React conforme necessário. - -## Tokens de Tema - -Views herdam automaticamente o tema do seu workspace através de propriedades CSS customizadas. Em vez de codificar cores fixas, use tokens de tema para branding consistente: - -**Tokens principais:** -```css ---background /* Fundo da página */ ---foreground /* Cor de texto principal */ ---card /* Fundos de cards/painéis */ ---primary /* Cor primária da marca (CTAs) */ ---destructive /* Estados de exclusão/erro */ ---success /* Estados de sucesso/confirmação */ ---warning /* Estados de aviso/cautela */ ---border /* Bordas e divisores */ ---radius /* Raio de borda */ -``` - -**Exemplo de uso:** -```tsx - - -
- Conteúdo do card -
-``` - -**Tokens semânticos para estados:** -```tsx -{/* Estado de sucesso */} - - Ativo - - -{/* Estado de aviso */} - - Pendente - - -{/* Estado destrutivo */} - -``` - -**Por que usar tokens de tema?** -- Views automaticamente combinam com o branding do workspace -- Mudanças de tema não requerem atualizações de código -- Sistema de design consistente entre todas as views -- Significado semântico (primário vs destrutivo) integrado - -## Workflow de Desenvolvimento - -**Hot reload para frontend:** -```bash -npm run dev -``` - -Edite componentes React → atualização instantânea no navegador (sem necessidade de refresh). - -**Mudanças no backend:** -Edite tools/workflows → Worker reinicia → atualize a página para ver mudanças. - -**Atualizações de tipos:** -Após adicionar/modificar tools: -```bash -npm run gen:self -``` - -Seu `client` é atualizado com novos métodos e tipos. - - - **TypeScript previne erros:** Se você chamar um tool que não existe, o compilador captura antes do runtime. - - -## Padrões Comuns - -**Estados de loading:** -```tsx -const [loading, setLoading] = useState(false); - -const handleAction = async () => { - setLoading(true); - try { - await client.tools.MY_TOOL(data); - } finally { - setLoading(false); - } -}; -``` - -**Tratamento de erros:** -```tsx -try { - await client.tools.MY_TOOL(data); -} catch (error) { - console.error("Tool falhou:", error); - setError(error.message); -} -``` - -**Atualizações otimistas:** -```tsx -// Atualize UI imediatamente -setItems([...items, newItem]); - -// Sincronize com backend -client.tools.ITEM_CREATE(newItem) - .catch(() => { - // Reverta se falhar - setItems(items); - }); -``` - -## Gerenciamento de Estado - -Para apps simples, `useState` e `useEffect` do React são suficientes. Para necessidades de estado complexas, você pode adicionar: - -- **React Context** - Integrado, bom para estado global simples -- **Zustand** - Biblioteca leve de gerenciamento de estado -- **React Query** - Para estado do servidor e cache - -Como o cliente RPC retorna promises, você pode usar React Query para cache e refetch automáticos: - -```tsx -import { useQuery } from "@tanstack/react-query"; - -const { data, isLoading } = useQuery({ - queryKey: ["customers"], - queryFn: () => client.tools.CUSTOMERS_LIST(), -}); - -// Exibir lista de clientes com nível de fidelidade e total de pedidos -if (isLoading) return
Carregando clientes...
; - -return ( -
- {data?.customers.map(customer => ( -
-

{customer.name}

-

Fidelidade: {customer.loyaltyTier}

-

Total de Pedidos: {customer.totalOrders}

-
- ))} -
-); -``` - - - O template não inclui gerenciamento de estado global por padrão. Adicione apenas se seu app precisar. - - -**Lembre-se:** Views e tools compartilham os mesmos tipos. Sem contratos de API, sem código de integração, apenas TypeScript. diff --git a/apps/docs/client/src/content/deco-studio/pt-br/full-code-guides/deployment.mdx b/apps/docs/client/src/content/deco-studio/pt-br/full-code-guides/deployment.mdx deleted file mode 100644 index 5e504c4361..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/full-code-guides/deployment.mdx +++ /dev/null @@ -1,95 +0,0 @@ ---- -title: Deployment -description: Compile e implante seu MCP App -icon: Rocket ---- -import Callout from "../../../../components/ui/Callout.astro"; - -## Build - -```bash -bun run build -``` - -Isso executa duas etapas: - -1. **`build:web`** — o Vite compila o app React em um bundle HTML de arquivo único (`dist/client/index.html`) -2. **`build:server`** — o Bun empacota `api/main.ts` em `dist/server/main.js` (minificado, pronto para produção) - -## Configuração do `app.json` - -Atualize o `app.json` com os detalhes do seu app antes de publicar: - -```json -{ - "scopeName": "your-org", - "name": "your-app", - "friendlyName": "Your App Name", - "description": "What your app does.", - "connection": { - "type": "HTTP", - "url": "https://your-app.deco.site/api/mcp", - "configSchema": { - "type": "object", - "properties": {}, - "required": [] - } - } -} -``` - -- **`scopeName`** + **`name`** — identificador único na plataforma deco -- **`connection.url`** — seu endpoint MCP implantado (deve terminar com `/api/mcp`) -- **`configSchema`** — JSON Schema para as opções de configuração mostradas a quem instala seu app - -## Publicando no Deco Studio - -1. Atualize o `app.json` com o nome, a descrição e a URL de conexão implantada do seu app -2. Faça push para o seu repositório -3. Siga as instruções de publicação da plataforma deco para disponibilizar seu app - -## CI/CD - -### GitHub Actions - -O template inclui um workflow de CI (`.github/workflows/ci.yml`): - -```yaml -name: CI - -on: [push, pull_request] - -jobs: - ci: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - uses: oven-sh/setup-bun@v2 - with: - bun-version: latest - - - name: Cache Bun dependencies - uses: actions/cache@v4 - with: - path: ~/.bun/install/cache - key: ${{ runner.os }}-bun-${{ hashFiles('bun.lock') }} - restore-keys: ${{ runner.os }}-bun- - - - run: bun install --frozen-lockfile - - run: bun run ci:check - - run: bun run check - - run: bun run build -``` - -Isso roda em todo push e pull request: -- **`bun run ci:check`** — lint e checagem de formatação com Biome -- **`bun run check`** — checagem de tipos do TypeScript -- **`bun run build`** — build de produção completo - -## Testando Após o Deploy - -1. Acesse [admin.decocms.com](https://admin.decocms.com) -2. Adicione a URL implantada + `/api/mcp` como uma integração customizada -3. Teste as invocações de tools -4. Verifique se as UIs do MCP App renderizam corretamente no client diff --git a/apps/docs/client/src/content/deco-studio/pt-br/full-code-guides/project-structure.mdx b/apps/docs/client/src/content/deco-studio/pt-br/full-code-guides/project-structure.mdx deleted file mode 100644 index aff97856c8..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/full-code-guides/project-structure.mdx +++ /dev/null @@ -1,203 +0,0 @@ ---- -title: Estrutura do Projeto -description: Entenda a arquitetura TypeScript full-stack dos MCP Apps na deco -icon: Folder ---- -import Callout from "../../../../components/ui/Callout.astro"; - -## Estrutura de Diretórios - -``` -├── api/ # Servidor MCP (Bun) -│ ├── main.ts # Ponto de entrada do servidor com middleware -│ ├── tools/ -│ │ ├── index.ts # Registro de tools -│ │ └── hello.ts # Tool de exemplo (hello_world) -│ ├── resources/ -│ │ └── hello.ts # Resource de MCP App (serve HTML) -│ └── types/ -│ └── env.ts # StateSchema + tipo Env -├── web/ # UI React (MCP App) -│ ├── app.tsx # Ponto de entrada do React -│ ├── context.tsx # Gerenciamento de estado do MCP -│ ├── router.tsx # TanStack Router (baseado em hash) -│ ├── types.ts # Tipos McpState, McpStatus -│ ├── tools/ # Uma pasta por UI de tool -│ │ └── hello/ -│ │ └── index.tsx # UI do tool hello_world -│ ├── components/ui/ # Componentes shadcn/ui -│ ├── lib/utils.ts # Helper cn() -│ └── globals.css # Estilos base do Tailwind -├── index.html # HTML de entrada do Vite -├── package.json -├── tsconfig.json -├── biome.json -├── vite.config.ts # Vite + React Compiler + singlefile -├── components.json # Configuração shadcn/ui -├── app.json # Configuração da plataforma deco -└── .mcp.json # Config local do servidor MCP -``` - -## Backend (`api/`) - -### `main.ts` - -O ponto de entrada do servidor configura o runtime MCP e inicia um servidor HTTP Bun: - -```typescript -import { withRuntime } from "@decocms/runtime"; -import { helloAppResource } from "./resources/hello.ts"; -import { tools } from "./tools/index.ts"; -import { type Env, StateSchema } from "./types/env.ts"; - -const runtime = withRuntime({ - configuration: { - state: StateSchema, - }, - tools, - resources: [helloAppResource], -}); - -Bun.serve({ - port: 3001, - fetch: withLogging(withMcpApiRoute(runtime.fetch)), -}); -``` - -Principais partes: -- **`withRuntime()`** — cria o servidor MCP a partir de tools, resources e configuração -- **`withMcpApiRoute()`** — reescreve `/api/mcp` para `/mcp` para que o endpoint MCP fique em um path de API limpo -- **`withLogging()`** — middleware de log colorido de request/response -- **`Bun.serve()`** — inicia o servidor HTTP - -### `tools/` - -Definições de tools organizadas por domínio. Cada arquivo exporta uma função criadora de tool que recebe o environment. - -- `tools/index.ts` exporta o array `tools` — todas as tool creators registradas aqui -- Veja [Construindo Tools](/pt-br/full-code-guides/building-tools) para detalhes - -### `resources/` - -Resources de MCP App que servem bundles HTML de arquivo único como UIs ricas para resultados de tools. - -- Cada resource mapeia uma URI (ex: `ui://mcp-app/hello`) para o arquivo HTML buildado -- Veja [Resources](/pt-br/full-code-guides/resources) para detalhes - -### `types/` - -```typescript -import type { DefaultEnv } from "@decocms/runtime"; -import { z } from "zod"; - -export const StateSchema = z.object({}); - -export type Env = DefaultEnv; -``` - -- **`StateSchema`** — schema Zod que define a configuração do seu app (mostrada a quem instala) -- **`Env`** — environment tipado que estende `DefaultEnv`, disponível nos handlers de tools - -## Frontend (`web/`) - -### Ponto de entrada (`web/app.tsx`) - -```typescript -import { StrictMode } from "react"; -import { createRoot } from "react-dom/client"; -import { McpProvider } from "./context.tsx"; -import { AppRouter } from "./router.tsx"; - -createRoot(document.getElementById("root")!).render( - - - - - , -); -``` - -O app envolve tudo em `McpProvider` (conecta ao host MCP) e `AppRouter` (roteia para a UI de tool correta). - -### Contexto MCP (`web/context.tsx`) - -Gerencia a conexão com o host MCP usando `@modelcontextprotocol/ext-apps`: - -- **`McpProvider`** — conecta via `useApp()`, trata eventos (`ontoolinput`, `ontoolresult`, `ontoolcancelled`, `onerror`, `onhostcontextchanged`), aplica estilos do host -- **`useMcpState()`** — acessa o estado MCP atual (status, input/result do tool) -- **`useMcpApp()`** — acessa a instância do MCP App (ex: para `app.sendMessage()`) -- **`useMcpHostContext()`** — acessa o contexto do host (safe area insets, informações do tool) - -### Router (`web/router.tsx`) - -Usa TanStack Router com histórico baseado em hash: - -```typescript -const TOOL_PAGES: Record = { - hello_world: HelloPage, -}; -``` - -O componente `ToolRouter` lê `toolName` do estado MCP e renderiza o componente de página correspondente. `RootLayout` aplica os safe area insets do contexto do host. - -### UIs de tools (`web/tools//`) - -A UI de cada tool vive em sua própria pasta. O componente usa `useMcpState()` para tratar todos os estados do ciclo de vida: `initializing`, `connected`, `tool-input`, `tool-result`, `tool-cancelled` e `error`. - -### Build system - -- **Vite** com `vite-plugin-singlefile` — builda em um único `dist/client/index.html` -- **React 19** com React Compiler (`babel-plugin-react-compiler`) -- Todo o CSS e JS são inlineados em um único HTML para servir como resource de MCP App - -## Configuração - -### `app.json` - -```json -{ - "scopeName": "deco", - "name": "mcp-app", - "friendlyName": "MCP App Template", - "description": "Starter template for building MCP Apps on deco.", - "connection": { - "type": "HTTP", - "url": "https://your-app.deco.site/api/mcp", - "configSchema": { - "type": "object", - "properties": {}, - "required": [] - } - } -} -``` - -- **`scopeName`** + **`name`** — identificador único do seu app na plataforma deco -- **`friendlyName`** — nome de exibição mostrado aos usuários -- **`connection.url`** — seu endpoint MCP implantado -- **`configSchema`** — JSON Schema que define as opções de configuração mostradas a quem instala - -### `.mcp.json` - -Config local do servidor MCP para testar com editores: - -```json -{ - "mcpServers": { - "mcp-app": { - "type": "sse", - "url": "http://localhost:3001/mcp" - } - } -} -``` - -## Fluxo de Desenvolvimento - -1. Crie um tool em `api/tools/my-tool.ts` -2. Registre-o em `api/tools/index.ts` -3. Crie um componente de UI em `web/tools/my-tool/index.tsx` -4. Registre a página em `web/router.tsx` (map `TOOL_PAGES`) -5. Crie um resource em `api/resources/my-tool.ts` -6. Registre o resource em `api/main.ts` (array `resources`) -7. Rode `bun run dev` e teste diff --git a/apps/docs/client/src/content/deco-studio/pt-br/full-code-guides/resources.mdx b/apps/docs/client/src/content/deco-studio/pt-br/full-code-guides/resources.mdx deleted file mode 100644 index e01de03d47..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/full-code-guides/resources.mdx +++ /dev/null @@ -1,474 +0,0 @@ ---- -title: Resources -description: Crie resources tipados e versionados com sincronização em tempo real -icon: Database ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -deconfig é o sistema de arquivos versionado tipo-git do deco CMS para armazenar resources. Este guia mostra como definir tipos customizados de resources com operações CRUD completas e sincronização em tempo real. - -**Casos de uso:** -- Configurações de tema -- Preferências de usuário -- Dados de configuração -- Feature flags -- Qualquer dado tipado que precise de versionamento e atualizações em tempo real - -## Como Funciona - -Defina um schema de resource → Tools CRUD auto-gerados → Cliente frontend type-safe → Atualizações SSE em tempo real - -Resources são: -- **Tipados** com schemas Zod -- **Versionados** no deconfig (armazenamento tipo-git) -- **Referenciáveis** via URIs `rsc://` -- **Tempo real** com Server-Sent Events - ---- - -## Definir um Resource - -Crie um schema em `server/tools/`: - -```typescript -import { DeconfigResource } from "@decocms/runtime/deconfig"; -import { z } from "zod"; - -const ThemeSettings = DeconfigResource.define({ - resourceName: "theme_settings", - dataSchema: z.object({ - name: z.string().min(1), - primaryColor: z.string().regex(/^#[0-9A-Fa-f]{6}$/), - secondaryColor: z.string().regex(/^#[0-9A-Fa-f]{6}$/), - textColor: z.string().regex(/^#[0-9A-Fa-f]{6}$/), - }), -}); - -// Registre no seu array de tools -export const tools = [ - (env: Env) => ThemeSettings.create(env), - // ... outros tools -]; - -export { ThemeSettings }; -``` - -Isso gera 6 tools CRUD automaticamente: - -| Tool | Propósito | -|------|-----------| -| `CREATE` | Criar novo resource com dados | -| `READ` | Obter resource por URI | -| `UPDATE` | Atualizar resource (merge parcial) | -| `DELETE` | Deletar resource por URI | -| `SEARCH` | Listar/filtrar resources com paginação | -| `DESCRIBE` | Obter metadados e endpoint SSE | - -### URIs de Resource - -Resources são identificados por URIs no formato: `rsc://app-id/theme_settings/resource-id` - -O `resource-id` pode ser auto-gerado ou você pode especificá-lo no CREATE: - -```typescript -await client.tools.DECO_RESOURCE_THEME_SETTINGS_CREATE({ - resourceId: "tema-escuro", // Opcional: especifique ID - data: { /* ... */ } -}); -``` - -## Usar no Frontend - -Após executar `npm run gen:self`, use o cliente gerado: - -### Operações Básicas - -```typescript -import { client } from "./lib/rpc"; - -// Criar -const theme = await client.tools.DECO_RESOURCE_THEME_SETTINGS_CREATE({ - data: { - name: "Tema Escuro", - primaryColor: "#1a1a1a", - secondaryColor: "#2d2d2d", - textColor: "#ffffff", - } -}); - -// Ler -const theme = await client.tools.DECO_RESOURCE_THEME_SETTINGS_READ({ - uri: "rsc://meu-app/theme_settings/tema-escuro" -}); - -// Atualizar (atualização parcial - faz merge com existente) -await client.tools.DECO_RESOURCE_THEME_SETTINGS_UPDATE({ - uri: "rsc://meu-app/theme_settings/tema-escuro", - data: { primaryColor: "#000000" } -}); - -// Deletar -await client.tools.DECO_RESOURCE_THEME_SETTINGS_DELETE({ - uri: "rsc://meu-app/theme_settings/tema-escuro" -}); - -// Buscar com filtragem e paginação -const results = await client.tools.DECO_RESOURCE_THEME_SETTINGS_SEARCH({ - term: "escuro", // Busca em name, description, resourceId - page: 1, // Número da página (começa em 1) - pageSize: 10, // Itens por página (use Infinity para todos) - sortBy: "name", // Ordenar por: "name", "resourceId", "mtime" - sortOrder: "asc", // "asc" ou "desc" - filters: { // Filtros opcionais - created_by: "user-id", - updated_by: ["user-1", "user-2"], - }, -}); - -// Estrutura do resultado -// { -// items: Resource[], -// total: number, -// page: number, -// pageSize: number -// } -``` - - - **Rastreamento de metadados:** Resources automaticamente rastreiam `created_by`, `updated_by`, `created_at` e `updated_at`. - - -### Atualizações em Tempo Real com SSE - -Inscreva-se em mudanças de resources via Server-Sent Events: - -```typescript -import { useEffect } from "react"; -import { useQueryClient } from "@tanstack/react-query"; -import { client } from "./lib/rpc"; - -function useThemeSync() { - const queryClient = useQueryClient(); - - useEffect(() => { - let eventSource: EventSource; - - const setup = async () => { - // Obter endpoint SSE - const desc = await client.tools.DECO_RESOURCE_THEME_SETTINGS_DESCRIBE({}); - const watchUrl = desc.features?.watch?.pathname; - - if (!watchUrl) return; - - // Conectar ao stream SSE (observar todos theme_settings resources) - const uri = desc.uriTemplate; // rsc://app/theme_settings/* - eventSource = new EventSource(`${watchUrl}?uri=${encodeURIComponent(uri)}`); - - eventSource.onmessage = (event) => { - const update = JSON.parse(event.data); - // Invalidar queries para acionar refetch - queryClient.invalidateQueries({ queryKey: ["themes"] }); - }; - - eventSource.onerror = (error) => { - console.error("Erro de conexão SSE:", error); - eventSource.close(); - // Implemente lógica de reconexão se necessário - }; - }; - - setup(); - - return () => { - eventSource?.close(); - }; - }, [queryClient]); -} -``` - -**Como funciona:** -1. Chame `DESCRIBE` para obter endpoint SSE -2. Conecte EventSource ao watch URL com padrão URI -3. Receba eventos quando resources mudarem -4. Atualize UI invalidando cache do React Query - -Mudanças se propagam instantaneamente para todos os clientes conectados. - -### Exemplo Completo - -Combine CRUD + sincronização em tempo real: - -```typescript -import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; -import { useEffect } from 'react'; -import { client } from './your-client'; - -export function useThemeSettings() { - const queryClient = useQueryClient(); - - // Buscar todos os temas - const { data: themes, isLoading } = useQuery({ - queryKey: ["themes"], - queryFn: async () => { - const result = await client.DECO_RESOURCE_THEME_SETTINGS_SEARCH({ - pageSize: Infinity, - }); - return result.items; - }, - }); - - // Criar mutation - const createTheme = useMutation({ - mutationFn: async (data: ThemeData) => { - return client.DECO_RESOURCE_THEME_SETTINGS_CREATE({ data }); - }, - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ["themes"] }); - }, - }); - - // Atualizar mutation - const updateTheme = useMutation({ - mutationFn: async ({ uri, data }: { uri: string; data: Partial }) => { - return client.DECO_RESOURCE_THEME_SETTINGS_UPDATE({ uri, data }); - }, - onSuccess: () => { - queryClient.invalidateQueries({ queryKey: ["themes"] }); - }, - }); - - // Inscrição SSE em tempo real - useEffect(() => { - let eventSource: EventSource | null = null; - - const setupSSE = async () => { - try { - const description = await client.DECO_RESOURCE_THEME_SETTINGS_DESCRIBE({}); - const watchPathname = description.features?.watch?.pathname; - const uriTemplate = description.uriTemplate; - - if (watchPathname) { - const watchUrl = `${watchPathname}?uri=${encodeURIComponent(uriTemplate)}`; - eventSource = new EventSource(watchUrl); - - eventSource.onmessage = (event) => { - const update = JSON.parse(event.data); - if (update.uri) { - queryClient.invalidateQueries({ queryKey: ["themes"] }); - } - }; - } - } catch (error) { - console.error("Falha ao configurar SSE:", error); - } - }; - - setupSSE(); - - return () => { - eventSource?.close(); - }; - }, [queryClient]); - - return { - themes, - isLoading, - createTheme: createTheme.mutate, - updateTheme: updateTheme.mutate, - }; -} -``` - -## Melhores Práticas de Schema - -Projete resources com busca em mente: - -```typescript -const MyResource = DeconfigResource.define({ - resourceName: "my_resource", - dataSchema: z.object({ - name: z.string().min(1).describe("Nome de exibição"), - description: z.string().describe("Descrição do resource"), - // ^ Estes campos são buscáveis por padrão - - // Seus campos customizados - apiKey: z.string().describe("Chave da API"), - environment: z.enum(["dev", "prod"]).describe("Ambiente"), - isActive: z.boolean().default(true), - }), -}); -``` - -**Dicas:** -- Inclua `name` e `description` para melhor busca -- Use `.describe()` para documentação -- Defina padrões sensatos com `.default()` -- Valide formatos estritamente (cores hex, emails, URLs). - -## Opções Avançadas - -### Validação Customizada - -Adicione validação de lógica de negócio além de verificações de schema: - -```typescript -const UserSettings = DeconfigResource.define({ - resourceName: "user_settings", - dataSchema: z.object({ - username: z.string(), - email: z.string().email(), - }), - validate: async (data) => { - const exists = await checkUsernameExists(data.username); - if (exists) { - throw new Error("Nome de usuário já existe"); - } - }, -}); -``` - -### Caminho de Armazenamento Customizado - -```typescript -const PrivateSettings = DeconfigResource.define({ - resourceName: "private_settings", - dataSchema: /* ... */, - directory: "/private/user_settings", -}); -``` - -### Observar Resource Específico - -```typescript -// Observar um resource específico em vez de todos -const uri = "rsc://meu-app/theme_settings/tema-escuro"; -const watchUrl = `${watchPathname}?uri=${encodeURIComponent(uri)}`; -``` - -### Aprimoramentos de Descrição de Tool - -Customize descrições de tools gerados: - -```typescript -const MyResource = DeconfigResource.define({ - resourceName: "my_resource", - dataSchema: /* ... */, - enhancements: { - DECO_RESOURCE_MY_RESOURCE_SEARCH: { - description: "Buscar meus resources com filtros customizados", - }, - }, -}); -``` - -### Sinalização de Dados Externos - -Use resources deconfig como sinais para acionar refetches de dados externos (Airtable, Google Sheets, APIs): - -**Padrão:** -1. Crie resource de sinal mínimo com timestamp `lastUpdated` -2. Atualize sinal quando dados externos mudarem -3. Frontend observa sinal via SSE, refaz fetch de dados externos em mudanças - -**Exemplo:** -```typescript -// Backend: Resource de sinal -const ExternalSync = DeconfigResource.define({ - resourceName: "external_sync", - dataSchema: z.object({ - source: z.string(), - lastUpdated: z.string().datetime(), - }), -}); - -// Backend: Atualizar sinal após mudança externa -await client.tools.DECO_RESOURCE_EXTERNAL_SYNC_UPDATE({ - uri: "rsc://app/external_sync/airtable-data", - data: { source: "airtable", lastUpdated: new Date().toISOString() } -}); - -// Frontend: Observar sinal e refazer fetch -useEffect(() => { - // Observar external_sync resource - // Na mudança → refazer fetch do Airtable/API externa -}, []); -``` - -## Tratamento de Erros - -Trate erros de operações de resource: - -```typescript -try { - const theme = await client.tools.DECO_RESOURCE_THEME_SETTINGS_READ({ - uri: "rsc://app/theme_settings/faltando" - }); -} catch (error) { - if (error.message.includes("not found")) { - // Resource não existe - } else if (error.message.includes("validation")) { - // Validação de schema falhou - } else { - // Outros erros - } -} -``` - -**Erros comuns:** -- `NotFoundError`: URI de resource não existe -- `ValidationError`: Dados não correspondem ao schema -- `ConflictError`: Resource com ID já existe (no CREATE) - -## Dicas de Performance - -**Paginação:** -```typescript -// Ruim: Carregar tudo -pageSize: Infinity - -// Bom: Paginar datasets grandes -pageSize: 20, page: currentPage -``` - -**Stale time do React Query:** -```typescript -useQuery({ - queryKey: ["themes"], - queryFn: fetchThemes, - staleTime: 5 * 60 * 1000, // Cache por 5 minutos -}); -``` - -**Debounce de atualizações:** -```typescript -const debouncedUpdate = debounce( - (data) => client.tools.DECO_RESOURCE_THEME_SETTINGS_UPDATE({ uri, data }), - 500 -); -``` - -## Referência de Configuração - -Todas as opções disponíveis em `DeconfigResource.define()`: - -```typescript -DeconfigResource.define({ - // Obrigatório - resourceName: string, // Tipo de resource (snake_case) - dataSchema: ZodSchema, // Schema Zod para validação - - // Opcional - directory?: string, // Caminho de armazenamento customizado - validate?: async (data) => void, // Lógica de validação customizada - enhancements?: { // Descrições de tools customizadas - DECO_RESOURCE_NAME_OPERATION: { - description: string, - }, - }, -}) -``` - -**Retorna:** -- `create(env)`: Função para registrar tools de resource -- Tools CRUD gerados com interfaces tipadas diff --git a/apps/docs/client/src/content/deco-studio/pt-br/no-code-guides/creating-agents.mdx b/apps/docs/client/src/content/deco-studio/pt-br/no-code-guides/creating-agents.mdx deleted file mode 100644 index 924820fc4e..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/no-code-guides/creating-agents.mdx +++ /dev/null @@ -1,346 +0,0 @@ ---- -title: Criando Agents -description: Assistentes de IA que entendem contexto, chamam tools e ajudam usuários a realizar tarefas -icon: Bot ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -## Entendendo Agents - -Cada agent: -- **Entende linguagem natural** - Usuários podem conversar com eles naturalmente -- **Chama tools autonomamente** - Decide quais tools usar baseado na situação -- **Segue instruções** - Se comporta de acordo com seu system prompt -- **Mantém contexto** - Lembra do histórico de conversa -- **Tem acesso a resources** - Usuários podem usar `@menção` em qualquer resource (tools, documents, workflows, views) para dar acesso ao agent - -**Casos de uso comuns:** -- Automação de suporte ao cliente -- Assistentes de produtividade interna -- Auxiliares de análise de dados -- Criação de conteúdo -- Automação de processos - -## Criando Agents com Deco Chat - -A maneira mais fácil de criar um agent é descrevendo o que você precisa: - -**Exemplos de prompts:** -``` -Preciso de um agent de suporte ao cliente que possa consultar pedidos e processar reembolsos abaixo de R$500 - -Crie um agent que ajude minha equipe a analisar dados de vendas e gerar relatórios - -Construa um agent escritor de conteúdo que siga nossas diretrizes de marca e possa publicar em nosso CMS - -Quero um agent que faça triagem de consultas de clientes e as encaminhe para o especialista certo -``` - -**O que acontece em seguida:** -1. Deco chat faz perguntas esclarecedoras (Quais tools? Qual personalidade? Quais limites?) -2. Sugere um system prompt baseado nas suas necessidades -3. Recomenda quais tools dar a ele -4. Cria o agent usando `@AGENTS_CREATE` -5. Você testa e itera juntos - -**Refine conforme avança:** -``` -Deixe o tom mais formal -Adicione a capacidade de criar tickets de suporte -Não deixe processar reembolsos acima de R$250 sem aprovação -Inclua nosso FAQ de produto como contexto -``` - -Comece com uma ideia vaga e itere em direção a exatamente o que você precisa. - - - - As seções abaixo explicam a mecânica se você quiser entender como agents funcionam. - - ---- - -## O Que Acontece Por Baixo dos Panos? - -Quando você cria um agent (seja via deco chat ou pela UI), estes são os componentes principais sendo configurados: - -### 1. System Prompt (Mais Importante) - -O system prompt define as características do seu agent: -- **Comportamento** - Como ele age e responde -- **Personalidade** - Tom e estilo -- **Limites** - O que ele deve/não deve fazer -- **Conhecimento de domínio** - Áreas de expertise - -Pense no system prompt como contexto persistente que é incluído com cada mensagem do usuário. Você pode referenciar qualquer resource em system prompts usando menções `@` (tools, documents, workflows, views). - -**Exemplo de system prompt:** - -``` -Você é um agent de suporte ao cliente para Acme SaaS, uma plataforma de gerenciamento de projetos. - -Você ajuda clientes com: -- Perguntas sobre cobrança e assinatura -- Problemas de acesso à conta e login -- Explicações e tutoriais de recursos do produto -- Relatórios de bugs e solução de problemas técnicos - -Você é amigável, paciente e orientado a soluções. -Você usa linguagem clara e evita jargões. - -Você pode: -- Processar reembolsos abaixo de R$500 usando @PROCESS_REFUND -- Redefinir senhas usando @RESET_PASSWORD -- Consultar status da conta usando @GET_ACCOUNT_STATUS -- Criar tickets de suporte usando @CREATE_TICKET para problemas complexos -- Agendar chamadas com especialistas usando @SCHEDULE_CALL - -Você não pode: -- Fazer promessas sobre recursos futuros ou roadmap -- Modificar preços customizados ou contratos enterprise -- Compartilhar dados sobre outros clientes -- Burlar políticas de segurança - -Ao lidar com reembolsos: -- Para valores abaixo de R$500, use @PROCESS_REFUND imediatamente -- Para valores acima de R$500, use @CREATE_TICKET e informe ao cliente - que um gerente fará a revisão em até 24 horas - -Quando usuários não conseguem fazer login: -- Primeiro use @GET_ACCOUNT_STATUS para verificar o status da conta -- Se suspensa, explique o motivo e o que precisam fazer -- Se ativa, use @RESET_PASSWORD e guie-os pelo processo - -Para bugs técnicos: -- Sempre use @CREATE_TICKET para garantir que a equipe de engenharia veja -- Obtenha passos de reprodução antes de criar o ticket -- Defina prioridade baseada no impacto (bloqueia trabalho = alta, cosmético = baixa) - -Exemplo de interação: - -Usuário: "Não consigo fazer login e tenho uma demo em 30 minutos!" - -Você: "Entendo a urgência, vou ajudá-lo imediatamente. Estou verificando - o status da sua conta agora usando nosso sistema. - - [chama @GET_ACCOUNT_STATUS] - - Sua conta está ativa. Vou enviar um link de redefinição de senha para - você voltar rapidamente. - - [chama @RESET_PASSWORD] - - Pronto! Verifique seu email para o link de redefinição. Ele é válido por 1 hora. - Se não ver em 2 minutos, verifique sua pasta de spam. - - Precisa de mais alguma coisa antes da sua demo?" - -Quando não souber algo, diga claramente e ofereça conectá-lo -com um especialista. Nunca adivinhe ou invente informações. -``` - - - O system prompt é onde acontece a maioria do ajuste do agent. Note como **mostramos** ao agent como se comportar através de exemplos e **especificamos** exatamente quando usar cada tool. - - -### 2. Seleção de Modelo - -Escolha o modelo de IA que alimenta seu agent. Atualmente oferecemos os modelos mostrados abaixo, e estamos sempre adicionando mais: - -- Claude Sonnet 4.5 -- Claude Haiku 4.5 -- OpenAI GPT-4.1 mini -- OpenAI GPT OSS 120B -- OpenAI GPT OSS 20B -- Google Gemini Pro 2.5 -- Claude Sonnet 4 -- Claude Sonnet 3.7 - -**Orientação prática:** -- **Suporte ao cliente** - Claude Haiku ou Sonnet (boa compreensão, rápido) -- **Análise de dados** - Claude Sonnet ou GPT-4.1 (melhor raciocínio) -- **Automação simples** - GPT-4.1 mini (rápido e custo-efetivo) -- **Escrita de conteúdo** - Claude Sonnet (criativo e com nuances) - -Você pode mudar modelos a qualquer momento. - -**Para especificações detalhadas dos modelos**, veja: -- [OpenRouter Models](https://openrouter.ai/models) - Comparação abrangente de modelos -- [Models.dev](https://models.dev/) - Banco de dados open-source de modelos de IA com preços e recursos - -**Bring Your Own Model (BYOM) / Bring Your Own Tokens (BYOT):** -Se quiser usar suas próprias API keys ou modelos customizados, vá em **Organização** → **Models** para gerenciar essas configurações. - -### 3. Atribuição de Tools - -Dê ao seu agent acesso a tools específicos, mas comece com o mínimo. -``` -❌ Dar acesso a todos os 50 tools do workspace -✅ Começar com 3-5 tools essenciais, adicionar conforme necessário -``` - -Muitos tools confundem o agent e tornam a janela de contexto muito grande, levando a respostas mais lentas e custos maiores. - -**Exemplo de toolset para suporte ao cliente:** -``` -Informações do Cliente: -├─ CUSTOMER_FETCH -└─ CUSTOMER_UPDATE - -Cobrança: -├─ INVOICE_FETCH -├─ REFUND_PROCESS -└─ SUBSCRIPTION_UPDATE - -Comunicação: -├─ EMAIL_SEND -└─ TICKET_CREATE -``` - -**No seu system prompt, explique como e quando usar cada tool:** -``` -Para consultar o histórico de pedidos de um cliente, use @ORDERS_FETCH com o email dele. -Para processar um reembolso abaixo de R$500, use @REFUND_PROCESS com o ID do pedido. -Para reembolsos acima de R$500, use @TICKET_CREATE para escalar para um gerente. -``` - -**Atribuindo tools de integrações:** - -Na aba Agents, clique em **Tools** → **Adicionar Integração** para dar ao seu agent acesso a tools que vêm com integrações pré-construídas (apps). Aqui, adicione novas integrações ou selecione das instaladas. - - - Tenha cuidado ao dar aos agents tools que deletam dados, cobram dinheiro ou chamam APIs caras. Considere adicionar workflows de aprovação para operações sensíveis. - - -### 4. Contexto Adicional - -Além do system prompt, você pode dar aos agents acesso a contexto adicional através de múltiplas fontes: - -#### Documents - -Anexe documents que o agent pode buscar e referenciar usando menções `@` em threads e system prompts (ex: `@product-guide`, `@support-faq`). - -**O que anexar:** -- Documentação de produto (guias de recursos, FAQs) -- Documentação de processo (SOPs, diretrizes de escalação) -- Informações da empresa (políticas, preços, termos) - -**Exemplo:** -``` -Documents do Agent de Suporte ao Cliente: -├─ Guia de Recursos do Produto.md -├─ FAQ de Cobrança.md -├─ Guia de Troubleshooting.md -└─ Quando Escalar.md -``` - -O agent automaticamente busca nesses quando relevante. Você não precisa dizer a ele, ele descobre quando precisa de mais informação. - -#### Contexto de Banco de Dados - -Dê aos agents acesso ao seu banco de dados para recuperação de dados em tempo real: - -**Abordagem atual:** -Use `@DATABASES_RUN_SQL` para consultar seu banco diretamente. Referencie este tool no seu system prompt com exemplos: - -``` -Para verificar o status de assinatura de um cliente, use @DATABASES_RUN_SQL: -SELECT status, plan, expiry_date FROM subscriptions WHERE user_id = ? -``` - -**Em breve:** Referências diretas a tabelas e campos sem escrever SQL. - -#### RAG e Bases de Conhecimento - -**Em breve:** Suporte nativo de primeira classe para RAG e bases de conhecimento. - -**Por enquanto, use:** -- **Documents** (como mostrado acima) para Q&A simples e material de referência -- **Integração Pinecone** da deco store para busca vetorial de nível produção e recuperação semântica - -Instale Pinecone em **Integrações** → **Navegar Store** → **Pinecone**, depois dê ao seu agent acesso aos tools do Pinecone para busca semântica em grandes bases de conhecimento. - -### 5. Configurações Avançadas - -Ajuste fino no comportamento (a maioria dos agents funciona bem com padrões): - -**Max Steps** (padrão: 15) -- Quantas chamadas de tools o agent pode fazer por resposta -- Maior = pode completar tarefas mais complexas -- Menor = respostas mais rápidas e simples - -**Max Tokens** (padrão: 4096-64000 dependendo do modelo) -- Comprimento máximo de resposta -- Ajuste baseado no seu caso de uso (respostas curtas vs. conteúdo longo) - -**Temperature** (0.0 - 1.0, padrão: varia por modelo) -- Menor (0.2) = Consistente, determinístico (agents de suporte) -- Maior (0.8) = Criativo, variado (agents de conteúdo) - -**Context Window** -- O número de mensagens recentes para manter na memória -- Janela maior = melhor contexto mas maior custo - -**Controle de Acesso** -- Controle quem pode interagir e editar este agent - -## Padrões Comuns de Agents - -### Agent de Suporte ao Cliente -``` -Modelo: Claude Sonnet (rápido, bom em conversação) -Tools: CUSTOMER_FETCH, ORDER_LOOKUP, REFUND_PROCESS, TICKET_CREATE -Documents: FAQ, guia de troubleshooting, política de devolução -Tom: Amigável, paciente, orientado a soluções -Visibilidade: Público -``` - -### Analista de Dados Interno -``` -Modelo: GPT-4 (melhor em queries complexas) -Tools: DATABASE_QUERY, CHART_GENERATE, REPORT_CREATE -Documents: Schema do banco de dados, definições de KPI -Tom: Técnico, preciso -Visibilidade: Workspace -``` - -### Escritor de Conteúdo -``` -Modelo: GPT-4 (mais criativo) -Tools: CONTENT_GENERATE, SEO_ANALYZE, CMS_PUBLISH -Documents: Diretrizes de marca, guia de estilo -Tom: Criativo, envolvente, alinhado com a marca -Visibilidade: Workspace -``` - -## Testando Seu Agent - -1. **Caminho feliz** - Tudo funciona como esperado -2. **Informação faltando** - Agent faz perguntas de follow-up -3. **Erros** - Tools falham, agent lida graciosamente -4. **Casos extremos** - Solicitações incomuns ou inesperadas -5. **Multi-etapas** - Tarefas complexas requerendo múltiplos tools -6. **Limites** - Usuário pede ao agent para fazer algo que não deveria - -Abra o agent em uma thread e tente conversas reais. Observe quais tools ele chama e como responde. Refine o system prompt baseado no que vê, este é um processo iterativo. - - - **Duas maneiras de configurar agents:** Você pode fazer mudanças manualmente (testar e depois editar system prompt, atribuir tools, ajustar configurações) ou pedir ao deco chat para testar e ajustar para você. - - -## Monitorando Uso do Agent - -Rastreie performance e uso do agent: - -- Vá em **Uso** na sua org -- Veja conversas, mensagens, chamadas de tools, custos por agent -- Filtre threads por agent para ver todas as conversas - -Use esses insights para: -- Aprender como outros usam o agent -- Identificar problemas comuns ou confusão -- Descobrir casos de uso inesperados -- Melhorar system prompts baseado em padrões reais - -**Lembre-se:** Os melhores agents têm system prompts claros e específicos e toolsets cuidadosamente curados. Comece simples e evolua baseado no uso real. diff --git a/apps/docs/client/src/content/deco-studio/pt-br/no-code-guides/creating-tools.mdx b/apps/docs/client/src/content/deco-studio/pt-br/no-code-guides/creating-tools.mdx deleted file mode 100644 index 0ed7502f61..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/no-code-guides/creating-tools.mdx +++ /dev/null @@ -1,241 +0,0 @@ ---- -title: Criando Tools -description: Funções que agents, workflows e views usam para tomar ação -icon: Wrench ---- - -import Callout from "../../../../components/ui/Callout.astro"; - - -## Entendendo Tools -Tools são funções que executam ações específicas - são os "verbos" da sua aplicação de IA. - -Cada tool: -- **Faz uma coisa bem** - Realizar operação CRUD, salvar no banco, chamar uma API -- **Tem inputs bem definidos** - Parâmetros que o tool aceita -- **Retorna output estruturado** - Formato de dados previsível -- **Pode ser chamado por** - Agents, workflows, views e outros tools - -**De onde vêm os tools:** -- **Integrações** - Instale apps da store (Gmail, Slack, Notion, etc.) para obter tools pré-construídos que aparecem automaticamente no seu workspace -- **Tools customizados** - Construa os seus usando deco chat ou escreva TypeScript manualmente - -**Estratégia:** Comece navegando pelas integrações disponíveis na deco store. A maioria das necessidades comuns já está coberta. Construa tools customizados apenas para requisitos específicos que ainda não existem. - -## Criando Tools com Deco Chat - -A maneira mais fácil de criar tools é descrevendo o que você precisa: - -**Exemplos de prompts:** -``` -Preciso de um tool que verifique se um produto está em estoque em todos os armazéns - -Crie um tool para calcular descontos baseado no nível de fidelidade do cliente - -Me ajude a construir um tool que recomende produtos baseado no histórico de compras do cliente - -Quero validar endereços de email de clientes e enviar códigos de desconto de boas-vindas -``` - -**O que acontece em seguida:** -1. Deco chat faz perguntas esclarecedoras (Quais inputs? O que deve retornar?) -2. Sugere um schema baseado nas suas necessidades -3. Cria o tool usando `@TOOLS_CREATE` -4. Você testa e itera juntos - -**Refine conforme avança:** -``` -Adicione validação para garantir que o cliente tem uma conta de fidelidade válida - -Inclua um parâmetro de total mínimo do pedido com padrão de R$250 - -Altere o output para também retornar a data de expiração do desconto -``` - -Esta abordagem conversacional significa que você começa com uma ideia vaga e itera em direção a exatamente o que precisa. - - - As seções abaixo explicam a mecânica se você quiser entender como tools funcionam. - - ---- - -## O Que Acontece Por Baixo dos Panos? - -Quando você cria um tool (seja via deco chat ou clicando no ícone de código para escrever TypeScript), estes são os componentes principais sendo definidos: - -### 1. Nome do Tool - -Tools seguem o padrão `RECURSO_ACAO` com `MAIUSCULAS_COM_UNDERSCORES`: - -**Exemplos:** -- `PRODUCT_INVENTORY_CHECK` - Verificar níveis de estoque do produto -- `ORDER_CONFIRMATION_SEND` - Enviar email de confirmação de pedido -- `CART_DISCOUNT_APPLY` - Aplicar desconto ao carrinho de compras - -``` -Bom: CUSTOMER_LOYALTY_UPDATE, PRODUCT_PRICE_CALCULATE -Ruim: updateLoyalty, calculate-product-price -``` - -**Por que isso importa:** Agents usam nomes de tools para decidir quando usá-los. Nomes descritivos = melhores decisões. - -### 2. Descrição - -Diz aos agents e workflows o que o tool faz e quando usá-lo: -``` -Bom: "Verificar estoque do produto em todos os armazéns e calcular estoque disponível. -Retorna quantidade total, detalhamento por localização e status de alerta de estoque baixo." - -Ruim: "Verifica estoque" -``` - -Quanto melhor a descrição, melhor os agents entendem quando usá-lo. - -### 3. Input Schema - -Define quais parâmetros o tool aceita: -- Campos **obrigatórios** vs **opcionais** -- **Valores padrão** onde faz sentido -- Regras de **validação** (formato de email, URL, intervalos numéricos) -- **Tipos** (string, number, boolean, etc.) - -Mantenha simples, se você precisa de 10+ parâmetros, considere quebrar em tools menores. - -### 4. Output Schema - -Define o que o tool retorna: -- **Estrutura** - Quais campos são retornados -- **Tipos** - Tipos de dados para cada campo -- **Indicador de sucesso/falha** -- **Detalhes de erro** quando falhas ocorrem - -Este schema é crítico para: -- **Workflows** - Podem referenciar campos de output específicos em próximos passos -- **Agents** - Sabem quais dados receberam e como usá-los -- **Composabilidade** - Outros tools podem consumir este output - -### 5. Lógica do Tool - -A implementação real, o que o tool faz: - -**Padrões comuns:** -- **Encadear tools existentes** - Compor tools de integrações instaladas -- **Chamadas de API** - Buscar dados de serviços externos -- **Operações de banco de dados** - Consultar ou modificar dados -- **Transformações** - Processar e formatar dados - -Quando você pede ao deco chat para criar um tool, ele lida com tudo isso para você. Quando você escreve TypeScript, você define isso explicitamente. - -### 6. Testes - -Uma vez criado, teste seu tool de duas maneiras: - -**Via UI:** -deco CMS gera automaticamente um formulário baseado no seu input schema. Preencha os campos e execute o tool para ver resultados. - -**Via chat:** -``` -@PRODUCT_INVENTORY_CHECK sku="SKU-12345" -@ORDER_CONFIRMATION_SEND customerEmail="cliente@exemplo.com" orderNumber="ORD-789" -``` - -Itere até funcionar como esperado. - -## Descobrindo Tools Existentes - -Antes de criar um tool, verifique o que já existe: - -**Navegue pelos tools do workspace:** -- Vá para **Tools** na barra lateral para ver todos os tools disponíveis -- Use a busca para encontrar ações específicas (ex: "email", "cliente") - -**Navegue pelos tools de integração:** -- Visite **Apps** -- Verifique integrações instaladas para tools pré-construídos -- Navegue pela **Store** para descobrir novas integrações -- Cada integração mostra quais tools ela fornece -- Instale e configure a integração para adicionar esses tools ao seu workspace - -**Adicione integrações customizadas:** - -Se você construiu seu próprio servidor MCP ou quer conectar a um app customizado: - -1. Clique em **Adicionar Custom** na seção Apps -2. Preencha os detalhes da conexão: - - **Nome** - Um nome amigável para este app (ex: "Minha API de Vendas") - - **Descrição** - O que este app faz (opcional) - - **Tipo** - Como conectar (geralmente HTTP para apps web) - - **URL** - O endereço web onde seu app está hospedado (ex: `https://example.com/mcp`) - - **Token** - Uma senha ou chave para acessar seu app com segurança (opcional) -3. Clique em **Adicionar** para conectar - -Uma vez conectado, quaisquer tools que seu app customizado forneça aparecerão automaticamente no seu workspace e podem ser usados por agents, workflows e views. - - - **Para usuários não técnicos:** Você normalmente receberá a URL e o token de quem construiu o app customizado. Basta copiar e colar esses valores no formulário. - - -## Gerenciando Tools - -**Atualizando tools:** - -Peça ao deco chat para fazer mudanças ou edite TypeScript diretamente: - -``` -Atualize PRODUCT_INVENTORY_CHECK para também retornar o limite de reposição do produto -Atualize ORDER_CONFIRMATION_SEND para incluir data estimada de entrega -``` - -**Outras ações:** - -Passe o mouse sobre qualquer card de tool e clique em **...** para: -- Duplicar o tool -- Deletar o tool (nota: isso afeta agents, workflows ou views que o utilizam) -- Ver detalhes do tool - -## Grupos de Tools - -Organize tools relacionados para descoberta mais fácil: - -**Exemplos:** -- **Gerenciamento de Clientes** - `CUSTOMER_CREATE`, `CUSTOMER_FETCH`, `CUSTOMER_UPDATE`, `CUSTOMER_LOYALTY_UPDATE` -- **Processamento de Pedidos** - `ORDER_CREATE`, `ORDER_UPDATE`, `ORDER_CANCEL`, `ORDER_REFUND` -- **Inventário** - `PRODUCT_INVENTORY_CHECK`, `INVENTORY_UPDATE`, `INVENTORY_ALERT_CREATE` -- **Notificações** - `ORDER_CONFIRMATION_SEND`, `SHIPPING_NOTIFICATION_SEND`, `CART_ABANDONED_SEND` - -## Princípios de Composição - -### Construa Pequeno, Componha Grande - -Não construa tools monolíticos: -``` -❌ ORDER_CREATE_AND_EMAIL_AND_UPDATE_INVENTORY_AND_NOTIFY - -✅ ORDER_CREATE → INVENTORY_UPDATE → ORDER_CONFIRMATION_SEND → ORDER_NOTIFICATION_SEND - (Quatro tools simples compostos em um workflow) -``` - -### Schemas Permitem Automação - -Schemas claros de input/output permitem que: -- Agents saibam quando e como usar o tool -- Workflows mapeiem automaticamente dados entre passos -- Views gerem formulários automaticamente -- Erros sejam capturados antes do runtime - - - Tools que deletam dados, cobram pagamentos ou chamam APIs caras devem ter permissões restritas. Configure controles de acesso para limitar quem pode usar tools sensíveis. - - -## Erros Comuns - -**Evite estas armadilhas:** - -1. **Tools muito complexos** - Se um tool precisa de 10+ parâmetros, quebre em tools menores -2. **Descrições vagas** - Agents não conseguem usar tools que não entendem -3. **Falta de tratamento de erros** - Sempre retorne mensagens de erro claras -4. **Sem validação** - Valide inputs antes de processar -5. **Nomes confusos** - Use o padrão `RECURSO_ACAO` consistentemente - ---- diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/agentic-cms.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/agentic-cms.mdx deleted file mode 100644 index b19a21c0e9..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/agentic-cms.mdx +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Agentic CMS -description: Um CMS visual para storefronts e sites de conteúdo, com agents de IA que operam o site junto com você -icon: LayoutTemplate ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -## O que é o Agentic CMS? - -O **Agentic CMS** é a próxima geração do [deco.cx](https://docs.deco.cx) — um CMS visual para storefronts e experiências digitais ricas em conteúdo, construído sobre o [deco Studio](/pt-br/studio/overview). É o carro-chefe da [suíte Digital Experience](/pt-br/studio/digital-experience) da deco. - -São duas coisas em uma: - -- **Um CMS** — componentes React type-safe, loaders em TypeScript, theme editor, versionamento baseado em Git, colaboração em tempo real entre desenvolvedores e times de conteúdo. O mesmo modelo que o deco.cx estabeleceu, refinado. -- **Um time de agents** — workers de IA focados que produzem conteúdo, ajustam o design, enriquecem o catálogo e mantêm o site saudável. Eles trabalham junto com o seu time e você mantém o controle. - -## Para quem é - -Times que gerenciam **storefronts** (ecommerce, marketplaces) e **sites orientados a conteúdo** (mídia, D2C de marca, bases de conhecimento) que querem: - -- A colaboração e a performance de uma stack code-first -- A velocidade e o alcance de um editor visual -- Agents de IA que escalam o trabalho operacional — sem esconder o que estão fazendo - -Ele elimina a fronteira entre "o time de engenharia que mantém o site" e "o time de conteúdo que o preenche." Ambos trabalham no mesmo produto, com agents cuidando do trabalho repetitivo no meio do caminho. - -## Git-native, por design - -Toda mudança no seu site — seja feita por uma pessoa no editor visual ou por um agent a partir do chat — passa pelo mesmo workflow Git que você já conhece: - -1. A mudança é commitada em uma branch -2. Um pull request é aberto com um diff que seu time pode revisar -3. Revisores aprovam ou pedem mudanças -4. No merge, a mudança vai para o seu site - -Esse é o mesmo modelo que o deco.cx pioneirou, e ele se mantém diretamente. **Agents não pulam a revisão.** Eles abrem PRs como qualquer outra pessoa, e seu time continua sendo a fonte da verdade — seu repo, suas branches, seu histórico. Faça rollback, audite e rastreie qualquer mudança até seu autor, humano ou agent. - -## Como se relaciona com o deco.cx - -Se você está vindo do deco.cx, o Agentic CMS é a mesma linha de produto — os mesmos conceitos centrais (sections, loaders, blocks, theme editor, Decopilot), agora plugados no Studio para que seu storefront venha com um control plane de agents completo ao seu redor. - -| conceito deco.cx | Agentic CMS hoje | -|---|---| -| Sections (componentes React/TS) | Iguais, com variantes opcionais geradas por agents | -| Loaders (busca de dados) | Iguais, agora visíveis como tools para seus agents | -| Blocks (unidades reutilizáveis) | Iguais | -| Theme Editor | Igual | -| Decopilot | Promovido a assistente de primeira classe com escopo no seu site | -| Admin UI | Agora parte do agent shell do Studio | -| Git workflow | Igual — toda mudança passa pela revisão de PR | - -Projetos deco.cx existentes continuam funcionando. A migração adiciona a camada de agents; ela não substitui sua base de código. - -## Primeiros passos - -Abra o Studio, encontre o agent **deco Site Editor** e aponte-o para o seu site. - - - O Agentic CMS não é um produto separado — é uma configuração de Studio + o CMS do deco.cx, empacotada para times de storefront. Tudo o que você aprende sobre agents, connections e automations do Studio se aplica diretamente. - diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/agents.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/agents.mdx deleted file mode 100644 index 495eaa4000..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/agents.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: Agents -description: A superfície de trabalho do Studio — um agent, um trabalho, seu próprio histórico de thread e tools -icon: Bot ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -## O que é um agent? - -Um **agent** é uma IA configurada para um trabalho específico: um conjunto focado de tools, instruções claras e um único propósito. Agents são a superfície de trabalho do Studio — quase tudo o que você faz no produto acontece dentro de um. - -Um agent tem: - -- **Um objetivo claro** — o que ele faz e quando usá-lo -- **As tools certas** — apenas o que ele precisa, anexadas a partir das suas [connections](/pt-br/studio/connections) -- **Instruções detalhadas** — como se comportar, o que priorizar, o que evitar -- **Um histórico de thread** — cada conversa passada com ele, salva e retomável -- **Um layout** — a main view padrão, além de quais views disponíveis do projeto e de MCP apps fixados aparecem na sidebar -- **Um sandbox opcional** — um runtime isolado onde o agent pode rodar código de um repo vinculado (seu próprio MCP server, um dev server, etc.) -- **Automations opcionais** — schedules ou triggers de evento que executam o agent sem supervisão - -Você chega a um agent pela home grid, pela lista de threads na sidebar ou pelo botão **+** / "Browse agents". Abra um e a tela inteira se torna aquele agent. - -## A tela do agent - -Quando você abre um agent, a navegação permanente dele fica na seção do projeto na sidebar, e o workspace pode se dividir em duas partes: - -- **Sidebar — views do projeto.** Em **Layout**, escolha se Home, Deco Score, Tasks, Site Editor, Automations e cada view disponível de Assets, Hosting, E2E, Deco Analytics, Monitor ou de MCP apps fixados aparece aqui. Selecionar uma delas a abre como main view; esses destinos não aparecem também como tabs de nível superior no painel. -- **Esquerda — chat.** Converse com o agent em linguagem natural; ele usa as tools anexadas para fazer o trabalho. Suas mensagens e threads passadas com este agent ficam aqui. Acima do input estão o **model-tier picker** (Fast, Smart, Thinking — veja [AI Providers](/pt-br/studio/ai-providers)) e o **runtime picker** (veja [Onde um agent roda](#onde-um-agent-roda)). -- **Direita — main view.** Esta é a view selecionada na sidebar ou configurada como padrão do projeto. Uma view ainda pode ter suas próprias tabs contextuais — por exemplo, Preview, Content e Code dentro do Site Editor — e outputs temporários do chat podem aparecer aqui sem virar navegação permanente na sidebar. - -Um agent baseado em Git também mostra um **branch selector** ao lado do runtime picker, e um indicador de **status do sandbox** enquanto seu ambiente inicializa. - -Tudo sobre um único agent vive nesta única tela. - -### Layout e pinned views - -As configurações de **Layout** do agent controlam de forma independente a main view padrão e as entradas da sidebar. Projetos que ainda não salvaram preferências da sidebar começam com Home, Deco Score, Tasks e Site Editor quando essas views estão presentes; Automations e as outras views disponíveis começam desabilitadas. O Studio só oferece uma view nativa quando ela está presente no projeto: views ligadas a código exigem um repositório ou template, Assets precisa de um armazenamento de assets associado e Hosting, E2E, Deco Analytics e Monitor dependem dos serviços disponíveis para o site. Uma view presente fica disponível no seletor de **Main view** mesmo que seu switch da sidebar esteja desabilitado. O switch apenas adiciona ou remove essa entrada permanente da sidebar do projeto. - -Algumas connections expõem mais do que tools — elas trazem uma UI interativa (um dashboard, um formulário, um explorador de dados) junto ao seu endpoint MCP. Você pode fixar qualquer uma dessas views em **Layout**. Uma pinned view segue o mesmo modelo: ela se torna uma entrada selecionável na sidebar do projeto e uma opção de main view padrão. É assim que um agent se transforma em um pequeno app de propósito específico, e não apenas um chat. - -Essas views vêm de **MCP apps**. - -### MCP apps: estendendo o Studio com tools + UI - -Um **MCP app** é a forma de estender o Studio hoje. É um MCP server comum que empacota duas coisas em um único pacote: - -- **Tools** — as ações que um agent pode executar -- **Views** — UIs em React (uma página, um painel, um dashboard) entregues como resources, vinculadas a tools específicas via `_meta.ui.resourceUri` - -Quando um MCP app é instalado como uma connection, o Studio sabe quais views pertencem a quais tools. Fixe uma view no Layout do agent e ela aparece como uma entrada na sidebar do projeto — clicar no resultado de uma tool relevante, ou selecionar essa entrada, carrega a view inline. A comunicação bidirecional entre o chat e a view é tratada pelo Studio. - -Para criar um MCP app você usa o framework `@decocms/runtime` (React 19 + Tailwind + shadcn, compilado para um único arquivo HTML com Vite). O template de referência — incluindo estrutura de projeto, configuração de build e exemplos de tools-com-views — fica em [github.com/decocms/mcp-app](https://github.com/decocms/mcp-app). - -Em um release futuro, o Studio permitirá que você construa views simples diretamente dentro da UI do agent, sem precisar criar um repo. Para qualquer coisa custom ou de nível de produção hoje, comece pelo template repo acima. - -### Sandbox - -Um agent pode ser respaldado por código. Vincule-o a um repositório do GitHub em **Settings → Sandbox** e o Studio executará o repo como um ambiente de dev isolado com escopo daquele agent — tipicamente o próprio MCP server do agent, mas pode ser qualquer serviço que o agent precise. O sandbox inicia sob demanda, vive apenas enquanto o agent precisar dele, e nunca vaza entre agents. - -Quando o agent está rodando com um runtime local de code-editor, os botões **Open in VSCode** e **Open in Cursor** aparecem diretamente na barra de abas para acesso com um clique ao repositório na sua máquina. Em outros modos de runtime, as mesmas opções ficam disponíveis no menu de três pontos (⋯) da barra de abas. - -## Onde um agent roda - -Acima do input do chat, ao lado do model picker, está o **runtime picker**. Ele controla *onde* o agent executa e *qual harness* o conduz. Há dois grupos: - -**Cloud** - -- **Decopilot** — _"Roda em um agent sandbox."_ O Studio hosted é dono do runtime e, sempre que uma sandbox é necessária, usa seu AgentSandbox gerenciado; callers não escolhem um provider de sandbox. Este é o padrão, sem nada para instalar. - -**Local** — rode o agent na app nativa do Studio para desktop. Fora da app desktop, essas opções exibem **"Desktop not detected"** e ficam desabilitadas. - -- **Claude Code** — conduz o agent com o CLI do [Claude Code](https://claude.com/claude-code) -- **Codex** — conduz o agent com o CLI do Codex -- **OpenCode** — conduz o agent com o CLI do OpenCode - -Rodar localmente significa que o sandbox do agent vive na sua máquina: ele pode ler e escrever seus arquivos locais, usar suas ferramentas instaladas e rodar com suas próprias credenciais — enquanto o Studio continua tratando o chat, as connections e o logging. O cloud sandbox, por outro lado, é totalmente gerenciado e isolado por agent. - -Para usar as opções locais, abra a app nativa do Studio. O `local-api` embutido detecta os CLIs compatíveis na máquina, inicia o harness selecionado no worktree local do chat e intercepta localmente as chamadas de lifecycle e filesystem da sandbox. Ele registra esse runtime como `local-api`; a API hosted continua fixa no AgentSandbox. - - - Cloud é o padrão certo para execuções sem supervisão e para colegas de time que não deveriam precisar de uma configuração local. Recorra à app desktop quando o agent precisar da sua máquina — seus arquivos, suas credenciais ou um coding harness como Claude Code, Codex ou OpenCode. - - -## Windows - -O daemon roda nativamente no Windows com um pré-requisito: **[Git for Windows](https://gitforwindows.org)** — ele fornece tanto o `git` quanto o shell bash usado para rodar os scripts de dev do seu projeto. Se o daemon reportar "POSIX shell (sh) not found", instale o Git for Windows ou defina a variável de ambiente `DECO_SHELL` para um shell compatível com bash. O WSL2 continua sendo uma alternativa totalmente suportada. Montagens de arquivos da org ainda não estão disponíveis no Windows. - -## Um agent é um MCP virtual - -Cada agent no Studio é exposto como seu próprio **endpoint MCP**: um pacote curado de tools, resources e instruções ao qual qualquer client compatível com MCP pode se conectar. Você pode pensar em um agent como um "MCP server virtual" que você monta visualmente — escolha algumas tools das suas connections, adicione instruções, e você publicou um endpoint MCP focado que seu time (ou seus outros agents) pode usar. - -É por isso que o mesmo agent pode ser usado de três formas diferentes: - -- **Pelo chat do Studio** — abra o agent e converse com ele -- **Por um client externo** — aponte Cursor, Claude Desktop ou qualquer MCP client para o endpoint do agent -- **Por outro agent ou tool** — chame-o programaticamente via MCP - -Quando duas connections anexadas expõem uma tool com o mesmo nome, a da connection listada primeiro vence; a duplicata é descartada silenciosamente. - -## Anexando connections - -Connections ficam em **Settings → Connections** no nível da org. Dentro da aba **Settings** de um agent, você escolhe quais connections (e quais tools específicas de cada uma) o agent pode usar. Escolha de forma restrita. Um agent com três tools bem escolhidas se comporta de forma mais previsível do que um com trinta. - -## Agents integrados - -O Studio já vem com agents para gerenciar a própria plataforma — criar outros agents, configurar connections, gerenciar membros, navegar na store. Eles estão disponíveis imediatamente, sem configuração. - -## Projetando um bom agent - -**Mantenha o escopo restrito.** Um agent que faz uma coisa bem é mais confiável e fácil de manter do que um que tenta fazer tudo. Se você se pegar anexando tools não relacionadas, crie um segundo agent. - -**Escreva instruções como um handoff.** Workflow passo a passo, casos extremos para observar, o que fazer quando algo dá errado. O campo de instruções é onde vivem a personalidade e o julgamento do agent. - -**Escolha tools deliberadamente.** Um agent de atendimento ao cliente precisa de tools de consulta de pedidos e reembolso — não de tools de estoque ou marketing. - -**Bom**: "Order Fulfillment Agent" — processa e envia pedidos -**Amplo demais**: "Ecommerce Operations Agent" — fulfillment, atendimento ao cliente, estoque, marketing, analytics… - -## Formas de rodar um agent - -- **Interativamente** — abra o agent e converse -- **Sem supervisão** — anexe uma [automation](/pt-br/studio/automations) que o execute em um schedule ou evento -- **Pelo Decopilot** — o Decopilot pode passar uma tarefa para um agent especialista em uma subtask (veja [Decopilot](/pt-br/studio/decopilot/overview)) -- **Pelo seu próprio código** — chame seu endpoint MCP diretamente - ---- - -**Próximo:** Anexe tools via [Connections](/pt-br/studio/connections), execute agents sem supervisão com [Automations](/pt-br/studio/automations), ou veja [Decopilot](/pt-br/studio/decopilot/overview) para entender como o assistente integrado do Studio usa agents. diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/ai-providers.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/ai-providers.mdx deleted file mode 100644 index ad9757caf7..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/ai-providers.mdx +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: AI Providers -description: Conecte os modelos de IA que alimentam o Decopilot e seus agents -icon: Sparkles ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -## O que são AI providers? - -**AI Providers** são os serviços de modelos de IA que alimentam o [Decopilot](/pt-br/studio/decopilot/overview) e seus agents. Você conecta um provider uma vez no nível da organização, e todos os seus agents passam a usá-lo a partir daí. - -O Studio suporta múltiplos providers ao mesmo tempo — você pode combinar e alternar entre eles. - -## Default models: uma escolha por propósito - -Você não escolhe um model toda vez que inicia uma tarefa. Em vez disso, o Studio usa cinco **default models**, um para cada tipo de trabalho: - -| Default | Para que serve | Escolha típica | -|---|---|---| -| **Fast** | Respostas rápidas, interações curtas | Claude Haiku, GPT-4 mini, Gemini Flash | -| **Smart** | Equilíbrio entre velocidade e capacidade — o default do dia a dia | Claude Sonnet, GPT-4o, Gemini Pro | -| **Thinking** | Raciocínio mais difícil, planejamento longo | Claude Opus, série o, Gemini Ultra | -| **Image** | Geração de imagens | GPT Image, Imagen, etc. | -| **Web research** | Busca na web e deep research | Sonar, Perplexity, etc. | - -Configure isso uma vez em **Settings → AI Providers → Default models**. Quando um agent ou o Decopilot escolhe um tier, ele roteia para o model que você definiu. Mude um default e cada agent passa a usar o novo model imediatamente — sem reconfigurar agent por agent. - -Você ainda pode sobrescrever isso por agent quando necessário, mas os defaults cobrem o caso comum. - -## Deco AI Gateway - -O **Deco AI Gateway** é o provider recomendado. Organizações novas começam com créditos — sem API keys para gerenciar — e ele dá acesso a mais de 100 models de diversos fornecedores por trás de uma única connection. Pague conforme usar. - -Se quiser usar suas próprias keys mais tarde, adicione outro provider; o Studio usará o provider que você definir para cada tier de default model. - -Você pode conferir o crédito restante do gateway e fazer recarga diretamente em **Settings → AI Providers**. - -## Outros providers - -Clique em **Connect provider** em **Settings → AI Providers** para adicionar qualquer um destes: - -| Provider | Observações | -|---|---| -| **OpenRouter** | Uma conta, centenas de models de diversos fornecedores | -| **LLMAPI** | Uma API key, mais de 400 models de todos os fornecedores | -| **Anthropic** | API key direta da Anthropic — família Claude | -| **Google Gemini** | API key direta do Google AI Studio — família Gemini | -| **OpenAI-compatible** | Qualquer endpoint que fale a API OpenAI Chat Completions | - -### Presets OpenAI-compatible - -O provider **OpenAI-compatible** tem presets com marca para deployments comuns — escolha um e o Studio preenche a base URL automaticamente. Você também pode escolher **Custom** e colar qualquer URL. - -| Preset | Para que serve | -|---|---| -| **OpenAI** | API key direta da OpenAI — GPT-4, GPT-5, etc. | -| **LiteLLM** | Um gateway LiteLLM gerenciado pelo seu time | -| **Ollama** | Models open-source rodando localmente via Ollama | -| **LM Studio** | Models abertos rodando através do LM Studio | -| **vLLM** | O servidor vLLM self-hosted do seu time | -| **Custom** | Qualquer outro endpoint compatível com OpenAI (avançado) | - -### Providers somente locais - -Quando o Studio roda localmente (via `bunx decocms`), dois providers extras aparecem, delegando a um CLI instalado na sua máquina: - -| Provider | Observações | -|---|---| -| **Claude Code** | Conduz uma sessão do CLI `claude` — usa sua auth Anthropic existente | -| **Codex** | Conduz uma sessão do CLI `codex` | - -Eles não aparecem no produto cloud. - -## Como um provider é conectado - -**API key** — o método mais comum. Cole a key do dashboard do seu provider. Ela é armazenada criptografada e nunca exposta ao seu time. - -**Sign in with browser** — para providers que suportam (Deco AI Gateway, OpenRouter). Você é levado à página de login do provider, autoriza o acesso e o Studio cuida do resto. - -**Local endpoint** — para os presets Ollama, LM Studio, vLLM, LiteLLM ou Custom do OpenAI-compatible: cole a base URL onde o Studio consegue alcançar o servidor. - -**CLI activate** — para Claude Code e Codex em modo local: o Studio roda o CLI instalado na sua máquina; nenhuma key é armazenada do lado do Studio. - -## Quais models estão disponíveis? - -Uma vez que um provider está conectado, você pode navegar pelos models disponíveis. Cada model mostra: - -- Seu nome e capacidades (texto, visão, geração de imagem, etc.) -- Tamanho da janela de contexto -- Preço por token - -A disponibilidade de models pode ser filtrada pelas configurações de permissão de model da sua organização. Se um model que você espera não aparece, verifique com o admin da sua org. - -## Fallback - -Se o provider por trás de um tier de default estiver indisponível, o Studio faz fallback para outro provider conectado automaticamente — então uma queda temporária em um fornecedor não quebra seus agents. - ---- - - -Organizações novas já vêm com créditos do Deco AI Gateway — você pode começar a usar o Decopilot e seus agents sem configurar nada. Veja [Decopilot](/pt-br/studio/decopilot/overview) ou [API Keys](/pt-br/studio/api-keys) para gerenciar acesso programático ao próprio Studio. - diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/api-keys.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/api-keys.mdx deleted file mode 100644 index ac34e25ebe..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/api-keys.mdx +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: API Keys -description: Crie API keys escopadas para acessar ferramentas de gerenciamento, proxies e agentes -icon: KeyRound ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -## O que são API Keys? - -API keys permitem que sistemas externos se conectem ao deco Studio sem precisar que um usuário faça login. São tokens simples que você pode usar em scripts, ferramentas de automação ou qualquer sistema que precise acessar o deco Studio programaticamente. - - - API keys são para **sistemas externos se conectando ao deco Studio**. Para conectar o deco Studio a servidores MCP upstream, veja [Conexões](/pt-br/studio/connections). - - -## Quando Usar API Keys vs OAuth - -**OAuth** (Recomendado para a maioria dos usuários) -- Use com Cursor, Claude Desktop, VS Code -- Login pelo navegador -- Configuração mais fácil - -**API Keys** -- Use para scripts e automação -- Sem necessidade de login no navegador -- Melhor para servidores e CI/CD - -## Criando uma API Key - -API keys são gerenciadas através das ferramentas MCP de gerenciamento ou da API. Ao criar uma API key, você especifica: - -1. Um nome descritivo (como "Meu Script de Automação") -2. Permissões diretas no formato `{ resource: [actions...] }` — onde o recurso é `"self"` para ferramentas de gerenciamento ou `"conn_"` para acesso específico a conexões -3. **Copie a chave imediatamente** — ela só é exibida uma vez - - - Você só pode ver a API key uma vez. Armazene em um lugar seguro como um gerenciador de senhas. - - -## Usando Sua API Key - -Adicione a API key na configuração do seu cliente MCP: - -```json -{ - "mcpServers": { - "deco": { - "url": "https://studio.decocms.com/api/your-org-slug/mcp/gateway/your-agent-id", - "transport": "http", - "headers": { - "Authorization": "Bearer mcp_key_abc123..." - } - } - } -} -``` - -Substitua `your-org-slug` pelo slug da sua organização e `your-agent-id` pelo id do agent. Veja a referência [Connection Proxy](/pt-br/studio/api-reference/connection-proxy) para o esquema completo de paths. - -## Boas Práticas de Segurança - - - Trate API keys como senhas. Nunca compartilhe ou faça commit em repositórios de código. - - -**Conceda permissões mínimas**: Dê apenas o que é realmente necessário. - -**Crie chaves separadas**: Use uma chave por ferramenta ou script — mais fácil de gerenciar se algo der errado. - -**Armazene com segurança**: Mantenha chaves em um gerenciador de senhas ou gerenciador de segredos, nunca em arquivos de texto simples. - -**Faça rotação regularmente**: Crie novas chaves a cada poucos meses e exclua as antigas. - -**Monitore o uso**: Verifique o dashboard regularmente para atividades incomuns. - - - Combine API keys com [Agentes](/pt-br/studio/agents) para controlar exatamente quais ferramentas seus scripts podem acessar. - diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/api-reference/connection-proxy.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/api-reference/connection-proxy.mdx deleted file mode 100644 index 2019cd92df..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/api-reference/connection-proxy.mdx +++ /dev/null @@ -1,317 +0,0 @@ ---- -title: Endpoint Connection Proxy -description: Conecte clientes MCP diretamente a servidores MCP upstream através do deco Studio -icon: Network ---- - -import Callout from "../../../../../components/ui/Callout.astro"; - -## Visão geral - -O endpoint **Connection Proxy** permite que clientes MCP (como Cursor, Claude Desktop ou aplicações customizadas) se conectem diretamente a um servidor MCP upstream específico através do deco Studio. Esse endpoint atua como um proxy seguro e observável que lida com autenticação, autorização, gerenciamento de credenciais e monitoramento. - -## Endpoint - -O caminho canônico é escopado por organização: - -``` -POST https://your-studio-instance.com/api/:org/mcp/:connectionId -``` - - - A forma legada sem escopo `POST /mcp/:connectionId` ainda funciona, mas emite um log de deprecação a cada requisição e será removida. Atualize os clientes para o caminho `/api/:org/...`. - - -### Parâmetros de path - -| Parâmetro | Tipo | Obrigatório | Descrição | -|-----------|------|----------|-------------| -| `org` | `string` | Obrigatório | Slug da organização — imutável durante toda a vida da org | -| `connectionId` | `string` (UUID) | Obrigatório | Identificador único da connection para a qual as requisições serão encaminhadas | - -## Autenticação - -O Connection Proxy requer autenticação usando uma das opções: - -- **OAuth Bearer Token**: `Authorization: Bearer ` -- **API Key**: `Authorization: Bearer ` - -Quando não autenticado, o endpoint retorna uma resposta `401` com um header `WWW-Authenticate` contendo metadados de descoberta OAuth: - -```http -HTTP/1.1 401 Unauthorized -WWW-Authenticate: Bearer realm="mcp",resource_metadata="https://your-studio-instance.com/api/:org/mcp/:connectionId/.well-known/oauth-protected-resource" -``` - - - Clientes que suportam OAuth 2.1 podem usar a URL de resource metadata para descobrir endpoints de autorização e completar o fluxo OAuth automaticamente. - - -## Como funciona - -Quando um cliente envia uma requisição MCP através do Connection Proxy: - -1. **Autenticação**: o deco Studio verifica as credenciais do cliente (token OAuth ou API key) -2. **Busca da connection**: o deco Studio recupera a configuração da connection e verifica se está ativa -3. **Autorização**: o deco Studio verifica se o cliente tem permissão para invocar a tool solicitada -4. **Injeção de credenciais**: o deco Studio descriptografa as credenciais armazenadas e as injeta na requisição upstream -5. **Encaminhamento da requisição**: o deco Studio encaminha a requisição MCP para o servidor upstream -6. **Monitoramento**: o deco Studio registra métricas (duração, status, erros) para observabilidade -7. **Retorno da resposta**: o deco Studio retorna a resposta do servidor upstream ao cliente - -## Formato da requisição - -O Connection Proxy aceita requisições padrão do protocolo MCP. O corpo da requisição deve ser uma mensagem JSON-RPC 2.0 seguindo a especificação MCP. - -### Exemplo: listar tools - -```json -{ - "jsonrpc": "2.0", - "id": 1, - "method": "tools/list" -} -``` - -### Exemplo: chamar tool - -```json -{ - "jsonrpc": "2.0", - "id": 2, - "method": "tools/call", - "params": { - "name": "github_create_issue", - "arguments": { - "repo": "myorg/myrepo", - "title": "Bug report", - "body": "Description of the bug" - } - } -} -``` - -## Formato da resposta - -As respostas seguem o formato padrão do protocolo MCP: - -### Resposta de sucesso - -```json -{ - "jsonrpc": "2.0", - "id": 2, - "result": { - "content": [ - { - "type": "text", - "text": "Issue created successfully: #123" - } - ] - } -} -``` - -### Resposta de erro - -```json -{ - "jsonrpc": "2.0", - "id": 2, - "error": { - "code": -32603, - "message": "Tool execution failed" - } -} -``` - -## Autorização - -O Connection Proxy aplica autorização granular usando o sistema de permissões do deco Studio: - -- **Permissões por tool**: usuários precisam ter permissão explícita para cada tool que invocam -- **Escopo por connection**: as permissões são escopadas para a connection específica -- **Baseadas em papéis**: as permissões são herdadas dos papéis do usuário e das configurações da organização - -### Formato das permissões - -As permissões são armazenadas no formato: - -```json -{ - "": ["tool_name_1", "tool_name_2"] -} -``` - -### Tools públicas - -Tools podem ser marcadas como públicas usando metadados: - -```json -{ - "_meta": { - "mcp.studio": { - "public_tool": true - } - } -} -``` - -Tools públicas permitem acesso não autenticado e ignoram as verificações de autorização. -A chave legada de metadados `mcp.mesh` continua sendo aceita por compatibilidade. - -## Respostas de erro - -| Código de status | Descrição | Cenário de exemplo | -|-------------|-------------|------------------| -| `401` | Unauthorized | Nenhum token OAuth ou API key válido fornecido | -| `403` | Forbidden | O usuário não tem permissão para invocar a tool solicitada | -| `404` | Not Found | O Connection ID não existe ou o usuário não tem acesso | -| `500` | Internal Server Error | Erro inesperado durante o processamento da requisição | -| `503` | Service Unavailable | A connection está inativa ou o servidor upstream está inacessível | - -## Monitoramento e observabilidade - -Cada requisição pelo Connection Proxy gera: - -### Métricas - -- **Histogramas de duração**: `connection.proxy.duration` -- **Contadores de requisição**: `connection.proxy.requests` -- **Contadores de erro**: `connection.proxy.errors` - -Todas as métricas incluem labels: -- `connection.id`: o UUID da connection -- `tool.name`: a tool sendo invocada -- `status`: success ou error - -### Traces - -Spans OpenTelemetry são criados para: -- `mcp.proxy.callTool`: invocações de tool - -Os traces incluem atributos: -- `connection.id`: identificador da connection -- `tool.name`: nome da tool -- `request.id`: identificador único da requisição - -## Opções de configuração - -Connections podem ser configuradas com: - -### Timeout - -O timeout padrão para chamadas de tool é de **5 minutos** (300.000ms). Pode ser ajustado por connection com base nas características de execução da tool. - -### Headers customizados - -Connections podem incluir headers HTTP customizados para autenticação ou roteamento: - -```json -{ - "connection_headers": { - "headers": { - "X-Custom-Header": "value" - } - } -} -``` - -## Casos de uso - -### Acesso direto via MCP - -Conecte o Cursor ou o Claude Desktop diretamente a um MCP upstream específico: - -**Configuração no Cursor:** -```json -{ - "mcpServers": { - "github-production": { - "url": "https://studio.example.com/api/my-org/mcp/conn_abc123", - "headers": { - "Authorization": "Bearer YOUR_API_KEY" - } - } - } -} -``` - -### Clientes específicos por tool - -Construa clientes customizados que precisam acessar as tools de um servidor MCP específico sem passar por um agent: - -```typescript -const response = await fetch('https://studio.example.com/api/my-org/mcp/conn_abc123', { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer YOUR_API_KEY' - }, - body: JSON.stringify({ - jsonrpc: '2.0', - id: 1, - method: 'tools/call', - params: { - name: 'database_query', - arguments: { query: 'SELECT * FROM users LIMIT 10' } - } - }) -}); -``` - -### Isolamento multi-tenant - -Cada connection é escopada por organização, fornecendo isolamento natural entre tenants: - -``` -Organization A → conn_123 (GitHub Org A) → GitHub Tools (Org A only) -Organization B → conn_456 (GitHub Org B) → GitHub Tools (Org B only) -``` - -## Estados da connection - -Connections têm um campo `status` que afeta o comportamento do proxy: - -- **`active`**: a connection está pronta para encaminhar requisições -- **`inactive`**: a connection está desabilitada; o proxy retorna erro `503` -- **`error`**: a connection tem problemas de configuração; o proxy pode falhar - -## Considerações de segurança - -### Tratamento de credenciais - -- **Criptografadas em repouso**: credenciais são armazenadas criptografadas usando AES-256-GCM -- **Descriptografadas just-in-time**: credenciais só são descriptografadas no momento do proxy da requisição -- **Nunca expostas aos clientes**: clientes nunca recebem as credenciais upstream - -### Validação de requisição - -- **Validação de schema**: argumentos de tool são validados contra schemas de entrada -- **Rate limiting**: (Planejado) limites de taxa por connection e por usuário -- **Audit logging**: todas as invocações de tool são registradas com a identidade do usuário - -### Segurança de rede - -- **TLS obrigatório**: todas as conexões com servidores upstream usam HTTPS -- **Validação de certificado**: certificados SSL são validados por padrão -- **Proxy headers**: servidores upstream recebem requisições autenticadas com credenciais - -## Comparação com outros endpoints - -| Endpoint | Caso de uso | Tools disponíveis | -|----------|----------|-----------------| -| `/api/:org/mcp/:connectionId` | Acesso direto a um MCP upstream | Apenas tools daquela connection | -| `/api/:org/mcp/gateway/:virtualMcpId` | Conjunto curado de tools para um agent (também conhecido como virtual MCP) | Tools de múltiplas connections, compostas | -| `/api/:org/mcp/self` | Operações de gerenciamento | Apenas tools de gerenciamento do deco Studio | - - - Para a maioria dos casos de uso em produção, use **Agents** (`/api/:org/mcp/gateway/:virtualMcpId`) em vez de connection proxies diretos. Agents permitem controlar quais tools são expostas e compor tools de múltiplas connections atrás de um único endpoint. - - -## Relacionados - -- [**Connections**](/pt-br/studio/connections) - Entendendo a abstração Connection -- [**Agents**](/pt-br/studio/agents) - Componha tools de múltiplas connections em um único endpoint -- [**API Keys**](/pt-br/studio/api-keys) - Configuração de autenticação -- [**Monitoring**](/pt-br/studio/monitoring) - Observabilidade e métricas diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/api-reference/external-agent-integration.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/api-reference/external-agent-integration.mdx deleted file mode 100644 index 96c4d97e34..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/api-reference/external-agent-integration.mdx +++ /dev/null @@ -1,160 +0,0 @@ ---- -title: Chame um agent a partir do seu app -description: Controle um agent do Studio a partir de um sistema externo com uma API key escopada — crie uma thread, execute o agent, faça stream da resposta e leia a thread de volta -icon: MessageCircle ---- - -import Callout from "../../../../../components/ui/Callout.astro"; - -## Visão geral - -Você pode controlar qualquer agent do Studio a partir de um sistema externo — o -backend de um chatbot, um handler de webhook, um job de CRON — usando uma **API -key** escopada sobre HTTP puro. O fluxo é o mesmo que o client web do Studio usa: - -1. **Crie uma thread** para o agent. -2. **Poste uma mensagem** para enfileirar uma execução. -3. **Faça stream** da resposta do agent em tempo real. -4. **Leia a thread completa** depois, a partir do armazenamento durável. - -Nenhum SDK é necessário — cada passo é uma requisição HTTP normal autenticada com -`Authorization: Bearer `. - -## Crie a API key - -A forma mais rápida é pelo diálogo **Connect** do agent → **Call from your app** → -**Create API key**. Ele gera uma key escopada exatamente para as tools que este -fluxo precisa e a exibe uma única vez. - -Para criá-la programaticamente, chame a tool `API_KEY_CREATE` com estas -permissões: - -```json -{ - "name": "chat-bridge-my-agent", - "permissions": { - "self": [ - "COLLECTION_THREADS_CREATE", - "COLLECTION_THREADS_GET", - "COLLECTION_THREAD_MESSAGES_LIST", - "COLLECTION_THREADS_LIST" - ] - }, - "expiresIn": 7776000 -} -``` - -| Campo | Tipo | Notas | -|-------|------|-------| -| `name` | `string` | Rótulo legível por humanos | -| `permissions` | `{ [resource]: string[] }` | `self` contém as tools de gerenciamento acima | -| `expiresIn` | `number` | Tempo de vida em **segundos** (aqui, 90 dias). Omita para não expirar | - - - `expiresIn` é um **número** de segundos, não uma string. O valor da key é - retornado apenas uma vez, na criação — armazene-o imediatamente. - - -Os endpoints de execução e stream abaixo exigem apenas que a key pertença a um -membro da org, então nenhuma concessão escopada por connection é necessária. As -permissões `self` são apenas o que as **tools** de leitura/escrita da thread -exigem. - -## Endpoints - -Todos os paths são escopados por org, onde `:org` é o **slug** da sua organização. - -| Passo | Método e path | -|------|---------------| -| Criar thread | `POST /api/:org/tools/COLLECTION_THREADS_CREATE` | -| Executar agent | `POST /api/:org/decopilot/threads/:threadId/messages` | -| Stream | `GET /api/:org/decopilot/threads/:threadId/stream` | -| Ler thread | `POST /api/:org/tools/COLLECTION_THREAD_MESSAGES_LIST` | -| Status da thread | `POST /api/:org/tools/COLLECTION_THREADS_GET` | - -### 1. Crie uma thread - -O `virtual_mcp_id` é o id do agent (Virtual MCP) — encontre-o na URL do agent ou -via `COLLECTION_CONNECTIONS_LIST`. - -```bash -curl -X POST "$STUDIO_BASE_URL/api/$STUDIO_ORG/tools/COLLECTION_THREADS_CREATE" \ - -H "Authorization: Bearer $STUDIO_API_KEY" \ - -H "Content-Type: application/json" \ - -d '{ "data": { "title": "Support chat", "virtual_mcp_id": "'"$STUDIO_AGENT_ID"'" } }' -# → { "item": { "id": "thrd_...", "status": "...", ... } } -``` - -Use o `item.id` retornado como `:threadId` nos próximos passos. (Você também pode -fornecer seu próprio `data.id`.) - -### 2. Execute o agent - -Isto enfileira uma execução e retorna `202` imediatamente — o corpo não carrega -nenhum output. - -```bash -curl -X POST "$STUDIO_BASE_URL/api/$STUDIO_ORG/decopilot/threads/$THREAD_ID/messages" \ - -H "Authorization: Bearer $STUDIO_API_KEY" \ - -H "Content-Type: application/json" \ - -d '{ - "messages": [{ "role": "user", "parts": [{ "type": "text", "text": "Hello!" }] }], - "agent": { "id": "'"$STUDIO_AGENT_ID"'" }, - "tier": "smart" - }' -# → 202 { "taskId": "thrd_..." } -``` - - - O corpo da requisição é validado de forma estrita — envie apenas `messages`, - `agent` e os opcionais `tier` / `temperature`. Exatamente uma mensagem não-system - é permitida por chamada. O id da thread fica na URL; não coloque também um - `thread_id` divergente no corpo. - - -### 3. Faça stream da resposta - -O output do agent é um stream de [Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) -(chunks de UI-message do AI SDK), suportado por NATS JetStream no lado do servidor. - -```bash -curl -N "$STUDIO_BASE_URL/api/$STUDIO_ORG/decopilot/threads/$THREAD_ID/stream" \ - -H "Authorization: Bearer $STUDIO_API_KEY" \ - -H "Accept: text/event-stream" -``` - - - Abra o stream **antes** de postar a mensagem, para não perder os primeiros - chunks. O `EventSource` nativo do navegador não consegue enviar um header - `Authorization` — use `fetch()` e leia o corpo da resposta como um stream. - - - - O stream é um buffer ao vivo efêmero (~5 minutos de retenção), não o sistema de - registro. Para o transcript durável, leia a thread (passo 4). - - -### 4. Leia a thread de volta - -O transcript autoritativo e durável fica disponível a qualquer momento: - -```bash -curl -X POST "$STUDIO_BASE_URL/api/$STUDIO_ORG/tools/COLLECTION_THREAD_MESSAGES_LIST" \ - -H "Authorization: Bearer $STUDIO_API_KEY" \ - -H "Content-Type: application/json" \ - -d '{ "thread_id": "'"$THREAD_ID"'", "limit": 200 }' -``` - -Acompanhe o progresso da execução com `COLLECTION_THREADS_GET` -(`{ "id": "" }`) e observe `status` mover de `in_progress` para -`completed` ou `failed`. - -## Escopo e segurança - -- Uma key é vinculada a uma única organização (embutida na criação). O `:org` no - path deve corresponder ao slug daquela org. -- As permissões `self` da thread controlam o acesso às **tools** de - leitura/escrita, mas os endpoints de execução e stream autorizam apenas com base - na associação à org — então qualquer key válida da org pode controlar agents. - Trate essas keys como qualquer credencial de produção: nomeie-as por integração, - defina uma expiração e faça rotação deletando (`API_KEY_DELETE`) e recriando. diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/architecture.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/architecture.mdx deleted file mode 100644 index 77ba19c0b7..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/architecture.mdx +++ /dev/null @@ -1,151 +0,0 @@ ---- -title: "Arquitetura" -description: Como o Studio é conectado de ponta a ponta — edge, cloud cluster e desktop — e como requests, runs e sandboxes fluem entre as camadas. -icon: Network ---- - -import Callout from "../../../../components/ui/Callout.astro"; -import ArchitectureDiagram from "../../../../components/ArchitectureDiagram.astro"; - -Esta página descreve como um deployment do Studio em execução é montado: as camadas, o que cada uma faz e como um request vira um run de agent, uma chamada de tool ou um preview de sandbox. É um bom material de fundo tanto se você faz self-host quanto se usa a cloud, e é o complemento conceitual dos guias de deploy de [Kubernetes](/pt-br/studio/self-hosting/deploy/kubernetes) e [Docker Compose](/pt-br/studio/self-hosting/deploy/docker-compose). - -## As três camadas - -O Studio abrange três fronteiras de confiança/localidade: - -- **Edge** — o caminho da internet pública: um CDN e um load balancer L4. -- **Cloud cluster** — o deployment no Kubernetes: web, API, workers, Postgres, NATS e cloud sandboxes. -- **Desktop** — a app nativa do Studio no laptop do usuário, onde o `local-api` embutido gerencia coding harnesses nativos e sandboxes locais. - - - -O mesmo fluxo em texto: - -``` -EDGE CLOUD CLUSTER DESKTOP -──── ───────────── ─────── - -Client ─▶ CF ─┬─▶ NLB ─▶ Web(nginx) ─▶ API ──┬─▶ MCP Proxy ─▶ Downstream MCP (ext) - │ ├─▶ Files/Storage ─▶ Object Store (ext) - │ ├─▶ DB (Postgres) - │ ├─▶ NATS - │ └─▶ Worker ─┬─▶ LLM - │ ├─▶ Downstream MCP (in-process bridge) - │ └─▶ AgentSandbox ─┬─ Daemon API (/_sandbox/*) - │ └─ Org FS (sidecar) ─▶ /api/:org/fs ─▶ S3 - └─▶ Gateway (k8s) ─▶ Preview (public dev-server) - -Desktop app ─▶ local-api ─┬─▶ Studio API (dados upstream e MCP) - ├─▶ Claude Code / Codex / OpenCode - └─▶ Desktop Sandbox ─▶ Org FS (mount) -``` - -## Edge - -| Componente | Função | -| --- | --- | -| **CF** (Cloudflare) | Terminação TLS, cache estático da SPA, mitigação de DDoS/bots. Primeiro salto de todo o tráfego. | -| **NLB** | Load balancer L4 na frente do cluster. Roteia para os pods de web (front-door); o seletor `frontDoorLabels` decide quais pods recebem o ingress. | - -## Cloud cluster - -### Web, API e Worker escalam de forma independente - -Esses três deployments são separados e escalam por conta própria. A camada de web foi separada da API (o "front-door split") para que o front door estático possa fazer deploy e escalar em uma cadência diferente da do application server. - -| Camada | Deployment | Responsabilidade | -| --- | --- | --- | -| **Web** | nginx | Serve a SPA em React e faz reverse-proxy de `/api`, `/mcp`, `/oauth-proxy`, `/.well-known` para o Service da API. Porta 8080. | -| **API** | Hono, `STUDIO_DISPATCH_ROLE=api` | Rotas HTTP, Better Auth, o MCP proxy, controle de acesso. **Enfileira** runs do Decopilot nas queues do DBOS e acompanha o NATS para fazer streaming do output de volta para a UI. Stateless. **Não roda o agent loop.** | -| **Worker** | Hono, `STUDIO_DISPATCH_ROLE=worker` | **Desenfileira** as queues do DBOS (via `listenQueues`) e **roda o agent loop** (`streamText`: model → tool → repete). Limitado por CPU. São os executores de run; escalam horizontalmente. | - - - A separação é por role, não por imagem — ambos rodam o mesmo build. `STUDIO_DISPATCH_ROLE` decide se um pod escuta as queues do DBOS (`worker`) ou apenas serve HTTP e enfileira (`api`). Um setup de deployment único pode usar `all`. - - -O conjunto de queues que um pod worker escuta é configurado por env (`listenQueues`). Por isso, os pools de workers podem ser separados por queue do DBOS — rodando workflows diferentes em pools separados com seus próprios recursos e escalonamento. - -### Datastores - -| Componente | Função | -| --- | --- | -| **DB** (PostgreSQL, via Kysely) | Sistema de registro: orgs, connections, credential vault, audit, threads + mensagens e `sandbox_runner_state`. Também mantém as **queues do DBOS e o journal `workflow_status`** que tornam os runs duráveis e recuperáveis. | -| **NATS** | Infraestrutura de mensageria ao vivo com três tarefas: (1) o log de runs com fencing no JetStream (`decopilot.stream.`), usado por `/stream` e pelo projector durável; (2) broadcasts de cancelamento de runs entre pods; (3) estado em JetStream KV compartilhado entre réplicas para caches de listas MCP e circuit breakers de connections. | - -## O ciclo de vida de um run do Decopilot - -1. Uma mensagem (`POST /messages`) ou o disparo de uma automation cria um **run** em uma thread. -2. A **API** o enfileira em uma queue do DBOS no Postgres: - - `THREAD_GATE_QUEUE` — serializada por thread (concorrência 1 por `threadId`). - - `AUTOMATIONS_QUEUE` — particionada por org, então uma org saturada só bloqueia a própria partição. -3. Um **Worker** desenfileira o gate workflow e inicia um child workflow hosted. Runs in-process do Decopilot usam `HOSTED_HARNESS_QUEUE`; runs de Claude Code hosted na sandbox usam `HOSTED_HARNESS_SANDBOXED_QUEUE`. O gate pai não espera o child — ele acompanha (live-tail) o mesmo stream do NATS que o child publica, enquanto o projector durável escreve mensagens e o status terminal. -4. Os chunks de output são publicados no NATS e acompanhados de volta para a UI via `/stream`. -5. Se o pod cair, o **replay do journal do DBOS** retoma os steps retriáveis em outro pod — a recuperação é trabalho do framework, não feito à mão. - -Os dois caminhos são hosted e usam o provider fixo **AgentSandbox** do Studio quando precisam de uma sandbox: - -- **Decopilot** roda seu model loop in-process no worker e acessa a sandbox gerenciada para operações de repositório, filesystem, Git e shell. -- **Claude Code** roda seu harness loop dentro da sandbox gerenciada; o worker encaminha seu stream para o mesmo pipeline de NATS e projector. - -Chats de coding agents nativos são uma superfície separada. A app desktop roda Claude Code, Codex ou OpenCode localmente e sincroniza a thread por meio do `local-api` embutido. - -## MCP: in-process vs. as rotas de proxy - -Essa distinção importa para raciocinar sobre o sistema: - -- **O worker chama tools de MCP in-process.** O agent loop monta um `PassthroughClient` sobre um bridge em memória e chama as tools diretamente — **sem salto HTTP dentro do cluster**. Ele ainda se conecta para fora a downstream MCP servers. -- **As rotas do MCP proxy são para clients externos.** `/mcp/virtual-mcp/:id`, `/mcp/:connectionId`, `/oauth-proxy/*` e `/.well-known` são servidas pela **API** para IDEs externas (Cursor, Claude, VS Code). O worker não usa essas rotas. - -### Quais rotas são chamadas por quem - -| Rotas | API / externo | Worker | -| --- | --- | --- | -| MCP proxy (`/mcp/*`, `/oauth-proxy/*`, `.well-known`) | ✅ clients externos via API | ❌ (in-process no lugar) | -| File & object-storage (`/api/:org/files/*`, GET/PUT presigned, uploads, `/api/:org/fs/*`) | ✅ servindo clients | ✅ tools de agent leem/escrevem arquivos e geram presigned URLs | -| Apenas worker via HTTP | — | nenhuma — as chamadas de tool são in-process | - -As rotas de file e object-storage são a verdadeira superfície "chamada por ambos", e são respaldadas por um **Object Store** compatível com S3. As rotas `/api/:org/fs/*` também dão suporte ao [mount do org-filesystem](#org-filesystem-org-fs) dentro das sandboxes. - -## Sandboxes - -Uma AgentSandbox hosted clona o repo, roda o dev server e expõe um **daemon** in-pod. Sua superfície HTTP se divide em duas: - -| Superfície | Auth | Propósito | Quem chama | -| --- | --- | --- | --- | -| **Preview** (catch-all `*`) | Nenhuma — o handle (subdomínio) é o segredo | Faz reverse-proxy do dev server em execução (o preview ao vivo da app); injeta HMR. `/_sandbox/*` é ativamente rejeitado aqui. | O navegador do usuário final em `.preview.`, através do **Cloudflare** (LB) → um **Kubernetes Gateway** (Istio Gateway API / HTTPRoute) → o daemon | -| **Daemon API** (`/_sandbox/*`) | Bearer `DAEMON_TOKEN` | Superfície de controle: operações de fs (read/write/edit/bash/grep), git (status/diff/publish), exec de scripts, setup (clone → install → start), tasks, eventos SSE, dispatch do harness. | O cluster (worker para as tools de fs/git/bash do agent; API para setup + eventos da UI) | - -### Cloud vs. desktop sandboxes - -| | Cloud sandbox | Desktop sandbox | -| --- | --- | --- | -| Onde | operador agent-sandbox + um pod `SandboxClaim` por (user, projectRef) | O `local-api` e o `SandboxManager` da app nativa, com um worktree local por handle | -| Acessado via | port-forward do k8s / Service in-cluster (controle); ingress ou port-forward (preview) | interceptação em loopback; `.localhost:` (preview) | -| Dono do roteamento | A API hosted do Studio sempre usa AgentSandbox e reporta `agent-sandbox` | A app nativa intercepta localmente as mesmas chamadas de lifecycle/filesystem e reporta `local-api` | - -### Org filesystem (org-fs) - -Cada sandbox pode montar o **org filesystem**, para que o agent e o dev server leiam e escrevam arquivos da org como paths absolutos comuns: `/app/org/` em um sandbox na nuvem, e um diretório `org/` ao lado da worktree em um sandbox desktop. Em ambos os casos ele fica fora do repositório, para que os file watchers do dev server nunca o percorram. A stack de mount é `rclone (NFS/FUSE) → o WebDAV de loopback do daemon → /api/:org/fs/* → S3` — o mesmo object store das rotas de arquivo, exposto como um volume montado. É o mesmo filesystem que você navega na [Library](/pt-br/studio/library). - -Ele é conectado em **ambas** as superfícies, com mecânicas de mount diferentes: - -| | Cloud sandbox | Desktop sandbox | -| --- | --- | --- | -| Quem monta | um container **sidecar privilegiado** (o daemon não-privilegiado não consegue montar) | o `local-api` diretamente na máquina do usuário | -| Entrega da config | pós-bind: Studio `POST /_sandbox/orgfs-config`; o daemon a repassa para um control volume compartilhado que o sidecar observa (claims do warm-pool rejeitam `spec.env`) | o runtime nativo resolve os volumes da org e mantém o mount local | -| Propagação | `rclone` com `allowOther` para que o mount se propague ao container principal | client único — sem necessidade de propagação | - -## Desktop - -A app nativa do Studio embute a UI de produção e um **`local-api`** em Axum na mesma origin autenticada de loopback. O `local-api` encaminha dados compartilhados e tráfego MCP para o upstream, mas termina no laptop as rotas exclusivas de thread, harness, sandbox, filesystem, Git, task, terminal e preview. Ele inicia o CLI do Claude Code, Codex ou OpenCode do usuário no worktree local da thread e persiste o estado nativo de threads e sandboxes no SQLite. - -O roteamento do provider segue a superfície que recebe o request, e não uma opção do request: chamadas de lifecycle do browser chegam à API hosted e ao AgentSandbox; as mesmas chamadas feitas pela webview nativa são interceptadas pelo `local-api` e operam na sandbox `local-api`. Assim, os registros hosted e desktop continuam distinguíveis sem expor um seletor de provider aos callers. - -## Em resumo - -- **Web / API / Worker** são deployments independentes; os workers são os executores de run do DBOS. -- **Os runs são duráveis** via queues + journal do DBOS no Postgres; a recuperação é automática. -- **As chamadas de tool de MCP são in-process** no worker; as rotas de proxy `/mcp/*` são apenas para clients externos. -- **As rotas de file/object-storage** são a superfície compartilhada entre API e worker. -- **O NATS dá suporte a streaming e coordenação entre pods.** -- **O roteamento de sandbox pertence à superfície**: o Studio hosted usa AgentSandbox; a app nativa intercepta localmente e registra `local-api`. diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/automations.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/automations.mdx deleted file mode 100644 index a96d62741a..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/automations.mdx +++ /dev/null @@ -1,84 +0,0 @@ ---- -title: Automations -description: Execute um agent em um schedule ou em resposta a um evento — sem um humano no loop -icon: Zap ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -## O que é uma automation? - -Uma **automation** é uma execução de agent que acontece sozinha — em um schedule, ou quando algo ocorre em um serviço conectado. Ninguém precisa estar observando. O agent executa, faz seu trabalho, e o resultado aparece no [Monitoring](/pt-br/studio/monitoring). - -Toda automation pertence a um [agent](/pt-br/studio/agents) específico. Ela executa *aquele* agent com *as* tools dele — a automation apenas decide quando disparar e com qual prompt começar. - -Cada automation tem: - -- **Um agent** — o que faz o trabalho -- **Um prompt** — o que ele deve fazer a cada execução -- **Um model** — qual AI provider e credenciais usar -- **Um trigger** — quando dispara (schedule, evento ou webhook) - - - Automations aprovam todas as chamadas de tool automaticamente — não há etapa de revisão humana. Anexe apenas as tools que o agent realmente precisa, para que ele não possa fazer mais do que você pretende. - - -## Onde elas vivem - -Você gerencia automations em dois lugares: - -- **Dentro de um agent** — abra o agent e clique na aba **Automations**. Você verá as automations anexadas a este agent específico, e pode criar novas em contexto. -- **Settings → Automations** — a lista, em toda a org, de cada automation de cada agent, útil para visão geral, auditoria ou organização. - -## Quando usar automations - -- **Tarefas agendadas** — relatórios diários, sincronizações de dados, jobs de limpeza -- **Fluxos orientados a eventos** — novo pedido → iniciar fulfillment, novo ticket → triagem, deploy → enviar notificação -- **Qualquer coisa que deva rodar sem alguém disparando manualmente** - -Se você quer um humano no loop — revisando ações antes de acontecerem — abra o agent e converse com ele diretamente, ou use o [Decopilot](/pt-br/studio/decopilot/overview). Automations são para trabalho que você já validou e quer rodar hands-free. - -## Criando uma automation - -1. Abra o agent que você quer executar -2. Clique na aba **Automations** -3. Clique em **New automation** -4. Escreva o prompt — o que o agent deve fazer a cada execução? -5. Escolha um model e credenciais -6. Adicione um trigger (schedule, evento ou webhook) -7. Ative-a - -## Triggers - -### Schedule - -Executa a automation em um schedule recorrente. Os horários são em UTC. - -| Expressão | Quando executa | -|---|---| -| `0 9 * * *` | Todo dia às 9:00 | -| `0 */6 * * *` | A cada 6 horas | -| `0 9 * * 1` | Toda segunda-feira às 9:00 | -| `*/5 * * * *` | A cada 5 minutos | - -O intervalo mínimo é de 5 minutos — `*/5 * * * *` é o schedule mais apertado permitido. Se o sistema reiniciar, execuções perdidas são detectadas e disparadas no próximo ciclo. - -### Event - -Dispara quando um serviço conectado publica um evento correspondente. Você especifica a connection, o tipo de evento e filtros opcionais — apenas eventos que correspondem a todos os filtros disparam a automation. - -### Webhook - -Dispara quando um sistema externo envia uma requisição HTTP para uma URL dedicada. Quando você adiciona um trigger de webhook, o Studio gera uma URL de uso único e um token secreto (exibido uma vez) — faça POST nessa URL para executar a automation. Você pode fazer rotação do token caso ele seja exposto. - -## Limites - -- Máximo de 10 execuções de automation em toda a sua organização ao mesmo tempo -- Cada execução expira após 5 minutos -- Payloads de evento são limitados a 1 MB - -Se a pessoa que criou uma automation sai da organização, ela é automaticamente desativada. - ---- - -**A seguir:** Desenhe o que sua automation vai executar em [Agents](/pt-br/studio/agents), ou acompanhe resultados no [Monitoring](/pt-br/studio/monitoring). diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/buckets.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/buckets.mdx deleted file mode 100644 index 027c442524..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/buckets.mdx +++ /dev/null @@ -1,118 +0,0 @@ ---- -title: Buckets -description: Conecte seu próprio bucket compatível com S3 para assets do CMS — e as permissões IAM que ele precisa -icon: HardDrive ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -## O que são buckets? - -Um **bucket** é um object store compatível com S3 que você conecta ao Studio para guardar **assets do CMS** — os arquivos que você envia e referencia no conteúdo que constrói (imagens, slides, decks). Você configura buckets no nível da org em **Settings → Buckets**, e as credentials são criptografadas em repouso e nunca retornadas pela API. - - -Este é o bucket que **você** traz e configura na UI, usado apenas para assets do CMS. Ele **não** é o object store que lastreia o sistema de arquivos da org (org-fs) em um deployment self-hosted — esse é configurado via variáveis de ambiente no deployment, não aqui. Esta página é sobre o bucket configurado pelo usuário. - - -O Studio funciona com qualquer provider compatível com S3: - -| Provider | Endpoint | Force path-style | -|---|---|---| -| **AWS S3** | deixe em branco (padrão) | desligado | -| **Cloudflare R2** | `https://.r2.cloudflarestorage.com` | desligado | -| **Google Cloud Storage** | `https://storage.googleapis.com` | **ligado** | -| **MinIO** | a URL do seu MinIO | normalmente **ligado** | - -## Adicionando um bucket - -Clique em **Add bucket** e preencha: - -| Campo | Obrigatório | Observações | -|---|---|---| -| **Name** | ✅ | Letras, dígitos, underscore, ponto, hífen. Único dentro da org. | -| **Bucket** | ✅ | O nome do bucket. | -| **Region** | ✅ | ex: `us-east-1`. | -| **Endpoint** | — | Obrigatório para providers não-AWS (R2, GCS, MinIO). Deixe em branco para AWS. | -| **Force path-style URLs** | — | Obrigatório para GCS e a maioria dos setups MinIO. | -| **Key prefix** | — | Todas as chaves de objeto são gravadas sob esse prefixo — útil para buckets multi-tenant ou credentials com escopo em um sub-caminho. A barra final é adicionada automaticamente. | -| **Public URL base** | — | Host usado para montar as URLs públicas retornadas para cada asset (domínio dev do R2, CDN, host customizado). Deixe em branco para usar o host S3 do bucket. | -| **Credentials** | ✅ | Um par de chaves estático, ou uma sessão temporária STS (veja abaixo). | - -### Tipos de credential - -- **Static key pair (long-lived)** — um `Access key ID` e um `Secret access key`, usados como estão. A escolha mais comum. -- **Temporary session (STS, auto-refreshed)** — armazena apenas uma URL de refresh endpoint e uma API key. As credentials de curta duração são buscadas sob demanda e renovadas automaticamente; nenhum secret S3 é armazenado. - -## Permissões IAM da AWS - -O Studio toca o bucket de apenas duas formas: ele faz **upload** de assets para ele e **lista** objetos para alimentar o seletor de assets. Ele nunca lê objetos de volta pelo servidor, nunca os deleta e nunca mexe na configuração do bucket. Então, para um bucket S3 da AWS conectado via **par de chaves estático**, o usuário (ou role) IAM por trás da access key precisa de muito pouco: - -| O que o Studio faz | Operação S3 | Ação IAM | -|---|---|---| -| Fazer upload de um asset (streaming via multipart para arquivos grandes) | `Upload` (multipart `PutObject`) | `s3:PutObject` | -| Limpar um upload multipart que falhou | `AbortMultipartUpload` | `s3:AbortMultipartUpload` | -| Listar objetos para o seletor de assets | `ListObjectsV2` | `s3:ListBucket` | - - -O Studio **não** lê os assets enviados de volta. O seletor e o seu CMS apontam para a **URL pública** de cada objeto (o `Public URL base` que você define, ou a URL S3 canônica do bucket), que o navegador busca diretamente. Por isso a credential do Studio **não** precisa de `s3:GetObject` — em vez disso, os objetos precisam ser publicamente legíveis (ou estar atrás de uma CDN) para que essas URLs resolvam. Isso é uma preocupação separada desta policy IAM: uma bucket policy / ACL de objeto / configuração de Block Public Access, ou uma CDN na frente. - - -### Política mínima - -```json -{ - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "StudioUploads", - "Effect": "Allow", - "Action": [ - "s3:PutObject", - "s3:AbortMultipartUpload" - ], - "Resource": "arn:aws:s3:::YOUR_BUCKET/*" - }, - { - "Sid": "StudioListBucket", - "Effect": "Allow", - "Action": "s3:ListBucket", - "Resource": "arn:aws:s3:::YOUR_BUCKET" - } - ] -} -``` - - -**`s3:ListBucket` é uma ação em nível de bucket** — o `Resource` dela é o ARN do bucket (`arn:aws:s3:::YOUR_BUCKET`), **sem** o sufixo `/*`. A ação de objeto (`s3:PutObject`, `s3:AbortMultipartUpload`) opera sobre objetos, então o `Resource` dela **termina** em `/*`. Apontar o `ListBucket` para o ARN com `/*` é a causa mais comum de `AccessDenied` ao listar. - - -### Escopando por prefixo (opcional) - -Se você definir um **Key prefix** no bucket, pode travar a credential somente nesse caminho: - -```json -{ - "Version": "2012-10-17", - "Statement": [ - { - "Sid": "StudioUploads", - "Effect": "Allow", - "Action": ["s3:PutObject", "s3:AbortMultipartUpload"], - "Resource": "arn:aws:s3:::YOUR_BUCKET/YOUR_PREFIX/*" - }, - { - "Sid": "StudioListBucket", - "Effect": "Allow", - "Action": "s3:ListBucket", - "Resource": "arn:aws:s3:::YOUR_BUCKET", - "Condition": { "StringLike": { "s3:prefix": ["YOUR_PREFIX/*"] } } - } - ] -} -``` - ---- - - -As credentials são armazenadas criptografadas no vault de credentials do Studio e nunca são retornadas pela API. Remover a configuração de um bucket apaga as credentials armazenadas — o bucket em si e seu conteúdo permanecem intactos. - diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/concepts.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/concepts.mdx deleted file mode 100644 index 6d24cc232e..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/concepts.mdx +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: Conceitos-chave -description: Como o deco Studio é organizado e como as peças se encaixam -icon: BookOpen ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -## Como o Studio é organizado - -O Studio usa um pequeno conjunto de conceitos que se constroem uns sobre os outros. Depois que você entende esses, todo o resto vem por consequência. - -- **Organization** — seu workspace de nível mais alto. Tudo pertence a uma org: members, agents, connections, automations e logs. -- **Agent** — uma IA configurada para um trabalho específico: um conjunto focado de tools, instruções claras e um propósito restrito. Agents são a superfície de trabalho do Studio. Veja [Agents](/pt-br/studio/agents). -- **Connection** — uma tool ou serviço que você plugou (GitHub, Slack, um banco de dados, sua própria API). As credenciais são armazenadas uma vez e compartilhadas com segurança. Veja [Connections](/pt-br/studio/connections). -- **Thread** — uma sessão de conversa dentro de um agent. O Studio salva o histórico para você poder voltar a um trabalho em andamento. -- **Automation** — uma execução de agent que dispara em um schedule ou em resposta a um evento. Veja [Automations](/pt-br/studio/automations). -- **AI Provider** — um modelo de IA configurado (Anthropic, Google, OpenRouter ou o Deco AI Gateway) que alimenta seus agents e o Decopilot. Veja [AI Providers](/pt-br/studio/ai-providers). -- **Member** — uma pessoa na sua organização com um role e permissões. - ---- - -## Anatomia da UI do Studio - -### Home e a sidebar - -Quando você abre o Studio, cai na **tela inicial**: um único campo de chat — _"O que você precisa?"_ — alimentado pelo **Decopilot**, o assistente nativo do Studio, além de um grid customizável de atalhos para seus agents. É só começar a digitar para iniciar; a conversa que você começa fica salva em **Decopilot** na sidebar. - -A sidebar fixa à esquerda é a mesma em qualquer lugar que você vá: - -- **Home** — o campo de chat da tela inicial. -- **Library** — um navegador de arquivos para o filesystem compartilhado da sua organização. Veja [Library](/pt-br/studio/library). -- **Threads** — suas conversas recentes, agrupadas por agent (as do Decopilot ficam em "Decopilot"). Clique em uma para retomá-la; comece uma nova pela Home ou pelo botão **+** / "Browse agents". -- **Settings** — abre a partir da parte de baixo da sidebar; tudo que não está atrelado a um único agent. - -### O workspace do agent - -Abra um agent — ou inicie uma thread com ele — e a tela se divide em duas: - -- **Esquerda — chat.** Converse com o agent em linguagem natural; ele usa as tools anexadas para fazer o trabalho. As mensagens anteriores ficam aqui. Acima do campo de entrada ficam o **model-tier picker** e o **runtime picker** (onde o agent roda — veja [Agents](/pt-br/studio/agents#onde-um-agent-roda)). -- **Direita — um painel com abas.** Quais abas aparecem depende do agent: - - **Settings** — instruções, connections anexadas, files & skills (exibido se você pode gerenciar agents) - - **Automations** — schedules e gatilhos de eventos (sempre disponível) - - **Preview** — um preview ao vivo, para agents baseados em um repo ou site - - **Content** — edite páginas e seções, para agents baseados em conteúdo - - **Review changes** — review de branch e PR, para agents Git-native com um pull request aberto - -Tudo que você precisa para usar, configurar e monitorar um único agent fica nessa mesma tela. Veja [Agents](/pt-br/studio/agents) para o detalhamento completo. - -### Settings - -Tudo que não está atrelado a um único agent fica em **Settings**. Abra a partir do canto inferior esquerdo da sidebar. Lá dentro você encontra: - -- **Organization** — General, Brand Context, AI Providers, Secrets, Buckets -- **Build** — Connections, Agents (o catálogo), Automations, Store -- **Manage** — Monitor, Members, Roles, Security (SSO) -- **Extensions** — Plugins -- **Account** — Profile & Preferences - -Quando outras páginas destes docs dizem "vá em Connections" ou "abra o Monitor", elas se referem a essas seções de Settings. - ---- - -## Como o protocolo funciona - -O deco Studio é construído sobre o [Model Context Protocol](https://modelcontextprotocol.io/) (MCP), um padrão aberto para conectar clients de IA a tools e serviços. Você não precisa entender o MCP para usar o Studio, mas conhecer os três blocos de construção ajuda: - -- **Tools** — ações que uma IA pode executar (buscar em um banco de dados, enviar um email, criar um arquivo) -- **Resources** — fontes de dados somente leitura que dão contexto a uma IA (documentos, configs, dados da org) -- **Prompts** — templates reutilizáveis para workflows comuns, com variáveis que você pode preencher - -O Studio fica entre seus clients de IA (como Claude Desktop ou Cursor) e suas tools, cuidando de autenticação, roteamento e logging para cada requisição. - ---- - -## Como uma requisição flui pelo Studio - -Quando um agent chama uma tool, eis o que acontece: - -``` -┌─────────┐ ┌──────────────┐ ┌────────────┐ -│ Client │ ──[authenticate]──▶│ deco Studio │ ──[with creds]──▶│ MCP Server │ -│ (Cursor)│ │ │ │ (GitHub) │ -└─────────┘ ◀──[response]──────└──────────────┘ ◀─[response]─────└────────────┘ - │ - └──▶ [audit log] -``` - -1. O client se autentica no Studio -2. O Studio verifica se o client tem permissão para usar a tool solicitada -3. O Studio recupera as credenciais armazenadas para aquela connection -4. O Studio encaminha a requisição para o serviço upstream -5. O Studio registra a invocação — tool, timing, inputs, outputs e quem chamou -6. O Studio retorna a resposta para o client - -As credenciais nunca saem do Studio, toda ação é registrada e o acesso é consistente independentemente de qual client fez a requisição. - ---- - -## Por que o monitoramento é nativo - -Sem um control plane, cada client gerencia seus próprios logs — ou não registra nada. O Studio registra cada chamada de tool que passa pela plataforma, criando um único lugar para debugar falhas, acompanhar performance e auditar quem acessou o quê. Sem configuração extra. Veja [Monitoring](/pt-br/studio/monitoring). diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/connections.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/connections.mdx deleted file mode 100644 index ef8fbb1696..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/connections.mdx +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: Connections -description: Conecte tools e serviços ao Studio — uma única vez, com segurança, para todo o seu time -icon: Network ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -## O que são connections? - -**Connections** são as tools e serviços que você plugou no Studio — GitHub, Slack, um banco de dados, sua própria API ou qualquer outro serviço compatível com MCP. - -Você configura uma connection uma vez. A partir daí, qualquer pessoa na sua org pode anexá-la a um agent sem nunca lidar com credentials. - -## Onde elas ficam - -As connections são gerenciadas no nível da org em **Settings → Connections**. É onde você: - -- Navega no catálogo de MCPs disponíveis e instala um novo -- Adiciona uma **Custom Connection** para um MCP server que não está no catálogo -- Configura credentials para uma connection existente -- Atualiza ou revoga credentials em um único lugar - -O catálogo vem do [registry da Deco](/pt-br/studio/store), mantido em um arquivo JSON no decocms/mcps. - -Para colocar uma connection em uso, anexe-a a um [agent](/pt-br/studio/agents): dentro do agent, abra a aba **Settings** no painel direito e escolha a connection (e as tools específicas dela) que você quer que esse agent use. - -## Por que connections existem - -Sem um lugar central para tools, cada pessoa e cada client de IA gerencia suas próprias credentials. Trocar uma senha? Atualize em dez lugares. Revogar o acesso de alguém? Torça para que ela não esteja usando uma chave hardcoded em algum lugar. - -As connections resolvem isso sendo a fonte única da verdade: - -- **Credentials armazenadas uma vez** — criptografadas em repouso, descriptografadas apenas quando uma tool é chamada -- **Compartilhadas entre o time** — qualquer pessoa com acesso pode usar a tool sem ver as credentials -- **Fáceis de atualizar** — altere as credentials em um lugar; todo agent herda automaticamente -- **Fáceis de revogar** — remova uma connection e ninguém mais pode usá-la, imediatamente -- **Totalmente logadas** — toda tool call é registrada em [Settings → Monitor](/pt-br/studio/monitoring) - -## Tipos de connection - -**Apps SaaS** — GitHub, Slack, Notion, Google Drive e serviços semelhantes. A maioria conecta com OAuth de um clique, então você nunca copia um token. - -**Infraestrutura** — Bancos de dados, APIs de cloud, serviços internos. Você configura o endpoint e as credentials, o Studio cuida do resto. - -**Custom tools** — Seu próprio MCP server expondo operações específicas do seu domínio. Plugue e compartilhe como qualquer outra connection. - -Todos os tipos de connection funcionam da mesma forma: configure uma vez no nível da org, anexe a quaisquer agents que precisem delas. - -### Transports - -Por baixo dos panos, toda connection usa um destes transports. Você normalmente não precisa pensar nisso — o Studio escolhe o formato certo com base na entrada do catálogo ou no que você cola em **Custom Connection** — mas isso importa quando você está conectando um MCP server por conta própria: - -| Transport | Quando usar | -|---|---| -| **HTTP** | O padrão para MCP servers hospedados. JSON-RPC sobre HTTP. | -| **SSE** | Server-Sent Events — para servidores HTTP que fazem streaming de resultados de tools de longa duração. | -| **WebSocket** | Streaming bidirecional para MCP servers que precisam de um socket persistente. | -| **STDIO** | Inicia um processo local e fala MCP via stdin/stdout. Usado por MCPs estilo CLI em self-host local. | -| **Virtual** | O próprio endpoint do agent — um MCP composto, feito de outras connections, servido pelo Studio. | - -## Como funciona uma tool call - -Quando um agent chama uma tool através de uma connection: - -1. O agent se autentica no Studio -2. O Studio verifica que ele tem permissão para usar aquela tool -3. O Studio recupera as credentials armazenadas para a connection -4. O Studio envia a requisição para o serviço externo -5. O Studio registra a chamada (tool, tempo, inputs, outputs, status) -6. O Studio retorna o resultado para o agent - -O serviço externo nunca vê seu agent diretamente — apenas o Studio. As credentials nunca deixam o perímetro seguro do Studio. - -``` -GitHub Connection ──┐ -Slack Connection ──┼──▶ Agent ──▶ Seu time ou outros clients -Database Connection──┘ -``` - -## Conectando AI clients ao Studio - -Uma vez que seus agents estejam configurados, aponte AI clients externos (Claude Desktop, Cursor, MCP apps customizados) para o endpoint MCP de um agent para usar suas tools. - -- **Para clients interativos** — use OAuth, que cuida do login e da identidade por usuário -- **Para automação e server-to-server** — use API keys, mais rápido de configurar e ideal para scripts ou execuções não supervisionadas - - - Use um [Agent](/pt-br/studio/agents) quando quiser um único endpoint expondo um conjunto curado de tools. Use a [connection proxy URL](/pt-br/studio/api-reference/connection-proxy) apenas se precisar de acesso bruto a uma única connection. - diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/decopilot/context-and-tasks.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/decopilot/context-and-tasks.mdx deleted file mode 100644 index 125765fb31..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/decopilot/context-and-tasks.mdx +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: Context e tasks -description: Como o Decopilot gerencia memory e como usar subtasks para trabalhos pesados -icon: Layers ---- - -import Callout from "../../../../../components/ui/Callout.astro"; - -O Decopilot organiza o trabalho como **tasks** (suas conversas) e **subtasks** (conversas paralelas focadas que se ramificam). Entender como elas compartilham memory ajuda você a fazer mais em uma única sessão. - -## O que é uma task? - -Uma **task** é sua conversa com o Decopilot — onde você conversa, o Decopilot usa tools e o trabalho é feito. Toda task roda em um escopo (org ou agent — veja [Visão geral](/pt-br/studio/decopilot/overview)) que determina quais instruções e tools são carregadas. - -Toda task tem um destes quatro estados: - -- **In progress** — o agent está trabalhando ou aguardando sua próxima mensagem -- **Requires action** — pausada, aguardando seu input (uma tool precisa de aprovação ou ele fez uma pergunta) -- **Completed** — o trabalho terminou com sucesso -- **Failed** — algo deu errado ou a task expirou - -Tasks expiram após **30 minutos de inatividade**. Se você está trabalhando em algo mais longo, envie uma mensagem periodicamente para mantê-la ativa. - ---- - -## Como a memory se enche - -Todo model de IA tem um limite de quanto pode reter em memory ao mesmo tempo — suas instruções, as tools disponíveis e todo o histórico da conversa contam para esse limite. Quanto mais você discutiu, mais memory é ocupada. - -Quando uma task começa, o Decopilot carrega: - -- Suas instruções e comportamentos centrais -- Diretrizes do seu escopo atual -- As tools disponíveis nesse escopo -- Seu histórico de conversa até o momento - -Conforme a conversa cresce, o histórico ocupa mais espaço. Quando fica muito cheio, o Decopilot automaticamente resume as partes mais antigas e mantém o resumo no lugar — liberando espaço sem perder o context importante. - -### A regra 40/80 - -- **Abaixo de 40% cheio** — bastante espaço, nenhuma ação necessária -- **40–80% cheio** — ainda funcionando bem, mas vale a pena encerrar a fase atual -- **Acima de 80% cheio** — o Decopilot compacta automaticamente o histórico da conversa - -Você pode acionar isso manualmente com o comando `/compact` — útil antes de iniciar uma nova fase de trabalho complexo. - - -Use `/compact` quando estiver terminando uma grande task e iniciando outra. Ele mantém a conversa enxuta sem perder o que importa. - - ---- - -## Subtasks - -Uma **subtask** é uma conversa separada que se ramifica da sua task principal para lidar com trabalho focado. A diferença-chave: ela começa do zero — sem histórico da sua conversa principal. - -A subtask roda, faz o trabalho e retorna apenas um curto resumo para sua task principal. Detalhes completos ficam salvos no histórico da task, caso você precise. - -### Main task vs. subtask - -| | Main task | Subtask | -|---|---|---| -| Histórico da conversa | Acumula ao longo do tempo | Começa do zero | -| Pode fazer perguntas a você | Sim | Não | -| Pode criar subtasks | Sim | Não | -| Retorno à task pai | N/D | Apenas resumo | - -Subtasks não podem fazer perguntas a você nem criar subtasks adicionais — elas rodam de forma autônoma e reportam de volta. - -### Quando subtasks ajudam - -**Pesquisa e análise** — aprofundar em dados, explorar opções ou investigar um problema. Você recebe a conclusão, não cada passo. - -**Cálculos complexos** — qualquer coisa que gera saída verbosa pertence a uma subtask. Você vê o resultado, não os bastidores. - -**Verificações de qualidade** — auditorias, validação, revisões. Rode-as separadamente e receba um resumo de volta. - -**Trabalho em paralelo** — se dois pedaços de trabalho não dependem um do outro, rode-os como subtasks separadas ao mesmo tempo. - -### Usando agents especialistas e connections em subtasks - -Você pode rodar uma subtask com um [agent](/pt-br/studio/agents) específico — um configurado para um domínio em particular. O agent traz seu próprio conjunto focado de tools e instruções sem afetar sua conversa principal. - -Você também pode direcionar uma concrete MCP connection diretamente. O Decopilot cria um subagent efêmero para aquela run com as tools da connection, então você não precisa criar um agent dedicado antes. - -**Exemplo**: sua main task é coordenar fulfillment de pedidos. Você inicia subtasks usando um **Inventory Agent** para checar estoque, uma ShipStation MCP connection diretamente para planejar logística e um **Customer Service Agent** para preparar notas de suporte. Cada um roda de forma independente; sua main task recebe os resumos e coordena o resultado. - ---- - -## Dicas práticas - -**Fique de olho no indicador de uso** — quando estiver se aproximando de 40%, pense em encerrar a fase atual ou usar `/compact`. - -**Use subtasks para trabalho pesado** — pesquisa, análise de dados, code reviews e qualquer coisa que gere saídas longas deve acontecer em subtasks. Mantenha os resumos na sua conversa principal. - -**Seja seletivo com tools** — o Decopilot carrega tools na memory. Não habilite tools que você não precisa para a task atual. - -**Rode coisas em paralelo** — se duas subtasks não dependem uma da outra, inicie-as ao mesmo tempo. - -**Escreva prompts claros** — "Analisar tendências de demanda de vestuário no Q4" é mais útil do que "Fazer análise" quando revisar o histórico de tasks depois. - ---- - -**A seguir:** veja [Tools](/pt-br/studio/decopilot/tools) para a referência completa de tools, ou [Agents](/pt-br/studio/agents) para agents especialistas que você pode usar em subtasks. diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/decopilot/overview.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/decopilot/overview.mdx deleted file mode 100644 index df089160be..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/decopilot/overview.mdx +++ /dev/null @@ -1,101 +0,0 @@ ---- -title: Visão geral -description: O assistente de IA integrado ao deco Studio -icon: Sparkles ---- - -import Callout from "../../../../../components/ui/Callout.astro"; - -## O que é o Decopilot? - -O **Decopilot** é o assistente de IA integrado ao deco Studio — o **pilot da org**. É o chat que aparece na Home e que tem visibilidade sobre toda a sua organização: cada agent, cada connection, cada tool. Não é um chatbot pregado de lado; é roteador e executor ao mesmo tempo. - -Você inicia uma conversa e o Decopilot trabalha em segundo plano. Quando precisa do seu input, ele pergunta. Caso contrário, segue em frente — respondendo ali mesmo, alcançando suas tools conectadas ou passando um trabalho focado para um [agent](/pt-br/studio/agents) especialista. Cada conversa fica salva em **Decopilot** na sidebar. - -## Como funciona - -O Decopilot segue um ciclo simples: entender a tarefa → executar uma ação → verificar o resultado → repetir. Ele lê dos seus serviços conectados, chama as tools certas e se adapta com base no que aprende. - -O que o diferencia de um chat de IA comum é que ele consegue alcançar os apps onde seu trabalho realmente acontece — não está limitado a responder perguntas. Ele pode consultar pedidos, atualizar registros, enviar notificações e coordenar workflows em múltiplos serviços de uma só vez. - -## Ele pode operar a plataforma por você - -O Decopilot não serve só para usar suas tools — ele pode **configurar o Studio por você**, direto do chat. Peça em linguagem natural e ele cuida da configuração que um power user normalmente clicaria à mão: - -- **Criar e configurar agents** — "crie um agent que faz a triagem do e-mail de suporte" -- **Montar automations** — "rode isso todo dia útil às 9h" -- **Conectar novas tools** — "conecte nossa loja Shopify"; se faltar uma connection no meio da tarefa, o Decopilot mostra um prompt ali mesmo para adicioná-la e continua assim que você aprovar -- **Navegar e instalar a partir da [Store](/pt-br/studio/store)** — encontre e adicione MCP servers do catálogo -- **Gerenciar sua organização** — convidar membros, ajustar configurações - -Por baixo dos panos, o Decopilot delega cada uma dessas tarefas a um **manager agent** built-in — um para agents, um para automations, connections, a Store, brand e usage — mas, do seu lado, isso simplesmente acontece na conversa. É isso que torna o Studio acessível: um usuário novo e não técnico consegue realizar trabalho de verdade só perguntando, sem precisar aprender onde fica cada configuração. - -## Escopo: onde você está trabalhando determina o que está disponível - -O Decopilot se adapta ao lugar onde você está no Studio: - -- **Escopo de organização** — você está na tela inicial sem nenhum agent aberto. O Decopilot tem acesso às tools built-in de toda a org (gerenciar connections, agents, membros) e ao seu catálogo completo de agents. -- **Escopo de agent** — você abriu um agent específico. O Decopilot passa a usar as tools e instruções *daquele agent*, com o histórico de thread do agent como contexto. - -Para trocar, basta abrir ou fechar um agent pela sidebar. Não há nada extra para configurar. - -## Modos de chat - -A entrada de chat tem um seletor de modo que define como o Decopilot aborda uma rodada. Você pode trocar de modo a qualquer momento sem perder sua conversa. - -| Modo | O que muda | -|---|---| -| **Padrão** | Chat normal — o Decopilot escolhe as tools por conta própria. | -| **Plan** | O Decopilot deve encerrar a rodada com uma chamada `propose_plan`. Tools destrutivas são bloqueadas até você aprovar um plano; apenas tools somente leitura podem ser habilitadas. Útil antes de fazer algo arriscado. | -| **Web search** | O primeiro passo é forçado a chamar `web_search`, que transmite um resultado de busca rápida diretamente para você. Requer um modelo de web search em [AI Providers](/pt-br/studio/ai-providers). | -| **Deep research** | O primeiro passo é forçado a chamar `deep_research`, que executa uma pesquisa assíncrona e multi-fonte aprofundada. Requer um modelo de deep research em [AI Providers](/pt-br/studio/ai-providers). | -| **Gen image** | O primeiro passo é forçado a chamar `generate_image`. Requer um modelo de imagem. | - -## Modelos - -O Decopilot funciona com múltiplos provedores de IA — Anthropic, Google, OpenRouter, o Deco AI Gateway e modelos self-hosted. Escolha um modelo mais robusto para tarefas complexas e um mais rápido para operações simples. Veja [AI Providers](/pt-br/studio/ai-providers). - -## Agents e subtasks - -Quando uma tarefa precisa de um trabalho focado — uma pergunta de atendimento ao cliente, uma pesquisa aprofundada, uma análise de dados — o Decopilot pode delegá-la a um [agent](/pt-br/studio/agents) especialista ou diretamente a uma concrete MCP connection em uma **subtask**. Uma connection alvo roda como um subagent efêmero, então não requer uma configuração dedicada de agent. A subtask roda de forma independente com seu próprio contexto limpo, e então reporta um resumo de volta. Sua conversa principal permanece limpa. - -## Tools built-in - -O Decopilot vem com tools para coordenar trabalho em qualquer escopo: - -| Tool | O que faz | -|---|---| -| `subtask` | Delega trabalho a um agent especialista ou a uma concrete MCP connection | -| `user_ask` | Faz uma pergunta a você quando precisa de esclarecimento | -| `enable_tool` | Ativa uma scope tool para uso nos próximos passos | -| `read_resource` | Lê documentação ou diretrizes disponíveis no escopo | -| `read_prompt` | Lê um template de prompt reutilizável | -| `read_tool_output` | Relê um resultado anterior de tool que foi descarregado para armazenamento | -| `web_search` | Executa uma busca web rápida e streaming e transmite o resultado | -| `deep_research` | Executa uma pesquisa assíncrona e multi-fonte aprofundada e retorna um relatório sintetizado | -| `generate_image` | Cria uma imagem com o modelo de imagem configurado | -| `propose_plan` | Propõe um plano para sua aprovação (somente no plan mode) | - -Quando um agent é apoiado por um sandbox (um repo do GitHub vinculado), o Decopilot também recebe seis **VM tools** — `bash`, `read`, `write`, `edit`, `grep`, `glob` — para que possa executar e modificar código nesse sandbox. - -Sandboxes também montam o **filesystem da organização** em `/app/org/`: `/app/org/home/` é a home compartilhada da org — editável, livre, compartilhada entre todos os membros, agents e runs, onde os agents registram conhecimento durável e checam contexto antes de começar a trabalhar; `/app/org/upload` guarda os arquivos anexados à conversa atual (anexos do chat caem ali automaticamente — sem etapa de cópia); `/app/org/output` é a pasta de saída compartilhada da run atual; e `/app/org/public/` expõe skill sets somente leitura e curados, sincronizados a partir de repos versionados. Arquivos escritos na pasta home e em `/app/org/output` sincronizam com o cloud storage da sua organização e ficam visíveis para todos os membros e agents; mudanças externas aparecem dentro do sandbox em cerca de um segundo. - - - **App desktop no macOS:** quando a app nativa do Studio roda uma sandbox na sua - máquina, o `local-api` monta as pastas `org/` como volumes de rede, e o macOS pede uma vez por app - permissão para acessá-las. Aprove o prompt de "acessar arquivos em um volume de - rede" para o seu terminal ou editor — ou habilite manualmente em **System - Settings → Privacy & Security → Files & Folders → _seu app_ → Network - Volumes**. Sem essa permissão, leituras e escritas em `org/` falham com - "Operation not permitted". - - -Para a referência completa, veja [Tools](/pt-br/studio/decopilot/tools). - ---- - -## Saiba mais - -**[Contexto e tarefas](/pt-br/studio/decopilot/context-and-tasks)** — como a memória funciona e como usar subtasks para trabalhos pesados - -**[Tools](/pt-br/studio/decopilot/tools)** — referência completa de tools built-in e de escopo diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/decopilot/tools.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/decopilot/tools.mdx deleted file mode 100644 index 8cb1eb437b..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/decopilot/tools.mdx +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: Tools -description: O que o Decopilot pode fazer e os dois tipos de tools a que ele tem acesso -icon: Wrench ---- - -## Dois tipos de tools - -O Decopilot tem acesso a dois tipos de tools: - -**Tools built-in** — sempre disponíveis, usadas para gerenciar trabalho, delegar tarefas e ler contexto. As mesmas independentemente do escopo. - -**Scope tools** — vêm das connections anexadas no seu escopo atual. No escopo de org, são as built-ins de toda a organização. No escopo de agent, são as tools anexadas ao agent aberto. - ---- - -## Tools built-in - -Essas são as tools que o agent Decopilot usa internamente para gerenciar o próprio trabalho — não uma API HTTP pública que você chama de fora. Para a superfície externa, "traga seu próprio client" (endpoints MCP, a REST API de threads do Decopilot), veja a [API Reference](/pt-br/studio/api-reference/connection-proxy). - -| Tool | Disponível em subtasks | O que faz | -|---|:---:|---| -| `subtask` | Não | Inicia uma subtask com um agent clonado, outro agent, ou um agent efêmero restrito a uma connection MCP específica | -| `user_ask` | Não | Pergunta a você quando precisa de input | -| `enable_tool` | Sim | Ativa uma scope tool para que ela possa ser chamada no próximo passo | -| `read_resource` | Sim | Lê documentação ou diretrizes do escopo atual | -| `read_prompt` | Sim | Lê um template de prompt reutilizável | -| `read_tool_output` | Sim | Relê um resultado grande de tool que foi descarregado para armazenamento | -| `web_search` | Sim | Executa uma pesquisa web profunda e transmite o resultado (requer um modelo de pesquisa web) | -| `generate_image` | Sim | Gera uma imagem com o modelo de imagem configurado | -| `propose_plan` | Não | Propõe um plano para aprovação (registrada apenas no plan mode) | - -Subtasks têm acesso restrito — não podem iniciar subtasks adicionais nem fazer perguntas a você, já que são feitas para executar e reportar de volta sem interrupção. - -### Agents apoiados por sandbox recebem VM tools - -Quando um agent tem um sandbox (um repo do GitHub vinculado, veja [Agents](/pt-br/studio/agents)), o Decopilot também recebe seis **VM tools** que operam dentro desse sandbox: - -| Tool | O que faz | -|---|---| -| `bash` | Executa um comando de shell no sandbox | -| `read` | Lê um arquivo do sandbox | -| `write` | Escreve um arquivo no sandbox | -| `edit` | Aplica uma edição direcionada a um arquivo existente | -| `grep` | Pesquisa conteúdo de arquivos com ripgrep | -| `glob` | Lista arquivos que correspondem a um padrão de caminho | - -Essas tools são provisionadas de forma preguiçosa — o sandbox só inicia na primeira chamada de VM tool. - ---- - -## Scope tools - -Scope tools são as capacidades específicas de domínio atreladas ao seu contexto atual. Abra um agent e você verá as tools anexadas a ele — tools Shopify se o agent tiver a connection Shopify, tools de envio se tiver ShipStation, e assim por diante. - -**Exemplo**: um agent de fulfillment de pedidos pode expor: - -- `GET_ORDERS` — busca pedidos de clientes -- `UPDATE_INVENTORY` — atualiza níveis de estoque -- `CREATE_SHIPPING_LABEL` — gera etiquetas de envio -- `GET_PRODUCTS` — lista o catálogo de produtos - -Quais tools estão disponíveis depende das connections anexadas ao agent atual. Veja [Agents](/pt-br/studio/agents) para saber como organizar isso. - ---- - -## Como o Decopilot usa tools - -O Decopilot começa cada tarefa apenas com suas tools built-in. Ele vê as scope tools listadas em suas instruções e as utiliza conforme necessário para completar sua solicitação. - -Para trabalhos complexos, pode delegar a uma subtask (usando `subtask`) ou carregar contexto adicional primeiro (usando `read_resource` ou `read_prompt`) antes de agir. - ---- - -**A seguir:** veja [Contexto e tarefas](/pt-br/studio/decopilot/context-and-tasks) para entender como o Decopilot gerencia memória. diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/decopilot/voice-mode.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/decopilot/voice-mode.mdx deleted file mode 100644 index 0a323422fe..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/decopilot/voice-mode.mdx +++ /dev/null @@ -1,264 +0,0 @@ ---- -title: Modo de voz -description: Fale com o agent atual do Studio mantendo o mesmo chat e preview -icon: Mic ---- - -O modo de voz substitui as mensagens e o composer do chat web por um orbe que fala. -Uma página adjacente ou o preview do site permanecem abertos. O agent selecionado, o -modelo, o contexto da página, as tools, as permissões e a fila de mensagens continuam -os mesmos para trabalho delegado. Uma conversa em tempo real, fornecida pela -ElevenLabs ou pela OpenAI, cuida da fala enquanto o agent selecionado do Studio -executa esse trabalho em segundo plano. Você pode continuar falando, perguntar sobre -o progresso ou enviar outro pedido enquanto uma tarefa de código está em execução. - -Agents de código continuam executando o Claude Code no mesmo sandbox. O modo de voz -não muda o runtime fixado do chat, o checkout, o preview ou a sessão do Claude. O -estilo de resposta de voz acompanha cada turno porque o Claude Code restaura o -system prompt original ao retomar uma sessão. Turnos em texto restauram -explicitamente o estilo de resposta normal. Chats do Decopilot usam o mesmo -transporte de voz. - -Escolha **Start voice mode** ao lado do composer e permita o acesso ao microfone. -**Back to chat** interrompe o microfone e a reprodução de áudio. Isso preserva o chat -e qualquer trabalho em execução. **Stop agent work** é um controle separado. Falar -enquanto uma resposta está tocando interrompe o áudio. Pedidos de trabalho completos -entram na fila normal do chat; pausas e saudações não iniciam turnos de código. Ambas -as companions respondem perguntas sobre o progresso dos pedidos desta chamada e das -tarefas criadas a partir do status de trabalho do Studio, sem iniciar um turno. -Aprovações, perguntas, erros e pedidos enfileirados permanecem visíveis no modo de -voz. - -A companion confirma que o trabalho foi aceito sem alegar que já terminou. Quando o -agent do Studio termina, sua última parte em texto é enviada de volta para a -companion, que anuncia o resultado durante uma pausa silenciosa. Uma instrução por -turno pede ao agent em execução uma resposta curta e natural. Voltar para texto -restaura o estilo de resposta normal para as mensagens seguintes. - -## Conversas da organização - -O modo de voz também funciona com o Super Agent. Ele pode delegar perguntas sobre -serviços conectados, analytics e gerenciamento de tarefas pelas mesmas tools e -permissões do chat em texto. Por exemplo, peça para ele consultar analytics, iniciar -duas tarefas independentes e depois perguntar sobre o progresso delas enquanto -discute outro assunto. O Super Agent precisa ter acesso às integrações relevantes. O -GA4 pode responder perguntas de analytics; status de pedido ou fulfillment exige um -sistema de pedidos conectado. - -O Studio mantém um status de trabalho para a chamada e o fornece como contexto para -a companion. Ele lista cada pedido falado como enfileirado, em execução, em execução -em segundo plano, ou finalizado, e cada task do board criada durante a chamada com -sua lane atual. Se o agent cria as tasks 1, 2 e 3 durante essa chamada, o navegador -as acompanha pelos eventos push existentes do task board e anuncia cada mudança de -lane. Outras tasks da organização permanecem silenciosas; uma pergunta sobre uma -delas é outro pedido para o Super Agent. - -Pedidos em um mesmo chat são executados um turno por vez. Em turnos de voz, o agent -em execução recebe a instrução de iniciar pesquisa ou análise como uma `subtask` em -segundo plano, para que seu turno termine rápido e o próximo pedido falado não -precise esperar. A companion espera pelo turno de resultado dessa subtask antes de -anunciar a resposta; o turno que apenas a iniciou é reportado como trabalho em -segundo plano. Pedaços de trabalho separados que o usuário pede se tornam tasks do -board quando o agent tem tools de task board. Chats do Claude Code não têm a tool -`subtask`, então seus pedidos continuam na fila. - -## Interface de conversa compartilhada - -Os dois adaptadores de navegador implementam `publishUpdate`, controles de -microfone, volume e fechamento de sessão, e reportam pedidos através de -`onDelegate`. As atualizações distinguem contexto silencioso de anúncios falados e -podem carregar um ID de delegação. Isso permite que o Studio entregue o progresso ou -resultado de várias tasks de forma independente e fora de ordem. A OpenAI mapeia -isso para appends de thinking/commentary do Live; a ElevenLabs mapeia para -atualizações de contexto e mensagens de segundo plano explicitamente marcadas. Os -nomes de tools e esquemas de eventos de cada provider ficam dentro dos adaptadores. - -O escopo da assinatura são as tasks criadas nessa chamada. O navegador lê os IDs -delas a partir dos resultados de `TASK_BOARD_ITEM_CREATE` nos turnos da chamada, -incluindo turnos de resultado em segundo plano, e filtra os eventos push do task -board para esse conjunto. Uma task não relacionada que termina em outro lugar -permanece silenciosa. O término de um turno de criação de tasks não estabelece que as -tasks criadas terminaram. Limitações conhecidas: reentrar no modo de voz começa com -um conjunto de tasks vazio, e uma mudança de lane durante uma reconexão do stream de -push só é reportada pela próxima mudança. - -## Configuração de deployment - -A seleção de provider é feita apenas no servidor, sem seletor de provider ou modelo -no produto. A ElevenLabs permanece o padrão. Defina estas variáveis em toda réplica -da API: - -```bash -ELEVENLABS_API_KEY= -``` - -A chave precisa de acesso de leitura e escrita a ElevenAgents (`convai_read`, -`convai_write`), além de acesso a Text to Speech e Speech to Text para sessões de -navegadores mais antigos. Mantenha-a no servidor. O Studio cria um agent privado na -ElevenLabs para sua configuração de voz e o reutiliza entre sessões. Navegadores -recebem um token de conversa e um token de sessão assinado do Studio; eles nunca -recebem a chave de API. -O app web precisa de HTTPS para acesso ao microfone, exceto em localhost. Nenhum -callback de provider de entrada ou provisionamento manual de agent é necessário. As -réplicas da API precisam compartilhar o mesmo secret de autenticação do Studio e o -mesmo NATS. - -Para tornar a OpenAI o padrão do deployment, configure: - -```bash -VOICE_CONVERSATION_PROVIDER=openai -OPENAI_LIVE_API_KEY= -``` - -O adaptador da OpenAI usa o GPT-Live com delegação no cliente e WebRTC no -navegador. O Studio negocia a oferta SDP na sua API autenticada usando uma reserva -de sessão de uso único. O navegador recebe uma resposta SDP, não uma credencial da -OpenAI. Não é necessária uma chave da ElevenLabs. Mantenha a chave da ElevenLabs -durante um deployment contínuo se navegadores mais antigos ainda usarem os -endpoints de transcrição/síntese. A chave de longa duração da OpenAI permanece no -servidor da API. A seleção de provider nunca faz fallback silencioso para o outro -provider quando as credenciais estão ausentes. - -Depois ative **Settings → General → Voice mode** para a organização. A flag de -organização `voice_mode` vem desativada por padrão. Ela é separada da autenticação: -somente o usuário dono pode iniciar uma sessão de voz para um chat hospedado e -gravável. Chats de terminal nativo e chats somente leitura não oferecem esse modo. - -Variáveis opcionais: - -| Variável | Padrão | Finalidade | -| --- | --- | --- | -| `VOICE_CONVERSATION_PROVIDER` | `elevenlabs` | `elevenlabs` ou `openai` | -| `OPENAI_LIVE_MODEL` | `gpt-live-1` | Modelo Live da OpenAI | -| `OPENAI_LIVE_VOICE` | `marin` | Voz Live da OpenAI | -| `ELEVENLABS_VOICE_MODEL` | `eleven_v4_turbo` | Modelo de síntese de fala | -| `ELEVENLABS_VOICE_ID` | `JBFqnCBsd6RMkjVDRZzb` | Voz da ElevenLabs | -| `ELEVENLABS_CONVERSATION_MODEL` | `gemini-2.5-flash` | ID do modelo de LLM de conversa suportado pela ElevenLabs | - -As credenciais dos dois providers podem ser configuradas juntas. Variáveis de -ambiente definem os padrões do deployment; administradores podem sobrescrever o -provider e o modelo de conversa por organização no banco de dados. Nenhum seletor de -provider ou modelo é exposto no produto ou nas tools de configuração da -organização. - -Depois da migration `228-org-voice-config`, escolha OpenAI para uma organização: - -```sql -INSERT INTO organization_settings - ("organizationId", voice_provider, voice_model, "createdAt", "updatedAt") -SELECT id, 'openai', 'gpt-live-1', now(), now() -FROM organization WHERE slug = '' -ON CONFLICT ("organizationId") DO UPDATE -SET voice_provider = EXCLUDED.voice_provider, - voice_model = EXCLUDED.voice_model, - "updatedAt" = now(); -``` - -Defina `voice_provider = 'elevenlabs'` e `voice_model = NULL` para usar a -ElevenLabs com `ELEVENLABS_CONVERSATION_MODEL`. Um `voice_model` explícito da -ElevenLabs seleciona o LLM de conversa dela, não o modelo de síntese de fala. -`ELEVENLABS_VOICE_MODEL` e `ELEVENLABS_VOICE_ID` continuam controlando a síntese de -fala e a voz. Uma sobrescrita de modelo exige um provider explícito, para que mudar -o padrão do deployment não aplique o ID de modelo de um provider a outro. - -Defina as duas colunas como `NULL` para restaurar os padrões do deployment. Mantenha -`voice_mode` ativado separadamente. Essas colunas não contêm credenciais; a chave do -provider selecionado precisa existir em toda réplica da API, e uma chave ausente -retorna um erro sem trocar de provider. Um `VOICE_CONVERSATION_PROVIDER` inválido -não impede a inicialização da API. Chamadas de voz que herdam esse padrão inválido -retornam 503; uma organização com uma sobrescrita de provider válida ainda pode usar -voz. O chat em texto comum não é afetado. - -A leitura existente de organization-settings resolve as sobrescritas quando uma -chamada começa. Não há consulta adicional ao banco ou lookup por turno. O provider e -o modelo resolvidos ficam armazenados na reserva de sessão e permanecem fixos para -aquela chamada, mesmo que o banco mude antes do WebRTC conectar. Mudanças no banco -se aplicam à próxima chamada sem precisar de restart. Mudanças de ambiente ainda -exigem reiniciar toda réplica. A primeira chamada com uma nova configuração da -ElevenLabs pode provisionar um agent privado; chamadas seguintes o reutilizam. O -agent em execução e seu modelo não são afetados. - -## Comportamento de sessão e limites - -O navegador encerra sessões após dez minutos, com uma sessão ativa por usuário por -organização. A ElevenLabs também aplica esse limite no provider. Para a OpenAI, dez -minutos é um limite do navegador do Studio, não um limite de sessão aplicado pelo -provider. Até 40 pedidos de trabalho podem ser delegados em uma sessão. Um navegador -interrompido que não consegue liberar sua reserva pode precisar esperar essa -expiração antes de reconectar. O provider de voz selecionado cobra a conversa na -conta do deployment. A ElevenLabs usa Gemini 2.5 Flash por padrão para a conversa, -sem uma chave de modelo separada. A OpenAI usa seu modelo Live configurado para -conversa fala-para-fala. A contabilização de uso de modelo do Studio continua -cobrindo as chamadas de modelo do agent em execução. - -Áudio de microfone e respostas em streaming trafegam diretamente entre o navegador -e o provider selecionado via WebRTC. A ElevenLabs usa transcrição Scribe e seu -modelo de síntese de fala configurado. O GPT-Live lida com escuta e fala simultâneas, -e emite fragmentos de transcrição e IDs de delegação. Seu adaptador envia a nova -fala como mensagem de chat pela mesma API de chat. Turnos falados anteriores viajam -ao lado como `voiceTranscript` e chegam ao agent em execução como contexto por -turno que o chat não exibe. Um evento de delegação é necessário; fragmentos de -transcrição sozinhos nunca iniciam trabalho. Uma janela curta de espera permite que -fragmentos atrasados cheguem, mas as transcrições do provider não têm um marcador de -turno concluído, então isso ainda precisa de avaliação com áudio real. -Client tools da ElevenLabs enviam pedidos, leem o status do chat atual e solicitam -cancelamento. O GPT-Live responde o status a partir do status de trabalho fornecido -e delega pedidos de cancelamento ao agent em execução, então esses pedidos podem -esperar atrás de trabalho ativo. O controle visível Stop agent work continua -disponível para cancelar a execução atual imediatamente. Nenhum dos dois providers -espera tarefas de código longas antes de continuar a conversa falada. -Resultados chegam pelo stream de chat existente do Studio e são fornecidos como -contexto para a companion. O navegador solicita um anúncio falado quando o usuário -está em silêncio. As verificações de permissão e aprovação permanecem no caminho -normal do Studio. - -Pedidos delegados e respostas do agent permanecem no histórico normal do chat do -Studio. Comentários de conversa e perguntas de progresso ficam na sessão de voz. -Texto recente do chat e o contexto da página atual são fornecidos para a companion -quando a voz é iniciada. O Studio não armazena áudio. O agent provisionado na -ElevenLabs desativa a gravação de áudio e solicita retenção de transcrição de um -dia. Essas configurações da ElevenLabs não se aplicam à OpenAI; o tratamento de -dados da OpenAI segue a conta da OpenAI do deployment e seus controles de dados de -API. - -Durante um deployment contínuo, navegadores mais antigos podem continuar usando os -endpoints originais de Scribe/TTS. Seus grants de fala assinados mantêm o limite de -dez minutos, 120 pedidos de síntese e um limite de 24.000 caracteres. - -Sair do chat, trocar de organização ou desconectar encerra a sessão de voz. Falhas -de transporte mostram um erro com um caminho de volta para texto. Elas não -reenviam automaticamente um pedido cuja aceitação é incerta. Verifique o chat antes -de repeti-lo. Parar a reprodução deixa o trabalho do agent em execução. - -## Verificação - -A suíte regular de navegador `voice-mode.spec.ts` verifica os gates de acesso, a -flag padrão e a troca de volta para um rascunho preservado. Seu caso opcional ao -vivo exige um servidor de API configurado com um dos providers de voz e uma entrada -WAV sintética: - -```bash -E2E_VOICE_LIVE=1 E2E_VOICE_WAV=/tmp/synthetic-utterance.wav \ - bun run --cwd=packages/e2e test:e2e -- tests/voice-mode.spec.ts -``` - -O caso ao vivo usa o serviço de fala real e um stand-in HTTP de modelo, e verifica -que a companion responde enquanto o modelo em execução está atrasado, anuncia seu -resultado e volta para texto no mesmo chat. Para a ElevenLabs, com -`E2E_VOICE_FOLLOWUP=1`, use um WAV contendo um pedido de trabalho seguido de uma -pergunta de progresso; o teste também verifica que a segunda resposta falada chega -antes do trabalho terminar, sem enviar outro turno de código. O GPT-Live também -responde a partir do status de trabalho fornecido, mas essa asserção opcional só foi -executada contra a ElevenLabs. - -A suíte do daemon também exercita o executável real do Claude Code e o SDK contra um -stand-in HTTP de modelo. Ela começa em texto, muda um arquivo no modo de voz e volta -para texto verificando a mesma sessão do Claude e o histórico de conversa: - -```bash -DAEMON_E2E_CLAUDE_VOICE=1 \ - bun test packages/sandbox/daemon-e2e/daemon.voice-claude.e2e.test.ts -``` - -Compile o daemon em Go primeiro, como descrito no README do pacote sandbox. Defina -`DAEMON_E2E_CMD` para usar um binário de daemon em outro caminho. diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/digital-experience.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/digital-experience.mdx deleted file mode 100644 index c230745f3f..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/digital-experience.mdx +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: Digital Experience -description: A suíte de capabilities de agents da deco para times que constroem e evoluem storefronts e experiências digitais -icon: ShoppingBag ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -## O Studio é a plataforma. Digital Experience é o que a deco entrega sobre ela. - -O Studio é um control plane genérico — agents, connections, automations, monitoramento, tudo open-source. Sobre ele, a deco entrega uma suíte **Digital Experience**: times de agents prontos e afinados para construir e operar storefronts e sites de conteúdo, para que você não comece com uma org em branco. - -Hoje as capabilities mais desenvolvidas são para **enterprise commerce**. - -## Storefront Autopilot - -Agents de IA que **monitoram, corrigem e melhoram seu storefront 24/7** — enquanto seu time mantém o controle. Construído sobre o Studio mais o CMS do deco.cx, ele combina um editor visual e de código com um time de agents especialistas que cuidam do trabalho operacional recorrente: - -- **Implementação e design** — porte um storefront para a stack da deco e gere componentes que seguem seu design system, tokens e convenções -- **Performance e confiabilidade** — Lighthouse contínuo em cada PR, além de detecção de picos de erro que já abre a correção -- **SEO, catálogo e conteúdo** — SEO técnico, reordenação de PLP, enriquecimento de catálogo e produção de blog/conteúdo - -Cada agent funciona como o resto do Studio: visível na sua sidebar, abrindo PRs que você revisa, com cada ação registrada e custeada. Humanos e agents compartilham o mesmo editor — nada acontece pelas suas costas. - -→ Veja o time completo e os resultados em **[decocms.com](https://www.decocms.com)**. - -## O carro-chefe: Agentic CMS - -O **[Agentic CMS](./agentic-cms)** é o coração da suíte Digital Experience — a evolução do [deco.cx](https://docs.deco.cx). Um CMS visual para storefronts onde agents de IA produzem conteúdo, ajustam o design, enriquecem o catálogo e mantêm o site saudável junto com o seu time — Git-native por design. - - - Essas capabilities não são um produto separado — cada uma é uma configuração de agents rodando no Studio. Tudo o que você aprende sobre [agents](./agents), [connections](./connections) e [automations](./automations) do Studio se aplica diretamente. - diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/library.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/library.mdx deleted file mode 100644 index 8da4d094f2..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/library.mdx +++ /dev/null @@ -1,100 +0,0 @@ ---- -title: Library -description: Um navegador estilo Drive para o filesystem compartilhado da sua organização -icon: Folder ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -## O que é a Library? - -A **Library** é um navegador de arquivos para o filesystem compartilhado da sua organização — acessível pela aba **Library** no topo do painel principal. É a janela voltada para pessoas sobre os mesmos arquivos que seus agents leem e escrevem: tudo o que um agent salva no filesystem da org aparece aqui, e tudo o que você solta aqui fica disponível para seus agents. - -Pense nela como o drive compartilhado da sua organização, com algumas áreas bem conhecidas. - -## Sua pasta home - -A Library abre na pasta da sua própria organização, com o nome da sua org. Ela é compartilhada e de formato livre: é aqui que os agents registram conhecimento durável e onde você guarda o contexto que quer deixar ao alcance de todos os agents. Todo mundo na org pode editar. - -### Pastas de sistema - -Três pastas dentro dela são preenchidas pelo produto, não à mão. Elas têm um ícone de pasta cinza distinto, fácil de diferenciar das pastas que seu time criou: - -- **uploads** — arquivos anexados a conversas, descrições de tasks e comentários de tasks caem aqui automaticamente. Quando você solta um arquivo num chat, ele fica disponível para o agent sem nenhum passo de cópia. -- **outputs** — arquivos que um agent produz durante uma execução aparecem aqui, agrupados por execução. -- **skills** — conjuntos de skills curados e somente leitura, sincronizados a partir de repositórios versionados, expostos para os agents consultarem. Somente leitura: eles são atualizados a partir da fonte no GitHub, não editados aqui. - -Por baixo dos panos são volumes separados (veja a tabela de mounts abaixo), mas você navega por eles como uma única árvore. - -### Navegação - -Navegue pelos breadcrumbs — a trilha sempre começa na pasta da sua org e é o único lugar em que a pasta atual é nomeada. A localização atual é refletida na URL da página, então você pode mandar para um colega o link direto de uma pasta. - -A busca acompanha você: na tela inicial ela busca todos os arquivos da org, e dentro de uma pasta ela busca só aquela pasta e tudo abaixo dela (o placeholder diz qual dos dois). Um feed de **Recently added** que cruza todos os volumes fica no final da tela inicial, para você voltar rapidamente a qualquer coisa que você (ou seus agents) tocou por último. - -Você pode arrastar e soltar arquivos diretamente em qualquer pasta editável para fazer upload. - -## Brands - -A Library tem suporte nativo para **org brands** — uma pasta de identidade estruturada que seus agents e a skill de slides usam para produzir outputs on-brand. - -Uma brand fica em `/app/org/home/brands//` e contém quatro arquivos: - -| Arquivo | Propósito | -|---|---| -| `tokens.css` | Variáveis CSS para cores, tipografia, espaçamento, raio e sombra | -| `brand.md` | Diretrizes escritas da marca: voz, tom e notas de identidade visual | -| `logo` | Arquivo de logo (SVG, PNG ou similar) | -| `slides-theme.html` | Um deck de exemplo que também serve como shell de geração para a skill de slides | - -### Criando e editando uma brand - -Brands aparecem como cards diretamente na Library. Clique em um card de brand para abrir o **editor no painel lateral**, que permite: - -- Editar paletas de cores (primária, secundária, neutros) com preview em bandas em tempo real -- Ajustar tipografia, espaçamento, raio e sombra -- Escrever ou refinar as diretrizes de voz e tom da marca -- Visualizar a brand aplicada a um deck de exemplo e componentes de UI em tempo real - -Para criar uma brand do zero, peça para qualquer agent: *"Crie uma brand para [nome]"* — agents com acesso à skill `core/brand` vão montar toda a estrutura de pastas e populá-la com valores iniciais sensatos. - - - O arquivo `slides-theme.html` dentro de uma pasta de brand funciona ao mesmo tempo como shell de geração e deck de exemplo editável. Modificá-lo diretamente muda o ponto de partida de todos os decks que a skill de slides gera com essa brand. - - -## Sharing - -Arquivos e pastas no volume Home podem ser compartilhados fora da sua organização. Cada nó tem um **modo de compartilhamento**, definido pelo menu de contexto ou pelo ícone de compartilhamento no seu card: - -| Modo | Quem pode acessar | -|---|---| -| **Org only** | Apenas membros da organização (padrão) | -| **Public** | Qualquer pessoa com o link — sem necessidade de login | -| **Password** | Qualquer pessoa com o link que inserir a senha correta | - -Um badge no card reflete o modo de compartilhamento atual. Para nós protegidos por senha, o link compartilhado abre um formulário de senha antes de servir o conteúdo; um desbloqueio bem-sucedido cobre o nó e toda a sua subárvore (para pastas) durante a sessão do navegador. - - - Uma senha é definida no nível da pasta e cobre tudo dentro dela. Arquivos dentro de uma pasta protegida por senha herdam a senha da pasta pai — não é possível sobrescrever com uma senha diferente em um nó filho. - - - - Arquivos que herdam o compartilhamento de um pai mostram um indicador somente leitura "shared via a parent folder" em vez dos controles de compartilhamento. Altere o modo de compartilhamento do pai para afetá-los. - - -## Como ela mapeia para o sandbox - -A Library e o sandbox do agent são duas visões do mesmo filesystem. A Library nomeia sua pasta home com o nome da sua org e aninha as pastas de sistema dentro dela, mas os caminhos que os agents usam nunca mudam — eles são montados em `/app/org/`: - -| Pasta na Library | Caminho no sandbox | -|---|---| -| `` (home) | `/app/org/home/` | -| `/uploads` | `/app/org/upload` | -| `/outputs` | `/app/org/output` | -| `/skills/` | `/app/org/public/` | - -Arquivos escritos na sua pasta home e em outputs sincronizam com o cloud storage da sua organização e ficam visíveis para todos os membros e agents. Mudanças externas aparecem dentro de um sandbox em execução em cerca de um segundo. - - - Para entender como os agents usam essas pastas em runtime — registrando conhecimento durável, lendo anexos de chat, escrevendo o output de uma execução — veja [Decopilot → Visão geral](/pt-br/studio/decopilot/overview#tools-built-in). - diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/monitoring.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/monitoring.mdx deleted file mode 100644 index bafa7386e5..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/monitoring.mdx +++ /dev/null @@ -1,61 +0,0 @@ ---- -title: Monitoring -description: Veja todas as tool calls que seus agents fazem — quem, o quê, quando e como foi o desempenho -icon: Activity ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -## Todas as tool calls em um só lugar - -O Studio registra todas as invocações de tools que passam por ele — automaticamente, sem necessidade de configuração. Quando um agent consulta o GitHub, envia uma mensagem no Slack ou chama seu banco de dados, há um registro disso. - -Você encontra tudo em **Settings → Monitor**. As tool calls de cada agent são consolidadas ali, em toda a organização. - - -**O que é registrado:** tool calls que passam pelas suas connections e agents (consultas ao GitHub, operações de banco de dados, chamadas ao Shopify, etc.). Ações de gerenciamento do Studio — como criar uma connection ou atualizar configurações — não são incluídas no log de monitoramento. - - -Sem um lugar central para isso, você teria que correlacionar logs de diferentes clients e diferentes serviços, cada um em um formato distinto — quando estivessem logando. O Studio captura tudo no ponto por onde todo o tráfego passa, então você sempre tem uma visão completa e consistente. - -## O que você pode ver - -Para cada tool call, o Studio registra: - -**Quem fez a chamada** -- O usuário ou API key que fez a requisição -- De qual agent ou automação a chamada veio - -**O que aconteceu** -- A tool que foi chamada -- Os inputs que foram enviados -- O output retornado -- Se teve sucesso ou falhou — e, se falhou, por quê - -**Quando e por quanto tempo** -- Timestamp -- Quanto tempo a chamada levou, em milissegundos - -## O que você pode fazer com isso - -### Debugar falhas rapidamente - -Quando algo quebra, abra **Settings → Monitor** e veja exatamente o que aconteceu — quais inputs foram enviados, qual erro retornou, quando ocorreu. Sem SSH, sem arquivos de log, sem adivinhação. - -### Acompanhar performance - -Veja quais tools são mais lentas (latência p50 / p95), quais são chamadas com mais frequência e onde o tempo está sendo gasto. Isso facilita identificar gargalos antes que se tornem problemas. - -### Entender como seu time usa os agents - -Veja quais tools estão de fato sendo usadas versus as que estão apenas configuradas. Identifique onde os agents estão fazendo retry ou encontrando erros com frequência. Use isso para melhorar seus agents ao longo do tempo. - -### Auditar acessos - -Cada tool call está vinculada a um usuário ou API key específicos. Se você precisa saber quem acessou o quê e quando — para compliance, revisão de segurança ou resposta a incidentes — está tudo lá. - -## Uma observação sobre dados sensíveis - -Os inputs e outputs das tools são logados por padrão. Se você trabalha com dados sensíveis (registros de clientes, dados financeiros, etc.), use API keys com escopo para limitar o que cada agent pode acessar e revise as configurações de retenção de dados da sua organização. - -O Studio fornece a visibilidade — seu time define as políticas. diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/overview.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/overview.mdx deleted file mode 100644 index 27ce202777..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/overview.mdx +++ /dev/null @@ -1,98 +0,0 @@ ---- -title: Visão geral -description: Control plane open-source para seus agentes de IA -icon: Info ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -![deco](https://assets.decocache.com/mcp/9a3facd8-1199-4635-becc-bdc3f5ee7ab1/deco-banner-capy.png) - -## O control plane para seus agentes de IA - -O deco Studio é o control plane open-source para seus agentes de IA — **um único endpoint MCP para todos os seus agents, tools e models**. Construa e contrate agents, conecte-os às suas tools, execute-os em schedules ou eventos e **acompanhe cada token e cada dólar em tempo real**. Use a cloud ou faça self-host na sua própria infraestrutura — construído sobre o [Model Context Protocol](https://modelcontextprotocol.io). - -### Agents - -Um agent é uma IA configurada para um trabalho específico: um conjunto focado de tools, instruções claras e seu próprio histórico de thread. Agents são a superfície de trabalho do Studio — você passa a maior parte do tempo dentro de um. Cada agent também é seu próprio endpoint MCP, então clients externos como Cursor e Claude Desktop podem usá-lo diretamente. - -### Connections - -Plugue qualquer tool ou serviço — GitHub, Slack, bancos de dados, sua própria API, qualquer coisa compatível com MCP. Configure as credenciais uma vez no nível da org, depois anexe as tools que quiser a cada agent. As credenciais nunca saem do Studio. - -### Automations - -Execute um agent sem supervisão em um schedule ou em resposta a um evento. Anexado a um agent específico, então o escopo do que a execução pode fazer é o que você configurou para aquele agent. - -### Observability - -**Saiba quanto custa cada agent.** Cada chamada de tool feita pelos seus agents é registrada automaticamente — quem chamou, quando, o que retornou, quanto tempo levou e quanto custou. Acompanhe o gasto de tokens entre providers, latência e taxas de erro em um único lugar para debugar, auditar e monitorar performance. - -### Extensibilidade - -O Studio é aberto em todas as camadas: - -- **MCP apps** — empacote tools com views em React em um único pacote, e o Studio renderiza essas views diretamente dentro do agent. Comece pelo [template repo](https://github.com/decocms/mcp-app). -- **Sandboxes** — vincule um agent a um repositório do GitHub e o Studio o executa como um ambiente de dev isolado com escopo daquele agent (tipicamente o próprio MCP server do agent). -- **Git-native** — agents baseados em código vivem em um repo real com branches e PRs, exibidos na aba **Review changes** do agent. Seu controle de versão continua sendo sua fonte da verdade. -- **MCP em todos os lugares** — cada agent é exposto como seu próprio endpoint MCP, chamável a partir do Cursor, Claude Desktop, seu próprio código ou outro agent. - -### Digital Experience: agents empacotados sobre o Studio - -Para times que gerenciam storefronts e experiências digitais ricas em conteúdo, a deco oferece uma **suíte Digital Experience** construída sobre o Studio — a principal é o **[Agentic CMS](./agentic-cms)**, a evolução do [deco.cx](https://docs.deco.cx). Veja [Digital Experience](./digital-experience) para o panorama completo. - ---- - -## Três formas de trabalhar - -O Studio se adapta ao seu nível. O mesmo produto suporta três tipos de trabalho, e você transita entre eles livremente: - -- **Chat — para todo mundo.** Basta conversar com o [Decopilot](./decopilot/overview), o pilot embutido na sua tela inicial. Peça o que quiser e ele resolve — respondendo perguntas, executando suas tools e até criando agents, automations e connections _por_ você. Um usuário totalmente novo e não técnico já consegue ser produtivo no primeiro dia, sem configurar nada. -- **Configurar — para power users.** Quando você quer sistemas repetíveis, monte-os na mão: desenhe [agents](./agents) focados, escolha a dedo suas [tools](./connections), agende [automations](./automations) e gerencie roles e acesso. Você está construindo a máquina da qual o time inteiro depende. -- **Construir — para desenvolvedores.** Vá mais fundo com código. Vincule um agent a um [sandbox](./agents#onde-um-agent-roda) e a um repo Git, rode-o localmente com seu próprio harness e estenda o próprio Studio publicando [MCP apps](./agents) — tools empacotadas com sua própria UI em React. Seu repo continua sendo a fonte da verdade. - -A maioria dos times usa as três ao mesmo tempo: o pilot para tarefas rápidas, sistemas feitos à mão para a rotina e código para qualquer coisa sob medida. - ---- - -### O que você pode fazer com o Studio - -| | | -|---|---| -| **Construir e contratar agents** | Componha workers de IA focados a partir das suas tools e instruções — ou contrate agents prontos na [Store](./store) | -| **Conectar tools** | Adicione GitHub, Slack, bancos de dados ou qualquer MCP server com OAuth em um clique — as credenciais ficam seguras | -| **Rodar hands-free** | Dispare agents em schedules ou eventos com automations | -| **Ver tudo** | Logs, custos e traces de cada ação de agent, em um único dashboard | -| **Estender com código** | Publique MCP apps (tools + UI) e vincule agents a repos Git em seus próprios sandboxes | -| **Controlar acesso** | Gerencie quem pode usar quais tools com roles e permissões de time | -| **Rodar do seu jeito** | Self-host na sua própria infraestrutura ou use nossa cloud | - -### Opções de deployment - -| | | -|---|---| -| **Cloud** | [studio.decocms.com](https://studio.decocms.com) — gerencie tudo pelo navegador | -| **Desktop** | `brew install --cask deco-studio` — rode agents na sua máquina com sua assinatura do Claude Code ou Codex | -| **Team** | Connections, roles e tracking de custos compartilhados em toda a organização | -| **Self-hosted** | Faça deploy na sua própria infraestrutura com Docker ou Kubernetes | - ---- - -## Comece por aqui - -**[Quickstart](./quickstart)** — Rode em 5 minutos - -**[Conceitos-chave](./concepts)** — Anatomia da UI do Studio, e como as peças se encaixam - -**[Self-hosting](./self-hosting/quickstart)** — Docker Compose ou Kubernetes - -## Links - -- **Website**: [decocms.com](https://www.decocms.com/) -- **Studio**: [studio.decocms.com](https://studio.decocms.com) -- **GitHub**: [github.com/decocms/studio](https://github.com/decocms/studio) -- **Discord**: [decocms.com/discord](https://decocms.com/discord) - - - Procurando docs do **deco.chat** (nossa plataforma de admin legada)? Selecione **deco.chat - legacy admin** no dropdown de versão na sidebar. - diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/quickstart.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/quickstart.mdx deleted file mode 100644 index 2f6dd8830c..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/quickstart.mdx +++ /dev/null @@ -1,98 +0,0 @@ ---- -title: Quickstart -description: Do zero a um agente funcionando em 5 minutos -icon: Rocket ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -## Coloque o Studio para rodar - -Cadastre-se em [studio.decocms.com](https://studio.decocms.com) e está tudo pronto. - -1. Crie sua conta (email, GitHub ou Google) -2. Crie uma organização — seu workspace de nível mais alto -3. Pronto, você está dentro. - -### App desktop (recomendado para agents locais) - -O app desktop nativo permite que agents rodem **na sua máquina** — com seus arquivos, suas ferramentas e sua assinatura existente do **Claude Code ou Codex** como harness. O Studio continua cuidando do chat, das connections e dos logs. - -```bash -brew tap decocms/studio https://github.com/decocms/studio -brew install --cask deco-studio -``` - -Por enquanto, macOS (Apple Silicon). Veja [onde um agent roda](./agents#onde-um-agent-roda) para entender como runtimes locais funcionam. - - - Quer rodar o servidor do Studio na sua própria infraestrutura? Veja [Self-hosting](./self-hosting/quickstart). - - ---- - -## AI provider (já configurado para você) - -Novas organizações começam com créditos no **Deco AI Gateway**, então você pode começar a conversar com agentes imediatamente — sem nenhuma configuração. - -Quando quiser usar suas próprias keys (Anthropic, Google, OpenRouter, etc.) ou verificar quanto resta do crédito do gateway, vá em **Settings → AI Providers**. Veja [AI Providers](/pt-br/studio/ai-providers) para a lista completa. - ---- - -## Comece a conversar (Decopilot) - -Você não precisa construir nada para começar. A tela inicial é um composer de chat — _"O que você precisa?"_ — alimentado pelo **Decopilot**, o assistente embutido do Studio. Digite um pedido e ele põe mãos à obra, usando quaisquer tools que você tenha conectado. Cada conversa fica salva em **Decopilot**, na sidebar à esquerda. - -Quando estiver pronto para criar um worker focado e reutilizável, crie um agent dedicado. - -## Crie um agent - -Use o botão **+** / "Browse agents" na sidebar para criar um novo agent. Assim que ele abrir, a tela se divide em duas partes: - -- **Esquerda** — o chat. Acima do input ficam o **model-tier picker** e o **runtime picker** (onde o agent roda — na cloud ou na sua própria máquina; veja [Agents](/pt-br/studio/agents#onde-um-agent-roda)). -- **Direita** — um painel com abas. A aba **Settings** guarda instruções, connections e arquivos; **Automations** guarda schedules e triggers. Outras abas (Preview, Content, Review changes) aparecem apenas para agents vinculados a um repo ou site. - -Abra a aba **Settings** e escreva uma instrução de uma linha descrevendo o que este agent deve fazer. - ---- - -## Anexe uma connection - -Connections são as tools que seu agent pode usar — GitHub, Slack, Shopify, seu banco de dados, seu próprio MCP server. Você pode adicioná-las diretamente a partir do agent que acabou de criar: - -1. No painel direito do agent, em **Settings**, abra a seção **Connections** -2. Clique em **Add connection** -3. Pesquise no catálogo (ex.: Gmail) ou escolha **Custom Connection** para adicionar um MCP server não listado -4. Clique em **Connect** e siga o fluxo de sign-in ou cole uma key -5. Escolha quais tools dessa connection este agent deve ter - -As credenciais são criptografadas e nunca expostas ao seu time. Connections adicionadas dessa forma ficam armazenadas no **nível da org** — aparecem em **Settings → Connections** e podem ser anexadas a outros agents também. - - - Você também pode começar por **Settings → Connections** e instalar uma connection antecipadamente, e depois anexá-la aos agents. O resultado é o mesmo — escolha a ordem que fizer mais sentido. - - -O catálogo lista os MCPs do registry da Deco. - ---- - -## Converse com ele - -Basta digitar. O agent usa as tools que você anexou. - -``` -Send an email to me@example.com with a poem about MCP. -``` - -Acompanhe a execução no chat. Cada chamada de tool é registrada em **Settings → Monitor**. - - - Tudo pronto! A partir daqui, configure [Automations](/pt-br/studio/automations) para rodar agents em um schedule ou evento, convide [members](/pt-br/studio/user-management) do time, ou construa mais agents. - - -## Próximos passos - -- **[Key concepts](./concepts)** — Anatomia do Studio: o shell do agent vs. Settings -- **[Agents](./agents)** — Como desenhar e configurar agents -- **[Decopilot](./decopilot/overview)** — O assistente de IA embutido no Studio -- **[Self-hosting](./self-hosting/quickstart)** — Deploy em Docker Compose ou Kubernetes diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/secrets.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/secrets.mdx deleted file mode 100644 index 9642fb1792..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/secrets.mdx +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: Secrets -description: Armazene API keys, tokens e valores sensíveis — criptografados, com escopo e nunca retornados pela API -icon: Lock ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -## O que são secrets? - -**Secrets** são valores sensíveis — API keys, tokens, senhas — de que seus agents e connections precisam, mas que nunca devem ser armazenados em texto puro. Gerencie-os em **Settings → Secrets**. - -Todo secret é criptografado em repouso no vault de credentials do Studio. Uma vez armazenado, o valor de um secret **nunca é retornado pela API** — o Studio pode usá-lo, mas ele não pode ser lido de volta, nem mesmo por você. - -## Scopes - -Cada secret tem um scope que controla quem pode usá-lo: - -- **Organization** — visível para todos os membros da org. Use para credentials compartilhadas das quais os agents do seu time dependem. -- **Private** — visível só para você. Use para chaves pessoais que você não quer compartilhar. - -Os nomes não diferenciam maiúsculas de minúsculas dentro de um scope e podem conter letras, dígitos, underscores, pontos e hífens (por exemplo, `STRIPE_API_KEY`). - -## Criando um secret - -1. Abra **Settings → Secrets**. -2. Clique em **New secret**. -3. Escolha um **scope** (Organization ou Private), dê a ele um **name** e um **value** e, opcionalmente, uma **description** do que ele serve. -4. Clique em **Create secret**. - -O valor é escrito direto no vault. Para rotacionar um secret, crie-o de novo com o mesmo nome; para parar de usar um, exclua-o. - - - Secrets servem para valores sensíveis arbitrários. As credentials de uma - connection específica (OAuth tokens, chaves por connection) são gerenciadas - onde você configura aquela [connection](/pt-br/studio/connections) — também - criptografadas, também nunca expostas ao seu time. - diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/authentication.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/authentication.mdx deleted file mode 100644 index 1f940cd929..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/authentication.mdx +++ /dev/null @@ -1,98 +0,0 @@ ---- -title: Autenticação -description: Métodos de autenticação suportados e como configurá-los para self-hosting -icon: ShieldCheck ---- - -import Callout from "../../../../../components/ui/Callout.astro"; - -## O que é suportado - -O deco Studio usa Better Auth e suporta: - -- **Email/senha** -- **Magic link** -- **Provedores sociais** (ex.: Google, GitHub) -- **SAML SSO** (para organizações enterprise) - -## Configurar autenticação (self-hosting) - -Implantações self-hosted configuram a autenticação inteiramente por variáveis de ambiente `AUTH_*` — não há arquivo de configuração para montar. Veja as variáveis abaixo. - - - Mantenha os secrets dos provedores fora do Git. Em produção, use gerenciamento de Secrets (Kubernetes Secrets, External Secrets Operator, etc.). - - -## Variáveis de ambiente principais - -- `BETTER_AUTH_SECRET` (obrigatório) -- `BETTER_AUTH_URL` / `BASE_URL` (recomendado definir explicitamente em produção) -- `ENCRYPTION_KEY` (obrigatório para produção; gerado com `openssl rand -base64 32`) - -## SSO no deployment inteiro (OIDC) - -Para deployments self-hosted onde todos os usuários devem autenticar através -de um único Identity Provider corporativo, dá pra configurar SSO via -variáveis de ambiente. Esse é **um SSO de deployment inteiro**: o provedor -configurado vira o padrão para todos os logins que casarem com o domínio de -e-mail configurado — sem setup por organização, sem etapa na UI de admin. -É o caminho ideal quando você está rodando o deco Studio para uma única -empresa e quer SSO obrigatório desde o primeiro login. - -Se você quer SSO por organização (cada org trazendo o próprio IdP via UI de -admin), **não** defina essas envs — use o fluxo **Configurações → SSO** dentro -do app. - - - Apenas um provedor de SSO de deployment inteiro pode estar ativo por vez. - Se as envs de Microsoft e Google estiverem definidas ao mesmo tempo, - **Microsoft tem prioridade**. - - -### Variáveis comuns - -| Variável | Descrição | -| --- | --- | -| `AUTH_SSO_DOMAIN` | Domínio de e-mail que aciona o SSO (ex.: `acme.com`). Obrigatório. | -| `AUTH_SSO_SCOPES` | Escopos separados por vírgula. Padrão: `openid,email,profile`. | - -### Microsoft (Entra ID / Azure AD) - -```bash -AUTH_SSO_DOMAIN=acme.com -AUTH_SSO_MS_TENANT_ID= -AUTH_SSO_MS_CLIENT_ID= -AUTH_SSO_MS_CLIENT_SECRET= -``` - -No portal do Azure, registre uma aplicação e adicione a **Redirect URI**: - -``` -https:///api/auth/sso/callback/microsoft -``` - -### Google (Workspace) - -```bash -AUTH_SSO_DOMAIN=acme.com -AUTH_SSO_GOOGLE_CLIENT_ID= -AUTH_SSO_GOOGLE_CLIENT_SECRET= -``` - -No Google Cloud Console, crie um **OAuth 2.0 Client ID** do tipo *Web -application* e adicione a **Authorized redirect URI**: - -``` -https:///api/auth/sso/callback/google -``` - -Para tenants do Workspace, restrinja a tela de consentimento OAuth à sua -organização para que apenas usuários do seu domínio consigam logar. - -### Login social vs. SSO - -Essas envs configuram **SSO via OIDC** (plugin `@better-auth/sso`). São -diferentes dos botões de **login social** configurados via -`AUTH_GOOGLE_CLIENT_ID` / `AUTH_GITHUB_CLIENT_ID`. Login social deixa os -usuários autenticarem com suas contas pessoais; o SSO de deployment inteiro -roteia todo mundo que casar com `AUTH_SSO_DOMAIN` para o IdP corporativo. diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/deploy/docker-compose.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/deploy/docker-compose.mdx deleted file mode 100644 index c760489864..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/deploy/docker-compose.mdx +++ /dev/null @@ -1,155 +0,0 @@ ---- -title: "Docker Compose" -description: Faça deploy do deco Studio localmente usando Docker Compose para testes e desenvolvimento -icon: Container ---- - -import Callout from "../../../../../../components/ui/Callout.astro"; - -Este guia cobre como rodar o deco Studio com Docker Compose para testes e avaliação self-hosted. - -Código-fonte (arquivos de compose): [decocms/studio → deploy/docker-compose](https://github.com/decocms/studio/tree/main/deploy/docker-compose) - -## Visão geral - -O Studio usa **PostgreSQL** como banco de dados. O repositório inclui três arquivos de compose em `deploy/docker-compose/` — escolha pelo caso de uso: - -- **`docker-compose.postgres.yml`** — **self-host, tudo-em-um**: Studio (imagem publicada) **mais a stack completa embutida** (PostgreSQL + NATS + MinIO), tudo ligado para que o app não provisione nada sozinho. É o ponto de partida recomendado. (`selfhost/examples/docker-compose` encapsula isso com um `.env.example` documentado.) -- **`docker-compose.yml`** — **self-host, com seu próprio banco**: apenas o Studio (imagem publicada), esperando um PostgreSQL fornecido por você. -- **`docker-compose.dev.yml`** — **desenvolvimento**: só as dependências (PostgreSQL + um cluster NATS de 3 nós, topologia prod-like); você roda os apps de API e web **do código-fonte** com `bun run dev:servers`. Sem sandbox aqui — isso precisa de Kubernetes (veja o loop [dev-hybrid](https://github.com/decocms/studio/tree/main/selfhost/examples/dev-hybrid)). - -Os arquivos de self-host usam um volume Docker para persistência e um health check automático em `/health`. - -## Pré-requisitos - -- Docker 20.10+ -- Docker Compose 2.0+ -- Um banco PostgreSQL — embutido (via `docker-compose.postgres.yml`) ou o seu próprio - -## Início rápido (PostgreSQL embutido) - -```bash -# 1. Clone o repositório e entre no diretório do compose -git clone https://github.com/decocms/studio.git -cd studio/deploy/docker-compose - -# 2. Crie um .env com um auth secret, uma chave do vault e credenciais do Postgres -cat > .env << EOF -BETTER_AUTH_SECRET=$(openssl rand -base64 32) -ENCRYPTION_KEY=$(openssl rand -base64 32) -POSTGRES_USER=studio_user -POSTGRES_PASSWORD=$(openssl rand -base64 24) -POSTGRES_DB=studio_db -EOF - -# 3. Inicie o Studio + PostgreSQL -docker compose -f docker-compose.postgres.yml up -d - -# 4. Acesse -open http://localhost:3000 -``` - -O arquivo `docker-compose.postgres.yml` monta o `DATABASE_URL` automaticamente a partir das variáveis `POSTGRES_*`, usando o serviço `postgres` como host. - - - `BETTER_AUTH_SECRET` e `ENCRYPTION_KEY` caem para valores padrão inseguros (só para dev) se não forem definidos — sempre defina valores de verdade para qualquer ambiente compartilhado. As variáveis `POSTGRES_*` também têm valores padrão, mas sempre defina uma senha de verdade. - - -## Variáveis de ambiente - -Defina estas no `.env` ao lado do arquivo de compose: - -| Variável | Padrão | Descrição | -|----------|---------|-------------| -| `BETTER_AUTH_SECRET` | `local-dev-better-auth-secret-change-me` (inseguro) | Secret de autenticação — sempre defina um de verdade. Gere com `openssl rand -base64 32` | -| `ENCRYPTION_KEY` | fallback determinístico só para dev (inseguro) | Chave do vault de credenciais para criptografar secrets/tokens armazenados — precisa se manter estável entre reinicializações. Sempre defina um valor de verdade para qualquer ambiente compartilhado. | -| `IMAGE_REPOSITORY` | `ghcr.io/decocms/studio/studio` | Repositório da imagem | -| `IMAGE_TAG` | `latest` | Tag da imagem | -| `PORT` | `3000` | Porta exposta no host | -| `BASE_URL` / `BETTER_AUTH_URL` | `http://localhost:3000` | URLs públicas da aplicação | -| `DATABASE_URL` | veja abaixo | Connection string do PostgreSQL | -| `POSTGRES_USER` / `POSTGRES_PASSWORD` / `POSTGRES_DB` | `studio` / `studio` / `studio` | Credenciais do Postgres embutido (apenas no compose postgres) | - -O container roda como usuário `1001:1001` e persiste dados no volume `studio-data`; o Postgres embutido persiste em `postgres-data`. - -## Usando seu próprio PostgreSQL - -Para apontar o Studio para um banco externo, use o `docker-compose.yml` base e defina `DATABASE_URL`: - -```bash -# .env -BETTER_AUTH_SECRET=your_generated_secret_here -DATABASE_URL=postgresql://user:password@host:5432/database_name -``` - -```bash -docker compose up -d -``` - - - `localhost` dentro do container se refere ao próprio container. Para alcançar um PostgreSQL rodando na sua máquina, use `host.docker.internal` (Docker Desktop) ou o IP da sua máquina na rede local. Com o `docker-compose.postgres.yml` embutido, o host é o nome do serviço `postgres`. - - -## Opções de autenticação - -Por padrão, a stack embutida usa autenticação por email/senha. Para habilitar login social, descomente e defina as variáveis dos provedores no bloco `environment` do compose (ou no seu `.env`): - -```bash -AUTH_GOOGLE_CLIENT_ID=... -AUTH_GOOGLE_CLIENT_SECRET=... -AUTH_GITHUB_CLIENT_ID=... -AUTH_GITHUB_CLIENT_SECRET=... -``` - -Para configurações mais ricas (SSO de deployment inteiro, provedores de email, magic links), defina as variáveis `AUTH_*` correspondentes no bloco `environment` do compose — não há arquivo de configuração para montar. Veja [Autenticação](/pt-br/studio/self-hosting/authentication) para a referência completa. - -## Operações - -### Logs e status - -```bash -# Acompanhe os logs da aplicação -docker compose logs -f studio - -# Status do container -docker compose ps - -# Uso de recursos (o nome do container é "decocms") -docker stats decocms -``` - -### Atualizar a imagem - -```bash -docker compose pull -docker compose up -d -``` - -Fixe uma versão definindo `IMAGE_TAG` no `.env` antes do pull. - -### Backup e restauração (PostgreSQL) - -```bash -# Backup (serviço Postgres embutido) -docker compose exec postgres pg_dump -U studio_user studio_db > backup-$(date +%Y%m%d).sql - -# Restauração -docker compose exec -T postgres psql -U studio_user studio_db < backup-20240101.sql -``` - -### Resetar todos os dados - -```bash -docker compose down -v # remove os volumes nomeados (studio-data, postgres-data) -docker compose -f docker-compose.postgres.yml up -d -``` - - - `docker compose down -v` **apaga os volumes permanentemente**. Faça backup primeiro se os dados importam. Um `docker compose down` simples (sem `-v`) mantém seus volumes. - - -## Segurança - -- Sempre gere valores fortes para `BETTER_AUTH_SECRET` e `ENCRYPTION_KEY` (`openssl rand -base64 32`) e um `POSTGRES_PASSWORD` de verdade. -- Não faça commit do `.env` (`echo ".env" >> .gitignore`; `chmod 600 .env`). -- Não faça commit de secrets (client secrets, API keys) no `.env` ou no arquivo do compose. diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/deploy/kubernetes.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/deploy/kubernetes.mdx deleted file mode 100644 index 3d9b9d04e6..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/deploy/kubernetes.mdx +++ /dev/null @@ -1,493 +0,0 @@ ---- -title: "Kubernetes" -description: Faça deploy do deco Studio e dos sandboxes de agentes no Kubernetes usando Helm -icon: Rocket ---- - -import Callout from "../../../../../../components/ui/Callout.astro"; - -Este guia faz o deploy do deco Studio e dos sandboxes hospedados de agentes no Kubernetes. - -Código-fonte dos charts: - -- [Studio](https://github.com/decocms/studio/tree/main/deploy/helm/studio) -- [Operador de sandbox](https://github.com/decocms/studio/tree/main/deploy/helm/sandbox-operator) -- [Ambiente de sandbox](https://github.com/decocms/studio/tree/main/deploy/helm/sandbox-env) - - - **Caminho mais fácil:** para uma instalação de um comando com dependências embutidas (local ou cluster de POC), use o [umbrella chart](https://github.com/decocms/studio/tree/main/selfhost/examples/k8s-local) ou `selfhost/scripts/local-k8s.sh` (veja o [Quickstart](/pt-br/studio/self-hosting/quickstart)). Há também um **guia para agentes de código** ([`SKILL.md`](https://github.com/decocms/studio/blob/main/selfhost/skills/self-host-studio/SKILL.md)) que entrevista você e escreve um diretório de instalação reutilizável — um umbrella chart com dependências OCI fixadas mais os seus values. Esta página é a **referência do chart** para instalar direto e para produção — o guia completo de dependências (Postgres/S3/ClickHouse managed ou in-cluster, secrets com/sem ESO, ingress, sandbox) está em [`selfhost/production`](https://github.com/decocms/studio/tree/main/selfhost/production). - - -Para entender a arquitetura em runtime (separação web/API/worker, Postgres, NATS e AgentSandbox), veja [Arquitetura](/pt-br/studio/architecture). - -## Modelo de deployment - -Um deployment de produção usa três releases Helm: - -| Chart | Escopo | Finalidade | -| --- | --- | --- | -| `chart-deco-studio` | Uma vez por ambiente do Studio | Executa um front door nginx com dois containers de API por pod, workers de fila, NATS, persistência e componentes opcionais de observabilidade | -| `sandbox-operator` | Uma vez por cluster Kubernetes | Instala o controller e os CRDs do [agent-sandbox](https://github.com/kubernetes-sigs/agent-sandbox) do Kubernetes SIGs | -| `sandbox-env` | Uma vez por ambiente do Studio | Instala o `SandboxTemplate`, o RBAC do runner, o Secret sentinela e, opcionalmente, warm pool, Gateway de preview e housekeeper de recursos ociosos | - -O operador é uma infraestrutura compartilhada no cluster. Cada release `sandbox-env` é isolada por `envName`, portanto produção, staging e outros ambientes do Studio podem compartilhar o operador e o namespace `agent-sandbox-system` sem colisões de nomes. - -Quando um agente hospedado precisa de um sandbox, o Studio cria um `SandboxClaim`. O operador transforma o claim em um pod efêmero baseado no `SandboxTemplate` do ambiente. O Studio acessa o daemon via port-forward do Kubernetes para o tráfego de controle. Se o roteamento de preview estiver habilitado, o Studio também cria um `HTTPRoute` por claim para que o Gateway wildcard encaminhe diretamente para o Service do sandbox na porta 9000. - -## Pré-requisitos - -- Kubernetes 1.32+ e Helm 3 -- `kubectl` configurado para o cluster -- Um banco PostgreSQL; a topologia atual de API/worker exige PostgreSQL -- Uma StorageClass para os PVCs do Studio e do NATS JetStream gerenciado pelo chart -- Um object store compatível com S3 e credenciais para o sistema de arquivos da organização (org-fs) -- Suporte a `spec.hostUsers: true` e sidecars privilegiados em `agent-sandbox-system`; o sidecar obrigatório org-fs usa FUSE e propagação bidirecional de mounts -- Somente para URLs públicas de preview: CRDs de Gateway API, um Gateway controller, DNS wildcard e cert-manager com um `ClusterIssuer` DNS-01 ou terminação TLS no load balancer - -Em produção, agende pods de sandbox em um node pool dedicado e com taint. Esses pods executam código criado por usuários e não devem compartilhar nodes com Studio, Postgres, NATS ou workloads de observabilidade. - -## Instalar o Studio com sandboxes de agentes - -Os comandos abaixo fixam versões de chart explicitamente. Fixe também no seu deployment, em vez de acompanhar a versão mais recente. - -```bash -export STUDIO_CHART_VERSION=0.16.2 -export SANDBOX_OPERATOR_CHART_VERSION=0.1.4 -export SANDBOX_ENV_CHART_VERSION=0.17.3 -``` - -Os charts são publicados como artefatos OCI públicos, então não é preciso credencial de registry. Para escolher uma versão mais nova, liste o que está publicado: - -```bash -helm show chart oci://ghcr.io/decocms/chart-deco-studio | grep '^version:' -helm show chart oci://ghcr.io/decocms/studio/charts/sandbox-operator | grep '^version:' -helm show chart oci://ghcr.io/decocms/studio/charts/sandbox-env | grep '^version:' -``` - -Todas as versões publicadas também aparecem nas páginas dos pacotes: [chart-deco-studio](https://github.com/orgs/decocms/packages/container/package/chart-deco-studio), [sandbox-operator](https://github.com/orgs/decocms/packages/container/package/studio%2Fcharts%2Fsandbox-operator), [sandbox-env](https://github.com/orgs/decocms/packages/container/package/studio%2Fcharts%2Fsandbox-env). - -### 1. Instale o operador de sandbox do cluster - -O chart do operador não tem valores configuráveis e precisa ser instalado em `agent-sandbox-system`, pois o manifesto versionado do controller usa esse namespace. - -```bash -helm install sandbox-operator \ - oci://ghcr.io/decocms/studio/charts/sandbox-operator \ - --version "$SANDBOX_OPERATOR_CHART_VERSION" \ - --namespace agent-sandbox-system \ - --create-namespace -``` - -Verifique o controller e os CRDs: - -```bash -kubectl rollout status deployment/agent-sandbox-controller \ - -n agent-sandbox-system --timeout=300s -kubectl get crd sandboxclaims.extensions.agents.x-k8s.io \ - sandboxtemplates.extensions.agents.x-k8s.io \ - sandboxwarmpools.extensions.agents.x-k8s.io -``` - -### 2. Configure e instale o Studio - -Sandboxes hospedados exigem object storage compatível com S3. O Studio só o considera configurado quando as quatro variáveis obrigatórias estão presentes: - -| Variável | Obrigatória | Descrição | -| --- | --- | --- | -| `S3_ENDPOINT` | Sim | Endpoint completo da API compatível com S3, como `https://s3.us-east-1.amazonaws.com` | -| `S3_BUCKET` | Sim | Bucket que armazena o org-fs | -| `S3_ACCESS_KEY_ID` | Sim | Access key usada pelo Studio | -| `S3_SECRET_ACCESS_KEY` | Sim | Secret key usada pelo Studio | -| `S3_REGION` | Depende do provider | O padrão é `auto`; defina a região real para AWS S3 | -| `S3_FORCE_PATH_STYLE` | Depende do provider | Defina `false` para endereçamento virtual-hosted do AWS S3; normalmente `true` para MinIO e providers path-style | - -As credenciais precisam de `s3:ListBucket` no bucket e `s3:GetObject`, `s3:PutObject` e `s3:DeleteObject` nos objetos. Essas variáveis configuram o sistema de arquivos da organização e são separadas do sidecar opcional de backup `s3Sync.*` e das configurações `MONITORING_S3_*`. - -Armazene as variáveis S3 junto com `DATABASE_URL`, `BETTER_AUTH_SECRET` e `ENCRYPTION_KEY` no Secret do Kubernetes consumido pelo Studio. Não coloque credenciais em `configMap.meshConfig` nem na release `sandbox-env`; os pods de sandbox acessam o org-fs pela API autenticada do Studio e não recebem as chaves S3 diretamente. - -Crie `studio-values.yaml`. `envName`, o sufixo do template, o namespace do Studio, o nome da release e o nome da service account precisam corresponder à release `sandbox-env` instalada na próxima etapa. - -```yaml -database: - engine: postgresql - url: "" # fornecido como DATABASE_URL pelo Secret existente - -serviceAccount: - create: true - name: deco-studio - automount: true - -configMap: - meshConfig: - BETTER_AUTH_URL: "https://studio.example.com" - BASE_URL: "https://studio.example.com" - STUDIO_AGENT_SANDBOX_ENABLED: "true" - STUDIO_ENV: "production" - STUDIO_SANDBOX_TEMPLATE_NAME: "studio-sandbox-production" - -secret: - secretName: deco-studio-secrets -``` - - - `configMap.meshConfig` é um nome de chave obsoleto do chart, mantido para - compatibilidade de upgrade. Seus valores configuram a API do Studio. - - - - O Secret existente `deco-studio-secrets` precisa conter `DATABASE_URL`, `BETTER_AUTH_SECRET`, `ENCRYPTION_KEY`, `S3_ENDPOINT`, `S3_BUCKET`, `S3_ACCESS_KEY_ID` e `S3_SECRET_ACCESS_KEY`, além de `S3_REGION` e `S3_FORCE_PATH_STYLE` específicos do provider. Prefira `externalSecret` ou outro gerenciador de secrets em produção; não faça commit desses valores no Git. - - -Provisione `deco-studio-secrets` no namespace `deco-studio` antes de executar a instalação Helm abaixo. Como alternativa, configure os valores `externalSecret` do chart para criá-lo a partir do AWS Secrets Manager. - -Instale o chart da aplicação: - -```bash -helm install deco-studio \ - oci://ghcr.io/decocms/chart-deco-studio \ - --version "$STUDIO_CHART_VERSION" \ - --namespace deco-studio \ - --create-namespace \ - --values studio-values.yaml -``` - - - **A primeira instalação contra um banco vazio migra antes de servir.** O Studio pega um advisory lock do Postgres em volta da migração do schema de sistema do DBOS, então quem chegar primeiro migra e os outros esperam — não é preciso ajustar contagem de réplicas, com ou sem Argo CD. O chart também traz um Job de migração com escritor único (`migrateJob.enabled`, ligado por padrão). Não é ele que dá a garantia — é o lock — mas ele dá à migração um lugar nomeado que ou teve sucesso ou falhou, em vez de ser o pod que ganhou a corrida. No Argo CD o sync wave segura os Deployments até o Job terminar; no `helm install` puro o Job sobe junto com os primeiros pods, o que é inofensivo assim que os pods carregam o lock. - - -O Deployment principal contém nginx e dois containers de API. O Deployment separado de workers é obrigatório e vem habilitado por padrão. O chart também habilita sua dependência NATS por padrão e exige PostgreSQL para que pods de API e worker compartilhem a fila DBOS. - -### 3. Instale os recursos de sandbox do ambiente - -```bash -helm install sandbox-env-production \ - oci://ghcr.io/decocms/studio/charts/sandbox-env \ - --version "$SANDBOX_ENV_CHART_VERSION" \ - --namespace agent-sandbox-system \ - --set envName=production \ - --set mesh.namespace=deco-studio \ - --set mesh.serviceAccountName=deco-studio -``` - -Isso cria `SandboxTemplate/studio-sandbox-production` e concede somente à service account indicada do Studio permissão para gerenciar claims, ler sandboxes, abrir port-forward para pods de sandbox, alterar seus Services e gerenciar objetos `HTTPRoute` por claim em `agent-sandbox-system`. - - - A chave `mesh.*` do chart de sandbox tem um nome obsoleto e é mantida para - compatibilidade de upgrade; ela aponta para a release do Studio. - `mesh.serviceName`, `mesh.servicePort` e `mesh.podSelectorLabels` estão - obsoletos e não são usados pelo design atual de roteamento de preview por - claim. Novas instalações não precisam definir esses três campos. - - -### 4. Verifique o deployment completo - -```bash -helm status deco-studio -n deco-studio -helm status sandbox-operator -n agent-sandbox-system -helm status sandbox-env-production -n agent-sandbox-system - -kubectl get deployments,pods -n deco-studio -kubectl get deployment -n agent-sandbox-system -kubectl get sandboxtemplate,sandboxwarmpool -n agent-sandbox-system -kubectl auth can-i create sandboxclaims.extensions.agents.x-k8s.io \ - --as=system:serviceaccount:deco-studio:deco-studio \ - -n agent-sandbox-system -``` - -Para acessar o Studio antes de configurar ingress: - -```bash -kubectl port-forward svc/deco-studio 8080:80 -n deco-studio -``` - -O Studio estará disponível em `http://localhost:8080`. - -### 5. Exponha o Studio - -O Service do chart é `ClusterIP` e o Ingress é opcional e desligado por padrão, porque controller, class, emissor de TLS e annotations variam por cluster. Escolha a opção que corresponde ao que você já roda. - -**Ingress (gerenciado pelo chart).** Defina `ingress.enabled` e o chart renderiza um Ingress apontando para o Service desta release — você não hardcoda o nome gerado do Service, e o objeto passa a fazer parte da release Helm, então `helm rollback` e `helm uninstall` cobrem ele: - -```yaml -ingress: - enabled: true - className: nginx - annotations: - cert-manager.io/cluster-issuer: letsencrypt - hosts: - - host: studio.example.com - paths: - - path: / - pathType: Prefix - tls: - - hosts: - - studio.example.com - secretName: studio-tls -``` - -O Studio serve a aplicação inteira a partir da raiz, então uma única regra `/` com `Prefix` por host é o formato normal. Com `ingress.enabled=true`, o chart falha ao renderizar se `hosts` estiver vazio ou se um host não tiver paths — um Ingress sem regras é aceito pelos controllers e simplesmente não roteia nada. - -**LoadBalancer.** Sem controller no cluster: defina `service.type: LoadBalancer` e aponte DNS e TLS para o load balancer. - -**Gateway API.** Deixe `ingress.enabled: false` e crie um Gateway e um HTTPRoute apontando para o mesmo Service. Isso é separado do Gateway de preview do sandbox, que é configurado pelo chart `sandbox-env`. - - - Qualquer que seja a escolha, defina `BASE_URL` e `BETTER_AUTH_URL` com a mesma URL pública `https://`. Os callbacks de autenticação são montados a partir desses valores, não do host da requisição, então uma divergência gera redirects de login que falham. - - -### 6. Conecte um provedor de IA - -Um deployment self-hosted não vem com acesso a modelos. Agentes e Decopilot ficam inutilizáveis até que um owner da organização conecte um provedor em **Settings → AI Providers** com uma chave sua — Anthropic, Google Gemini, OpenRouter ou qualquer endpoint compatível com OpenAI, incluindo um servidor vLLM self-hosted. O deco AI Gateway hospedado e seus créditos iniciais são um recurso da oferta gerenciada; não planeje um rollout self-hosted em cima deles. Veja [Provedores de IA](/pt-br/studio/ai-providers). - -Nota de egress: a menos que os modelos rodem na sua própria rede, os pods do Studio precisam de HTTPS de saída para a API do provedor. - -### 7. Configure a autenticação - -O Studio usa o Better Auth. No Kubernetes, configure por variáveis de ambiente no mesmo Secret ou ConfigMap que o chart já injeta — não há nada extra para montar: - -| Método | Variáveis | -| --- | --- | -| Login social | `AUTH_GOOGLE_CLIENT_ID` / `AUTH_GOOGLE_CLIENT_SECRET`, `AUTH_GITHUB_CLIENT_ID` / `AUTH_GITHUB_CLIENT_SECRET` | -| SSO para todo o deployment | `AUTH_SSO_DOMAIN` mais as variáveis do Microsoft Entra ID ou do Google Workspace | -| Magic link, OTP por e-mail, e-mail/senha | `AUTH_MAGIC_LINK_ENABLED`, `AUTH_EMAIL_OTP_ENABLED`, `AUTH_EMAIL_PASSWORD_ENABLED`, mais um provedor de e-mail (`AUTH_RESEND_API_KEY` ou `AUTH_SENDGRID_API_KEY`) | - -Veja [Autenticação](/pt-br/studio/self-hosting/authentication) para a referência completa. - - - Não existe arquivo `auth-config.json` — a autenticação é configurada inteiramente pelas variáveis de ambiente `AUTH_*` acima. Mantenha os secrets dos provedores no Secret, não em um ConfigMap. - - -## Configuração de sandbox - -### Isolamento e egress - -O container de sandbox roda como usuário não-root, com elevação de privilégio desabilitada, todas as capabilities Linux removidas, perfil seccomp `RuntimeDefault` e root filesystem somente leitura. Volumes `emptyDir` graváveis são montados onde o runtime precisa deles. - -O sidecar org-fs é obrigatório: ele usa mounts FUSE privilegiados para expor skills, uploads, outputs e diretórios home da organização em `/app/org`. Somente esse sidecar é privilegiado. `disableFsSidecar: true` é uma saída para debugging, não um modo suportado em produção. - -Por padrão, um init container de curta duração com `NET_ADMIN` instala regras de iptables e termina antes do início do código do usuário. Ele bloqueia ranges privados, link-local e de endereços compartilhados em IPv4/IPv6—que cobrem os CIDRs de pods e Services na maioria dos clusters—e permite DNS e HTTPS de saída. Sobrescreva as listas de CIDRs se o cluster usar ranges diferentes. Atualmente o chart não cria um `NetworkPolicy` do Kubernetes. Se o CNI ou firewall externo gerenciar o egress dos sandboxes, defina `netinit.enabled: false` e forneça controles equivalentes. - -Agendamento recomendado para produção: - -```yaml -nodeSelector: - workload: sandbox - -tolerations: - - key: workload - operator: Equal - value: sandbox - effect: NoSchedule - -topologySpreadConstraints: - - maxSkew: 1 - topologyKey: topology.kubernetes.io/zone - whenUnsatisfiable: ScheduleAnyway - labelSelector: - matchLabels: - app.kubernetes.io/name: studio-sandbox-production -``` - -### Warm pool - -Warm pools vêm desabilitados por padrão porque cada pod ocioso consome todo o resource request do sandbox. Habilitar um também exige que o Studio e o template de sandbox compartilhem um token sentinela. O Studio o usa somente na primeira requisição de configuração do daemon e imediatamente troca para um token específico do claim. - -Gere o token uma vez, armazene-o no Secret do Studio como `STUDIO_SANDBOX_SENTINEL_TOKEN` e passe o mesmo valor para `sandbox-env`: - -```bash -export SANDBOX_SENTINEL_TOKEN="$(openssl rand -base64 48)" - -helm upgrade sandbox-env-production \ - oci://ghcr.io/decocms/studio/charts/sandbox-env \ - --version "$SANDBOX_ENV_CHART_VERSION" \ - --namespace agent-sandbox-system \ - --reuse-values \ - --set-string sentinel.token="$SANDBOX_SENTINEL_TOKEN" \ - --set warmPool.enabled=true \ - --set warmPool.size=2 -``` - -Se `sentinel.token` for omitido, o chart gera e preserva um Secret para os pods, mas o Studio ainda precisa do mesmo valor para consumir pods do warm pool. Em GitOps, gere o valor no seu gerenciador de secrets e entregue-o aos dois namespaces. Não o coloque em `configMap.meshConfig`. - -O HPA opcional do warm pool exige `warmPool.enabled: true`, `warmPool.autoscaling.enabled: true` e pelo menos uma métrica explícita no formato `autoscaling/v2`. O chart intencionalmente não fornece uma métrica padrão. - -### Housekeeper de recursos ociosos - -O Studio atualiza a atividade dos claims, enquanto o CronJob housekeeper opcional remove claims ociosos ou irrecuperáveis, além de routes e pods órfãos. Os padrões executam a cada cinco minutos e removem claims ociosos há 15 minutos. - -```yaml -housekeeper: - enabled: true - schedule: "*/5 * * * *" - idleTtlSeconds: 900 -``` - -`STUDIO_ENV` é obrigatório quando o housekeeper está habilitado, pois seus seletores padrão são limitados ao ambiente. Sem o label correspondente, ele intencionalmente não seleciona nenhum claim. - -### Gateway de preview - - - Trate URLs públicas de preview como uma fase posterior. Elas exigem CRDs de Gateway API, um Gateway controller, DNS wildcard e certificado wildcard via DNS-01 — dependências que normalmente pertencem a outro time e a outro cronograma. Studio, agentes e execução de código funcionam sem isso; só os links compartilháveis de preview ficam de fora. - - -Sem um Gateway de preview, o Studio pode usar seu proxy de preview legado em processo quando um padrão de URL e o roteamento externo necessário são fornecidos. O design atual de produção usa Gateway API e encaminha cada preview diretamente para seu daemon de sandbox: - -```text -Browser -> load balancer -> Gateway -> HTTPRoute por claim -> Service do sandbox:9000 -``` - -Configure `sandbox-env`: - -```yaml -previewGateway: - enabled: true - gatewayClassName: istio - namespace: istio-system - domain: preview.example.com - tlsTermination: gateway - clusterIssuer: letsencrypt-dns -``` - -Depois adicione os valores correspondentes ao Studio: - -```yaml -configMap: - meshConfig: - STUDIO_SANDBOX_PREVIEW_URL_PATTERN: "https://{handle}.preview.example.com" - STUDIO_SANDBOX_PREVIEW_GATEWAY_NAME: "agent-sandbox-preview-production" - STUDIO_SANDBOX_PREVIEW_GATEWAY_NAMESPACE: "istio-system" -``` - -Nome e namespace do Gateway precisam estar ambos definidos ou ambos ausentes. Crie o DNS wildcard `*.preview.example.com` apontando para o load balancer do Gateway. Com `tlsTermination: gateway`, o `ClusterIssuer` precisa suportar DNS-01 porque certificados wildcard não podem usar HTTP-01. Use `tlsTermination: loadBalancer` quando o load balancer externo for responsável pelo certificado. - - - O handle do sandbox no hostname é a única autorização embutida da route de preview. Trate URLs de preview como secrets: handles podem aparecer em logs do CDN, load balancer e proxies. Adicione autorização no Gateway (por exemplo, `AuthorizationPolicy` do Istio ou autenticação externa do Envoy) quando o sigilo do hostname não for suficiente. - - -Cada ambiente que habilita previews precisa de um `previewGateway.domain` distinto; dois Gateways não podem associar com segurança o mesmo hostname wildcard. - -## Valores principais do Studio - -Estes padrões vêm de `deploy/helm/studio/values.yaml`: - -| Parâmetro | Descrição | Padrão | -| --- | --- | --- | -| `replicaCount` | Réplicas de pods de API | `1` | -| `image.repository` / `image.tag` | Imagem de API/worker do Studio ([tags](https://github.com/orgs/decocms/packages/container/package/studio%2Fstudio)) | `ghcr.io/decocms/studio/studio` / não definido | -| `nginx.image.repository` / `nginx.image.tag` | Imagem do front door ([tags](https://github.com/orgs/decocms/packages/container/package/studio%2Fstudio-nginx)) | `ghcr.io/decocms/studio/studio-nginx` / não definido | -| `nginx.apiMaxConns` | Requisições simultâneas que o front door envia a cada processo da API (`max_conns` do upstream); long-polls e streams ocupam um slot enquanto abertos | não definido (padrão da imagem `128`) | -| `service.type` / `service.port` | Exposição do Service | `ClusterIP` / `80` | -| `ingress.enabled` / `ingress.className` / `ingress.hosts` | Ingress opcional gerenciado pelo chart | `false` / `""` / `[]` | -| `database.engine` | Engine do banco | `postgresql` | -| `worker.enabled` / `worker.replicaCount` | Deployment de workers de fila | `true` / `2` | -| `worker.autoscaling.enabled` | HPA dos workers | `true` | -| `nats.enabled` | Subchart NATS com JetStream | `true` | -| `persistence.enabled` / `persistence.size` | PVC do Studio | `true` / `10Gi` | -| `autoscaling.enabled` | HPA da API | `false` | -| `metrics.scrape` | Anotações Prometheus nos pods | `true` | - - - `image.tag` e `nginx.image.tag` não são definidos por padrão, então ambos caem no `appVersion` do chart, que é `latest`. **Defina os dois explicitamente em produção** com uma versão publicada (por exemplo `4.152.1`) — caso contrário um restart de pod pode puxar silenciosamente um build diferente do que você validou. Um digest (`sha256:…`) também é aceito. O chart do sandbox já fixa a própria imagem; não sobrescreva com `latest`. - - -## Valores principais do sandbox - -| Parâmetro | Descrição | Padrão | -| --- | --- | --- | -| `envName` | Sufixo DNS-label dos recursos do ambiente | Obrigatório | -| `image.repository` / `image.tag` | Imagem do daemon do sandbox ([tags](https://github.com/orgs/decocms/packages/container/package/studio%2Fstudio-sandbox-go)) | `ghcr.io/decocms/studio/studio-sandbox-go` / fixada pelo chart | -| `resources.requests` | Request por sandbox | `500m` CPU / `2Gi` memória | -| `resources.limits` | Limite por sandbox | `2` CPU / `4Gi` memória / `10Gi` armazenamento efêmero | -| `mediumResources` | Overrides do segundo SandboxTemplate `-medium`, mais folgado (claims de agente headless) | `3Gi` de request / `6Gi` de limite | -| `terminationGracePeriodSeconds` | Tempo para sync final do git e unmount | `90` | -| `netinit.enabled` | Instalar política padrão de egress no iptables | `true` | -| `readOnlyRootFilesystem` | Root filesystem do sandbox somente leitura | `true` | -| `depsCache.enabled` / `depsCache.golden` | Caches de dependências locais ao node | `false` / `false` | -| `warmPool.enabled` / `warmPool.size` | Sandboxes pré-aquecidos | `false` / `0` | -| `previewGateway.enabled` | Gateway wildcard de preview | `false` | -| `housekeeper.enabled` | CronJob de limpeza de claims ociosos | `false` | - -## Upgrades e remoção - -Renderize e valide os três charts antes de aplicar mudanças: - -```bash -helm lint deploy/helm/studio \ - --set database.url=postgresql://user:pass@postgres.example.com:5432/studio -helm lint deploy/helm/sandbox-operator \ - --namespace agent-sandbox-system -helm lint deploy/helm/sandbox-env \ - --namespace agent-sandbox-system \ - --set envName=production - -helm template deco-studio deploy/helm/studio --values studio-values.yaml -helm template sandbox-operator deploy/helm/sandbox-operator \ - --namespace agent-sandbox-system -helm template sandbox-env-production deploy/helm/sandbox-env \ - --namespace agent-sandbox-system \ - --set envName=production -``` - -Arquivos no diretório `crds/` de um chart Helm são instalados uma vez, mas não são atualizados por `helm upgrade`. Quando o `appVersion` upstream do operador mudar, aplique os novos CRDs antes de atualizar o operador: - -```bash -kubectl apply -f deploy/helm/sandbox-operator/crds/agent-sandbox-crds.yaml -helm upgrade sandbox-operator deploy/helm/sandbox-operator \ - --namespace agent-sandbox-system -``` - -Desinstale os recursos de ambiente antes do operador compartilhado. Remover o operador primeiro deixa claims e custom resources sem um controller. - -```bash -helm uninstall sandbox-env-production -n agent-sandbox-system -helm uninstall deco-studio -n deco-studio -# Somente depois que todos os ambientes removerem sandbox-env: -helm uninstall sandbox-operator -n agent-sandbox-system -``` - -## Ambientes de preview por pull request - -O chart traz um bloco opcional `preview`. Ele transforma um release em um -ambiente efêmero e autocontido: um Postgres descartável no mesmo namespace, as -migrations executadas uma única vez por um Job em vez de disputadas entre os -pods, e um `HTTPRoute` apontando para um `Gateway` wildcard compartilhado. -Serve para revisar uma mudança antes do merge — um Studio descartável por pull -request. - -`preview.enabled` é `false` por padrão e todos os templates de preview dependem -dele, então uma instalação normal renderiza exatamente o que renderizava antes. -Você não precisa disso para self-host do Studio, e deve deixá-lo desligado a -menos que esteja montando um pipeline de revisão. - -Ligá-lo exige um orquestrador que crie e destrua um ambiente por pull request. -A sugestão é o Argo CD, e o chart `chart-deco-studio-previews` neste -repositório entrega essa metade: um `ApplicationSet` cujo generator de pull -request observa um repositório em busca de uma label, mais o `Gateway` -compartilhado. Aponte-o para o seu repositório, domínio e object storage — ele -não tem defaults. - -```bash -helm template studio-previews deploy/helm/studio-previews \ - --set domain=pr.example.com \ - --set applicationSet.repo.owner=sua-org \ - --set applicationSet.repo.name=seu-fork \ - --set applicationSet.repo.tokenSecret.name=preview-github-token \ - --set studioChart.repoURL=oci://ghcr.io/decocms \ - --set studioChart.version="$STUDIO_CHART_VERSION" \ - --set studioChart.valuesRepo.url=https://github.com/sua-org/seu-fork.git \ - --set images.api=ghcr.io/sua-org/studio-preview \ - --set images.nginx=ghcr.io/sua-org/studio-nginx-preview \ - --set studioValues.externalSecret.secretPath=preview/studio \ - --set studioValues.externalSecret.secretStoreName=seu-cluster-store \ - --set studioValues.objectStorage.endpoint=https://seu-endpoint \ - --set studioValues.objectStorage.bucket=seu-bucket-de-preview -``` - -Um preview não é uma produção pequena. Ele não cobre sandboxes de agente -hospedados, login por OAuth, billing, o dashboard de monitoring, e-mail de -saída, nem nada que dependa de mais de um pod. Ele também não autentica -ninguém por conta própria — coloque uma authorization policy no listener do -Gateway antes de expô-lo, porque um preview aceita cadastro por e-mail/senha e -consegue acionar agentes de LLM. - -Veja `deploy/helm/studio-previews/README.md` para o contrato completo. diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/linux-desktop-support.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/linux-desktop-support.mdx deleted file mode 100644 index 029bcae0ae..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/linux-desktop-support.mdx +++ /dev/null @@ -1,132 +0,0 @@ ---- -title: Suporte ao Linux (Desktop) -description: Arquitetura suportada, pré-requisitos e limitações conhecidas do app desktop no Linux -icon: Laptop ---- - -import Callout from "../../../../../components/ui/Callout.astro"; - - - O suporte ao Linux está em **beta**. Apenas x86_64 é compilado; ARM64 está - fora do escopo por enquanto (veja [Escopo adiado](#escopo-adiado)). - - -## Arquitetura e pacote suportados - -- **Apenas AppImage x86_64.** Ainda não há build `aarch64`. -- Compilado e testado (boot-smoke) em **Ubuntu 22.04** no CI. -- O runtime do AppImage empacotado é **estático** — ele não faz link com - `libfuse.so.2`, então não precisa de `libfuse2` instalado no disco para se - auto-extrair. Ainda assim precisa de uma interface FUSE do **kernel** - funcional para se auto-montar (veja abaixo). - -## Pré-requisitos de runtime - -O app é compilado contra **WebKitGTK 4.1** (`libwebkit2gtk-4.1`) e GTK3. Um -host sem essas bibliotecas não consegue abrir a janela. Se sua distribuição -só tiver um WebKitGTK mais antigo (4.0), o AppImage falhará ao iniciar. - -## FUSE e o filesystem `org/` - -O mount compartilhado do filesystem `org/` (um por organização, compartilhado -entre os sandboxes dessa organização) usa `rclone mount` sobre FUSE no -Linux — o equivalente no macOS é `rclone nfsmount`. Isso exige: - -- `/dev/fuse` presente no host. -- Um helper `fusermount3` (fuse3) ou `fusermount` (fuse2) no `PATH`. - -Tanto a auto-montagem do próprio AppImage quanto o mount do filesystem `org/` -degradam de forma controlada quando o FUSE não está disponível: - -- O AppImage cai para `--appimage-extract-and-run` (início mais lento, sem - auto-montagem, funciona em qualquer lugar). -- O filesystem `org/` cai para um diretório `org/` **vazio** no sandbox em vez - de falhar ao iniciar. Você também pode forçar esse fallback com - `DECOCMS_DISABLE_ORG_FS=1` caso um mount FUSE trave. - -## Armazenamento de credenciais no desktop - -Tokens de acesso e refresh são armazenados através do [D-Bus Secret -Service](https://specifications.freedesktop.org/secret-service-spec/latest/) -(via a crate `keyring`) — o mesmo mecanismo que o GNOME Keyring e o KWallet -implementam. **Não há fallback em texto plano no disco**: se nenhum provedor -de Secret Service estiver rodando, leituras e escritas de credenciais falham -diretamente, em vez de degradar silenciosamente. - -Provedores testados: **GNOME Keyring** e **KWallet**. Uma sessão headless ou -com um gerenciador de janelas mínimo, sem nenhum dos dois rodando, não -conseguirá fazer login. - -## Isolamento da origem de preview (limitação conhecida) - -Por padrão, a origem de controle local do app desktop no Linux é uma origem -`http://localhost` simples, não HTTPS — a mesma origem que o harness de -self-test sempre usou. Uma origem HTTPS opt-in (uma exceção de certificado -por host no WebKitGTK, sem integração com o armazém de confiança do SO) está -disponível via `DECOCMS_LINUX_SECURE_ORIGIN=1`, desligada por padrão neste -primeiro lançamento porque uma falha de confiança no webview deixaria um -usuário de AppImage sem janela e sem gerenciador de pacotes para reinstalar. - -Até que a origem segura isolada seja o padrão no Linux, trate a origem do -iframe de preview do app desktop no Linux como menos isolada que a do macOS. -Veja a issue #6282 para o acompanhamento que torna a origem segura o padrão -no Linux. - -## Instalação, verificação, atualização e desinstalação - -A instalação usa o mesmo instalador de uma linha do macOS -(`curl -fsSL https://studio.decocms.com/install.sh | sh`), que detecta o -Linux e: - -1. Lê a versão a partir do manifesto do canal rolante `native-updates` (uma - URL fixa, com promoção limitada para só acontecer depois que os artefatos - de toda plataforma forem publicados — então pode ficar algumas versões - atrás do HEAD, mas nunca aponta para uma versão que não foi lançada para - Linux). -2. Baixa e verifica o AppImage: - - **Com `minisign` instalado**: verifica o tarball contra a chave pública - minisign embutida no script do instalador — uma âncora de uma origem - diferente (`studio.decocms.com`) da CDN do GitHub que serve o release, - portanto uma verificação de autenticidade genuína. - - **Sem `minisign`**: cai para o `.sha256` publicado, que só detecta um - download corrompido ou truncado — o digest e o binário compartilham a - mesma origem, então isso não é uma garantia de segurança. Instale o - `minisign` para uma verificação real. -3. Instala em `~/.local/bin/deco-studio`, com uma entrada de launcher em - `~/.local/share/applications` e ícone, substituindo qualquer instalação - anterior no lugar. -4. Verifica a disponibilidade do FUSE e cai para - `--appimage-extract-and-run` quando indisponível. - -**Atualização**: o app instalado consulta o mesmo canal `native-updates` e -aplica atualizações ao fechar — verificadas por assinatura com a mesma chave -minisign. **Desinstalação**: remova `~/.local/bin/deco-studio`, -`~/.local/share/applications/deco-studio.desktop`, seu ícone em -`~/.local/share/icons/hicolor/256x256/apps/` e `~/.local/share/deco-studio/` -(o carimbo de verificação). Não há rollback automatizado; reinstale uma -versão anterior a partir da [lista de -releases](https://github.com/decocms/studio/releases) se necessário. - -## Solução de problemas - -- **O app não abre / erro "damaged" ou de mount**: rode o AppImage - diretamente com `--appimage-extract-and-run` para descartar um problema de - FUSE. -- **Janela em branco ao iniciar**: confirme que `libwebkit2gtk-4.1` está - instalado — distribuições mais antigas podem só ter a 4.0, que é - incompatível. -- **Não consegue fazer login / erros de credencial**: confirme que um - provedor de Secret Service (GNOME Keyring ou KWallet) está rodando — - `systemctl --user status gnome-keyring-daemon` ou o equivalente do seu - ambiente desktop. -- **Diretório `org/` está vazio**: o FUSE está indisponível ou o mount - falhou; esse é o fallback previsto, não uma falha. Verifique `/dev/fuse` e - se `fusermount3`/`fusermount` estão no `PATH`. -- **Logs**: os logs da aplicação e os dados de monitoramento ficam sob o - `DATA_DIR` do app — veja a página Self-Hosting → Monitoring neste guia. - -## Escopo adiado - -Explicitamente fora de escopo neste lançamento: **ARM64** para Linux, -`.deb`, `.rpm`, AUR/COPR, Flatpak e Snap. Apenas o AppImage x86_64 é -suportado. diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/monitoring.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/monitoring.mdx deleted file mode 100644 index 101c7585b8..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/monitoring.mdx +++ /dev/null @@ -1,213 +0,0 @@ ---- -title: Monitoramento -description: Como persistir e consultar dados de monitoramento em deployments self-hosted -icon: Activity ---- - -import Callout from "../../../../../components/ui/Callout.astro"; - -## Como o monitoramento funciona - -O deco Studio inclui um exporter do OpenTelemetry que grava arquivos NDJSON no diretório `DATA_DIR`. Os dados são organizados em três subdiretórios: - -- **`/metrics`** — métricas de sistema e da aplicação -- **`/logs`** — entradas de log estruturadas para cada invocação de ferramenta -- **`/traces`** — traces distribuídos das operações MCP - -Os arquivos são particionados por organização com a seguinte estrutura de caminho: - -``` -{DATA_DIR}/{type}/{org_id}/YYYY/MM/DD/HH/{uuid}.ndjson -``` - -Uma política de retenção de 30 dias com limpeza automática mantém o uso de disco sob controle. - -## Persistindo dados de monitoramento (sidecar S3) - -Por padrão, os dados de monitoramento ficam no sistema de arquivos local. Para sobreviver a reinicializações de container e habilitar armazenamento centralizado, configure um processo sidecar que sincronize periodicamente o `DATA_DIR` com o S3: - -```bash -# Example: sync monitoring data to S3 every 5 minutes -aws s3 sync $DATA_DIR/metrics s3://your-bucket/metrics -aws s3 sync $DATA_DIR/logs s3://your-bucket/logs -aws s3 sync $DATA_DIR/traces s3://your-bucket/traces -``` - - - No Kubernetes, execute isso como um container sidecar compartilhando um volume com o container principal do deco Studio. - - -## Opção A: ClickHouse (recomendado) - -Para deployments em produção, o ClickHouse fornece agregações rápidas e escaláveis sobre os dados de monitoramento. - -1. Aponte um collector OTLP para o ClickHouse. O Studio emite a telemetria de monitoramento como **log records** OpenTelemetry padrão com atributos `studio.monitoring.*`, que o exporter grava na tabela `otel_logs` — criada por ele na primeira escrita. -2. Crie a **view** `studio_monitoring_logs` sobre `otel_logs`. O dashboard lê essa view, não uma tabela, e provisioná-la é uma etapa única que a aplicação nunca executa sozinha. O DDL e as ressalvas de nomes de coluna estão em [`apps/api/src/monitoring/clickhouse-setup.md`](https://github.com/decocms/studio/blob/main/apps/api/src/monitoring/clickhouse-setup.md). -3. Defina `CLICKHOUSE_URL` com o endpoint HTTP do seu ClickHouse. Acesso de leitura basta — o Studio apenas consulta. - -Faça o deploy antes de provisionar a view, não o contrário: ela é definida sobre uma tabela que o collector cria na primeira escrita. Até a view existir, o dashboard falha em toda consulta — esperado, e resolve assim que você a cria. Não existe tabela separada de métricas: contagens, médias e percentis derivam das mesmas linhas de log. - -```bash -CLICKHOUSE_URL=https://your-clickhouse-instance:8123 -``` - - - ClickHouse é a melhor escolha para produção: lida com grandes volumes de forma eficiente, suporta agregações rápidas e possui integração nativa com S3 para carregar arquivos NDJSON. - - -## Opção B: DuckDB + S3 - -Para deployments menores que querem evitar executar um banco de dados separado, você pode usar DuckDB com armazenamento montado via S3. - -1. Monte seu bucket S3 como um sistema de arquivos local usando uma ferramenta como **s3fs**, **goofys** ou **mountpoint-s3**. -2. Defina `DATA_DIR` para o caminho montado. -3. O deco Studio grava arquivos NDJSON diretamente no mount, e o engine DuckDB embutido lê do mesmo caminho. - -```bash -# Mount S3 bucket -mountpoint-s3 your-bucket /mnt/monitoring - -# Point DATA_DIR to the mount -DATA_DIR=/mnt/monitoring -``` - -Não é necessário definir `CLICKHOUSE_URL` — o DuckDB consulta os arquivos NDJSON em disco. - -## Opção C: Google Cloud Storage (OTLP via collector) - -Para deployments self-hosted no GCP que querem **sem ClickHouse e sem disco/sidecar**, o Studio pode ler seus dados de monitoramento diretamente de um bucket no GCS. O Studio já emite os dados de monitoramento como logs OTLP padrão pela rede; você os aponta para um OpenTelemetry Collector que os grava no GCS com o exporter `google_cloud_storage`, e o engine DuckDB embutido os lê de volta pelo endpoint compatível com S3 do GCS. - -``` -Studio ──logs OTLP──▶ OTel Collector ──exporter google_cloud_storage──▶ gs://bucket//... - (OTLP JSON, cliente nativo GCS) ▲ - DuckDB embutido lê + achata na consulta -``` - -O collector **escreve** com uma service account do Google (cliente nativo do GCS — sem assinatura S3). O Studio **lê** via `httpfs` do DuckDB, que fala a API compatível com S3 do GCS, então precisa de uma chave HMAC. Ambos podem usar a **mesma** service account. - - - **Não** use o exporter `awss3` para GCS. Os checksums de request default do AWS SDK v2 são rejeitados pelo GCS (`SignatureDoesNotMatch`), e o workaround via env **não** tem efeito dentro desse exporter. Use o `google_cloud_storage`. - - -Começando do zero (ainda sem bucket)? Os passos abaixo usam a CLI `gcloud` — defina `PROJECT_ID` e um `BUCKET` globalmente único primeiro. - -**1. Crie o bucket.** (Pré-crie — o exporter reaproveita ele, veja o passo 5.) - -```bash -gcloud storage buckets create "gs://${BUCKET}" \ - --project="${PROJECT_ID}" --location=us --uniform-bucket-level-access -``` - -**2. Crie uma service account e conceda acesso ao bucket.** O `storage.admin` no escopo do bucket cobre o que o exporter precisa (escrita de objetos **e** `storage.buckets.get`, que o `reuse_if_exists` chama). Não precisa de `buckets.create` no projeto. - -```bash -gcloud iam service-accounts create studio-monitoring --project="${PROJECT_ID}" -SA="studio-monitoring@${PROJECT_ID}.iam.gserviceaccount.com" - -gcloud storage buckets add-iam-policy-binding "gs://${BUCKET}" \ - --member="serviceAccount:${SA}" --role="roles/storage.admin" -``` - -No GKE, vincule essa SA à Kubernetes SA do collector via **Workload Identity** (sem arquivo de key). Fora do GKE, crie uma key (`gcloud iam service-accounts keys create key.json --iam-account="${SA}"`) e monte com `GOOGLE_APPLICATION_CREDENTIALS`. - -**3. Crie uma chave HMAC para a leitura do Studio.** O DuckDB lê via API compatível com S3, que precisa de uma chave HMAC na mesma SA: - -```bash -gcloud storage hmac keys create "${SA}" --project="${PROJECT_ID}" -# → accessId = MONITORING_S3_ACCESS_KEY_ID (GOOG1E...) -# → secret = MONITORING_S3_SECRET_ACCESS_KEY (exibido só uma vez) -``` - -**4. Envie os logs de monitoramento do Studio para o seu collector.** Defina `MONITORING_OTLP_ENDPOINT` (ou habilite o collector no cluster) para que o Studio exporte os logs OTLP para ele. - -**5. Configure o collector para gravar OTLP-JSON no GCS.** Adicione o exporter `google_cloud_storage` ao pipeline de **logs** do collector. Ele serializa em OTLP JSON por padrão — exatamente o que o dashboard lê. - -```yaml -processors: - batch: - # Um objeto é gravado por flush. Mantenha os batches limitados para cada - # arquivo ficar bem abaixo do limite de 32 MiB por arquivo do leitor, e para - # limitar quantos objetos cada query do dashboard varre. (send_batch_max_size - # precisa ser >= send_batch_size.) - send_batch_size: 2048 - send_batch_max_size: 2048 - timeout: 60s -exporters: - google_cloud_storage: - bucket: - name: your-bucket - project_id: your-project # auto-detectado no GKE; obrigatório fora do GCP - region: us - reuse_if_exists: true # usa o bucket pré-criado; necessário p/ sobreviver a restart - file_prefix: logs - partition: - prefix: logs # o prefixo de leitura (precisa bater com MONITORING_S3_PREFIX) - format: "year=%Y/month=%m/day=%d/hour=%H" -service: - pipelines: - logs: - processors: [batch] - exporters: [google_cloud_storage] -``` - - - `reuse_if_exists: true` é obrigatório. Com o default (`false`) o exporter tenta **criar** o bucket a cada startup e falha com `409 Conflict` quando ele já existe — então o collector não reinicia. - - - - O leitor limita um arquivo a 32 MiB; arquivos maiores são ignorados. Os ajustes de `batch` acima mantêm cada objeto bem abaixo disso — limite o `send_batch_max_size` se os inputs das suas ferramentas forem grandes. (Arquivos menores e em menor quantidade também deixam cada query do dashboard mais barata.) - - -**6. Aponte o leitor do Studio para o mesmo bucket:** - -```bash -MONITORING_S3_BUCKET=your-bucket -MONITORING_S3_PREFIX=logs # bate com o partition.prefix do collector -MONITORING_S3_ENDPOINT=https://storage.googleapis.com -MONITORING_S3_ACCESS_KEY_ID= -MONITORING_S3_SECRET_ACCESS_KEY= -``` - -Quando `MONITORING_S3_BUCKET` está definida (e `CLICKHOUSE_URL` não), o dashboard lê os arquivos OTLP-JSON do bucket. As métricas (chamadas, erros, percentis de latência) são derivadas dessas mesmas linhas de log, então não há um armazenamento de métricas separado. A extensão `httpfs` que o DuckDB precisa já vem embutida na imagem oficial, então isso funciona mesmo com políticas restritas de rede de saída. - -**7. Verifique.** Faça algumas chamadas de ferramenta pelo Studio, depois confirme que os arquivos chegaram (o collector faz flush no timeout do batch) e que o dashboard popula: - -```bash -gcloud storage ls --recursive "gs://${BUCKET}/logs/" | head -``` - -**Retenção (recomendado).** Quando o bucket usa o layout de partição `year=/month=/day=` acima, cada query do dashboard poda a leitura para apenas as partições de dia cobertas pelo intervalo de datas selecionado — não varre mais o prefixo inteiro. A detecção de schema ainda *lista* os objetos sob o prefixo, então uma regra de ciclo de vida no bucket continua sendo a forma prática de limitar esse custo de listagem conforme o histórico cresce. O Studio não aplica retenção sozinho — adicione uma regra pra deletar objetos automaticamente, ex. após 30 dias: - -```bash -echo '{"rule":[{"action":{"type":"Delete"},"condition":{"age":30}}]}' > /tmp/lifecycle.json -gcloud storage buckets update "gs://${BUCKET}" --lifecycle-file=/tmp/lifecycle.json -``` - - - A exportação OTLP limita o payload de `output` de cada chamada de ferramenta em 8 KB (igual ao caminho do ClickHouse hospedado). Os **inputs** das ferramentas e todas as análises (contagens, taxa de erro, latência) não são afetados; apenas corpos de resposta muito grandes são cortados no inspetor de chamadas. - - -### Solução de problemas - -- **Collector não inicia / `409 Conflict` no bucket:** defina `bucket.reuse_if_exists: true` e pré-crie o bucket (passo 1). -- **`403 storage.buckets.get denied` no startup:** a service account do collector precisa de `storage.admin` no escopo do bucket (ou ao menos `storage.buckets.get` + escrita de objetos) — veja o passo 2. -- **Dashboard vazio / "Monitoring stats unavailable":** confirme que os objetos existem com `gcloud storage ls "gs://${BUCKET}/logs/"`; e confirme que `MONITORING_S3_PREFIX` **bate exatamente** com o `partition.prefix` do collector. -- **Studio falha ao iniciar com erro de config:** quando `MONITORING_S3_BUCKET` está definida, a access key e o secret HMAC são obrigatórios (o diretório de extensão do DuckDB já vem embutido na imagem oficial). -- **`Malformed JSON in file …`:** um objeto truncado/corrompido sob as partições `year=/…` falha a leitura inteira — o DuckDB não consegue ignorar erros de parse em JSON de objeto único. Delete o objeto citado no erro (normalmente uma escrita parcial de um collector que caiu); uma regra de retenção evita acúmulo. Objetos **fora** do layout `year=/month=/day=` (ex. dumps antigos na raiz do prefixo, ou um esquema de partição antigo) são ignorados automaticamente — a query só lê `year=*/…`. -- **`Out of Memory Error` em `queryMetricTimeseries` / `queryLlmUsageStats`:** o OOM vem de achatar o prefixo inteiro numa query. Com o layout de partição `year=/month=/day=` acima, as queries podam o scan de dados para as partições de dia do intervalo do dashboard, o que evita o problema — então primeiro confirme que o collector escreve esse layout (`gcloud storage ls` deve mostrar caminhos `year=…/month=…/day=…/`) e estreite o intervalo de datas. Se ainda estourar num container pequeno, reduza o paralelismo com `DUCKDB_THREADS` (ex. `2`) — menos threads reduz o pico de memória. Note que `DUCKDB_MEMORY_LIMIT` usa ~80% da RAM do container por padrão e **não pode exceder a memória física**, então aumentá-lo além do que o container tem não ajuda (e reduzi-lo só faz estourar mais cedo) — dê mais memória ao container. Defina também uma regra de retenção/lifecycle no bucket. - -## Variáveis de ambiente - -| Variável | Padrão | Descrição | -|----------|---------|-------------| -| `DATA_DIR` | `~/deco` | Diretório base para os arquivos NDJSON de monitoramento | -| `CLICKHOUSE_URL` | *(não definida)* | Endpoint HTTP do ClickHouse. Quando definida, a UI de monitoramento usa ClickHouse em vez de DuckDB | -| `MONITORING_OTLP_ENDPOINT` | *(usa `OTEL_EXPORTER_OTLP_ENDPOINT` como fallback)* | Endpoint OTLP para onde o Studio exporta os logs de monitoramento (seu collector) | -| `MONITORING_S3_BUCKET` | *(não definida)* | Bucket no GCS com os logs OTLP-JSON. Quando definida (e `CLICKHOUSE_URL` não), o dashboard lê deste bucket via DuckDB | -| `MONITORING_S3_PREFIX` | *(nenhum)* | Prefixo de chave dentro do bucket (igual ao `s3_prefix` do collector) | -| `MONITORING_S3_ENDPOINT` | usa `S3_ENDPOINT` como fallback | Endpoint compatível com S3, ex. `https://storage.googleapis.com` | -| `MONITORING_S3_REGION` | usa `S3_REGION` como fallback | Região para assinatura SigV4 (`auto` para GCS) | -| `MONITORING_S3_ACCESS_KEY_ID` | usa `S3_ACCESS_KEY_ID` como fallback | Chave HMAC do GCS | -| `MONITORING_S3_SECRET_ACCESS_KEY` | usa `S3_SECRET_ACCESS_KEY` como fallback | Segredo HMAC do GCS | -| `DUCKDB_MEMORY_LIMIT` | *(80% da RAM)* | Limite de memória do engine DuckDB embutido, ex. `2GB`. Reduza em containers com pouca memória | -| `DUCKDB_THREADS` | *(todas as CPUs)* | Número de threads do engine DuckDB embutido. Menos threads reduz o pico de memória | diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/quickstart.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/quickstart.mdx deleted file mode 100644 index 21d45f0dc0..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/self-hosting/quickstart.mdx +++ /dev/null @@ -1,130 +0,0 @@ ---- -title: Início Rápido -description: Execute o Studio localmente ou faça deploy na sua infraestrutura -icon: Rocket ---- - -import Callout from "../../../../../components/ui/Callout.astro"; - -## 1) Executar o deco Studio - -Escolha o tier que se encaixa. O Studio precisa de **PostgreSQL** e de um -**object store compatível com S3**; o **NATS** já vem no chart; a **sandbox** -(code-execution + previews) é uma camada opcional. A pasta [`selfhost/`](https://github.com/decocms/studio/tree/main/selfhost) -do repositório tem scripts prontos, values de exemplo e o mapa completo de dependências. - -| Tier | Como | Dependências | -|------|------|--------------| -| **Local — CLI** | `bunx decocms` | embutido, na sua máquina | -| **Local — Compose** | `docker compose -f deploy/docker-compose/docker-compose.postgres.yml up` | tudo embutido (Postgres + NATS + MinIO) | -| **Local — Kubernetes** | um `helm install` do umbrella `selfhost/examples/k8s-local` | tudo embutido (Postgres + MinIO de dev + NATS + sandbox) | -| **Produção — Kubernetes** | `helm install` [o chart](/pt-br/studio/self-hosting/deploy/kubernetes) | Postgres + S3 + NATS + ClickHouse externos/gerenciados | - - - **Prefere uma instalação guiada?** O **guia de self-host para agentes de código** ([`SKILL.md`](https://github.com/decocms/studio/blob/main/selfhost/skills/self-host-studio/SKILL.md)) entrevista você — dependências gerenciadas ou no cluster, secrets, sandbox — e escreve um diretório de instalação que fica com você: um umbrella chart com dependências OCI fixadas mais os seus values, validado com `helm template` antes de aplicar qualquer coisa. O mesmo diretório instala num cluster local e num gerenciado, e não envolve clonar este repositório. É markdown puro, então aponte qualquer agente de código para ele; no Claude Code dá para instalar como skill: - - -Adicione uma vez (o repositório é público) e diga ao Claude Code **"install Studio"**: - -```bash -curl -fsSL https://raw.githubusercontent.com/decocms/studio/main/selfhost/skills/install.sh | sh -``` - -### Opção A: local com um comando (CLI) - -```bash -bunx decocms -``` - -Instância local com PostgreSQL embutido — totalmente privada. O pacote é -publicado como `decocms`; o binário chama-se `deco`. - -### Opção B: Docker Compose (tudo embutido) - -Sobe Studio + PostgreSQL + NATS + MinIO como containers, tudo cabeado — sem -serviços externos. Imagens multi-arch (roda nativo no Apple Silicon). - -```bash -git clone https://github.com/decocms/studio.git -cd studio -docker compose -f deploy/docker-compose/docker-compose.postgres.yml up -open http://localhost:3000 # signup — primeiro usuário vira owner -``` - -Sobrescreva os defaults de dev (secrets, credenciais) via um `.env` ao lado do -compose. **Mais detalhes:** [Local: Docker Compose](/pt-br/studio/self-hosting/deploy/docker-compose) - -### Opção C: executar a partir do código-fonte - -```bash -git clone https://github.com/decocms/studio.git -cd studio -bun install -bun run dev -``` - -### Opção D: Kubernetes - -O chart oficial (`deploy/helm/studio`) é **enxuto**: sobe Studio + NATS e espera -**Postgres, object storage (S3) e ClickHouse (opcional) externos**. - -Para um **cluster local** (Rancher Desktop / kind / minikube), um umbrella chart -(`selfhost/examples/k8s-local`) compõe o chart enxuto + a camada de sandbox como -dependências Helm e adiciona Postgres + MinIO descartáveis — então um único -`helm install` sobe a stack inteira, já ligada, incluindo o sandbox: - -```bash -helm dependency build selfhost/examples/k8s-local -helm install deco-studio selfhost/examples/k8s-local -n deco-studio --create-namespace -kubectl -n deco-studio port-forward svc/deco-studio 8080:80 # → http://localhost:8080 (confiável em qualquer cluster) -# studio.localhost também funciona SE o LoadBalancer pegou a :80 — no Rancher Desktop stock o Traefik do k3s ocupa a :80, então use o port-forward -``` - -Use o release name `deco-studio`. O `./selfhost/scripts/local-k8s.sh` encapsula -isso (com espera de rollout e `uninstall`). - -Em **produção**, aponte o chart para serviços gerenciados e use external secrets -+ autoscaling. Veja [Kubernetes: Helm Chart](/pt-br/studio/self-hosting/deploy/kubernetes). - - - O quadro completo — tiers, o modelo batteries-included vs. dependências - destacáveis, a sandbox (egress lockdown + previews), runtimes locais de - Kubernetes e o posture de produção — está em [`selfhost/README.md`](https://github.com/decocms/studio/tree/main/selfhost). - - -## 2) Criar uma Connection - -Ao abrir uma nova organização, o deco Studio vai solicitar que você: - -- **Navegue pela Store** ou -- **Crie uma Connection** diretamente - forneça a URL do MCP (endpoint HTTP) e quaisquer credenciais necessárias - -A **Store** é um catálogo de Connections às quais você pode se conectar. Por padrão, a Store aponta para o **MCP Registry oficial**. - -## 3) Criar uma organização e convidar membros - -- Vá para **Members** -- Convide colegas de equipe -- Atribua roles (Admin/User) conforme necessário - -## 4) Criar um Agent (servidor virtual) - -- Vá para **Agents** -- Clique em **Create Agent** -- Escolha **Include** (apenas connections/tools selecionadas) ou **Exclude** (tudo exceto as exclusões) - -## 5) Gerar uma API key para um client - -Crie uma API key com as permissões mínimas de tools necessárias (veja [API Keys](/pt-br/studio/api-keys)). - -## 6) Verificar monitoramento - -Use o **Monitoring** para confirmar: - -- invocações de tools estão sendo registradas -- latência + taxas de erro aparecem -- filtros (intervalo de tempo, nome da tool, connection, agent) funcionam como esperado - - - O teste de fumaça mais rápido é chamar uma tool através de um endpoint de agent (assim você exercita agregação + proxy + monitoring). - diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/store.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/store.mdx deleted file mode 100644 index b4b049e63d..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/store.mdx +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: Catálogo de MCPs -description: Encontre MCPs no registry da Deco -icon: Store ---- - -A página de [Connections](/pt-br/studio/connections) lista os MCPs do registry da Deco. Pesquise no catálogo, escolha um MCP e conecte-o à sua organização. - -O catálogo vem do [registry.json no decocms/mcps](https://github.com/decocms/mcps/blob/main/registry.json). Descrições, URLs, ícones e a lista de MCPs são alterados nesse arquivo por pull request. - -O Studio mantém o arquivo em cache por cinco minutos. Se a atualização falhar, pode usar a última versão válida por até uma hora. Os itens do catálogo não ficam no banco de dados do Studio. - -As conexões instaladas mantêm suas configurações e credenciais no Studio. Também é possível adicionar uma conexão personalizada pela página de Connections. diff --git a/apps/docs/client/src/content/deco-studio/pt-br/studio/user-management.mdx b/apps/docs/client/src/content/deco-studio/pt-br/studio/user-management.mdx deleted file mode 100644 index 46ce527876..0000000000 --- a/apps/docs/client/src/content/deco-studio/pt-br/studio/user-management.mdx +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: User Management -description: Controle quem pode acessar sua organização e o que cada um pode fazer -icon: Users ---- - -import Callout from "../../../../components/ui/Callout.astro"; - -## Como funciona o controle de acesso - -O deco Studio ajuda você a gerenciar quem pode fazer o quê na sua org. Pense nisso como gerenciar o acesso a um Google Drive compartilhado ou a uma organização no Slack — você decide quem está no seu time e o que cada um pode fazer. - -Existem duas formas principais de controlar o acesso: - -- **Roles dos members do time** — O que as pessoas da sua org podem fazer (visualizar, editar, gerenciar configurações, etc.) -- **Permissions de API keys** — O que sistemas automatizados ou tools externas podem fazer quando se conectam à sua org - -## Roles do time - -Quando você cria uma org, automaticamente recebe três roles para atribuir aos members do time: - -- **Owner**: Controle total sobre tudo, incluindo deletar a org ou remover members do time -- **Admin**: Pode gerenciar operações do dia a dia, como adicionar connections, criar agents e convidar usuários -- **Member**: Acesso básico para visualizar e usar connections existentes (ótimo para members do time que só precisam trabalhar com o que já está configurado) - -### Criando roles personalizados - -Precisa de algo mais específico? Você pode criar roles personalizados de acordo com as necessidades do seu time. - -**Exemplo**: Crie um role "Developer" que pode gerenciar connections e agents, mas não pode deletar nada, ou um role "Viewer" que só pode ver o que está configurado sem fazer alterações. - -Para criar um role personalizado: - -1. Vá em **Settings → Roles** -2. Clique em **Create Role** -3. Dê um nome a ele (como "Developer" ou "Support Team") -4. Selecione quais ações esse role deve ter permissão para realizar - -Depois atribua o role às pessoas a partir da página **Members**. - - - **Dica**: Comece com a menor quantidade de acesso necessária e adicione mais permissions conforme for preciso. É mais fácil conceder mais acesso depois do que lidar com alterações ou exclusões acidentais. - - -## Permissions de API keys - -As API keys permitem que tools externas ou sistemas automatizados acessem sua org sem exigir que alguém faça login. Quando você cria uma API key, você escolhe exatamente o que ela tem permissão para fazer. - -**Exemplos de casos de uso**: -- Um sistema de monitoramento que só precisa ler o status das connections -- Um script de deploy que precisa criar novas connections -- Uma integração de terceiros que só deve acessar agents específicos - -**Boa prática**: Dê a cada API key apenas as permissions de que ela realmente precisa. Se um script apenas lê dados, não dê a ele permissão para deletar coisas. - -## Onde gerenciar o acesso - -Você vai trabalhar com essas configurações em alguns lugares diferentes: - -- **Página Members**: Convide colegas de time e atribua roles -- **Página Roles** (**Settings → Roles**): Crie e edite roles personalizados -- **API Keys**: Gerenciadas via tools de MCP management ou pela API (veja [API Keys](/pt-br/studio/api-keys)) -- **Página Agents**: Controle quais tools e connections cada agent pode acessar (útil para limitar o que assistentes de IA ou automations podem fazer) - -## Exemplos práticos - -### Dar acesso de admin a um member do time - -**Quando**: Você quer que alguém ajude a gerenciar connections e convidar novos members do time - -1. Vá em **Members** -2. Encontre o nome da pessoa -3. Clique no role atual dela (provavelmente "Member") -4. Selecione **Admin** - -### Criar uma API key para uma tool de monitoramento - -**Quando**: Você tem um sistema que precisa verificar se suas connections estão funcionando - -Use as tools de MCP management ou a API para criar uma key com permissions somente leitura para connections. Veja [API Keys](/pt-br/studio/api-keys) para detalhes sobre como criar keys com permissions escopadas. - -### Configurar um role "Read-Only Analyst" - -**Quando**: Você tem members do time que precisam ver as configurações, mas não devem alterar nada - -1. Vá em **Settings → Roles** -2. Clique em **Create Role** -3. Nomeie como "Read-Only Analyst" -4. Selecione apenas permissions de visualização (sem criar, atualizar ou deletar) -5. A partir da página **Members**, atribua esse role aos members do time apropriados diff --git a/apps/docs/client/src/i18n/ui.ts b/apps/docs/client/src/i18n/ui.ts deleted file mode 100644 index ba5ae50c65..0000000000 --- a/apps/docs/client/src/i18n/ui.ts +++ /dev/null @@ -1,63 +0,0 @@ -export const languages = { - en: "English", - "pt-br": "Português (BR)", -}; - -export const defaultLang = "en"; - -export const ui = { - en: { - "head.title": "Deco - Docs", - "sidebar.section.admin-decocms-com": "Legacy Admin", - "sidebar.section.getting-started": "Getting Started", - "sidebar.section.core-concepts": "Core Concepts", - "sidebar.section.working-with-mcp": "Working with MCP", - "sidebar.section.decopilot": "Decopilot", - "sidebar.section.solutions": "Solutions", - "sidebar.section.security": "Security & Access Control", - "sidebar.section.operations": "Operations & Deployment", - "sidebar.section.reference": "Reference", - "sidebar.section.no-code-guides": "No-Code Guides", - "sidebar.section.full-code-guides": "Full-Code Guides", - "sidebar.section.studio": "deco Studio", - "sidebar.section.self-hosting": "Self-Hosting", - "sidebar.section.deploy": "Deploy", - "sidebar.section.api-reference": "API Reference", - "sidebar.section.built-in-tools": "Built-in Tools", - "hero.title": "Build AI Agents That Connect Everything", - "hero.subtitle": - "Create powerful AI agents that seamlessly integrate with your favorite tools and services. From Google Drive to Notion, build the future of automation.", - "hero.cta.primary": "Get Started", - "hero.cta.secondary": "View Documentation", - "hero.features.integrations": "100+ Integrations", - "hero.features.agents": "Unlimited Agents", - "hero.features.tools": "Powerful Tools", - }, - "pt-br": { - "head.title": "Deco - Documentação", - "sidebar.section.admin-decocms-com": "Admin Legado", - "sidebar.section.getting-started": "Primeiros Passos", - "sidebar.section.core-concepts": "Conceitos Principais", - "sidebar.section.working-with-mcp": "Trabalhando com MCP", - "sidebar.section.decopilot": "Decopilot", - "sidebar.section.solutions": "Soluções", - "sidebar.section.security": "Segurança e Controle de Acesso", - "sidebar.section.operations": "Operações e Deploy", - "sidebar.section.reference": "Referência", - "sidebar.section.no-code-guides": "Guias No-Code", - "sidebar.section.full-code-guides": "Guias Full-Code", - "sidebar.section.studio": "deco Studio", - "sidebar.section.self-hosting": "Self-Hosting", - "sidebar.section.deploy": "Deploy", - "sidebar.section.api-reference": "Referência da API", - "sidebar.section.built-in-tools": "Ferramentas Integradas", - "hero.title": "Construa Agentes de IA Que Conectam Tudo", - "hero.subtitle": - "Crie agentes de IA poderosos que se integram perfeitamente com suas ferramentas e serviços favoritos. Do Google Drive ao Notion, construa o futuro da automação.", - "hero.cta.primary": "Começar", - "hero.cta.secondary": "Ver Documentação", - "hero.features.integrations": "100+ Integrações", - "hero.features.agents": "Agentes Ilimitados", - "hero.features.tools": "Ferramentas Poderosas", - }, -} as const; diff --git a/apps/docs/client/src/i18n/utils.ts b/apps/docs/client/src/i18n/utils.ts deleted file mode 100644 index 8e7f314037..0000000000 --- a/apps/docs/client/src/i18n/utils.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { defaultLang, ui } from "./ui"; - -export function useTranslations(lang: keyof typeof ui) { - return function t(key: keyof (typeof ui)[typeof defaultLang]) { - return key in ui[lang] - ? ui[lang][key as keyof (typeof ui)[typeof lang]] - : ui[defaultLang][key]; - }; -} diff --git a/apps/docs/client/src/layouts/DocsLayout.astro b/apps/docs/client/src/layouts/DocsLayout.astro deleted file mode 100644 index 9ad1295d85..0000000000 --- a/apps/docs/client/src/layouts/DocsLayout.astro +++ /dev/null @@ -1,366 +0,0 @@ ---- -import BaseHead from "../components/ui/BaseHead.astro"; -import Footer from "../components/ui/Footer.astro"; -import Sidebar from "../components/ui/Sidebar.astro"; -import TableOfContents from "../components/ui/TableOfContents.astro"; -import { Icon } from "../components/atoms/Icon"; -import { LanguageSelector } from "../components/ui/LanguageSelector"; -import { ProductSwitcher } from "../components/ui/ProductSwitcher"; -import { ThemeToggle } from "../components/ui/ThemeToggle"; -import { getCollection } from "astro:content"; -import { siteConfig } from "../config/site"; -import { LATEST_VERSION } from "../config/versions"; -import "../styles/global.css"; -import { ClientRouter } from "astro:transitions"; -const { title, doc } = Astro.props; - -// Get current path for breadcrumbs -const currentPath = Astro.url.pathname; -const pathSegments = currentPath.split("/").filter((segment) => segment !== ""); -// Use Astro.params.locale when available (versioned routes: /[version]/[locale]/...) -// fallback to pathSegments[0] for legacy routes (/[locale]/...) -const locale = (Astro.params.locale as string) || pathSegments[0] || "en"; -const version = (Astro.params.version as string) || LATEST_VERSION.id; -const localeIndex = pathSegments.indexOf(locale); -const pagePath = - localeIndex >= 0 - ? pathSegments.slice(localeIndex + 1) - : pathSegments.slice(1); - -// Get all docs to determine folder vs file -const allDocs = await getCollection("docs"); -const docs = allDocs.filter((doc) => doc.id.split("/")[0] === locale); - -// Build tree to determine folder vs file -interface TreeNode { - name: string; - type: "file" | "folder"; - children: TreeNode[]; - doc?: any; - path: string[]; - id: string; -} - -function buildTree(docs: any[]): TreeNode[] { - const root: TreeNode[] = []; - - docs.forEach((doc: any) => { - const pathParts = doc.id.split("/").slice(1); - let currentLevel = root; - - pathParts.forEach((part: string, index: number) => { - const isFile = index === pathParts.length - 1; - const existing = currentLevel.find((node) => node.name === part); - - if (existing) { - if (isFile) { - existing.doc = doc; - } - currentLevel = existing.children; - } else { - const newNode: TreeNode = { - name: part, - type: isFile ? "file" : "folder", - children: [], - path: pathParts.slice(0, index + 1), - id: pathParts.slice(0, index + 1).join("/"), - ...(isFile && { doc }), - }; - currentLevel.push(newNode); - currentLevel = newNode.children; - } - }); - }); - - return root; -} - -const tree = buildTree(docs); - -// Helper function to find node in tree -function findNode(path: string[]): TreeNode | null { - let currentLevel = tree; - - for (const segment of path) { - const node = currentLevel.find((n) => n.name === segment); - if (!node) return null; - currentLevel = node.children; - } - - return currentLevel.length > 0 ? currentLevel[0] : null; -} - -// Build breadcrumb items (only page-specific, no Home/Documentation) -const breadcrumbItems: Array<{ - name: string; - href?: string; - isFolder: boolean; -}> = []; - -if (pagePath.length > 0) { - let currentHref = `/${locale}`; - pagePath.forEach((segment, index) => { - currentHref += `/${segment}`; - const name = - segment.charAt(0).toUpperCase() + segment.slice(1).replace(/-/g, " "); - - // Determine if this is a folder by checking if there are children - const pathSoFar = pagePath.slice(0, index + 1); - const node = findNode(pathSoFar); - const isFolder = index < pagePath.length - 1; // If not the last segment, it's a folder - - breadcrumbItems.push({ - name, - href: isFolder ? undefined : currentHref, // Only files have href - isFolder, - }); - }); -} - -// Generate GitHub edit URL -const editUrl = doc - ? `${siteConfig.githubRepo}/edit/${siteConfig.githubBranch}/apps/docs/client/src/content/${doc.id}.mdx` - : null; ---- - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - -
- -
-
-
- - -
-
- - -
-
- - -
- -
-
- - -
-
- - - {/* Edit button */} - { - editUrl && ( -
-
-

- Found an error or want to improve this page? -

- - - Edit this page - -
-
- ) - } -
- -
-
-
- - - diff --git a/apps/docs/client/src/pages/[locale]/[...slug].astro b/apps/docs/client/src/pages/[locale]/[...slug].astro deleted file mode 100644 index 023bed40ba..0000000000 --- a/apps/docs/client/src/pages/[locale]/[...slug].astro +++ /dev/null @@ -1,65 +0,0 @@ ---- -import { useTranslations } from "../../i18n/utils"; -import { ui, languages } from "../../i18n/ui"; -import DocsLayout from "../../layouts/DocsLayout.astro"; -import { getCollection } from "astro:content"; -import RenderDocument from "../../components/ui/RenderDocument.astro"; -import { LATEST_VERSION } from "../../config/versions"; - -const lang = Astro.params.locale; -const t = useTranslations(lang as keyof typeof ui); - -export async function getStaticPaths() { - const KNOWN_LOCALES = ["en", "pt-br"]; - const allDocs = await getCollection("docs"); - - return [ - ...KNOWN_LOCALES.map((locale) => ({ - params: { locale }, - props: { doc: null }, - })), - // Legacy path redirects (keep old URLs working without keeping old docs in the sidebar) - ...KNOWN_LOCALES.flatMap((locale) => [ - { - params: { locale, slug: "getting-started/context-engineers" }, - props: { doc: null }, - }, - ]), - // Legacy redirect paths: generate /en/... and /pt-br/... for all latest docs - // so old production URLs get redirected to /latest/en/... equivalents - ...allDocs - .filter((doc) => doc.id.split("/")[0] === LATEST_VERSION.id) - .map((doc) => { - const parts = doc.id.split("/"); - const locale = parts[1]; - const slug = parts.slice(2).join("/"); - - return { - params: { locale, slug }, - props: { doc: null }, - }; - }), - ]; -} - -const { doc } = Astro.props; -const slug = Astro.params.slug; - -// Legacy redirects -if (slug === "getting-started/context-engineers") { - return Astro.redirect(`/${lang}/getting-started/developers`); -} - -// Redirect to introduction if no document is found (i.e., when visiting /en or /pt-br) -// If a slug is present, preserve it so legacy /en/... URLs redirect to /latest/en/... -if (!doc) { - if (slug) { - return Astro.redirect(`/${LATEST_VERSION.id}/${lang}/${slug}`); - } - return Astro.redirect(`/${LATEST_VERSION.id}/${lang}/studio/quickstart`); -} ---- - - - - diff --git a/apps/docs/client/src/pages/[version]/[locale]/[...slug].astro b/apps/docs/client/src/pages/[version]/[locale]/[...slug].astro deleted file mode 100644 index 65dad2a99e..0000000000 --- a/apps/docs/client/src/pages/[version]/[locale]/[...slug].astro +++ /dev/null @@ -1,136 +0,0 @@ ---- -import { useTranslations } from "../../../i18n/utils"; -import { ui, languages } from "../../../i18n/ui"; -import DocsLayout from "../../../layouts/DocsLayout.astro"; -import { getCollection } from "astro:content"; -import RenderDocument from "../../../components/ui/RenderDocument.astro"; - -import { - VERSION_IDS, - LATEST_VERSION, - versions, -} from "../../../config/versions"; - -const version = Astro.params.version; -const lang = Astro.params.locale; -const t = useTranslations(lang as keyof typeof ui); - -export async function getStaticPaths() { - const allDocs = await getCollection("docs"); - - return [ - // "latest" alias paths — redirect to actual version - ...Object.keys(languages).map((locale) => ({ - params: { version: "latest", locale }, - props: { doc: null, version: "latest" }, - })), - // "latest" alias for all docs across all versions (so old /latest/en/... URLs redirect properly) - ...allDocs - .flatMap((doc) => { - const parts = doc.id.split("/"); - const locale = parts[1]; - const slug = parts.slice(2).join("/"); - // Check if this slug exists in the latest version - const existsInLatest = allDocs.some( - (d) => d.id === `${LATEST_VERSION.id}/${locale}/${slug}`, - ); - return { - params: { version: "latest", locale, slug }, - props: { doc: null, version: "latest", existsInLatest }, - }; - }) - // Deduplicate by locale+slug (same slug may exist in multiple versions) - .filter( - (entry, index, arr) => - arr.findIndex( - (e) => - e.params.locale === entry.params.locale && - e.params.slug === entry.params.slug, - ) === index, - ), - - // Old "mcp-mesh" slugs (renamed to "studio") — keep legacy URLs redirecting - ...allDocs - .filter( - (doc) => - doc.id.startsWith("deco-chat/") && doc.id.split("/")[2] === "studio", - ) - .map((doc) => { - const parts = doc.id.split("/"); - return { - params: { - version: "deco-chat", - locale: parts[1], - slug: ["mcp-mesh", ...parts.slice(3)].join("/"), - }, - props: { doc: null, version: "deco-chat" }, - }; - }), - - // Actual versioned paths - ...VERSION_IDS.flatMap((version) => [ - // Root version paths - ...Object.keys(languages).map((locale) => ({ - params: { version, locale }, - props: { doc: null, version }, - })), - // Legacy path redirects - ...Object.keys(languages).flatMap((locale) => [ - { - params: { - version, - locale, - slug: "getting-started/context-engineers", - }, - props: { doc: null, version }, - }, - ]), - // All docs filtered by version - ...allDocs - .filter((doc) => doc.id.startsWith(`${version}/`)) - .map((doc) => { - const parts = doc.id.split("/"); - const locale = parts[1]; - const slug = parts.slice(2).join("/"); - - return { - params: { version, locale, slug }, - props: { doc, version }, - }; - }), - ]), - ]; -} - -const { doc, version: propVersion, existsInLatest } = Astro.props; -const slug = Astro.params.slug; - -// Redirect "latest" alias to actual version -if (version === "latest") { - if (slug && existsInLatest) { - return Astro.redirect(`/${LATEST_VERSION.id}/${lang}/${slug}`); - } - return Astro.redirect(`/${LATEST_VERSION.id}/${lang}/${LATEST_VERSION.root}`); -} - -// Legacy redirects -if (slug?.startsWith("mcp-mesh/")) { - return Astro.redirect( - `/${version}/${lang}/${slug.replace(/^mcp-mesh\//, "studio/")}`, - ); -} -if (slug === "getting-started/context-engineers") { - return Astro.redirect(`/${version}/${lang}/getting-started/developers`); -} - -// Redirect to version root if no document is found -if (!doc) { - const versionConfig = versions.find((v) => v.id === version); - const root = versionConfig?.root ?? "studio/quickstart"; - return Astro.redirect(`/${version}/${lang}/${root}`); -} ---- - - - - diff --git a/apps/docs/client/src/pages/index.astro b/apps/docs/client/src/pages/index.astro deleted file mode 100644 index 7801ef44df..0000000000 --- a/apps/docs/client/src/pages/index.astro +++ /dev/null @@ -1,5 +0,0 @@ ---- -import { LATEST_VERSION } from "../config/versions"; - -return Astro.redirect(`/${LATEST_VERSION.id}/en/${LATEST_VERSION.root}`); ---- diff --git a/apps/docs/client/src/styles/global.css b/apps/docs/client/src/styles/global.css deleted file mode 100644 index e0b2852a93..0000000000 --- a/apps/docs/client/src/styles/global.css +++ /dev/null @@ -1,498 +0,0 @@ -/* Import fonts first */ -@import url("https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap"); -@import url("https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap"); - -/* Then import Tailwind */ -@import "tailwindcss"; -@plugin "@tailwindcss/typography"; - -/* Global font smoothing */ -* { - -webkit-font-smoothing: antialiased; -} - -/* Hide scrollbar but keep scrolling functionality */ -.scrollbar-hide { - -ms-overflow-style: none; /* Internet Explorer 10+ */ - scrollbar-width: none; /* Firefox */ -} - -.scrollbar-hide::-webkit-scrollbar { - display: none; /* Safari and Chrome */ -} - -/* Add scroll offset for anchor links */ -.prose h1, -.prose h2, -.prose h3, -.prose h4, -.prose h5, -.prose h6 { - scroll-margin-top: 2rem; /* 32px offset from top */ -} - -/* Fix cramped middle section */ -@media (min-width: 1024px) and (max-width: 1280px) { - /* Ensure content doesn't get too cramped */ - article { - min-width: 0; - flex: 1; - } -} - -/* Better content wrapping on mobile */ -@media (max-width: 1024px) { - /* Ensure code blocks don't overflow */ - pre { - overflow-x: auto; - white-space: pre; - } - - /* Better table handling */ - .prose table { - display: block; - overflow-x: auto; - white-space: nowrap; - } -} - -/* Tablet-specific adjustments */ -@media (min-width: 641px) and (max-width: 1024px) { - .prose { - font-size: 0.9375rem; /* 15px */ - } -} - -/* Mobile navigation improvements */ -@media (max-width: 1024px) { - /* Ensure mobile menu is properly positioned */ - #sidebar { - top: 0; - left: 0; - height: 100vh; - width: 100vw; - max-width: 19rem; - } - - /* Improve mobile overlay */ - #mobile-overlay { - backdrop-filter: blur(4px); - } -} - -/* Shiki dual theme support for data-theme attribute - Fixed selector */ -[data-theme="dark"] .astro-code, -[data-theme="dark"] .astro-code span { - color: var(--shiki-dark) !important; - /* Optional, if you also want font styles */ - font-style: var(--shiki-dark-font-style) !important; - font-weight: var(--shiki-dark-font-weight) !important; - text-decoration: var(--shiki-dark-text-decoration) !important; -} - -/* Override Shiki background colors with our --background variable */ -.astro-code { - background-color: var(--secondary) !important; -} - -[data-theme="dark"] .astro-code { - background-color: var(--secondary) !important; -} - -/* Pre component styling */ -pre { - border: 1px solid var(--border); - border-radius: 1rem; - padding: 1rem; -} - -[data-theme="dark"] pre { - border-color: transparent; -} - -/* Fix first line spacing in code blocks */ -pre .astro-code { - margin-top: -0.25rem; -} - -/* Target the first line specifically */ -pre .astro-code > *:first-child { - margin-top: 0 !important; - padding-top: 0 !important; -} - -/* Remove any top spacing from the first text node */ -pre .astro-code > *:first-child > *:first-child { - margin-top: 0 !important; - padding-top: 0 !important; -} - -/* Target all spans in the first line */ -pre .astro-code span:first-child { - margin-top: 0 !important; - padding-top: 0 !important; -} - -/* Remove any line-height issues */ -pre .astro-code { - line-height: 1.5 !important; -} - -/* Try text-indent approach */ -pre .astro-code { - text-indent: -0.5rem; - padding-left: 0.5rem; -} - -/* Alternative: use ::before to remove first line spacing */ -pre .astro-code::before { - content: ""; - display: block; - height: 0; - margin-top: -0.25rem; -} - -/* Last resort: target the actual text nodes */ -pre .astro-code > *:first-child { - margin-top: -0.5rem !important; -} - -/* Fix prose table margins */ -.prose table { - margin-top: 0 !important; - margin-bottom: 0 !important; -} - -/* Remove border from last table row */ -.prose table tr:last-child { - border-bottom: none !important; -} - -/* Fix prose paragraph margins in cards */ -.prose p { - margin-top: 0 !important; - margin-bottom: 0 !important; -} - -/* Remove margins from images in prose */ -.prose img { - margin-top: 0 !important; - margin-bottom: 0 !important; -} - -/* Preserve whitespace between paragraphs in prose */ -.prose p + p { - margin-top: 1rem !important; -} - -/* Fix accordion spacing when multiple */ -.prose .accordion + .accordion { - margin-top: 0.5rem !important; -} - -/* Accordion group styling */ -.accordion-group .accordion { - margin: 0 !important; - border: none !important; - border-radius: 0 !important; - border-bottom: 1px solid var(--border) !important; -} - -.accordion-group .accordion:last-child { - border-bottom: none !important; -} - -/* Component spacing - using Tailwind classes instead */ - -[data-theme="dark"] pre { - border-color: transparent; -} - -/* Remove backticks from inline code */ -.prose code::before { - content: ""; -} - -.prose code::after { - content: ""; -} - -/* Custom Scrollbar Styles */ -::-webkit-scrollbar { - width: 6px; - height: 6px; -} - -::-webkit-scrollbar-track { - background: transparent; - border-radius: 3px; -} - -::-webkit-scrollbar-thumb { - background: var(--border); - border-radius: 3px; - transition: background-color 0.2s ease; -} - -::-webkit-scrollbar-thumb:hover { - background: var(--muted-foreground); -} - -::-webkit-scrollbar-corner { - background: transparent; -} - -/* Firefox scrollbar */ -* { - scrollbar-width: thin; - scrollbar-color: var(--border) transparent; -} - -/* Custom Text Selection */ -::selection { - background: var(--primary); - color: var(--primary-foreground); -} - -::-moz-selection { - background: var(--primary); - color: var(--primary-foreground); -} - -/* Dark mode scrollbar adjustments */ -[data-theme="dark"] ::-webkit-scrollbar-track { - background: transparent; -} - -[data-theme="dark"] ::-webkit-scrollbar-thumb { - background: var(--border); -} - -[data-theme="dark"] ::-webkit-scrollbar-thumb:hover { - background: var(--muted-foreground); -} - -[data-theme="dark"] ::-webkit-scrollbar-corner { - background: transparent; -} - -[data-theme="dark"] * { - scrollbar-color: var(--border) transparent; -} - -@theme { - --font-sans: "Inter", sans-serif; - --font-mono: "JetBrains Mono", monospace; - - /* Color tokens for Tailwind */ - --color-background: var(--background); - --color-foreground: var(--foreground); - --color-app-background: var(--app-background); - --color-card: var(--card); - --color-card-foreground: var(--card-foreground); - --color-popover: var(--popover); - --color-popover-foreground: var(--popover-foreground); - --color-primary: var(--primary); - --color-primary-foreground: var(--primary-foreground); - --color-secondary: var(--secondary); - --color-secondary-foreground: var(--secondary-foreground); - --color-muted: var(--muted); - --color-muted-foreground: var(--muted-foreground); - --color-accent: var(--accent); - --color-accent-foreground: var(--accent-foreground); - --color-destructive: var(--destructive); - --color-destructive-foreground: var(--destructive-foreground); - --color-success: var(--success); - --color-success-foreground: var(--success-foreground); - --color-warning: var(--warning); - --color-warning-foreground: var(--warning-foreground); - --color-border: var(--border); - --color-input: var(--input); - --color-ring: var(--ring); - - /* Sidebar colors */ - --color-sidebar: var(--sidebar); - --color-sidebar-foreground: var(--sidebar-foreground); - --color-sidebar-primary: var(--sidebar-primary); - --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); - --color-sidebar-accent: var(--sidebar-accent); - --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); - --color-sidebar-border: var(--sidebar-border); - --color-sidebar-ring: var(--sidebar-ring); - - /* Chart colors */ - --color-chart-1: var(--chart-1); - --color-chart-2: var(--chart-2); - --color-chart-3: var(--chart-3); - --color-chart-4: var(--chart-4); - --color-chart-5: var(--chart-5); - --color-star: var(--star); - - /* Light Mode Colors */ - --background: oklch(1 0 0); - --app-background: oklch(0.9848 0.0013 106.42); - --foreground: oklch(26.8% 0.007 34.298); - --card: oklch(1 0 0); - --card-foreground: oklch(26.8% 0.007 34.298); - --popover: oklch(1 0 0); - --popover-foreground: oklch(26.8% 0.007 34.298); - --primary: oklch(0.6252 0.146802 118.8993); - --primary-foreground: oklch(1 0.146802 118.8993); - --secondary: oklch(97% 0.001 106.424); - --secondary-foreground: oklch(26.8% 0.007 34.298); - --muted: oklch(97% 0.001 106.424); - --muted-foreground: oklch(55.3% 0.013 58.071); - --accent: oklch(97% 0.001 106.424); - --accent-foreground: oklch(26.8% 0.007 34.298); - --destructive: oklch(0.577 0.245 27.325); - --destructive-foreground: oklch(1 0 0); - --success: oklch(0.654 0.184 142); - --success-foreground: oklch(0.963 0.025 137); - --warning: oklch(0.877 0.184 99); - --warning-foreground: oklch(0.293 0.071 70); - --border: oklch(92.3% 0.003 48.717); - --input: oklch(92.3% 0.003 48.717); - --ring: oklch(0.709 0.01 56.259); - --star: oklch(68.1% 0.162 75.834); - - /* Callout Colors - Light Mode (from Figma) */ - --callout-info-bg: #f5f5f4; /* stone-100 */ - --callout-info-border: #e7e5e4; /* stone-200 */ - --callout-info-text: #292524; /* stone-800 */ - --callout-warning-bg: #fffbeb; /* amber-50 */ - --callout-warning-border: #fde68a; /* amber-200 */ - --callout-warning-text: #78350f; /* amber-900 */ - --callout-error-bg: #fef2f2; /* red-50 */ - --callout-error-border: #fca5a5; /* red-300 */ - --callout-error-text: #7f1d1d; /* red-900 */ - --callout-success-bg: #f7fee7; /* lime-50 */ - --callout-success-border: #bef264; /* lime-300 */ - --callout-success-text: #365314; /* lime-900 */ - --callout-tip-bg: #f7fee7; /* lime-50 */ - --callout-tip-border: #bef264; /* lime-300 */ - --callout-tip-text: #365314; /* lime-900 */ - --callout-note-bg: #f0f9ff; /* sky-50 */ - --callout-note-border: #bae6fd; /* sky-200 */ - --callout-note-text: #0c4a6e; /* sky-900 */ - - /* Chart Colors */ - --chart-1: oklch(0.646 0.222 41.116); - --chart-2: oklch(0.6 0.118 184.704); - --chart-3: oklch(0.398 0.07 227.392); - --chart-4: oklch(0.828 0.189 84.429); - --chart-5: oklch(0.769 0.188 70.08); - - /* Sidebar Specific Tokens */ - --sidebar: oklch(0.985 0.001 106.423); - --sidebar-foreground: oklch(0.147 0.004 49.25); - --sidebar-primary: oklch(0.216 0.006 56.043); - --sidebar-primary-foreground: oklch(0.985 0.001 106.423); - --sidebar-accent: oklch(0.97 0.001 106.424); - --sidebar-accent-foreground: oklch(0.216 0.006 56.043); - --sidebar-border: oklch(0.923 0.003 48.717); - --sidebar-ring: oklch(0.709 0.01 56.259); -} - -/* Custom Typography Styles - Direct CSS Override */ -.prose { - /* Light mode colors */ - --tw-prose-body: var(--color-muted-foreground); - --tw-prose-headings: var(--color-foreground); - --tw-prose-lead: var(--color-muted-foreground); - --tw-prose-links: var(--color-primary); - --tw-prose-bold: var(--color-foreground); - --tw-prose-counters: var(--color-muted-foreground); - --tw-prose-bullets: var(--color-muted-foreground); - --tw-prose-hr: var(--color-border); - --tw-prose-quotes: var(--color-foreground); - --tw-prose-quote-borders: var(--color-border); - --tw-prose-captions: var(--color-muted-foreground); - --tw-prose-th-borders: var(--color-border); - --tw-prose-td-borders: var(--color-border); -} - -.prose.prose-invert { - /* Dark mode colors */ - --tw-prose-body: var(--color-muted-foreground); - --tw-prose-headings: var(--color-foreground); - --tw-prose-lead: var(--color-muted-foreground); - --tw-prose-links: var(--color-primary); - --tw-prose-bold: var(--color-foreground); - --tw-prose-counters: var(--color-muted-foreground); - --tw-prose-bullets: var(--color-muted-foreground); - --tw-prose-hr: var(--color-border); - --tw-prose-quotes: var(--color-foreground); - --tw-prose-quote-borders: var(--color-border); - --tw-prose-captions: var(--color-muted-foreground); - --tw-prose-code: var(--color-primary); - --tw-prose-pre-code: var(--color-primary-foreground); - --tw-prose-pre-bg: var(--color-card); - --tw-prose-th-borders: var(--color-border); - --tw-prose-td-borders: var(--color-border); -} - -/* Dark Mode Colors - Using Starlight's [data-theme="dark"] approach */ -[data-theme="dark"] { - --background: oklch(21.6% 0.006 56.043); - --app-background: oklch(0.1838 0.0052 67.5); - --foreground: oklch(98.5% 0.001 106.423); - --card: oklch(26.8% 0.007 34.298); - --card-foreground: oklch(98.5% 0.001 106.423); - --popover: oklch(26.8% 0.007 34.298); - --popover-foreground: oklch(98.5% 0.001 106.423); - --primary: oklch(0.8916 0.2037 118.17); - --primary-foreground: oklch(0.3266 0.0858 149.2); - --secondary: oklch(26.8% 0.007 34.298); - --secondary-foreground: oklch(98.5% 0.001 106.423); - --muted: oklch(37.4% 0.01 67.558); - --muted-foreground: oklch(70.9% 0.01 56.259); - --accent: oklch(37.4% 0.01 67.558); - --accent-foreground: oklch(98.5% 0.001 106.423); - --destructive: oklch(0.704 0.191 22.216); - --destructive-foreground: oklch(98.5% 0.001 106.423); - --success: oklch(0.696 0.17 162.48); - --success-foreground: oklch(98.5% 0.001 106.423); - --warning: oklch(0.769 0.188 70.08); - --warning-foreground: oklch(98.5% 0.001 106.423); - --border: oklch(0.444 0.011 73.64 / 40%); - --input: oklch(44.4% 0.011 73.639); - --ring: oklch(0.553 0.013 58.071); - --star: oklch(0.9 0.15 85); - - /* Callout Colors - Dark Mode (from Figma) */ - --callout-info-bg: oklch(21.6% 0.006 56.043); /* stone-900 */ - --callout-info-border: oklch(37.4% 0.01 67.558 / 60%); /* stone-700 */ - --callout-info-text: oklch(97% 0.001 106.424); /* stone-50 */ - --callout-warning-bg: oklch(76.9% 0.188 70.08 / 10%); /* amber-950 */ - --callout-warning-border: oklch(76.9% 0.188 70.08 / 50%); /* amber-800 */ - --callout-warning-text: oklch(96.2% 0.059 95.617); /* amber-100 */ - --callout-error-bg: oklch(63.7% 0.237 25.331 / 10%); /* red-950 */ - --callout-error-border: oklch(63.7% 0.237 25.331 / 50%); /* red-800 */ - --callout-error-text: oklch(88.5% 0.062 18.334); /* red-200 */ - --callout-success-bg: oklch(76.8% 0.233 130.85 / 10%); /* lime-950 */ - --callout-success-border: oklch(76.8% 0.233 130.85 / 50%); /* lime-800 */ - --callout-success-text: oklch(96.7% 0.067 122.328); /* lime-100 */ - --callout-tip-bg: oklch(76.8% 0.233 130.85 / 10%); /* lime-950 */ - --callout-tip-border: oklch(76.8% 0.233 130.85 / 50%); /* lime-800 */ - --callout-tip-text: oklch(96.7% 0.067 122.328); /* lime-100 */ - --callout-note-bg: oklch(68.5% 0.169 237.323 / 10%); /* sky-900 */ - --callout-note-border: oklch(68.5% 0.169 237.323 / 50%); /* sky-700 */ - --callout-note-text: oklch(95.1% 0.026 236.824); /* sky-100 */ - - /* Dark Chart Colors */ - --chart-1: oklch(0.488 0.243 264.376); - --chart-2: oklch(0.696 0.17 162.48); - --chart-3: oklch(0.769 0.188 70.08); - --chart-4: oklch(0.627 0.265 303.9); - --chart-5: oklch(0.645 0.246 16.439); - - /* Dark Sidebar Tokens */ - --sidebar: oklch(0.216 0.006 56.043); - --sidebar-foreground: oklch(0.985 0.001 106.423); - --sidebar-primary: oklch(0.488 0.243 264.376); - --sidebar-primary-foreground: oklch(0.985 0.001 106.423); - --sidebar-accent: oklch(0.268 0.007 34.298); - --sidebar-accent-foreground: oklch(0.985 0.001 106.423); - --sidebar-border: oklch(0.444 0.011 73.639); - --sidebar-ring: oklch(0.553 0.013 58.071); -} diff --git a/apps/docs/client/src/utils/navigation.ts b/apps/docs/client/src/utils/navigation.ts deleted file mode 100644 index 625be90758..0000000000 --- a/apps/docs/client/src/utils/navigation.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { getCollection } from "astro:content"; -import { LATEST_VERSION } from "../config/versions"; - -export interface NavigationLink { - title: string; - description?: string; - href: string; -} - -export async function getNavigationLinks( - currentDocId: string, - locale: string, -): Promise<{ previous?: NavigationLink; next?: NavigationLink }> { - const allDocs = await getCollection("docs"); - // doc.id format: "version/locale/...path" (e.g. "deco-studio/en/studio/overview") - const [docVersion, docLocale] = currentDocId.split("/"); - const isLatest = docVersion === LATEST_VERSION.id; - const legacyPrefixes = ["no-code-guides/", "full-code-guides/"]; - const docs = allDocs.filter((doc) => { - if ( - doc.id.split("/")[0] !== docVersion || - doc.id.split("/")[1] !== docLocale - ) - return false; - // For the latest version, exclude legacy admin guides from navigation - if (isLatest) { - const path = doc.id.split("/").slice(2).join("/"); - if (legacyPrefixes.some((p) => path.startsWith(p))) return false; - } - return true; - }); - - // Define the correct order for navigation, version-aware - const latestOrder = [ - // 1. Welcome - "studio/overview", - "studio/quickstart", - - // 2. Core Concepts - "studio/concepts", - "studio/architecture", - - // 3. The product, page by page - "studio/agents", - "studio/connections", - "studio/automations", - "studio/monitoring", - "studio/ai-providers", - "studio/buckets", - "studio/library", - - // 4. Decopilot - "studio/decopilot/overview", - "studio/decopilot/context-and-tasks", - "studio/decopilot/tools", - - // 5. Digital Experience - "studio/digital-experience", - "studio/agentic-cms", - - // 6. Catalog & admin - "studio/store", - "studio/api-keys", - "studio/secrets", - "studio/user-management", - - // 9. API Reference (the external HTTP API) - "studio/api-reference/connection-proxy", - "studio/api-reference/external-agent-integration", - - // 10. Self-Hosting - "studio/self-hosting/quickstart", - "studio/self-hosting/authentication", - "studio/self-hosting/monitoring", - "studio/self-hosting/linux-desktop-support", - "studio/self-hosting/deploy/docker-compose", - "studio/self-hosting/deploy/kubernetes", - ]; - - const previousOrder = [ - // Introduction - "introduction", - - // Studio section - "studio/overview", - "studio/quickstart", - "studio/concepts", - "studio/connect-clients", - "studio/authentication", - "studio/authorization-and-roles", - "studio/mcp-servers", - "studio/mcp-gateways", - "studio/api-keys", - "studio/monitoring", - "studio/api-reference", - "studio/deploy/local-docker-compose", - "studio/deploy/kubernetes-helm-chart", - - // MCP Studio - "mcp-studio/overview", - - // Legacy Admin - "getting-started/ai-builders", - "getting-started/developers", - "no-code-guides/creating-tools", - "no-code-guides/creating-agents", - "full-code-guides/project-structure", - "full-code-guides/building-tools", - "full-code-guides/building-views", - "full-code-guides/resources", - "full-code-guides/deployment", - - // API reference (legacy location) - "api-reference/built-in-tools/user-ask", - ]; - - const order = isLatest ? latestOrder : previousOrder; - - // Sort docs according to the defined order - const sortedDocs = docs.sort((a, b) => { - // Strip version and locale prefix to get the path relative to the content root - const aPath = a.id.split("/").slice(2).join("/"); - const bPath = b.id.split("/").slice(2).join("/"); - - const aIndex = order.indexOf(aPath); - const bIndex = order.indexOf(bPath); - - // If both are in the order array, sort by their position - if (aIndex !== -1 && bIndex !== -1) { - return aIndex - bIndex; - } - - // If only one is in the order array, it comes first - if (aIndex !== -1) return -1; - if (bIndex !== -1) return 1; - - // If neither is in the order array, sort alphabetically - return aPath.localeCompare(bPath); - }); - - const currentIndex = sortedDocs.findIndex((doc) => doc.id === currentDocId); - - if (currentIndex === -1) { - return {}; - } - - const previous = currentIndex > 0 ? sortedDocs[currentIndex - 1] : undefined; - const next = - currentIndex < sortedDocs.length - 1 - ? sortedDocs[currentIndex + 1] - : undefined; - - return { - previous: previous - ? { - title: previous.data.title, - description: previous.data.description, - href: `/${docVersion}/${docLocale}/${previous.id.split("/").slice(2).join("/")}`, - } - : undefined, - next: next - ? { - title: next.data.title, - description: next.data.description, - href: `/${docVersion}/${docLocale}/${next.id.split("/").slice(2).join("/")}`, - } - : undefined, - }; -} diff --git a/apps/docs/package.json b/apps/docs/package.json deleted file mode 100644 index f6ccb103e4..0000000000 --- a/apps/docs/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "@decocms/docs", - "version": "1.0.0", - "description": "DecoCMS documentation", - "scripts": { - "dev": "astro dev", - "build": "astro build", - "check": "astro sync && tsc --noEmit", - "deploy": "bun run build && wrangler pages deploy dist/client --project-name=decocms-docs", - "astro": "astro" - }, - "dependencies": { - "@astrojs/mdx": "^5.0.6", - "@astrojs/react": "^5.0.5", - "@tailwindcss/vite": "^4.0.7", - "astro": "^6.3.3", - "lucide-react": "^0.525.0", - "react": "^19.2.6", - "react-dom": "^19.2.6", - "tailwindcss": "^4.0.7", - "typescript": "^7.0.2" - }, - "devDependencies": { - "@tailwindcss/typography": "^0.5.16", - "wrangler": "^4.40.3" - }, - "engines": { - "node": ">=22.0.0" - } -} diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json deleted file mode 100644 index 96b87962f8..0000000000 --- a/apps/docs/tsconfig.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "extends": "astro/tsconfigs/strict", - "include": ["client/.astro/types.d.ts", "client/**/*", "astro.config.mjs"], - "exclude": ["dist"], - "compilerOptions": { - "jsx": "react-jsx", - "jsxImportSource": "react" - } -} diff --git a/apps/web/README.md b/apps/web/README.md index c3f0c92eec..497a357f7a 100644 --- a/apps/web/README.md +++ b/apps/web/README.md @@ -177,7 +177,7 @@ the request. ## Related documentation - [Studio API](../api/README.md) -- [Studio documentation site](../docs/README.md) +- [Studio documentation](https://docs.decocms.com/studio) - [Repository guidelines](../../AGENTS.md) - [Testing strategy](../../TESTING.md) - [Project overview](../../README.md) diff --git a/bun.lock b/bun.lock index 9eecd7be39..4211163fea 100644 --- a/bun.lock +++ b/bun.lock @@ -92,25 +92,6 @@ "@duckdb/node-api": "^1.5.0-r.1", }, }, - "apps/docs": { - "name": "@decocms/docs", - "version": "1.0.0", - "dependencies": { - "@astrojs/mdx": "^5.0.6", - "@astrojs/react": "^5.0.5", - "@tailwindcss/vite": "^4.0.7", - "astro": "^6.3.3", - "lucide-react": "^0.525.0", - "react": "^19.2.6", - "react-dom": "^19.2.6", - "tailwindcss": "^4.0.7", - "typescript": "^7.0.2", - }, - "devDependencies": { - "@tailwindcss/typography": "^0.5.16", - "wrangler": "^4.40.3", - }, - }, "apps/native": { "name": "@decocms/native", "version": "4.417.5", @@ -501,20 +482,6 @@ "@apidevtools/json-schema-ref-parser": ["@apidevtools/json-schema-ref-parser@11.9.3", "", { "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.0" } }, "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ=="], - "@astrojs/compiler": ["@astrojs/compiler@4.0.0", "", {}, "sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA=="], - - "@astrojs/internal-helpers": ["@astrojs/internal-helpers@0.9.1", "", { "dependencies": { "picomatch": "^4.0.4" } }, "sha512-1pWuARqYom/TzuU3+0ZugsTrKlUydWKuULmDqSMTuonY+9IRDUEGKX/8PXQ1nBxRq3w85uGtd9q9SXfqEldMIQ=="], - - "@astrojs/markdown-remark": ["@astrojs/markdown-remark@7.1.2", "", { "dependencies": { "@astrojs/internal-helpers": "0.9.1", "@astrojs/prism": "4.0.2", "github-slugger": "^2.0.0", "hast-util-from-html": "^2.0.3", "hast-util-to-text": "^4.0.2", "js-yaml": "^4.1.1", "mdast-util-definitions": "^6.0.0", "rehype-raw": "^7.0.0", "rehype-stringify": "^10.0.1", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remark-smartypants": "^3.0.2", "retext-smartypants": "^6.2.0", "shiki": "^4.0.0", "smol-toml": "^1.6.0", "unified": "^11.0.5", "unist-util-remove-position": "^5.0.0", "unist-util-visit": "^5.1.0", "unist-util-visit-parents": "^6.0.2", "vfile": "^6.0.3" } }, "sha512-caXZ4Dc2St2dW8luEg22GlP0gupLdztCTQE4EzZOxW1pqWXz9mbeJEuHUkgDYcKWW8tjIHkydYDhWLVoxJ327Q=="], - - "@astrojs/mdx": ["@astrojs/mdx@5.0.6", "", { "dependencies": { "@astrojs/markdown-remark": "7.1.2", "@mdx-js/mdx": "^3.1.1", "acorn": "^8.16.0", "es-module-lexer": "^2.0.0", "estree-util-visit": "^2.0.0", "hast-util-to-html": "^9.0.5", "piccolore": "^0.1.3", "rehype-raw": "^7.0.0", "remark-gfm": "^4.0.1", "remark-smartypants": "^3.0.2", "source-map": "^0.7.6", "unist-util-visit": "^5.1.0", "vfile": "^6.0.3" }, "peerDependencies": { "astro": "^6.0.0" } }, "sha512-4dKe0ZMmqujofPNDHahzClkwinn9f8jHPcaXcgdGvPAlboD2mjzkUCofli2cBnxYAkdfhC6d50gBJ8i/cH8gHw=="], - - "@astrojs/prism": ["@astrojs/prism@4.0.2", "", { "dependencies": { "prismjs": "^1.30.0" } }, "sha512-KTivpmnz6lDsC6o9H4+DNm2SrE/GHzw8cNAvEJwAvUT+eoaEnn/4NtbDNfRRaxaJHdp15gf+tfHAWiXR4wB3BA=="], - - "@astrojs/react": ["@astrojs/react@5.0.5", "", { "dependencies": { "@astrojs/internal-helpers": "0.9.1", "@vitejs/plugin-react": "^5.2.0", "devalue": "^5.6.4", "ultrahtml": "^1.6.0", "vite": "^7.3.2" }, "peerDependencies": { "@types/react": "^17.0.50 || ^18.0.21 || ^19.0.0", "@types/react-dom": "^17.0.17 || ^18.0.6 || ^19.0.0", "react": "^17.0.2 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0" } }, "sha512-5jSFDqWqLdEyp7CEVD66A7AQEEuwLkCGR25NJ4FR5EjziZQqZTGc7hJOFZ97qb98BiU6vElrS70R8iI+HhufGQ=="], - - "@astrojs/telemetry": ["@astrojs/telemetry@3.3.2", "", { "dependencies": { "ci-info": "^4.4.0", "dset": "^3.1.4", "is-docker": "^4.0.0", "is-wsl": "^3.1.1", "which-pm-runs": "^1.1.0" } }, "sha512-j8DNruA8ors99Al39RYZPJK4DC1bKkoNm93mAMuBhY9TCNC4R8n1q7ovFnJ5qhGh5Lsh7pa1gpQVpYpsJPeTHQ=="], - "@authenio/xml-encryption": ["@authenio/xml-encryption@2.0.2", "", { "dependencies": { "@xmldom/xmldom": "^0.8.6", "escape-html": "^1.0.3", "xpath": "0.0.32" } }, "sha512-cTlrKttbrRHEw3W+0/I609A2Matj5JQaRvfLtEIGZvlN0RaPi+3ANsMeqAyCAVlH/lUIW2tmtBlSMni74lcXeg=="], "@aws-crypto/crc32": ["@aws-crypto/crc32@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg=="], @@ -701,16 +668,10 @@ "@bufbuild/protobuf": ["@bufbuild/protobuf@2.12.0", "", {}, "sha512-B/XlCaFIP8LOwzo+bz5uFzATYokcwCKQcghqnlfwSmM5eX/qTkvDBnDPs+gXtX/RyjxJ4DRikECcPJbyALA8FA=="], - "@capsizecss/unpack": ["@capsizecss/unpack@4.0.0", "", { "dependencies": { "fontkitten": "^1.0.0" } }, "sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA=="], - "@captchafox/react": ["@captchafox/react@1.12.0", "", { "dependencies": { "@captchafox/types": "^1.4.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-ALJWVvSBL3H16KMrGg3exO6EufI32zY63LBB0UC0l7jW+Ynz832tG7wwg0PbDWNle0CiN35DAfxDzH/29sDp3g=="], "@captchafox/types": ["@captchafox/types@1.5.0", "", {}, "sha512-uReDnNoAarRjhbxC0w4hEueKLCx8w22dv+XqzDjR4rUFo3fCj8Dh3A6D27OFAYlfSr/nwomDatAxz7ixwJ5y5w=="], - "@clack/core": ["@clack/core@1.3.1", "", { "dependencies": { "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-fT1qHVGAag4IEkrupZ6lRRbNCs1vS9P01KB/sG8zKgvUztbYtFBtQpjSITNwooDZ83tpsPzP0mRNs1/KVszCRA=="], - - "@clack/prompts": ["@clack/prompts@1.4.0", "", { "dependencies": { "@clack/core": "1.3.1", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-S0My7XPGIgpRWMDG8uRqalbgT+a6FmCUdOW+HaIOVVpUPHOb7RrpvjTjiODadKp06fsrVDJZlIzc6yCTp4AnxA=="], - "@clickhouse/client": ["@clickhouse/client@1.18.3", "", { "dependencies": { "@clickhouse/client-common": "1.18.3" } }, "sha512-340ngdYktL8PLUBK2QKSwe0o02tYfZSz1mSn1uXCEU8TxHvwh9pnQxElf9YHumDGj5gX/IdgxPsJTGMs82Hgug=="], "@clickhouse/client-common": ["@clickhouse/client-common@1.18.3", "", {}, "sha512-3axzO3zvrsGT5PzDenxgWscltYCNRDbhaHWUgdsmcM9OnW/VnZn9EarOcZogr9P82Z0mQh+Jd2x+p2K4TFD2fA=="], @@ -743,8 +704,6 @@ "@decocms/bindings": ["@decocms/bindings@workspace:packages/bindings"], - "@decocms/docs": ["@decocms/docs@workspace:apps/docs"], - "@decocms/e2e": ["@decocms/e2e@workspace:packages/e2e"], "@decocms/harness-runner": ["@decocms/harness-runner@workspace:packages/harness-runner"], @@ -821,57 +780,57 @@ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="], - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="], "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="], @@ -899,57 +858,57 @@ "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], - "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.3.1" }, "os": "darwin", "cpu": "arm64" }, "sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg=="], - "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="], + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.3.1" }, "os": "darwin", "cpu": "x64" }, "sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw=="], "@img/sharp-freebsd-wasm32": ["@img/sharp-freebsd-wasm32@0.35.2", "", { "dependencies": { "@img/sharp-wasm32": "0.35.2" }, "os": "freebsd" }, "sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw=="], - "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="], + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.3.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g=="], - "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="], + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.3.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ=="], - "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="], + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.3.1", "", { "os": "linux", "cpu": "arm" }, "sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg=="], - "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="], + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw=="], - "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="], + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.3.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng=="], - "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="], + "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.3.1", "", { "os": "linux", "cpu": "none" }, "sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw=="], - "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="], + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.3.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew=="], - "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="], + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A=="], - "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="], + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw=="], - "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="], + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg=="], - "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="], + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.3.1" }, "os": "linux", "cpu": "arm" }, "sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A=="], - "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="], + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.3.1" }, "os": "linux", "cpu": "arm64" }, "sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA=="], - "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="], + "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.3.1" }, "os": "linux", "cpu": "ppc64" }, "sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg=="], - "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="], + "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.3.1" }, "os": "linux", "cpu": "none" }, "sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA=="], - "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="], + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.3.1" }, "os": "linux", "cpu": "s390x" }, "sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA=="], - "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="], + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.3.1" }, "os": "linux", "cpu": "x64" }, "sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA=="], - "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="], + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.3.1" }, "os": "linux", "cpu": "arm64" }, "sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg=="], - "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="], + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.3.1" }, "os": "linux", "cpu": "x64" }, "sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg=="], - "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="], + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.35.2", "", { "dependencies": { "@emnapi/runtime": "^1.11.1" } }, "sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw=="], "@img/sharp-webcontainers-wasm32": ["@img/sharp-webcontainers-wasm32@0.35.2", "", { "dependencies": { "@img/sharp-wasm32": "0.35.2" }, "cpu": "none" }, "sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g=="], - "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="], + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.35.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ=="], - "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="], + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.35.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog=="], - "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.35.2", "", { "os": "win32", "cpu": "x64" }, "sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ=="], "@inkjs/ui": ["@inkjs/ui@2.0.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-spinners": "^3.0.0", "deepmerge": "^4.3.1", "figures": "^6.1.0" }, "peerDependencies": { "ink": ">=5" } }, "sha512-5+8fJmwtF9UvikzLfph9sA+LS+l37Ij/szQltkuXLOAXwNkBX9innfzh4pLGXIB59vKEQUtc6D4qGvhD7h3pAg=="], @@ -977,7 +936,7 @@ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], @@ -999,8 +958,6 @@ "@marsidev/react-turnstile": ["@marsidev/react-turnstile@1.5.1", "", { "peerDependencies": { "react": "^17.0.2 || ^18.0.0 || ^19.0", "react-dom": "^17.0.2 || ^18.0.0 || ^19.0" } }, "sha512-dGZeOWEh1t9AfkR0G94k48+gciIzTNz8GhEatIGTk43ZBynWFfHxmgv1ZiSPkJBYBhSqeqfgFMp+nqFbZAViyQ=="], - "@mdx-js/mdx": ["@mdx-js/mdx@3.1.1", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "acorn": "^8.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ=="], - "@mdx-js/react": ["@mdx-js/react@3.1.1", "", { "dependencies": { "@types/mdx": "^2.0.0" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw=="], "@modelcontextprotocol/ext-apps": ["@modelcontextprotocol/ext-apps@1.7.1", "", { "dependencies": { "@standard-schema/spec": "^1.1.0" }, "peerDependencies": { "@modelcontextprotocol/sdk": "^1.29.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0", "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-J3WdG1A4JSSKnSWKyU+895dBVYBV2Utgtf7fUsUK45mlkETm53a/1DR6Pm3hUGKqLLQthZLmpxOg8VPzJi/lyg=="], @@ -1097,8 +1054,6 @@ "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.40.0", "", {}, "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw=="], - "@oslojs/encoding": ["@oslojs/encoding@1.1.0", "", {}, "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ=="], - "@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.140.0", "", { "os": "android", "cpu": "arm" }, "sha512-ZfjDZ422mo7eo3b3VltqNsV9kmv1qt/sPEAMSl64iOSwhVfd0eIZ9LB79Mbs1xYXJnk7WSROwzBCKDIiVxPTvQ=="], "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.140.0", "", { "os": "android", "cpu": "arm64" }, "sha512-Ia8jSvikUX6Sf+Ht+KOCUF/k1HpR0VlmqIYymubmWDebOEGtsyliHDR6JxsZ4IX3/c/GbrB1uh09aVGQv/LQmQ=="], @@ -1555,22 +1510,6 @@ "@selderee/plugin-htmlparser2": ["@selderee/plugin-htmlparser2@0.11.0", "", { "dependencies": { "domhandler": "^5.0.3", "selderee": "^0.11.0" } }, "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ=="], - "@shikijs/core": ["@shikijs/core@4.0.2", "", { "dependencies": { "@shikijs/primitive": "4.0.2", "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw=="], - - "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag=="], - - "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2" } }, "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg=="], - - "@shikijs/langs": ["@shikijs/langs@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2" } }, "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg=="], - - "@shikijs/primitive": ["@shikijs/primitive@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw=="], - - "@shikijs/themes": ["@shikijs/themes@4.0.2", "", { "dependencies": { "@shikijs/types": "4.0.2" } }, "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA=="], - - "@shikijs/types": ["@shikijs/types@4.0.2", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg=="], - - "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], - "@simplewebauthn/browser": ["@simplewebauthn/browser@13.3.0", "", {}, "sha512-BE/UWv6FOToAdVk0EokzkqQQDOWtNydYlY6+OrmiZ5SCNmb41VehttboTetUM3T/fr6EAFYVXjz4My2wg230rQ=="], "@simplewebauthn/server": ["@simplewebauthn/server@13.3.0", "", { "dependencies": { "@hexagon/base64": "^1.1.27", "@levischuck/tiny-cbor": "^0.2.2", "@peculiar/asn1-android": "^2.6.0", "@peculiar/asn1-ecc": "^2.6.1", "@peculiar/asn1-rsa": "^2.6.1", "@peculiar/asn1-schema": "^2.6.0", "@peculiar/asn1-x509": "^2.6.1", "@peculiar/x509": "^1.14.3" } }, "sha512-MLHYFrYG8/wK2i+86XMhiecK72nMaHKKt4bo+7Q1TbuG9iGjlSdfkPWKO5ZFE/BX+ygCJ7pr8H/AJeyAj1EaTQ=="], @@ -1735,8 +1674,6 @@ "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.3", "", { "os": "win32", "cpu": "x64" }, "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw=="], - "@tailwindcss/typography": ["@tailwindcss/typography@0.5.19", "", { "dependencies": { "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg=="], - "@tailwindcss/vite": ["@tailwindcss/vite@4.3.3", "", { "dependencies": { "@tailwindcss/node": "4.3.3", "@tailwindcss/oxide": "4.3.3", "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw=="], "@tanstack/history": ["@tanstack/history@1.161.6", "", {}, "sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg=="], @@ -1919,8 +1856,6 @@ "@types/mustache": ["@types/mustache@4.2.6", "", {}, "sha512-t+8/QWTAhOFlrF1IVZqKnMRJi84EgkIK5Kh0p2JV4OLywUvCwJPFxbJAl7XAow7DVIHsF+xW9f1MVzg0L6Szjw=="], - "@types/nlcst": ["@types/nlcst@2.0.3", "", { "dependencies": { "@types/unist": "*" } }, "sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA=="], - "@types/node": ["@types/node@24.12.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g=="], "@types/node-fetch": ["@types/node-fetch@2.6.13", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.4" } }, "sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw=="], @@ -2039,8 +1974,6 @@ "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], - "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], "ai": ["ai@7.0.107", "", { "dependencies": { "@ai-sdk/gateway": "4.0.87", "@ai-sdk/provider": "4.0.17", "@ai-sdk/provider-utils": "5.0.45" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-PVYQ3W9kR8oYiGQxbg4aFIlhQzKskZm8UV+4E0zB2uKOzFr8ju3bXQncOOZtLsOgJY8vdpgyu3cXtomsfcdQYg=="], @@ -2059,16 +1992,12 @@ "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], - "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], - "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], - "array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="], - "asn1": ["asn1@0.2.6", "", { "dependencies": { "safer-buffer": "~2.1.0" } }, "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ=="], "asn1js": ["asn1js@3.0.10", "", { "dependencies": { "pvtsutils": "^1.3.6", "pvutils": "^1.1.5", "tslib": "^2.8.1" } }, "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg=="], @@ -2077,10 +2006,6 @@ "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="], - "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], - - "astro": ["astro@6.3.3", "", { "dependencies": { "@astrojs/compiler": "^4.0.0", "@astrojs/internal-helpers": "0.9.1", "@astrojs/markdown-remark": "7.1.2", "@astrojs/telemetry": "3.3.2", "@capsizecss/unpack": "^4.0.0", "@clack/prompts": "^1.1.0", "@oslojs/encoding": "^1.1.0", "@rollup/pluginutils": "^5.3.0", "aria-query": "^5.3.2", "axobject-query": "^4.1.0", "ci-info": "^4.4.0", "clsx": "^2.1.1", "common-ancestor-path": "^2.0.0", "cookie": "^1.1.1", "devalue": "^5.6.3", "diff": "^8.0.3", "dset": "^3.1.4", "es-module-lexer": "^2.0.0", "esbuild": "^0.27.3", "flattie": "^1.1.1", "fontace": "~0.4.1", "get-tsconfig": "5.0.0-beta.4", "github-slugger": "^2.0.0", "html-escaper": "3.0.3", "http-cache-semantics": "^4.2.0", "js-yaml": "^4.1.1", "jsonc-parser": "^3.3.1", "magic-string": "^0.30.21", "magicast": "^0.5.2", "mrmime": "^2.0.1", "neotraverse": "^0.6.18", "obug": "^2.1.1", "p-limit": "^7.3.0", "p-queue": "^9.1.0", "package-manager-detector": "^1.6.0", "piccolore": "^0.1.3", "picomatch": "^4.0.4", "rehype": "^13.0.2", "semver": "^7.7.4", "shiki": "^4.0.2", "smol-toml": "^1.6.0", "svgo": "^4.0.1", "tinyclip": "^0.1.12", "tinyexec": "^1.0.4", "tinyglobby": "^0.2.15", "ultrahtml": "^1.6.0", "unifont": "~0.7.4", "unist-util-visit": "^5.1.0", "unstorage": "^1.17.5", "vfile": "^6.0.3", "vite": "^7.3.2", "vitefu": "^1.1.2", "xxhash-wasm": "^1.1.0", "yargs-parser": "^22.0.0", "zod": "^4.3.6" }, "optionalDependencies": { "sharp": "^0.34.0" }, "bin": { "astro": "./bin/astro.mjs" } }, "sha512-wvLIZQYbBZt6U8gyflBW4SLBypaqdwLZUH93rT3oT53cmQ0bTGubvMAGjqBRoheOYzYcTJZtW6czztzbu4kQ5g=="], - "async-exit-hook": ["async-exit-hook@2.0.1", "", {}, "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw=="], "async-sema": ["async-sema@3.1.1", "", {}, "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg=="], @@ -2093,8 +2018,6 @@ "axe-core": ["axe-core@4.13.0", "", {}, "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A=="], - "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], - "b4a": ["b4a@1.8.0", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg=="], "babel-plugin-react-compiler": ["babel-plugin-react-compiler@1.0.0", "", { "dependencies": { "@babel/types": "^7.26.0" } }, "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw=="], @@ -2129,8 +2052,6 @@ "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="], - "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], - "bowser": ["bowser@2.14.1", "", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="], "brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="], @@ -2171,7 +2092,7 @@ "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], - "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + "character-entities-legacy": ["character-entities-legacy@1.1.4", "", {}, "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="], "character-reference-invalid": ["character-reference-invalid@1.1.4", "", {}, "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="], @@ -2181,8 +2102,6 @@ "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], - "ci-info": ["ci-info@4.4.0", "", {}, "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg=="], - "cjs-module-lexer": ["cjs-module-lexer@2.2.0", "", {}, "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ=="], "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], @@ -2205,8 +2124,6 @@ "code-excerpt": ["code-excerpt@4.0.0", "", { "dependencies": { "convert-to-spaces": "^2.0.1" } }, "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA=="], - "collapse-white-space": ["collapse-white-space@2.1.0", "", {}, "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw=="], - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], @@ -2221,8 +2138,6 @@ "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], - "common-ancestor-path": ["common-ancestor-path@2.0.0", "", {}, "sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng=="], - "concurrently": ["concurrently@9.2.1", "", { "dependencies": { "chalk": "4.1.2", "rxjs": "7.8.2", "shell-quote": "1.8.3", "supports-color": "8.1.1", "tree-kill": "1.2.2", "yargs": "17.7.2" }, "bin": { "conc": "dist/bin/concurrently.js", "concurrently": "dist/bin/concurrently.js" } }, "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng=="], "conf": ["conf@10.2.0", "", { "dependencies": { "ajv": "^8.6.3", "ajv-formats": "^2.1.1", "atomically": "^1.7.0", "debounce-fn": "^4.0.0", "dot-prop": "^6.0.1", "env-paths": "^2.2.1", "json-schema-typed": "^7.0.3", "onetime": "^5.1.2", "pkg-up": "^3.1.0", "semver": "^7.3.5" } }, "sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg=="], @@ -2239,7 +2154,7 @@ "convert-to-spaces": ["convert-to-spaces@2.0.1", "", {}, "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ=="], - "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], "cookie-es": ["cookie-es@3.1.1", "", {}, "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg=="], @@ -2259,20 +2174,10 @@ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], - - "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], - - "css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="], - - "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], - "css.escape": ["css.escape@1.5.1", "", {}, "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="], "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], - "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], - "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], @@ -2333,14 +2238,10 @@ "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], - "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], - "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], - "devalue": ["devalue@5.7.1", "", {}, "sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA=="], - "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], "diacritics": ["diacritics@1.3.0", "", {}, "sha512-wlwEkqcsaxvPJML+rDh/2iS824jbREk6DUMUKkEaSlxdYHeS43cClJtsWglvw2RfeXGm6ohKDqsXteJ5sP5enA=="], @@ -2369,8 +2270,6 @@ "driver.js": ["driver.js@1.8.0", "", {}, "sha512-+8/IO7h1v14IzWh2GP60N7T3PFZweXwdn5e5POuxRSBoCYUojsBxzqawPeXh3YZIibRy7EehYNEyxe7slwwtdg=="], - "dset": ["dset@3.1.4", "", {}, "sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA=="], - "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], "echarts": ["echarts@5.6.0", "", { "dependencies": { "tslib": "2.3.0", "zrender": "5.6.1" } }, "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA=="], @@ -2415,19 +2314,13 @@ "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - "es-module-lexer": ["es-module-lexer@2.1.0", "", {}, "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ=="], - "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], "es-toolkit": ["es-toolkit@1.46.0", "", {}, "sha512-IToJ6ct9OLl5zz6WsC/1vZEwfSZ7Myil+ygl5Tf30Xjn9AEkzNB4kqp2G7VUJKF1DtTx/ra5M5KLlXvzOg51BA=="], - "esast-util-from-estree": ["esast-util-from-estree@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ=="], - - "esast-util-from-js": ["esast-util-from-js@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw=="], - - "esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], + "esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], @@ -2437,18 +2330,8 @@ "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - "estree-util-attach-comments": ["estree-util-attach-comments@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw=="], - - "estree-util-build-jsx": ["estree-util-build-jsx@3.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" } }, "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ=="], - "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], - "estree-util-scope": ["estree-util-scope@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ=="], - - "estree-util-to-js": ["estree-util-to-js@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg=="], - - "estree-util-visit": ["estree-util-visit@2.0.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww=="], - "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], @@ -2483,14 +2366,8 @@ "fast-sha256": ["fast-sha256@1.3.0", "", {}, "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ=="], - "fast-string-truncated-width": ["fast-string-truncated-width@3.0.3", "", {}, "sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g=="], - - "fast-string-width": ["fast-string-width@3.0.2", "", { "dependencies": { "fast-string-truncated-width": "^3.0.2" } }, "sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg=="], - "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], - "fast-wrap-ansi": ["fast-wrap-ansi@0.2.0", "", { "dependencies": { "fast-string-width": "^3.0.2" } }, "sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w=="], - "fast-xml-builder": ["fast-xml-builder@1.1.5", "", { "dependencies": { "path-expression-matcher": "^1.1.3" } }, "sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA=="], "fast-xml-parser": ["fast-xml-parser@5.4.2", "", { "dependencies": { "fast-xml-builder": "^1.0.0", "strnum": "^2.1.2" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-pw/6pIl4k0CSpElPEJhDppLzaixDEuWui2CUQQBH/ECDf7+y6YwA4Gf7Tyb0Rfe4DIMuZipYj4AEL0nACKglvQ=="], @@ -2517,12 +2394,6 @@ "fix-dts-default-cjs-exports": ["fix-dts-default-cjs-exports@1.0.1", "", { "dependencies": { "magic-string": "^0.30.17", "mlly": "^1.7.4", "rollup": "^4.34.8" } }, "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg=="], - "flattie": ["flattie@1.1.1", "", {}, "sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ=="], - - "fontace": ["fontace@0.4.1", "", { "dependencies": { "fontkitten": "^1.0.2" } }, "sha512-lDMvbAzSnHmbYMTEld5qdtvNH2/pWpICOqpean9IgC7vUbUJc3k+k5Dokp85CegamqQpFbXf0rAVkbzpyTA8aw=="], - - "fontkitten": ["fontkitten@1.0.3", "", { "dependencies": { "tiny-inflate": "^1.0.3" } }, "sha512-Wp1zXWPVUPBmfoa3Cqc9ctaKuzKAV6uLstRqlR56kSjplf5uAce+qeyYym7F+PHbGTk+tCEdkCW6RD7DX/gBZw=="], - "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], "format": ["format@0.2.2", "", {}, "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww=="], @@ -2561,8 +2432,6 @@ "get-tsconfig": ["get-tsconfig@4.14.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA=="], - "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], - "glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], @@ -2573,8 +2442,6 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "h3": ["h3@1.15.11", "", { "dependencies": { "cookie-es": "^1.2.3", "crossws": "^0.3.5", "defu": "^6.1.6", "destr": "^2.0.5", "iron-webcrypto": "^1.2.1", "node-mock-http": "^1.0.4", "radix3": "^1.1.2", "ufo": "^1.6.3", "uncrypto": "^0.1.3" } }, "sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg=="], - "happy-dom": ["happy-dom@20.9.0", "", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "entities": "^7.0.1", "whatwg-mimetype": "^3.0.0", "ws": "^8.18.3" } }, "sha512-GZZ9mKe8r646NUAf/zemnGbjYh4Bt8/MqASJY+pSm5ZDtc3YQox+4gsLI7yi1hba6o+eCsGxpHn5+iEVn31/FQ=="], "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], @@ -2585,26 +2452,16 @@ "hasown": ["hasown@2.0.3", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg=="], - "hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="], - "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="], - "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="], - "hast-util-parse-selector": ["hast-util-parse-selector@2.2.5", "", {}, "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ=="], "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="], - "hast-util-to-estree": ["hast-util-to-estree@3.1.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.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.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w=="], - - "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], - "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="], - "hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="], - "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], "hastscript": ["hastscript@6.0.0", "", { "dependencies": { "@types/hast": "^2.0.0", "comma-separated-tokens": "^1.0.0", "hast-util-parse-selector": "^2.0.0", "property-information": "^5.0.0", "space-separated-tokens": "^1.0.0" } }, "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w=="], @@ -2619,8 +2476,6 @@ "hpagent": ["hpagent@1.2.0", "", {}, "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA=="], - "html-escaper": ["html-escaper@3.0.3", "", {}, "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ=="], - "html-to-text": ["html-to-text@9.0.5", "", { "dependencies": { "@selderee/plugin-htmlparser2": "^0.11.0", "deepmerge": "^4.3.1", "dom-serializer": "^2.0.0", "htmlparser2": "^8.0.2", "selderee": "^0.11.0" } }, "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg=="], "html-url-attributes": ["html-url-attributes@3.0.1", "", {}, "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ=="], @@ -2629,8 +2484,6 @@ "htmlparser2": ["htmlparser2@8.0.2", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "entities": "^4.4.0" } }, "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA=="], - "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], - "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="], "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], @@ -2669,8 +2522,6 @@ "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], - "iron-webcrypto": ["iron-webcrypto@1.2.1", "", {}, "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg=="], - "is-alphabetical": ["is-alphabetical@1.0.4", "", {}, "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="], "is-alphanumerical": ["is-alphanumerical@1.0.4", "", { "dependencies": { "is-alphabetical": "^1.0.0", "is-decimal": "^1.0.0" } }, "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A=="], @@ -2681,7 +2532,7 @@ "is-decimal": ["is-decimal@1.0.4", "", {}, "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="], - "is-docker": ["is-docker@4.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-LHE+wROyG/Y/0ZnbktRCoTix2c1RhgWaZraMZ8o1Q7zCh0VSrICJQO5oqIIISrcSBtrXv0o233w1IYwsWCjTzA=="], + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], @@ -2825,7 +2676,7 @@ "lru-cache": ["lru-cache@11.3.5", "", {}, "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw=="], - "lucide-react": ["lucide-react@0.525.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ=="], + "lucide-react": ["lucide-react@0.468.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" } }, "sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA=="], "lz-string": ["lz-string@1.5.0", "", { "bin": { "lz-string": "bin/bin.js" } }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="], @@ -2833,10 +2684,6 @@ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], - "magicast": ["magicast@0.5.2", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ=="], - - "markdown-extensions": ["markdown-extensions@2.0.0", "", {}, "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q=="], - "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], "markdown-to-jsx": ["markdown-to-jsx@8.0.0", "", { "peerDependencies": { "react": ">= 0.14.0" }, "optionalPeers": ["react"] }, "sha512-hWEaRxeCDjes1CVUQqU+Ov0mCqBqkGhLKjL98KdbwHSgEWZZSJQeGlJQatVfeZ3RaxrfTrZZ3eczl2dhp5c/pA=="], @@ -2845,8 +2692,6 @@ "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], - "mdast-util-definitions": ["mdast-util-definitions@6.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ=="], - "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], @@ -2863,8 +2708,6 @@ "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], - "mdast-util-mdx": ["mdast-util-mdx@3.0.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w=="], - "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], @@ -2879,8 +2722,6 @@ "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], - "mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], - "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], @@ -2907,22 +2748,10 @@ "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], - "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@3.0.1", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q=="], - - "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@3.0.2", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ=="], - - "micromark-extension-mdx-md": ["micromark-extension-mdx-md@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ=="], - - "micromark-extension-mdxjs": ["micromark-extension-mdxjs@3.0.0", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ=="], - - "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@3.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A=="], - "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], - "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ=="], - "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], @@ -2943,8 +2772,6 @@ "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], - "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@2.0.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg=="], - "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], @@ -2987,8 +2814,6 @@ "monaco-editor": ["monaco-editor@0.52.0", "", {}, "sha512-OeWhNpABLCeTqubfqLMXGsqf6OmPU6pHM85kF3dhy6kq5hnhuVS1p3VrEW/XhWHc71P2tHyS5JFySD8mgs1crw=="], - "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], - "ms": ["ms@4.0.0-nightly.202508271359", "", {}, "sha512-WC/Eo7NzFrOV/RRrTaI0fxKVbNCzEy76j2VqNV8SxDf9D69gSE2Lh0QwYvDlhiYmheBYExAvEAxVf5NoN0cj2A=="], "mustache": ["mustache@4.2.0", "", { "bin": { "mustache": "bin/mustache" } }, "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="], @@ -3003,24 +2828,16 @@ "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], - "neotraverse": ["neotraverse@0.6.18", "", {}, "sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA=="], - "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], - "nlcst-to-string": ["nlcst-to-string@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0" } }, "sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA=="], - "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], - "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], - "node-forge": ["node-forge@1.4.0", "", {}, "sha512-LarFH0+6VfriEhqMMcLX2F7SwSXeWwnEAJEsYm5QKWchiVYVvJyV9v7UDvUv+w5HO23ZpQTXDv/GxdDdMyOuoQ=="], "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], - "node-mock-http": ["node-mock-http@1.0.4", "", {}, "sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ=="], - "node-releases": ["node-releases@2.0.38", "", {}, "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw=="], "node-rsa": ["node-rsa@1.1.1", "", { "dependencies": { "asn1": "^0.2.4" } }, "sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw=="], @@ -3031,8 +2848,6 @@ "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], - "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], - "oauth4webapi": ["oauth4webapi@3.8.6", "", {}, "sha512-iwemM91xz8nryHti2yTmg5fhyEMVOkOXwHNqbvcATjyajb5oQxCQzrNOA6uElRHuMhQQTKUyFKV9y/CNyg25BQ=="], "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], @@ -3041,22 +2856,12 @@ "object-treeify": ["object-treeify@1.1.33", "", {}, "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A=="], - "obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="], - - "ofetch": ["ofetch@1.5.1", "", { "dependencies": { "destr": "^2.0.5", "node-fetch-native": "^1.6.7", "ufo": "^1.6.1" } }, "sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA=="], - - "ohash": ["ohash@2.0.11", "", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], - "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], - "oniguruma-parser": ["oniguruma-parser@0.12.2", "", {}, "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw=="], - - "oniguruma-to-es": ["oniguruma-to-es@4.3.6", "", { "dependencies": { "oniguruma-parser": "^0.12.2", "regex": "^6.1.0", "regex-recursion": "^6.0.2" } }, "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA=="], - "open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="], "openid-client": ["openid-client@6.8.4", "", { "dependencies": { "jose": "^6.2.2", "oauth4webapi": "^3.8.5" } }, "sha512-QSw0BA08piujetEwfZsHoTrDpMEha7GDZDicQqVwX4u0ChCjefvjDB++TZ8BTg76UpwhzIQgdvvfgfl3HpCSAw=="], @@ -3071,18 +2876,12 @@ "oxlint": ["oxlint@1.83.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.83.0", "@oxlint/binding-android-arm64": "1.83.0", "@oxlint/binding-darwin-arm64": "1.83.0", "@oxlint/binding-darwin-x64": "1.83.0", "@oxlint/binding-freebsd-x64": "1.83.0", "@oxlint/binding-linux-arm-gnueabihf": "1.83.0", "@oxlint/binding-linux-arm-musleabihf": "1.83.0", "@oxlint/binding-linux-arm64-gnu": "1.83.0", "@oxlint/binding-linux-arm64-musl": "1.83.0", "@oxlint/binding-linux-ppc64-gnu": "1.83.0", "@oxlint/binding-linux-riscv64-gnu": "1.83.0", "@oxlint/binding-linux-riscv64-musl": "1.83.0", "@oxlint/binding-linux-s390x-gnu": "1.83.0", "@oxlint/binding-linux-x64-gnu": "1.83.0", "@oxlint/binding-linux-x64-musl": "1.83.0", "@oxlint/binding-openharmony-arm64": "1.83.0", "@oxlint/binding-win32-arm64-msvc": "1.83.0", "@oxlint/binding-win32-ia32-msvc": "1.83.0", "@oxlint/binding-win32-x64-msvc": "1.83.0" }, "peerDependencies": { "oxlint-tsgolint": ">=7.0.2001", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-cyDzSzaw3uzP0TeCeq3lLRPPoaUxkbB4ZOXj+kn+5r+BX9V+4bNVGk9lxer+WrgcpebH4JxLlJ3KQjveVztOLQ=="], - "p-limit": ["p-limit@7.3.0", "", { "dependencies": { "yocto-queue": "^1.2.1" } }, "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw=="], + "p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], "p-locate": ["p-locate@3.0.0", "", { "dependencies": { "p-limit": "^2.0.0" } }, "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="], - "p-queue": ["p-queue@9.2.0", "", { "dependencies": { "eventemitter3": "^5.0.4", "p-timeout": "^7.0.0" } }, "sha512-dWgLE8AH0HjQ9fe74pUkKkvzzYT18Inp4zra3lKHnnwqGvcfcUBrvF2EAVX+envufDNBOzpPq/IBUONDbI7+3g=="], - - "p-timeout": ["p-timeout@7.0.1", "", {}, "sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg=="], - "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], - "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], - "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], @@ -3091,8 +2890,6 @@ "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], - "parse-latin": ["parse-latin@7.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "@types/unist": "^3.0.0", "nlcst-to-string": "^4.0.0", "unist-util-modify-children": "^4.0.0", "unist-util-visit-children": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ=="], - "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], @@ -3139,8 +2936,6 @@ "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="], - "piccolore": ["piccolore@0.1.3", "", {}, "sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], @@ -3161,7 +2956,7 @@ "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="], - "postcss-selector-parser": ["postcss-selector-parser@6.0.10", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w=="], + "postcss-selector-parser": ["postcss-selector-parser@7.1.5", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw=="], "postgres": ["postgres@3.4.9", "", {}, "sha512-GD3qdB0x1z9xgFI6cdRD6xu2Sp2WCOEoe3mtnyB5Ee0XrrL5Pe+e4CCnJrRMnL1zYtRDZmQQVbvOttLnKDLnaw=="], @@ -3241,8 +3036,6 @@ "quickjs-emscripten-core": ["quickjs-emscripten-core@0.31.0", "", { "dependencies": { "@jitl/quickjs-ffi-types": "0.31.0" } }, "sha512-oQz8p0SiKDBc1TC7ZBK2fr0GoSHZKA0jZIeXxsnCyCs4y32FStzCW4d1h6E1sE0uHDMbGITbk2zhNaytaoJwXQ=="], - "radix3": ["radix3@1.1.2", "", {}, "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA=="], - "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], @@ -3299,14 +3092,6 @@ "recharts-scale": ["recharts-scale@0.4.5", "", { "dependencies": { "decimal.js-light": "^2.4.1" } }, "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w=="], - "recma-build-jsx": ["recma-build-jsx@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew=="], - - "recma-jsx": ["recma-jsx@1.0.1", "", { "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w=="], - - "recma-parse": ["recma-parse@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ=="], - - "recma-stringify": ["recma-stringify@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g=="], - "redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="], "redux": ["redux@5.0.1", "", {}, "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="], @@ -3317,32 +3102,14 @@ "refractor": ["refractor@3.6.0", "", { "dependencies": { "hastscript": "^6.0.0", "parse-entities": "^2.0.0", "prismjs": "~1.27.0" } }, "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA=="], - "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="], - - "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="], - - "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], - - "rehype": ["rehype@13.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "rehype-parse": "^9.0.0", "rehype-stringify": "^10.0.0", "unified": "^11.0.0" } }, "sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A=="], - - "rehype-parse": ["rehype-parse@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-html": "^2.0.0", "unified": "^11.0.0" } }, "sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag=="], - "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="], - "rehype-recma": ["rehype-recma@1.0.0", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw=="], - - "rehype-stringify": ["rehype-stringify@10.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-to-html": "^9.0.0", "unified": "^11.0.0" } }, "sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA=="], - "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], - "remark-mdx": ["remark-mdx@3.1.1", "", { "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg=="], - "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], - "remark-smartypants": ["remark-smartypants@3.0.2", "", { "dependencies": { "retext": "^9.0.0", "retext-smartypants": "^6.0.0", "unified": "^11.0.4", "unist-util-visit": "^5.0.0" } }, "sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA=="], - "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], @@ -3361,14 +3128,6 @@ "restore-cursor": ["restore-cursor@4.0.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="], - "retext": ["retext@9.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "retext-latin": "^4.0.0", "retext-stringify": "^4.0.0", "unified": "^11.0.0" } }, "sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA=="], - - "retext-latin": ["retext-latin@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "parse-latin": "^7.0.0", "unified": "^11.0.0" } }, "sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA=="], - - "retext-smartypants": ["retext-smartypants@6.2.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ=="], - - "retext-stringify": ["retext-stringify@4.0.0", "", { "dependencies": { "@types/nlcst": "^2.0.0", "nlcst-to-string": "^4.0.0", "unified": "^11.0.0" } }, "sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA=="], - "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], "rfc4648": ["rfc4648@1.5.4", "", {}, "sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg=="], @@ -3437,8 +3196,6 @@ "sass-embedded-win32-x64": ["sass-embedded-win32-x64@1.99.0", "", { "os": "win32", "cpu": "x64" }, "sha512-ipuOv1R2K4MHeuCEAZGpuUbAgma4gb0sdacyrTjJtMOy/OY9UvWfVlwErdB09KIkp4fPDpQJDJfvYN6bC8jeNg=="], - "sax": ["sax@1.6.0", "", {}, "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA=="], - "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], "sdp": ["sdp@3.2.2", "", {}, "sha512-xZocWwfyp4hkbN4hLWxMjmv2Q8aNa9MhmOZ7L9aCZPT+dZsgRr6wZRrSYE3HTdyk/2pZKPSgqI7ns7Een1xMSA=="], @@ -3465,7 +3222,7 @@ "shadcn": ["shadcn@4.18.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/plugin-transform-typescript": "^7.28.0", "@babel/preset-typescript": "^7.27.1", "@dotenvx/dotenvx": "^1.48.4", "@modelcontextprotocol/sdk": "^1.26.0", "@types/validate-npm-package-name": "^4.0.2", "browserslist": "^4.26.2", "commander": "^14.0.0", "cosmiconfig": "^9.0.0", "dedent": "^1.6.0", "deepmerge": "^4.3.1", "diff": "^8.0.2", "execa": "^9.6.0", "fast-glob": "^3.3.3", "fs-extra": "^11.3.1", "fuzzysort": "^3.1.0", "kleur": "^4.1.5", "open": "^11.0.0", "ora": "^8.2.0", "postcss": "^8.5.6", "postcss-selector-parser": "^7.1.0", "prompts": "^2.4.2", "recast": "^0.23.11", "socks": "^2.8.8", "stringify-object": "^5.0.0", "tailwind-merge": "^3.0.1", "ts-morph": "^26.0.0", "tsconfig-paths": "^4.2.0", "undici": "^7.27.2", "validate-npm-package-name": "^7.0.1", "zod": "^3.24.1", "zod-to-json-schema": "^3.24.6" }, "bin": { "shadcn": "dist/index.js" } }, "sha512-tUFZgkYmfVNQVm3xX7lhSzOvDsp+O14ac5dwgXIr5mIsr79ISueb/Mu+ZtWMz0DH6v77u4eYyvbQ9TTMpSn3aw=="], - "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="], + "sharp": ["sharp@0.35.2", "", { "dependencies": { "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", "semver": "^7.8.4" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.35.2", "@img/sharp-darwin-x64": "0.35.2", "@img/sharp-freebsd-wasm32": "0.35.2", "@img/sharp-libvips-darwin-arm64": "1.3.1", "@img/sharp-libvips-darwin-x64": "1.3.1", "@img/sharp-libvips-linux-arm": "1.3.1", "@img/sharp-libvips-linux-arm64": "1.3.1", "@img/sharp-libvips-linux-ppc64": "1.3.1", "@img/sharp-libvips-linux-riscv64": "1.3.1", "@img/sharp-libvips-linux-s390x": "1.3.1", "@img/sharp-libvips-linux-x64": "1.3.1", "@img/sharp-libvips-linuxmusl-arm64": "1.3.1", "@img/sharp-libvips-linuxmusl-x64": "1.3.1", "@img/sharp-linux-arm": "0.35.2", "@img/sharp-linux-arm64": "0.35.2", "@img/sharp-linux-ppc64": "0.35.2", "@img/sharp-linux-riscv64": "0.35.2", "@img/sharp-linux-s390x": "0.35.2", "@img/sharp-linux-x64": "0.35.2", "@img/sharp-linuxmusl-arm64": "0.35.2", "@img/sharp-linuxmusl-x64": "0.35.2", "@img/sharp-webcontainers-wasm32": "0.35.2", "@img/sharp-win32-arm64": "0.35.2", "@img/sharp-win32-ia32": "0.35.2", "@img/sharp-win32-x64": "0.35.2" } }, "sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], @@ -3473,8 +3230,6 @@ "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], - "shiki": ["shiki@4.0.2", "", { "dependencies": { "@shikijs/core": "4.0.2", "@shikijs/engine-javascript": "4.0.2", "@shikijs/engine-oniguruma": "4.0.2", "@shikijs/langs": "4.0.2", "@shikijs/themes": "4.0.2", "@shikijs/types": "4.0.2", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" } }, "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ=="], - "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="], @@ -3559,8 +3314,6 @@ "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], - "svgo": ["svgo@4.0.1", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^5.1.0", "css-tree": "^3.0.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "^1.5.0" }, "bin": "./bin/svgo.js" }, "sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w=="], - "swr": ["swr@2.4.1", "", { "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-2CC6CiKQtEwaEeNiqWTAw9PGykW8SR5zZX8MZk6TeAvEAnVS7Visz8WzphqgtQ8v2xz/4Q5K+j+SeMaKXeeQIA=="], "sync-child-process": ["sync-child-process@1.0.2", "", { "dependencies": { "sync-message-port": "^1.0.0" } }, "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA=="], @@ -3599,13 +3352,9 @@ "throttleit": ["throttleit@2.1.0", "", {}, "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw=="], - "tiny-inflate": ["tiny-inflate@1.0.3", "", {}, "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw=="], - "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], - "tinyclip": ["tinyclip@0.1.12", "", {}, "sha512-Ae3OVUqifDw0wBriIBS7yVaW44Dp6eSHQcyq4Igc7eN2TJH/2YsicswaW+J/OuMvhpDPOKEgpAZCjkb4hpoyeA=="], - - "tinyexec": ["tinyexec@1.1.1", "", {}, "sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg=="], + "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], @@ -3669,12 +3418,8 @@ "ufo": ["ufo@1.6.3", "", {}, "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q=="], - "ultrahtml": ["ultrahtml@1.6.0", "", {}, "sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw=="], - "unbash": ["unbash@4.0.4", "", {}, "sha512-60m9IVGbavD6jholbxt0jVBXZkEB/HsMZq7Tyaghseve2/Sf0zQRAIfWsD34sde+DKP2tBxJS2wP88ZM0D1FhA=="], - "uncrypto": ["uncrypto@0.1.3", "", {}, "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q=="], - "undici": ["undici@7.29.0", "", {}, "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw=="], "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], @@ -3685,26 +3430,14 @@ "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], - "unifont": ["unifont@0.7.4", "", { "dependencies": { "css-tree": "^3.1.0", "ofetch": "^1.5.1", "ohash": "^2.0.11" } }, "sha512-oHeis4/xl42HUIeHuNZRGEvxj5AaIKR+bHPNegRq5LV1gdc3jundpONbjglKpihmJf+dswygdMJn3eftGIMemg=="], - - "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="], - "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], - "unist-util-modify-children": ["unist-util-modify-children@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "array-iterate": "^2.0.0" } }, "sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw=="], - "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], - "unist-util-position-from-estree": ["unist-util-position-from-estree@2.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ=="], - - "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="], - "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], - "unist-util-visit-children": ["unist-util-visit-children@3.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA=="], - "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], @@ -3713,8 +3446,6 @@ "unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], - "unstorage": ["unstorage@1.17.5", "", { "dependencies": { "anymatch": "^3.1.3", "chokidar": "^5.0.0", "destr": "^2.0.5", "h3": "^1.15.10", "lru-cache": "^11.2.7", "node-fetch-native": "^1.6.7", "ofetch": "^1.5.1", "ufo": "^1.6.3" }, "peerDependencies": { "@azure/app-configuration": "^1.8.0", "@azure/cosmos": "^4.2.0", "@azure/data-tables": "^13.3.0", "@azure/identity": "^4.6.0", "@azure/keyvault-secrets": "^4.9.0", "@azure/storage-blob": "^12.26.0", "@capacitor/preferences": "^6 || ^7 || ^8", "@deno/kv": ">=0.9.0", "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0 || ^9.0.0 || ^10.0.0", "@planetscale/database": "^1.19.0", "@upstash/redis": "^1.34.3", "@vercel/blob": ">=0.27.1", "@vercel/functions": "^2.2.12 || ^3.0.0", "@vercel/kv": "^1 || ^2 || ^3", "aws4fetch": "^1.0.20", "db0": ">=0.2.1", "idb-keyval": "^6.2.1", "ioredis": "^5.4.2", "uploadthing": "^7.4.4" }, "optionalPeers": ["@azure/app-configuration", "@azure/cosmos", "@azure/data-tables", "@azure/identity", "@azure/keyvault-secrets", "@azure/storage-blob", "@capacitor/preferences", "@deno/kv", "@netlify/blobs", "@planetscale/database", "@upstash/redis", "@vercel/blob", "@vercel/functions", "@vercel/kv", "aws4fetch", "db0", "idb-keyval", "ioredis", "uploadthing"] }, "sha512-0i3iqvRfx29hkNntHyQvJTpf5W9dQ9ZadSoRU8+xVlhVtT7jAX57fazYO9EHvcRCfBCyi5YRya7XCDOsbTgkPg=="], - "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], @@ -3749,8 +3480,6 @@ "vite-tsconfig-paths": ["vite-tsconfig-paths@5.1.4", "", { "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", "tsconfck": "^3.0.3" }, "peerDependencies": { "vite": "*" }, "optionalPeers": ["vite"] }, "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w=="], - "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], - "w3c-keyname": ["w3c-keyname@2.2.8", "", {}, "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="], "walk-up-path": ["walk-up-path@4.0.0", "", {}, "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A=="], @@ -3775,8 +3504,6 @@ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - "which-pm-runs": ["which-pm-runs@1.1.0", "", {}, "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA=="], - "widest-line": ["widest-line@6.0.0", "", { "dependencies": { "string-width": "^8.1.0" } }, "sha512-U89AsyEeAsyoF0zVJBkG9zBgekjgjK7yk9sje3F4IQpXBJ10TF6ByLlIfjMhcmHMJgHZI4KHt4rdNfktzxIAMA=="], "workerd": ["workerd@1.20260801.1", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20260801.1", "@cloudflare/workerd-darwin-arm64": "1.20260801.1", "@cloudflare/workerd-linux-64": "1.20260801.1", "@cloudflare/workerd-linux-arm64": "1.20260801.1", "@cloudflare/workerd-windows-64": "1.20260801.1" }, "bin": { "workerd": "bin/workerd" } }, "sha512-/g9JGTyqnHtoIscpBHqKD8swE2V4StBs2i69PmLiOhH45OP95jCFICl4F1hKlgN57rqfni5LiCitttoX5OOkVA=="], @@ -3805,8 +3532,6 @@ "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], - "xxhash-wasm": ["xxhash-wasm@1.1.0", "", {}, "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA=="], - "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], @@ -3815,9 +3540,7 @@ "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], - "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], - - "yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="], + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], "yocto-spinner": ["yocto-spinner@1.2.2", "", { "dependencies": { "yoctocolors": "^2.1.1" } }, "sha512-DODGl1wJjA/s5pnJFKau9lIYHT81lnhob1i3e1TjxZRxEhWRKl74nTbWE6H5KlkViQQTo/Z29YFdxzTZAMY3ng=="], @@ -3839,10 +3562,6 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@astrojs/internal-helpers/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], - - "@astrojs/markdown-remark/smol-toml": ["smol-toml@1.6.1", "", {}, "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg=="], - "@aws-crypto/sha1-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], "@aws-crypto/sha256-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], @@ -3871,8 +3590,6 @@ "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@babel/helper-annotate-as-pure/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], "@babel/helper-compilation-targets/@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], @@ -3925,6 +3642,10 @@ "@better-auth/telemetry/@better-auth/utils": ["@better-auth/utils@0.3.0", "", {}, "sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw=="], + "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + + "@daveyplate/better-auth-ui/lucide-react": ["lucide-react@0.525.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ=="], + "@dbos-inc/dbos-sdk/commander": ["commander@12.0.0", "", {}, "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA=="], "@dbos-inc/dbos-sdk/yaml": ["yaml@2.8.3", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg=="], @@ -3943,8 +3664,6 @@ "@decocms/sandbox-controller/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "@decocms/studio-web/lucide-react": ["lucide-react@0.468.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" } }, "sha512-6koYRhnM2N0GGZIdXzSeiNwguv1gt/FAjZOiPl76roBi3xKEXa4WmfpxgQwTTL4KipXjefrnf3oV4IsYhi4JFA=="], - "@decocms/typegen/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "@decocms/ui/recharts": ["recharts@2.15.1", "", { "dependencies": { "clsx": "^2.0.0", "eventemitter3": "^4.0.1", "lodash": "^4.17.21", "react-is": "^18.3.1", "react-smooth": "^4.0.4", "recharts-scale": "^0.4.4", "tiny-invariant": "^1.3.1", "victory-vendor": "^36.6.8" }, "peerDependencies": { "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-v8PUTUlyiDe56qUj82w/EDVuzEFXwEHp9/xOowGAZwfLjB9uAy3GllQVIYMWF6nU+qibx85WF75zD7AjqoT54Q=="], @@ -3961,26 +3680,14 @@ "@grpc/proto-loader/protobufjs": ["protobufjs@7.5.5", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg=="], - "@img/sharp-freebsd-wasm32/@img/sharp-wasm32": ["@img/sharp-wasm32@0.35.2", "", { "dependencies": { "@emnapi/runtime": "^1.11.1" } }, "sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw=="], - - "@img/sharp-wasm32/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], - - "@img/sharp-webcontainers-wasm32/@img/sharp-wasm32": ["@img/sharp-wasm32@0.35.2", "", { "dependencies": { "@emnapi/runtime": "^1.11.1" } }, "sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw=="], - "@inkjs/ui/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "@instantdb/core/uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], "@instantdb/react/eventsource": ["eventsource@4.1.0", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-2GuF51iuHX6A9xdTccMTsNb7VO0lHZihApxhvQzJB5A03DvHDd2FQepodbMaztPBmBcE/ox7o2gqaxGhYB9LhQ=="], - "@jridgewell/gen-mapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - - "@jridgewell/remapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@livekit/protocol/@bufbuild/protobuf": ["@bufbuild/protobuf@1.10.1", "", {}, "sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ=="], - "@mdx-js/mdx/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], - "@opentelemetry/exporter-logs-otlp-grpc/@opentelemetry/core": ["@opentelemetry/core@2.2.0", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw=="], "@opentelemetry/exporter-logs-otlp-grpc/@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.207.0", "", { "dependencies": { "@opentelemetry/core": "2.2.0", "@opentelemetry/otlp-transformer": "0.207.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-4RQluMVVGMrHok/3SVeSJ6EnRNkA2MINcX88sh+d/7DjGUrewW/WT88IsMEci0wUM+5ykTpPPNbEOoW+jwHnbw=="], @@ -4237,18 +3944,6 @@ "@vercel/nft/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], - "anymatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - - "astro/esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="], - - "astro/get-tsconfig": ["get-tsconfig@5.0.0-beta.4", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-7nF7C9fIPFEMHgEMEfgIlO9wDdZ8CyHw27rWciFZfHvHDReIiPhsYuzPRXsfvBCqFy1l8RRyyWV7QLM+ZhUJsQ=="], - - "astro/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], - - "astro/smol-toml": ["smol-toml@1.6.1", "", {}, "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg=="], - - "astro/tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], - "better-auth/@better-auth/utils": ["@better-auth/utils@0.3.0", "", {}, "sha512-W+Adw6ZA6mgvnSnhOki270rwJ42t4XzSK6YWGF//BbVXL6SwCLWfyzBc1lN2m/4RM28KubdBKQ4X5VMoLRNPQw=="], "better-auth/better-call": ["better-call@1.1.8", "", { "dependencies": { "@better-auth/utils": "^0.3.0", "@better-fetch/fetch": "^1.1.4", "rou3": "^0.7.10", "set-cookie-parser": "^2.7.1" }, "peerDependencies": { "zod": "^4.0.0" }, "optionalPeers": ["zod"] }, "sha512-XMQ2rs6FNXasGNfMjzbyroSwKwYbZ/T3IxruSS6U2MJRsSYh3wYtG3o6H00ZlKZ/C/UPOAD97tqgQJNsxyeTXw=="], @@ -4271,8 +3966,6 @@ "conf/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], - "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], - "debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "decocms/@better-auth/sso": ["@better-auth/sso@1.4.1", "", { "dependencies": { "@better-fetch/fetch": "1.1.18", "fast-xml-parser": "^5.2.5", "jose": "^6.1.0", "samlify": "^2.10.1", "zod": "^4.1.12" }, "peerDependencies": { "better-auth": "1.4.1" } }, "sha512-EG3P6uxieSFQvOR4Xxs210YrIrLGGlUDluvPxKx1qMgVxfbt3S8ziQ3wnLScTJKe3WjzsCX8JdN6hLhbO76YAA=="], @@ -4287,18 +3980,12 @@ "enquirer/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "estree-util-build-jsx/estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], - "execa/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - "express/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], - "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], "freestyle/ws": ["ws@8.21.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="], - "h3/cookie-es": ["cookie-es@1.2.3", "", {}, "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw=="], - "hast-util-from-parse5/hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="], "hastscript/@types/hast": ["@types/hast@2.3.10", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="], @@ -4317,8 +4004,6 @@ "ink/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], - "is-inside-container/is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], - "json-schema-to-typescript/tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], "knip/zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], @@ -4333,8 +4018,6 @@ "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], - "miniflare/sharp": ["sharp@0.35.2", "", { "dependencies": { "@img/colour": "^1.1.0", "detect-libc": "^2.1.2", "semver": "^7.8.4" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.35.2", "@img/sharp-darwin-x64": "0.35.2", "@img/sharp-freebsd-wasm32": "0.35.2", "@img/sharp-libvips-darwin-arm64": "1.3.1", "@img/sharp-libvips-darwin-x64": "1.3.1", "@img/sharp-libvips-linux-arm": "1.3.1", "@img/sharp-libvips-linux-arm64": "1.3.1", "@img/sharp-libvips-linux-ppc64": "1.3.1", "@img/sharp-libvips-linux-riscv64": "1.3.1", "@img/sharp-libvips-linux-s390x": "1.3.1", "@img/sharp-libvips-linux-x64": "1.3.1", "@img/sharp-libvips-linuxmusl-arm64": "1.3.1", "@img/sharp-libvips-linuxmusl-x64": "1.3.1", "@img/sharp-linux-arm": "0.35.2", "@img/sharp-linux-arm64": "0.35.2", "@img/sharp-linux-ppc64": "0.35.2", "@img/sharp-linux-riscv64": "0.35.2", "@img/sharp-linux-s390x": "0.35.2", "@img/sharp-linux-x64": "0.35.2", "@img/sharp-linuxmusl-arm64": "0.35.2", "@img/sharp-linuxmusl-x64": "0.35.2", "@img/sharp-webcontainers-wasm32": "0.35.2", "@img/sharp-win32-arm64": "0.35.2", "@img/sharp-win32-ia32": "0.35.2", "@img/sharp-win32-x64": "0.35.2" } }, "sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w=="], - "miniflare/ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], @@ -4349,10 +4032,6 @@ "ora/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - "p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], - - "parse-entities/character-entities-legacy": ["character-entities-legacy@1.1.4", "", {}, "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="], - "parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], "playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], @@ -4409,57 +4088,47 @@ "shadcn/postcss": ["postcss@8.5.26", "", { "dependencies": { "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ=="], - "shadcn/postcss-selector-parser": ["postcss-selector-parser@7.1.5", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw=="], - "shadcn/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + "sharp/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + "socks/ip-address": ["ip-address@10.5.0", "", {}, "sha512-R5SnVLJmgYYvf2F2ZgwSBnelz5G4q5AxIC277GDfUaNbrZKNANcBC7RHqYYePlszf4kBolVkJauG0ZjHHFh55g=="], "socks-proxy-agent/socks": ["socks@2.8.7", "", { "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A=="], - "storybook/esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="], - "storybook/oxc-parser": ["oxc-parser@0.127.0", "", { "dependencies": { "@oxc-project/types": "^0.127.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.127.0", "@oxc-parser/binding-android-arm64": "0.127.0", "@oxc-parser/binding-darwin-arm64": "0.127.0", "@oxc-parser/binding-darwin-x64": "0.127.0", "@oxc-parser/binding-freebsd-x64": "0.127.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.127.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.127.0", "@oxc-parser/binding-linux-arm64-gnu": "0.127.0", "@oxc-parser/binding-linux-arm64-musl": "0.127.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.127.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.127.0", "@oxc-parser/binding-linux-riscv64-musl": "0.127.0", "@oxc-parser/binding-linux-s390x-gnu": "0.127.0", "@oxc-parser/binding-linux-x64-gnu": "0.127.0", "@oxc-parser/binding-linux-x64-musl": "0.127.0", "@oxc-parser/binding-openharmony-arm64": "0.127.0", "@oxc-parser/binding-wasm32-wasi": "0.127.0", "@oxc-parser/binding-win32-arm64-msvc": "0.127.0", "@oxc-parser/binding-win32-ia32-msvc": "0.127.0", "@oxc-parser/binding-win32-x64-msvc": "0.127.0" } }, "sha512-bkgD4qHlN7WxLdX8bLXdaU54TtQtAIg/ZBAfm0aje/mo3MRDo3P0hZSgr4U7O3xfX+fQmR5AP04JS/TGcZLcFA=="], "storybook/ws": ["ws@8.21.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="], + "stringify-entities/character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + "strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], "sucrase/tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], - "svgo/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], - "topojson-client/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], "ts-json-schema-generator/typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "tsup/esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="], - - "tsup/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], - "tsup/tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], - "tsx/esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="], - "tsyringe/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], - "unstorage/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], - - "vite/esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="], - "vite/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], "vite/tinyglobby": ["tinyglobby@0.2.16", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg=="], + "wrangler/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], + "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], "xml-crypto/xpath": ["xpath@0.0.33", "", {}, "sha512-NNXnzrkDrAzalLhIUc01jO2mOzXGXh1JwPgkihcLLzw98c0WgYDmmjSh1Kl3wzaxSVWMuA+fe0WTWOBDWCBmNA=="], "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], - "yargs/yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + "youch/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], "zrender/tslib": ["tslib@2.3.0", "", {}, "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="], @@ -4729,58 +4398,6 @@ "@triplit/client/superjson/copy-anything": ["copy-anything@4.0.5", "", { "dependencies": { "is-what": "^5.2.0" } }, "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA=="], - "astro/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], - - "astro/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="], - - "astro/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="], - - "astro/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="], - - "astro/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="], - - "astro/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="], - - "astro/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="], - - "astro/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="], - - "astro/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="], - - "astro/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="], - - "astro/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="], - - "astro/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="], - - "astro/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="], - - "astro/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="], - - "astro/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="], - - "astro/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="], - - "astro/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="], - - "astro/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="], - - "astro/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="], - - "astro/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="], - - "astro/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="], - - "astro/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="], - - "astro/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="], - - "astro/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="], - - "astro/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="], - - "astro/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="], - "better-auth/better-call/@better-auth/utils": ["@better-auth/utils@0.3.1", "", {}, "sha512-+CGp4UmZSUrHHnpHhLPYu6cV+wSUSvVbZbNykxhUDocpVNTo9uFFxw/NqJlh1iC4wQ9HKKWGCKuZ5wUgS0v6Kg=="], "better-auth/better-call/set-cookie-parser": ["set-cookie-parser@2.7.2", "", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="], @@ -4789,8 +4406,6 @@ "cliui/wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], - "decocms/@better-auth/sso/@better-fetch/fetch": ["@better-fetch/fetch@1.1.18", "", {}, "sha512-rEFOE1MYIsBmoMJtQbl32PGHHXuG2hDxvEd7rUHE0vCBoFQVSDqaVs9hkZEtHCxRoY+CljXKFCOuJ8uxqw1LcA=="], "decocms/@better-auth/sso/better-auth": ["better-auth@1.4.5", "", { "dependencies": { "@better-auth/core": "1.4.5", "@better-auth/telemetry": "1.4.5", "@better-auth/utils": "0.3.0", "@better-fetch/fetch": "1.1.18", "@noble/ciphers": "^2.0.0", "@noble/hashes": "^2.0.0", "better-call": "1.1.4", "defu": "^6.1.4", "jose": "^6.1.0", "kysely": "^0.28.5", "ms": "4.0.0-nightly.202508271359", "nanostores": "^1.0.1", "zod": "^4.1.12" }, "peerDependencies": { "@lynx-js/react": "*", "@sveltejs/kit": "^2.0.0", "@tanstack/react-start": "^1.0.0", "next": "^14.0.0 || ^15.0.0 || ^16.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0", "solid-js": "^1.0.0", "svelte": "^4.0.0 || ^5.0.0", "vue": "^3.0.0" }, "optionalPeers": ["@lynx-js/react", "@sveltejs/kit", "@tanstack/react-start", "next", "react", "react-dom", "solid-js", "svelte", "vue"] }, "sha512-pHV2YE0OogRHvoA6pndHXCei4pcep/mjY7psSaHVrRgjBtumVI68SV1g9U9XPRZ4KkoGca9jfwuv+bB2UILiFw=="], @@ -4807,6 +4422,8 @@ "mdast-util-mdx-jsx/parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + "mdast-util-mdx-jsx/parse-entities/character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + "mdast-util-mdx-jsx/parse-entities/character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], "mdast-util-mdx-jsx/parse-entities/is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], @@ -4815,54 +4432,6 @@ "mdast-util-mdx-jsx/parse-entities/is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], - "miniflare/sharp/@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.3.1" }, "os": "darwin", "cpu": "arm64" }, "sha512-eEieHsMksAW4IiO5NzauESRl2D2qz3J/kwUxUrSfV06A93eEaRfMpHXyUb1mAqrR7i8U9A0GRqE9pjn6u1Jjpg=="], - - "miniflare/sharp/@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.3.1" }, "os": "darwin", "cpu": "x64" }, "sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw=="], - - "miniflare/sharp/@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.3.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g=="], - - "miniflare/sharp/@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.3.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ=="], - - "miniflare/sharp/@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.3.1", "", { "os": "linux", "cpu": "arm" }, "sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg=="], - - "miniflare/sharp/@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw=="], - - "miniflare/sharp/@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.3.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng=="], - - "miniflare/sharp/@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.3.1", "", { "os": "linux", "cpu": "none" }, "sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw=="], - - "miniflare/sharp/@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.3.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew=="], - - "miniflare/sharp/@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A=="], - - "miniflare/sharp/@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.3.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw=="], - - "miniflare/sharp/@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.3.1", "", { "os": "linux", "cpu": "x64" }, "sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg=="], - - "miniflare/sharp/@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.3.1" }, "os": "linux", "cpu": "arm" }, "sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A=="], - - "miniflare/sharp/@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.3.1" }, "os": "linux", "cpu": "arm64" }, "sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA=="], - - "miniflare/sharp/@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.3.1" }, "os": "linux", "cpu": "ppc64" }, "sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg=="], - - "miniflare/sharp/@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.3.1" }, "os": "linux", "cpu": "none" }, "sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA=="], - - "miniflare/sharp/@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.3.1" }, "os": "linux", "cpu": "s390x" }, "sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA=="], - - "miniflare/sharp/@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.3.1" }, "os": "linux", "cpu": "x64" }, "sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA=="], - - "miniflare/sharp/@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.3.1" }, "os": "linux", "cpu": "arm64" }, "sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg=="], - - "miniflare/sharp/@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.35.2", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.3.1" }, "os": "linux", "cpu": "x64" }, "sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg=="], - - "miniflare/sharp/@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.35.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ=="], - - "miniflare/sharp/@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.35.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog=="], - - "miniflare/sharp/@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.35.2", "", { "os": "win32", "cpu": "x64" }, "sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ=="], - - "miniflare/sharp/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], - "ora/cli-cursor/restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], "ora/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], @@ -4875,58 +4444,6 @@ "shadcn/postcss/nanoid": ["nanoid@3.3.18", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w=="], - "storybook/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], - - "storybook/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="], - - "storybook/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="], - - "storybook/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="], - - "storybook/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="], - - "storybook/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="], - - "storybook/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="], - - "storybook/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="], - - "storybook/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="], - - "storybook/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="], - - "storybook/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="], - - "storybook/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="], - - "storybook/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="], - - "storybook/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="], - - "storybook/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="], - - "storybook/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="], - - "storybook/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="], - - "storybook/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="], - - "storybook/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="], - - "storybook/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="], - - "storybook/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="], - - "storybook/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="], - - "storybook/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="], - - "storybook/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="], - - "storybook/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="], - - "storybook/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="], - "storybook/oxc-parser/@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.127.0", "", { "os": "android", "cpu": "arm" }, "sha512-0LC7ye4hvqbIKxAzThzvswgHLFu2AURKzYLeSVvLdu2TBOYWQDmHnTqPLeA597BcUCxiLqLsS4CJ5uoI5WYWCQ=="], "storybook/oxc-parser/@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.127.0", "", { "os": "android", "cpu": "arm64" }, "sha512-b5jtVTH6AU5CJXHNdj7Jj9IEiR9yVjjnwHzPJhGyHGPdcsZSzBCkS9GBbV33niRMvKthDwQRFRJfI4a+k4PvYg=="], @@ -4971,165 +4488,59 @@ "sucrase/tinyglobby/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], - "tsup/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], - - "tsup/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="], - - "tsup/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="], - - "tsup/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="], - - "tsup/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="], - - "tsup/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="], - - "tsup/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="], - - "tsup/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="], - - "tsup/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="], - - "tsup/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="], - - "tsup/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="], - - "tsup/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="], - - "tsup/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="], - - "tsup/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="], - - "tsup/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="], - - "tsup/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="], - - "tsup/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="], - - "tsup/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="], - - "tsup/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="], - - "tsup/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="], - - "tsup/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="], - - "tsup/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="], - - "tsup/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="], - - "tsup/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="], - - "tsup/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="], - - "tsup/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="], - "tsup/tinyglobby/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], - "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], - - "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="], - - "tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="], - - "tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="], - - "tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="], - - "tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="], - - "tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="], - - "tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="], - - "tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="], - - "tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="], - - "tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="], - - "tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="], - - "tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="], - - "tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="], + "wrangler/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], - "tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="], + "wrangler/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], - "tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="], + "wrangler/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="], - "tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="], + "wrangler/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="], - "tsx/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="], + "wrangler/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="], - "tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="], + "wrangler/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="], - "tsx/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="], + "wrangler/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="], - "tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="], + "wrangler/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="], - "tsx/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="], + "wrangler/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="], - "tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="], + "wrangler/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="], - "tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="], + "wrangler/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="], - "tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="], + "wrangler/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="], - "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="], + "wrangler/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="], - "unstorage/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + "wrangler/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="], - "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], + "wrangler/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="], - "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="], + "wrangler/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="], - "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="], + "wrangler/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="], - "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="], + "wrangler/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="], - "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="], + "wrangler/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="], - "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="], + "wrangler/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="], - "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="], + "wrangler/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="], - "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="], + "wrangler/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="], - "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="], + "wrangler/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="], - "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="], + "wrangler/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="], - "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="], + "wrangler/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="], - "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="], - - "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="], - - "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="], - - "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="], - - "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="], - - "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="], - - "vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="], - - "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="], - - "vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="], - - "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="], - - "vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="], - - "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="], - - "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="], - - "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="], - - "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="], + "wrangler/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], "wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], @@ -5155,28 +4566,20 @@ "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], - "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], "@babel/helper-create-class-features-plugin/@babel/traverse/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], "@babel/helper-member-expression-to-functions/@babel/traverse/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], - "@babel/helper-member-expression-to-functions/@babel/traverse/@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@babel/helper-replace-supers/@babel/traverse/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], - "@babel/helper-replace-supers/@babel/traverse/@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@babel/helper-replace-supers/@babel/traverse/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], "@babel/helper-replace-supers/@babel/traverse/@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse/@babel/code-frame/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], - "@babel/helper-skip-transparent-expression-wrappers/@babel/traverse/@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@babel/plugin-transform-modules-commonjs/@babel/helper-module-transforms/@babel/helper-module-imports/@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], "@babel/plugin-transform-modules-commonjs/@babel/helper-module-transforms/@babel/traverse/@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], @@ -5307,8 +4710,6 @@ "@babel/plugin-transform-modules-commonjs/@babel/helper-module-transforms/@babel/helper-module-imports/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], - "@babel/plugin-transform-modules-commonjs/@babel/helper-module-transforms/@babel/traverse/@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@babel/plugin-transform-modules-commonjs/@babel/helper-module-transforms/@babel/traverse/@babel/types/@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], "decocms/@better-auth/sso/better-auth/better-call/set-cookie-parser": ["set-cookie-parser@2.7.2", "", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="], diff --git a/package.json b/package.json index de39cd8449..f858f45c30 100644 --- a/package.json +++ b/package.json @@ -34,8 +34,6 @@ "check:web-bundle": "bun run scripts/check-web-bundle-desktop-free.ts", "fmt:check": "biome format", "test": "bun test --parallel --path-ignore-patterns='{**/*.{integration,e2e}.test.*,**/*{.spec,_spec,_test}.*,**/*.test.{js,jsx,mjs,cjs,mts,cts},**/dist/**}' ./apps/api/src ./apps/api/migrations ./apps/native/scripts ./apps/web/src ./packages ./plugins ./scripts", - "docs:dev": "bun run --cwd=apps/docs dev", - "docs:deploy": "bun run --cwd=apps/docs deploy", "build:runtime": "bun run --filter=@decocms/runtime build", "build:api": "bun run --cwd=apps/api build:server", "build:web": "bun run --cwd=apps/web build", diff --git a/packages/sandbox/orgfs/README.md b/packages/sandbox/orgfs/README.md index 4210196c27..4e1925751b 100644 --- a/packages/sandbox/orgfs/README.md +++ b/packages/sandbox/orgfs/README.md @@ -193,4 +193,4 @@ Neither is a supported production mode, because Studio prompts still refer to - [Sandbox package](../README.md) - [Go daemon](../daemon-go/README.md) - [sandbox-env chart](../../../deploy/helm/sandbox-env/README.md) -- [Studio architecture: org filesystem](../../../apps/docs/client/src/content/deco-studio/en/studio/architecture.mdx) +- [Studio architecture: org filesystem](https://docs.decocms.com/studio/get-started/architecture) diff --git a/selfhost/skills/self-host-studio/SKILL.md b/selfhost/skills/self-host-studio/SKILL.md index d11b7969ca..b19adeb5a8 100644 --- a/selfhost/skills/self-host-studio/SKILL.md +++ b/selfhost/skills/self-host-studio/SKILL.md @@ -192,7 +192,7 @@ values, so a rerun is reproducible. Gitignore it; never inline secret material i For the value shapes (managed vs in-cluster deps, secrets with and without ESO, ingress, sandbox posture, compute sizing) read [`selfhost/production`](https://github.com/decocms/studio/tree/main/selfhost/production) -and the [Kubernetes guide](https://docs.decocms.com/deco-studio/en/studio/self-hosting/deploy/kubernetes). +and the [Kubernetes guide](https://docs.decocms.com/studio/self-hosting/deploy/kubernetes). ## 1. Pick a tier