diff --git a/.agents/skills/constructive-blocks/SKILL.md b/.agents/skills/constructive-blocks/SKILL.md index c3d8e32..499c1a5 100644 --- a/.agents/skills/constructive-blocks/SKILL.md +++ b/.agents/skills/constructive-blocks/SKILL.md @@ -1,6 +1,6 @@ --- name: constructive-blocks -description: Select, install, compose, integrate, and verify the complete Constructive Blocks registry, its standalone feature packs, and Console Kit. Use when adding Constructive UI primitives, app shell or app bar, billing blocks, standalone feature-pack views, Console modules, backend-aligned presets, a custom tenant console, or the full Next.js Console Kit; when wiring explicit tenant endpoints, sessions, _meta capability evidence, or modular Zustand state; and when diagnosing registry, release, capability, or RLS boundaries. +description: Select, install, compose, integrate, and verify the Constructive Blocks registry, App Kit, standalone platform feature packs, and Console Kit. Use when an agent builds an arbitrary Constructive-native internal app from typed resources, queries, actions, records, dashboards, boards, calendars, or workflows; when adding Constructive UI primitives, app shell, billing blocks, feature-pack views, Console modules, presets, or Console Kit; and when wiring tenant scope, final-schema evidence, release contracts, or RLS boundaries. --- # Constructive Blocks @@ -10,12 +10,22 @@ modules, registry roots install frontend source, Console capability discovery proves a public GraphQL shape, and authenticated requests establish effective PostgreSQL/RLS authority. Keep those as separate facts. +Choose between two orthogonal lanes. Use App Kit to compose an application +around domain resources and user tasks. Add feature packs or Console Kit only +when the product also needs their specific platform-capability surfaces. +Treat `installability.appKitDocumentation.authority` from the validated catalog +query as authority for exact APIs and exports; this skill owns selection and +verification procedure. While the release is branch-only, read the returned +`pinned-source` path from the source-preflighted Blocks checkout. Use the public +URL only when the query returns `kind: public-url`. + ## Read the pinned contract first [`references/install-roots.v1.json`](references/install-roots.v1.json) is the portable authority for the exact Blocks branch and commit, release state, `_meta` contract, endpoint bindings, package versions, source and built-content -hashes, 19 complete inspector plans, Console runtime invariants, and +hashes, the branch-aware App Kit documentation source, 19 complete inspector +plans, Console runtime invariants, and structurally scoped source limitations. Use the validated queries below for ordinary selection; load the full snapshot only when auditing or updating the contract. @@ -26,16 +36,16 @@ concerns an ordinary registry item: ```bash node /absolute/path/to/check-blocks-contract.mjs --list-registry node /absolute/path/to/check-blocks-contract.mjs --list-registry --type registry:block +node /absolute/path/to/check-blocks-contract.mjs --list-registry --family app-kit +node /absolute/path/to/check-blocks-contract.mjs --list-registry --capability temporal node /absolute/path/to/check-blocks-contract.mjs --registry-item app-shell ``` -The 102 entries cover the complete registry: Constructive theme and UI -primitives, app bar, app shell, billing blocks, standalone feature packs, -Console modules, presets, and the Next.js Console Kit. The six non-Data -standalone packs are provider-neutral; Data is adapter-driven and performs -schema discovery through Sheets. Select by `name`, `type`, -`categories`, and `docs`; inspect one item for its `dependencies`, -`devDependencies`, `registryDependencies`, and `files`. +Use the returned `name`, `type`, `categories`, `docs`, and versioned metadata to +select candidates. Inspect one item before installation to verify its +dependencies, file targets, release status, and limitations. +For App Kit, also resolve the returned +`installability.appKitDocumentation.authority` before implementing an exact API. Always use the validated queries for Data. The byte-pinned source catalog and plan retain incorrect generic Data documentation as drift evidence; query @@ -89,17 +99,32 @@ blocked by the nested-store limitation. [`references/package-resolutions.v1.json`](references/package-resolutions.v1.json), and [`references/install-plans.v1/`](references/install-plans.v1/) remain the portable source artifacts behind these deterministic validated queries. The -content snapshot pins every file body reachable from the 19 install plans, so -installed-source evidence cannot be satisfied by a fabricated generated item. +content snapshot pins every file body reachable from the 19 Console plans and +all seven App Kit roots, so installed-source evidence cannot be satisfied by a +fabricated generated item. The package snapshot pins the exact npm version, SRI, and canonical tarball URL -for all ten external dependencies; first-party package bytes remain pinned to -the local Blocks artifacts. +for every external dependency in those closures; first-party package bytes +remain pinned to the local Blocks artifacts. Read [`references/runtime-contract.md`](references/runtime-contract.md) when wiring standalone Data, Console modules, tenant descriptors, sessions, routing, capability evidence, or the host-owned Zustand store. +Read only the App Kit references required by the brief: + +| Reference | Load when | +| --- | --- | +| [`references/app-composition.md`](references/app-composition.md) | Routing a domain application from intent and data shape | +| [`references/app-resource-contract.md`](references/app-resource-contract.md) | Defining scope, resources, queries, relations, and final-schema validation | +| [`references/app-view-patterns.md`](references/app-view-patterns.md) | Selecting controlled and connected data, board, dashboard, or calendar views | +| [`references/app-actions-workflows.md`](references/app-actions-workflows.md) | Defining semantic actions, invalidation, optimistic behavior, and steps | +| [`references/app-verification.md`](references/app-verification.md) | Verifying schema, cache isolation, authority, interaction, and installs | +| [`references/event-studio.md`](references/event-studio.md) | Building the complete Event Studio starter | +| [`references/event-studio-blueprint.json`](references/event-studio-blueprint.json) | Applying Event Studio's public org-scoped blueprint definition | +| [`references/app-recipes.md`](references/app-recipes.md) | Adapting compact cross-domain composition recipes | +| [`references/brief-to-roots.v1.json`](references/brief-to-roots.v1.json) | Auditing deterministic brief-to-root selection fixtures | + Validate the portable contract from any working directory: ```bash @@ -128,61 +153,61 @@ The live check deliberately uses the inspector's `--no-build` mode only after the aggregate registry, canonical inputs, catalog, and plan bytes match their SHA-256 attestations. It never rebuilds or edits Blocks. -When advancing the pinned Blocks commit, regenerate the planned content -snapshot from a clean worktree, update its attestation in -`install-roots.v1.json`, then run the full checker. The generator runs the -pinned `build:registry` command before hashing any file bodies: +When advancing the pinned Blocks commit, first update the source pin and any +changed checker invariants as a reviewed source change. Then regenerate the +catalog, all inspector plans, built-content snapshot, package snapshot, and +their attestation hashes together from a clean exact checkout. The synchronizer +builds the registry, writes every result into a same-filesystem scratch area, +validates that staged contract against Blocks, and rolls back if replacement or +post-write validation fails: ```bash -node /absolute/path/to/constructive-skills/.agents/skills/constructive-blocks/scripts/sync-registry-content.mjs \ +node /absolute/path/to/constructive-skills/.agents/skills/constructive-blocks/scripts/sync-blocks-contract.mjs \ --blocks-repo /absolute/path/to/blocks -node /absolute/path/to/constructive-skills/.agents/skills/constructive-blocks/scripts/sync-package-resolutions.mjs ``` -The package sync resolves npm's current `latest` releases. Review every -version/SRI/URL diff, rerun the install and typecheck matrix, then update the -snapshot hash in `install-roots.v1.json`; never refresh it as an unreviewed -formatting step. +By default it preserves existing exact package resolution records, which keeps +pin advancement deterministic. Use `--refresh-package-resolutions` only for an +intentional dependency-refresh review; that flag resolves npm's current +`latest` releases, so review every version/SRI/URL diff and rerun the install +and typecheck matrix. `--check` stages and validates the complete result +without replacing checked-in files. ## Choose the smallest owning block -For ordinary application UI, choose directly from the complete registry -catalog. `app-shell` installs the provider-neutral shell and `app-bar` -transitively; individual billing roots install only their reviewed dependency -closure; primitives remain independently installable. - -For feature behavior, choose one ownership boundary: - -| Need | Install root | -| --- | --- | -| Host-controlled application view | `feature-pack-{id}` | -| Shell/runtime without a leaf feature | `console-kit-core` | -| Custom tenant console | Selected `console-module-{id}` roots | -| Stable backend-aligned composition | `preset-auth-hardened`, `preset-b2b-storage`, or `preset-full` | -| Complete seven-pack Next.js console | `console-kit-nextjs` | - -The seven pack IDs are `data`, `auth`, `users`, `organizations`, `storage`, -`billing`, and `notifications`. A standalone pack never installs Console Kit -and never imposes the Console Kit Zustand store. A matching Console module -installs its standalone view and Console core transitively, then contributes -Constructive discovery, routing, an adapter, and any module-owned state slice. - -Map official backend presets exactly: - -- `blank` -> no frontend preset root; start with `console-kit-core` and add - only explicitly selected Console modules. -- `auth:hardened` -> `preset-auth-hardened` -> Data, Auth, Users. -- `b2b:storage` -> `preset-b2b-storage` -> Data, Auth, Users, Organizations, - Storage. -- `full` -> `preset-full` -> all seven packs. - -This mapping selects installed code. It does not prove that a tenant exposes -the necessary endpoints, roots, metadata, privileges, or RLS-visible rows. +1. **Choose a lane.** Route domain resources and user tasks through App Kit. + Route tenant-platform administration through feature packs or Console Kit. + Treat an app that needs both as two explicit selections. +2. **Discover candidates.** Query `--list-registry --family app-kit` for the + application lane or use the catalog/root queries for the platform lane. + Match returned metadata and docs to the brief instead of inferring names. + Exclude `kind: starter` from ordinary composition; install a starter only + when the user explicitly requests that starter or its complete reference + application. A deterministic fixture may select one only when its + `starterRequested` marker records that explicit opt-in. +3. **Inspect closure.** Query each candidate item or Console plan and review + transitive registry dependencies, files, runtime status, limitations, and + installability before writing an install command. +4. **Check deterministic routing.** Compare arbitrary-app selection with + `brief-to-roots.v1.json`. Query the selected preset plan when a backend + preset must be mirrored; do not maintain the mapping in application code. +5. **Keep authority separate.** An install choice does not prove endpoint + availability, executable roots, grants, or RLS-visible rows. Verify those + after integration. + +For App Kit, installation is only dependency acquisition. Application-owned +code must import and compose the selected definitions and views into working +user paths; installed source directories, navigation labels, prose, or empty +placeholders are never evidence that a capability was implemented. + +Select Sheets only for spreadsheet-style inline editing and generic table +exploration. Do not substitute Console Kit for a domain application shell or +turn every action flow into a review queue. ## Respect the branch-only release gate The pinned source is -`feat/feature-packs-console-kit@4f2a789fde9a90c0c6ed5977896493bb4818fa77`. +`feat/app-kit@1a72e5d95f7ce4a243cd4536ed78c638708d538c`. The checkout may be that named branch or detached at the exact commit. Its publication status is `branch-only`, and `release.publicRegistryReady` is `false`. Do not run a public install for these @@ -212,8 +237,10 @@ Released query surfaces expose `publicInstall` with the command beside its `status` and `availability`; execute it only when status is `available`. Branch-only responses mark it `blocked` and `future-only`, so use the `installability.pinnedLocalConsumption` command template instead. Keep shadcn -at `4.13.1`; nested dependencies still require the `@constructive` namespace -when the root is installed by direct URL. +at the exact returned `testedShadcnVersion` for reproducible branch-local +diagnostics. Released public commands use `shadcn@latest`; nested dependencies +still require the `@constructive` namespace when a root is installed by direct +URL. ## Integrate the installed owner diff --git a/.agents/skills/constructive-blocks/references/app-actions-workflows.md b/.agents/skills/constructive-blocks/references/app-actions-workflows.md new file mode 100644 index 0000000..c638d58 --- /dev/null +++ b/.agents/skills/constructive-blocks/references/app-actions-workflows.md @@ -0,0 +1,42 @@ +# Wire App Kit actions and workflows + +Read this when a brief includes mutations, confirmations, bulk execution, or a +multi-step interaction. Resolve `installability.appKitDocumentation.authority` +through the validated App Kit catalog query for current action definitions, +runtime hooks, surfaces, and invalidation APIs. + +## Define actions from user intent + +1. Name the semantic intent and identify its typed input, output, validation, + confirmation, authority expectation, and affected views. +2. Inject an abortable executor through the host transport. Keep transport + details and credentials outside reusable definitions. Return framework + result envelopes only through the documented `appSuccess` and `appFailure` + helpers; do not hand-build lookalike `{ ok, data }` or `{ ok, error }` + objects. +3. Declare targeted invalidation for affected detail, collection, relation, + board, dashboard, and calendar queries. Avoid whole-cache invalidation. +4. Add optimistic behavior only when rollback is deterministic inside the + active cache partition. Use the callback's scope-bound cache facade and App + Kit query keys; do not reach through it to a raw TanStack `QueryClient` or + read, write, or cancel a key from another scope. +5. Choose a documented controlled surface when the host owns execution or a + connected surface when App Kit should own validation, progress, + cancellation, rollback, and invalidation. + +## Verify failure behavior + +- Suppress or replace duplicate submissions according to the documented + concurrency policy, and pass cancellation through to the transport. +- Show field validation near its input and preserve safe partial GraphQL and + authorization errors at the action surface. +- Restore focus after dialogs and confirmations. Confirm destructive or + externally visible effects. +- Roll back optimistic state on denial, failure, or abort, then prove another + scope never observes the optimistic value. +- Treat visibility and disabled rules as presentation hints; RLS denials remain + authoritative and visible. + +Use the controlled stepper only for guided UI. Persist durable workflow state +as domain records and delegate background execution to the owning platform +capability; App Kit is not a job or approval engine. diff --git a/.agents/skills/constructive-blocks/references/app-composition.md b/.agents/skills/constructive-blocks/references/app-composition.md new file mode 100644 index 0000000..335871b --- /dev/null +++ b/.agents/skills/constructive-blocks/references/app-composition.md @@ -0,0 +1,60 @@ +# Compose an App Kit application + +Read this when a brief describes a domain application rather than a platform +console. Resolve `installability.appKitDocumentation.authority` through the +validated App Kit catalog query before reading current APIs, exports, or +component contracts. + +## Route the brief + +1. Extract the user's jobs, record shapes, relations, aggregate questions, + time ranges, semantic actions, and preferred navigation. Do not route from a + department label. +2. Query the validated catalog with `--list-registry --family app-kit`. Match + the returned `dataShapes`, `intents`, and `capabilities` to the brief, then + inspect each candidate's dependency closure. Add only roots supported by + this evidence. Exclude `kind: starter` unless the user explicitly asks for + that starter or its complete reference application; starters are examples, + not default capability bundles. Set `starterRequested: true` only in a + deterministic fixture that records that explicit request. +3. Compare the choice with `brief-to-roots.v1.json`. Treat the fixture as a + regression oracle for selection behavior, not a substitute for the current + catalog. +4. Plan optional platform capabilities separately. Add Sheets only for genuine + spreadsheet interaction and Console surfaces only for tenant-platform + administration. +5. Decide how the host owns routes, URL state, and record opening. A route, + page, dialog, or Stack card may be appropriate; do not impose Stack. + +## Prepare and compose the consumer + +1. Start with a valid consumer before invoking shadcn. Confirm `components.json` + resolves every alias and its configured Tailwind stylesheet already exists; + run all package and registry commands from that consumer root. +2. Treat installed roots as source dependencies, not finished features. Define + the selected resources, queries, actions, and scope in application-owned + code, then import the relevant controlled views or connected wrappers into + real routes or surfaces. +3. Trace every requested job to an executable path. A link, heading, explanatory + paragraph, empty placeholder, or installed-but-unimported source tree does + not satisfy a collection, form, relation, board, dashboard, calendar, or + workflow requirement. +4. Preserve the selected view's data contract. Server-driven search, filters, + sorting, ranges, aggregates, and pagination must reach their query loaders; + do not relabel client filtering of one fetched page as server-driven work. + +## Establish ownership before coding + +- Keep remote state in App Kit's documented TanStack Query boundary and keep + cache scope secret-free. +- Keep shareable view state controlled or URL-addressable, and keep transient + interaction state local. +- Inject the Constructive transport from the host. Do not add runtime schema + discovery, a connector runtime, or another global store. +- Treat grants and RLS as authority. Visibility and disabled-state rules only + improve presentation. +- Use action invalidation, manual refresh, and documented focus/reconnect + behavior for freshness; do not add V1 subscriptions or interval polling. + +Next, read the resource, view, action, or verification reference only when that +part of the brief is active. diff --git a/.agents/skills/constructive-blocks/references/app-recipes.md b/.agents/skills/constructive-blocks/references/app-recipes.md new file mode 100644 index 0000000..2e81608 --- /dev/null +++ b/.agents/skills/constructive-blocks/references/app-recipes.md @@ -0,0 +1,29 @@ +# Adapt compact App Kit recipes + +Read this when a brief resembles a common app shape but does not need Event +Studio. Resolve `installability.appKitDocumentation.authority` through the +validated App Kit catalog query for current capabilities, then use catalog +metadata instead of copying root names from these prompts. + +| Recipe | Extract from the brief | Challenge before selecting views | +| --- | --- | --- | +| Service desk | Customers, tickets, notes, search, assignment, lifecycle movement | Is the lifecycle an explicit move intent, or only a status field? | +| Intake and approval | Requests, evidence, reviewers, decisions, guided input | Does the user need a queue/board, or only records plus semantic decisions? | +| Directory and search | People, teams, locations, memberships, high-cardinality search | Are relation candidates searched on the server and linked rather than created inline? | +| Planning | Programs, milestones, owners, dates, stage movement, publishing | Which board and temporal geometries are independently required? | +| Reporting and configuration | Approved metrics, series, settings records, explicit execution | Are aggregates backed by dedicated loaders rather than one collection page? | + +For each recipe: + +1. Rewrite the department-flavored brief as data shapes, user intents, and + workflow needs. +2. Query `--list-registry --family app-kit`, match returned metadata, and + inspect dependency closure. +3. Compare the result with the corresponding deterministic fixture. +4. Add optional platform-capability packs in a separate pass. +5. Continue with resource validation, view-specific checks, and the full + verification loop. + +Do not infer Sheets, Console Kit, a board, dashboard, or review queue from a +domain label. Compose ordinary React when the validated catalog has no suitable +view family. diff --git a/.agents/skills/constructive-blocks/references/app-resource-contract.md b/.agents/skills/constructive-blocks/references/app-resource-contract.md new file mode 100644 index 0000000..68477ff --- /dev/null +++ b/.agents/skills/constructive-blocks/references/app-resource-contract.md @@ -0,0 +1,48 @@ +# Generate App Kit resource contracts + +Read this before generating resources, queries, forms, or relations. Resolve +`installability.appKitDocumentation.authority` through the validated App Kit +catalog query for exact types, signatures, entrypoints, and supported field +kinds. + +## Build from executable evidence + +1. Fetch current `_meta` facts and final GraphQL introspection from the same + tenant/schema revision. Current `_meta` can expose partly inflected names: + keep its database identity, constraints, nullability, and relation facts, + but let the final executable schema decide public GraphQL type, field, + relation, scalar/enum, and operation-root names. Treat `_meta` GraphQL names + and type hints as advisory; they must not override the executable schema. + Refresh a selected generated SDK or ORM first. +2. Inventory each resource's stable identity, display fields, editable fields, + relations, executable reads, executable writes, and semantic actions. +3. Map final inflected GraphQL names rather than deriving them from PostgreSQL + names. Record missing operations explicitly. +4. Implement definitions with the documented server-safe entrypoint and inject + abortable loaders from the host transport. +5. Run the documented resource validator during generation or build. Fail on + mismatched names, identities, relations, enum values, or operation roots. +6. Typecheck definitions and exercise one allowed and one denied operation + against the intended identity before building views. + +## Degrade deliberately + +- Make ambiguous, missing, or mismatched identities read-only. Never guess an + ID, including for composite keys. +- Keep absent mutations absent. A database field name does not prove a final + GraphQL operation exists. +- Keep JSON, unknown custom scalars, and unsupported shapes read-only until the + host supplies a renderer or editor supported by the current Blocks contract. +- Search relation candidates on the server and link existing records through + semantic actions. Avoid nested multi-record creation in V1. + +## Audit remote-state scope + +Follow the canonical scope and query-key contract exactly. Change endpoint, +database, authenticated session partition, organization/tenant, and schema or +security revision independently, then prove cached, cancelled, and optimistic +data cannot cross any partition. Pass raw, credential-free domain input and let +App Kit produce its opaque deterministic query-input fingerprint; do not hash +or serialize inputs into ad hoc keys. Credential-shaped query or action input +fails closed, so capture authentication in the injected executor closure and +never place credentials in definitions, URLs, cache keys, or stores. diff --git a/.agents/skills/constructive-blocks/references/app-verification.md b/.agents/skills/constructive-blocks/references/app-verification.md new file mode 100644 index 0000000..573edf7 --- /dev/null +++ b/.agents/skills/constructive-blocks/references/app-verification.md @@ -0,0 +1,53 @@ +# Verify an App Kit application + +Read this before declaring an App Kit build complete. Resolve +`installability.appKitDocumentation.authority` through the validated App Kit +catalog query for current runtime and accessibility contracts, and use the +checker for the pinned install contract. + +## Run the evidence loop + +1. Reconcile partly inflected `_meta` with final introspection. Prove database + facts remain authoritative while the executable schema controls GraphQL + names, types, relations, and roots, including when an advisory `_meta` + GraphQL hint disagrees. Cover inflected roots, enums, arrays, JSON, custom + scalars, composite and absent identities, relations, absent operations, and + custom roots. +2. Vary every documented cache-scope dimension independently. Cancel slow work + during a scope switch and prove cached or optimistic data cannot cross it. +3. Exercise validation, confirmation, cancellation, duplicate submission, + partial GraphQL errors, denials, rollback, and targeted cross-view + invalidation. Also prove credential-shaped query and action inputs are rejected, + ordinary records that resemble results stay ordinary records, only + `appSuccess` and `appFailure` create framework envelopes, and optimistic + callbacks cannot access another scope's cache keys. +4. Exercise intended member behavior plus anonymous, peer, revoked, cross-org, + and destructive member denials. Verify admin/owner destruction only where + the database policy permits it. +5. Test keyboard board movement, focus restoration, reduced motion, chart + accessibility, calendar locale/timezone behavior, responsive fallbacks, and + distinct loading, empty, denied, and error presentation. +6. Install each selected root independently under default and custom aliases. + Reject hidden dependencies on Constructive UI packages, Sheets, Console Kit, + or an unselected App Kit family. +7. Prove every selected root is imported by application-owned code and drives + at least one requested, user-reachable behavior. An installed directory is + not composition evidence. +8. Build and hydrate a real Next.js App Router consumer for page-scale + starters. + +Behavior evidence must execute behavior. Reject tests that only search source +text, check that labels exist, or serialize hard-coded `true` claims for URL +state, hydration, mobile layout, keyboard/focus behavior, or presentation +states. Exercise the rendered application and real loaders/actions, and retain +the command or browser evidence that distinguishes each result. + +Discover and narrow candidates before installation: + +```bash +node /absolute/path/to/check-blocks-contract.mjs --list-registry --family app-kit +node /absolute/path/to/check-blocks-contract.mjs --list-registry --capability temporal +``` + +Do not equate registry generation, schema compatibility, or a visible row with +runtime qualification; report each evidence layer separately. diff --git a/.agents/skills/constructive-blocks/references/app-view-patterns.md b/.agents/skills/constructive-blocks/references/app-view-patterns.md new file mode 100644 index 0000000..db9ce0b --- /dev/null +++ b/.agents/skills/constructive-blocks/references/app-view-patterns.md @@ -0,0 +1,34 @@ +# Select and compose App Kit views + +Read this after resources are validated and the brief needs a collection, +board, dashboard, or temporal surface. Resolve +`installability.appKitDocumentation.authority` through the validated App Kit +catalog query for current controlled and connected component APIs. + +## Select by geometry + +1. Query `--list-registry --family app-kit` and inspect the returned metadata. + Use `--capability` only after discovering the catalog vocabulary. +2. Match collections to scan/compare tasks, boards to explicit semantic stage + movement, dashboards to approved analytical questions, and calendars to + visible-range temporal work. Compose ordinary React when no family fits. +3. Choose the controlled layer when the host owns data and callbacks. Choose + the connected layer when App Kit definitions should own remote execution. +4. Keep record opening host-controlled and preserve URL restoration when the + brief requires shareable filters, selection, view, or range state. + +## Apply view-specific checks + +- Keep collection paging and relation search server-driven. Distinguish + loading, empty, denied, and error states. +- Enable board movement only when a semantic move action exists. Provide a + keyboard alternative and verify rollback plus focus restoration. +- Back every KPI or series with an explicit analytical loader. Never calculate + authoritative metrics from one paginated page, and expose only catalogued + widgets to runtime layout editing. +- Query calendars by visible range with explicit locale and timezone. Do not + imply recurrence, resource scheduling, or drag-rescheduling in V1. + +Use semantic theme tokens, select density and surface variants from context, +and keep primary data/actions usable on mobile. A dense board or layout canvas +may optimize for desktop only when its mobile fallback remains readable. diff --git a/.agents/skills/constructive-blocks/references/brief-to-roots.v1.json b/.agents/skills/constructive-blocks/references/brief-to-roots.v1.json new file mode 100644 index 0000000..43db1f4 --- /dev/null +++ b/.agents/skills/constructive-blocks/references/brief-to-roots.v1.json @@ -0,0 +1,84 @@ +{ + "schemaVersion": 1, + "kind": "constructive.app-kit-brief-routes", + "cases": [ + { + "id": "event-planning", + "brief": "Plan programs and sessions, publish them, assign speakers, review KPIs, move sessions between stages, and browse a month schedule.", + "dataShapes": ["record", "collection", "aggregate", "board", "temporal", "action-input"], + "userIntents": ["define-resources", "search", "edit", "analyze", "plan", "move-records", "schedule", "execute-action", "confirm"], + "capabilities": ["resource-contracts", "record-detail", "relation-panel", "board", "semantic-move", "kpi", "line-chart", "month", "agenda", "action-button", "confirmation-dialog"], + "starterRequested": false, + "expectedRoots": ["app-kit-core", "app-kit-data", "app-kit-board", "app-kit-dashboard", "app-kit-calendar", "app-kit-workflow"], + "forbiddenRoots": ["feature-pack-data", "console-kit-nextjs", "app-kit-event-studio"], + "forbiddenAssumptions": ["spreadsheet-default", "console-default", "review-queue-default"] + }, + { + "id": "event-studio-opt-in", + "brief": "Install the complete Event Studio starter and its paired org-scoped blueprint as the reference application.", + "dataShapes": ["record", "collection", "aggregate", "board", "temporal"], + "userIntents": ["manage-events", "analyze", "schedule", "publish", "relate-people", "configure-views"], + "capabilities": ["event-studio", "dashboard", "collections", "record-detail", "generated-form", "relations", "board", "calendar", "actions", "url-state"], + "starterRequested": true, + "backendPreset": "b2b:storage", + "expectedRoots": ["app-kit-event-studio"], + "forbiddenRoots": ["feature-pack-data", "console-kit-nextjs"], + "forbiddenAssumptions": ["spreadsheet-default", "console-default", "review-queue-default"] + }, + { + "id": "service-desk", + "brief": "Search customers and tickets, assign owners, add notes, and move tickets through an explicit support lifecycle.", + "dataShapes": ["record", "collection", "board", "action-input"], + "userIntents": ["define-resources", "search", "edit", "plan", "move-records", "execute-action", "confirm"], + "capabilities": ["resource-contracts", "record-detail", "relation-panel", "board", "semantic-move", "action-button", "confirmation-dialog"], + "starterRequested": false, + "expectedRoots": ["app-kit-core", "app-kit-data", "app-kit-board", "app-kit-workflow"], + "forbiddenRoots": ["feature-pack-data", "console-kit-nextjs", "app-kit-event-studio"], + "forbiddenAssumptions": ["spreadsheet-default", "console-default"] + }, + { + "id": "intake-approval", + "brief": "Collect typed requests, show their evidence, and let authorized reviewers approve, reject, or request changes.", + "dataShapes": ["record", "collection", "action-input"], + "userIntents": ["define-resources", "edit", "collect-input", "confirm", "execute-action", "guide-steps"], + "capabilities": ["resource-contracts", "record-detail", "generated-form", "action-button", "confirmation-dialog", "stepper"], + "starterRequested": false, + "expectedRoots": ["app-kit-core", "app-kit-data", "app-kit-workflow"], + "forbiddenRoots": ["feature-pack-data", "console-kit-nextjs", "app-kit-board", "app-kit-event-studio"], + "forbiddenAssumptions": ["spreadsheet-default", "console-default", "review-queue-default"] + }, + { + "id": "directory-search", + "brief": "Search a large people and teams directory, filter by attributes, inspect records, and link existing memberships.", + "dataShapes": ["record", "collection"], + "userIntents": ["define-resources", "browse", "search", "relate"], + "capabilities": ["resource-contracts", "record-detail", "relation-picker", "relation-panel", "pagination"], + "starterRequested": false, + "expectedRoots": ["app-kit-core", "app-kit-data"], + "forbiddenRoots": ["feature-pack-data", "console-kit-nextjs", "app-kit-dashboard", "app-kit-event-studio"], + "forbiddenAssumptions": ["spreadsheet-default", "console-default"] + }, + { + "id": "planning", + "brief": "Plan milestones and sessions by stage and date, assign owners, and publish the approved schedule.", + "dataShapes": ["record", "collection", "board", "temporal", "action-input"], + "userIntents": ["define-resources", "edit", "relate", "plan", "move-records", "schedule", "execute-action"], + "capabilities": ["resource-contracts", "record-detail", "relation-picker", "board", "semantic-move", "month", "agenda", "action-button"], + "starterRequested": false, + "expectedRoots": ["app-kit-core", "app-kit-data", "app-kit-board", "app-kit-calendar", "app-kit-workflow"], + "forbiddenRoots": ["feature-pack-data", "console-kit-nextjs", "app-kit-dashboard", "app-kit-event-studio"], + "forbiddenAssumptions": ["spreadsheet-default", "console-default"] + }, + { + "id": "reporting-configuration", + "brief": "Show approved KPIs and trend series, edit the settings records that control report behavior, and run an explicit refresh action.", + "dataShapes": ["record", "aggregate", "series", "action-input"], + "userIntents": ["define-resources", "edit", "analyze", "configure-layout", "execute-action"], + "capabilities": ["resource-contracts", "generated-form", "kpi", "line-chart", "layout-persistence", "action-button"], + "starterRequested": false, + "expectedRoots": ["app-kit-core", "app-kit-data", "app-kit-dashboard", "app-kit-workflow"], + "forbiddenRoots": ["feature-pack-data", "console-kit-nextjs", "app-kit-board", "app-kit-event-studio"], + "forbiddenAssumptions": ["spreadsheet-default", "console-default", "review-queue-default"] + } + ] +} diff --git a/.agents/skills/constructive-blocks/references/event-studio-blueprint.json b/.agents/skills/constructive-blocks/references/event-studio-blueprint.json new file mode 100644 index 0000000..5fc0f87 --- /dev/null +++ b/.agents/skills/constructive-blocks/references/event-studio-blueprint.json @@ -0,0 +1,438 @@ +{ + "tables": [ + { + "table_name": "programs", + "description": "Org-scoped event programs that group sessions.", + "nodes": [ + "DataId", + "DataTimestamps", + { + "$type": "DataEntityMembership", + "data": { + "entity_field_name": "org_id" + } + } + ], + "fields": [ + { + "name": "name", + "type": { "name": "text" }, + "is_required": true + }, + { + "name": "description", + "type": { "name": "text" } + }, + { + "name": "status", + "type": { "name": "text" }, + "is_required": true, + "default": { "value": "draft" }, + "index": "btree" + }, + { + "name": "starts_on", + "type": { "name": "date" } + }, + { + "name": "ends_on", + "type": { "name": "date" } + } + ], + "grants": [ + { + "roles": ["authenticated"], + "privileges": [ + ["select", "*"], + ["insert", "*"], + ["update", "*"], + ["delete", "*"] + ] + } + ], + "use_rls": true, + "policies": [ + { + "$type": "AuthzEntityMembership", + "data": { + "entity_field": "org_id", + "membership_type": 2 + }, + "privileges": ["select", "insert", "update"] + }, + { + "$type": "AuthzEntityMembership", + "policy_name": "admin_delete", + "data": { + "entity_field": "org_id", + "membership_type": 2, + "is_admin": true + }, + "privileges": ["delete"] + }, + { + "$type": "AuthzEntityMembership", + "policy_name": "owner_delete", + "data": { + "entity_field": "org_id", + "membership_type": 2, + "is_owner": true + }, + "privileges": ["delete"] + } + ] + }, + { + "table_name": "sessions", + "description": "Scheduled sessions within an event program.", + "nodes": [ + "DataId", + "DataTimestamps", + { + "$type": "DataEntityMembership", + "data": { + "entity_field_name": "org_id" + } + } + ], + "fields": [ + { + "name": "title", + "type": { "name": "text" }, + "is_required": true + }, + { + "name": "description", + "type": { "name": "text" } + }, + { + "name": "status", + "type": { "name": "text" }, + "is_required": true, + "default": { "value": "draft" }, + "index": "btree" + }, + { + "name": "starts_at", + "type": { "name": "timestamptz" }, + "index": "btree" + }, + { + "name": "ends_at", + "type": { "name": "timestamptz" } + }, + { + "name": "capacity", + "type": { "name": "integer" }, + "min": 0 + }, + { + "name": "tags", + "type": { "name": "text", "array_dimensions": 1 }, + "is_required": true, + "default": { + "value": [], + "cast": { "name": "text", "array_dimensions": 1 } + }, + "index": "gin" + } + ], + "grants": [ + { + "roles": ["authenticated"], + "privileges": [ + ["select", "*"], + ["insert", "*"], + ["update", "*"], + ["delete", "*"] + ] + } + ], + "use_rls": true, + "policies": [ + { + "$type": "AuthzEntityMembership", + "data": { + "entity_field": "org_id", + "membership_type": 2 + }, + "privileges": ["select", "insert", "update"] + }, + { + "$type": "AuthzEntityMembership", + "policy_name": "admin_delete", + "data": { + "entity_field": "org_id", + "membership_type": 2, + "is_admin": true + }, + "privileges": ["delete"] + }, + { + "$type": "AuthzEntityMembership", + "policy_name": "owner_delete", + "data": { + "entity_field": "org_id", + "membership_type": 2, + "is_owner": true + }, + "privileges": ["delete"] + } + ] + }, + { + "table_name": "people", + "description": "Org-scoped speakers, facilitators, and event contacts.", + "nodes": [ + "DataId", + "DataTimestamps", + { + "$type": "DataEntityMembership", + "data": { + "entity_field_name": "org_id" + } + } + ], + "fields": [ + { + "name": "display_name", + "type": { "name": "text" }, + "is_required": true + }, + { + "name": "email", + "type": { "name": "citext" }, + "index": "btree" + }, + { + "name": "role", + "type": { "name": "text" } + } + ], + "grants": [ + { + "roles": ["authenticated"], + "privileges": [ + ["select", "*"], + ["insert", "*"], + ["update", "*"], + ["delete", "*"] + ] + } + ], + "use_rls": true, + "policies": [ + { + "$type": "AuthzEntityMembership", + "data": { + "entity_field": "org_id", + "membership_type": 2 + }, + "privileges": ["select", "insert", "update"] + }, + { + "$type": "AuthzEntityMembership", + "policy_name": "admin_delete", + "data": { + "entity_field": "org_id", + "membership_type": 2, + "is_admin": true + }, + "privileges": ["delete"] + }, + { + "$type": "AuthzEntityMembership", + "policy_name": "owner_delete", + "data": { + "entity_field": "org_id", + "membership_type": 2, + "is_owner": true + }, + "privileges": ["delete"] + } + ] + }, + { + "table_name": "venues", + "description": "Org-scoped physical or virtual session venues.", + "nodes": [ + "DataId", + "DataTimestamps", + { + "$type": "DataEntityMembership", + "data": { + "entity_field_name": "org_id" + } + } + ], + "fields": [ + { + "name": "name", + "type": { "name": "text" }, + "is_required": true + }, + { + "name": "address", + "type": { "name": "text" } + }, + { + "name": "time_zone", + "type": { "name": "text" }, + "is_required": true, + "default": { "value": "UTC" } + }, + { + "name": "capacity", + "type": { "name": "integer" }, + "min": 0 + } + ], + "grants": [ + { + "roles": ["authenticated"], + "privileges": [ + ["select", "*"], + ["insert", "*"], + ["update", "*"], + ["delete", "*"] + ] + } + ], + "use_rls": true, + "policies": [ + { + "$type": "AuthzEntityMembership", + "data": { + "entity_field": "org_id", + "membership_type": 2 + }, + "privileges": ["select", "insert", "update"] + }, + { + "$type": "AuthzEntityMembership", + "policy_name": "admin_delete", + "data": { + "entity_field": "org_id", + "membership_type": 2, + "is_admin": true + }, + "privileges": ["delete"] + }, + { + "$type": "AuthzEntityMembership", + "policy_name": "owner_delete", + "data": { + "entity_field": "org_id", + "membership_type": 2, + "is_owner": true + }, + "privileges": ["delete"] + } + ] + }, + { + "table_name": "session_people", + "description": "Explicit relation records between sessions and people.", + "nodes": [ + "DataId", + "DataTimestamps", + { + "$type": "DataEntityMembership", + "data": { + "entity_field_name": "org_id" + } + } + ], + "fields": [ + { + "name": "role", + "type": { "name": "text" }, + "is_required": true, + "default": { "value": "speaker" } + } + ], + "grants": [ + { + "roles": ["authenticated"], + "privileges": [ + ["select", "*"], + ["insert", "*"], + ["update", "*"], + ["delete", "*"] + ] + } + ], + "use_rls": true, + "policies": [ + { + "$type": "AuthzEntityMembership", + "data": { + "entity_field": "org_id", + "membership_type": 2 + }, + "privileges": ["select", "insert", "update"] + }, + { + "$type": "AuthzEntityMembership", + "policy_name": "admin_delete", + "data": { + "entity_field": "org_id", + "membership_type": 2, + "is_admin": true + }, + "privileges": ["delete"] + }, + { + "$type": "AuthzEntityMembership", + "policy_name": "owner_delete", + "data": { + "entity_field": "org_id", + "membership_type": 2, + "is_owner": true + }, + "privileges": ["delete"] + } + ] + } + ], + "unique_constraints": [ + { + "table_name": "session_people", + "columns": ["session_id", "person_id"] + } + ], + "relations": [ + { + "$type": "RelationBelongsTo", + "source_table": "sessions", + "target_table": "programs", + "field_name": "program_id", + "delete_action": "r", + "is_required": false + }, + { + "$type": "RelationBelongsTo", + "source_table": "sessions", + "target_table": "venues", + "field_name": "venue_id", + "delete_action": "n", + "is_required": false + }, + { + "$type": "RelationBelongsTo", + "source_table": "session_people", + "target_table": "sessions", + "field_name": "session_id", + "delete_action": "c", + "is_required": true + }, + { + "$type": "RelationBelongsTo", + "source_table": "session_people", + "target_table": "people", + "field_name": "person_id", + "delete_action": "c", + "is_required": true + } + ] +} diff --git a/.agents/skills/constructive-blocks/references/event-studio.md b/.agents/skills/constructive-blocks/references/event-studio.md new file mode 100644 index 0000000..bccd249 --- /dev/null +++ b/.agents/skills/constructive-blocks/references/event-studio.md @@ -0,0 +1,40 @@ +# Build the Event Studio starter + +Read this only for the complete Event Studio recipe. Resolve +`installability.appKitDocumentation.authority` through the validated App Kit +catalog query for its current UI exports and integration contract. + +## Provision the paired domain + +1. Select the supported `b2b:storage` preset through the normal backend + provisioning flow. Keep preset selection separate from frontend install. +2. Apply `event-studio-blueprint.json` through the public blueprint SDK/ORM + workflow. Do not translate it into raw SQL or edit backend repositories. +3. Confirm that the resulting final schema exposes org-scoped `programs`, + `sessions`, `people`, `venues`, and explicit `session_people` records. +4. Verify member read/create/update and denied member delete. Verify delete for + org admins and owners, then repeat the denial across organizations. + +The fixture uses `org_id` membership, text statuses, `text[]` session tags, +generated record identities, and a unique session/person link pair. Grants let +PostgreSQL evaluate delete while RLS reserves it for admins and owners. Keep +these as database authority rather than client-side policy. + +## Compose and connect the starter + +1. Select the starter only from the explicit `event-studio-opt-in` brief fixture and + inspect its catalog dependency closure. +2. Implement the host adapter against the generated final GraphQL surface; do + not copy illustrative root names. +3. Back metrics with analytical loaders, collections and relation search with + server queries, the board with a semantic move action, and calendar views + with explicit range/timezone input. +4. Wire publish, schedule, status, link, and unlink intents with permission + errors and targeted invalidation. +5. Keep view, filters, selection, and range URL-addressable through the chosen + host navigation adapter. + +Run the App Kit verification loop, then add Event Studio's denied member +delete, unique relation, direct URL restoration, production Next.js build, and +hydration cases. The V1 recipe contains no realtime, recurrence, raw SQL, or +durable workflow behavior. diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/console-kit-core.json b/.agents/skills/constructive-blocks/references/install-plans.v1/console-kit-core.json index 6abcffd..cbd9e18 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/console-kit-core.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/console-kit-core.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-kit-core","surface":"core","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/console-kit-core","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover"]},{"name":"@constructive-io/data","requiredBy":["console-kit-core"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core"]},{"name":"motion","requiredBy":["motion-config","sheet"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]}]},"featurePacks":[],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-kit-core` installed the shell, runtime, semantic routing, callback boundary, and one per-instance modular Zustand store. Core intentionally includes no feature view, so add selected `console-module-*` items.\n\nDegraded states: explicit endpoint, current `_meta`, introspection, capability, and adapter evidence fail closed independently; installation never grants authority.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-kit-core","surface":"core","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/console-kit-core","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover"]},{"name":"@constructive-io/data@^0.5.0","requiredBy":["console-kit-core"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core"]},{"name":"motion","requiredBy":["motion-config","sheet"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]}]},"featurePacks":[],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-kit-core` installed the shell, runtime, semantic routing, callback boundary, and one per-instance modular Zustand store. Core intentionally includes no feature view, so add selected `console-module-*` items.\n\nDegraded states: explicit endpoint, current `_meta`, introspection, capability, and adapter evidence fail closed independently; installation never grants authority.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/console-kit-nextjs.json b/.agents/skills/constructive-blocks/references/install-plans.v1/console-kit-nextjs.json index 4453928..79c8f1f 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/console-kit-nextjs.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/console-kit-nextjs.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-kit-nextjs","surface":"full-console","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/console-kit-nextjs","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"feature-pack-data","title":"Data Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","button","card","constructive-theme"]},{"name":"console-module-data","title":"Data Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-data","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-auth","title":"Authentication Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","card","checkbox","cn","field","input","input-group","separator","tabs","constructive-theme"]},{"name":"console-module-auth","title":"Authentication Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-auth","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-users","title":"App access Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","checkbox","cn","dialog","dropdown-menu","empty","field","input","input-group","select","table","tabs","textarea","constructive-theme"]},{"name":"console-module-users","title":"App access Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-users","console-feature-catalog","constructive-theme"]},{"name":"switch","title":"Switch","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-organizations","title":"Organizations Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert-dialog","avatar","badge","button","card","checkbox","cn","dialog","dropdown-menu","empty","field","input","select","switch","table","tabs","textarea","constructive-theme"]},{"name":"console-module-organizations","title":"Organizations Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-organizations","console-feature-catalog","console-runtime","pack-foundation","constructive-theme"]},{"name":"radio-group","title":"Radio Group","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-storage","title":"Storage Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","cn","dialog","dropdown-menu","field","input","radio-group","table","constructive-theme"]},{"name":"console-module-storage","title":"Storage Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-storage","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"billing-contracts","title":"Billing Contracts","type":"registry:lib","directRegistryDependencies":[]},{"name":"billing-ui","title":"Billing UI Helpers","type":"registry:lib","directRegistryDependencies":["badge","billing-contracts","cn"]},{"name":"pagination","title":"Pagination","type":"registry:ui","directRegistryDependencies":["cn","button","constructive-theme"]},{"name":"billing-activity-table","title":"Billing Activity Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","sheet","skeleton","table","constructive-theme"]},{"name":"progress","title":"Progress","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-credits-card","title":"Billing Credits Card","type":"registry:block","directRegistryDependencies":["alert","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"billing-entitlements-list","title":"Billing Entitlements List","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","tooltip","constructive-theme"]},{"name":"billing-pricing-table","title":"Billing Pricing Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","select","separator","skeleton","constructive-theme"]},{"name":"billing-subscription-card","title":"Billing Subscription Card","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","constructive-theme"]},{"name":"billing-usage-history","title":"Billing Usage History","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","skeleton","table","constructive-theme"]},{"name":"billing-usage-overview","title":"Billing Usage Overview","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"billing-settings-page","title":"Billing Settings Page","type":"registry:block","directRegistryDependencies":["alert","badge","billing-activity-table","billing-contracts","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","cn","separator","tabs","tooltip","constructive-theme"]},{"name":"feature-pack-billing","title":"Billing Feature Pack","type":"registry:block","directRegistryDependencies":["billing-settings-page","constructive-theme"]},{"name":"console-module-billing","title":"Billing Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-billing","billing-contracts","console-feature-catalog","constructive-theme"]},{"name":"feature-pack-notifications","title":"Notifications Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","separator","constructive-theme"]},{"name":"console-module-notifications","title":"Notifications Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-notifications","console-feature-catalog","constructive-theme"]},{"name":"preset-full","title":"Full Preset","type":"registry:block","directRegistryDependencies":["console-kit-core","console-module-data","console-module-auth","console-module-users","console-module-organizations","console-module-storage","console-module-billing","console-module-notifications","constructive-theme"]},{"name":"console-kit-nextjs","title":"Constructive Console Kit for Next.js","type":"registry:block","directRegistryDependencies":["preset-full","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","checkbox","tabs","scroll-area","dialog","select","switch","radio-group","progress"]},{"name":"@constructive-io/data","requiredBy":["console-kit-core","feature-pack-data"]},{"name":"@constructive-io/sheets","requiredBy":["feature-pack-data"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","feature-pack-data","input-group","feature-pack-auth","dialog","select","feature-pack-users","feature-pack-organizations","feature-pack-storage","pagination","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","billing-settings-page","feature-pack-notifications"]},{"name":"motion","requiredBy":["motion-config","sheet","billing-credits-card","billing-usage-overview"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/pagination.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["pagination"],"sources":[{"registryItem":"pagination","path":"registry/constructive/ui/pagination.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/progress.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["progress"],"sources":[{"registryItem":"progress","path":"registry/constructive/ui/progress.tsx"}]},{"target":"@ui/radio-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["radio-group"],"sources":[{"registryItem":"radio-group","path":"registry/constructive/ui/radio-group.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/switch.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["switch"],"sources":[{"registryItem":"switch","path":"registry/constructive/ui/switch.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/billing-activity-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/billing-activity-table.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/messages.ts"}]},{"target":"src/blocks/billing/billing-contracts/billing-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["billing-contracts"],"sources":[{"registryItem":"billing-contracts","path":"registry/constructive/blocks/billing/billing-contracts/billing-contracts.ts"}]},{"target":"src/blocks/billing/billing-credits-card/billing-credits-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/billing-credits-card.tsx"}]},{"target":"src/blocks/billing/billing-credits-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/messages.ts"}]},{"target":"src/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx"}]},{"target":"src/blocks/billing/billing-entitlements-list/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/messages.ts"}]},{"target":"src/blocks/billing/billing-pricing-table/billing-pricing-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/billing-pricing-table.tsx"}]},{"target":"src/blocks/billing/billing-pricing-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/messages.ts"}]},{"target":"src/blocks/billing/billing-settings-page/billing-settings-page.tsx","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/billing-settings-page.tsx"}]},{"target":"src/blocks/billing/billing-settings-page/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/messages.ts"}]},{"target":"src/blocks/billing/billing-subscription-card/billing-subscription-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/billing-subscription-card.tsx"}]},{"target":"src/blocks/billing/billing-subscription-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/messages.ts"}]},{"target":"src/blocks/billing/billing-ui/billing-ui.tsx","targetKind":"literal","type":"registry:lib","owners":["billing-ui"],"sources":[{"registryItem":"billing-ui","path":"registry/constructive/blocks/billing/billing-ui/billing-ui.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/billing-usage-history.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/billing-usage-history.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/messages.ts"}]},{"target":"src/blocks/billing/billing-usage-overview/billing-usage-overview.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/billing-usage-overview.tsx"}]},{"target":"src/blocks/billing/billing-usage-overview/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/messages.ts"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/auth-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/console-kit/constructive/auth-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/billing-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-billing"],"sources":[{"registryItem":"console-module-billing","path":"registry/constructive/blocks/console-kit/constructive/billing-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-nextjs"],"sources":[{"registryItem":"console-kit-nextjs","path":"registry/constructive/blocks/console-kit/constructive/index.ts"}]},{"target":"src/blocks/console-kit/constructive/notifications-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-notifications"],"sources":[{"registryItem":"console-module-notifications","path":"registry/constructive/blocks/console-kit/constructive/notifications-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/organizations-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/console-kit/constructive/organizations-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/storage-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/console-kit/constructive/storage-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/users-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/console-kit/constructive/users-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-account-view.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-account-view.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-challenge-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-challenge-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-console-module.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-contracts.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-entry-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-entry-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-password-policy.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-password-policy.ts"}]},{"target":"src/blocks/feature-packs/billing/billing-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-billing"],"sources":[{"registryItem":"console-module-billing","path":"registry/constructive/blocks/feature-packs/billing/billing-console-module.tsx"}]},{"target":"src/blocks/feature-packs/billing/billing-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/billing-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/data/data-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-data"],"sources":[{"registryItem":"console-module-data","path":"registry/constructive/blocks/feature-packs/data/data-console-module.tsx"}]},{"target":"src/blocks/feature-packs/data/data-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/data-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/notifications/notifications-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-notifications"],"sources":[{"registryItem":"console-module-notifications","path":"registry/constructive/blocks/feature-packs/notifications/notifications-console-module.tsx"}]},{"target":"src/blocks/feature-packs/notifications/notifications-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/notifications-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-access-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-access-panels.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-console-module.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-contracts.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-meta-contract.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-operation-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-operation-panels.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-module.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-slice.ts"}]},{"target":"src/blocks/feature-packs/storage/storage-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-meta-contract.ts"}]},{"target":"src/blocks/feature-packs/users/users-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/feature-packs/users/users-console-module.tsx"}]},{"target":"src/blocks/feature-packs/users/users-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/users-feature-pack.tsx"}]},{"target":"src/blocks/presets/full-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["preset-full"],"sources":[{"registryItem":"preset-full","path":"registry/constructive/blocks/presets/full-console-kit.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/auth.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/billing.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/data.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/full.json","targetKind":"project-root","type":"registry:file","owners":["preset-full"],"sources":[{"registryItem":"preset-full","path":"registry/constructive/blocks/presets/full.json"}]},{"target":"~/.constructive/feature-packs/notifications.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/organizations.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/storage.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/users.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"data","title":"Data","description":"Dynamic table exploration and CRUD surfaces driven by Constructive metadata and GraphQL introspection.","dependencies":[],"endpoints":{"required":["data"],"optional":[]},"capabilities":{"required":["data.meta","data.introspection"],"optional":["data.search","data.i18n","data.realtime"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","search","i18n","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"auth","title":"Authentication","description":"Consumer sign-in, account profile, password, and session-management surfaces.","dependencies":[],"endpoints":{"required":["auth"],"optional":[]},"capabilities":{"required":["auth.sessions","auth.credentials","auth.password"],"optional":["auth.email","auth.connected-accounts","auth.identity-providers","auth.passkeys","auth.phone","auth.devices"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"users","title":"App access","description":"Application member governance, lifecycle controls, profiles, permission grants, and invitations.","dependencies":[],"endpoints":{"required":["admin"],"optional":["auth"]},"capabilities":{"required":["users.directory","users.memberships"],"optional":["users.permissions","users.profiles","users.invites"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"organizations","title":"Organizations","description":"Tenant membership governance, invitations, access policy, hierarchy, settings, and developer credentials.","dependencies":[],"endpoints":{"required":[],"optional":["admin","auth","billing","data"]},"capabilities":{"required":["organizations.memberships"],"optional":["organizations.permissions","organizations.limits","organizations.profiles","organizations.hierarchy","organizations.invites"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"storage","title":"Storage","description":"Policy-aware bucket navigation, uploads, downloads, and object deletion.","dependencies":[],"endpoints":{"required":[],"optional":["storage","admin","data"]},"capabilities":{"required":["storage.buckets","storage.files"],"optional":["storage.versioning","storage.content-hash","storage.custom-keys","storage.audit-log"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","storage"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"billing","title":"Billing","description":"Plans, subscriptions, entitlement meters, usage, credits, and account activity.","dependencies":[],"endpoints":{"required":[],"optional":["billing","admin","data"]},"capabilities":{"required":["billing.plans","billing.subscriptions"],"optional":["billing.meters"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"notifications","title":"Notifications","description":"User notification inbox and read-state actions with optional settings and realtime capabilities.","dependencies":[],"endpoints":{"required":[],"optional":["notifications","auth","data"]},"capabilities":{"required":["notifications.inbox"],"optional":["notifications.settings","notifications.realtime"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[{"schemaVersion":1,"id":"full","presetSlug":"full","title":"Full","description":"Every first-release Constructive feature pack.","stability":"stable","featurePacks":["data","auth","users","organizations","storage","billing","notifications"]}],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-kit-nextjs` installed the full Next.js tenant console. Render `ConstructiveConsoleKit` with a secret-free database ID and explicit semantic endpoint map; use presets or selected Console modules for smaller compositions.\n\nDegraded states: every endpoint and module fails closed independently, diagnostics are development-only, credentials never enter Zustand, and PostgreSQL privileges and RLS remain authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/data.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/auth.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/users.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/organizations.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/storage.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/billing.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/notifications.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-kit-nextjs","surface":"full-console","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/console-kit-nextjs","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"calendar-rac","title":"Calendar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"form-control","title":"Form Control","type":"registry:ui","directRegistryDependencies":["cn","slot","label","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"pagination","title":"Pagination","type":"registry:ui","directRegistryDependencies":["cn","button","constructive-theme"]},{"name":"progressive-blur","title":"Progressive Blur","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"toast","title":"Toast Notifications","type":"registry:block","directRegistryDependencies":["button","dialog","constructive-theme"]},{"name":"sheets","title":"Sheets","type":"registry:block","directRegistryDependencies":["alert-dialog","badge","button","calendar-rac","card","checkbox","collapsible","dropdown-menu","form-control","input","input-group","label","pagination","popover","progressive-blur","scroll-area","select","skeleton","tabs","textarea","toast","tooltip","constructive-theme"]},{"name":"feature-pack-data","title":"Data Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","sheets","alert","button","card","constructive-theme"]},{"name":"console-module-data","title":"Data Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-data","console-feature-catalog","console-runtime","sheets","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"feature-pack-auth","title":"Authentication Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","card","checkbox","cn","field","input","input-group","separator","tabs","constructive-theme"]},{"name":"console-module-auth","title":"Authentication Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-auth","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-users","title":"App access Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","checkbox","cn","dialog","dropdown-menu","empty","field","input","input-group","select","table","tabs","textarea","constructive-theme"]},{"name":"console-module-users","title":"App access Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-users","console-feature-catalog","constructive-theme"]},{"name":"switch","title":"Switch","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-organizations","title":"Organizations Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert-dialog","avatar","badge","button","card","checkbox","cn","dialog","dropdown-menu","empty","field","input","select","switch","table","tabs","textarea","constructive-theme"]},{"name":"console-module-organizations","title":"Organizations Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-organizations","console-feature-catalog","console-runtime","pack-foundation","constructive-theme"]},{"name":"radio-group","title":"Radio Group","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-storage","title":"Storage Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","cn","dialog","dropdown-menu","field","input","radio-group","table","constructive-theme"]},{"name":"console-module-storage","title":"Storage Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-storage","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"billing-contracts","title":"Billing Contracts","type":"registry:lib","directRegistryDependencies":[]},{"name":"billing-ui","title":"Billing UI Helpers","type":"registry:lib","directRegistryDependencies":["badge","billing-contracts","cn"]},{"name":"billing-activity-table","title":"Billing Activity Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","sheet","skeleton","table","constructive-theme"]},{"name":"progress","title":"Progress","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-credits-card","title":"Billing Credits Card","type":"registry:block","directRegistryDependencies":["alert","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"billing-entitlements-list","title":"Billing Entitlements List","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","tooltip","constructive-theme"]},{"name":"billing-pricing-table","title":"Billing Pricing Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","select","separator","skeleton","constructive-theme"]},{"name":"billing-subscription-card","title":"Billing Subscription Card","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","constructive-theme"]},{"name":"billing-usage-history","title":"Billing Usage History","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","skeleton","table","constructive-theme"]},{"name":"billing-usage-overview","title":"Billing Usage Overview","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"billing-settings-page","title":"Billing Settings Page","type":"registry:block","directRegistryDependencies":["alert","badge","billing-activity-table","billing-contracts","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","cn","separator","tabs","tooltip","constructive-theme"]},{"name":"feature-pack-billing","title":"Billing Feature Pack","type":"registry:block","directRegistryDependencies":["billing-settings-page","constructive-theme"]},{"name":"console-module-billing","title":"Billing Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-billing","billing-contracts","console-feature-catalog","constructive-theme"]},{"name":"feature-pack-notifications","title":"Notifications Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","separator","constructive-theme"]},{"name":"console-module-notifications","title":"Notifications Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-notifications","console-feature-catalog","constructive-theme"]},{"name":"preset-full","title":"Full Preset","type":"registry:block","directRegistryDependencies":["console-kit-core","console-module-data","console-module-auth","console-module-users","console-module-organizations","console-module-storage","console-module-billing","console-module-notifications","constructive-theme"]},{"name":"console-kit-nextjs","title":"Constructive Console Kit for Next.js","type":"registry:block","directRegistryDependencies":["preset-full","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","checkbox","scroll-area","select","tabs","dialog","switch","radio-group","progress"]},{"name":"@constructive-io/data@^0.5.0","requiredBy":["console-kit-core","sheets","feature-pack-data"]},{"name":"@internationalized/date","requiredBy":["calendar-rac","sheets"]},{"name":"@remixicon/react","requiredBy":["sheets"]},{"name":"@tanstack/react-form","requiredBy":["sheets"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core","sheets"]},{"name":"@tanstack/react-table@9.0.0-beta.58","requiredBy":["sheets"]},{"name":"@tanstack/react-virtual","requiredBy":["sheets"]},{"name":"@types/leaflet","requiredBy":["sheets"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn","sheets"]},{"name":"graphql","requiredBy":["console-kit-core","sheets"]},{"name":"inflekt","requiredBy":["sheets"]},{"name":"leaflet","requiredBy":["sheets"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","input-group","pagination","select","dialog","toast","sheets","feature-pack-data","feature-pack-auth","feature-pack-users","feature-pack-organizations","feature-pack-storage","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","billing-settings-page","feature-pack-notifications"]},{"name":"motion","requiredBy":["motion-config","sheet","sheets","billing-credits-card","billing-usage-overview"]},{"name":"react-aria-components","requiredBy":["calendar-rac","sheets"]},{"name":"react-leaflet","requiredBy":["sheets"]},{"name":"sonner","requiredBy":["toast"]},{"name":"tailwind-merge","requiredBy":["cn","sheets"]},{"name":"zod","requiredBy":["console-feature-catalog","sheets"]},{"name":"zustand","requiredBy":["console-kit-core","sheets"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/calendar-rac.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["calendar-rac"],"sources":[{"registryItem":"calendar-rac","path":"registry/constructive/ui/calendar-rac.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/form-control.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["form-control"],"sources":[{"registryItem":"form-control","path":"registry/constructive/ui/form-control.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/pagination.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["pagination"],"sources":[{"registryItem":"pagination","path":"registry/constructive/ui/pagination.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/progress.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["progress"],"sources":[{"registryItem":"progress","path":"registry/constructive/ui/progress.tsx"}]},{"target":"@ui/progressive-blur.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["progressive-blur"],"sources":[{"registryItem":"progressive-blur","path":"registry/constructive/ui/progressive-blur.tsx"}]},{"target":"@ui/radio-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["radio-group"],"sources":[{"registryItem":"radio-group","path":"registry/constructive/ui/radio-group.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sheets/adapter/postgraphile-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/postgraphile-adapter.ts"}]},{"target":"@ui/sheets/adapter/sheets-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/sheets-adapter.ts"}]},{"target":"@ui/sheets/adapter/use-sheets-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/use-sheets-adapter.ts"}]},{"target":"@ui/sheets/advanced.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/advanced.ts"}]},{"target":"@ui/sheets/auth/auth-execute.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-execute.ts"}]},{"target":"@ui/sheets/auth/auth-gate.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-gate.tsx"}]},{"target":"@ui/sheets/auth/auth-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-types.ts"}]},{"target":"@ui/sheets/auth/hooks/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/index.ts"}]},{"target":"@ui/sheets/auth/hooks/use-forgot-password.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-forgot-password.ts"}]},{"target":"@ui/sheets/auth/hooks/use-login.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-login.ts"}]},{"target":"@ui/sheets/auth/hooks/use-register.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-register.ts"}]},{"target":"@ui/sheets/auth/hooks/use-reset-password.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-reset-password.ts"}]},{"target":"@ui/sheets/auth/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/index.ts"}]},{"target":"@ui/sheets/auth/ui/auth-error-alert.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-error-alert.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-loading-button.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-loading-button.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-screen-header.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-screen-header.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-screen-layout.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-screen-layout.tsx"}]},{"target":"@ui/sheets/auth/ui/forgot-password-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/forgot-password-form.tsx"}]},{"target":"@ui/sheets/auth/ui/form-field.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/form-field.tsx"}]},{"target":"@ui/sheets/auth/ui/login-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/login-form.tsx"}]},{"target":"@ui/sheets/auth/ui/password-strength.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/password-strength.tsx"}]},{"target":"@ui/sheets/auth/ui/register-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/register-form.tsx"}]},{"target":"@ui/sheets/auth/ui/reset-password-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/reset-password-form.tsx"}]},{"target":"@ui/sheets/auth/utils/auth-errors.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/auth-errors.ts"}]},{"target":"@ui/sheets/auth/utils/schemas.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/schemas.ts"}]},{"target":"@ui/sheets/auth/utils/token-store.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/token-store.ts"}]},{"target":"@ui/sheets/auth/utils/validators.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/validators.ts"}]},{"target":"@ui/sheets/cell-model/badge-tones.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/badge-tones.ts"}]},{"target":"@ui/sheets/cell-model/cell-props.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/cell-props.ts"}]},{"target":"@ui/sheets/cell-model/cell-slots.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/cell-slots.ts"}]},{"target":"@ui/sheets/cell-model/create-sheets-cell.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/create-sheets-cell.ts"}]},{"target":"@ui/sheets/cell-model/factories/badges.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/badges.ts"}]},{"target":"@ui/sheets/cell-model/factories/boolean.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/boolean.ts"}]},{"target":"@ui/sheets/cell-model/factories/datetime.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/datetime.ts"}]},{"target":"@ui/sheets/cell-model/factories/geometry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/geometry.ts"}]},{"target":"@ui/sheets/cell-model/factories/image.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/image.ts"}]},{"target":"@ui/sheets/cell-model/factories/interval.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/interval.ts"}]},{"target":"@ui/sheets/cell-model/factories/number.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/number.ts"}]},{"target":"@ui/sheets/cell-model/factories/relation.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/relation.ts"}]},{"target":"@ui/sheets/cell-model/factories/text.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/text.ts"}]},{"target":"@ui/sheets/cell-model/factories/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/types.ts"}]},{"target":"@ui/sheets/cell-model/factories/uri.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/uri.ts"}]},{"target":"@ui/sheets/cell-model/image-cache.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/image-cache.ts"}]},{"target":"@ui/sheets/cell-model/sheets-cell.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/sheets-cell.ts"}]},{"target":"@ui/sheets/cell-model/views/badges-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/badges-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/boolean-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/boolean-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/datetime-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/datetime-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/draft-action-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/draft-action-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/geometry-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/geometry-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/image-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/image-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/interval-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/interval-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/loading-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/loading-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/number-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/number-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/relation-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/relation-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/text-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/text-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/uri-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/uri-view.tsx"}]},{"target":"@ui/sheets/cell-types/cell-registry-defaults.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-registry-defaults.ts"}]},{"target":"@ui/sheets/cell-types/cell-registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-registry.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-groups.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-groups.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-registry.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-resolver.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-resolver.ts"}]},{"target":"@ui/sheets/cell-types/define-cell-type.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/define-cell-type.ts"}]},{"target":"@ui/sheets/cell-types/type-mapping.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/type-mapping.ts"}]},{"target":"@ui/sheets/cell-types/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/types.ts"}]},{"target":"@ui/sheets/commands/context.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/context.ts"}]},{"target":"@ui/sheets/commands/dispatch.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/dispatch.ts"}]},{"target":"@ui/sheets/commands/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/index.ts"}]},{"target":"@ui/sheets/commands/keybinding.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/keybinding.ts"}]},{"target":"@ui/sheets/commands/keymap.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/keymap.ts"}]},{"target":"@ui/sheets/commands/registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/registry.ts"}]},{"target":"@ui/sheets/commands/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/types.ts"}]},{"target":"@ui/sheets/config/sheets-concurrency.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/config/sheets-concurrency.ts"}]},{"target":"@ui/sheets/context/sheets-context.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-context.ts"}]},{"target":"@ui/sheets/context/sheets-execute.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-execute.ts"}]},{"target":"@ui/sheets/context/sheets-provider.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-provider.tsx"}]},{"target":"@ui/sheets/context/sheets-upload-presigned.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-upload-presigned.ts"}]},{"target":"@ui/sheets/forms/form-spec-builder.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/form-spec-builder.ts"}]},{"target":"@ui/sheets/forms/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/index.ts"}]},{"target":"@ui/sheets/forms/metadata-hash.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/metadata-hash.ts"}]},{"target":"@ui/sheets/forms/mutations.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/mutations.ts"}]},{"target":"@ui/sheets/forms/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/types.ts"}]},{"target":"@ui/sheets/forms/zod-schema.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/zod-schema.ts"}]},{"target":"@ui/sheets/grid-dom/editors/array-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/array-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/date-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/date-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/edit-intent.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/edit-intent.ts"}]},{"target":"@ui/sheets/grid-dom/editors/editor-props.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/editor-props.ts"}]},{"target":"@ui/sheets/grid-dom/editors/editor-registry-dom.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/editor-registry-dom.ts"}]},{"target":"@ui/sheets/grid-dom/editors/geometry-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/geometry-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/image-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/image-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/inet-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/inet-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/interval-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/interval-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/json-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/json-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/number-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/number-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/relation-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/relation-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/text-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/text-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/tsvector-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/tsvector-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/upload-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/upload-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/url-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/url-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/inline-cell-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/inline-cell-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/overlay/overlay-manager.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/overlay/overlay-manager.tsx"}]},{"target":"@ui/sheets/grid-dom/overlay/use-overlay-controller.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/overlay/use-overlay-controller.ts"}]},{"target":"@ui/sheets/grid-dom/sheets-cell-host.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/sheets-cell-host.tsx"}]},{"target":"@ui/sheets/grid-dom/use-sheets-content.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/use-sheets-content.ts"}]},{"target":"@ui/sheets/grid/cell-routing.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/cell-routing.ts"}]},{"target":"@ui/sheets/grid/draft-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/draft-types.ts"}]},{"target":"@ui/sheets/grid/editors/array-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/array-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/date-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/date-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/editor-focus-trap.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/editor-focus-trap.tsx"}]},{"target":"@ui/sheets/grid/editors/geometry-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/geometry-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/image-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/image-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/inet-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/inet-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/interval-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/interval-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/json-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/json-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/overlay-presets.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/overlay-presets.ts"}]},{"target":"@ui/sheets/grid/editors/overlay-viewport-guard.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/overlay-viewport-guard.tsx"}]},{"target":"@ui/sheets/grid/editors/relation-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/relation-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/relation-record-tooltip.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/relation-record-tooltip.tsx"}]},{"target":"@ui/sheets/grid/editors/tsvector-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/tsvector-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/upload-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/upload-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/url-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/url-editor.tsx"}]},{"target":"@ui/sheets/grid/feedback/dock-status-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/dock-status-bar.tsx"}]},{"target":"@ui/sheets/grid/feedback/editor-error-boundary.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/editor-error-boundary.tsx"}]},{"target":"@ui/sheets/grid/feedback/feedback-context.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/feedback-context.tsx"}]},{"target":"@ui/sheets/grid/feedback/feedback-reducer.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/feedback-reducer.ts"}]},{"target":"@ui/sheets/grid/feedback/floating-status.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/floating-status.tsx"}]},{"target":"@ui/sheets/grid/feedback/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/index.ts"}]},{"target":"@ui/sheets/grid/feedback/sheets-error-boundary.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/sheets-error-boundary.tsx"}]},{"target":"@ui/sheets/grid/feedback/sheets-error-state.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/sheets-error-state.tsx"}]},{"target":"@ui/sheets/grid/filter-operators.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/filter-operators.ts"}]},{"target":"@ui/sheets/grid/grid-cell-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/grid-cell-types.ts"}]},{"target":"@ui/sheets/grid/hooks/use-batch-commit.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-batch-commit.ts"}]},{"target":"@ui/sheets/grid/hooks/use-cell-editing.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-cell-editing.ts"}]},{"target":"@ui/sheets/grid/hooks/use-draft-rows.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-draft-rows.ts"}]},{"target":"@ui/sheets/grid/hooks/use-draft-submission.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-draft-submission.ts"}]},{"target":"@ui/sheets/grid/hooks/use-filter-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-filter-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-operations.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-operations.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-selection.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-selection.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-state.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-state.ts"}]},{"target":"@ui/sheets/grid/hooks/use-infinite-grid-data.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-infinite-grid-data.ts"}]},{"target":"@ui/sheets/grid/hooks/use-load-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-load-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-paginate-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-paginate-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-undo-redo.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-undo-redo.ts"}]},{"target":"@ui/sheets/grid/row-model.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/row-model.ts"}]},{"target":"@ui/sheets/grid/sheets.constants.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.constants.ts"}]},{"target":"@ui/sheets/grid/sheets.context-menu.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.context-menu.tsx"}]},{"target":"@ui/sheets/grid/sheets.controls.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.controls.tsx"}]},{"target":"@ui/sheets/grid/sheets.formatters.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.formatters.ts"}]},{"target":"@ui/sheets/grid/sheets.pagination.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.pagination.tsx"}]},{"target":"@ui/sheets/grid/sheets.table-selector.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.table-selector.tsx"}]},{"target":"@ui/sheets/grid/sheets.theme.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.theme.ts"}]},{"target":"@ui/sheets/grid/sheets.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.tsx"}]},{"target":"@ui/sheets/grid/sheets.types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.types.ts"}]},{"target":"@ui/sheets/grid/sheets.utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.utils.ts"}]},{"target":"@ui/sheets/grid/use-sheets.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/use-sheets.ts"}]},{"target":"@ui/sheets/hooks/orderby-enum-resolution.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/orderby-enum-resolution.ts"}]},{"target":"@ui/sheets/hooks/query-keys.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/query-keys.ts"}]},{"target":"@ui/sheets/hooks/relation-field-resolution.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/relation-field-resolution.ts"}]},{"target":"@ui/sheets/hooks/use-relation-columns.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-relation-columns.ts"}]},{"target":"@ui/sheets/hooks/use-relation-metadata-cache.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-relation-metadata-cache.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-infinite-table.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-infinite-table.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-meta.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-meta.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-table-cursor.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-table-cursor.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-table.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-table.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-upload.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-upload.ts"}]},{"target":"@ui/sheets/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/index.ts"}]},{"target":"@ui/sheets/row-identity.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/row-identity.ts"}]},{"target":"@ui/sheets/selection/cell-extract.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/cell-extract.ts"}]},{"target":"@ui/sheets/selection/fill.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/fill.ts"}]},{"target":"@ui/sheets/selection/range-set.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/range-set.ts"}]},{"target":"@ui/sheets/selection/selection-model.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/selection-model.ts"}]},{"target":"@ui/sheets/selection/tsv.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/tsv.ts"}]},{"target":"@ui/sheets/store/draft-rows-slice.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/draft-rows-slice.ts"}]},{"target":"@ui/sheets/store/relation-info-slice.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/relation-info-slice.ts"}]},{"target":"@ui/sheets/store/sheets-store.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/sheets-store.ts"}]},{"target":"@ui/sheets/table/features.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/features.ts"}]},{"target":"@ui/sheets/table/grid-viewport.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/grid-viewport.tsx"}]},{"target":"@ui/sheets/table/use-sheets-table-instance.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/use-sheets-table-instance.ts"}]},{"target":"@ui/sheets/utils/cn.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/cn.ts"}]},{"target":"@ui/sheets/utils/file.utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/file.utils.ts"}]},{"target":"@ui/sheets/utils/image-with-fallback.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/image-with-fallback.tsx"}]},{"target":"@ui/sheets/utils/map-picker.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/map-picker.tsx"}]},{"target":"@ui/sheets/utils/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/motion-config.ts"}]},{"target":"@ui/sheets/utils/relation-utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/relation-utils.ts"}]},{"target":"@ui/sheets/utils/sheets-i18n.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/sheets-i18n.ts"}]},{"target":"@ui/sheets/utils/sheets-logger.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/sheets-logger.ts"}]},{"target":"@ui/sheets/utils/use-color-scheme.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-color-scheme.ts"}]},{"target":"@ui/sheets/utils/use-image-status.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-image-status.ts"}]},{"target":"@ui/sheets/utils/use-resize-observer.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-resize-observer.ts"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/switch.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["switch"],"sources":[{"registryItem":"switch","path":"registry/constructive/ui/switch.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/toast/index.ts","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/index.ts"}]},{"target":"@ui/toast/toast-error.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-error.tsx"}]},{"target":"@ui/toast/toast-info.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-info.tsx"}]},{"target":"@ui/toast/toast-success.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-success.tsx"}]},{"target":"@ui/toast/toast-warning.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-warning.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/billing-activity-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/billing-activity-table.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/messages.ts"}]},{"target":"src/blocks/billing/billing-contracts/billing-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["billing-contracts"],"sources":[{"registryItem":"billing-contracts","path":"registry/constructive/blocks/billing/billing-contracts/billing-contracts.ts"}]},{"target":"src/blocks/billing/billing-credits-card/billing-credits-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/billing-credits-card.tsx"}]},{"target":"src/blocks/billing/billing-credits-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/messages.ts"}]},{"target":"src/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx"}]},{"target":"src/blocks/billing/billing-entitlements-list/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/messages.ts"}]},{"target":"src/blocks/billing/billing-pricing-table/billing-pricing-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/billing-pricing-table.tsx"}]},{"target":"src/blocks/billing/billing-pricing-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/messages.ts"}]},{"target":"src/blocks/billing/billing-settings-page/billing-settings-page.tsx","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/billing-settings-page.tsx"}]},{"target":"src/blocks/billing/billing-settings-page/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/messages.ts"}]},{"target":"src/blocks/billing/billing-subscription-card/billing-subscription-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/billing-subscription-card.tsx"}]},{"target":"src/blocks/billing/billing-subscription-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/messages.ts"}]},{"target":"src/blocks/billing/billing-ui/billing-ui.tsx","targetKind":"literal","type":"registry:lib","owners":["billing-ui"],"sources":[{"registryItem":"billing-ui","path":"registry/constructive/blocks/billing/billing-ui/billing-ui.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/billing-usage-history.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/billing-usage-history.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/messages.ts"}]},{"target":"src/blocks/billing/billing-usage-overview/billing-usage-overview.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/billing-usage-overview.tsx"}]},{"target":"src/blocks/billing/billing-usage-overview/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/messages.ts"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/auth-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/console-kit/constructive/auth-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/billing-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-billing"],"sources":[{"registryItem":"console-module-billing","path":"registry/constructive/blocks/console-kit/constructive/billing-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-nextjs"],"sources":[{"registryItem":"console-kit-nextjs","path":"registry/constructive/blocks/console-kit/constructive/index.ts"}]},{"target":"src/blocks/console-kit/constructive/notifications-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-notifications"],"sources":[{"registryItem":"console-module-notifications","path":"registry/constructive/blocks/console-kit/constructive/notifications-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/organizations-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/console-kit/constructive/organizations-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/storage-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/console-kit/constructive/storage-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/users-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/console-kit/constructive/users-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-account-view.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-account-view.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-challenge-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-challenge-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-console-module.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-contracts.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-entry-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-entry-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-password-policy.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-password-policy.ts"}]},{"target":"src/blocks/feature-packs/billing/billing-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-billing"],"sources":[{"registryItem":"console-module-billing","path":"registry/constructive/blocks/feature-packs/billing/billing-console-module.tsx"}]},{"target":"src/blocks/feature-packs/billing/billing-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/billing-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/data/data-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-data"],"sources":[{"registryItem":"console-module-data","path":"registry/constructive/blocks/feature-packs/data/data-console-module.tsx"}]},{"target":"src/blocks/feature-packs/data/data-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/data-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/notifications/notifications-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-notifications"],"sources":[{"registryItem":"console-module-notifications","path":"registry/constructive/blocks/feature-packs/notifications/notifications-console-module.tsx"}]},{"target":"src/blocks/feature-packs/notifications/notifications-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/notifications-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-access-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-access-panels.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-console-module.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-contracts.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-meta-contract.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-operation-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-operation-panels.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-module.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-slice.ts"}]},{"target":"src/blocks/feature-packs/storage/storage-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-meta-contract.ts"}]},{"target":"src/blocks/feature-packs/users/users-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/feature-packs/users/users-console-module.tsx"}]},{"target":"src/blocks/feature-packs/users/users-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/users-feature-pack.tsx"}]},{"target":"src/blocks/presets/full-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["preset-full"],"sources":[{"registryItem":"preset-full","path":"registry/constructive/blocks/presets/full-console-kit.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/auth.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/billing.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/data.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/full.json","targetKind":"project-root","type":"registry:file","owners":["preset-full"],"sources":[{"registryItem":"preset-full","path":"registry/constructive/blocks/presets/full.json"}]},{"target":"~/.constructive/feature-packs/notifications.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/organizations.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/storage.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/users.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"data","title":"Data","description":"Dynamic table exploration and CRUD surfaces driven by Constructive metadata and GraphQL introspection.","dependencies":[],"endpoints":{"required":["data"],"optional":[]},"capabilities":{"required":["data.meta","data.introspection"],"optional":["data.search","data.i18n","data.realtime"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","search","i18n","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"auth","title":"Authentication","description":"Consumer sign-in, account profile, password, and session-management surfaces.","dependencies":[],"endpoints":{"required":["auth"],"optional":[]},"capabilities":{"required":["auth.sessions","auth.credentials","auth.password"],"optional":["auth.email","auth.connected-accounts","auth.identity-providers","auth.passkeys","auth.phone","auth.devices"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"users","title":"App access","description":"Application member governance, lifecycle controls, profiles, permission grants, and invitations.","dependencies":[],"endpoints":{"required":["admin"],"optional":["auth"]},"capabilities":{"required":["users.directory","users.memberships"],"optional":["users.permissions","users.profiles","users.invites"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"organizations","title":"Organizations","description":"Tenant membership governance, invitations, access policy, hierarchy, settings, and developer credentials.","dependencies":[],"endpoints":{"required":[],"optional":["admin","auth","billing","data"]},"capabilities":{"required":["organizations.memberships"],"optional":["organizations.permissions","organizations.limits","organizations.profiles","organizations.hierarchy","organizations.invites"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"storage","title":"Storage","description":"Policy-aware bucket navigation, uploads, downloads, and object deletion.","dependencies":[],"endpoints":{"required":[],"optional":["storage","admin","data"]},"capabilities":{"required":["storage.buckets","storage.files"],"optional":["storage.versioning","storage.content-hash","storage.custom-keys","storage.audit-log"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","storage"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"billing","title":"Billing","description":"Plans, subscriptions, entitlement meters, usage, credits, and account activity.","dependencies":[],"endpoints":{"required":[],"optional":["billing","admin","data"]},"capabilities":{"required":["billing.plans","billing.subscriptions"],"optional":["billing.meters"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"notifications","title":"Notifications","description":"User notification inbox and read-state actions with optional settings and realtime capabilities.","dependencies":[],"endpoints":{"required":[],"optional":["notifications","auth","data"]},"capabilities":{"required":["notifications.inbox"],"optional":["notifications.settings","notifications.realtime"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[{"schemaVersion":1,"id":"full","presetSlug":"full","title":"Full","description":"Every first-release Constructive feature pack.","stability":"stable","featurePacks":["data","auth","users","organizations","storage","billing","notifications"]}],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-kit-nextjs` installed the full Next.js tenant console. Render `ConstructiveConsoleKit` with a secret-free database ID and explicit semantic endpoint map; use presets or selected Console modules for smaller compositions.\n\nDegraded states: every endpoint and module fails closed independently, diagnostics are development-only, credentials never enter Zustand, and PostgreSQL privileges and RLS remain authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/data.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/auth.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/users.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/organizations.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/storage.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/billing.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/notifications.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-auth.json b/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-auth.json index 10dba11..c212996 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-auth.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-auth.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-module-auth","surface":"console-module","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/console-module-auth","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-auth","title":"Authentication Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","card","checkbox","cn","field","input","input-group","separator","tabs","constructive-theme"]},{"name":"console-module-auth","title":"Authentication Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-auth","console-feature-catalog","console-runtime","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","checkbox","tabs"]},{"name":"@constructive-io/data","requiredBy":["console-kit-core"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","input-group","feature-pack-auth"]},{"name":"motion","requiredBy":["motion-config","sheet"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/auth-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/console-kit/constructive/auth-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-account-view.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-account-view.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-challenge-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-challenge-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-console-module.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-contracts.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-entry-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-entry-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-password-policy.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-password-policy.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/auth.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"auth","title":"Authentication","description":"Consumer sign-in, account profile, password, and session-management surfaces.","dependencies":[],"endpoints":{"required":["auth"],"optional":[]},"capabilities":{"required":["auth.sessions","auth.credentials","auth.password"],"optional":["auth.email","auth.connected-accounts","auth.identity-providers","auth.passkeys","auth.phone","auth.devices"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-module-auth` installed Console Kit core, the provider-neutral auth view, and its Constructive integration. Import from `@/blocks/feature-packs/auth/auth-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: Auth requires complete public session, credential, and password flows; pass csrfTokenProvider when required, and keep callback credentials outside Zustand.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/auth/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/auth.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-module-auth","surface":"console-module","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/console-module-auth","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-auth","title":"Authentication Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","card","checkbox","cn","field","input","input-group","separator","tabs","constructive-theme"]},{"name":"console-module-auth","title":"Authentication Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-auth","console-feature-catalog","console-runtime","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","checkbox","tabs"]},{"name":"@constructive-io/data@^0.5.0","requiredBy":["console-kit-core"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","input-group","feature-pack-auth"]},{"name":"motion","requiredBy":["motion-config","sheet"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/auth-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/console-kit/constructive/auth-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-account-view.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-account-view.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-challenge-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-challenge-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-console-module.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-contracts.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-entry-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-entry-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-password-policy.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-password-policy.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/auth.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"auth","title":"Authentication","description":"Consumer sign-in, account profile, password, and session-management surfaces.","dependencies":[],"endpoints":{"required":["auth"],"optional":[]},"capabilities":{"required":["auth.sessions","auth.credentials","auth.password"],"optional":["auth.email","auth.connected-accounts","auth.identity-providers","auth.passkeys","auth.phone","auth.devices"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-module-auth` installed Console Kit core, the provider-neutral auth view, and its Constructive integration. Import from `@/blocks/feature-packs/auth/auth-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: Auth requires complete public session, credential, and password flows; pass csrfTokenProvider when required, and keep callback credentials outside Zustand.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/auth/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/auth.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-billing.json b/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-billing.json index dbd36df..44a00f6 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-billing.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-billing.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-module-billing","surface":"console-module","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/console-module-billing","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"billing-contracts","title":"Billing Contracts","type":"registry:lib","directRegistryDependencies":[]},{"name":"billing-ui","title":"Billing UI Helpers","type":"registry:lib","directRegistryDependencies":["badge","billing-contracts","cn"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"pagination","title":"Pagination","type":"registry:ui","directRegistryDependencies":["cn","button","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-activity-table","title":"Billing Activity Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","sheet","skeleton","table","constructive-theme"]},{"name":"progress","title":"Progress","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-credits-card","title":"Billing Credits Card","type":"registry:block","directRegistryDependencies":["alert","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"billing-entitlements-list","title":"Billing Entitlements List","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","tooltip","constructive-theme"]},{"name":"billing-pricing-table","title":"Billing Pricing Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","select","separator","skeleton","constructive-theme"]},{"name":"billing-subscription-card","title":"Billing Subscription Card","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","constructive-theme"]},{"name":"billing-usage-history","title":"Billing Usage History","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","skeleton","table","constructive-theme"]},{"name":"billing-usage-overview","title":"Billing Usage Overview","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-settings-page","title":"Billing Settings Page","type":"registry:block","directRegistryDependencies":["alert","badge","billing-activity-table","billing-contracts","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","cn","separator","tabs","tooltip","constructive-theme"]},{"name":"feature-pack-billing","title":"Billing Feature Pack","type":"registry:block","directRegistryDependencies":["billing-settings-page","constructive-theme"]},{"name":"console-module-billing","title":"Billing Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-billing","billing-contracts","console-feature-catalog","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","select","progress","tabs"]},{"name":"@constructive-io/data","requiredBy":["console-kit-core"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","pagination","select","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","billing-settings-page"]},{"name":"motion","requiredBy":["motion-config","sheet","billing-credits-card","billing-usage-overview"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/pagination.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["pagination"],"sources":[{"registryItem":"pagination","path":"registry/constructive/ui/pagination.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/progress.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["progress"],"sources":[{"registryItem":"progress","path":"registry/constructive/ui/progress.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/billing-activity-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/billing-activity-table.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/messages.ts"}]},{"target":"src/blocks/billing/billing-contracts/billing-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["billing-contracts"],"sources":[{"registryItem":"billing-contracts","path":"registry/constructive/blocks/billing/billing-contracts/billing-contracts.ts"}]},{"target":"src/blocks/billing/billing-credits-card/billing-credits-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/billing-credits-card.tsx"}]},{"target":"src/blocks/billing/billing-credits-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/messages.ts"}]},{"target":"src/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx"}]},{"target":"src/blocks/billing/billing-entitlements-list/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/messages.ts"}]},{"target":"src/blocks/billing/billing-pricing-table/billing-pricing-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/billing-pricing-table.tsx"}]},{"target":"src/blocks/billing/billing-pricing-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/messages.ts"}]},{"target":"src/blocks/billing/billing-settings-page/billing-settings-page.tsx","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/billing-settings-page.tsx"}]},{"target":"src/blocks/billing/billing-settings-page/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/messages.ts"}]},{"target":"src/blocks/billing/billing-subscription-card/billing-subscription-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/billing-subscription-card.tsx"}]},{"target":"src/blocks/billing/billing-subscription-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/messages.ts"}]},{"target":"src/blocks/billing/billing-ui/billing-ui.tsx","targetKind":"literal","type":"registry:lib","owners":["billing-ui"],"sources":[{"registryItem":"billing-ui","path":"registry/constructive/blocks/billing/billing-ui/billing-ui.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/billing-usage-history.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/billing-usage-history.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/messages.ts"}]},{"target":"src/blocks/billing/billing-usage-overview/billing-usage-overview.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/billing-usage-overview.tsx"}]},{"target":"src/blocks/billing/billing-usage-overview/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/messages.ts"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/billing-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-billing"],"sources":[{"registryItem":"console-module-billing","path":"registry/constructive/blocks/console-kit/constructive/billing-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/billing/billing-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-billing"],"sources":[{"registryItem":"console-module-billing","path":"registry/constructive/blocks/feature-packs/billing/billing-console-module.tsx"}]},{"target":"src/blocks/feature-packs/billing/billing-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/billing-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/billing.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"billing","title":"Billing","description":"Plans, subscriptions, entitlement meters, usage, credits, and account activity.","dependencies":[],"endpoints":{"required":[],"optional":["billing","admin","data"]},"capabilities":{"required":["billing.plans","billing.subscriptions"],"optional":["billing.meters"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-module-billing` installed Console Kit core, the provider-neutral billing view, and its Constructive integration. Import from `@/blocks/feature-packs/billing/billing-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: Missing plans or subscriptions keeps Billing unavailable, missing optional meters produces a partial view, and provider writes require an explicit adapter action.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/billing/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/billing.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-module-billing","surface":"console-module","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/console-module-billing","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"billing-contracts","title":"Billing Contracts","type":"registry:lib","directRegistryDependencies":[]},{"name":"billing-ui","title":"Billing UI Helpers","type":"registry:lib","directRegistryDependencies":["badge","billing-contracts","cn"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"pagination","title":"Pagination","type":"registry:ui","directRegistryDependencies":["cn","button","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-activity-table","title":"Billing Activity Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","sheet","skeleton","table","constructive-theme"]},{"name":"progress","title":"Progress","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-credits-card","title":"Billing Credits Card","type":"registry:block","directRegistryDependencies":["alert","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"billing-entitlements-list","title":"Billing Entitlements List","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","tooltip","constructive-theme"]},{"name":"billing-pricing-table","title":"Billing Pricing Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","select","separator","skeleton","constructive-theme"]},{"name":"billing-subscription-card","title":"Billing Subscription Card","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","constructive-theme"]},{"name":"billing-usage-history","title":"Billing Usage History","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","skeleton","table","constructive-theme"]},{"name":"billing-usage-overview","title":"Billing Usage Overview","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-settings-page","title":"Billing Settings Page","type":"registry:block","directRegistryDependencies":["alert","badge","billing-activity-table","billing-contracts","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","cn","separator","tabs","tooltip","constructive-theme"]},{"name":"feature-pack-billing","title":"Billing Feature Pack","type":"registry:block","directRegistryDependencies":["billing-settings-page","constructive-theme"]},{"name":"console-module-billing","title":"Billing Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-billing","billing-contracts","console-feature-catalog","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","select","progress","tabs"]},{"name":"@constructive-io/data@^0.5.0","requiredBy":["console-kit-core"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","pagination","select","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","billing-settings-page"]},{"name":"motion","requiredBy":["motion-config","sheet","billing-credits-card","billing-usage-overview"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/pagination.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["pagination"],"sources":[{"registryItem":"pagination","path":"registry/constructive/ui/pagination.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/progress.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["progress"],"sources":[{"registryItem":"progress","path":"registry/constructive/ui/progress.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/billing-activity-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/billing-activity-table.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/messages.ts"}]},{"target":"src/blocks/billing/billing-contracts/billing-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["billing-contracts"],"sources":[{"registryItem":"billing-contracts","path":"registry/constructive/blocks/billing/billing-contracts/billing-contracts.ts"}]},{"target":"src/blocks/billing/billing-credits-card/billing-credits-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/billing-credits-card.tsx"}]},{"target":"src/blocks/billing/billing-credits-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/messages.ts"}]},{"target":"src/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx"}]},{"target":"src/blocks/billing/billing-entitlements-list/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/messages.ts"}]},{"target":"src/blocks/billing/billing-pricing-table/billing-pricing-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/billing-pricing-table.tsx"}]},{"target":"src/blocks/billing/billing-pricing-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/messages.ts"}]},{"target":"src/blocks/billing/billing-settings-page/billing-settings-page.tsx","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/billing-settings-page.tsx"}]},{"target":"src/blocks/billing/billing-settings-page/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/messages.ts"}]},{"target":"src/blocks/billing/billing-subscription-card/billing-subscription-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/billing-subscription-card.tsx"}]},{"target":"src/blocks/billing/billing-subscription-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/messages.ts"}]},{"target":"src/blocks/billing/billing-ui/billing-ui.tsx","targetKind":"literal","type":"registry:lib","owners":["billing-ui"],"sources":[{"registryItem":"billing-ui","path":"registry/constructive/blocks/billing/billing-ui/billing-ui.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/billing-usage-history.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/billing-usage-history.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/messages.ts"}]},{"target":"src/blocks/billing/billing-usage-overview/billing-usage-overview.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/billing-usage-overview.tsx"}]},{"target":"src/blocks/billing/billing-usage-overview/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/messages.ts"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/billing-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-billing"],"sources":[{"registryItem":"console-module-billing","path":"registry/constructive/blocks/console-kit/constructive/billing-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/billing/billing-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-billing"],"sources":[{"registryItem":"console-module-billing","path":"registry/constructive/blocks/feature-packs/billing/billing-console-module.tsx"}]},{"target":"src/blocks/feature-packs/billing/billing-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/billing-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/billing.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"billing","title":"Billing","description":"Plans, subscriptions, entitlement meters, usage, credits, and account activity.","dependencies":[],"endpoints":{"required":[],"optional":["billing","admin","data"]},"capabilities":{"required":["billing.plans","billing.subscriptions"],"optional":["billing.meters"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-module-billing` installed Console Kit core, the provider-neutral billing view, and its Constructive integration. Import from `@/blocks/feature-packs/billing/billing-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: Missing plans or subscriptions keeps Billing unavailable, missing optional meters produces a partial view, and provider writes require an explicit adapter action.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/billing/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/billing.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-data.json b/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-data.json index ae0ef52..54a33a3 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-data.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-data.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-module-data","surface":"console-module","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/console-module-data","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"feature-pack-data","title":"Data Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","button","card","constructive-theme"]},{"name":"console-module-data","title":"Data Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-data","console-feature-catalog","console-runtime","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover"]},{"name":"@constructive-io/data","requiredBy":["console-kit-core","feature-pack-data"]},{"name":"@constructive-io/sheets","requiredBy":["feature-pack-data"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","feature-pack-data"]},{"name":"motion","requiredBy":["motion-config","sheet"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/data/data-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-data"],"sources":[{"registryItem":"console-module-data","path":"registry/constructive/blocks/feature-packs/data/data-console-module.tsx"}]},{"target":"src/blocks/feature-packs/data/data-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/data-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/data.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"data","title":"Data","description":"Dynamic table exploration and CRUD surfaces driven by Constructive metadata and GraphQL introspection.","dependencies":[],"endpoints":{"required":["data"],"optional":[]},"capabilities":{"required":["data.meta","data.introspection"],"optional":["data.search","data.i18n","data.realtime"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","search","i18n","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-module-data` installed Console Kit core, the provider-neutral data view, and its Constructive integration. Import from `@/blocks/feature-packs/data/data-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: A missing or incompatible data endpoint, current _meta contract, introspection result, or application table scope keeps Data unavailable; RLS remains authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/data/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/data.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-module-data","surface":"console-module","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/console-module-data","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"calendar-rac","title":"Calendar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"form-control","title":"Form Control","type":"registry:ui","directRegistryDependencies":["cn","slot","label","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"pagination","title":"Pagination","type":"registry:ui","directRegistryDependencies":["cn","button","constructive-theme"]},{"name":"progressive-blur","title":"Progressive Blur","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"toast","title":"Toast Notifications","type":"registry:block","directRegistryDependencies":["button","dialog","constructive-theme"]},{"name":"sheets","title":"Sheets","type":"registry:block","directRegistryDependencies":["alert-dialog","badge","button","calendar-rac","card","checkbox","collapsible","dropdown-menu","form-control","input","input-group","label","pagination","popover","progressive-blur","scroll-area","select","skeleton","tabs","textarea","toast","tooltip","constructive-theme"]},{"name":"feature-pack-data","title":"Data Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","sheets","alert","button","card","constructive-theme"]},{"name":"console-module-data","title":"Data Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-data","console-feature-catalog","console-runtime","sheets","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","checkbox","scroll-area","select","tabs","dialog"]},{"name":"@constructive-io/data@^0.5.0","requiredBy":["console-kit-core","sheets","feature-pack-data"]},{"name":"@internationalized/date","requiredBy":["calendar-rac","sheets"]},{"name":"@remixicon/react","requiredBy":["sheets"]},{"name":"@tanstack/react-form","requiredBy":["sheets"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core","sheets"]},{"name":"@tanstack/react-table@9.0.0-beta.58","requiredBy":["sheets"]},{"name":"@tanstack/react-virtual","requiredBy":["sheets"]},{"name":"@types/leaflet","requiredBy":["sheets"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn","sheets"]},{"name":"graphql","requiredBy":["console-kit-core","sheets"]},{"name":"inflekt","requiredBy":["sheets"]},{"name":"leaflet","requiredBy":["sheets"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","input-group","pagination","select","dialog","toast","sheets","feature-pack-data"]},{"name":"motion","requiredBy":["motion-config","sheet","sheets"]},{"name":"react-aria-components","requiredBy":["calendar-rac","sheets"]},{"name":"react-leaflet","requiredBy":["sheets"]},{"name":"sonner","requiredBy":["toast"]},{"name":"tailwind-merge","requiredBy":["cn","sheets"]},{"name":"zod","requiredBy":["console-feature-catalog","sheets"]},{"name":"zustand","requiredBy":["console-kit-core","sheets"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/calendar-rac.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["calendar-rac"],"sources":[{"registryItem":"calendar-rac","path":"registry/constructive/ui/calendar-rac.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/form-control.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["form-control"],"sources":[{"registryItem":"form-control","path":"registry/constructive/ui/form-control.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/pagination.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["pagination"],"sources":[{"registryItem":"pagination","path":"registry/constructive/ui/pagination.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/progressive-blur.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["progressive-blur"],"sources":[{"registryItem":"progressive-blur","path":"registry/constructive/ui/progressive-blur.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sheets/adapter/postgraphile-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/postgraphile-adapter.ts"}]},{"target":"@ui/sheets/adapter/sheets-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/sheets-adapter.ts"}]},{"target":"@ui/sheets/adapter/use-sheets-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/use-sheets-adapter.ts"}]},{"target":"@ui/sheets/advanced.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/advanced.ts"}]},{"target":"@ui/sheets/auth/auth-execute.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-execute.ts"}]},{"target":"@ui/sheets/auth/auth-gate.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-gate.tsx"}]},{"target":"@ui/sheets/auth/auth-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-types.ts"}]},{"target":"@ui/sheets/auth/hooks/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/index.ts"}]},{"target":"@ui/sheets/auth/hooks/use-forgot-password.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-forgot-password.ts"}]},{"target":"@ui/sheets/auth/hooks/use-login.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-login.ts"}]},{"target":"@ui/sheets/auth/hooks/use-register.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-register.ts"}]},{"target":"@ui/sheets/auth/hooks/use-reset-password.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-reset-password.ts"}]},{"target":"@ui/sheets/auth/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/index.ts"}]},{"target":"@ui/sheets/auth/ui/auth-error-alert.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-error-alert.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-loading-button.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-loading-button.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-screen-header.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-screen-header.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-screen-layout.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-screen-layout.tsx"}]},{"target":"@ui/sheets/auth/ui/forgot-password-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/forgot-password-form.tsx"}]},{"target":"@ui/sheets/auth/ui/form-field.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/form-field.tsx"}]},{"target":"@ui/sheets/auth/ui/login-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/login-form.tsx"}]},{"target":"@ui/sheets/auth/ui/password-strength.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/password-strength.tsx"}]},{"target":"@ui/sheets/auth/ui/register-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/register-form.tsx"}]},{"target":"@ui/sheets/auth/ui/reset-password-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/reset-password-form.tsx"}]},{"target":"@ui/sheets/auth/utils/auth-errors.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/auth-errors.ts"}]},{"target":"@ui/sheets/auth/utils/schemas.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/schemas.ts"}]},{"target":"@ui/sheets/auth/utils/token-store.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/token-store.ts"}]},{"target":"@ui/sheets/auth/utils/validators.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/validators.ts"}]},{"target":"@ui/sheets/cell-model/badge-tones.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/badge-tones.ts"}]},{"target":"@ui/sheets/cell-model/cell-props.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/cell-props.ts"}]},{"target":"@ui/sheets/cell-model/cell-slots.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/cell-slots.ts"}]},{"target":"@ui/sheets/cell-model/create-sheets-cell.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/create-sheets-cell.ts"}]},{"target":"@ui/sheets/cell-model/factories/badges.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/badges.ts"}]},{"target":"@ui/sheets/cell-model/factories/boolean.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/boolean.ts"}]},{"target":"@ui/sheets/cell-model/factories/datetime.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/datetime.ts"}]},{"target":"@ui/sheets/cell-model/factories/geometry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/geometry.ts"}]},{"target":"@ui/sheets/cell-model/factories/image.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/image.ts"}]},{"target":"@ui/sheets/cell-model/factories/interval.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/interval.ts"}]},{"target":"@ui/sheets/cell-model/factories/number.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/number.ts"}]},{"target":"@ui/sheets/cell-model/factories/relation.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/relation.ts"}]},{"target":"@ui/sheets/cell-model/factories/text.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/text.ts"}]},{"target":"@ui/sheets/cell-model/factories/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/types.ts"}]},{"target":"@ui/sheets/cell-model/factories/uri.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/uri.ts"}]},{"target":"@ui/sheets/cell-model/image-cache.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/image-cache.ts"}]},{"target":"@ui/sheets/cell-model/sheets-cell.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/sheets-cell.ts"}]},{"target":"@ui/sheets/cell-model/views/badges-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/badges-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/boolean-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/boolean-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/datetime-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/datetime-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/draft-action-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/draft-action-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/geometry-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/geometry-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/image-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/image-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/interval-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/interval-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/loading-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/loading-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/number-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/number-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/relation-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/relation-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/text-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/text-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/uri-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/uri-view.tsx"}]},{"target":"@ui/sheets/cell-types/cell-registry-defaults.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-registry-defaults.ts"}]},{"target":"@ui/sheets/cell-types/cell-registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-registry.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-groups.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-groups.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-registry.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-resolver.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-resolver.ts"}]},{"target":"@ui/sheets/cell-types/define-cell-type.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/define-cell-type.ts"}]},{"target":"@ui/sheets/cell-types/type-mapping.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/type-mapping.ts"}]},{"target":"@ui/sheets/cell-types/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/types.ts"}]},{"target":"@ui/sheets/commands/context.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/context.ts"}]},{"target":"@ui/sheets/commands/dispatch.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/dispatch.ts"}]},{"target":"@ui/sheets/commands/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/index.ts"}]},{"target":"@ui/sheets/commands/keybinding.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/keybinding.ts"}]},{"target":"@ui/sheets/commands/keymap.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/keymap.ts"}]},{"target":"@ui/sheets/commands/registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/registry.ts"}]},{"target":"@ui/sheets/commands/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/types.ts"}]},{"target":"@ui/sheets/config/sheets-concurrency.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/config/sheets-concurrency.ts"}]},{"target":"@ui/sheets/context/sheets-context.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-context.ts"}]},{"target":"@ui/sheets/context/sheets-execute.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-execute.ts"}]},{"target":"@ui/sheets/context/sheets-provider.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-provider.tsx"}]},{"target":"@ui/sheets/context/sheets-upload-presigned.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-upload-presigned.ts"}]},{"target":"@ui/sheets/forms/form-spec-builder.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/form-spec-builder.ts"}]},{"target":"@ui/sheets/forms/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/index.ts"}]},{"target":"@ui/sheets/forms/metadata-hash.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/metadata-hash.ts"}]},{"target":"@ui/sheets/forms/mutations.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/mutations.ts"}]},{"target":"@ui/sheets/forms/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/types.ts"}]},{"target":"@ui/sheets/forms/zod-schema.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/zod-schema.ts"}]},{"target":"@ui/sheets/grid-dom/editors/array-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/array-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/date-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/date-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/edit-intent.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/edit-intent.ts"}]},{"target":"@ui/sheets/grid-dom/editors/editor-props.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/editor-props.ts"}]},{"target":"@ui/sheets/grid-dom/editors/editor-registry-dom.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/editor-registry-dom.ts"}]},{"target":"@ui/sheets/grid-dom/editors/geometry-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/geometry-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/image-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/image-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/inet-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/inet-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/interval-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/interval-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/json-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/json-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/number-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/number-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/relation-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/relation-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/text-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/text-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/tsvector-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/tsvector-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/upload-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/upload-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/url-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/url-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/inline-cell-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/inline-cell-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/overlay/overlay-manager.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/overlay/overlay-manager.tsx"}]},{"target":"@ui/sheets/grid-dom/overlay/use-overlay-controller.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/overlay/use-overlay-controller.ts"}]},{"target":"@ui/sheets/grid-dom/sheets-cell-host.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/sheets-cell-host.tsx"}]},{"target":"@ui/sheets/grid-dom/use-sheets-content.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/use-sheets-content.ts"}]},{"target":"@ui/sheets/grid/cell-routing.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/cell-routing.ts"}]},{"target":"@ui/sheets/grid/draft-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/draft-types.ts"}]},{"target":"@ui/sheets/grid/editors/array-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/array-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/date-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/date-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/editor-focus-trap.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/editor-focus-trap.tsx"}]},{"target":"@ui/sheets/grid/editors/geometry-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/geometry-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/image-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/image-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/inet-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/inet-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/interval-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/interval-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/json-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/json-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/overlay-presets.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/overlay-presets.ts"}]},{"target":"@ui/sheets/grid/editors/overlay-viewport-guard.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/overlay-viewport-guard.tsx"}]},{"target":"@ui/sheets/grid/editors/relation-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/relation-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/relation-record-tooltip.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/relation-record-tooltip.tsx"}]},{"target":"@ui/sheets/grid/editors/tsvector-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/tsvector-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/upload-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/upload-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/url-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/url-editor.tsx"}]},{"target":"@ui/sheets/grid/feedback/dock-status-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/dock-status-bar.tsx"}]},{"target":"@ui/sheets/grid/feedback/editor-error-boundary.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/editor-error-boundary.tsx"}]},{"target":"@ui/sheets/grid/feedback/feedback-context.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/feedback-context.tsx"}]},{"target":"@ui/sheets/grid/feedback/feedback-reducer.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/feedback-reducer.ts"}]},{"target":"@ui/sheets/grid/feedback/floating-status.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/floating-status.tsx"}]},{"target":"@ui/sheets/grid/feedback/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/index.ts"}]},{"target":"@ui/sheets/grid/feedback/sheets-error-boundary.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/sheets-error-boundary.tsx"}]},{"target":"@ui/sheets/grid/feedback/sheets-error-state.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/sheets-error-state.tsx"}]},{"target":"@ui/sheets/grid/filter-operators.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/filter-operators.ts"}]},{"target":"@ui/sheets/grid/grid-cell-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/grid-cell-types.ts"}]},{"target":"@ui/sheets/grid/hooks/use-batch-commit.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-batch-commit.ts"}]},{"target":"@ui/sheets/grid/hooks/use-cell-editing.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-cell-editing.ts"}]},{"target":"@ui/sheets/grid/hooks/use-draft-rows.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-draft-rows.ts"}]},{"target":"@ui/sheets/grid/hooks/use-draft-submission.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-draft-submission.ts"}]},{"target":"@ui/sheets/grid/hooks/use-filter-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-filter-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-operations.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-operations.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-selection.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-selection.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-state.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-state.ts"}]},{"target":"@ui/sheets/grid/hooks/use-infinite-grid-data.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-infinite-grid-data.ts"}]},{"target":"@ui/sheets/grid/hooks/use-load-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-load-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-paginate-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-paginate-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-undo-redo.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-undo-redo.ts"}]},{"target":"@ui/sheets/grid/row-model.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/row-model.ts"}]},{"target":"@ui/sheets/grid/sheets.constants.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.constants.ts"}]},{"target":"@ui/sheets/grid/sheets.context-menu.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.context-menu.tsx"}]},{"target":"@ui/sheets/grid/sheets.controls.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.controls.tsx"}]},{"target":"@ui/sheets/grid/sheets.formatters.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.formatters.ts"}]},{"target":"@ui/sheets/grid/sheets.pagination.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.pagination.tsx"}]},{"target":"@ui/sheets/grid/sheets.table-selector.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.table-selector.tsx"}]},{"target":"@ui/sheets/grid/sheets.theme.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.theme.ts"}]},{"target":"@ui/sheets/grid/sheets.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.tsx"}]},{"target":"@ui/sheets/grid/sheets.types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.types.ts"}]},{"target":"@ui/sheets/grid/sheets.utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.utils.ts"}]},{"target":"@ui/sheets/grid/use-sheets.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/use-sheets.ts"}]},{"target":"@ui/sheets/hooks/orderby-enum-resolution.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/orderby-enum-resolution.ts"}]},{"target":"@ui/sheets/hooks/query-keys.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/query-keys.ts"}]},{"target":"@ui/sheets/hooks/relation-field-resolution.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/relation-field-resolution.ts"}]},{"target":"@ui/sheets/hooks/use-relation-columns.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-relation-columns.ts"}]},{"target":"@ui/sheets/hooks/use-relation-metadata-cache.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-relation-metadata-cache.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-infinite-table.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-infinite-table.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-meta.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-meta.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-table-cursor.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-table-cursor.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-table.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-table.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-upload.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-upload.ts"}]},{"target":"@ui/sheets/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/index.ts"}]},{"target":"@ui/sheets/row-identity.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/row-identity.ts"}]},{"target":"@ui/sheets/selection/cell-extract.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/cell-extract.ts"}]},{"target":"@ui/sheets/selection/fill.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/fill.ts"}]},{"target":"@ui/sheets/selection/range-set.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/range-set.ts"}]},{"target":"@ui/sheets/selection/selection-model.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/selection-model.ts"}]},{"target":"@ui/sheets/selection/tsv.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/tsv.ts"}]},{"target":"@ui/sheets/store/draft-rows-slice.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/draft-rows-slice.ts"}]},{"target":"@ui/sheets/store/relation-info-slice.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/relation-info-slice.ts"}]},{"target":"@ui/sheets/store/sheets-store.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/sheets-store.ts"}]},{"target":"@ui/sheets/table/features.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/features.ts"}]},{"target":"@ui/sheets/table/grid-viewport.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/grid-viewport.tsx"}]},{"target":"@ui/sheets/table/use-sheets-table-instance.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/use-sheets-table-instance.ts"}]},{"target":"@ui/sheets/utils/cn.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/cn.ts"}]},{"target":"@ui/sheets/utils/file.utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/file.utils.ts"}]},{"target":"@ui/sheets/utils/image-with-fallback.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/image-with-fallback.tsx"}]},{"target":"@ui/sheets/utils/map-picker.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/map-picker.tsx"}]},{"target":"@ui/sheets/utils/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/motion-config.ts"}]},{"target":"@ui/sheets/utils/relation-utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/relation-utils.ts"}]},{"target":"@ui/sheets/utils/sheets-i18n.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/sheets-i18n.ts"}]},{"target":"@ui/sheets/utils/sheets-logger.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/sheets-logger.ts"}]},{"target":"@ui/sheets/utils/use-color-scheme.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-color-scheme.ts"}]},{"target":"@ui/sheets/utils/use-image-status.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-image-status.ts"}]},{"target":"@ui/sheets/utils/use-resize-observer.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-resize-observer.ts"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/toast/index.ts","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/index.ts"}]},{"target":"@ui/toast/toast-error.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-error.tsx"}]},{"target":"@ui/toast/toast-info.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-info.tsx"}]},{"target":"@ui/toast/toast-success.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-success.tsx"}]},{"target":"@ui/toast/toast-warning.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-warning.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/data/data-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-data"],"sources":[{"registryItem":"console-module-data","path":"registry/constructive/blocks/feature-packs/data/data-console-module.tsx"}]},{"target":"src/blocks/feature-packs/data/data-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/data-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/data.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"data","title":"Data","description":"Dynamic table exploration and CRUD surfaces driven by Constructive metadata and GraphQL introspection.","dependencies":[],"endpoints":{"required":["data"],"optional":[]},"capabilities":{"required":["data.meta","data.introspection"],"optional":["data.search","data.i18n","data.realtime"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","search","i18n","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-module-data` installed Console Kit core, the provider-neutral data view, and its Constructive integration. Import from `@/blocks/feature-packs/data/data-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: A missing or incompatible data endpoint, current _meta contract, introspection result, or application table scope keeps Data unavailable; RLS remains authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/data/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/data.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-notifications.json b/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-notifications.json index d107d29..df883bb 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-notifications.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-notifications.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-module-notifications","surface":"console-module","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/console-module-notifications","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"feature-pack-notifications","title":"Notifications Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","separator","constructive-theme"]},{"name":"console-module-notifications","title":"Notifications Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-notifications","console-feature-catalog","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog"]},{"name":"@constructive-io/data","requiredBy":["console-kit-core"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","feature-pack-notifications"]},{"name":"motion","requiredBy":["motion-config","sheet"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/notifications-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-notifications"],"sources":[{"registryItem":"console-module-notifications","path":"registry/constructive/blocks/console-kit/constructive/notifications-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/notifications/notifications-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-notifications"],"sources":[{"registryItem":"console-module-notifications","path":"registry/constructive/blocks/feature-packs/notifications/notifications-console-module.tsx"}]},{"target":"src/blocks/feature-packs/notifications/notifications-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/notifications-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/notifications.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"notifications","title":"Notifications","description":"User notification inbox and read-state actions with optional settings and realtime capabilities.","dependencies":[],"endpoints":{"required":[],"optional":["notifications","auth","data"]},"capabilities":{"required":["notifications.inbox"],"optional":["notifications.settings","notifications.realtime"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-module-notifications` installed Console Kit core, the provider-neutral notifications view, and its Constructive integration. Import from `@/blocks/feature-packs/notifications/notifications-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: A backend module record without a reachable public inbox is not capability evidence, and realtime remains unavailable until the complete flow is proven.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/notifications/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/notifications.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-module-notifications","surface":"console-module","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/console-module-notifications","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"feature-pack-notifications","title":"Notifications Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","separator","constructive-theme"]},{"name":"console-module-notifications","title":"Notifications Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-notifications","console-feature-catalog","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog"]},{"name":"@constructive-io/data@^0.5.0","requiredBy":["console-kit-core"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","feature-pack-notifications"]},{"name":"motion","requiredBy":["motion-config","sheet"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/notifications-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-notifications"],"sources":[{"registryItem":"console-module-notifications","path":"registry/constructive/blocks/console-kit/constructive/notifications-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/notifications/notifications-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-notifications"],"sources":[{"registryItem":"console-module-notifications","path":"registry/constructive/blocks/feature-packs/notifications/notifications-console-module.tsx"}]},{"target":"src/blocks/feature-packs/notifications/notifications-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/notifications-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/notifications.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"notifications","title":"Notifications","description":"User notification inbox and read-state actions with optional settings and realtime capabilities.","dependencies":[],"endpoints":{"required":[],"optional":["notifications","auth","data"]},"capabilities":{"required":["notifications.inbox"],"optional":["notifications.settings","notifications.realtime"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-module-notifications` installed Console Kit core, the provider-neutral notifications view, and its Constructive integration. Import from `@/blocks/feature-packs/notifications/notifications-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: A backend module record without a reachable public inbox is not capability evidence, and realtime remains unavailable until the complete flow is proven.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/notifications/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/notifications.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-organizations.json b/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-organizations.json index f2d1509..5b9a292 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-organizations.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-organizations.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-module-organizations","surface":"console-module","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/console-module-organizations","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"switch","title":"Switch","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-organizations","title":"Organizations Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert-dialog","avatar","badge","button","card","checkbox","cn","dialog","dropdown-menu","empty","field","input","select","switch","table","tabs","textarea","constructive-theme"]},{"name":"console-module-organizations","title":"Organizations Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-organizations","console-feature-catalog","console-runtime","pack-foundation","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","checkbox","scroll-area","dialog","select","switch","tabs"]},{"name":"@constructive-io/data","requiredBy":["console-kit-core"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","dialog","select","feature-pack-organizations"]},{"name":"motion","requiredBy":["motion-config","sheet"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/switch.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["switch"],"sources":[{"registryItem":"switch","path":"registry/constructive/ui/switch.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/organizations-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/console-kit/constructive/organizations-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-access-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-access-panels.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-console-module.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-contracts.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-meta-contract.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-operation-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-operation-panels.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/organizations.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"organizations","title":"Organizations","description":"Tenant membership governance, invitations, access policy, hierarchy, settings, and developer credentials.","dependencies":[],"endpoints":{"required":[],"optional":["admin","auth","billing","data"]},"capabilities":{"required":["organizations.memberships"],"optional":["organizations.permissions","organizations.limits","organizations.profiles","organizations.hierarchy","organizations.invites"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-module-organizations` installed Console Kit core, the provider-neutral organizations view, and its Constructive integration. Import from `@/blocks/feature-packs/organizations/organizations-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: Incomplete metadata or ambiguous organization and principal scope fails closed; every mutation remains policy and RLS constrained.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/organizations/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/organizations.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-module-organizations","surface":"console-module","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/console-module-organizations","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"switch","title":"Switch","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-organizations","title":"Organizations Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert-dialog","avatar","badge","button","card","checkbox","cn","dialog","dropdown-menu","empty","field","input","select","switch","table","tabs","textarea","constructive-theme"]},{"name":"console-module-organizations","title":"Organizations Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-organizations","console-feature-catalog","console-runtime","pack-foundation","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","checkbox","scroll-area","dialog","select","switch","tabs"]},{"name":"@constructive-io/data@^0.5.0","requiredBy":["console-kit-core"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","dialog","select","feature-pack-organizations"]},{"name":"motion","requiredBy":["motion-config","sheet"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/switch.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["switch"],"sources":[{"registryItem":"switch","path":"registry/constructive/ui/switch.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/organizations-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/console-kit/constructive/organizations-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-access-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-access-panels.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-console-module.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-contracts.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-meta-contract.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-operation-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-operation-panels.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/organizations.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"organizations","title":"Organizations","description":"Tenant membership governance, invitations, access policy, hierarchy, settings, and developer credentials.","dependencies":[],"endpoints":{"required":[],"optional":["admin","auth","billing","data"]},"capabilities":{"required":["organizations.memberships"],"optional":["organizations.permissions","organizations.limits","organizations.profiles","organizations.hierarchy","organizations.invites"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-module-organizations` installed Console Kit core, the provider-neutral organizations view, and its Constructive integration. Import from `@/blocks/feature-packs/organizations/organizations-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: Incomplete metadata or ambiguous organization and principal scope fails closed; every mutation remains policy and RLS constrained.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/organizations/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/organizations.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-storage.json b/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-storage.json index 4941b2b..2adf958 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-storage.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-storage.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-module-storage","surface":"console-module","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/console-module-storage","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"radio-group","title":"Radio Group","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-storage","title":"Storage Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","cn","dialog","dropdown-menu","field","input","radio-group","table","constructive-theme"]},{"name":"console-module-storage","title":"Storage Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-storage","console-feature-catalog","console-runtime","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","scroll-area","dialog","radio-group"]},{"name":"@constructive-io/data","requiredBy":["console-kit-core"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","dialog","feature-pack-storage"]},{"name":"motion","requiredBy":["motion-config","sheet"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/radio-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["radio-group"],"sources":[{"registryItem":"radio-group","path":"registry/constructive/ui/radio-group.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/storage-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/console-kit/constructive/storage-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-module.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-slice.ts"}]},{"target":"src/blocks/feature-packs/storage/storage-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-meta-contract.ts"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/storage.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"storage","title":"Storage","description":"Policy-aware bucket navigation, uploads, downloads, and object deletion.","dependencies":[],"endpoints":{"required":[],"optional":["storage","admin","data"]},"capabilities":{"required":["storage.buckets","storage.files"],"optional":["storage.versioning","storage.content-hash","storage.custom-keys","storage.audit-log"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","storage"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-module-storage` installed Console Kit core, the provider-neutral storage view, and its Constructive integration. Import from `@/blocks/feature-packs/storage/storage-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: The objects endpoint alone is insufficient; incomplete contracts stay unavailable and read-only contracts hide write controls.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/storage/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/storage.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-module-storage","surface":"console-module","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/console-module-storage","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"radio-group","title":"Radio Group","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-storage","title":"Storage Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","cn","dialog","dropdown-menu","field","input","radio-group","table","constructive-theme"]},{"name":"console-module-storage","title":"Storage Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-storage","console-feature-catalog","console-runtime","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","scroll-area","dialog","radio-group"]},{"name":"@constructive-io/data@^0.5.0","requiredBy":["console-kit-core"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","dialog","feature-pack-storage"]},{"name":"motion","requiredBy":["motion-config","sheet"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/radio-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["radio-group"],"sources":[{"registryItem":"radio-group","path":"registry/constructive/ui/radio-group.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/storage-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/console-kit/constructive/storage-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-module.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-slice.ts"}]},{"target":"src/blocks/feature-packs/storage/storage-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-meta-contract.ts"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/storage.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"storage","title":"Storage","description":"Policy-aware bucket navigation, uploads, downloads, and object deletion.","dependencies":[],"endpoints":{"required":[],"optional":["storage","admin","data"]},"capabilities":{"required":["storage.buckets","storage.files"],"optional":["storage.versioning","storage.content-hash","storage.custom-keys","storage.audit-log"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","storage"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-module-storage` installed Console Kit core, the provider-neutral storage view, and its Constructive integration. Import from `@/blocks/feature-packs/storage/storage-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: The objects endpoint alone is insufficient; incomplete contracts stay unavailable and read-only contracts hide write controls.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/storage/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/storage.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-users.json b/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-users.json index e36984a..473b76f 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-users.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/console-module-users.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-module-users","surface":"console-module","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/console-module-users","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-users","title":"App access Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","checkbox","cn","dialog","dropdown-menu","empty","field","input","input-group","select","table","tabs","textarea","constructive-theme"]},{"name":"console-module-users","title":"App access Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-users","console-feature-catalog","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","checkbox","scroll-area","dialog","select","tabs"]},{"name":"@constructive-io/data","requiredBy":["console-kit-core"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","dialog","input-group","select","feature-pack-users"]},{"name":"motion","requiredBy":["motion-config","sheet"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/users-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/console-kit/constructive/users-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/users/users-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/feature-packs/users/users-console-module.tsx"}]},{"target":"src/blocks/feature-packs/users/users-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/users-feature-pack.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/users.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"users","title":"App access","description":"Application member governance, lifecycle controls, profiles, permission grants, and invitations.","dependencies":[],"endpoints":{"required":["admin"],"optional":["auth"]},"capabilities":{"required":["users.directory","users.memberships"],"optional":["users.permissions","users.profiles","users.invites"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-module-users` installed Console Kit core, the provider-neutral users view, and its Constructive integration. Import from `@/blocks/feature-packs/users/users-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: App access requires a compatible admin contract, and every control still depends on pack policy, adapter support, row policy, PostgreSQL privileges, and RLS.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/users/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/users.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"console-module-users","surface":"console-module","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/console-module-users","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-users","title":"App access Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","checkbox","cn","dialog","dropdown-menu","empty","field","input","input-group","select","table","tabs","textarea","constructive-theme"]},{"name":"console-module-users","title":"App access Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-users","console-feature-catalog","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","checkbox","scroll-area","dialog","select","tabs"]},{"name":"@constructive-io/data@^0.5.0","requiredBy":["console-kit-core"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","dialog","input-group","select","feature-pack-users"]},{"name":"motion","requiredBy":["motion-config","sheet"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/users-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/console-kit/constructive/users-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/users/users-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/feature-packs/users/users-console-module.tsx"}]},{"target":"src/blocks/feature-packs/users/users-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/users-feature-pack.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/users.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"users","title":"App access","description":"Application member governance, lifecycle controls, profiles, permission grants, and invitations.","dependencies":[],"endpoints":{"required":["admin"],"optional":["auth"]},"capabilities":{"required":["users.directory","users.memberships"],"optional":["users.permissions","users.profiles","users.invites"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`console-module-users` installed Console Kit core, the provider-neutral users view, and its Constructive integration. Import from `@/blocks/feature-packs/users/users-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: App access requires a compatible admin contract, and every control still depends on pack policy, adapter support, row policy, PostgreSQL privileges, and RLS.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/users/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/users.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-auth.json b/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-auth.json index ae49678..5a62da0 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-auth.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-auth.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"feature-pack-auth","surface":"standalone-feature-pack","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-auth","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-auth","title":"Authentication Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","card","checkbox","cn","field","input","input-group","separator","tabs","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["alert-dialog","avatar","checkbox","separator","input","tabs"]},{"name":"class-variance-authority","requiredBy":["alert","badge","button","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"lucide-react","requiredBy":["pack-foundation","input-group","feature-pack-auth"]},{"name":"tailwind-merge","requiredBy":["cn"]}],"devDependencies":[],"files":[{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-account-view.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-account-view.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-challenge-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-challenge-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-contracts.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-entry-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-entry-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-password-policy.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-password-policy.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"~/.constructive/feature-packs/auth.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"auth","title":"Authentication","description":"Consumer sign-in, account profile, password, and session-management surfaces.","dependencies":[],"endpoints":{"required":["auth"],"optional":[]},"capabilities":{"required":["auth.sessions","auth.credentials","auth.password"],"optional":["auth.email","auth.connected-accounts","auth.identity-providers","auth.passkeys","auth.phone","auth.devices"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":{"appliesTo":"standalone-feature-pack","consoleKitRequired":false,"hostOwns":["provider-neutral resources and resource states","policy grants and row-level action policy","semantic action callbacks and error reporting","controlled or default selection and routing state"],"discovery":"The standalone view performs no endpoint, _meta, introspection, session, or capability discovery.","state":"Use the feature pack controlled/default props and host state. The standalone surface does not impose Console Kit or Zustand.","authorizationBoundary":"Props describe the view the host may offer; provider policy, PostgreSQL privileges, and RLS remain authoritative.","consoleIntegration":"Install console-module-auth when Console Kit should own Constructive discovery, routing, session, and adapters."},"runtimeContract":null,"registryDocumentation":"`feature-pack-auth` installed a provider-neutral view and `.constructive/feature-packs/auth.json`. Import from `@/blocks/feature-packs/auth/auth-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-auth` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: Unsupported policy grants or callbacks stay absent, provider failures remain explicit, and callback credentials never enter the view.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/auth/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/auth.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"feature-pack-auth","surface":"standalone-feature-pack","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-auth","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-auth","title":"Authentication Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","card","checkbox","cn","field","input","input-group","separator","tabs","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["alert-dialog","avatar","checkbox","separator","input","tabs"]},{"name":"class-variance-authority","requiredBy":["alert","badge","button","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"lucide-react","requiredBy":["pack-foundation","input-group","feature-pack-auth"]},{"name":"tailwind-merge","requiredBy":["cn"]}],"devDependencies":[],"files":[{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-account-view.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-account-view.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-challenge-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-challenge-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-contracts.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-entry-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-entry-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-password-policy.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-password-policy.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"~/.constructive/feature-packs/auth.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"auth","title":"Authentication","description":"Consumer sign-in, account profile, password, and session-management surfaces.","dependencies":[],"endpoints":{"required":["auth"],"optional":[]},"capabilities":{"required":["auth.sessions","auth.credentials","auth.password"],"optional":["auth.email","auth.connected-accounts","auth.identity-providers","auth.passkeys","auth.phone","auth.devices"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":{"appliesTo":"standalone-feature-pack","consoleKitRequired":false,"hostOwns":["provider-neutral resources and resource states","policy grants and row-level action policy","semantic action callbacks and error reporting","controlled or default selection and routing state"],"discovery":"The standalone view performs no endpoint, _meta, introspection, session, or capability discovery.","state":"Use the feature pack controlled/default props and host state. The standalone surface does not impose Console Kit or Zustand.","authorizationBoundary":"Props describe the view the host may offer; provider policy, PostgreSQL privileges, and RLS remain authoritative.","consoleIntegration":"Install console-module-auth when Console Kit should own Constructive discovery, routing, session, and adapters."},"runtimeContract":null,"registryDocumentation":"`feature-pack-auth` installed a provider-neutral view and `.constructive/feature-packs/auth.json`. Import from `@/blocks/feature-packs/auth/auth-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-auth` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: Unsupported policy grants or callbacks stay absent, provider failures remain explicit, and callback credentials never enter the view.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/auth/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/auth.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-billing.json b/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-billing.json index c1824bb..347ebbc 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-billing.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-billing.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"feature-pack-billing","surface":"standalone-feature-pack","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-billing","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-contracts","title":"Billing Contracts","type":"registry:lib","directRegistryDependencies":[]},{"name":"billing-ui","title":"Billing UI Helpers","type":"registry:lib","directRegistryDependencies":["badge","billing-contracts","cn"]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"pagination","title":"Pagination","type":"registry:ui","directRegistryDependencies":["cn","button","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-activity-table","title":"Billing Activity Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","sheet","skeleton","table","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"progress","title":"Progress","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"billing-credits-card","title":"Billing Credits Card","type":"registry:block","directRegistryDependencies":["alert","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"billing-entitlements-list","title":"Billing Entitlements List","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","tooltip","constructive-theme"]},{"name":"billing-pricing-table","title":"Billing Pricing Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","select","separator","skeleton","constructive-theme"]},{"name":"billing-subscription-card","title":"Billing Subscription Card","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","constructive-theme"]},{"name":"billing-usage-history","title":"Billing Usage History","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","skeleton","table","constructive-theme"]},{"name":"billing-usage-overview","title":"Billing Usage Overview","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-settings-page","title":"Billing Settings Page","type":"registry:block","directRegistryDependencies":["alert","badge","billing-activity-table","billing-contracts","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","cn","separator","tabs","tooltip","constructive-theme"]},{"name":"feature-pack-billing","title":"Billing Feature Pack","type":"registry:block","directRegistryDependencies":["billing-settings-page","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","select","sheet","collapsible","progress","tooltip","tabs"]},{"name":"class-variance-authority","requiredBy":["alert","badge","button","card","sheet"]},{"name":"clsx","requiredBy":["cn"]},{"name":"lucide-react","requiredBy":["pagination","select","sheet","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","billing-settings-page"]},{"name":"motion","requiredBy":["motion-config","sheet","billing-credits-card","billing-usage-overview"]},{"name":"tailwind-merge","requiredBy":["cn"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/pagination.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["pagination"],"sources":[{"registryItem":"pagination","path":"registry/constructive/ui/pagination.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/progress.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["progress"],"sources":[{"registryItem":"progress","path":"registry/constructive/ui/progress.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/billing-activity-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/billing-activity-table.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/messages.ts"}]},{"target":"src/blocks/billing/billing-contracts/billing-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["billing-contracts"],"sources":[{"registryItem":"billing-contracts","path":"registry/constructive/blocks/billing/billing-contracts/billing-contracts.ts"}]},{"target":"src/blocks/billing/billing-credits-card/billing-credits-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/billing-credits-card.tsx"}]},{"target":"src/blocks/billing/billing-credits-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/messages.ts"}]},{"target":"src/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx"}]},{"target":"src/blocks/billing/billing-entitlements-list/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/messages.ts"}]},{"target":"src/blocks/billing/billing-pricing-table/billing-pricing-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/billing-pricing-table.tsx"}]},{"target":"src/blocks/billing/billing-pricing-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/messages.ts"}]},{"target":"src/blocks/billing/billing-settings-page/billing-settings-page.tsx","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/billing-settings-page.tsx"}]},{"target":"src/blocks/billing/billing-settings-page/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/messages.ts"}]},{"target":"src/blocks/billing/billing-subscription-card/billing-subscription-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/billing-subscription-card.tsx"}]},{"target":"src/blocks/billing/billing-subscription-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/messages.ts"}]},{"target":"src/blocks/billing/billing-ui/billing-ui.tsx","targetKind":"literal","type":"registry:lib","owners":["billing-ui"],"sources":[{"registryItem":"billing-ui","path":"registry/constructive/blocks/billing/billing-ui/billing-ui.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/billing-usage-history.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/billing-usage-history.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/messages.ts"}]},{"target":"src/blocks/billing/billing-usage-overview/billing-usage-overview.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/billing-usage-overview.tsx"}]},{"target":"src/blocks/billing/billing-usage-overview/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/messages.ts"}]},{"target":"src/blocks/feature-packs/billing/billing-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/billing-feature-pack.tsx"}]},{"target":"~/.constructive/feature-packs/billing.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"billing","title":"Billing","description":"Plans, subscriptions, entitlement meters, usage, credits, and account activity.","dependencies":[],"endpoints":{"required":[],"optional":["billing","admin","data"]},"capabilities":{"required":["billing.plans","billing.subscriptions"],"optional":["billing.meters"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":{"appliesTo":"standalone-feature-pack","consoleKitRequired":false,"hostOwns":["provider-neutral resources and resource states","policy grants and row-level action policy","semantic action callbacks and error reporting","controlled or default selection and routing state"],"discovery":"The standalone view performs no endpoint, _meta, introspection, session, or capability discovery.","state":"Use the feature pack controlled/default props and host state. The standalone surface does not impose Console Kit or Zustand.","authorizationBoundary":"Props describe the view the host may offer; provider policy, PostgreSQL privileges, and RLS remain authoritative.","consoleIntegration":"Install console-module-billing when Console Kit should own Constructive discovery, routing, session, and adapters."},"runtimeContract":null,"registryDocumentation":"`feature-pack-billing` installed a provider-neutral view and `.constructive/feature-packs/billing.json`. Import from `@/blocks/feature-packs/billing/billing-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-billing` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: Missing resources remain independent degraded states, and unavailable provider callbacks stay absent.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/billing/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/billing.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"feature-pack-billing","surface":"standalone-feature-pack","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-billing","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-contracts","title":"Billing Contracts","type":"registry:lib","directRegistryDependencies":[]},{"name":"billing-ui","title":"Billing UI Helpers","type":"registry:lib","directRegistryDependencies":["badge","billing-contracts","cn"]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"pagination","title":"Pagination","type":"registry:ui","directRegistryDependencies":["cn","button","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-activity-table","title":"Billing Activity Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","sheet","skeleton","table","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"progress","title":"Progress","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"billing-credits-card","title":"Billing Credits Card","type":"registry:block","directRegistryDependencies":["alert","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"billing-entitlements-list","title":"Billing Entitlements List","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","tooltip","constructive-theme"]},{"name":"billing-pricing-table","title":"Billing Pricing Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","select","separator","skeleton","constructive-theme"]},{"name":"billing-subscription-card","title":"Billing Subscription Card","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","constructive-theme"]},{"name":"billing-usage-history","title":"Billing Usage History","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","skeleton","table","constructive-theme"]},{"name":"billing-usage-overview","title":"Billing Usage Overview","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-settings-page","title":"Billing Settings Page","type":"registry:block","directRegistryDependencies":["alert","badge","billing-activity-table","billing-contracts","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","cn","separator","tabs","tooltip","constructive-theme"]},{"name":"feature-pack-billing","title":"Billing Feature Pack","type":"registry:block","directRegistryDependencies":["billing-settings-page","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","select","sheet","collapsible","progress","tooltip","tabs"]},{"name":"class-variance-authority","requiredBy":["alert","badge","button","card","sheet"]},{"name":"clsx","requiredBy":["cn"]},{"name":"lucide-react","requiredBy":["pagination","select","sheet","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","billing-settings-page"]},{"name":"motion","requiredBy":["motion-config","sheet","billing-credits-card","billing-usage-overview"]},{"name":"tailwind-merge","requiredBy":["cn"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/pagination.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["pagination"],"sources":[{"registryItem":"pagination","path":"registry/constructive/ui/pagination.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/progress.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["progress"],"sources":[{"registryItem":"progress","path":"registry/constructive/ui/progress.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/billing-activity-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/billing-activity-table.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/messages.ts"}]},{"target":"src/blocks/billing/billing-contracts/billing-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["billing-contracts"],"sources":[{"registryItem":"billing-contracts","path":"registry/constructive/blocks/billing/billing-contracts/billing-contracts.ts"}]},{"target":"src/blocks/billing/billing-credits-card/billing-credits-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/billing-credits-card.tsx"}]},{"target":"src/blocks/billing/billing-credits-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/messages.ts"}]},{"target":"src/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx"}]},{"target":"src/blocks/billing/billing-entitlements-list/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/messages.ts"}]},{"target":"src/blocks/billing/billing-pricing-table/billing-pricing-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/billing-pricing-table.tsx"}]},{"target":"src/blocks/billing/billing-pricing-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/messages.ts"}]},{"target":"src/blocks/billing/billing-settings-page/billing-settings-page.tsx","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/billing-settings-page.tsx"}]},{"target":"src/blocks/billing/billing-settings-page/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/messages.ts"}]},{"target":"src/blocks/billing/billing-subscription-card/billing-subscription-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/billing-subscription-card.tsx"}]},{"target":"src/blocks/billing/billing-subscription-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/messages.ts"}]},{"target":"src/blocks/billing/billing-ui/billing-ui.tsx","targetKind":"literal","type":"registry:lib","owners":["billing-ui"],"sources":[{"registryItem":"billing-ui","path":"registry/constructive/blocks/billing/billing-ui/billing-ui.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/billing-usage-history.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/billing-usage-history.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/messages.ts"}]},{"target":"src/blocks/billing/billing-usage-overview/billing-usage-overview.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/billing-usage-overview.tsx"}]},{"target":"src/blocks/billing/billing-usage-overview/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/messages.ts"}]},{"target":"src/blocks/feature-packs/billing/billing-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/billing-feature-pack.tsx"}]},{"target":"~/.constructive/feature-packs/billing.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"billing","title":"Billing","description":"Plans, subscriptions, entitlement meters, usage, credits, and account activity.","dependencies":[],"endpoints":{"required":[],"optional":["billing","admin","data"]},"capabilities":{"required":["billing.plans","billing.subscriptions"],"optional":["billing.meters"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":{"appliesTo":"standalone-feature-pack","consoleKitRequired":false,"hostOwns":["provider-neutral resources and resource states","policy grants and row-level action policy","semantic action callbacks and error reporting","controlled or default selection and routing state"],"discovery":"The standalone view performs no endpoint, _meta, introspection, session, or capability discovery.","state":"Use the feature pack controlled/default props and host state. The standalone surface does not impose Console Kit or Zustand.","authorizationBoundary":"Props describe the view the host may offer; provider policy, PostgreSQL privileges, and RLS remain authoritative.","consoleIntegration":"Install console-module-billing when Console Kit should own Constructive discovery, routing, session, and adapters."},"runtimeContract":null,"registryDocumentation":"`feature-pack-billing` installed a provider-neutral view and `.constructive/feature-packs/billing.json`. Import from `@/blocks/feature-packs/billing/billing-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-billing` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: Missing resources remain independent degraded states, and unavailable provider callbacks stay absent.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/billing/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/billing.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-data.json b/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-data.json index 8956d50..e88bd49 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-data.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-data.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"feature-pack-data","surface":"standalone-feature-pack","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-data","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"feature-pack-data","title":"Data Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","button","card","constructive-theme"]}],"npmDependencies":[{"name":"@constructive-io/data","requiredBy":["feature-pack-data"]},{"name":"@constructive-io/sheets","requiredBy":["feature-pack-data"]},{"name":"class-variance-authority","requiredBy":["alert","badge","button","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"lucide-react","requiredBy":["pack-foundation","feature-pack-data"]},{"name":"tailwind-merge","requiredBy":["cn"]}],"devDependencies":[],"files":[{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"src/blocks/feature-packs/data/data-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/data-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"~/.constructive/feature-packs/data.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"data","title":"Data","description":"Dynamic table exploration and CRUD surfaces driven by Constructive metadata and GraphQL introspection.","dependencies":[],"endpoints":{"required":["data"],"optional":[]},"capabilities":{"required":["data.meta","data.introspection"],"optional":["data.search","data.i18n","data.realtime"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","search","i18n","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":{"appliesTo":"standalone-feature-pack","consoleKitRequired":false,"hostOwns":["provider-neutral resources and resource states","policy grants and row-level action policy","semantic action callbacks and error reporting","controlled or default selection and routing state"],"discovery":"The standalone view performs no endpoint, _meta, introspection, session, or capability discovery.","state":"Use the feature pack controlled/default props and host state. The standalone surface does not impose Console Kit or Zustand.","authorizationBoundary":"Props describe the view the host may offer; provider policy, PostgreSQL privileges, and RLS remain authoritative.","consoleIntegration":"Install console-module-data when Console Kit should own Constructive discovery, routing, session, and adapters."},"runtimeContract":null,"registryDocumentation":"`feature-pack-data` installed a provider-neutral view and `.constructive/feature-packs/data.json`. Import from `@/blocks/feature-packs/data/data-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-data` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: The host owns Sheets state and endpoint binding; incompatible metadata stays explicit, and PostgreSQL privileges and RLS decide every query and mutation.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/data/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/data.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"feature-pack-data","surface":"standalone-feature-pack","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-data","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"calendar-rac","title":"Calendar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"form-control","title":"Form Control","type":"registry:ui","directRegistryDependencies":["cn","slot","label","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"pagination","title":"Pagination","type":"registry:ui","directRegistryDependencies":["cn","button","constructive-theme"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"progressive-blur","title":"Progressive Blur","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"toast","title":"Toast Notifications","type":"registry:block","directRegistryDependencies":["button","dialog","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sheets","title":"Sheets","type":"registry:block","directRegistryDependencies":["alert-dialog","badge","button","calendar-rac","card","checkbox","collapsible","dropdown-menu","form-control","input","input-group","label","pagination","popover","progressive-blur","scroll-area","select","skeleton","tabs","textarea","toast","tooltip","constructive-theme"]},{"name":"feature-pack-data","title":"Data Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","sheets","alert","button","card","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["alert-dialog","checkbox","collapsible","dropdown-menu","input","popover","scroll-area","select","tabs","dialog","tooltip"]},{"name":"@constructive-io/data@^0.5.0","requiredBy":["sheets","feature-pack-data"]},{"name":"@internationalized/date","requiredBy":["calendar-rac","sheets"]},{"name":"@remixicon/react","requiredBy":["sheets"]},{"name":"@tanstack/react-form","requiredBy":["sheets"]},{"name":"@tanstack/react-query","requiredBy":["sheets"]},{"name":"@tanstack/react-table@9.0.0-beta.58","requiredBy":["sheets"]},{"name":"@tanstack/react-virtual","requiredBy":["sheets"]},{"name":"@types/leaflet","requiredBy":["sheets"]},{"name":"class-variance-authority","requiredBy":["alert","badge","button","card"]},{"name":"clsx","requiredBy":["cn","sheets"]},{"name":"graphql","requiredBy":["sheets"]},{"name":"inflekt","requiredBy":["sheets"]},{"name":"leaflet","requiredBy":["sheets"]},{"name":"lucide-react","requiredBy":["pack-foundation","dropdown-menu","input-group","pagination","select","dialog","toast","sheets","feature-pack-data"]},{"name":"motion","requiredBy":["sheets"]},{"name":"react-aria-components","requiredBy":["calendar-rac","sheets"]},{"name":"react-leaflet","requiredBy":["sheets"]},{"name":"sonner","requiredBy":["toast"]},{"name":"tailwind-merge","requiredBy":["cn","sheets"]},{"name":"zod","requiredBy":["sheets"]},{"name":"zustand","requiredBy":["sheets"]}],"devDependencies":[],"files":[{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/calendar-rac.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["calendar-rac"],"sources":[{"registryItem":"calendar-rac","path":"registry/constructive/ui/calendar-rac.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/form-control.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["form-control"],"sources":[{"registryItem":"form-control","path":"registry/constructive/ui/form-control.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/pagination.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["pagination"],"sources":[{"registryItem":"pagination","path":"registry/constructive/ui/pagination.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/progressive-blur.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["progressive-blur"],"sources":[{"registryItem":"progressive-blur","path":"registry/constructive/ui/progressive-blur.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/sheets/adapter/postgraphile-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/postgraphile-adapter.ts"}]},{"target":"@ui/sheets/adapter/sheets-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/sheets-adapter.ts"}]},{"target":"@ui/sheets/adapter/use-sheets-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/use-sheets-adapter.ts"}]},{"target":"@ui/sheets/advanced.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/advanced.ts"}]},{"target":"@ui/sheets/auth/auth-execute.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-execute.ts"}]},{"target":"@ui/sheets/auth/auth-gate.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-gate.tsx"}]},{"target":"@ui/sheets/auth/auth-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-types.ts"}]},{"target":"@ui/sheets/auth/hooks/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/index.ts"}]},{"target":"@ui/sheets/auth/hooks/use-forgot-password.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-forgot-password.ts"}]},{"target":"@ui/sheets/auth/hooks/use-login.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-login.ts"}]},{"target":"@ui/sheets/auth/hooks/use-register.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-register.ts"}]},{"target":"@ui/sheets/auth/hooks/use-reset-password.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-reset-password.ts"}]},{"target":"@ui/sheets/auth/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/index.ts"}]},{"target":"@ui/sheets/auth/ui/auth-error-alert.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-error-alert.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-loading-button.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-loading-button.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-screen-header.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-screen-header.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-screen-layout.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-screen-layout.tsx"}]},{"target":"@ui/sheets/auth/ui/forgot-password-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/forgot-password-form.tsx"}]},{"target":"@ui/sheets/auth/ui/form-field.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/form-field.tsx"}]},{"target":"@ui/sheets/auth/ui/login-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/login-form.tsx"}]},{"target":"@ui/sheets/auth/ui/password-strength.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/password-strength.tsx"}]},{"target":"@ui/sheets/auth/ui/register-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/register-form.tsx"}]},{"target":"@ui/sheets/auth/ui/reset-password-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/reset-password-form.tsx"}]},{"target":"@ui/sheets/auth/utils/auth-errors.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/auth-errors.ts"}]},{"target":"@ui/sheets/auth/utils/schemas.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/schemas.ts"}]},{"target":"@ui/sheets/auth/utils/token-store.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/token-store.ts"}]},{"target":"@ui/sheets/auth/utils/validators.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/validators.ts"}]},{"target":"@ui/sheets/cell-model/badge-tones.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/badge-tones.ts"}]},{"target":"@ui/sheets/cell-model/cell-props.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/cell-props.ts"}]},{"target":"@ui/sheets/cell-model/cell-slots.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/cell-slots.ts"}]},{"target":"@ui/sheets/cell-model/create-sheets-cell.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/create-sheets-cell.ts"}]},{"target":"@ui/sheets/cell-model/factories/badges.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/badges.ts"}]},{"target":"@ui/sheets/cell-model/factories/boolean.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/boolean.ts"}]},{"target":"@ui/sheets/cell-model/factories/datetime.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/datetime.ts"}]},{"target":"@ui/sheets/cell-model/factories/geometry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/geometry.ts"}]},{"target":"@ui/sheets/cell-model/factories/image.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/image.ts"}]},{"target":"@ui/sheets/cell-model/factories/interval.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/interval.ts"}]},{"target":"@ui/sheets/cell-model/factories/number.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/number.ts"}]},{"target":"@ui/sheets/cell-model/factories/relation.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/relation.ts"}]},{"target":"@ui/sheets/cell-model/factories/text.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/text.ts"}]},{"target":"@ui/sheets/cell-model/factories/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/types.ts"}]},{"target":"@ui/sheets/cell-model/factories/uri.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/uri.ts"}]},{"target":"@ui/sheets/cell-model/image-cache.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/image-cache.ts"}]},{"target":"@ui/sheets/cell-model/sheets-cell.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/sheets-cell.ts"}]},{"target":"@ui/sheets/cell-model/views/badges-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/badges-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/boolean-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/boolean-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/datetime-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/datetime-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/draft-action-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/draft-action-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/geometry-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/geometry-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/image-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/image-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/interval-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/interval-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/loading-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/loading-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/number-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/number-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/relation-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/relation-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/text-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/text-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/uri-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/uri-view.tsx"}]},{"target":"@ui/sheets/cell-types/cell-registry-defaults.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-registry-defaults.ts"}]},{"target":"@ui/sheets/cell-types/cell-registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-registry.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-groups.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-groups.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-registry.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-resolver.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-resolver.ts"}]},{"target":"@ui/sheets/cell-types/define-cell-type.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/define-cell-type.ts"}]},{"target":"@ui/sheets/cell-types/type-mapping.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/type-mapping.ts"}]},{"target":"@ui/sheets/cell-types/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/types.ts"}]},{"target":"@ui/sheets/commands/context.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/context.ts"}]},{"target":"@ui/sheets/commands/dispatch.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/dispatch.ts"}]},{"target":"@ui/sheets/commands/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/index.ts"}]},{"target":"@ui/sheets/commands/keybinding.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/keybinding.ts"}]},{"target":"@ui/sheets/commands/keymap.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/keymap.ts"}]},{"target":"@ui/sheets/commands/registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/registry.ts"}]},{"target":"@ui/sheets/commands/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/types.ts"}]},{"target":"@ui/sheets/config/sheets-concurrency.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/config/sheets-concurrency.ts"}]},{"target":"@ui/sheets/context/sheets-context.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-context.ts"}]},{"target":"@ui/sheets/context/sheets-execute.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-execute.ts"}]},{"target":"@ui/sheets/context/sheets-provider.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-provider.tsx"}]},{"target":"@ui/sheets/context/sheets-upload-presigned.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-upload-presigned.ts"}]},{"target":"@ui/sheets/forms/form-spec-builder.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/form-spec-builder.ts"}]},{"target":"@ui/sheets/forms/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/index.ts"}]},{"target":"@ui/sheets/forms/metadata-hash.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/metadata-hash.ts"}]},{"target":"@ui/sheets/forms/mutations.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/mutations.ts"}]},{"target":"@ui/sheets/forms/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/types.ts"}]},{"target":"@ui/sheets/forms/zod-schema.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/zod-schema.ts"}]},{"target":"@ui/sheets/grid-dom/editors/array-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/array-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/date-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/date-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/edit-intent.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/edit-intent.ts"}]},{"target":"@ui/sheets/grid-dom/editors/editor-props.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/editor-props.ts"}]},{"target":"@ui/sheets/grid-dom/editors/editor-registry-dom.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/editor-registry-dom.ts"}]},{"target":"@ui/sheets/grid-dom/editors/geometry-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/geometry-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/image-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/image-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/inet-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/inet-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/interval-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/interval-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/json-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/json-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/number-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/number-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/relation-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/relation-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/text-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/text-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/tsvector-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/tsvector-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/upload-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/upload-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/url-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/url-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/inline-cell-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/inline-cell-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/overlay/overlay-manager.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/overlay/overlay-manager.tsx"}]},{"target":"@ui/sheets/grid-dom/overlay/use-overlay-controller.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/overlay/use-overlay-controller.ts"}]},{"target":"@ui/sheets/grid-dom/sheets-cell-host.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/sheets-cell-host.tsx"}]},{"target":"@ui/sheets/grid-dom/use-sheets-content.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/use-sheets-content.ts"}]},{"target":"@ui/sheets/grid/cell-routing.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/cell-routing.ts"}]},{"target":"@ui/sheets/grid/draft-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/draft-types.ts"}]},{"target":"@ui/sheets/grid/editors/array-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/array-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/date-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/date-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/editor-focus-trap.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/editor-focus-trap.tsx"}]},{"target":"@ui/sheets/grid/editors/geometry-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/geometry-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/image-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/image-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/inet-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/inet-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/interval-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/interval-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/json-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/json-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/overlay-presets.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/overlay-presets.ts"}]},{"target":"@ui/sheets/grid/editors/overlay-viewport-guard.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/overlay-viewport-guard.tsx"}]},{"target":"@ui/sheets/grid/editors/relation-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/relation-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/relation-record-tooltip.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/relation-record-tooltip.tsx"}]},{"target":"@ui/sheets/grid/editors/tsvector-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/tsvector-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/upload-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/upload-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/url-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/url-editor.tsx"}]},{"target":"@ui/sheets/grid/feedback/dock-status-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/dock-status-bar.tsx"}]},{"target":"@ui/sheets/grid/feedback/editor-error-boundary.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/editor-error-boundary.tsx"}]},{"target":"@ui/sheets/grid/feedback/feedback-context.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/feedback-context.tsx"}]},{"target":"@ui/sheets/grid/feedback/feedback-reducer.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/feedback-reducer.ts"}]},{"target":"@ui/sheets/grid/feedback/floating-status.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/floating-status.tsx"}]},{"target":"@ui/sheets/grid/feedback/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/index.ts"}]},{"target":"@ui/sheets/grid/feedback/sheets-error-boundary.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/sheets-error-boundary.tsx"}]},{"target":"@ui/sheets/grid/feedback/sheets-error-state.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/sheets-error-state.tsx"}]},{"target":"@ui/sheets/grid/filter-operators.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/filter-operators.ts"}]},{"target":"@ui/sheets/grid/grid-cell-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/grid-cell-types.ts"}]},{"target":"@ui/sheets/grid/hooks/use-batch-commit.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-batch-commit.ts"}]},{"target":"@ui/sheets/grid/hooks/use-cell-editing.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-cell-editing.ts"}]},{"target":"@ui/sheets/grid/hooks/use-draft-rows.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-draft-rows.ts"}]},{"target":"@ui/sheets/grid/hooks/use-draft-submission.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-draft-submission.ts"}]},{"target":"@ui/sheets/grid/hooks/use-filter-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-filter-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-operations.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-operations.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-selection.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-selection.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-state.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-state.ts"}]},{"target":"@ui/sheets/grid/hooks/use-infinite-grid-data.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-infinite-grid-data.ts"}]},{"target":"@ui/sheets/grid/hooks/use-load-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-load-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-paginate-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-paginate-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-undo-redo.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-undo-redo.ts"}]},{"target":"@ui/sheets/grid/row-model.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/row-model.ts"}]},{"target":"@ui/sheets/grid/sheets.constants.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.constants.ts"}]},{"target":"@ui/sheets/grid/sheets.context-menu.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.context-menu.tsx"}]},{"target":"@ui/sheets/grid/sheets.controls.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.controls.tsx"}]},{"target":"@ui/sheets/grid/sheets.formatters.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.formatters.ts"}]},{"target":"@ui/sheets/grid/sheets.pagination.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.pagination.tsx"}]},{"target":"@ui/sheets/grid/sheets.table-selector.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.table-selector.tsx"}]},{"target":"@ui/sheets/grid/sheets.theme.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.theme.ts"}]},{"target":"@ui/sheets/grid/sheets.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.tsx"}]},{"target":"@ui/sheets/grid/sheets.types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.types.ts"}]},{"target":"@ui/sheets/grid/sheets.utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.utils.ts"}]},{"target":"@ui/sheets/grid/use-sheets.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/use-sheets.ts"}]},{"target":"@ui/sheets/hooks/orderby-enum-resolution.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/orderby-enum-resolution.ts"}]},{"target":"@ui/sheets/hooks/query-keys.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/query-keys.ts"}]},{"target":"@ui/sheets/hooks/relation-field-resolution.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/relation-field-resolution.ts"}]},{"target":"@ui/sheets/hooks/use-relation-columns.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-relation-columns.ts"}]},{"target":"@ui/sheets/hooks/use-relation-metadata-cache.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-relation-metadata-cache.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-infinite-table.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-infinite-table.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-meta.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-meta.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-table-cursor.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-table-cursor.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-table.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-table.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-upload.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-upload.ts"}]},{"target":"@ui/sheets/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/index.ts"}]},{"target":"@ui/sheets/row-identity.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/row-identity.ts"}]},{"target":"@ui/sheets/selection/cell-extract.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/cell-extract.ts"}]},{"target":"@ui/sheets/selection/fill.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/fill.ts"}]},{"target":"@ui/sheets/selection/range-set.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/range-set.ts"}]},{"target":"@ui/sheets/selection/selection-model.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/selection-model.ts"}]},{"target":"@ui/sheets/selection/tsv.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/tsv.ts"}]},{"target":"@ui/sheets/store/draft-rows-slice.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/draft-rows-slice.ts"}]},{"target":"@ui/sheets/store/relation-info-slice.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/relation-info-slice.ts"}]},{"target":"@ui/sheets/store/sheets-store.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/sheets-store.ts"}]},{"target":"@ui/sheets/table/features.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/features.ts"}]},{"target":"@ui/sheets/table/grid-viewport.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/grid-viewport.tsx"}]},{"target":"@ui/sheets/table/use-sheets-table-instance.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/use-sheets-table-instance.ts"}]},{"target":"@ui/sheets/utils/cn.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/cn.ts"}]},{"target":"@ui/sheets/utils/file.utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/file.utils.ts"}]},{"target":"@ui/sheets/utils/image-with-fallback.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/image-with-fallback.tsx"}]},{"target":"@ui/sheets/utils/map-picker.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/map-picker.tsx"}]},{"target":"@ui/sheets/utils/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/motion-config.ts"}]},{"target":"@ui/sheets/utils/relation-utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/relation-utils.ts"}]},{"target":"@ui/sheets/utils/sheets-i18n.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/sheets-i18n.ts"}]},{"target":"@ui/sheets/utils/sheets-logger.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/sheets-logger.ts"}]},{"target":"@ui/sheets/utils/use-color-scheme.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-color-scheme.ts"}]},{"target":"@ui/sheets/utils/use-image-status.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-image-status.ts"}]},{"target":"@ui/sheets/utils/use-resize-observer.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-resize-observer.ts"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/toast/index.ts","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/index.ts"}]},{"target":"@ui/toast/toast-error.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-error.tsx"}]},{"target":"@ui/toast/toast-info.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-info.tsx"}]},{"target":"@ui/toast/toast-success.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-success.tsx"}]},{"target":"@ui/toast/toast-warning.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-warning.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/feature-packs/data/data-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/data-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"~/.constructive/feature-packs/data.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"data","title":"Data","description":"Dynamic table exploration and CRUD surfaces driven by Constructive metadata and GraphQL introspection.","dependencies":[],"endpoints":{"required":["data"],"optional":[]},"capabilities":{"required":["data.meta","data.introspection"],"optional":["data.search","data.i18n","data.realtime"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","search","i18n","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":{"appliesTo":"standalone-feature-pack","consoleKitRequired":false,"hostOwns":["provider-neutral resources and resource states","policy grants and row-level action policy","semantic action callbacks and error reporting","controlled or default selection and routing state"],"discovery":"The standalone view performs no endpoint, _meta, introspection, session, or capability discovery.","state":"Use the feature pack controlled/default props and host state. The standalone surface does not impose Console Kit or Zustand.","authorizationBoundary":"Props describe the view the host may offer; provider policy, PostgreSQL privileges, and RLS remain authoritative.","consoleIntegration":"Install console-module-data when Console Kit should own Constructive discovery, routing, session, and adapters."},"runtimeContract":null,"registryDocumentation":"`feature-pack-data` installed a provider-neutral view and `.constructive/feature-packs/data.json`. Import from `@/blocks/feature-packs/data/data-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-data` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: The host owns Sheets state and endpoint binding; incompatible metadata stays explicit, and PostgreSQL privileges and RLS decide every query and mutation.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/data/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/data.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-notifications.json b/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-notifications.json index d6f93bb..9f5c621 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-notifications.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-notifications.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"feature-pack-notifications","surface":"standalone-feature-pack","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-notifications","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-notifications","title":"Notifications Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","separator","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["alert-dialog","separator"]},{"name":"class-variance-authority","requiredBy":["alert","badge","button","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"lucide-react","requiredBy":["pack-foundation","feature-pack-notifications"]},{"name":"tailwind-merge","requiredBy":["cn"]}],"devDependencies":[],"files":[{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"src/blocks/feature-packs/notifications/notifications-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/notifications-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"~/.constructive/feature-packs/notifications.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"notifications","title":"Notifications","description":"User notification inbox and read-state actions with optional settings and realtime capabilities.","dependencies":[],"endpoints":{"required":[],"optional":["notifications","auth","data"]},"capabilities":{"required":["notifications.inbox"],"optional":["notifications.settings","notifications.realtime"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":{"appliesTo":"standalone-feature-pack","consoleKitRequired":false,"hostOwns":["provider-neutral resources and resource states","policy grants and row-level action policy","semantic action callbacks and error reporting","controlled or default selection and routing state"],"discovery":"The standalone view performs no endpoint, _meta, introspection, session, or capability discovery.","state":"Use the feature pack controlled/default props and host state. The standalone surface does not impose Console Kit or Zustand.","authorizationBoundary":"Props describe the view the host may offer; provider policy, PostgreSQL privileges, and RLS remain authoritative.","consoleIntegration":"Install console-module-notifications when Console Kit should own Constructive discovery, routing, session, and adapters."},"runtimeContract":null,"registryDocumentation":"`feature-pack-notifications` installed a provider-neutral view and `.constructive/feature-packs/notifications.json`. Import from `@/blocks/feature-packs/notifications/notifications-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-notifications` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: The host must provide an authoritative inbox, policy, and callbacks; absent operations stay unavailable and mutations require a refreshed resource.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/notifications/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/notifications.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"feature-pack-notifications","surface":"standalone-feature-pack","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-notifications","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-notifications","title":"Notifications Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","separator","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["alert-dialog","separator"]},{"name":"class-variance-authority","requiredBy":["alert","badge","button","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"lucide-react","requiredBy":["pack-foundation","feature-pack-notifications"]},{"name":"tailwind-merge","requiredBy":["cn"]}],"devDependencies":[],"files":[{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"src/blocks/feature-packs/notifications/notifications-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/notifications-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"~/.constructive/feature-packs/notifications.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"notifications","title":"Notifications","description":"User notification inbox and read-state actions with optional settings and realtime capabilities.","dependencies":[],"endpoints":{"required":[],"optional":["notifications","auth","data"]},"capabilities":{"required":["notifications.inbox"],"optional":["notifications.settings","notifications.realtime"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":{"appliesTo":"standalone-feature-pack","consoleKitRequired":false,"hostOwns":["provider-neutral resources and resource states","policy grants and row-level action policy","semantic action callbacks and error reporting","controlled or default selection and routing state"],"discovery":"The standalone view performs no endpoint, _meta, introspection, session, or capability discovery.","state":"Use the feature pack controlled/default props and host state. The standalone surface does not impose Console Kit or Zustand.","authorizationBoundary":"Props describe the view the host may offer; provider policy, PostgreSQL privileges, and RLS remain authoritative.","consoleIntegration":"Install console-module-notifications when Console Kit should own Constructive discovery, routing, session, and adapters."},"runtimeContract":null,"registryDocumentation":"`feature-pack-notifications` installed a provider-neutral view and `.constructive/feature-packs/notifications.json`. Import from `@/blocks/feature-packs/notifications/notifications-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-notifications` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: The host must provide an authoritative inbox, policy, and callbacks; absent operations stay unavailable and mutations require a refreshed resource.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/notifications/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/notifications.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-organizations.json b/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-organizations.json index 154f11e..c9be260 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-organizations.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-organizations.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"feature-pack-organizations","surface":"standalone-feature-pack","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-organizations","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"switch","title":"Switch","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-organizations","title":"Organizations Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert-dialog","avatar","badge","button","card","checkbox","cn","dialog","dropdown-menu","empty","field","input","select","switch","table","tabs","textarea","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["alert-dialog","avatar","checkbox","scroll-area","dialog","dropdown-menu","separator","input","select","switch","tabs"]},{"name":"class-variance-authority","requiredBy":["alert","badge","button","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"lucide-react","requiredBy":["pack-foundation","dialog","dropdown-menu","select","feature-pack-organizations"]},{"name":"tailwind-merge","requiredBy":["cn"]}],"devDependencies":[],"files":[{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/switch.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["switch"],"sources":[{"registryItem":"switch","path":"registry/constructive/ui/switch.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-access-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-access-panels.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-contracts.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-operation-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-operation-panels.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"~/.constructive/feature-packs/organizations.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"organizations","title":"Organizations","description":"Tenant membership governance, invitations, access policy, hierarchy, settings, and developer credentials.","dependencies":[],"endpoints":{"required":[],"optional":["admin","auth","billing","data"]},"capabilities":{"required":["organizations.memberships"],"optional":["organizations.permissions","organizations.limits","organizations.profiles","organizations.hierarchy","organizations.invites"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":{"appliesTo":"standalone-feature-pack","consoleKitRequired":false,"hostOwns":["provider-neutral resources and resource states","policy grants and row-level action policy","semantic action callbacks and error reporting","controlled or default selection and routing state"],"discovery":"The standalone view performs no endpoint, _meta, introspection, session, or capability discovery.","state":"Use the feature pack controlled/default props and host state. The standalone surface does not impose Console Kit or Zustand.","authorizationBoundary":"Props describe the view the host may offer; provider policy, PostgreSQL privileges, and RLS remain authoritative.","consoleIntegration":"Install console-module-organizations when Console Kit should own Constructive discovery, routing, session, and adapters."},"runtimeContract":null,"registryDocumentation":"`feature-pack-organizations` installed a provider-neutral view and `.constructive/feature-packs/organizations.json`. Import from `@/blocks/feature-packs/organizations/organizations-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-organizations` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: When the active organization is missing or does not match the host-provided list, the view selects the first available organization. It never infers a principal, policy grant, or mutation authority; missing resources and callbacks stay unavailable, while PostgreSQL privileges and RLS remain authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/organizations/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/organizations.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"feature-pack-organizations","surface":"standalone-feature-pack","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-organizations","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"switch","title":"Switch","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-organizations","title":"Organizations Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert-dialog","avatar","badge","button","card","checkbox","cn","dialog","dropdown-menu","empty","field","input","select","switch","table","tabs","textarea","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["alert-dialog","avatar","checkbox","scroll-area","dialog","dropdown-menu","separator","input","select","switch","tabs"]},{"name":"class-variance-authority","requiredBy":["alert","badge","button","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"lucide-react","requiredBy":["pack-foundation","dialog","dropdown-menu","select","feature-pack-organizations"]},{"name":"tailwind-merge","requiredBy":["cn"]}],"devDependencies":[],"files":[{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/switch.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["switch"],"sources":[{"registryItem":"switch","path":"registry/constructive/ui/switch.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-access-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-access-panels.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-contracts.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-operation-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-operation-panels.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"~/.constructive/feature-packs/organizations.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"organizations","title":"Organizations","description":"Tenant membership governance, invitations, access policy, hierarchy, settings, and developer credentials.","dependencies":[],"endpoints":{"required":[],"optional":["admin","auth","billing","data"]},"capabilities":{"required":["organizations.memberships"],"optional":["organizations.permissions","organizations.limits","organizations.profiles","organizations.hierarchy","organizations.invites"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":{"appliesTo":"standalone-feature-pack","consoleKitRequired":false,"hostOwns":["provider-neutral resources and resource states","policy grants and row-level action policy","semantic action callbacks and error reporting","controlled or default selection and routing state"],"discovery":"The standalone view performs no endpoint, _meta, introspection, session, or capability discovery.","state":"Use the feature pack controlled/default props and host state. The standalone surface does not impose Console Kit or Zustand.","authorizationBoundary":"Props describe the view the host may offer; provider policy, PostgreSQL privileges, and RLS remain authoritative.","consoleIntegration":"Install console-module-organizations when Console Kit should own Constructive discovery, routing, session, and adapters."},"runtimeContract":null,"registryDocumentation":"`feature-pack-organizations` installed a provider-neutral view and `.constructive/feature-packs/organizations.json`. Import from `@/blocks/feature-packs/organizations/organizations-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-organizations` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: When the active organization is missing or does not match the host-provided list, the view selects the first available organization. It never infers a principal, policy grant, or mutation authority; missing resources and callbacks stay unavailable, while PostgreSQL privileges and RLS remain authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/organizations/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/organizations.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-storage.json b/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-storage.json index 67bb9f1..d30596b 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-storage.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-storage.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"feature-pack-storage","surface":"standalone-feature-pack","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-storage","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"radio-group","title":"Radio Group","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-storage","title":"Storage Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","cn","dialog","dropdown-menu","field","input","radio-group","table","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["alert-dialog","scroll-area","dialog","dropdown-menu","separator","input","radio-group"]},{"name":"class-variance-authority","requiredBy":["alert","badge","button","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"lucide-react","requiredBy":["pack-foundation","dialog","dropdown-menu","feature-pack-storage"]},{"name":"tailwind-merge","requiredBy":["cn"]}],"devDependencies":[],"files":[{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/radio-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["radio-group"],"sources":[{"registryItem":"radio-group","path":"registry/constructive/ui/radio-group.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-feature-pack.tsx"}]},{"target":"~/.constructive/feature-packs/storage.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"storage","title":"Storage","description":"Policy-aware bucket navigation, uploads, downloads, and object deletion.","dependencies":[],"endpoints":{"required":[],"optional":["storage","admin","data"]},"capabilities":{"required":["storage.buckets","storage.files"],"optional":["storage.versioning","storage.content-hash","storage.custom-keys","storage.audit-log"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","storage"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":{"appliesTo":"standalone-feature-pack","consoleKitRequired":false,"hostOwns":["provider-neutral resources and resource states","policy grants and row-level action policy","semantic action callbacks and error reporting","controlled or default selection and routing state"],"discovery":"The standalone view performs no endpoint, _meta, introspection, session, or capability discovery.","state":"Use the feature pack controlled/default props and host state. The standalone surface does not impose Console Kit or Zustand.","authorizationBoundary":"Props describe the view the host may offer; provider policy, PostgreSQL privileges, and RLS remain authoritative.","consoleIntegration":"Install console-module-storage when Console Kit should own Constructive discovery, routing, session, and adapters."},"runtimeContract":null,"registryDocumentation":"`feature-pack-storage` installed a provider-neutral view and `.constructive/feature-packs/storage.json`. Import from `@/blocks/feature-packs/storage/storage-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-storage` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: An object endpoint alone does not prove bucket or file operations; incomplete and read-only contracts keep write controls hidden.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/storage/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/storage.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"feature-pack-storage","surface":"standalone-feature-pack","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-storage","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"radio-group","title":"Radio Group","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-storage","title":"Storage Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","cn","dialog","dropdown-menu","field","input","radio-group","table","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["alert-dialog","scroll-area","dialog","dropdown-menu","separator","input","radio-group"]},{"name":"class-variance-authority","requiredBy":["alert","badge","button","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"lucide-react","requiredBy":["pack-foundation","dialog","dropdown-menu","feature-pack-storage"]},{"name":"tailwind-merge","requiredBy":["cn"]}],"devDependencies":[],"files":[{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/radio-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["radio-group"],"sources":[{"registryItem":"radio-group","path":"registry/constructive/ui/radio-group.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-feature-pack.tsx"}]},{"target":"~/.constructive/feature-packs/storage.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"storage","title":"Storage","description":"Policy-aware bucket navigation, uploads, downloads, and object deletion.","dependencies":[],"endpoints":{"required":[],"optional":["storage","admin","data"]},"capabilities":{"required":["storage.buckets","storage.files"],"optional":["storage.versioning","storage.content-hash","storage.custom-keys","storage.audit-log"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","storage"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":{"appliesTo":"standalone-feature-pack","consoleKitRequired":false,"hostOwns":["provider-neutral resources and resource states","policy grants and row-level action policy","semantic action callbacks and error reporting","controlled or default selection and routing state"],"discovery":"The standalone view performs no endpoint, _meta, introspection, session, or capability discovery.","state":"Use the feature pack controlled/default props and host state. The standalone surface does not impose Console Kit or Zustand.","authorizationBoundary":"Props describe the view the host may offer; provider policy, PostgreSQL privileges, and RLS remain authoritative.","consoleIntegration":"Install console-module-storage when Console Kit should own Constructive discovery, routing, session, and adapters."},"runtimeContract":null,"registryDocumentation":"`feature-pack-storage` installed a provider-neutral view and `.constructive/feature-packs/storage.json`. Import from `@/blocks/feature-packs/storage/storage-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-storage` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: An object endpoint alone does not prove bucket or file operations; incomplete and read-only contracts keep write controls hidden.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/storage/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/storage.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-users.json b/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-users.json index 4506efc..2c9642e 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-users.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/feature-pack-users.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"feature-pack-users","surface":"standalone-feature-pack","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-users","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-users","title":"App access Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","checkbox","cn","dialog","dropdown-menu","empty","field","input","input-group","select","table","tabs","textarea","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["alert-dialog","avatar","checkbox","scroll-area","dialog","dropdown-menu","separator","input","select","tabs"]},{"name":"class-variance-authority","requiredBy":["alert","badge","button","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"lucide-react","requiredBy":["pack-foundation","dialog","dropdown-menu","input-group","select","feature-pack-users"]},{"name":"tailwind-merge","requiredBy":["cn"]}],"devDependencies":[],"files":[{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/users/users-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/users-feature-pack.tsx"}]},{"target":"~/.constructive/feature-packs/users.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"users","title":"App access","description":"Application member governance, lifecycle controls, profiles, permission grants, and invitations.","dependencies":[],"endpoints":{"required":["admin"],"optional":["auth"]},"capabilities":{"required":["users.directory","users.memberships"],"optional":["users.permissions","users.profiles","users.invites"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":{"appliesTo":"standalone-feature-pack","consoleKitRequired":false,"hostOwns":["provider-neutral resources and resource states","policy grants and row-level action policy","semantic action callbacks and error reporting","controlled or default selection and routing state"],"discovery":"The standalone view performs no endpoint, _meta, introspection, session, or capability discovery.","state":"Use the feature pack controlled/default props and host state. The standalone surface does not impose Console Kit or Zustand.","authorizationBoundary":"Props describe the view the host may offer; provider policy, PostgreSQL privileges, and RLS remain authoritative.","consoleIntegration":"Install console-module-users when Console Kit should own Constructive discovery, routing, session, and adapters."},"runtimeContract":null,"registryDocumentation":"`feature-pack-users` installed a provider-neutral view and `.constructive/feature-packs/users.json`. Import from `@/blocks/feature-packs/users/users-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-users` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: Missing resources or callbacks stay unavailable, while row policy, PostgreSQL privileges, RLS, and final-owner constraints decide mutations.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/users/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/users.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"feature-pack-users","surface":"standalone-feature-pack","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-users","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-users","title":"App access Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","checkbox","cn","dialog","dropdown-menu","empty","field","input","input-group","select","table","tabs","textarea","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["alert-dialog","avatar","checkbox","scroll-area","dialog","dropdown-menu","separator","input","select","tabs"]},{"name":"class-variance-authority","requiredBy":["alert","badge","button","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"lucide-react","requiredBy":["pack-foundation","dialog","dropdown-menu","input-group","select","feature-pack-users"]},{"name":"tailwind-merge","requiredBy":["cn"]}],"devDependencies":[],"files":[{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/users/users-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/users-feature-pack.tsx"}]},{"target":"~/.constructive/feature-packs/users.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"users","title":"App access","description":"Application member governance, lifecycle controls, profiles, permission grants, and invitations.","dependencies":[],"endpoints":{"required":["admin"],"optional":["auth"]},"capabilities":{"required":["users.directory","users.memberships"],"optional":["users.permissions","users.profiles","users.invites"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[],"standaloneContract":{"appliesTo":"standalone-feature-pack","consoleKitRequired":false,"hostOwns":["provider-neutral resources and resource states","policy grants and row-level action policy","semantic action callbacks and error reporting","controlled or default selection and routing state"],"discovery":"The standalone view performs no endpoint, _meta, introspection, session, or capability discovery.","state":"Use the feature pack controlled/default props and host state. The standalone surface does not impose Console Kit or Zustand.","authorizationBoundary":"Props describe the view the host may offer; provider policy, PostgreSQL privileges, and RLS remain authoritative.","consoleIntegration":"Install console-module-users when Console Kit should own Constructive discovery, routing, session, and adapters."},"runtimeContract":null,"registryDocumentation":"`feature-pack-users` installed a provider-neutral view and `.constructive/feature-packs/users.json`. Import from `@/blocks/feature-packs/users/users-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-users` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: Missing resources or callbacks stay unavailable, while row policy, PostgreSQL privileges, RLS, and final-owner constraints decide mutations.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/users/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/users.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/preset-auth-hardened.json b/.agents/skills/constructive-blocks/references/install-plans.v1/preset-auth-hardened.json index 07da488..79b92f5 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/preset-auth-hardened.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/preset-auth-hardened.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"preset-auth-hardened","surface":"preset","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/preset-auth-hardened","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"feature-pack-data","title":"Data Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","button","card","constructive-theme"]},{"name":"console-module-data","title":"Data Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-data","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-auth","title":"Authentication Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","card","checkbox","cn","field","input","input-group","separator","tabs","constructive-theme"]},{"name":"console-module-auth","title":"Authentication Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-auth","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-users","title":"App access Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","checkbox","cn","dialog","dropdown-menu","empty","field","input","input-group","select","table","tabs","textarea","constructive-theme"]},{"name":"console-module-users","title":"App access Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-users","console-feature-catalog","constructive-theme"]},{"name":"preset-auth-hardened","title":"Hardened Authentication Preset","type":"registry:block","directRegistryDependencies":["console-kit-core","console-module-data","console-module-auth","console-module-users","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","checkbox","tabs","scroll-area","dialog","select"]},{"name":"@constructive-io/data","requiredBy":["console-kit-core","feature-pack-data"]},{"name":"@constructive-io/sheets","requiredBy":["feature-pack-data"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","feature-pack-data","input-group","feature-pack-auth","dialog","select","feature-pack-users"]},{"name":"motion","requiredBy":["motion-config","sheet"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/auth-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/console-kit/constructive/auth-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/users-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/console-kit/constructive/users-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-account-view.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-account-view.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-challenge-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-challenge-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-console-module.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-contracts.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-entry-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-entry-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-password-policy.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-password-policy.ts"}]},{"target":"src/blocks/feature-packs/data/data-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-data"],"sources":[{"registryItem":"console-module-data","path":"registry/constructive/blocks/feature-packs/data/data-console-module.tsx"}]},{"target":"src/blocks/feature-packs/data/data-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/data-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/users/users-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/feature-packs/users/users-console-module.tsx"}]},{"target":"src/blocks/feature-packs/users/users-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/users-feature-pack.tsx"}]},{"target":"src/blocks/presets/auth-hardened-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["preset-auth-hardened"],"sources":[{"registryItem":"preset-auth-hardened","path":"registry/constructive/blocks/presets/auth-hardened-console-kit.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/auth-hardened.json","targetKind":"project-root","type":"registry:file","owners":["preset-auth-hardened"],"sources":[{"registryItem":"preset-auth-hardened","path":"registry/constructive/blocks/presets/auth-hardened.json"}]},{"target":"~/.constructive/feature-packs/auth.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/data.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/users.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"data","title":"Data","description":"Dynamic table exploration and CRUD surfaces driven by Constructive metadata and GraphQL introspection.","dependencies":[],"endpoints":{"required":["data"],"optional":[]},"capabilities":{"required":["data.meta","data.introspection"],"optional":["data.search","data.i18n","data.realtime"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","search","i18n","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"auth","title":"Authentication","description":"Consumer sign-in, account profile, password, and session-management surfaces.","dependencies":[],"endpoints":{"required":["auth"],"optional":[]},"capabilities":{"required":["auth.sessions","auth.credentials","auth.password"],"optional":["auth.email","auth.connected-accounts","auth.identity-providers","auth.passkeys","auth.phone","auth.devices"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"users","title":"App access","description":"Application member governance, lifecycle controls, profiles, permission grants, and invitations.","dependencies":[],"endpoints":{"required":["admin"],"optional":["auth"]},"capabilities":{"required":["users.directory","users.memberships"],"optional":["users.permissions","users.profiles","users.invites"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[{"schemaVersion":1,"id":"auth-hardened","presetSlug":"auth:hardened","title":"Hardened authentication","description":"Data, authentication, and user-management feature packs.","stability":"stable","featurePacks":["data","auth","users"]}],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`preset-auth-hardened` installed the stable `auth:hardened` composition: Data, Authentication, and App access. Render `AuthHardenedConsoleKit` with a secret-free tenant descriptor.\n\nDegraded states: each public endpoint and module fails closed independently, and PostgreSQL privileges and RLS remain authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/data.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/auth.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/users.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"preset-auth-hardened","surface":"preset","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/preset-auth-hardened","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"calendar-rac","title":"Calendar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"form-control","title":"Form Control","type":"registry:ui","directRegistryDependencies":["cn","slot","label","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"pagination","title":"Pagination","type":"registry:ui","directRegistryDependencies":["cn","button","constructive-theme"]},{"name":"progressive-blur","title":"Progressive Blur","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"toast","title":"Toast Notifications","type":"registry:block","directRegistryDependencies":["button","dialog","constructive-theme"]},{"name":"sheets","title":"Sheets","type":"registry:block","directRegistryDependencies":["alert-dialog","badge","button","calendar-rac","card","checkbox","collapsible","dropdown-menu","form-control","input","input-group","label","pagination","popover","progressive-blur","scroll-area","select","skeleton","tabs","textarea","toast","tooltip","constructive-theme"]},{"name":"feature-pack-data","title":"Data Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","sheets","alert","button","card","constructive-theme"]},{"name":"console-module-data","title":"Data Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-data","console-feature-catalog","console-runtime","sheets","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"feature-pack-auth","title":"Authentication Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","card","checkbox","cn","field","input","input-group","separator","tabs","constructive-theme"]},{"name":"console-module-auth","title":"Authentication Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-auth","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-users","title":"App access Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","checkbox","cn","dialog","dropdown-menu","empty","field","input","input-group","select","table","tabs","textarea","constructive-theme"]},{"name":"console-module-users","title":"App access Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-users","console-feature-catalog","constructive-theme"]},{"name":"preset-auth-hardened","title":"Hardened Authentication Preset","type":"registry:block","directRegistryDependencies":["console-kit-core","console-module-data","console-module-auth","console-module-users","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","checkbox","scroll-area","select","tabs","dialog"]},{"name":"@constructive-io/data@^0.5.0","requiredBy":["console-kit-core","sheets","feature-pack-data"]},{"name":"@internationalized/date","requiredBy":["calendar-rac","sheets"]},{"name":"@remixicon/react","requiredBy":["sheets"]},{"name":"@tanstack/react-form","requiredBy":["sheets"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core","sheets"]},{"name":"@tanstack/react-table@9.0.0-beta.58","requiredBy":["sheets"]},{"name":"@tanstack/react-virtual","requiredBy":["sheets"]},{"name":"@types/leaflet","requiredBy":["sheets"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn","sheets"]},{"name":"graphql","requiredBy":["console-kit-core","sheets"]},{"name":"inflekt","requiredBy":["sheets"]},{"name":"leaflet","requiredBy":["sheets"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","input-group","pagination","select","dialog","toast","sheets","feature-pack-data","feature-pack-auth","feature-pack-users"]},{"name":"motion","requiredBy":["motion-config","sheet","sheets"]},{"name":"react-aria-components","requiredBy":["calendar-rac","sheets"]},{"name":"react-leaflet","requiredBy":["sheets"]},{"name":"sonner","requiredBy":["toast"]},{"name":"tailwind-merge","requiredBy":["cn","sheets"]},{"name":"zod","requiredBy":["console-feature-catalog","sheets"]},{"name":"zustand","requiredBy":["console-kit-core","sheets"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/calendar-rac.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["calendar-rac"],"sources":[{"registryItem":"calendar-rac","path":"registry/constructive/ui/calendar-rac.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/form-control.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["form-control"],"sources":[{"registryItem":"form-control","path":"registry/constructive/ui/form-control.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/pagination.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["pagination"],"sources":[{"registryItem":"pagination","path":"registry/constructive/ui/pagination.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/progressive-blur.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["progressive-blur"],"sources":[{"registryItem":"progressive-blur","path":"registry/constructive/ui/progressive-blur.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sheets/adapter/postgraphile-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/postgraphile-adapter.ts"}]},{"target":"@ui/sheets/adapter/sheets-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/sheets-adapter.ts"}]},{"target":"@ui/sheets/adapter/use-sheets-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/use-sheets-adapter.ts"}]},{"target":"@ui/sheets/advanced.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/advanced.ts"}]},{"target":"@ui/sheets/auth/auth-execute.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-execute.ts"}]},{"target":"@ui/sheets/auth/auth-gate.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-gate.tsx"}]},{"target":"@ui/sheets/auth/auth-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-types.ts"}]},{"target":"@ui/sheets/auth/hooks/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/index.ts"}]},{"target":"@ui/sheets/auth/hooks/use-forgot-password.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-forgot-password.ts"}]},{"target":"@ui/sheets/auth/hooks/use-login.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-login.ts"}]},{"target":"@ui/sheets/auth/hooks/use-register.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-register.ts"}]},{"target":"@ui/sheets/auth/hooks/use-reset-password.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-reset-password.ts"}]},{"target":"@ui/sheets/auth/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/index.ts"}]},{"target":"@ui/sheets/auth/ui/auth-error-alert.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-error-alert.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-loading-button.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-loading-button.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-screen-header.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-screen-header.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-screen-layout.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-screen-layout.tsx"}]},{"target":"@ui/sheets/auth/ui/forgot-password-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/forgot-password-form.tsx"}]},{"target":"@ui/sheets/auth/ui/form-field.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/form-field.tsx"}]},{"target":"@ui/sheets/auth/ui/login-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/login-form.tsx"}]},{"target":"@ui/sheets/auth/ui/password-strength.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/password-strength.tsx"}]},{"target":"@ui/sheets/auth/ui/register-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/register-form.tsx"}]},{"target":"@ui/sheets/auth/ui/reset-password-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/reset-password-form.tsx"}]},{"target":"@ui/sheets/auth/utils/auth-errors.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/auth-errors.ts"}]},{"target":"@ui/sheets/auth/utils/schemas.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/schemas.ts"}]},{"target":"@ui/sheets/auth/utils/token-store.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/token-store.ts"}]},{"target":"@ui/sheets/auth/utils/validators.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/validators.ts"}]},{"target":"@ui/sheets/cell-model/badge-tones.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/badge-tones.ts"}]},{"target":"@ui/sheets/cell-model/cell-props.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/cell-props.ts"}]},{"target":"@ui/sheets/cell-model/cell-slots.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/cell-slots.ts"}]},{"target":"@ui/sheets/cell-model/create-sheets-cell.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/create-sheets-cell.ts"}]},{"target":"@ui/sheets/cell-model/factories/badges.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/badges.ts"}]},{"target":"@ui/sheets/cell-model/factories/boolean.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/boolean.ts"}]},{"target":"@ui/sheets/cell-model/factories/datetime.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/datetime.ts"}]},{"target":"@ui/sheets/cell-model/factories/geometry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/geometry.ts"}]},{"target":"@ui/sheets/cell-model/factories/image.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/image.ts"}]},{"target":"@ui/sheets/cell-model/factories/interval.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/interval.ts"}]},{"target":"@ui/sheets/cell-model/factories/number.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/number.ts"}]},{"target":"@ui/sheets/cell-model/factories/relation.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/relation.ts"}]},{"target":"@ui/sheets/cell-model/factories/text.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/text.ts"}]},{"target":"@ui/sheets/cell-model/factories/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/types.ts"}]},{"target":"@ui/sheets/cell-model/factories/uri.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/uri.ts"}]},{"target":"@ui/sheets/cell-model/image-cache.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/image-cache.ts"}]},{"target":"@ui/sheets/cell-model/sheets-cell.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/sheets-cell.ts"}]},{"target":"@ui/sheets/cell-model/views/badges-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/badges-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/boolean-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/boolean-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/datetime-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/datetime-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/draft-action-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/draft-action-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/geometry-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/geometry-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/image-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/image-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/interval-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/interval-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/loading-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/loading-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/number-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/number-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/relation-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/relation-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/text-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/text-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/uri-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/uri-view.tsx"}]},{"target":"@ui/sheets/cell-types/cell-registry-defaults.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-registry-defaults.ts"}]},{"target":"@ui/sheets/cell-types/cell-registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-registry.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-groups.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-groups.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-registry.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-resolver.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-resolver.ts"}]},{"target":"@ui/sheets/cell-types/define-cell-type.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/define-cell-type.ts"}]},{"target":"@ui/sheets/cell-types/type-mapping.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/type-mapping.ts"}]},{"target":"@ui/sheets/cell-types/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/types.ts"}]},{"target":"@ui/sheets/commands/context.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/context.ts"}]},{"target":"@ui/sheets/commands/dispatch.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/dispatch.ts"}]},{"target":"@ui/sheets/commands/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/index.ts"}]},{"target":"@ui/sheets/commands/keybinding.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/keybinding.ts"}]},{"target":"@ui/sheets/commands/keymap.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/keymap.ts"}]},{"target":"@ui/sheets/commands/registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/registry.ts"}]},{"target":"@ui/sheets/commands/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/types.ts"}]},{"target":"@ui/sheets/config/sheets-concurrency.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/config/sheets-concurrency.ts"}]},{"target":"@ui/sheets/context/sheets-context.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-context.ts"}]},{"target":"@ui/sheets/context/sheets-execute.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-execute.ts"}]},{"target":"@ui/sheets/context/sheets-provider.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-provider.tsx"}]},{"target":"@ui/sheets/context/sheets-upload-presigned.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-upload-presigned.ts"}]},{"target":"@ui/sheets/forms/form-spec-builder.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/form-spec-builder.ts"}]},{"target":"@ui/sheets/forms/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/index.ts"}]},{"target":"@ui/sheets/forms/metadata-hash.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/metadata-hash.ts"}]},{"target":"@ui/sheets/forms/mutations.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/mutations.ts"}]},{"target":"@ui/sheets/forms/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/types.ts"}]},{"target":"@ui/sheets/forms/zod-schema.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/zod-schema.ts"}]},{"target":"@ui/sheets/grid-dom/editors/array-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/array-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/date-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/date-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/edit-intent.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/edit-intent.ts"}]},{"target":"@ui/sheets/grid-dom/editors/editor-props.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/editor-props.ts"}]},{"target":"@ui/sheets/grid-dom/editors/editor-registry-dom.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/editor-registry-dom.ts"}]},{"target":"@ui/sheets/grid-dom/editors/geometry-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/geometry-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/image-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/image-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/inet-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/inet-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/interval-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/interval-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/json-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/json-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/number-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/number-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/relation-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/relation-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/text-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/text-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/tsvector-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/tsvector-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/upload-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/upload-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/url-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/url-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/inline-cell-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/inline-cell-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/overlay/overlay-manager.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/overlay/overlay-manager.tsx"}]},{"target":"@ui/sheets/grid-dom/overlay/use-overlay-controller.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/overlay/use-overlay-controller.ts"}]},{"target":"@ui/sheets/grid-dom/sheets-cell-host.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/sheets-cell-host.tsx"}]},{"target":"@ui/sheets/grid-dom/use-sheets-content.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/use-sheets-content.ts"}]},{"target":"@ui/sheets/grid/cell-routing.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/cell-routing.ts"}]},{"target":"@ui/sheets/grid/draft-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/draft-types.ts"}]},{"target":"@ui/sheets/grid/editors/array-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/array-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/date-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/date-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/editor-focus-trap.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/editor-focus-trap.tsx"}]},{"target":"@ui/sheets/grid/editors/geometry-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/geometry-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/image-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/image-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/inet-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/inet-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/interval-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/interval-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/json-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/json-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/overlay-presets.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/overlay-presets.ts"}]},{"target":"@ui/sheets/grid/editors/overlay-viewport-guard.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/overlay-viewport-guard.tsx"}]},{"target":"@ui/sheets/grid/editors/relation-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/relation-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/relation-record-tooltip.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/relation-record-tooltip.tsx"}]},{"target":"@ui/sheets/grid/editors/tsvector-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/tsvector-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/upload-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/upload-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/url-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/url-editor.tsx"}]},{"target":"@ui/sheets/grid/feedback/dock-status-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/dock-status-bar.tsx"}]},{"target":"@ui/sheets/grid/feedback/editor-error-boundary.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/editor-error-boundary.tsx"}]},{"target":"@ui/sheets/grid/feedback/feedback-context.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/feedback-context.tsx"}]},{"target":"@ui/sheets/grid/feedback/feedback-reducer.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/feedback-reducer.ts"}]},{"target":"@ui/sheets/grid/feedback/floating-status.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/floating-status.tsx"}]},{"target":"@ui/sheets/grid/feedback/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/index.ts"}]},{"target":"@ui/sheets/grid/feedback/sheets-error-boundary.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/sheets-error-boundary.tsx"}]},{"target":"@ui/sheets/grid/feedback/sheets-error-state.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/sheets-error-state.tsx"}]},{"target":"@ui/sheets/grid/filter-operators.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/filter-operators.ts"}]},{"target":"@ui/sheets/grid/grid-cell-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/grid-cell-types.ts"}]},{"target":"@ui/sheets/grid/hooks/use-batch-commit.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-batch-commit.ts"}]},{"target":"@ui/sheets/grid/hooks/use-cell-editing.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-cell-editing.ts"}]},{"target":"@ui/sheets/grid/hooks/use-draft-rows.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-draft-rows.ts"}]},{"target":"@ui/sheets/grid/hooks/use-draft-submission.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-draft-submission.ts"}]},{"target":"@ui/sheets/grid/hooks/use-filter-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-filter-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-operations.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-operations.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-selection.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-selection.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-state.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-state.ts"}]},{"target":"@ui/sheets/grid/hooks/use-infinite-grid-data.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-infinite-grid-data.ts"}]},{"target":"@ui/sheets/grid/hooks/use-load-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-load-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-paginate-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-paginate-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-undo-redo.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-undo-redo.ts"}]},{"target":"@ui/sheets/grid/row-model.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/row-model.ts"}]},{"target":"@ui/sheets/grid/sheets.constants.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.constants.ts"}]},{"target":"@ui/sheets/grid/sheets.context-menu.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.context-menu.tsx"}]},{"target":"@ui/sheets/grid/sheets.controls.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.controls.tsx"}]},{"target":"@ui/sheets/grid/sheets.formatters.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.formatters.ts"}]},{"target":"@ui/sheets/grid/sheets.pagination.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.pagination.tsx"}]},{"target":"@ui/sheets/grid/sheets.table-selector.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.table-selector.tsx"}]},{"target":"@ui/sheets/grid/sheets.theme.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.theme.ts"}]},{"target":"@ui/sheets/grid/sheets.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.tsx"}]},{"target":"@ui/sheets/grid/sheets.types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.types.ts"}]},{"target":"@ui/sheets/grid/sheets.utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.utils.ts"}]},{"target":"@ui/sheets/grid/use-sheets.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/use-sheets.ts"}]},{"target":"@ui/sheets/hooks/orderby-enum-resolution.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/orderby-enum-resolution.ts"}]},{"target":"@ui/sheets/hooks/query-keys.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/query-keys.ts"}]},{"target":"@ui/sheets/hooks/relation-field-resolution.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/relation-field-resolution.ts"}]},{"target":"@ui/sheets/hooks/use-relation-columns.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-relation-columns.ts"}]},{"target":"@ui/sheets/hooks/use-relation-metadata-cache.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-relation-metadata-cache.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-infinite-table.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-infinite-table.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-meta.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-meta.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-table-cursor.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-table-cursor.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-table.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-table.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-upload.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-upload.ts"}]},{"target":"@ui/sheets/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/index.ts"}]},{"target":"@ui/sheets/row-identity.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/row-identity.ts"}]},{"target":"@ui/sheets/selection/cell-extract.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/cell-extract.ts"}]},{"target":"@ui/sheets/selection/fill.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/fill.ts"}]},{"target":"@ui/sheets/selection/range-set.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/range-set.ts"}]},{"target":"@ui/sheets/selection/selection-model.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/selection-model.ts"}]},{"target":"@ui/sheets/selection/tsv.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/tsv.ts"}]},{"target":"@ui/sheets/store/draft-rows-slice.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/draft-rows-slice.ts"}]},{"target":"@ui/sheets/store/relation-info-slice.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/relation-info-slice.ts"}]},{"target":"@ui/sheets/store/sheets-store.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/sheets-store.ts"}]},{"target":"@ui/sheets/table/features.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/features.ts"}]},{"target":"@ui/sheets/table/grid-viewport.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/grid-viewport.tsx"}]},{"target":"@ui/sheets/table/use-sheets-table-instance.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/use-sheets-table-instance.ts"}]},{"target":"@ui/sheets/utils/cn.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/cn.ts"}]},{"target":"@ui/sheets/utils/file.utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/file.utils.ts"}]},{"target":"@ui/sheets/utils/image-with-fallback.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/image-with-fallback.tsx"}]},{"target":"@ui/sheets/utils/map-picker.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/map-picker.tsx"}]},{"target":"@ui/sheets/utils/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/motion-config.ts"}]},{"target":"@ui/sheets/utils/relation-utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/relation-utils.ts"}]},{"target":"@ui/sheets/utils/sheets-i18n.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/sheets-i18n.ts"}]},{"target":"@ui/sheets/utils/sheets-logger.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/sheets-logger.ts"}]},{"target":"@ui/sheets/utils/use-color-scheme.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-color-scheme.ts"}]},{"target":"@ui/sheets/utils/use-image-status.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-image-status.ts"}]},{"target":"@ui/sheets/utils/use-resize-observer.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-resize-observer.ts"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/toast/index.ts","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/index.ts"}]},{"target":"@ui/toast/toast-error.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-error.tsx"}]},{"target":"@ui/toast/toast-info.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-info.tsx"}]},{"target":"@ui/toast/toast-success.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-success.tsx"}]},{"target":"@ui/toast/toast-warning.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-warning.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/auth-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/console-kit/constructive/auth-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/users-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/console-kit/constructive/users-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-account-view.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-account-view.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-challenge-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-challenge-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-console-module.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-contracts.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-entry-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-entry-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-password-policy.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-password-policy.ts"}]},{"target":"src/blocks/feature-packs/data/data-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-data"],"sources":[{"registryItem":"console-module-data","path":"registry/constructive/blocks/feature-packs/data/data-console-module.tsx"}]},{"target":"src/blocks/feature-packs/data/data-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/data-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/users/users-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/feature-packs/users/users-console-module.tsx"}]},{"target":"src/blocks/feature-packs/users/users-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/users-feature-pack.tsx"}]},{"target":"src/blocks/presets/auth-hardened-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["preset-auth-hardened"],"sources":[{"registryItem":"preset-auth-hardened","path":"registry/constructive/blocks/presets/auth-hardened-console-kit.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/auth-hardened.json","targetKind":"project-root","type":"registry:file","owners":["preset-auth-hardened"],"sources":[{"registryItem":"preset-auth-hardened","path":"registry/constructive/blocks/presets/auth-hardened.json"}]},{"target":"~/.constructive/feature-packs/auth.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/data.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/users.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"data","title":"Data","description":"Dynamic table exploration and CRUD surfaces driven by Constructive metadata and GraphQL introspection.","dependencies":[],"endpoints":{"required":["data"],"optional":[]},"capabilities":{"required":["data.meta","data.introspection"],"optional":["data.search","data.i18n","data.realtime"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","search","i18n","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"auth","title":"Authentication","description":"Consumer sign-in, account profile, password, and session-management surfaces.","dependencies":[],"endpoints":{"required":["auth"],"optional":[]},"capabilities":{"required":["auth.sessions","auth.credentials","auth.password"],"optional":["auth.email","auth.connected-accounts","auth.identity-providers","auth.passkeys","auth.phone","auth.devices"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"users","title":"App access","description":"Application member governance, lifecycle controls, profiles, permission grants, and invitations.","dependencies":[],"endpoints":{"required":["admin"],"optional":["auth"]},"capabilities":{"required":["users.directory","users.memberships"],"optional":["users.permissions","users.profiles","users.invites"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[{"schemaVersion":1,"id":"auth-hardened","presetSlug":"auth:hardened","title":"Hardened authentication","description":"Data, authentication, and user-management feature packs.","stability":"stable","featurePacks":["data","auth","users"]}],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`preset-auth-hardened` installed the stable `auth:hardened` composition: Data, Authentication, and App access. Render `AuthHardenedConsoleKit` with a secret-free tenant descriptor.\n\nDegraded states: each public endpoint and module fails closed independently, and PostgreSQL privileges and RLS remain authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/data.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/auth.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/users.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/preset-b2b-storage.json b/.agents/skills/constructive-blocks/references/install-plans.v1/preset-b2b-storage.json index 4e28f6f..05e1c2a 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/preset-b2b-storage.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/preset-b2b-storage.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"preset-b2b-storage","surface":"preset","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/preset-b2b-storage","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"feature-pack-data","title":"Data Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","button","card","constructive-theme"]},{"name":"console-module-data","title":"Data Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-data","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-auth","title":"Authentication Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","card","checkbox","cn","field","input","input-group","separator","tabs","constructive-theme"]},{"name":"console-module-auth","title":"Authentication Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-auth","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-users","title":"App access Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","checkbox","cn","dialog","dropdown-menu","empty","field","input","input-group","select","table","tabs","textarea","constructive-theme"]},{"name":"console-module-users","title":"App access Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-users","console-feature-catalog","constructive-theme"]},{"name":"switch","title":"Switch","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-organizations","title":"Organizations Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert-dialog","avatar","badge","button","card","checkbox","cn","dialog","dropdown-menu","empty","field","input","select","switch","table","tabs","textarea","constructive-theme"]},{"name":"console-module-organizations","title":"Organizations Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-organizations","console-feature-catalog","console-runtime","pack-foundation","constructive-theme"]},{"name":"radio-group","title":"Radio Group","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-storage","title":"Storage Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","cn","dialog","dropdown-menu","field","input","radio-group","table","constructive-theme"]},{"name":"console-module-storage","title":"Storage Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-storage","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"preset-b2b-storage","title":"B2B with Storage Preset","type":"registry:block","directRegistryDependencies":["console-kit-core","console-module-data","console-module-auth","console-module-users","console-module-organizations","console-module-storage","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","checkbox","tabs","scroll-area","dialog","select","switch","radio-group"]},{"name":"@constructive-io/data","requiredBy":["console-kit-core","feature-pack-data"]},{"name":"@constructive-io/sheets","requiredBy":["feature-pack-data"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","feature-pack-data","input-group","feature-pack-auth","dialog","select","feature-pack-users","feature-pack-organizations","feature-pack-storage"]},{"name":"motion","requiredBy":["motion-config","sheet"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/radio-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["radio-group"],"sources":[{"registryItem":"radio-group","path":"registry/constructive/ui/radio-group.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/switch.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["switch"],"sources":[{"registryItem":"switch","path":"registry/constructive/ui/switch.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/auth-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/console-kit/constructive/auth-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/organizations-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/console-kit/constructive/organizations-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/storage-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/console-kit/constructive/storage-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/users-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/console-kit/constructive/users-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-account-view.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-account-view.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-challenge-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-challenge-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-console-module.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-contracts.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-entry-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-entry-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-password-policy.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-password-policy.ts"}]},{"target":"src/blocks/feature-packs/data/data-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-data"],"sources":[{"registryItem":"console-module-data","path":"registry/constructive/blocks/feature-packs/data/data-console-module.tsx"}]},{"target":"src/blocks/feature-packs/data/data-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/data-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-access-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-access-panels.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-console-module.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-contracts.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-meta-contract.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-operation-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-operation-panels.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-module.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-slice.ts"}]},{"target":"src/blocks/feature-packs/storage/storage-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-meta-contract.ts"}]},{"target":"src/blocks/feature-packs/users/users-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/feature-packs/users/users-console-module.tsx"}]},{"target":"src/blocks/feature-packs/users/users-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/users-feature-pack.tsx"}]},{"target":"src/blocks/presets/b2b-storage-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["preset-b2b-storage"],"sources":[{"registryItem":"preset-b2b-storage","path":"registry/constructive/blocks/presets/b2b-storage-console-kit.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/auth.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/b2b-storage.json","targetKind":"project-root","type":"registry:file","owners":["preset-b2b-storage"],"sources":[{"registryItem":"preset-b2b-storage","path":"registry/constructive/blocks/presets/b2b-storage.json"}]},{"target":"~/.constructive/feature-packs/data.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/organizations.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/storage.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/users.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"data","title":"Data","description":"Dynamic table exploration and CRUD surfaces driven by Constructive metadata and GraphQL introspection.","dependencies":[],"endpoints":{"required":["data"],"optional":[]},"capabilities":{"required":["data.meta","data.introspection"],"optional":["data.search","data.i18n","data.realtime"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","search","i18n","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"auth","title":"Authentication","description":"Consumer sign-in, account profile, password, and session-management surfaces.","dependencies":[],"endpoints":{"required":["auth"],"optional":[]},"capabilities":{"required":["auth.sessions","auth.credentials","auth.password"],"optional":["auth.email","auth.connected-accounts","auth.identity-providers","auth.passkeys","auth.phone","auth.devices"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"users","title":"App access","description":"Application member governance, lifecycle controls, profiles, permission grants, and invitations.","dependencies":[],"endpoints":{"required":["admin"],"optional":["auth"]},"capabilities":{"required":["users.directory","users.memberships"],"optional":["users.permissions","users.profiles","users.invites"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"organizations","title":"Organizations","description":"Tenant membership governance, invitations, access policy, hierarchy, settings, and developer credentials.","dependencies":[],"endpoints":{"required":[],"optional":["admin","auth","billing","data"]},"capabilities":{"required":["organizations.memberships"],"optional":["organizations.permissions","organizations.limits","organizations.profiles","organizations.hierarchy","organizations.invites"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"storage","title":"Storage","description":"Policy-aware bucket navigation, uploads, downloads, and object deletion.","dependencies":[],"endpoints":{"required":[],"optional":["storage","admin","data"]},"capabilities":{"required":["storage.buckets","storage.files"],"optional":["storage.versioning","storage.content-hash","storage.custom-keys","storage.audit-log"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","storage"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[{"schemaVersion":1,"id":"b2b-storage","presetSlug":"b2b:storage","title":"B2B with storage","description":"Data, authentication, users, organizations, and storage feature packs.","stability":"stable","featurePacks":["data","auth","users","organizations","storage"]}],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`preset-b2b-storage` installed the stable `b2b:storage` composition: Data, Authentication, App access, Organizations, and Storage. Render `B2BStorageConsoleKit` with a secret-free tenant descriptor.\n\nDegraded states: stock Storage can remain unavailable when no supported public bucket and file contract is routed; other proven modules continue independently.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/data.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/auth.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/users.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/organizations.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/storage.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"preset-b2b-storage","surface":"preset","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/preset-b2b-storage","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"calendar-rac","title":"Calendar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"form-control","title":"Form Control","type":"registry:ui","directRegistryDependencies":["cn","slot","label","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"pagination","title":"Pagination","type":"registry:ui","directRegistryDependencies":["cn","button","constructive-theme"]},{"name":"progressive-blur","title":"Progressive Blur","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"toast","title":"Toast Notifications","type":"registry:block","directRegistryDependencies":["button","dialog","constructive-theme"]},{"name":"sheets","title":"Sheets","type":"registry:block","directRegistryDependencies":["alert-dialog","badge","button","calendar-rac","card","checkbox","collapsible","dropdown-menu","form-control","input","input-group","label","pagination","popover","progressive-blur","scroll-area","select","skeleton","tabs","textarea","toast","tooltip","constructive-theme"]},{"name":"feature-pack-data","title":"Data Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","sheets","alert","button","card","constructive-theme"]},{"name":"console-module-data","title":"Data Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-data","console-feature-catalog","console-runtime","sheets","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"feature-pack-auth","title":"Authentication Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","card","checkbox","cn","field","input","input-group","separator","tabs","constructive-theme"]},{"name":"console-module-auth","title":"Authentication Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-auth","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-users","title":"App access Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","checkbox","cn","dialog","dropdown-menu","empty","field","input","input-group","select","table","tabs","textarea","constructive-theme"]},{"name":"console-module-users","title":"App access Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-users","console-feature-catalog","constructive-theme"]},{"name":"switch","title":"Switch","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-organizations","title":"Organizations Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert-dialog","avatar","badge","button","card","checkbox","cn","dialog","dropdown-menu","empty","field","input","select","switch","table","tabs","textarea","constructive-theme"]},{"name":"console-module-organizations","title":"Organizations Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-organizations","console-feature-catalog","console-runtime","pack-foundation","constructive-theme"]},{"name":"radio-group","title":"Radio Group","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-storage","title":"Storage Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","cn","dialog","dropdown-menu","field","input","radio-group","table","constructive-theme"]},{"name":"console-module-storage","title":"Storage Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-storage","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"preset-b2b-storage","title":"B2B with Storage Preset","type":"registry:block","directRegistryDependencies":["console-kit-core","console-module-data","console-module-auth","console-module-users","console-module-organizations","console-module-storage","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","checkbox","scroll-area","select","tabs","dialog","switch","radio-group"]},{"name":"@constructive-io/data@^0.5.0","requiredBy":["console-kit-core","sheets","feature-pack-data"]},{"name":"@internationalized/date","requiredBy":["calendar-rac","sheets"]},{"name":"@remixicon/react","requiredBy":["sheets"]},{"name":"@tanstack/react-form","requiredBy":["sheets"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core","sheets"]},{"name":"@tanstack/react-table@9.0.0-beta.58","requiredBy":["sheets"]},{"name":"@tanstack/react-virtual","requiredBy":["sheets"]},{"name":"@types/leaflet","requiredBy":["sheets"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn","sheets"]},{"name":"graphql","requiredBy":["console-kit-core","sheets"]},{"name":"inflekt","requiredBy":["sheets"]},{"name":"leaflet","requiredBy":["sheets"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","input-group","pagination","select","dialog","toast","sheets","feature-pack-data","feature-pack-auth","feature-pack-users","feature-pack-organizations","feature-pack-storage"]},{"name":"motion","requiredBy":["motion-config","sheet","sheets"]},{"name":"react-aria-components","requiredBy":["calendar-rac","sheets"]},{"name":"react-leaflet","requiredBy":["sheets"]},{"name":"sonner","requiredBy":["toast"]},{"name":"tailwind-merge","requiredBy":["cn","sheets"]},{"name":"zod","requiredBy":["console-feature-catalog","sheets"]},{"name":"zustand","requiredBy":["console-kit-core","sheets"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/calendar-rac.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["calendar-rac"],"sources":[{"registryItem":"calendar-rac","path":"registry/constructive/ui/calendar-rac.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/form-control.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["form-control"],"sources":[{"registryItem":"form-control","path":"registry/constructive/ui/form-control.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/pagination.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["pagination"],"sources":[{"registryItem":"pagination","path":"registry/constructive/ui/pagination.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/progressive-blur.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["progressive-blur"],"sources":[{"registryItem":"progressive-blur","path":"registry/constructive/ui/progressive-blur.tsx"}]},{"target":"@ui/radio-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["radio-group"],"sources":[{"registryItem":"radio-group","path":"registry/constructive/ui/radio-group.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sheets/adapter/postgraphile-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/postgraphile-adapter.ts"}]},{"target":"@ui/sheets/adapter/sheets-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/sheets-adapter.ts"}]},{"target":"@ui/sheets/adapter/use-sheets-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/use-sheets-adapter.ts"}]},{"target":"@ui/sheets/advanced.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/advanced.ts"}]},{"target":"@ui/sheets/auth/auth-execute.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-execute.ts"}]},{"target":"@ui/sheets/auth/auth-gate.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-gate.tsx"}]},{"target":"@ui/sheets/auth/auth-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-types.ts"}]},{"target":"@ui/sheets/auth/hooks/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/index.ts"}]},{"target":"@ui/sheets/auth/hooks/use-forgot-password.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-forgot-password.ts"}]},{"target":"@ui/sheets/auth/hooks/use-login.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-login.ts"}]},{"target":"@ui/sheets/auth/hooks/use-register.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-register.ts"}]},{"target":"@ui/sheets/auth/hooks/use-reset-password.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-reset-password.ts"}]},{"target":"@ui/sheets/auth/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/index.ts"}]},{"target":"@ui/sheets/auth/ui/auth-error-alert.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-error-alert.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-loading-button.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-loading-button.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-screen-header.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-screen-header.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-screen-layout.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-screen-layout.tsx"}]},{"target":"@ui/sheets/auth/ui/forgot-password-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/forgot-password-form.tsx"}]},{"target":"@ui/sheets/auth/ui/form-field.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/form-field.tsx"}]},{"target":"@ui/sheets/auth/ui/login-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/login-form.tsx"}]},{"target":"@ui/sheets/auth/ui/password-strength.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/password-strength.tsx"}]},{"target":"@ui/sheets/auth/ui/register-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/register-form.tsx"}]},{"target":"@ui/sheets/auth/ui/reset-password-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/reset-password-form.tsx"}]},{"target":"@ui/sheets/auth/utils/auth-errors.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/auth-errors.ts"}]},{"target":"@ui/sheets/auth/utils/schemas.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/schemas.ts"}]},{"target":"@ui/sheets/auth/utils/token-store.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/token-store.ts"}]},{"target":"@ui/sheets/auth/utils/validators.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/validators.ts"}]},{"target":"@ui/sheets/cell-model/badge-tones.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/badge-tones.ts"}]},{"target":"@ui/sheets/cell-model/cell-props.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/cell-props.ts"}]},{"target":"@ui/sheets/cell-model/cell-slots.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/cell-slots.ts"}]},{"target":"@ui/sheets/cell-model/create-sheets-cell.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/create-sheets-cell.ts"}]},{"target":"@ui/sheets/cell-model/factories/badges.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/badges.ts"}]},{"target":"@ui/sheets/cell-model/factories/boolean.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/boolean.ts"}]},{"target":"@ui/sheets/cell-model/factories/datetime.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/datetime.ts"}]},{"target":"@ui/sheets/cell-model/factories/geometry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/geometry.ts"}]},{"target":"@ui/sheets/cell-model/factories/image.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/image.ts"}]},{"target":"@ui/sheets/cell-model/factories/interval.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/interval.ts"}]},{"target":"@ui/sheets/cell-model/factories/number.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/number.ts"}]},{"target":"@ui/sheets/cell-model/factories/relation.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/relation.ts"}]},{"target":"@ui/sheets/cell-model/factories/text.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/text.ts"}]},{"target":"@ui/sheets/cell-model/factories/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/types.ts"}]},{"target":"@ui/sheets/cell-model/factories/uri.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/uri.ts"}]},{"target":"@ui/sheets/cell-model/image-cache.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/image-cache.ts"}]},{"target":"@ui/sheets/cell-model/sheets-cell.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/sheets-cell.ts"}]},{"target":"@ui/sheets/cell-model/views/badges-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/badges-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/boolean-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/boolean-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/datetime-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/datetime-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/draft-action-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/draft-action-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/geometry-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/geometry-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/image-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/image-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/interval-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/interval-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/loading-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/loading-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/number-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/number-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/relation-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/relation-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/text-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/text-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/uri-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/uri-view.tsx"}]},{"target":"@ui/sheets/cell-types/cell-registry-defaults.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-registry-defaults.ts"}]},{"target":"@ui/sheets/cell-types/cell-registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-registry.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-groups.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-groups.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-registry.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-resolver.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-resolver.ts"}]},{"target":"@ui/sheets/cell-types/define-cell-type.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/define-cell-type.ts"}]},{"target":"@ui/sheets/cell-types/type-mapping.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/type-mapping.ts"}]},{"target":"@ui/sheets/cell-types/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/types.ts"}]},{"target":"@ui/sheets/commands/context.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/context.ts"}]},{"target":"@ui/sheets/commands/dispatch.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/dispatch.ts"}]},{"target":"@ui/sheets/commands/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/index.ts"}]},{"target":"@ui/sheets/commands/keybinding.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/keybinding.ts"}]},{"target":"@ui/sheets/commands/keymap.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/keymap.ts"}]},{"target":"@ui/sheets/commands/registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/registry.ts"}]},{"target":"@ui/sheets/commands/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/types.ts"}]},{"target":"@ui/sheets/config/sheets-concurrency.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/config/sheets-concurrency.ts"}]},{"target":"@ui/sheets/context/sheets-context.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-context.ts"}]},{"target":"@ui/sheets/context/sheets-execute.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-execute.ts"}]},{"target":"@ui/sheets/context/sheets-provider.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-provider.tsx"}]},{"target":"@ui/sheets/context/sheets-upload-presigned.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-upload-presigned.ts"}]},{"target":"@ui/sheets/forms/form-spec-builder.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/form-spec-builder.ts"}]},{"target":"@ui/sheets/forms/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/index.ts"}]},{"target":"@ui/sheets/forms/metadata-hash.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/metadata-hash.ts"}]},{"target":"@ui/sheets/forms/mutations.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/mutations.ts"}]},{"target":"@ui/sheets/forms/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/types.ts"}]},{"target":"@ui/sheets/forms/zod-schema.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/zod-schema.ts"}]},{"target":"@ui/sheets/grid-dom/editors/array-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/array-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/date-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/date-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/edit-intent.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/edit-intent.ts"}]},{"target":"@ui/sheets/grid-dom/editors/editor-props.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/editor-props.ts"}]},{"target":"@ui/sheets/grid-dom/editors/editor-registry-dom.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/editor-registry-dom.ts"}]},{"target":"@ui/sheets/grid-dom/editors/geometry-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/geometry-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/image-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/image-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/inet-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/inet-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/interval-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/interval-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/json-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/json-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/number-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/number-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/relation-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/relation-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/text-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/text-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/tsvector-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/tsvector-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/upload-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/upload-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/url-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/url-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/inline-cell-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/inline-cell-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/overlay/overlay-manager.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/overlay/overlay-manager.tsx"}]},{"target":"@ui/sheets/grid-dom/overlay/use-overlay-controller.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/overlay/use-overlay-controller.ts"}]},{"target":"@ui/sheets/grid-dom/sheets-cell-host.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/sheets-cell-host.tsx"}]},{"target":"@ui/sheets/grid-dom/use-sheets-content.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/use-sheets-content.ts"}]},{"target":"@ui/sheets/grid/cell-routing.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/cell-routing.ts"}]},{"target":"@ui/sheets/grid/draft-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/draft-types.ts"}]},{"target":"@ui/sheets/grid/editors/array-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/array-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/date-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/date-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/editor-focus-trap.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/editor-focus-trap.tsx"}]},{"target":"@ui/sheets/grid/editors/geometry-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/geometry-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/image-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/image-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/inet-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/inet-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/interval-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/interval-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/json-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/json-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/overlay-presets.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/overlay-presets.ts"}]},{"target":"@ui/sheets/grid/editors/overlay-viewport-guard.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/overlay-viewport-guard.tsx"}]},{"target":"@ui/sheets/grid/editors/relation-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/relation-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/relation-record-tooltip.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/relation-record-tooltip.tsx"}]},{"target":"@ui/sheets/grid/editors/tsvector-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/tsvector-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/upload-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/upload-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/url-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/url-editor.tsx"}]},{"target":"@ui/sheets/grid/feedback/dock-status-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/dock-status-bar.tsx"}]},{"target":"@ui/sheets/grid/feedback/editor-error-boundary.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/editor-error-boundary.tsx"}]},{"target":"@ui/sheets/grid/feedback/feedback-context.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/feedback-context.tsx"}]},{"target":"@ui/sheets/grid/feedback/feedback-reducer.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/feedback-reducer.ts"}]},{"target":"@ui/sheets/grid/feedback/floating-status.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/floating-status.tsx"}]},{"target":"@ui/sheets/grid/feedback/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/index.ts"}]},{"target":"@ui/sheets/grid/feedback/sheets-error-boundary.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/sheets-error-boundary.tsx"}]},{"target":"@ui/sheets/grid/feedback/sheets-error-state.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/sheets-error-state.tsx"}]},{"target":"@ui/sheets/grid/filter-operators.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/filter-operators.ts"}]},{"target":"@ui/sheets/grid/grid-cell-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/grid-cell-types.ts"}]},{"target":"@ui/sheets/grid/hooks/use-batch-commit.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-batch-commit.ts"}]},{"target":"@ui/sheets/grid/hooks/use-cell-editing.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-cell-editing.ts"}]},{"target":"@ui/sheets/grid/hooks/use-draft-rows.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-draft-rows.ts"}]},{"target":"@ui/sheets/grid/hooks/use-draft-submission.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-draft-submission.ts"}]},{"target":"@ui/sheets/grid/hooks/use-filter-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-filter-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-operations.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-operations.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-selection.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-selection.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-state.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-state.ts"}]},{"target":"@ui/sheets/grid/hooks/use-infinite-grid-data.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-infinite-grid-data.ts"}]},{"target":"@ui/sheets/grid/hooks/use-load-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-load-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-paginate-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-paginate-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-undo-redo.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-undo-redo.ts"}]},{"target":"@ui/sheets/grid/row-model.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/row-model.ts"}]},{"target":"@ui/sheets/grid/sheets.constants.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.constants.ts"}]},{"target":"@ui/sheets/grid/sheets.context-menu.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.context-menu.tsx"}]},{"target":"@ui/sheets/grid/sheets.controls.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.controls.tsx"}]},{"target":"@ui/sheets/grid/sheets.formatters.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.formatters.ts"}]},{"target":"@ui/sheets/grid/sheets.pagination.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.pagination.tsx"}]},{"target":"@ui/sheets/grid/sheets.table-selector.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.table-selector.tsx"}]},{"target":"@ui/sheets/grid/sheets.theme.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.theme.ts"}]},{"target":"@ui/sheets/grid/sheets.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.tsx"}]},{"target":"@ui/sheets/grid/sheets.types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.types.ts"}]},{"target":"@ui/sheets/grid/sheets.utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.utils.ts"}]},{"target":"@ui/sheets/grid/use-sheets.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/use-sheets.ts"}]},{"target":"@ui/sheets/hooks/orderby-enum-resolution.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/orderby-enum-resolution.ts"}]},{"target":"@ui/sheets/hooks/query-keys.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/query-keys.ts"}]},{"target":"@ui/sheets/hooks/relation-field-resolution.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/relation-field-resolution.ts"}]},{"target":"@ui/sheets/hooks/use-relation-columns.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-relation-columns.ts"}]},{"target":"@ui/sheets/hooks/use-relation-metadata-cache.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-relation-metadata-cache.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-infinite-table.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-infinite-table.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-meta.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-meta.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-table-cursor.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-table-cursor.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-table.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-table.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-upload.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-upload.ts"}]},{"target":"@ui/sheets/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/index.ts"}]},{"target":"@ui/sheets/row-identity.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/row-identity.ts"}]},{"target":"@ui/sheets/selection/cell-extract.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/cell-extract.ts"}]},{"target":"@ui/sheets/selection/fill.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/fill.ts"}]},{"target":"@ui/sheets/selection/range-set.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/range-set.ts"}]},{"target":"@ui/sheets/selection/selection-model.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/selection-model.ts"}]},{"target":"@ui/sheets/selection/tsv.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/tsv.ts"}]},{"target":"@ui/sheets/store/draft-rows-slice.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/draft-rows-slice.ts"}]},{"target":"@ui/sheets/store/relation-info-slice.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/relation-info-slice.ts"}]},{"target":"@ui/sheets/store/sheets-store.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/sheets-store.ts"}]},{"target":"@ui/sheets/table/features.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/features.ts"}]},{"target":"@ui/sheets/table/grid-viewport.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/grid-viewport.tsx"}]},{"target":"@ui/sheets/table/use-sheets-table-instance.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/use-sheets-table-instance.ts"}]},{"target":"@ui/sheets/utils/cn.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/cn.ts"}]},{"target":"@ui/sheets/utils/file.utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/file.utils.ts"}]},{"target":"@ui/sheets/utils/image-with-fallback.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/image-with-fallback.tsx"}]},{"target":"@ui/sheets/utils/map-picker.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/map-picker.tsx"}]},{"target":"@ui/sheets/utils/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/motion-config.ts"}]},{"target":"@ui/sheets/utils/relation-utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/relation-utils.ts"}]},{"target":"@ui/sheets/utils/sheets-i18n.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/sheets-i18n.ts"}]},{"target":"@ui/sheets/utils/sheets-logger.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/sheets-logger.ts"}]},{"target":"@ui/sheets/utils/use-color-scheme.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-color-scheme.ts"}]},{"target":"@ui/sheets/utils/use-image-status.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-image-status.ts"}]},{"target":"@ui/sheets/utils/use-resize-observer.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-resize-observer.ts"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/switch.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["switch"],"sources":[{"registryItem":"switch","path":"registry/constructive/ui/switch.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/toast/index.ts","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/index.ts"}]},{"target":"@ui/toast/toast-error.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-error.tsx"}]},{"target":"@ui/toast/toast-info.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-info.tsx"}]},{"target":"@ui/toast/toast-success.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-success.tsx"}]},{"target":"@ui/toast/toast-warning.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-warning.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/auth-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/console-kit/constructive/auth-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/organizations-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/console-kit/constructive/organizations-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/storage-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/console-kit/constructive/storage-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/users-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/console-kit/constructive/users-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-account-view.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-account-view.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-challenge-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-challenge-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-console-module.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-contracts.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-entry-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-entry-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-password-policy.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-password-policy.ts"}]},{"target":"src/blocks/feature-packs/data/data-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-data"],"sources":[{"registryItem":"console-module-data","path":"registry/constructive/blocks/feature-packs/data/data-console-module.tsx"}]},{"target":"src/blocks/feature-packs/data/data-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/data-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-access-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-access-panels.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-console-module.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-contracts.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-meta-contract.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-operation-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-operation-panels.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-module.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-slice.ts"}]},{"target":"src/blocks/feature-packs/storage/storage-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-meta-contract.ts"}]},{"target":"src/blocks/feature-packs/users/users-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/feature-packs/users/users-console-module.tsx"}]},{"target":"src/blocks/feature-packs/users/users-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/users-feature-pack.tsx"}]},{"target":"src/blocks/presets/b2b-storage-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["preset-b2b-storage"],"sources":[{"registryItem":"preset-b2b-storage","path":"registry/constructive/blocks/presets/b2b-storage-console-kit.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/auth.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/b2b-storage.json","targetKind":"project-root","type":"registry:file","owners":["preset-b2b-storage"],"sources":[{"registryItem":"preset-b2b-storage","path":"registry/constructive/blocks/presets/b2b-storage.json"}]},{"target":"~/.constructive/feature-packs/data.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/organizations.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/storage.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/users.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"data","title":"Data","description":"Dynamic table exploration and CRUD surfaces driven by Constructive metadata and GraphQL introspection.","dependencies":[],"endpoints":{"required":["data"],"optional":[]},"capabilities":{"required":["data.meta","data.introspection"],"optional":["data.search","data.i18n","data.realtime"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","search","i18n","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"auth","title":"Authentication","description":"Consumer sign-in, account profile, password, and session-management surfaces.","dependencies":[],"endpoints":{"required":["auth"],"optional":[]},"capabilities":{"required":["auth.sessions","auth.credentials","auth.password"],"optional":["auth.email","auth.connected-accounts","auth.identity-providers","auth.passkeys","auth.phone","auth.devices"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"users","title":"App access","description":"Application member governance, lifecycle controls, profiles, permission grants, and invitations.","dependencies":[],"endpoints":{"required":["admin"],"optional":["auth"]},"capabilities":{"required":["users.directory","users.memberships"],"optional":["users.permissions","users.profiles","users.invites"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"organizations","title":"Organizations","description":"Tenant membership governance, invitations, access policy, hierarchy, settings, and developer credentials.","dependencies":[],"endpoints":{"required":[],"optional":["admin","auth","billing","data"]},"capabilities":{"required":["organizations.memberships"],"optional":["organizations.permissions","organizations.limits","organizations.profiles","organizations.hierarchy","organizations.invites"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"storage","title":"Storage","description":"Policy-aware bucket navigation, uploads, downloads, and object deletion.","dependencies":[],"endpoints":{"required":[],"optional":["storage","admin","data"]},"capabilities":{"required":["storage.buckets","storage.files"],"optional":["storage.versioning","storage.content-hash","storage.custom-keys","storage.audit-log"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","storage"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[{"schemaVersion":1,"id":"b2b-storage","presetSlug":"b2b:storage","title":"B2B with storage","description":"Data, authentication, users, organizations, and storage feature packs.","stability":"stable","featurePacks":["data","auth","users","organizations","storage"]}],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`preset-b2b-storage` installed the stable `b2b:storage` composition: Data, Authentication, App access, Organizations, and Storage. Render `B2BStorageConsoleKit` with a secret-free tenant descriptor.\n\nDegraded states: stock Storage can remain unavailable when no supported public bucket and file contract is routed; other proven modules continue independently.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/data.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/auth.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/users.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/organizations.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/storage.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-plans.v1/preset-full.json b/.agents/skills/constructive-blocks/references/install-plans.v1/preset-full.json index dfa85d5..af2ade8 100644 --- a/.agents/skills/constructive-blocks/references/install-plans.v1/preset-full.json +++ b/.agents/skills/constructive-blocks/references/install-plans.v1/preset-full.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"preset-full","surface":"preset","install":{"command":"pnpm dlx shadcn@4.13.1 add @constructive/preset-full","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"feature-pack-data","title":"Data Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","button","card","constructive-theme"]},{"name":"console-module-data","title":"Data Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-data","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-auth","title":"Authentication Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","card","checkbox","cn","field","input","input-group","separator","tabs","constructive-theme"]},{"name":"console-module-auth","title":"Authentication Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-auth","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-users","title":"App access Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","checkbox","cn","dialog","dropdown-menu","empty","field","input","input-group","select","table","tabs","textarea","constructive-theme"]},{"name":"console-module-users","title":"App access Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-users","console-feature-catalog","constructive-theme"]},{"name":"switch","title":"Switch","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-organizations","title":"Organizations Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert-dialog","avatar","badge","button","card","checkbox","cn","dialog","dropdown-menu","empty","field","input","select","switch","table","tabs","textarea","constructive-theme"]},{"name":"console-module-organizations","title":"Organizations Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-organizations","console-feature-catalog","console-runtime","pack-foundation","constructive-theme"]},{"name":"radio-group","title":"Radio Group","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-storage","title":"Storage Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","cn","dialog","dropdown-menu","field","input","radio-group","table","constructive-theme"]},{"name":"console-module-storage","title":"Storage Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-storage","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"billing-contracts","title":"Billing Contracts","type":"registry:lib","directRegistryDependencies":[]},{"name":"billing-ui","title":"Billing UI Helpers","type":"registry:lib","directRegistryDependencies":["badge","billing-contracts","cn"]},{"name":"pagination","title":"Pagination","type":"registry:ui","directRegistryDependencies":["cn","button","constructive-theme"]},{"name":"billing-activity-table","title":"Billing Activity Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","sheet","skeleton","table","constructive-theme"]},{"name":"progress","title":"Progress","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-credits-card","title":"Billing Credits Card","type":"registry:block","directRegistryDependencies":["alert","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"billing-entitlements-list","title":"Billing Entitlements List","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","tooltip","constructive-theme"]},{"name":"billing-pricing-table","title":"Billing Pricing Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","select","separator","skeleton","constructive-theme"]},{"name":"billing-subscription-card","title":"Billing Subscription Card","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","constructive-theme"]},{"name":"billing-usage-history","title":"Billing Usage History","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","skeleton","table","constructive-theme"]},{"name":"billing-usage-overview","title":"Billing Usage Overview","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"billing-settings-page","title":"Billing Settings Page","type":"registry:block","directRegistryDependencies":["alert","badge","billing-activity-table","billing-contracts","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","cn","separator","tabs","tooltip","constructive-theme"]},{"name":"feature-pack-billing","title":"Billing Feature Pack","type":"registry:block","directRegistryDependencies":["billing-settings-page","constructive-theme"]},{"name":"console-module-billing","title":"Billing Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-billing","billing-contracts","console-feature-catalog","constructive-theme"]},{"name":"feature-pack-notifications","title":"Notifications Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","separator","constructive-theme"]},{"name":"console-module-notifications","title":"Notifications Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-notifications","console-feature-catalog","constructive-theme"]},{"name":"preset-full","title":"Full Preset","type":"registry:block","directRegistryDependencies":["console-kit-core","console-module-data","console-module-auth","console-module-users","console-module-organizations","console-module-storage","console-module-billing","console-module-notifications","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","checkbox","tabs","scroll-area","dialog","select","switch","radio-group","progress"]},{"name":"@constructive-io/data","requiredBy":["console-kit-core","feature-pack-data"]},{"name":"@constructive-io/sheets","requiredBy":["feature-pack-data"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn"]},{"name":"graphql","requiredBy":["console-kit-core"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","feature-pack-data","input-group","feature-pack-auth","dialog","select","feature-pack-users","feature-pack-organizations","feature-pack-storage","pagination","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","billing-settings-page","feature-pack-notifications"]},{"name":"motion","requiredBy":["motion-config","sheet","billing-credits-card","billing-usage-overview"]},{"name":"tailwind-merge","requiredBy":["cn"]},{"name":"zod","requiredBy":["console-feature-catalog"]},{"name":"zustand","requiredBy":["console-kit-core"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/pagination.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["pagination"],"sources":[{"registryItem":"pagination","path":"registry/constructive/ui/pagination.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/progress.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["progress"],"sources":[{"registryItem":"progress","path":"registry/constructive/ui/progress.tsx"}]},{"target":"@ui/radio-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["radio-group"],"sources":[{"registryItem":"radio-group","path":"registry/constructive/ui/radio-group.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/switch.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["switch"],"sources":[{"registryItem":"switch","path":"registry/constructive/ui/switch.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/billing-activity-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/billing-activity-table.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/messages.ts"}]},{"target":"src/blocks/billing/billing-contracts/billing-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["billing-contracts"],"sources":[{"registryItem":"billing-contracts","path":"registry/constructive/blocks/billing/billing-contracts/billing-contracts.ts"}]},{"target":"src/blocks/billing/billing-credits-card/billing-credits-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/billing-credits-card.tsx"}]},{"target":"src/blocks/billing/billing-credits-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/messages.ts"}]},{"target":"src/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx"}]},{"target":"src/blocks/billing/billing-entitlements-list/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/messages.ts"}]},{"target":"src/blocks/billing/billing-pricing-table/billing-pricing-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/billing-pricing-table.tsx"}]},{"target":"src/blocks/billing/billing-pricing-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/messages.ts"}]},{"target":"src/blocks/billing/billing-settings-page/billing-settings-page.tsx","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/billing-settings-page.tsx"}]},{"target":"src/blocks/billing/billing-settings-page/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/messages.ts"}]},{"target":"src/blocks/billing/billing-subscription-card/billing-subscription-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/billing-subscription-card.tsx"}]},{"target":"src/blocks/billing/billing-subscription-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/messages.ts"}]},{"target":"src/blocks/billing/billing-ui/billing-ui.tsx","targetKind":"literal","type":"registry:lib","owners":["billing-ui"],"sources":[{"registryItem":"billing-ui","path":"registry/constructive/blocks/billing/billing-ui/billing-ui.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/billing-usage-history.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/billing-usage-history.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/messages.ts"}]},{"target":"src/blocks/billing/billing-usage-overview/billing-usage-overview.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/billing-usage-overview.tsx"}]},{"target":"src/blocks/billing/billing-usage-overview/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/messages.ts"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/auth-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/console-kit/constructive/auth-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/billing-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-billing"],"sources":[{"registryItem":"console-module-billing","path":"registry/constructive/blocks/console-kit/constructive/billing-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/notifications-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-notifications"],"sources":[{"registryItem":"console-module-notifications","path":"registry/constructive/blocks/console-kit/constructive/notifications-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/organizations-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/console-kit/constructive/organizations-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/storage-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/console-kit/constructive/storage-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/users-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/console-kit/constructive/users-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-account-view.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-account-view.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-challenge-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-challenge-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-console-module.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-contracts.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-entry-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-entry-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-password-policy.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-password-policy.ts"}]},{"target":"src/blocks/feature-packs/billing/billing-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-billing"],"sources":[{"registryItem":"console-module-billing","path":"registry/constructive/blocks/feature-packs/billing/billing-console-module.tsx"}]},{"target":"src/blocks/feature-packs/billing/billing-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/billing-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/data/data-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-data"],"sources":[{"registryItem":"console-module-data","path":"registry/constructive/blocks/feature-packs/data/data-console-module.tsx"}]},{"target":"src/blocks/feature-packs/data/data-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/data-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/notifications/notifications-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-notifications"],"sources":[{"registryItem":"console-module-notifications","path":"registry/constructive/blocks/feature-packs/notifications/notifications-console-module.tsx"}]},{"target":"src/blocks/feature-packs/notifications/notifications-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/notifications-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-access-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-access-panels.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-console-module.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-contracts.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-meta-contract.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-operation-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-operation-panels.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-module.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-slice.ts"}]},{"target":"src/blocks/feature-packs/storage/storage-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-meta-contract.ts"}]},{"target":"src/blocks/feature-packs/users/users-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/feature-packs/users/users-console-module.tsx"}]},{"target":"src/blocks/feature-packs/users/users-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/users-feature-pack.tsx"}]},{"target":"src/blocks/presets/full-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["preset-full"],"sources":[{"registryItem":"preset-full","path":"registry/constructive/blocks/presets/full-console-kit.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/auth.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/billing.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/data.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/full.json","targetKind":"project-root","type":"registry:file","owners":["preset-full"],"sources":[{"registryItem":"preset-full","path":"registry/constructive/blocks/presets/full.json"}]},{"target":"~/.constructive/feature-packs/notifications.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/organizations.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/storage.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/users.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"data","title":"Data","description":"Dynamic table exploration and CRUD surfaces driven by Constructive metadata and GraphQL introspection.","dependencies":[],"endpoints":{"required":["data"],"optional":[]},"capabilities":{"required":["data.meta","data.introspection"],"optional":["data.search","data.i18n","data.realtime"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","search","i18n","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"auth","title":"Authentication","description":"Consumer sign-in, account profile, password, and session-management surfaces.","dependencies":[],"endpoints":{"required":["auth"],"optional":[]},"capabilities":{"required":["auth.sessions","auth.credentials","auth.password"],"optional":["auth.email","auth.connected-accounts","auth.identity-providers","auth.passkeys","auth.phone","auth.devices"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"users","title":"App access","description":"Application member governance, lifecycle controls, profiles, permission grants, and invitations.","dependencies":[],"endpoints":{"required":["admin"],"optional":["auth"]},"capabilities":{"required":["users.directory","users.memberships"],"optional":["users.permissions","users.profiles","users.invites"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"organizations","title":"Organizations","description":"Tenant membership governance, invitations, access policy, hierarchy, settings, and developer credentials.","dependencies":[],"endpoints":{"required":[],"optional":["admin","auth","billing","data"]},"capabilities":{"required":["organizations.memberships"],"optional":["organizations.permissions","organizations.limits","organizations.profiles","organizations.hierarchy","organizations.invites"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"storage","title":"Storage","description":"Policy-aware bucket navigation, uploads, downloads, and object deletion.","dependencies":[],"endpoints":{"required":[],"optional":["storage","admin","data"]},"capabilities":{"required":["storage.buckets","storage.files"],"optional":["storage.versioning","storage.content-hash","storage.custom-keys","storage.audit-log"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","storage"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"billing","title":"Billing","description":"Plans, subscriptions, entitlement meters, usage, credits, and account activity.","dependencies":[],"endpoints":{"required":[],"optional":["billing","admin","data"]},"capabilities":{"required":["billing.plans","billing.subscriptions"],"optional":["billing.meters"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"notifications","title":"Notifications","description":"User notification inbox and read-state actions with optional settings and realtime capabilities.","dependencies":[],"endpoints":{"required":[],"optional":["notifications","auth","data"]},"capabilities":{"required":["notifications.inbox"],"optional":["notifications.settings","notifications.realtime"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[{"schemaVersion":1,"id":"full","presetSlug":"full","title":"Full","description":"Every first-release Constructive feature pack.","stability":"stable","featurePacks":["data","auth","users","organizations","storage","billing","notifications"]}],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`preset-full` installed all seven Console modules and the stable Full preset component. Render `FullConsoleKit` with a secret-free tenant descriptor.\n\nDegraded states: installed backend modules do not imply public routes or user authority; Storage, Billing, or Notifications can remain partial or unavailable while other modules continue.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/data.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/auth.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/users.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/organizations.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/storage.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/billing.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/notifications.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} +{"schemaVersion":1,"kind":"constructive.console-kit-install-plan","item":"preset-full","surface":"preset","install":{"command":"pnpm dlx shadcn@4.16.1 add @constructive/preset-full","prerequisites":["Run from an existing shadcn project root with components.json.","Keep the project aliases in components.json; targets beginning with @ are resolved through those aliases."],"componentsJson":{"registries":{"@constructive":"https://constructive-io.github.io/blocks/r/{name}.json"}}},"composition":{"registryItems":[{"name":"console-runtime","title":"Console Runtime","type":"registry:lib","directRegistryDependencies":[]},{"name":"console-feature-catalog","title":"Console Feature Catalog","type":"registry:lib","directRegistryDependencies":["console-runtime"]},{"name":"cn","title":"cn utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"constructive-theme","title":"Constructive Theme","type":"registry:theme","directRegistryDependencies":[]},{"name":"alert","title":"Alert","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"breadcrumb","title":"Breadcrumb","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"separator","title":"Separator","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"use-mobile","title":"useIsMobile","type":"registry:hook","directRegistryDependencies":[]},{"name":"slot","title":"Slot utility","type":"registry:lib","directRegistryDependencies":[]},{"name":"button","title":"Button","type":"registry:ui","directRegistryDependencies":["cn","slot","constructive-theme"]},{"name":"input","title":"Input","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"portal","title":"Portal","type":"registry:ui","directRegistryDependencies":["constructive-theme"]},{"name":"motion-config","title":"Motion Config","type":"registry:lib","directRegistryDependencies":[]},{"name":"use-controllable-state","title":"useControllableState","type":"registry:hook","directRegistryDependencies":[]},{"name":"sheet","title":"Sheet","type":"registry:ui","directRegistryDependencies":["cn","portal","motion-config","use-controllable-state","constructive-theme"]},{"name":"skeleton","title":"Skeleton","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"tooltip","title":"Tooltip","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"sidebar","title":"Sidebar","type":"registry:ui","directRegistryDependencies":["cn","use-mobile","button","input","separator","sheet","skeleton","tooltip","constructive-theme"]},{"name":"app-bar","title":"App Bar","type":"registry:block","directRegistryDependencies":["cn","breadcrumb","separator","sidebar","constructive-theme"]},{"name":"avatar","title":"Avatar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"collapsible","title":"Collapsible","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dropdown-menu","title":"Dropdown Menu","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"app-shell","title":"App Shell","type":"registry:block","directRegistryDependencies":["cn","app-bar","avatar","collapsible","dropdown-menu","sidebar","constructive-theme"]},{"name":"badge","title":"Badge","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"card","title":"Card","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"empty","title":"Empty","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"pack-foundation","title":"Feature Pack Foundation","type":"registry:lib","directRegistryDependencies":["alert","badge","button","card","cn","empty","skeleton"]},{"name":"popover","title":"Popover","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"console-kit-core","title":"Constructive Console Kit Core","type":"registry:block","directRegistryDependencies":["console-runtime","console-feature-catalog","alert","app-bar","app-shell","badge","button","cn","pack-foundation","popover","skeleton","constructive-theme"]},{"name":"alert-dialog","title":"Alert Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","constructive-theme"]},{"name":"calendar-rac","title":"Calendar","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"checkbox","title":"Checkbox","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"label","title":"Label","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"form-control","title":"Form Control","type":"registry:ui","directRegistryDependencies":["cn","slot","label","constructive-theme"]},{"name":"textarea","title":"Textarea","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"input-group","title":"Input Group","type":"registry:ui","directRegistryDependencies":["cn","input","textarea","constructive-theme"]},{"name":"pagination","title":"Pagination","type":"registry:ui","directRegistryDependencies":["cn","button","constructive-theme"]},{"name":"progressive-blur","title":"Progressive Blur","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"scroll-area","title":"Scroll Area","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"select","title":"Select","type":"registry:ui","directRegistryDependencies":["cn","portal","constructive-theme"]},{"name":"tabs","title":"Tabs","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"dialog","title":"Dialog","type":"registry:ui","directRegistryDependencies":["cn","portal","button","scroll-area","constructive-theme"]},{"name":"toast","title":"Toast Notifications","type":"registry:block","directRegistryDependencies":["button","dialog","constructive-theme"]},{"name":"sheets","title":"Sheets","type":"registry:block","directRegistryDependencies":["alert-dialog","badge","button","calendar-rac","card","checkbox","collapsible","dropdown-menu","form-control","input","input-group","label","pagination","popover","progressive-blur","scroll-area","select","skeleton","tabs","textarea","toast","tooltip","constructive-theme"]},{"name":"feature-pack-data","title":"Data Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","sheets","alert","button","card","constructive-theme"]},{"name":"console-module-data","title":"Data Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-data","console-feature-catalog","console-runtime","sheets","constructive-theme"]},{"name":"field","title":"Field","type":"registry:ui","directRegistryDependencies":["cn","label","separator","constructive-theme"]},{"name":"feature-pack-auth","title":"Authentication Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","card","checkbox","cn","field","input","input-group","separator","tabs","constructive-theme"]},{"name":"console-module-auth","title":"Authentication Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-auth","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"table","title":"Table","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-users","title":"App access Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","avatar","badge","button","checkbox","cn","dialog","dropdown-menu","empty","field","input","input-group","select","table","tabs","textarea","constructive-theme"]},{"name":"console-module-users","title":"App access Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-users","console-feature-catalog","constructive-theme"]},{"name":"switch","title":"Switch","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-organizations","title":"Organizations Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert-dialog","avatar","badge","button","card","checkbox","cn","dialog","dropdown-menu","empty","field","input","select","switch","table","tabs","textarea","constructive-theme"]},{"name":"console-module-organizations","title":"Organizations Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-organizations","console-feature-catalog","console-runtime","pack-foundation","constructive-theme"]},{"name":"radio-group","title":"Radio Group","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"feature-pack-storage","title":"Storage Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","cn","dialog","dropdown-menu","field","input","radio-group","table","constructive-theme"]},{"name":"console-module-storage","title":"Storage Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-storage","console-feature-catalog","console-runtime","constructive-theme"]},{"name":"billing-contracts","title":"Billing Contracts","type":"registry:lib","directRegistryDependencies":[]},{"name":"billing-ui","title":"Billing UI Helpers","type":"registry:lib","directRegistryDependencies":["badge","billing-contracts","cn"]},{"name":"billing-activity-table","title":"Billing Activity Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","sheet","skeleton","table","constructive-theme"]},{"name":"progress","title":"Progress","type":"registry:ui","directRegistryDependencies":["cn","constructive-theme"]},{"name":"billing-credits-card","title":"Billing Credits Card","type":"registry:block","directRegistryDependencies":["alert","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"billing-entitlements-list","title":"Billing Entitlements List","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","tooltip","constructive-theme"]},{"name":"billing-pricing-table","title":"Billing Pricing Table","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","select","separator","skeleton","constructive-theme"]},{"name":"billing-subscription-card","title":"Billing Subscription Card","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","skeleton","constructive-theme"]},{"name":"billing-usage-history","title":"Billing Usage History","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","field","pagination","select","separator","skeleton","table","constructive-theme"]},{"name":"billing-usage-overview","title":"Billing Usage Overview","type":"registry:block","directRegistryDependencies":["alert","badge","billing-contracts","billing-ui","button","card","cn","collapsible","progress","skeleton","tooltip","constructive-theme"]},{"name":"billing-settings-page","title":"Billing Settings Page","type":"registry:block","directRegistryDependencies":["alert","badge","billing-activity-table","billing-contracts","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","cn","separator","tabs","tooltip","constructive-theme"]},{"name":"feature-pack-billing","title":"Billing Feature Pack","type":"registry:block","directRegistryDependencies":["billing-settings-page","constructive-theme"]},{"name":"console-module-billing","title":"Billing Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-billing","billing-contracts","console-feature-catalog","constructive-theme"]},{"name":"feature-pack-notifications","title":"Notifications Feature Pack","type":"registry:block","directRegistryDependencies":["pack-foundation","alert","alert-dialog","badge","button","card","separator","constructive-theme"]},{"name":"console-module-notifications","title":"Notifications Console Module","type":"registry:block","directRegistryDependencies":["console-kit-core","feature-pack-notifications","console-feature-catalog","constructive-theme"]},{"name":"preset-full","title":"Full Preset","type":"registry:block","directRegistryDependencies":["console-kit-core","console-module-data","console-module-auth","console-module-users","console-module-organizations","console-module-storage","console-module-billing","console-module-notifications","constructive-theme"]}],"npmDependencies":[{"name":"@base-ui/react","requiredBy":["separator","input","sheet","tooltip","sidebar","app-bar","avatar","collapsible","dropdown-menu","app-shell","popover","alert-dialog","checkbox","scroll-area","select","tabs","dialog","switch","radio-group","progress"]},{"name":"@constructive-io/data@^0.5.0","requiredBy":["console-kit-core","sheets","feature-pack-data"]},{"name":"@internationalized/date","requiredBy":["calendar-rac","sheets"]},{"name":"@remixicon/react","requiredBy":["sheets"]},{"name":"@tanstack/react-form","requiredBy":["sheets"]},{"name":"@tanstack/react-query","requiredBy":["console-kit-core","sheets"]},{"name":"@tanstack/react-table@9.0.0-beta.58","requiredBy":["sheets"]},{"name":"@tanstack/react-virtual","requiredBy":["sheets"]},{"name":"@types/leaflet","requiredBy":["sheets"]},{"name":"class-variance-authority","requiredBy":["alert","button","sheet","sidebar","badge","card"]},{"name":"clsx","requiredBy":["cn","sheets"]},{"name":"graphql","requiredBy":["console-kit-core","sheets"]},{"name":"inflekt","requiredBy":["sheets"]},{"name":"leaflet","requiredBy":["sheets"]},{"name":"lucide-react","requiredBy":["breadcrumb","sheet","sidebar","dropdown-menu","app-shell","pack-foundation","console-kit-core","input-group","pagination","select","dialog","toast","sheets","feature-pack-data","feature-pack-auth","feature-pack-users","feature-pack-organizations","feature-pack-storage","billing-credits-card","billing-entitlements-list","billing-pricing-table","billing-subscription-card","billing-usage-history","billing-usage-overview","billing-settings-page","feature-pack-notifications"]},{"name":"motion","requiredBy":["motion-config","sheet","sheets","billing-credits-card","billing-usage-overview"]},{"name":"react-aria-components","requiredBy":["calendar-rac","sheets"]},{"name":"react-leaflet","requiredBy":["sheets"]},{"name":"sonner","requiredBy":["toast"]},{"name":"tailwind-merge","requiredBy":["cn","sheets"]},{"name":"zod","requiredBy":["console-feature-catalog","sheets"]},{"name":"zustand","requiredBy":["console-kit-core","sheets"]}],"devDependencies":[],"files":[{"target":"@hooks/use-controllable-state.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-controllable-state"],"sources":[{"registryItem":"use-controllable-state","path":"registry/constructive/hooks/use-controllable-state.ts"}]},{"target":"@hooks/use-mobile.ts","targetKind":"shadcn-alias","type":"registry:hook","owners":["use-mobile"],"sources":[{"registryItem":"use-mobile","path":"registry/constructive/hooks/use-mobile.ts"}]},{"target":"@lib/motion/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["motion-config"],"sources":[{"registryItem":"motion-config","path":"registry/constructive/lib/motion/motion-config.ts"}]},{"target":"@lib/slot.tsx","targetKind":"shadcn-alias","type":"registry:lib","owners":["slot"],"sources":[{"registryItem":"slot","path":"registry/constructive/lib/slot.tsx"}]},{"target":"@lib/utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["cn"],"sources":[{"registryItem":"cn","path":"registry/constructive/lib/utils.ts"}]},{"target":"@ui/alert-dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert-dialog"],"sources":[{"registryItem":"alert-dialog","path":"registry/constructive/ui/alert-dialog.tsx"}]},{"target":"@ui/alert.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["alert"],"sources":[{"registryItem":"alert","path":"registry/constructive/ui/alert.tsx"}]},{"target":"@ui/app-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-bar"],"sources":[{"registryItem":"app-bar","path":"registry/constructive/blocks/app-bar.tsx"}]},{"target":"@ui/app-shell.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["app-shell"],"sources":[{"registryItem":"app-shell","path":"registry/constructive/blocks/app-shell.tsx"}]},{"target":"@ui/avatar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["avatar"],"sources":[{"registryItem":"avatar","path":"registry/constructive/ui/avatar.tsx"}]},{"target":"@ui/badge.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["badge"],"sources":[{"registryItem":"badge","path":"registry/constructive/ui/badge.tsx"}]},{"target":"@ui/breadcrumb.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["breadcrumb"],"sources":[{"registryItem":"breadcrumb","path":"registry/constructive/ui/breadcrumb.tsx"}]},{"target":"@ui/button.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["button"],"sources":[{"registryItem":"button","path":"registry/constructive/ui/button.tsx"}]},{"target":"@ui/calendar-rac.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["calendar-rac"],"sources":[{"registryItem":"calendar-rac","path":"registry/constructive/ui/calendar-rac.tsx"}]},{"target":"@ui/card.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["card"],"sources":[{"registryItem":"card","path":"registry/constructive/ui/card.tsx"}]},{"target":"@ui/checkbox.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["checkbox"],"sources":[{"registryItem":"checkbox","path":"registry/constructive/ui/checkbox.tsx"}]},{"target":"@ui/collapsible.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["collapsible"],"sources":[{"registryItem":"collapsible","path":"registry/constructive/ui/collapsible.tsx"}]},{"target":"@ui/dialog.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dialog"],"sources":[{"registryItem":"dialog","path":"registry/constructive/ui/dialog.tsx"}]},{"target":"@ui/dropdown-menu.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["dropdown-menu"],"sources":[{"registryItem":"dropdown-menu","path":"registry/constructive/ui/dropdown-menu.tsx"}]},{"target":"@ui/empty.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["empty"],"sources":[{"registryItem":"empty","path":"registry/constructive/ui/empty.tsx"}]},{"target":"@ui/field.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["field"],"sources":[{"registryItem":"field","path":"registry/constructive/ui/field.tsx"}]},{"target":"@ui/form-control.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["form-control"],"sources":[{"registryItem":"form-control","path":"registry/constructive/ui/form-control.tsx"}]},{"target":"@ui/input-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input-group"],"sources":[{"registryItem":"input-group","path":"registry/constructive/ui/input-group.tsx"}]},{"target":"@ui/input.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["input"],"sources":[{"registryItem":"input","path":"registry/constructive/ui/input.tsx"}]},{"target":"@ui/label.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["label"],"sources":[{"registryItem":"label","path":"registry/constructive/ui/label.tsx"}]},{"target":"@ui/pagination.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["pagination"],"sources":[{"registryItem":"pagination","path":"registry/constructive/ui/pagination.tsx"}]},{"target":"@ui/popover.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["popover"],"sources":[{"registryItem":"popover","path":"registry/constructive/ui/popover.tsx"}]},{"target":"@ui/portal.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["portal"],"sources":[{"registryItem":"portal","path":"registry/constructive/ui/portal.tsx"}]},{"target":"@ui/progress.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["progress"],"sources":[{"registryItem":"progress","path":"registry/constructive/ui/progress.tsx"}]},{"target":"@ui/progressive-blur.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["progressive-blur"],"sources":[{"registryItem":"progressive-blur","path":"registry/constructive/ui/progressive-blur.tsx"}]},{"target":"@ui/radio-group.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["radio-group"],"sources":[{"registryItem":"radio-group","path":"registry/constructive/ui/radio-group.tsx"}]},{"target":"@ui/scroll-area.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["scroll-area"],"sources":[{"registryItem":"scroll-area","path":"registry/constructive/ui/scroll-area.tsx"}]},{"target":"@ui/select.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["select"],"sources":[{"registryItem":"select","path":"registry/constructive/ui/select.tsx"}]},{"target":"@ui/separator.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["separator"],"sources":[{"registryItem":"separator","path":"registry/constructive/ui/separator.tsx"}]},{"target":"@ui/sheet.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sheet"],"sources":[{"registryItem":"sheet","path":"registry/constructive/ui/sheet.tsx"}]},{"target":"@ui/sheets/adapter/postgraphile-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/postgraphile-adapter.ts"}]},{"target":"@ui/sheets/adapter/sheets-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/sheets-adapter.ts"}]},{"target":"@ui/sheets/adapter/use-sheets-adapter.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/adapter/use-sheets-adapter.ts"}]},{"target":"@ui/sheets/advanced.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/advanced.ts"}]},{"target":"@ui/sheets/auth/auth-execute.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-execute.ts"}]},{"target":"@ui/sheets/auth/auth-gate.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-gate.tsx"}]},{"target":"@ui/sheets/auth/auth-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/auth-types.ts"}]},{"target":"@ui/sheets/auth/hooks/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/index.ts"}]},{"target":"@ui/sheets/auth/hooks/use-forgot-password.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-forgot-password.ts"}]},{"target":"@ui/sheets/auth/hooks/use-login.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-login.ts"}]},{"target":"@ui/sheets/auth/hooks/use-register.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-register.ts"}]},{"target":"@ui/sheets/auth/hooks/use-reset-password.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/hooks/use-reset-password.ts"}]},{"target":"@ui/sheets/auth/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/index.ts"}]},{"target":"@ui/sheets/auth/ui/auth-error-alert.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-error-alert.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-loading-button.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-loading-button.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-screen-header.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-screen-header.tsx"}]},{"target":"@ui/sheets/auth/ui/auth-screen-layout.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/auth-screen-layout.tsx"}]},{"target":"@ui/sheets/auth/ui/forgot-password-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/forgot-password-form.tsx"}]},{"target":"@ui/sheets/auth/ui/form-field.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/form-field.tsx"}]},{"target":"@ui/sheets/auth/ui/login-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/login-form.tsx"}]},{"target":"@ui/sheets/auth/ui/password-strength.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/password-strength.tsx"}]},{"target":"@ui/sheets/auth/ui/register-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/register-form.tsx"}]},{"target":"@ui/sheets/auth/ui/reset-password-form.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/ui/reset-password-form.tsx"}]},{"target":"@ui/sheets/auth/utils/auth-errors.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/auth-errors.ts"}]},{"target":"@ui/sheets/auth/utils/schemas.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/schemas.ts"}]},{"target":"@ui/sheets/auth/utils/token-store.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/token-store.ts"}]},{"target":"@ui/sheets/auth/utils/validators.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/auth/utils/validators.ts"}]},{"target":"@ui/sheets/cell-model/badge-tones.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/badge-tones.ts"}]},{"target":"@ui/sheets/cell-model/cell-props.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/cell-props.ts"}]},{"target":"@ui/sheets/cell-model/cell-slots.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/cell-slots.ts"}]},{"target":"@ui/sheets/cell-model/create-sheets-cell.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/create-sheets-cell.ts"}]},{"target":"@ui/sheets/cell-model/factories/badges.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/badges.ts"}]},{"target":"@ui/sheets/cell-model/factories/boolean.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/boolean.ts"}]},{"target":"@ui/sheets/cell-model/factories/datetime.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/datetime.ts"}]},{"target":"@ui/sheets/cell-model/factories/geometry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/geometry.ts"}]},{"target":"@ui/sheets/cell-model/factories/image.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/image.ts"}]},{"target":"@ui/sheets/cell-model/factories/interval.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/interval.ts"}]},{"target":"@ui/sheets/cell-model/factories/number.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/number.ts"}]},{"target":"@ui/sheets/cell-model/factories/relation.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/relation.ts"}]},{"target":"@ui/sheets/cell-model/factories/text.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/text.ts"}]},{"target":"@ui/sheets/cell-model/factories/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/types.ts"}]},{"target":"@ui/sheets/cell-model/factories/uri.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/factories/uri.ts"}]},{"target":"@ui/sheets/cell-model/image-cache.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/image-cache.ts"}]},{"target":"@ui/sheets/cell-model/sheets-cell.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/sheets-cell.ts"}]},{"target":"@ui/sheets/cell-model/views/badges-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/badges-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/boolean-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/boolean-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/datetime-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/datetime-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/draft-action-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/draft-action-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/geometry-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/geometry-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/image-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/image-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/interval-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/interval-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/loading-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/loading-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/number-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/number-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/relation-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/relation-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/text-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/text-view.tsx"}]},{"target":"@ui/sheets/cell-model/views/uri-view.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-model/views/uri-view.tsx"}]},{"target":"@ui/sheets/cell-types/cell-registry-defaults.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-registry-defaults.ts"}]},{"target":"@ui/sheets/cell-types/cell-registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-registry.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-groups.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-groups.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-registry.ts"}]},{"target":"@ui/sheets/cell-types/cell-type-resolver.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/cell-type-resolver.ts"}]},{"target":"@ui/sheets/cell-types/define-cell-type.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/define-cell-type.ts"}]},{"target":"@ui/sheets/cell-types/type-mapping.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/type-mapping.ts"}]},{"target":"@ui/sheets/cell-types/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/cell-types/types.ts"}]},{"target":"@ui/sheets/commands/context.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/context.ts"}]},{"target":"@ui/sheets/commands/dispatch.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/dispatch.ts"}]},{"target":"@ui/sheets/commands/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/index.ts"}]},{"target":"@ui/sheets/commands/keybinding.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/keybinding.ts"}]},{"target":"@ui/sheets/commands/keymap.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/keymap.ts"}]},{"target":"@ui/sheets/commands/registry.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/registry.ts"}]},{"target":"@ui/sheets/commands/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/commands/types.ts"}]},{"target":"@ui/sheets/config/sheets-concurrency.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/config/sheets-concurrency.ts"}]},{"target":"@ui/sheets/context/sheets-context.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-context.ts"}]},{"target":"@ui/sheets/context/sheets-execute.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-execute.ts"}]},{"target":"@ui/sheets/context/sheets-provider.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-provider.tsx"}]},{"target":"@ui/sheets/context/sheets-upload-presigned.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/context/sheets-upload-presigned.ts"}]},{"target":"@ui/sheets/forms/form-spec-builder.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/form-spec-builder.ts"}]},{"target":"@ui/sheets/forms/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/index.ts"}]},{"target":"@ui/sheets/forms/metadata-hash.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/metadata-hash.ts"}]},{"target":"@ui/sheets/forms/mutations.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/mutations.ts"}]},{"target":"@ui/sheets/forms/types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/types.ts"}]},{"target":"@ui/sheets/forms/zod-schema.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/forms/zod-schema.ts"}]},{"target":"@ui/sheets/grid-dom/editors/array-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/array-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/date-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/date-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/edit-intent.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/edit-intent.ts"}]},{"target":"@ui/sheets/grid-dom/editors/editor-props.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/editor-props.ts"}]},{"target":"@ui/sheets/grid-dom/editors/editor-registry-dom.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/editor-registry-dom.ts"}]},{"target":"@ui/sheets/grid-dom/editors/geometry-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/geometry-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/image-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/image-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/inet-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/inet-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/interval-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/interval-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/json-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/json-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/number-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/number-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/relation-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/relation-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/text-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/text-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/tsvector-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/tsvector-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/upload-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/upload-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/editors/url-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/editors/url-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/inline-cell-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/inline-cell-editor.tsx"}]},{"target":"@ui/sheets/grid-dom/overlay/overlay-manager.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/overlay/overlay-manager.tsx"}]},{"target":"@ui/sheets/grid-dom/overlay/use-overlay-controller.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/overlay/use-overlay-controller.ts"}]},{"target":"@ui/sheets/grid-dom/sheets-cell-host.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/sheets-cell-host.tsx"}]},{"target":"@ui/sheets/grid-dom/use-sheets-content.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid-dom/use-sheets-content.ts"}]},{"target":"@ui/sheets/grid/cell-routing.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/cell-routing.ts"}]},{"target":"@ui/sheets/grid/draft-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/draft-types.ts"}]},{"target":"@ui/sheets/grid/editors/array-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/array-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/date-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/date-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/editor-focus-trap.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/editor-focus-trap.tsx"}]},{"target":"@ui/sheets/grid/editors/geometry-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/geometry-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/image-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/image-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/inet-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/inet-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/interval-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/interval-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/json-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/json-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/overlay-presets.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/overlay-presets.ts"}]},{"target":"@ui/sheets/grid/editors/overlay-viewport-guard.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/overlay-viewport-guard.tsx"}]},{"target":"@ui/sheets/grid/editors/relation-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/relation-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/relation-record-tooltip.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/relation-record-tooltip.tsx"}]},{"target":"@ui/sheets/grid/editors/tsvector-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/tsvector-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/upload-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/upload-editor.tsx"}]},{"target":"@ui/sheets/grid/editors/url-editor.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/editors/url-editor.tsx"}]},{"target":"@ui/sheets/grid/feedback/dock-status-bar.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/dock-status-bar.tsx"}]},{"target":"@ui/sheets/grid/feedback/editor-error-boundary.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/editor-error-boundary.tsx"}]},{"target":"@ui/sheets/grid/feedback/feedback-context.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/feedback-context.tsx"}]},{"target":"@ui/sheets/grid/feedback/feedback-reducer.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/feedback-reducer.ts"}]},{"target":"@ui/sheets/grid/feedback/floating-status.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/floating-status.tsx"}]},{"target":"@ui/sheets/grid/feedback/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/index.ts"}]},{"target":"@ui/sheets/grid/feedback/sheets-error-boundary.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/sheets-error-boundary.tsx"}]},{"target":"@ui/sheets/grid/feedback/sheets-error-state.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/feedback/sheets-error-state.tsx"}]},{"target":"@ui/sheets/grid/filter-operators.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/filter-operators.ts"}]},{"target":"@ui/sheets/grid/grid-cell-types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/grid-cell-types.ts"}]},{"target":"@ui/sheets/grid/hooks/use-batch-commit.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-batch-commit.ts"}]},{"target":"@ui/sheets/grid/hooks/use-cell-editing.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-cell-editing.ts"}]},{"target":"@ui/sheets/grid/hooks/use-draft-rows.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-draft-rows.ts"}]},{"target":"@ui/sheets/grid/hooks/use-draft-submission.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-draft-submission.ts"}]},{"target":"@ui/sheets/grid/hooks/use-filter-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-filter-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-operations.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-operations.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-selection.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-selection.ts"}]},{"target":"@ui/sheets/grid/hooks/use-grid-state.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-state.ts"}]},{"target":"@ui/sheets/grid/hooks/use-infinite-grid-data.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-infinite-grid-data.ts"}]},{"target":"@ui/sheets/grid/hooks/use-load-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-load-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-paginate-grid.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-paginate-grid.ts"}]},{"target":"@ui/sheets/grid/hooks/use-undo-redo.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/hooks/use-undo-redo.ts"}]},{"target":"@ui/sheets/grid/row-model.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/row-model.ts"}]},{"target":"@ui/sheets/grid/sheets.constants.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.constants.ts"}]},{"target":"@ui/sheets/grid/sheets.context-menu.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.context-menu.tsx"}]},{"target":"@ui/sheets/grid/sheets.controls.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.controls.tsx"}]},{"target":"@ui/sheets/grid/sheets.formatters.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.formatters.ts"}]},{"target":"@ui/sheets/grid/sheets.pagination.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.pagination.tsx"}]},{"target":"@ui/sheets/grid/sheets.table-selector.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.table-selector.tsx"}]},{"target":"@ui/sheets/grid/sheets.theme.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.theme.ts"}]},{"target":"@ui/sheets/grid/sheets.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.tsx"}]},{"target":"@ui/sheets/grid/sheets.types.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.types.ts"}]},{"target":"@ui/sheets/grid/sheets.utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/sheets.utils.ts"}]},{"target":"@ui/sheets/grid/use-sheets.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/grid/use-sheets.ts"}]},{"target":"@ui/sheets/hooks/orderby-enum-resolution.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/orderby-enum-resolution.ts"}]},{"target":"@ui/sheets/hooks/query-keys.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/query-keys.ts"}]},{"target":"@ui/sheets/hooks/relation-field-resolution.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/relation-field-resolution.ts"}]},{"target":"@ui/sheets/hooks/use-relation-columns.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-relation-columns.ts"}]},{"target":"@ui/sheets/hooks/use-relation-metadata-cache.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-relation-metadata-cache.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-infinite-table.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-infinite-table.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-meta.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-meta.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-table-cursor.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-table-cursor.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-table.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-table.ts"}]},{"target":"@ui/sheets/hooks/use-sheets-upload.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/hooks/use-sheets-upload.ts"}]},{"target":"@ui/sheets/index.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/index.ts"}]},{"target":"@ui/sheets/row-identity.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/row-identity.ts"}]},{"target":"@ui/sheets/selection/cell-extract.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/cell-extract.ts"}]},{"target":"@ui/sheets/selection/fill.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/fill.ts"}]},{"target":"@ui/sheets/selection/range-set.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/range-set.ts"}]},{"target":"@ui/sheets/selection/selection-model.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/selection-model.ts"}]},{"target":"@ui/sheets/selection/tsv.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/selection/tsv.ts"}]},{"target":"@ui/sheets/store/draft-rows-slice.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/draft-rows-slice.ts"}]},{"target":"@ui/sheets/store/relation-info-slice.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/relation-info-slice.ts"}]},{"target":"@ui/sheets/store/sheets-store.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/store/sheets-store.ts"}]},{"target":"@ui/sheets/table/features.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/features.ts"}]},{"target":"@ui/sheets/table/grid-viewport.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/grid-viewport.tsx"}]},{"target":"@ui/sheets/table/use-sheets-table-instance.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/table/use-sheets-table-instance.ts"}]},{"target":"@ui/sheets/utils/cn.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/cn.ts"}]},{"target":"@ui/sheets/utils/file.utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/file.utils.ts"}]},{"target":"@ui/sheets/utils/image-with-fallback.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/image-with-fallback.tsx"}]},{"target":"@ui/sheets/utils/map-picker.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/map-picker.tsx"}]},{"target":"@ui/sheets/utils/motion-config.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/motion-config.ts"}]},{"target":"@ui/sheets/utils/relation-utils.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/relation-utils.ts"}]},{"target":"@ui/sheets/utils/sheets-i18n.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/sheets-i18n.ts"}]},{"target":"@ui/sheets/utils/sheets-logger.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/sheets-logger.ts"}]},{"target":"@ui/sheets/utils/use-color-scheme.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-color-scheme.ts"}]},{"target":"@ui/sheets/utils/use-image-status.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-image-status.ts"}]},{"target":"@ui/sheets/utils/use-resize-observer.ts","targetKind":"shadcn-alias","type":"registry:lib","owners":["sheets"],"sources":[{"registryItem":"sheets","path":"registry/constructive/blocks/sheets/utils/use-resize-observer.ts"}]},{"target":"@ui/sidebar.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["sidebar"],"sources":[{"registryItem":"sidebar","path":"registry/constructive/ui/sidebar.tsx"}]},{"target":"@ui/skeleton.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["skeleton"],"sources":[{"registryItem":"skeleton","path":"registry/constructive/ui/skeleton.tsx"}]},{"target":"@ui/switch.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["switch"],"sources":[{"registryItem":"switch","path":"registry/constructive/ui/switch.tsx"}]},{"target":"@ui/table.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["table"],"sources":[{"registryItem":"table","path":"registry/constructive/ui/table.tsx"}]},{"target":"@ui/tabs.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tabs"],"sources":[{"registryItem":"tabs","path":"registry/constructive/ui/tabs.tsx"}]},{"target":"@ui/textarea.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["textarea"],"sources":[{"registryItem":"textarea","path":"registry/constructive/ui/textarea.tsx"}]},{"target":"@ui/toast/index.ts","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/index.ts"}]},{"target":"@ui/toast/toast-error.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-error.tsx"}]},{"target":"@ui/toast/toast-info.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-info.tsx"}]},{"target":"@ui/toast/toast-success.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-success.tsx"}]},{"target":"@ui/toast/toast-warning.tsx","targetKind":"shadcn-alias","type":"registry:component","owners":["toast"],"sources":[{"registryItem":"toast","path":"registry/constructive/blocks/toast/toast-warning.tsx"}]},{"target":"@ui/tooltip.tsx","targetKind":"shadcn-alias","type":"registry:ui","owners":["tooltip"],"sources":[{"registryItem":"tooltip","path":"registry/constructive/ui/tooltip.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/billing-activity-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/billing-activity-table.tsx"}]},{"target":"src/blocks/billing/billing-activity-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-activity-table"],"sources":[{"registryItem":"billing-activity-table","path":"registry/constructive/blocks/billing/billing-activity-table/messages.ts"}]},{"target":"src/blocks/billing/billing-contracts/billing-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["billing-contracts"],"sources":[{"registryItem":"billing-contracts","path":"registry/constructive/blocks/billing/billing-contracts/billing-contracts.ts"}]},{"target":"src/blocks/billing/billing-credits-card/billing-credits-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/billing-credits-card.tsx"}]},{"target":"src/blocks/billing/billing-credits-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-credits-card"],"sources":[{"registryItem":"billing-credits-card","path":"registry/constructive/blocks/billing/billing-credits-card/messages.ts"}]},{"target":"src/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx"}]},{"target":"src/blocks/billing/billing-entitlements-list/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-entitlements-list"],"sources":[{"registryItem":"billing-entitlements-list","path":"registry/constructive/blocks/billing/billing-entitlements-list/messages.ts"}]},{"target":"src/blocks/billing/billing-pricing-table/billing-pricing-table.tsx","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/billing-pricing-table.tsx"}]},{"target":"src/blocks/billing/billing-pricing-table/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-pricing-table"],"sources":[{"registryItem":"billing-pricing-table","path":"registry/constructive/blocks/billing/billing-pricing-table/messages.ts"}]},{"target":"src/blocks/billing/billing-settings-page/billing-settings-page.tsx","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/billing-settings-page.tsx"}]},{"target":"src/blocks/billing/billing-settings-page/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-settings-page"],"sources":[{"registryItem":"billing-settings-page","path":"registry/constructive/blocks/billing/billing-settings-page/messages.ts"}]},{"target":"src/blocks/billing/billing-subscription-card/billing-subscription-card.tsx","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/billing-subscription-card.tsx"}]},{"target":"src/blocks/billing/billing-subscription-card/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-subscription-card"],"sources":[{"registryItem":"billing-subscription-card","path":"registry/constructive/blocks/billing/billing-subscription-card/messages.ts"}]},{"target":"src/blocks/billing/billing-ui/billing-ui.tsx","targetKind":"literal","type":"registry:lib","owners":["billing-ui"],"sources":[{"registryItem":"billing-ui","path":"registry/constructive/blocks/billing/billing-ui/billing-ui.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/billing-usage-history.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/billing-usage-history.tsx"}]},{"target":"src/blocks/billing/billing-usage-history/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-history"],"sources":[{"registryItem":"billing-usage-history","path":"registry/constructive/blocks/billing/billing-usage-history/messages.ts"}]},{"target":"src/blocks/billing/billing-usage-overview/billing-usage-overview.tsx","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/billing-usage-overview.tsx"}]},{"target":"src/blocks/billing/billing-usage-overview/messages.ts","targetKind":"literal","type":"registry:component","owners":["billing-usage-overview"],"sources":[{"registryItem":"billing-usage-overview","path":"registry/constructive/blocks/billing/billing-usage-overview/messages.ts"}]},{"target":"src/blocks/console-kit/console-connection-menu.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx"}]},{"target":"src/blocks/console-kit/console-kit-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts"}]},{"target":"src/blocks/console-kit/console-kit-core.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-core.tsx"}]},{"target":"src/blocks/console-kit/console-kit-routes.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-routes.ts"}]},{"target":"src/blocks/console-kit/console-kit-runtime.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx"}]},{"target":"src/blocks/console-kit/console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/auth-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/console-kit/constructive/auth-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/billing-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-billing"],"sources":[{"registryItem":"console-module-billing","path":"registry/constructive/blocks/console-kit/constructive/billing-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx"}]},{"target":"src/blocks/console-kit/constructive/constructive-graphql.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts"}]},{"target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts"}]},{"target":"src/blocks/console-kit/constructive/notifications-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-notifications"],"sources":[{"registryItem":"console-module-notifications","path":"registry/constructive/blocks/console-kit/constructive/notifications-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/organizations-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/console-kit/constructive/organizations-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/storage-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/console-kit/constructive/storage-adapter.ts"}]},{"target":"src/blocks/console-kit/constructive/users-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/console-kit/constructive/users-adapter.ts"}]},{"target":"src/blocks/console-kit/feature-module.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/feature-module.ts"}]},{"target":"src/blocks/console-kit/store/adapter-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts"}]},{"target":"src/blocks/console-kit/store/console-kit-store.tsx","targetKind":"literal","type":"registry:component","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx"}]},{"target":"src/blocks/console-kit/store/context-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/context-slice.ts"}]},{"target":"src/blocks/console-kit/store/endpoint-capability-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts"}]},{"target":"src/blocks/console-kit/store/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/index.ts"}]},{"target":"src/blocks/console-kit/store/navigation-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts"}]},{"target":"src/blocks/console-kit/store/runtime-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts"}]},{"target":"src/blocks/console-kit/store/session-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/store/session-slice.ts"}]},{"target":"src/blocks/console-kit/use-latest-callback.ts","targetKind":"literal","type":"registry:lib","owners":["console-kit-core"],"sources":[{"registryItem":"console-kit-core","path":"registry/constructive/blocks/console-kit/use-latest-callback.ts"}]},{"target":"src/blocks/console-runtime/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/capabilities.ts"}]},{"target":"src/blocks/console-runtime/endpoints.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/endpoints.ts"}]},{"target":"src/blocks/console-runtime/feature-adapter.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/feature-adapter.ts"}]},{"target":"src/blocks/console-runtime/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/index.ts"}]},{"target":"src/blocks/console-runtime/session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/session.ts"}]},{"target":"src/blocks/console-runtime/standalone-session.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/standalone-session.ts"}]},{"target":"src/blocks/console-runtime/transport.ts","targetKind":"literal","type":"registry:lib","owners":["console-runtime"],"sources":[{"registryItem":"console-runtime","path":"registry/constructive/blocks/console-runtime/transport.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-account-view.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-account-view.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-challenge-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-challenge-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-auth"],"sources":[{"registryItem":"console-module-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-console-module.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-contracts.ts"}]},{"target":"src/blocks/feature-packs/auth/auth-entry-panel.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-entry-panel.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/auth/auth-password-policy.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/auth-password-policy.ts"}]},{"target":"src/blocks/feature-packs/billing/billing-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-billing"],"sources":[{"registryItem":"console-module-billing","path":"registry/constructive/blocks/feature-packs/billing/billing-console-module.tsx"}]},{"target":"src/blocks/feature-packs/billing/billing-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/billing-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/data/data-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-data"],"sources":[{"registryItem":"console-module-data","path":"registry/constructive/blocks/feature-packs/data/data-console-module.tsx"}]},{"target":"src/blocks/feature-packs/data/data-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/data-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/notifications/notifications-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-notifications"],"sources":[{"registryItem":"console-module-notifications","path":"registry/constructive/blocks/feature-packs/notifications/notifications-console-module.tsx"}]},{"target":"src/blocks/feature-packs/notifications/notifications-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/notifications-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-access-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-access-panels.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-console-module.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-contracts.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/organizations/organizations-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-organizations"],"sources":[{"registryItem":"console-module-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-meta-contract.ts"}]},{"target":"src/blocks/feature-packs/organizations/organizations-operation-panels.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/organizations-operation-panels.tsx"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts","targetKind":"literal","type":"registry:lib","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts"}]},{"target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx","targetKind":"literal","type":"registry:component","owners":["pack-foundation"],"sources":[{"registryItem":"pack-foundation","path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-module.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-console-slice.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-console-slice.ts"}]},{"target":"src/blocks/feature-packs/storage/storage-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-feature-pack.tsx"}]},{"target":"src/blocks/feature-packs/storage/storage-meta-contract.ts","targetKind":"literal","type":"registry:lib","owners":["console-module-storage"],"sources":[{"registryItem":"console-module-storage","path":"registry/constructive/blocks/feature-packs/storage/storage-meta-contract.ts"}]},{"target":"src/blocks/feature-packs/users/users-console-module.tsx","targetKind":"literal","type":"registry:component","owners":["console-module-users"],"sources":[{"registryItem":"console-module-users","path":"registry/constructive/blocks/feature-packs/users/users-console-module.tsx"}]},{"target":"src/blocks/feature-packs/users/users-feature-pack.tsx","targetKind":"literal","type":"registry:component","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/users-feature-pack.tsx"}]},{"target":"src/blocks/presets/full-console-kit.tsx","targetKind":"literal","type":"registry:component","owners":["preset-full"],"sources":[{"registryItem":"preset-full","path":"registry/constructive/blocks/presets/full-console-kit.tsx"}]},{"target":"src/feature-packs/capabilities.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/capabilities.ts"}]},{"target":"src/feature-packs/catalog-validation.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog-validation.ts"}]},{"target":"src/feature-packs/catalog.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/catalog.ts"}]},{"target":"src/feature-packs/index.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/index.ts"}]},{"target":"src/feature-packs/manifest.ts","targetKind":"literal","type":"registry:lib","owners":["console-feature-catalog"],"sources":[{"registryItem":"console-feature-catalog","path":"registry/constructive/feature-packs/manifest.ts"}]},{"target":"~/.constructive/feature-packs/auth.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-auth"],"sources":[{"registryItem":"feature-pack-auth","path":"registry/constructive/blocks/feature-packs/auth/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/billing.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-billing"],"sources":[{"registryItem":"feature-pack-billing","path":"registry/constructive/blocks/feature-packs/billing/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/data.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-data"],"sources":[{"registryItem":"feature-pack-data","path":"registry/constructive/blocks/feature-packs/data/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/full.json","targetKind":"project-root","type":"registry:file","owners":["preset-full"],"sources":[{"registryItem":"preset-full","path":"registry/constructive/blocks/presets/full.json"}]},{"target":"~/.constructive/feature-packs/notifications.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-notifications"],"sources":[{"registryItem":"feature-pack-notifications","path":"registry/constructive/blocks/feature-packs/notifications/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/organizations.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-organizations"],"sources":[{"registryItem":"feature-pack-organizations","path":"registry/constructive/blocks/feature-packs/organizations/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/storage.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-storage"],"sources":[{"registryItem":"feature-pack-storage","path":"registry/constructive/blocks/feature-packs/storage/feature-pack.json"}]},{"target":"~/.constructive/feature-packs/users.json","targetKind":"project-root","type":"registry:file","owners":["feature-pack-users"],"sources":[{"registryItem":"feature-pack-users","path":"registry/constructive/blocks/feature-packs/users/feature-pack.json"}]}]},"featurePacks":[{"schemaVersion":1,"id":"data","title":"Data","description":"Dynamic table exploration and CRUD surfaces driven by Constructive metadata and GraphQL introspection.","dependencies":[],"endpoints":{"required":["data"],"optional":[]},"capabilities":{"required":["data.meta","data.introspection"],"optional":["data.search","data.i18n","data.realtime"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","search","i18n","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"auth","title":"Authentication","description":"Consumer sign-in, account profile, password, and session-management surfaces.","dependencies":[],"endpoints":{"required":["auth"],"optional":[]},"capabilities":{"required":["auth.sessions","auth.credentials","auth.password"],"optional":["auth.email","auth.connected-accounts","auth.identity-providers","auth.passkeys","auth.phone","auth.devices"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"users","title":"App access","description":"Application member governance, lifecycle controls, profiles, permission grants, and invitations.","dependencies":[],"endpoints":{"required":["admin"],"optional":["auth"]},"capabilities":{"required":["users.directory","users.memberships"],"optional":["users.permissions","users.profiles","users.invites"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"organizations","title":"Organizations","description":"Tenant membership governance, invitations, access policy, hierarchy, settings, and developer credentials.","dependencies":[],"endpoints":{"required":[],"optional":["admin","auth","billing","data"]},"capabilities":{"required":["organizations.memberships"],"optional":["organizations.permissions","organizations.limits","organizations.profiles","organizations.hierarchy","organizations.invites"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"storage","title":"Storage","description":"Policy-aware bucket navigation, uploads, downloads, and object deletion.","dependencies":[],"endpoints":{"required":[],"optional":["storage","admin","data"]},"capabilities":{"required":["storage.buckets","storage.files"],"optional":["storage.versioning","storage.content-hash","storage.custom-keys","storage.audit-log"]},"metadata":{"requiredMetaSections":["tables","fields","constraints","relations","query","scope"],"optionalMetaSections":["encoding","storage"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"billing","title":"Billing","description":"Plans, subscriptions, entitlement meters, usage, credits, and account activity.","dependencies":[],"endpoints":{"required":[],"optional":["billing","admin","data"]},"capabilities":{"required":["billing.plans","billing.subscriptions"],"optional":["billing.meters"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}},{"schemaVersion":1,"id":"notifications","title":"Notifications","description":"User notification inbox and read-state actions with optional settings and realtime capabilities.","dependencies":[],"endpoints":{"required":[],"optional":["notifications","auth","data"]},"capabilities":{"required":["notifications.inbox"],"optional":["notifications.settings","notifications.realtime"]},"metadata":{"requiredMetaSections":[],"optionalMetaSections":["tables","fields","constraints","relations","query","scope","encoding","realtime"],"requiredIntrospectionSections":["root-operations","types","input-objects"],"optionalIntrospectionSections":["enums","directives"]}}],"presetProfiles":[{"schemaVersion":1,"id":"full","presetSlug":"full","title":"Full","description":"Every first-release Constructive feature pack.","stability":"stable","featurePacks":["data","auth","users","organizations","storage","billing","notifications"]}],"standaloneContract":null,"runtimeContract":{"appliesTo":"console-kit","tenantDescriptor":{"type":"ConstructiveTenantDatabase","requiredFields":["id","endpoints"],"optionalFields":["name"],"endpointKinds":["data","auth","admin","billing","storage","notifications"],"endpointValue":"string | { id?: string; url: string }","rules":["Use the secret-free descriptor returned by provisioning.","Pass explicit semantic endpoints; never derive sibling hosts or private routing headers.","A host-owned session must declare the same databaseId."]},"routing":{"type":"ConsoleKitRoute","sourceTarget":"src/blocks/console-kit/console-kit-routes.ts","internalOwnership":"Omit routes.route and optionally pass routes.defaultRoute.","controlledProps":["route","getHref","onRouteChange","renderLink"],"initialRouteProp":"defaultRoute"},"state":{"factory":"createConsoleKitStore","architecture":"one per-instance Zustand store with modular slices","hostStoreRule":"Create a host-owned store with every installed module storeSlice contribution.","resetScope":["database","identity"],"forbidden":["credentials in Zustand","a process-wide Console Kit store","a second provider or state system per feature pack"]},"authentication":{"internalSession":"When an auth endpoint is present and no host session is passed, ConstructiveConsoleKitCore creates a database-scoped standalone session that supports sign-in, sign-up, restoration, and authentication-failure handling.","hostSession":"Without a routable auth endpoint, pass a host-owned session whose databaseId exactly matches the tenant descriptor. A mismatch fails closed.","csrf":"Pass csrfTokenProvider when the tenant enables require_csrf_for_auth.","callback":"By default the browser wrapper parses the current URL and scrubs recognized callback credentials. Pass callback={false} only when the host owns the complete callback lifecycle.","credentials":"Callback credentials stay in a closure-owned vault and session credentials stay in the database-scoped session; neither belongs in Zustand or component props."},"evidenceOrder":["explicit endpoint resolution","current _meta","GraphQL introspection","authenticated resource reads"],"metadataStates":["checking","compatible","incompatible","error"],"featureAvailabilityStates":["checking","available","unavailable","unauthorized","incompatible","error"],"capabilityStates":["checking","ready","partial","unavailable"],"degradedBehavior":"Installed Console modules stay fail-closed when required public evidence is absent. Standalone feature packs render only the resource, policy, actions, and state supplied by their host.","authorizationBoundary":"Registry installation and schema discovery never grant authority. PostgreSQL privileges and RLS remain authoritative for every request.","diagnostics":"Set showDiagnostics on ConstructiveConsoleKit/Core only outside production to expose endpoint and capability evidence. Retry after correcting the host endpoint map; do not infer sibling endpoints or operator authority."},"registryDocumentation":"`preset-full` installed all seven Console modules and the stable Full preset component. Render `FullConsoleKit` with a secret-free tenant descriptor.\n\nDegraded states: installed backend modules do not imply public routes or user authority; Storage, Billing, or Notifications can remain partial or unavailable while other modules continue.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","verify":{"runFrom":"consumer project root after installation","prerequisites":["Install the consumer project dependencies before running these commands.","Provide no live tenant or credentials for static verification."],"commands":["pnpm exec tsc --noEmit","pnpm build"],"manualChecks":["Confirm .constructive/feature-packs/data.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/auth.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/users.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/organizations.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/storage.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/billing.json exists and matches the endpoint, capability, and metadata requirements in this plan.","Confirm .constructive/feature-packs/notifications.json exists and matches the endpoint, capability, and metadata requirements in this plan.","During integration, render with showDiagnostics enabled only outside production and resolve every unexpected endpoint or capability state.","Exercise authenticated reads and writes with the intended tenant role; schema evidence does not prove RLS authority."]}} diff --git a/.agents/skills/constructive-blocks/references/install-roots.v1.json b/.agents/skills/constructive-blocks/references/install-roots.v1.json index 42cd1b3..cf86a5b 100644 --- a/.agents/skills/constructive-blocks/references/install-roots.v1.json +++ b/.agents/skills/constructive-blocks/references/install-roots.v1.json @@ -3,8 +3,8 @@ "kind": "constructive.blocks-install-roots", "source": { "repository": "https://github.com/constructive-io/blocks", - "branch": "feat/feature-packs-console-kit", - "commit": "4f2a789fde9a90c0c6ed5977896493bb4818fa77", + "branch": "feat/app-kit", + "commit": "1a72e5d95f7ce4a243cd4536ed78c638708d538c", "inspector": { "schemaVersion": 1, "kind": "constructive.console-kit-install-roots", @@ -22,44 +22,48 @@ "algorithm": "sha256", "aggregateRegistry": { "path": "apps/registry/registry.json", - "sha256": "c936b8230cef7ca78c6ad9557ac0975e839ad361be3a90e4358b846b105558d8" + "sha256": "55c93aaa98cfd8f1cdc0acb85e5abb422a0436d3137441105f24b2eb009049c4" }, "registryCatalog": { "path": "references/registry-catalog.v1.json", - "sha256": "84ce9d2b9728b3d62cb6b9e48ec2cd12153ea657490c419e68f849f672be3d1f" + "sha256": "4a5fd029f66e146b4218e47f86ba35fcbbf2572faaa274fc0a3c30088304ba66" }, "registryContent": { "path": "references/registry-content.v1.json", - "sha256": "df0376b1eeeca8d271a91c962b829365e989df35750058b348c4bd779e5e3517" + "sha256": "15908ba4f3c30d4b0da8424f796df1a376f7f24f58a23554ad2282812a829ec4" }, "packageResolutions": { "path": "references/package-resolutions.v1.json", - "sha256": "4cccce553d5c9dec6f11ca0b2b1ec7ea987e2f7308d46bd0e804f8a725147044" + "sha256": "b2243347053c6cb2298147f50d6a2502a158a2d891e1fc3bac4923ad799c7cad" }, "canonicalFiles": [ { "path": "package.json", - "sha256": "23b937b73c59eb348753fcbc4358253aeea5b11f9969864b7138ae281cdfe1a0" + "sha256": "c229ac9ac05af4a752ec22ed5dba912380f66d7bd65057a77f0a5a865a2b72a1" }, { "path": "apps/registry/package.json", - "sha256": "0263177a6461eb7223fc33c5725bba85053e5ea34a814a4b1ba5371220badcfb" + "sha256": "6e0d7140478d98d7271de4e8ff24001c65a299672ca3f34b250e5a30f973ebb0" }, { "path": "apps/registry/scripts/build.ts", - "sha256": "b8ad62ecf1e0a71503d1bd1da80b067f1b1377c4bddf5085e0c96c6bb7222be3" + "sha256": "e56a8694093ae590884cfe78779f868b4032a2da57076ec147a69d8e49ee2494" }, { "path": "packages/ui/registry.json", - "sha256": "095ab3caba8b5155dbce0585c09f36810d11801bcb8773954543946a6a2de104" + "sha256": "f15437373c77caa09a92fa5b077f757f0cdd64a27c77e1444412a3f82bef227f" }, { "path": "apps/blocks/registry.json", - "sha256": "169b49db903fe9af3cff736138fca8d5da295438e760d6c4f4853ecc5372b040" + "sha256": "cbe89216a09780463262fe10284e3b5d6b7cb3d67e35853005d4bb105b62c79f" + }, + { + "path": "apps/blocks/src/app/blocks/app-kit/page.tsx", + "sha256": "9bce8d78d2f951416fa43385937add24c27a3cb881ec56f8b1bf5cd36e37c740" }, { "path": "scripts/inspect-console-kit.ts", - "sha256": "227b742500fd81b8908d5c19e052c40898991d1bdf49223399c09c48610bd446" + "sha256": "22b32cdb69e3a2162a11930d72d718b1ecd8480c06340d62d0c303e72f8f0be7" }, { "path": "apps/blocks/src/feature-packs/catalog.ts", @@ -95,7 +99,7 @@ }, { "path": "packages/data/package.json", - "sha256": "6f807b216dace7cc2fe5cd92fcdb6f9b4d005fb0edace67d51735286a841e796" + "sha256": "930a0f1139db5f990d04e3f920f3954a6e16b5ed20ff290512bf59c466368572" }, { "path": "packages/data/src/meta-query.ts", @@ -107,7 +111,7 @@ }, { "path": "packages/sheets/package.json", - "sha256": "b2696df554c8339844a46cfed6f19df699c2b1ba12fab6f7962bbfc1b5f964f3" + "sha256": "a35cccdb3dab5b0ea6954affe26e6822c09f4b40ca10cee22429874a7840d05b" }, { "path": "packages/sheets/src/context/sheets-context.ts", @@ -115,7 +119,7 @@ }, { "path": "packages/sheets/src/context/sheets-execute.ts", - "sha256": "7eccc6b1014c029b7e5f5dc2c41258b7d0aeaf51cb2d51560dfc5e4cf1bfbd5a" + "sha256": "3615f980ee18fd27ab3b1941bbec215d91fc8b8125fcd8b4d293ba764e8902ca" }, { "path": "packages/sheets/src/auth/auth-execute.ts", @@ -135,11 +139,11 @@ }, { "path": "packages/sheets/src/adapter/postgraphile-adapter.ts", - "sha256": "d1788090e210eb86e28ab75a0c000430dc1b013b9e787fe6b118c553661fd3c6" + "sha256": "e0efb76f807240587ec98afa493762ad3ba5ae533212aeee92bd2e41e4acf89c" }, { "path": "packages/ui/package.json", - "sha256": "25bb3f7c9faa713107d90dff57adacad6b3a0b877f92261ceb70cca7ffb09989" + "sha256": "708c76d09f324cdea3fd8a294e5bd687e78fb69a7589cd81f9af4668ea10fcf0" }, { "path": "packages/ui/src/components/sidebar.tsx", @@ -155,11 +159,11 @@ }, { "path": "packages/ui/src/index.ts", - "sha256": "7fb432a69eee6f08229043cecf3bdf47b51c5dfaa2831de1ffcb28d8fee810c5" + "sha256": "d13b47b8f5dccb02099d6eb8c1a89b59d11650474524400491c76869aa1900ae" }, { "path": "packages/schema-builder/package.json", - "sha256": "e02d5d8d7e4e6cf2ef5f6bc7f257919f8e3017c371909e46cba4b83cc410453d" + "sha256": "555af70a66c0ccf56f16606af8c71aaa0805a3d98d4c22f03a02d88f5c8504e3" }, { "path": "apps/blocks/src/blocks/feature-packs/data/data-feature-pack.tsx", @@ -290,97 +294,97 @@ { "item": "console-kit-core", "path": "references/install-plans.v1/console-kit-core.json", - "sha256": "5244d84e0e4888225bc7e0d4adf769e2ce1e26b8459e4d0d2ab5d1bf0d138968" + "sha256": "99ba624565edf8e5f5061afc4796c33dd193253b9442eb3a901295e80507f2e7" }, { "item": "console-kit-nextjs", "path": "references/install-plans.v1/console-kit-nextjs.json", - "sha256": "8efe2a3e0614916906d08db100dee4dc562a68785453b2e692e749c149aba17d" + "sha256": "fbeed09b27a1c0858fe369a27467bed2eed559802cf86f6414740552dc2eddbb" }, { "item": "console-module-auth", "path": "references/install-plans.v1/console-module-auth.json", - "sha256": "26ef98810fe46f7cc20bccb19ac75925aae13e89c3acdbe4e8446bae148d9abe" + "sha256": "a4fa3d1b48fc0ee038ffc132fe1d9a50a4d017e069a007dee3d111a344ab6e9f" }, { "item": "console-module-billing", "path": "references/install-plans.v1/console-module-billing.json", - "sha256": "d15bf94159034cca954c329f8fd5bd9f5269f5ab5a7d8f6c76d1d78e6ebe92ec" + "sha256": "3b420f8bb6ba86ff0a943c3abb12922e6a0c8f610a55a741c94e214d4fb8df3b" }, { "item": "console-module-data", "path": "references/install-plans.v1/console-module-data.json", - "sha256": "05d4877fa294e24f3cb73ba1ae60067569b842c13fbb446f98f2a385ea18fff5" + "sha256": "fd9830c4f19702ed25f4fb087ba2907e6768ad188bb4726d6664dff6858aa03d" }, { "item": "console-module-notifications", "path": "references/install-plans.v1/console-module-notifications.json", - "sha256": "dfc2646ec940e762e8ad1d3e10a3f6d87419ea8e0f78a48c511510cd1ac6a36d" + "sha256": "48596bfdd151391f59e9bf1849a68d6901b121f4359bf894c94e6bb0f7af7ebe" }, { "item": "console-module-organizations", "path": "references/install-plans.v1/console-module-organizations.json", - "sha256": "c48c228cd57d69bc08c2f802a2909ad498f11c91ac567353d2ed8f60120e9ab6" + "sha256": "277f8823ad07f1e285c932c4fab629ce8264d465cfcce32867f3eb39c9181087" }, { "item": "console-module-storage", "path": "references/install-plans.v1/console-module-storage.json", - "sha256": "6eae680af0e48a0cff82c9048bb578e4e912fc508fd793426b18f474e5d0feb2" + "sha256": "da09bc13a0007638d04e0e0a17ce24e8a000f35e0549897e0e59c6054a3d1f92" }, { "item": "console-module-users", "path": "references/install-plans.v1/console-module-users.json", - "sha256": "2dc40e24a79c1f7d8a1a632ad44606118b36f509ec07c464acd9d1e61583036e" + "sha256": "622e869c96bb9eb8aa2d1a898093e7dac177db8ecedf7b6ff9f4ad45ec9ffe50" }, { "item": "feature-pack-auth", "path": "references/install-plans.v1/feature-pack-auth.json", - "sha256": "bbf4a8e9e0fde6ac950d03d36863026fb7621e7b0a46ab970ef543b43c624506" + "sha256": "2beb9aaec013747942f8aa5fc19d95427c3899d26ff4bb4e767ecffed81e4b09" }, { "item": "feature-pack-billing", "path": "references/install-plans.v1/feature-pack-billing.json", - "sha256": "db4e4b528bd624ab072574a540656e0f6c637b0c90bb3fe7bd9010ea7972d322" + "sha256": "e0420dcfa4a41bd52ef08039dfff3960cd78d169212491037ceea5995001808b" }, { "item": "feature-pack-data", "path": "references/install-plans.v1/feature-pack-data.json", - "sha256": "60b8cb0d7a69487225a4dd244bb37fcaf73c27968bbe74144b6ea61a16059d5a" + "sha256": "158c549f952d1017c42ac625cfb36fdc8c1b4161e5400bd94e0c9a74a36c1f5f" }, { "item": "feature-pack-notifications", "path": "references/install-plans.v1/feature-pack-notifications.json", - "sha256": "db7bb7227b51c42ce43b07229e29225c928e544fbd22516fa20a2442e3935615" + "sha256": "71cccfcfbcd48aac9ae05a2fb01a37f881add15ef9cf1fdb11c6db3272e98f8c" }, { "item": "feature-pack-organizations", "path": "references/install-plans.v1/feature-pack-organizations.json", - "sha256": "9d1d14ece5f438e8c4d29f0b7257e7466a3f96a335bc074ab6a946901280e1dc" + "sha256": "14ed1faf5b76eece952e6325cbd154c4d0eb41039a43c28e5337082235176e15" }, { "item": "feature-pack-storage", "path": "references/install-plans.v1/feature-pack-storage.json", - "sha256": "5261a3e9145d113ad3cc03e45e11edbde7e9fbf025d3188ce097bd72d6ee15be" + "sha256": "b2478f019c18fb2ca427427cdb32cd25c740e562ee1043ae5490eb1dce41dcc9" }, { "item": "feature-pack-users", "path": "references/install-plans.v1/feature-pack-users.json", - "sha256": "946ee2328e1823e29b5253338b6c984d33231dba2539329f773a73d400c3a7d1" + "sha256": "38e69edfb2073d6910765843922d0067a2c43bb3647a974b2e0ef20c1b5f6cb8" }, { "item": "preset-auth-hardened", "path": "references/install-plans.v1/preset-auth-hardened.json", - "sha256": "042ac311ea165aac996dcab89e3cf309118f2b3e12601a34d8a04bef29881562" + "sha256": "eae85c94268c930ed993676d474b248bd6f8b5926479c806c572b4f2e1425195" }, { "item": "preset-b2b-storage", "path": "references/install-plans.v1/preset-b2b-storage.json", - "sha256": "b0036470ef8ea29bc04ec248c77c808c43409a1dae1063d40607de6b8dd0d7cb" + "sha256": "d3cbff7babe99ba89acc55f8dd62a7c9ced312835bf6269c77f8f9126a45e6a6" }, { "item": "preset-full", "path": "references/install-plans.v1/preset-full.json", - "sha256": "554904aae57c5444f2eaade918de8f8ee3f93bff1075170c96ee583954d9f921" + "sha256": "8e8c2bf3b3ec1d35b965c23d2fa7ff4a342a3eade593463881702774b34014be" } ] } @@ -390,42 +394,42 @@ "publicRegistryReady": false, "packageManager": "pnpm@10.28.0", "nodeEngine": ">=24.0.0", - "shadcnVersion": "4.13.1", + "testedShadcnVersion": "4.16.1", "packages": [ { "name": "@constructive-io/ui", - "version": "0.5.0", + "version": "0.8.0", "snapshotStatus": "branch-only", "manifestSource": { "path": "packages/ui/package.json", - "sha256": "25bb3f7c9faa713107d90dff57adacad6b3a0b877f92261ceb70cca7ffb09989" + "sha256": "708c76d09f324cdea3fd8a294e5bd687e78fb69a7589cd81f9af4668ea10fcf0" } }, { "name": "@constructive-io/data", - "version": "0.2.0", + "version": "0.5.0", "snapshotStatus": "branch-only", "manifestSource": { "path": "packages/data/package.json", - "sha256": "6f807b216dace7cc2fe5cd92fcdb6f9b4d005fb0edace67d51735286a841e796" + "sha256": "930a0f1139db5f990d04e3f920f3954a6e16b5ed20ff290512bf59c466368572" } }, { "name": "@constructive-io/sheets", - "version": "0.5.0", + "version": "0.8.1", "snapshotStatus": "branch-only", "manifestSource": { "path": "packages/sheets/package.json", - "sha256": "b2696df554c8339844a46cfed6f19df699c2b1ba12fab6f7962bbfc1b5f964f3" + "sha256": "a35cccdb3dab5b0ea6954affe26e6822c09f4b40ca10cee22429874a7840d05b" } }, { "name": "@constructive-io/schema-builder", - "version": "0.1.0", + "version": "0.4.1", "snapshotStatus": "branch-only", "manifestSource": { "path": "packages/schema-builder/package.json", - "sha256": "e02d5d8d7e4e6cf2ef5f6bc7f257919f8e3017c371909e46cba4b83cc410453d" + "sha256": "555af70a66c0ccf56f16606af8c71aaa0805a3d98d4c22f03a02d88f5c8504e3" } } ], @@ -461,16 +465,30 @@ "consumerWorkspace": "disposable-or-isolated-worktree", "localLockfilePolicy": "The local install necessarily records localhost tarball resolutions; never commit its temporary .npmrc or lockfile.", "promotionRule": "After public release, remove local registry settings, regenerate the lockfile from public registries, reject every localhost reference, then commit or merge the consumer.", - "installCommandTemplate": "pnpm dlx shadcn@4.13.1 add @constructive/{name}", + "testedInstallCommandTemplate": "pnpm dlx shadcn@4.16.1 add @constructive/{name}", "localInstallCommandTemplate": "pnpm --dir /apps/registry exec shadcn add @constructive/{name} --cwd --yes", "maintainerVerificationCommand": "SMOKE_CASE=app-shell,billing-settings-page,feature-pack-data,preset-b2b-storage,console-kit-nextjs pnpm --dir --filter @constructive-io/registry smoke:install" } }, + "documentation": { + "appKit": { + "public": { + "url": "https://constructive-io.github.io/blocks/blocks/app-kit/", + "status": "future-only" + }, + "pinnedSource": { + "path": "apps/blocks/src/app/blocks/app-kit/page.tsx", + "sha256": "9bce8d78d2f951416fa43385937add24c27a3cb881ec56f8b1bf5cd36e37c740" + } + } + }, "registry": { "namespace": "@constructive", "urlTemplate": "https://constructive-io.github.io/blocks/r/{name}.json", - "shadcnVersion": "4.13.1", - "shadcnVersionPolicy": "exact", + "publicShadcnTag": "latest", + "publicInstallCommandTemplate": "pnpm dlx shadcn@latest add @constructive/{name}", + "testedShadcnVersion": "4.16.1", + "testedShadcnVersionPolicy": "exact", "queryOverrides": [ { "item": "feature-pack-data", @@ -491,7 +509,7 @@ ], "catalog": { "path": "references/registry-catalog.v1.json", - "itemCount": 102, + "itemCount": 123, "projection": [ "name", "type", @@ -503,7 +521,8 @@ "devDependencies", "registryDependencies", "files", - "installCommand" + "installCommand", + "meta.constructive" ] }, "componentsJson": { @@ -541,42 +560,268 @@ }, "sheetsAdapterSource": { "path": "packages/sheets/src/adapter/postgraphile-adapter.ts", - "sha256": "d1788090e210eb86e28ab75a0c000430dc1b013b9e787fe6b118c553661fd3c6" + "sha256": "e0efb76f807240587ec98afa493762ad3ba5ae533212aeee92bd2e41e4acf89c" }, "requirements": { - "queryType": { "typeName": "Query", "fields": ["_meta"] }, - "metaSchema": { "typeName": "MetaSchema", "fields": ["tables"] }, + "queryType": { + "typeName": "Query", + "fields": [ + "_meta" + ] + }, + "metaSchema": { + "typeName": "MetaSchema", + "fields": [ + "tables" + ] + }, "metaTable": { "typeName": "MetaTable", - "fields": ["name", "schemaName", "query", "fields", "inflection", "indexes", "constraints", "foreignKeyConstraints", "primaryKeyConstraints", "uniqueConstraints", "relations", "storage", "search", "i18n", "realtime", "scope"] + "fields": [ + "name", + "schemaName", + "query", + "fields", + "inflection", + "indexes", + "constraints", + "foreignKeyConstraints", + "primaryKeyConstraints", + "uniqueConstraints", + "relations", + "storage", + "search", + "i18n", + "realtime", + "scope" + ] + }, + "metaTableQuery": { + "typeName": "MetaQuery", + "fields": [ + "all", + "one", + "create", + "update", + "delete" + ] }, - "metaTableQuery": { "typeName": "MetaQuery", "fields": ["all", "one", "create", "update", "delete"] }, "metaField": { "typeName": "MetaField", - "fields": ["name", "type", "isNotNull", "hasDefault", "isPrimaryKey", "isForeignKey", "description", "enumValues"] + "fields": [ + "name", + "type", + "isNotNull", + "hasDefault", + "isPrimaryKey", + "isForeignKey", + "description", + "enumValues" + ] + }, + "metaEnum": { + "typeName": "MetaEnum", + "fields": [ + "name", + "values" + ] + }, + "metaType": { + "typeName": "MetaType", + "fields": [ + "pgType", + "gqlType", + "isArray", + "isNotNull", + "hasDefault", + "subtype", + "encoding" + ] + }, + "metaEncoding": { + "typeName": "MetaScalarEncoding", + "fields": [ + "kind", + "elementType", + "dimensions", + "geometrySubtype", + "srid", + "dotPath" + ] + }, + "metaIndex": { + "typeName": "MetaIndex", + "fields": [ + "name", + "isUnique", + "isPrimary", + "columns", + "fields" + ] + }, + "metaPrimaryKey": { + "typeName": "MetaPrimaryKeyConstraint", + "fields": [ + "name", + "fields" + ] + }, + "metaUnique": { + "typeName": "MetaUniqueConstraint", + "fields": [ + "name", + "fields" + ] + }, + "metaForeignKey": { + "typeName": "MetaForeignKeyConstraint", + "fields": [ + "name", + "fields", + "referencedTable", + "referencedFields", + "refFields", + "refTable" + ] + }, + "metaRefTable": { + "typeName": "MetaRefTable", + "fields": [ + "name" + ] + }, + "metaConstraints": { + "typeName": "MetaConstraints", + "fields": [ + "primaryKey", + "unique", + "foreignKey" + ] + }, + "metaInflection": { + "typeName": "MetaInflection", + "fields": [ + "tableType", + "allRows", + "connection", + "edge", + "filterType", + "orderByType", + "conditionType", + "patchType", + "createInputType", + "createPayloadType", + "updatePayloadType", + "deletePayloadType" + ] + }, + "metaRelations": { + "typeName": "MetaRelations", + "fields": [ + "belongsTo", + "has", + "hasOne", + "hasMany", + "manyToMany" + ] + }, + "metaBelongsTo": { + "typeName": "MetaBelongsToRelation", + "fields": [ + "fieldName", + "isUnique", + "type", + "keys", + "references" + ] + }, + "metaHas": { + "typeName": "MetaHasRelation", + "fields": [ + "fieldName", + "isUnique", + "type", + "keys", + "referencedBy" + ] + }, + "metaManyToMany": { + "typeName": "MetaManyToManyRelation", + "fields": [ + "fieldName", + "type", + "junctionTable", + "junctionLeftConstraint", + "junctionLeftKeyAttributes", + "junctionRightConstraint", + "junctionRightKeyAttributes", + "leftKeyAttributes", + "rightKeyAttributes", + "rightTable" + ] + }, + "metaStorage": { + "typeName": "MetaStorage", + "fields": [ + "isFilesTable", + "isBucketsTable" + ] }, - "metaEnum": { "typeName": "MetaEnum", "fields": ["name", "values"] }, - "metaType": { "typeName": "MetaType", "fields": ["pgType", "gqlType", "isArray", "isNotNull", "hasDefault", "subtype", "encoding"] }, - "metaEncoding": { "typeName": "MetaScalarEncoding", "fields": ["kind", "elementType", "dimensions", "geometrySubtype", "srid", "dotPath"] }, - "metaIndex": { "typeName": "MetaIndex", "fields": ["name", "isUnique", "isPrimary", "columns", "fields"] }, - "metaPrimaryKey": { "typeName": "MetaPrimaryKeyConstraint", "fields": ["name", "fields"] }, - "metaUnique": { "typeName": "MetaUniqueConstraint", "fields": ["name", "fields"] }, - "metaForeignKey": { "typeName": "MetaForeignKeyConstraint", "fields": ["name", "fields", "referencedTable", "referencedFields", "refFields", "refTable"] }, - "metaRefTable": { "typeName": "MetaRefTable", "fields": ["name"] }, - "metaConstraints": { "typeName": "MetaConstraints", "fields": ["primaryKey", "unique", "foreignKey"] }, - "metaInflection": { "typeName": "MetaInflection", "fields": ["tableType", "allRows", "connection", "edge", "filterType", "orderByType", "conditionType", "patchType", "createInputType", "createPayloadType", "updatePayloadType", "deletePayloadType"] }, - "metaRelations": { "typeName": "MetaRelations", "fields": ["belongsTo", "has", "hasOne", "hasMany", "manyToMany"] }, - "metaBelongsTo": { "typeName": "MetaBelongsToRelation", "fields": ["fieldName", "isUnique", "type", "keys", "references"] }, - "metaHas": { "typeName": "MetaHasRelation", "fields": ["fieldName", "isUnique", "type", "keys", "referencedBy"] }, - "metaManyToMany": { "typeName": "MetaManyToManyRelation", "fields": ["fieldName", "type", "junctionTable", "junctionLeftConstraint", "junctionLeftKeyAttributes", "junctionRightConstraint", "junctionRightKeyAttributes", "leftKeyAttributes", "rightKeyAttributes", "rightTable"] }, - "metaStorage": { "typeName": "MetaStorage", "fields": ["isFilesTable", "isBucketsTable"] }, - "metaSearch": { "typeName": "MetaSearch", "fields": ["algorithms", "columns", "hasUnifiedSearch", "config"] }, - "metaSearchColumn": { "typeName": "MetaSearchColumn", "fields": ["name", "algorithm"] }, - "metaSearchConfig": { "typeName": "MetaSearchConfig", "fields": ["weights", "boostRecent", "boostRecencyField", "boostRecencyDecay"] }, - "metaI18n": { "typeName": "MetaI18n", "fields": ["translationTable", "translatableFields"] }, - "metaI18nField": { "typeName": "MetaI18nField", "fields": ["name", "type"] }, - "metaRealtime": { "typeName": "MetaRealtime", "fields": ["subscriptionFieldName"] }, - "metaScope": { "typeName": "MetaScope", "fields": ["scope", "tier", "keyColumn", "entityTable", "source"] } + "metaSearch": { + "typeName": "MetaSearch", + "fields": [ + "algorithms", + "columns", + "hasUnifiedSearch", + "config" + ] + }, + "metaSearchColumn": { + "typeName": "MetaSearchColumn", + "fields": [ + "name", + "algorithm" + ] + }, + "metaSearchConfig": { + "typeName": "MetaSearchConfig", + "fields": [ + "weights", + "boostRecent", + "boostRecencyField", + "boostRecencyDecay" + ] + }, + "metaI18n": { + "typeName": "MetaI18n", + "fields": [ + "translationTable", + "translatableFields" + ] + }, + "metaI18nField": { + "typeName": "MetaI18nField", + "fields": [ + "name", + "type" + ] + }, + "metaRealtime": { + "typeName": "MetaRealtime", + "fields": [ + "subscriptionFieldName" + ] + }, + "metaScope": { + "typeName": "MetaScope", + "fields": [ + "scope", + "tier", + "keyColumn", + "entityTable", + "source" + ] + } }, "documents": { "metaQuery": { @@ -650,19 +895,123 @@ "requiredPayloadFields" ], "documents": [ - ["admin", "Mutation.updateAppMembership", "UpdateAppMembershipInput", "appMembership", ["id"]], - ["admin", "Mutation.createAppOwnerGrant", "CreateAppOwnerGrantInput", "appOwnerGrant", ["id"]], - ["admin", "Mutation.createAppAdminGrant", "CreateAppAdminGrantInput", "appAdminGrant", ["id"]], - ["admin", "Mutation.createAppGrant", "CreateAppGrantInput", "appGrant", ["id"]], - ["admin", "Mutation.createAppProfileGrant", "CreateAppProfileGrantInput", "appProfileGrant", ["id"]], - ["admin", "Mutation.createAppProfileDefinitionGrant", "CreateAppProfileDefinitionGrantInput", "appProfileDefinitionGrant", ["id"]], - ["admin", "Mutation.createAppPermissionDefaultGrant", "CreateAppPermissionDefaultGrantInput", "appPermissionDefaultGrant", ["id"]], - ["admin", "Mutation.createAppProfile", "CreateAppProfileInput", "appProfile", ["id"]], - ["admin", "Mutation.updateAppProfile", "UpdateAppProfileInput", "appProfile", ["id"]], - ["admin", "Mutation.deleteAppProfile", "DeleteAppProfileInput", "appProfile", ["id"]], - ["admin", "Mutation.createAppInvite", "CreateAppInviteInput", "appInvite", ["id"]], - ["admin", "Mutation.updateAppInvite", "UpdateAppInviteInput", "appInvite", ["id"]], - ["admin", "Mutation.deleteAppInvite", "DeleteAppInviteInput", "appInvite", ["id"]] + [ + "admin", + "Mutation.updateAppMembership", + "UpdateAppMembershipInput", + "appMembership", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createAppOwnerGrant", + "CreateAppOwnerGrantInput", + "appOwnerGrant", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createAppAdminGrant", + "CreateAppAdminGrantInput", + "appAdminGrant", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createAppGrant", + "CreateAppGrantInput", + "appGrant", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createAppProfileGrant", + "CreateAppProfileGrantInput", + "appProfileGrant", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createAppProfileDefinitionGrant", + "CreateAppProfileDefinitionGrantInput", + "appProfileDefinitionGrant", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createAppPermissionDefaultGrant", + "CreateAppPermissionDefaultGrantInput", + "appPermissionDefaultGrant", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createAppProfile", + "CreateAppProfileInput", + "appProfile", + [ + "id" + ] + ], + [ + "admin", + "Mutation.updateAppProfile", + "UpdateAppProfileInput", + "appProfile", + [ + "id" + ] + ], + [ + "admin", + "Mutation.deleteAppProfile", + "DeleteAppProfileInput", + "appProfile", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createAppInvite", + "CreateAppInviteInput", + "appInvite", + [ + "id" + ] + ], + [ + "admin", + "Mutation.updateAppInvite", + "UpdateAppInviteInput", + "appInvite", + [ + "id" + ] + ], + [ + "admin", + "Mutation.deleteAppInvite", + "DeleteAppInviteInput", + "appInvite", + [ + "id" + ] + ] ] }, "organizations-enabled-actions": { @@ -683,29 +1032,215 @@ "requiredPayloadFields" ], "documents": [ - ["admin", "Mutation.updateOrgMembership", "UpdateOrgMembershipInput", "orgMembership", ["id"]], - ["admin", "Mutation.deleteOrgMembership", "DeleteOrgMembershipInput", "orgMembership", ["id"]], - ["admin", "Mutation.createOrgAdminGrant", "CreateOrgAdminGrantInput", "orgAdminGrant", ["id"]], - ["admin", "Mutation.createOrgOwnerGrant", "CreateOrgOwnerGrantInput", "orgOwnerGrant", ["id"]], - ["admin", "Mutation.createOrgGrant", "CreateOrgGrantInput", "orgGrant", ["id"]], - ["admin", "Mutation.createOrgProfileGrant", "CreateOrgProfileGrantInput", "orgProfileGrant", ["id"]], - ["admin", "Mutation.createOrgProfileDefinitionGrant", "CreateOrgProfileDefinitionGrantInput", "orgProfileDefinitionGrant", ["id"]], - ["admin", "Mutation.createOrgProfile", "CreateOrgProfileInput", "orgProfile", ["id"]], - ["admin", "Mutation.updateOrgProfile", "UpdateOrgProfileInput", "orgProfile", ["id"]], - ["admin", "Mutation.deleteOrgProfile", "DeleteOrgProfileInput", "orgProfile", ["id"]], - ["admin", "Mutation.createOrgMemberProfile", "CreateOrgMemberProfileInput", "orgMemberProfile", ["id"]], - ["admin", "Mutation.updateOrgMemberProfile", "UpdateOrgMemberProfileInput", "orgMemberProfile", ["id"]], - ["admin", "Mutation.updateOrgMembershipSetting", "UpdateOrgMembershipSettingInput", "orgMembershipSetting", ["id"]], - ["admin", "Mutation.updateOrgMembershipDefault", "UpdateOrgMembershipDefaultInput", "orgMembershipDefault", ["id"]], - ["admin", "Mutation.createOrgChartEdgeGrant", "CreateOrgChartEdgeGrantInput", "orgChartEdgeGrant", ["id"]], - ["admin", "Mutation.createOrgInvite", "CreateOrgInviteInput", "orgInvite", ["id"]], - ["admin", "Mutation.deleteOrgInvite", "DeleteOrgInviteInput", "orgInvite", ["id"]], - ["auth", "Mutation.deleteUser", "DeleteUserInput", "user", ["id"]], - ["auth", "Mutation.updateUser", "UpdateUserInput", "user", ["id"]], - ["auth", "Mutation.revokeOrgApiKey", "RevokeOrgApiKeyInput", null, ["result"]], - ["auth", "Mutation.deleteOrgPrincipal", "DeleteOrgPrincipalInput", null, ["result"]], - ["auth", "Mutation.createOrgPrincipal", "CreateOrgPrincipalInput", null, ["result"]], - ["auth", "Mutation.createUser", "CreateUserInput", "user", ["id", "type", "username"]] + [ + "admin", + "Mutation.updateOrgMembership", + "UpdateOrgMembershipInput", + "orgMembership", + [ + "id" + ] + ], + [ + "admin", + "Mutation.deleteOrgMembership", + "DeleteOrgMembershipInput", + "orgMembership", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createOrgAdminGrant", + "CreateOrgAdminGrantInput", + "orgAdminGrant", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createOrgOwnerGrant", + "CreateOrgOwnerGrantInput", + "orgOwnerGrant", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createOrgGrant", + "CreateOrgGrantInput", + "orgGrant", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createOrgProfileGrant", + "CreateOrgProfileGrantInput", + "orgProfileGrant", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createOrgProfileDefinitionGrant", + "CreateOrgProfileDefinitionGrantInput", + "orgProfileDefinitionGrant", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createOrgProfile", + "CreateOrgProfileInput", + "orgProfile", + [ + "id" + ] + ], + [ + "admin", + "Mutation.updateOrgProfile", + "UpdateOrgProfileInput", + "orgProfile", + [ + "id" + ] + ], + [ + "admin", + "Mutation.deleteOrgProfile", + "DeleteOrgProfileInput", + "orgProfile", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createOrgMemberProfile", + "CreateOrgMemberProfileInput", + "orgMemberProfile", + [ + "id" + ] + ], + [ + "admin", + "Mutation.updateOrgMemberProfile", + "UpdateOrgMemberProfileInput", + "orgMemberProfile", + [ + "id" + ] + ], + [ + "admin", + "Mutation.updateOrgMembershipSetting", + "UpdateOrgMembershipSettingInput", + "orgMembershipSetting", + [ + "id" + ] + ], + [ + "admin", + "Mutation.updateOrgMembershipDefault", + "UpdateOrgMembershipDefaultInput", + "orgMembershipDefault", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createOrgChartEdgeGrant", + "CreateOrgChartEdgeGrantInput", + "orgChartEdgeGrant", + [ + "id" + ] + ], + [ + "admin", + "Mutation.createOrgInvite", + "CreateOrgInviteInput", + "orgInvite", + [ + "id" + ] + ], + [ + "admin", + "Mutation.deleteOrgInvite", + "DeleteOrgInviteInput", + "orgInvite", + [ + "id" + ] + ], + [ + "auth", + "Mutation.deleteUser", + "DeleteUserInput", + "user", + [ + "id" + ] + ], + [ + "auth", + "Mutation.updateUser", + "UpdateUserInput", + "user", + [ + "id" + ] + ], + [ + "auth", + "Mutation.revokeOrgApiKey", + "RevokeOrgApiKeyInput", + null, + [ + "result" + ] + ], + [ + "auth", + "Mutation.deleteOrgPrincipal", + "DeleteOrgPrincipalInput", + null, + [ + "result" + ] + ], + [ + "auth", + "Mutation.createOrgPrincipal", + "CreateOrgPrincipalInput", + null, + [ + "result" + ] + ], + [ + "auth", + "Mutation.createUser", + "CreateUserInput", + "user", + [ + "id", + "type", + "username" + ] + ] ] } }, @@ -1710,7 +2245,7 @@ "executeType": "SheetsExecuteFn", "executeSource": { "path": "packages/sheets/src/context/sheets-execute.ts", - "sha256": "7eccc6b1014c029b7e5f5dc2c41258b7d0aeaf51cb2d51560dfc5e4cf1bfbd5a" + "sha256": "3615f980ee18fd27ab3b1941bbec215d91fc8b8125fcd8b4d293ba764e8902ca" }, "requiredConfigFields": [ "endpoint", @@ -1830,7 +2365,7 @@ }, { "path": "packages/sheets/src/context/sheets-execute.ts", - "sha256": "7eccc6b1014c029b7e5f5dc2c41258b7d0aeaf51cb2d51560dfc5e4cf1bfbd5a" + "sha256": "3615f980ee18fd27ab3b1941bbec215d91fc8b8125fcd8b4d293ba764e8902ca" }, { "path": "packages/sheets/src/hooks/use-sheets-meta.ts", @@ -1838,7 +2373,7 @@ }, { "path": "packages/sheets/src/adapter/postgraphile-adapter.ts", - "sha256": "d1788090e210eb86e28ab75a0c000430dc1b013b9e787fe6b118c553661fd3c6" + "sha256": "e0efb76f807240587ec98afa493762ad3ba5ae533212aeee92bd2e41e4acf89c" } ], "sourceLimitationIds": [ @@ -2650,11 +3185,11 @@ }, { "id": "storage.buckets.path-2", - "verificationProfile": "tenant-runtime", - "endpointKinds": [ - "storage", - "admin", - "data" + "verificationProfile": "tenant-runtime", + "endpointKinds": [ + "storage", + "admin", + "data" ], "evidence": { "type": "compatible-meta-contract", @@ -2694,11 +3229,11 @@ }, { "id": "storage.files.path-2", - "verificationProfile": "tenant-runtime", - "endpointKinds": [ - "storage", - "admin", - "data" + "verificationProfile": "tenant-runtime", + "endpointKinds": [ + "storage", + "admin", + "data" ], "evidence": { "type": "compatible-meta-contract", @@ -3880,7 +4415,7 @@ "presetProfiles": [ "full" ], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/console-kit-nextjs" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/console-kit-nextjs" }, { "name": "preset-auth-hardened", @@ -3895,7 +4430,7 @@ "presetProfiles": [ "auth-hardened" ], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/preset-auth-hardened" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/preset-auth-hardened" }, { "name": "preset-b2b-storage", @@ -3912,7 +4447,7 @@ "presetProfiles": [ "b2b-storage" ], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/preset-b2b-storage" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/preset-b2b-storage" }, { "name": "preset-full", @@ -3931,7 +4466,7 @@ "presetProfiles": [ "full" ], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/preset-full" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/preset-full" }, { "name": "console-kit-core", @@ -3940,7 +4475,7 @@ "description": "The leaf-independent Console Kit shell, runtime, discovery, and single modular Zustand store.", "featurePacks": [], "presetProfiles": [], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/console-kit-core" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/console-kit-core" }, { "name": "console-module-data", @@ -3951,7 +4486,7 @@ "data" ], "presetProfiles": [], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/console-module-data" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/console-module-data" }, { "name": "console-module-auth", @@ -3962,7 +4497,7 @@ "auth" ], "presetProfiles": [], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/console-module-auth" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/console-module-auth" }, { "name": "console-module-users", @@ -3973,7 +4508,7 @@ "users" ], "presetProfiles": [], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/console-module-users" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/console-module-users" }, { "name": "console-module-organizations", @@ -3984,7 +4519,7 @@ "organizations" ], "presetProfiles": [], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/console-module-organizations" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/console-module-organizations" }, { "name": "console-module-storage", @@ -3995,7 +4530,7 @@ "storage" ], "presetProfiles": [], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/console-module-storage" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/console-module-storage" }, { "name": "console-module-billing", @@ -4006,7 +4541,7 @@ "billing" ], "presetProfiles": [], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/console-module-billing" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/console-module-billing" }, { "name": "console-module-notifications", @@ -4017,7 +4552,7 @@ "notifications" ], "presetProfiles": [], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/console-module-notifications" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/console-module-notifications" }, { "name": "feature-pack-data", @@ -4028,7 +4563,7 @@ "data" ], "presetProfiles": [], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-data" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-data" }, { "name": "feature-pack-auth", @@ -4039,7 +4574,7 @@ "auth" ], "presetProfiles": [], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-auth" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-auth" }, { "name": "feature-pack-users", @@ -4050,7 +4585,7 @@ "users" ], "presetProfiles": [], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-users" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-users" }, { "name": "feature-pack-organizations", @@ -4061,7 +4596,7 @@ "organizations" ], "presetProfiles": [], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-organizations" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-organizations" }, { "name": "feature-pack-storage", @@ -4072,7 +4607,7 @@ "storage" ], "presetProfiles": [], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-storage" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-storage" }, { "name": "feature-pack-billing", @@ -4083,7 +4618,7 @@ "billing" ], "presetProfiles": [], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-billing" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-billing" }, { "name": "feature-pack-notifications", @@ -4094,7 +4629,7 @@ "notifications" ], "presetProfiles": [], - "installCommand": "pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-notifications" + "installCommand": "pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-notifications" } ], "featurePackManifests": [ diff --git a/.agents/skills/constructive-blocks/references/package-resolutions.v1.json b/.agents/skills/constructive-blocks/references/package-resolutions.v1.json index 4cd4787..0933773 100644 --- a/.agents/skills/constructive-blocks/references/package-resolutions.v1.json +++ b/.agents/skills/constructive-blocks/references/package-resolutions.v1.json @@ -1,9 +1,9 @@ { "schemaVersion": 1, "kind": "constructive.blocks-package-resolutions", - "sourceCommit": "4f2a789fde9a90c0c6ed5977896493bb4818fa77", + "sourceCommit": "1a72e5d95f7ce4a243cd4536ed78c638708d538c", "registry": "https://registry.npmjs.org", - "recordCount": 10, + "recordCount": 25, "records": [ { "name": "@base-ui/react", @@ -11,12 +11,66 @@ "integrity": "sha512-/jzjTWJYXhRFO45Bev9lc3cHbmjzCMpUqbMZ2AgKy/z25mY9B6shGSNcXcjQar9n5doM0KYW1W8fcFv2jZBuMw==", "resolved": "https://registry.npmjs.org/@base-ui/react/-/react-1.6.0.tgz" }, + { + "name": "@internationalized/date", + "version": "3.12.3", + "integrity": "sha512-fuLX+3ZKLsxI73y8b01EG/WjHb6gE6weCqlfawPO27kBWGMh9G1yH6Csv1uU7/cac9H2GHmOMt6CjmuQ1aia4Q==", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.3.tgz" + }, + { + "name": "@remixicon/react", + "version": "4.9.0", + "integrity": "sha512-5/jLDD4DtKxH2B4QVXTobvV1C2uL8ab9D5yAYNtFt+w80O0Ys1xFOrspqROL3fjrZi+7ElFUWE37hBfaAl6U+Q==", + "resolved": "https://registry.npmjs.org/@remixicon/react/-/react-4.9.0.tgz" + }, + { + "name": "@tanstack/charts", + "version": "0.6.4", + "integrity": "sha512-x3kZPcRmZh3GNWvYGf+vb+kK2GFeWv/UBCNdptnq5sc9Au2skjnqLf8rs3Idh1q8VPWjnZI7jgaw0lLLRYt0gw==", + "resolved": "https://registry.npmjs.org/@tanstack/charts/-/charts-0.6.4.tgz" + }, + { + "name": "@tanstack/charts-scales", + "version": "0.6.4", + "integrity": "sha512-n98RyrMMf+xMeOnEV4H4cs6X2IbNzyWDEHOJYFaw8+BYt6QNL77CRXzlgTxCvvgnkrbtq5fjKXxRSx5Z+Pmelg==", + "resolved": "https://registry.npmjs.org/@tanstack/charts-scales/-/charts-scales-0.6.4.tgz" + }, + { + "name": "@tanstack/react-charts", + "version": "0.6.4", + "integrity": "sha512-seP5Dd+JQAxosikGmUfDWtFxYPZk/0ED8biDLYZUYmUCe00Wtz1oWd3d+xiB1Al7gS0RARd6krcCcai+CKHyMA==", + "resolved": "https://registry.npmjs.org/@tanstack/react-charts/-/react-charts-0.6.4.tgz" + }, + { + "name": "@tanstack/react-form", + "version": "1.33.3", + "integrity": "sha512-lkzI/y15fHC8lKvzsLXFLLqGWroa+okvV2cKRCGAL+d0Kdf040fdMZbKh6uCXDMc08Ngpl8G3VZFnZ5KVUkUIw==", + "resolved": "https://registry.npmjs.org/@tanstack/react-form/-/react-form-1.33.3.tgz" + }, { "name": "@tanstack/react-query", "version": "5.101.4", "integrity": "sha512-yRg2pfOCxIs4ZJW3XYYHU/WgtD04FHSnfHlpRT7h7pR77hwkdRG4wxbKe4aq6P0RvXUTBSQpQeadS1SUYUe+KA==", "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.101.4.tgz" }, + { + "name": "@tanstack/react-table", + "version": "9.0.0-beta.58", + "integrity": "sha512-pvacQiA9pymAivt2dOOsOcnNEp5FMPvX2hjbnkWsh0lvlBtf6mh9bnZ7q14iAakGMiGs+o+/tbSr5jT19XfTgg==", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-9.0.0-beta.58.tgz" + }, + { + "name": "@tanstack/react-virtual", + "version": "3.14.9", + "integrity": "sha512-qZyr0FZDP8rDC4WBhsryIZmAd9bveJvFGUJJtskWaew6/0dTRS6wZxnR6VQ5bY2KwL3LjerrHqQLk3a0GKcPXQ==", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.14.9.tgz" + }, + { + "name": "@types/leaflet", + "version": "1.9.22", + "integrity": "sha512-h3lhECYEKDasG7LFHu+GiHqAvsgLuQvlJvVZzJDGONo3sEL+wUOqSFLnwkZlK0qVxnxbuGFW8iBlJNYs5wgndA==", + "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.22.tgz" + }, { "name": "class-variance-authority", "version": "0.7.1", @@ -29,23 +83,59 @@ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" }, + { + "name": "d3-scale", + "version": "4.0.2", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz" + }, { "name": "graphql", "version": "17.0.2", "integrity": "sha512-FRWbddMxfkjiB7z+aQDWIR+E34xo9I8c9mtK2RPv8PmMzKRvrdsreHL/Ui/TmwHJfhHChEtsFPyMHKI+xuarQQ==", "resolved": "https://registry.npmjs.org/graphql/-/graphql-17.0.2.tgz" }, + { + "name": "inflekt", + "version": "0.7.2", + "integrity": "sha512-csXH1tW9nvYmj3WMYCqPenF74l1PNzQG9SyQkpbRw60gC9f6GRSAxtUjepkBMb7m8NpVN+nOHtxHSqf4eh0uLA==", + "resolved": "https://registry.npmjs.org/inflekt/-/inflekt-0.7.2.tgz" + }, + { + "name": "leaflet", + "version": "1.9.4", + "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz" + }, { "name": "lucide-react", - "version": "1.27.0", - "integrity": "sha512-rJicGl/3Fly/E0rOH1YmPZ6e49JCnKknh1ox1vpHnkfjujAkKA6sqUZvH3MTAaXXjgexyUwgNwTJzTtYuAFYJw==", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.27.0.tgz" + "version": "1.28.0", + "integrity": "sha512-fARAFJULsGuDDydjp6+6blekG/sBIM29TerzLjc9bQUKAcEfrSc4ZQKb25KRz4OMKd87cZTb5dgq0w/T6KufVg==", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.28.0.tgz" }, { "name": "motion", - "version": "12.42.2", - "integrity": "sha512-Atvv11yUKIid41cVrRBDVX5m8tF8kNpExRSlbpt6APClhDjtwQssgFHhQzejxw7/7YYbjHSPKBVbHo05BuJT5Q==", - "resolved": "https://registry.npmjs.org/motion/-/motion-12.42.2.tgz" + "version": "12.43.0", + "integrity": "sha512-BQgQbSa9Hn3/mtbib0MK53y6JSANa+YKUKlaYnWzAVDH424RYQ5LVpV3pNiWH00BA2z4ojsSdMzqT7g2FQwjuQ==", + "resolved": "https://registry.npmjs.org/motion/-/motion-12.43.0.tgz" + }, + { + "name": "react-aria-components", + "version": "1.20.0", + "integrity": "sha512-BMbpIgoV9aELeBrB0Y120NgoigHb5OdcJwc+4e7uSnbTbamea6lo+gqcc4LAxzMaK3Jf+7LI1oCDE6yANsmxIQ==", + "resolved": "https://registry.npmjs.org/react-aria-components/-/react-aria-components-1.20.0.tgz" + }, + { + "name": "react-leaflet", + "version": "5.0.0", + "integrity": "sha512-CWbTpr5vcHw5bt9i4zSlPEVQdTVcML390TjeDG0cK59z1ylexpqC6M1PJFjV8jD7CF+ACBFsLIDs6DRMoLEofw==", + "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-5.0.0.tgz" + }, + { + "name": "sonner", + "version": "2.0.7", + "integrity": "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w==", + "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.7.tgz" }, { "name": "tailwind-merge", diff --git a/.agents/skills/constructive-blocks/references/registry-catalog.v1.json b/.agents/skills/constructive-blocks/references/registry-catalog.v1.json index 428e264..67f49a6 100644 --- a/.agents/skills/constructive-blocks/references/registry-catalog.v1.json +++ b/.agents/skills/constructive-blocks/references/registry-catalog.v1.json @@ -1 +1 @@ -{"schemaVersion":1,"kind":"constructive.blocks-registry-catalog","sourceCommit":"4f2a789fde9a90c0c6ed5977896493bb4818fa77","aggregatePath":"apps/registry/registry.json","registryNamespace":"@constructive","itemCount":102,"items":[{"name":"constructive-theme","type":"registry:theme","title":"Constructive Theme","description":"Constructive design system theme — OKLCH colors, z-index layers, shadow utilities, and animations.","categories":[],"docs":null,"dependencies":[],"devDependencies":[],"registryDependencies":[],"files":[],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/constructive-theme"},{"name":"cn","type":"registry:lib","title":"cn utility","description":"Tailwind CSS class name merge utility using clsx and tailwind-merge.","categories":["utility"],"docs":"Import: `import { cn } from '@/lib/utils'`","dependencies":["clsx","tailwind-merge"],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/cn"},{"name":"slot","type":"registry:lib","title":"Slot utility","description":"Polymorphic component utilities for asChild pattern.","categories":["utility"],"docs":"Import: `import { Slot } from '@/lib/slot'`","dependencies":[],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/lib/slot.tsx","type":"registry:lib","target":"@lib/slot.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/slot"},{"name":"use-controllable-state","type":"registry:hook","title":"useControllableState","description":"Hook for components with controlled/uncontrolled state.","categories":["hook"],"docs":"Import: `import { useControllableState } from '@/hooks/use-controllable-state'`","dependencies":[],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/hooks/use-controllable-state.ts","type":"registry:hook","target":"@hooks/use-controllable-state.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/use-controllable-state"},{"name":"use-debounce","type":"registry:hook","title":"useDebounce","description":"Hook for debouncing values.","categories":["hook"],"docs":"Import: `import { useDebounce } from '@/hooks/use-debounce'`","dependencies":[],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/hooks/use-debounce.ts","type":"registry:hook","target":"@hooks/use-debounce.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/use-debounce"},{"name":"use-mobile","type":"registry:hook","title":"useIsMobile","description":"Hook for detecting mobile viewport.","categories":["hook"],"docs":"Import: `import { useIsMobile } from '@/hooks/use-mobile'`","dependencies":[],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/hooks/use-mobile.ts","type":"registry:hook","target":"@hooks/use-mobile.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/use-mobile"},{"name":"motion-config","type":"registry:lib","title":"Motion Config","description":"Animation presets and spring configurations for motion library.","categories":["animation"],"docs":"Import: `import { motionConfig } from '@/lib/motion/motion-config'`","dependencies":["motion"],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/lib/motion/motion-config.ts","type":"registry:lib","target":"@lib/motion/motion-config.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/motion-config"},{"name":"button","type":"registry:ui","title":"Button","description":"A button component with multiple variants and sizes.","categories":["primitive"],"docs":"Import: `import { Button } from '@/components/ui/button'`","dependencies":["class-variance-authority"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/slot","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/button.tsx","type":"registry:ui","target":"@ui/button.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/button"},{"name":"badge","type":"registry:ui","title":"Badge","description":"A badge component for status indicators and labels.","categories":["primitive"],"docs":"Import: `import { Badge } from '@/components/ui/badge'`","dependencies":["class-variance-authority"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/badge.tsx","type":"registry:ui","target":"@ui/badge.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/badge"},{"name":"label","type":"registry:ui","title":"Label","description":"A label component for form fields.","categories":["primitive"],"docs":"Import: `import { Label } from '@/components/ui/label'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/label.tsx","type":"registry:ui","target":"@ui/label.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/label"},{"name":"skeleton","type":"registry:ui","title":"Skeleton","description":"A skeleton loading placeholder component.","categories":["primitive"],"docs":"Import: `import { Skeleton } from '@/components/ui/skeleton'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/skeleton.tsx","type":"registry:ui","target":"@ui/skeleton.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/skeleton"},{"name":"card","type":"registry:ui","title":"Card","description":"A card component with header, content, and footer sections.","categories":["primitive"],"docs":"Import: `import { Card, CardHeader, CardContent, CardFooter } from '@/components/ui/card'`","dependencies":["class-variance-authority"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/card.tsx","type":"registry:ui","target":"@ui/card.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/card"},{"name":"separator","type":"registry:ui","title":"Separator","description":"A visual separator for dividing content.","categories":["primitive"],"docs":"Import: `import { Separator } from '@/components/ui/separator'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/separator.tsx","type":"registry:ui","target":"@ui/separator.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/separator"},{"name":"alert","type":"registry:ui","title":"Alert","description":"An alert component for displaying messages.","categories":["primitive"],"docs":"Import: `import { Alert, AlertTitle, AlertDescription } from '@/components/ui/alert'`","dependencies":["class-variance-authority"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/alert.tsx","type":"registry:ui","target":"@ui/alert.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/alert"},{"name":"input","type":"registry:ui","title":"Input","description":"A text input component built on Base UI.","categories":["form"],"docs":"Import: `import { Input } from '@/components/ui/input'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/input.tsx","type":"registry:ui","target":"@ui/input.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/input"},{"name":"textarea","type":"registry:ui","title":"Textarea","description":"A multiline text input component.","categories":["form"],"docs":"Import: `import { Textarea } from '@/components/ui/textarea'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/textarea.tsx","type":"registry:ui","target":"@ui/textarea.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/textarea"},{"name":"checkbox","type":"registry:ui","title":"Checkbox","description":"A checkbox component built on Base UI.","categories":["form"],"docs":"Import: `import { Checkbox } from '@/components/ui/checkbox'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/checkbox.tsx","type":"registry:ui","target":"@ui/checkbox.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/checkbox"},{"name":"checkbox-group","type":"registry:ui","title":"Checkbox Group","description":"A group wrapper for multiple checkboxes.","categories":["form"],"docs":"Import: `import { CheckboxGroup } from '@/components/ui/checkbox-group'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/checkbox","@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/checkbox-group.tsx","type":"registry:ui","target":"@ui/checkbox-group.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/checkbox-group"},{"name":"radio-group","type":"registry:ui","title":"Radio Group","description":"A radio group component built on Base UI.","categories":["form"],"docs":"Import: `import { RadioGroup } from '@/components/ui/radio-group'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/radio-group.tsx","type":"registry:ui","target":"@ui/radio-group.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/radio-group"},{"name":"switch","type":"registry:ui","title":"Switch","description":"A toggle switch component built on Base UI.","categories":["form"],"docs":"Import: `import { Switch } from '@/components/ui/switch'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/switch.tsx","type":"registry:ui","target":"@ui/switch.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/switch"},{"name":"progress","type":"registry:ui","title":"Progress","description":"A progress bar component built on Base UI.","categories":["form"],"docs":"Import: `import { Progress } from '@/components/ui/progress'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/progress.tsx","type":"registry:ui","target":"@ui/progress.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/progress"},{"name":"avatar","type":"registry:ui","title":"Avatar","description":"An avatar component with image and fallback support.","categories":["data-display"],"docs":"Import: `import { Avatar, AvatarImage, AvatarFallback } from '@/components/ui/avatar'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/avatar.tsx","type":"registry:ui","target":"@ui/avatar.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/avatar"},{"name":"portal","type":"registry:ui","title":"Portal","description":"Portal management for overlay components with z-index layering.","categories":["layout"],"docs":"Import: `import { Portal } from '@/components/ui/portal'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/portal.tsx","type":"registry:ui","target":"@ui/portal.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/portal"},{"name":"scroll-area","type":"registry:ui","title":"Scroll Area","description":"A custom scrollable area component built on Base UI.","categories":["layout"],"docs":"Import: `import { ScrollArea } from '@/components/ui/scroll-area'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/scroll-area.tsx","type":"registry:ui","target":"@ui/scroll-area.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/scroll-area"},{"name":"select","type":"registry:ui","title":"Select","description":"A select/dropdown component built on Base UI.","categories":["form"],"docs":"Import: `import { Select } from '@/components/ui/select'`","dependencies":["@base-ui/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/select.tsx","type":"registry:ui","target":"@ui/select.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/select"},{"name":"tooltip","type":"registry:ui","title":"Tooltip","description":"A tooltip component built on Base UI.","categories":["overlay"],"docs":"Import: `import { Tooltip } from '@/components/ui/tooltip'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/tooltip.tsx","type":"registry:ui","target":"@ui/tooltip.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/tooltip"},{"name":"popover","type":"registry:ui","title":"Popover","description":"A popover component built on Base UI.","categories":["overlay"],"docs":"Import: `import { Popover } from '@/components/ui/popover'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/popover.tsx","type":"registry:ui","target":"@ui/popover.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/popover"},{"name":"dialog","type":"registry:ui","title":"Dialog","description":"A modal dialog component built on Base UI.","categories":["overlay"],"docs":"Import: `import { Dialog } from '@/components/ui/dialog'`","dependencies":["@base-ui/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/button","@constructive/scroll-area","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/dialog.tsx","type":"registry:ui","target":"@ui/dialog.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/dialog"},{"name":"alert-dialog","type":"registry:ui","title":"Alert Dialog","description":"An alert dialog for confirmations built on Base UI.","categories":["overlay"],"docs":"Import: `import { AlertDialog } from '@/components/ui/alert-dialog'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/button","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/alert-dialog.tsx","type":"registry:ui","target":"@ui/alert-dialog.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/alert-dialog"},{"name":"dropdown-menu","type":"registry:ui","title":"Dropdown Menu","description":"A dropdown menu component built on Base UI.","categories":["overlay"],"docs":"Import: `import { DropdownMenu } from '@/components/ui/dropdown-menu'`","dependencies":["@base-ui/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/dropdown-menu.tsx","type":"registry:ui","target":"@ui/dropdown-menu.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/dropdown-menu"},{"name":"sheet","type":"registry:ui","title":"Sheet","description":"A slide-out panel component with animations.","categories":["overlay"],"docs":"Import: `import { Sheet } from '@/components/ui/sheet'`","dependencies":["@base-ui/react","class-variance-authority","lucide-react","motion"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/motion-config","@constructive/use-controllable-state","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/sheet.tsx","type":"registry:ui","target":"@ui/sheet.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/sheet"},{"name":"drawer","type":"registry:ui","title":"Drawer","description":"A bottom drawer component using Vaul.","categories":["overlay"],"docs":"Import: `import { Drawer } from '@/components/ui/drawer'`","dependencies":["vaul"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/drawer.tsx","type":"registry:ui","target":"@ui/drawer.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/drawer"},{"name":"tabs","type":"registry:ui","title":"Tabs","description":"A tabs component built on Base UI.","categories":["layout"],"docs":"Import: `import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/tabs.tsx","type":"registry:ui","target":"@ui/tabs.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/tabs"},{"name":"collapsible","type":"registry:ui","title":"Collapsible","description":"A collapsible/accordion component built on Base UI.","categories":["layout"],"docs":"Import: `import { Collapsible } from '@/components/ui/collapsible'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/collapsible.tsx","type":"registry:ui","target":"@ui/collapsible.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/collapsible"},{"name":"resizable","type":"registry:ui","title":"Resizable","description":"Resizable panel layouts using react-resizable-panels.","categories":["layout"],"docs":"Import: `import { ResizablePanel, ResizablePanelGroup, ResizableHandle } from '@/components/ui/resizable'`","dependencies":["lucide-react","react-resizable-panels@^3.0.0"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/resizable.tsx","type":"registry:ui","target":"@ui/resizable.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/resizable"},{"name":"table","type":"registry:ui","title":"Table","description":"A table component with header, body, and cell primitives.","categories":["data-display"],"docs":"Import: `import { Table, TableHeader, TableBody, TableRow, TableCell } from '@/components/ui/table'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/table.tsx","type":"registry:ui","target":"@ui/table.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/table"},{"name":"pagination","type":"registry:ui","title":"Pagination","description":"A pagination component with navigation controls.","categories":["navigation"],"docs":"Import: `import { Pagination } from '@/components/ui/pagination'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/button","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/pagination.tsx","type":"registry:ui","target":"@ui/pagination.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/pagination"},{"name":"breadcrumb","type":"registry:ui","title":"Breadcrumb","description":"A breadcrumb navigation component.","categories":["navigation"],"docs":"Import: `import { Breadcrumb } from '@/components/ui/breadcrumb'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/breadcrumb.tsx","type":"registry:ui","target":"@ui/breadcrumb.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/breadcrumb"},{"name":"form","type":"registry:ui","title":"Form","description":"Form utilities with react-hook-form integration.","categories":["form"],"docs":"Import: `import { Form, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form'`","dependencies":["react-hook-form"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/label","@constructive/slot","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/form.tsx","type":"registry:ui","target":"@ui/form.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/form"},{"name":"form-control","type":"registry:ui","title":"Form Control","description":"A form control wrapper with label and error display.","categories":["form"],"docs":"Import: `import { FormControl } from '@/components/ui/form-control'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/slot","@constructive/label","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/form-control.tsx","type":"registry:ui","target":"@ui/form-control.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/form-control"},{"name":"input-group","type":"registry:ui","title":"Input Group","description":"Input with addons and icons.","categories":["form"],"docs":"Import: `import { InputGroup } from '@/components/ui/input-group'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/input","@constructive/textarea","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/input-group.tsx","type":"registry:ui","target":"@ui/input-group.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/input-group"},{"name":"autocomplete","type":"registry:ui","title":"Autocomplete","description":"An autocomplete component built on Base UI.","categories":["input"],"docs":"Import: `import { Autocomplete } from '@/components/ui/autocomplete'`","dependencies":["@base-ui/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/input","@constructive/scroll-area","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/autocomplete.tsx","type":"registry:ui","target":"@ui/autocomplete.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/autocomplete"},{"name":"command","type":"registry:ui","title":"Command","description":"A command palette component.","categories":["overlay"],"docs":"Import: `import { Command } from '@/components/ui/command'`","dependencies":["@base-ui/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/command.tsx","type":"registry:ui","target":"@ui/command.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/command"},{"name":"combobox","type":"registry:ui","title":"Combobox","description":"A combobox component with search built on Base UI.","categories":["input"],"docs":"Import: `import { Combobox } from '@/components/ui/combobox'`","dependencies":["@base-ui/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/input","@constructive/scroll-area","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/combobox.tsx","type":"registry:ui","target":"@ui/combobox.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/combobox"},{"name":"multi-select","type":"registry:ui","title":"Multi Select","description":"A multi-select component with tags.","categories":["input"],"docs":"Import: `import { MultiSelect } from '@/components/ui/multi-select'`","dependencies":["class-variance-authority","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/badge","@constructive/popover","@constructive/separator","@constructive/input","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/multi-select.tsx","type":"registry:ui","target":"@ui/multi-select.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/multi-select"},{"name":"tags","type":"registry:ui","title":"Tags","description":"A tags input component with autocomplete.","categories":["input"],"docs":"Import: `import { Tags } from '@/components/ui/tags'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/badge","@constructive/button","@constructive/command","@constructive/popover","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/tags.tsx","type":"registry:ui","target":"@ui/tags.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/tags"},{"name":"record-picker","type":"registry:ui","title":"Record Picker","description":"A record selection component with search and filtering.","categories":["input"],"docs":"Import: `import { RecordPicker } from '@/components/ui/record-picker'`","dependencies":["@remixicon/react","match-sorter"],"devDependencies":[],"registryDependencies":["@constructive/use-debounce","@constructive/checkbox","@constructive/input-group","@constructive/scroll-area","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/record-picker.tsx","type":"registry:ui","target":"@ui/record-picker.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/record-picker"},{"name":"stepper","type":"registry:ui","title":"Stepper","description":"A stepper component for multi-step workflows.","categories":["navigation"],"docs":"Import: `import { Stepper } from '@/components/ui/stepper'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/slot","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/stepper.tsx","type":"registry:ui","target":"@ui/stepper.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/stepper"},{"name":"sidebar","type":"registry:ui","title":"Sidebar","description":"A responsive Base UI sidebar with off-canvas, icon-only, and fixed collapse modes.","categories":["navigation"],"docs":"Import: `import { Sidebar, SidebarProvider, SidebarTrigger } from '@/components/ui/sidebar'`","dependencies":["@base-ui/react","class-variance-authority","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/use-mobile","@constructive/button","@constructive/input","@constructive/separator","@constructive/sheet","@constructive/skeleton","@constructive/tooltip","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/sidebar.tsx","type":"registry:ui","target":"@ui/sidebar.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/sidebar"},{"name":"calendar-rac","type":"registry:ui","title":"Calendar","description":"A calendar component using React Aria Components.","categories":["input"],"docs":"Import: `import { Calendar } from '@/components/ui/calendar-rac'`","dependencies":["@internationalized/date","react-aria-components"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/calendar-rac.tsx","type":"registry:ui","target":"@ui/calendar-rac.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/calendar-rac"},{"name":"json-input","type":"registry:ui","title":"JSON Input","description":"A JSON editor component using React Ace.","categories":["input"],"docs":"Import: `import { JsonInput } from '@/components/ui/json-input'`","dependencies":["lucide-react","react-ace","ace-builds"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/button","@constructive/tooltip","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/json-input.tsx","type":"registry:ui","target":"@ui/json-input.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/json-input"},{"name":"sonner","type":"registry:ui","title":"Toaster","description":"Toast notifications using Sonner.","categories":["block"],"docs":"Import: `import { Toaster } from '@/components/ui/sonner'`","dependencies":["sonner"],"devDependencies":[],"registryDependencies":["@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/sonner.tsx","type":"registry:ui","target":"@ui/sonner.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/sonner"},{"name":"dock","type":"registry:ui","title":"Dock","description":"A macOS-style dock component.","categories":["navigation"],"docs":"Import: `import { Dock, DockIcon } from '@/components/ui/dock'`","dependencies":["class-variance-authority","motion"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/motion-config","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/dock.tsx","type":"registry:ui","target":"@ui/dock.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/dock"},{"name":"page-header","type":"registry:ui","title":"Page Header","description":"A simple page header component.","categories":["navigation"],"docs":"Import: `import { PageHeader } from '@/components/ui/page-header'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/page-header.tsx","type":"registry:ui","target":"@ui/page-header.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/page-header"},{"name":"flickering-grid","type":"registry:ui","title":"Flickering Grid","description":"An animated grid background effect.","categories":["effect"],"docs":"Import: `import { FlickeringGrid } from '@/components/ui/flickering-grid'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/flickering-grid.tsx","type":"registry:ui","target":"@ui/flickering-grid.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/flickering-grid"},{"name":"flow-zoom-panel","type":"registry:ui","title":"Flow Zoom Panel","description":"Zoom in/out and fit-view controls for React Flow canvases.","categories":["layout"],"docs":"Import: `import { FlowZoomPanel } from '@/components/ui/flow-zoom-panel'`","dependencies":["@xyflow/react","@remixicon/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/button","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/flow-zoom-panel.tsx","type":"registry:ui","target":"@ui/flow-zoom-panel.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/flow-zoom-panel"},{"name":"motion-grid","type":"registry:ui","title":"Motion Grid","description":"An animated grid with frame-based transitions.","categories":["effect"],"docs":"Import: `import { MotionGrid } from '@/components/ui/motion-grid'`","dependencies":["motion"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/motion-config","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/motion-grid.tsx","type":"registry:ui","target":"@ui/motion-grid.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/motion-grid"},{"name":"progressive-blur","type":"registry:ui","title":"Progressive Blur","description":"A gradient blur overlay effect.","categories":["effect"],"docs":"Import: `import { ProgressiveBlur } from '@/components/ui/progressive-blur'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/progressive-blur.tsx","type":"registry:ui","target":"@ui/progressive-blur.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/progressive-blur"},{"name":"progressive-blur-scroll-container","type":"registry:ui","title":"Progressive Blur Scroll Container","description":"A scroll container with blur effects at edges.","categories":["effect"],"docs":"Import: `import { ProgressiveBlurScrollContainer } from '@/components/ui/progressive-blur-scroll-container'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/progressive-blur","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/progressive-blur-scroll-container.tsx","type":"registry:ui","target":"@ui/progressive-blur-scroll-container.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/progressive-blur-scroll-container"},{"name":"responsive-diagram","type":"registry:ui","title":"Responsive Diagram","description":"A responsive diagram container with auto-scaling.","categories":["effect"],"docs":"Import: `import { ResponsiveDiagram } from '@/components/ui/responsive-diagram'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/responsive-diagram.tsx","type":"registry:ui","target":"@ui/responsive-diagram.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/responsive-diagram"},{"name":"unlink-button","type":"registry:ui","title":"Unlink Button","description":"A button for unlinking/removing records.","categories":["action"],"docs":"Import: `import { UnlinkButton } from '@/components/ui/unlink-button'`","dependencies":["@remixicon/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/button","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/unlink-button.tsx","type":"registry:ui","target":"@ui/unlink-button.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/unlink-button"},{"name":"stack","type":"registry:block","title":"Stack Navigation","description":"iOS-style navigation stack with gestures and animations.","categories":["block"],"docs":"Import: `import { Stack, StackCard } from '@/components/ui/stack'`","dependencies":["motion","@use-gesture/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/skeleton","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/stack/index.ts","type":"registry:component","target":"@ui/stack/index.ts"},{"path":"registry/constructive/blocks/stack/stack-context.tsx","type":"registry:component","target":"@ui/stack/stack-context.tsx"},{"path":"registry/constructive/blocks/stack/stack-card.tsx","type":"registry:component","target":"@ui/stack/stack-card.tsx"},{"path":"registry/constructive/blocks/stack/stack-header.tsx","type":"registry:component","target":"@ui/stack/stack-header.tsx"},{"path":"registry/constructive/blocks/stack/stack-backdrop.tsx","type":"registry:component","target":"@ui/stack/stack-backdrop.tsx"},{"path":"registry/constructive/blocks/stack/stack-viewport.tsx","type":"registry:component","target":"@ui/stack/stack-viewport.tsx"},{"path":"registry/constructive/blocks/stack/deferred-card-content.tsx","type":"registry:component","target":"@ui/stack/deferred-card-content.tsx"},{"path":"registry/constructive/blocks/stack/stack-animations.ts","type":"registry:lib","target":"@ui/stack/stack-animations.ts"},{"path":"registry/constructive/blocks/stack/stack-utils.ts","type":"registry:lib","target":"@ui/stack/stack-utils.ts"},{"path":"registry/constructive/blocks/stack/stack.types.ts","type":"registry:lib","target":"@ui/stack/stack.types.ts"},{"path":"registry/constructive/blocks/stack/use-stack-gestures.ts","type":"registry:hook","target":"@ui/stack/use-stack-gestures.ts"},{"path":"registry/constructive/blocks/stack/use-peek-gestures.ts","type":"registry:hook","target":"@ui/stack/use-peek-gestures.ts"},{"path":"registry/constructive/blocks/stack/use-stack-responsive.ts","type":"registry:hook","target":"@ui/stack/use-stack-responsive.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/stack"},{"name":"toast","type":"registry:block","title":"Toast Notifications","description":"Styled toast notification functions using Sonner.","categories":["block"],"docs":"Import: `import { toastSuccess, toastError, toastWarning, toastInfo } from '@/components/ui/toast'`","dependencies":["sonner","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/button","@constructive/dialog","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/toast/index.ts","type":"registry:component","target":"@ui/toast/index.ts"},{"path":"registry/constructive/blocks/toast/toast-error.tsx","type":"registry:component","target":"@ui/toast/toast-error.tsx"},{"path":"registry/constructive/blocks/toast/toast-success.tsx","type":"registry:component","target":"@ui/toast/toast-success.tsx"},{"path":"registry/constructive/blocks/toast/toast-warning.tsx","type":"registry:component","target":"@ui/toast/toast-warning.tsx"},{"path":"registry/constructive/blocks/toast/toast-info.tsx","type":"registry:component","target":"@ui/toast/toast-info.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/toast"},{"name":"app-bar","type":"registry:block","title":"App Bar","description":"A sticky application header with a sidebar trigger, responsive breadcrumbs, and framework-neutral search and action slots.","categories":["block","navigation"],"docs":"Import: `import { AppBar } from '@/components/ui/app-bar'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/breadcrumb","@constructive/separator","@constructive/sidebar","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/app-bar.tsx","type":"registry:component","target":"@ui/app-bar.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/app-bar"},{"name":"app-shell","type":"registry:block","title":"App Shell","description":"A provider-neutral application shell with typed navigation, brand, account, breadcrumb, and link-render contracts.","categories":["block","navigation"],"docs":"Import: `import { AppShell } from '@/components/ui/app-shell'`","dependencies":["@base-ui/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/app-bar","@constructive/avatar","@constructive/collapsible","@constructive/dropdown-menu","@constructive/sidebar","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/app-shell.tsx","type":"registry:component","target":"@ui/app-shell.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/app-shell"},{"name":"field","type":"registry:ui","title":"Field","description":"Composable form layout with groups, fieldsets, legends, labels, descriptions, separators, and accessible errors.","categories":["form"],"docs":"Import: `import { Field, FieldGroup, FieldLabel, FieldDescription, FieldError } from '@/components/ui/field'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/label","@constructive/separator","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/field.tsx","type":"registry:ui","target":"@ui/field.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/field"},{"name":"empty","type":"registry:ui","title":"Empty","description":"A composable empty-state layout with media, title, description, and action content.","categories":["layout"],"docs":"Import: `import { Empty, EmptyHeader, EmptyMedia, EmptyTitle, EmptyDescription, EmptyContent } from '@/components/ui/empty'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/empty.tsx","type":"registry:ui","target":"@ui/empty.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/empty"},{"name":"form-kit","type":"registry:ui","title":"Form Kit","description":"All form-related components: input, textarea, checkbox, radio, select, switch, progress, form controls.","categories":["bundle"],"docs":null,"dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/input","@constructive/textarea","@constructive/checkbox","@constructive/checkbox-group","@constructive/radio-group","@constructive/switch","@constructive/select","@constructive/progress","@constructive/form","@constructive/form-control","@constructive/input-group","@constructive/field","@constructive/label","@constructive/constructive-theme"],"files":[],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/form-kit"},{"name":"overlay-kit","type":"registry:ui","title":"Overlay Kit","description":"All overlay components: dialog, sheet, drawer, popover, tooltip, dropdown menu, alert dialog.","categories":["bundle"],"docs":null,"dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/dialog","@constructive/sheet","@constructive/drawer","@constructive/popover","@constructive/tooltip","@constructive/dropdown-menu","@constructive/alert-dialog","@constructive/command","@constructive/constructive-theme"],"files":[],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/overlay-kit"},{"name":"layout-kit","type":"registry:ui","title":"Layout Kit","description":"Layout and navigation components: tabs, sidebar, collapsible, resizable panels, scroll area, breadcrumb, pagination.","categories":["bundle"],"docs":null,"dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/tabs","@constructive/sidebar","@constructive/collapsible","@constructive/resizable","@constructive/scroll-area","@constructive/breadcrumb","@constructive/pagination","@constructive/separator","@constructive/empty","@constructive/constructive-theme"],"files":[],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/layout-kit"},{"name":"billing-contracts","type":"registry:lib","title":"Billing Contracts","description":"Provider-neutral billing DTOs, arbitrary-precision formatters, open-status presentation maps, and explicit resource states shared by every customer billing block.","categories":["blocks","billing"],"docs":"## Usage\n\nInstall this item when building a custom billing composition. It defines the shared resource states, account references, money values, allowances, plans, subscriptions, usage, credits, activity, messages, and formatting options used by the billing blocks.\n\n```ts\nimport type { BillingPlan, BillingResource } from '@/blocks/billing/billing-contracts/billing-contracts';\n\nconst plans: BillingResource = {\n status: 'ready',\n quality: 'authoritative',\n asOf: '2026-07-20T12:00:00.000Z',\n data: [{\n id: 'growth',\n name: 'Growth',\n prices: [{\n kind: 'fixed',\n id: 'growth-monthly',\n interval: 'month',\n money: { amountMinor: '4900', currency: 'USD' }\n }]\n }]\n};\n```\n\nKeep quantities, limits, deltas, and minor-unit money as decimal strings so large values retain their precision. Supply an explicit locale and time zone to the formatters, keep each record's currency, and use the explicit contact-sales, unlimited, uninitialized, and unknown variants when they apply.","dependencies":[],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/blocks/billing/billing-contracts/billing-contracts.ts","type":"registry:lib","target":"src/blocks/billing/billing-contracts/billing-contracts.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/billing-contracts"},{"name":"billing-ui","type":"registry:lib","title":"Billing UI Helpers","description":"Shared formatting and presentation helpers used by the customer billing blocks.","categories":["blocks","billing"],"docs":null,"dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/badge","@constructive/billing-contracts","@constructive/cn"],"files":[{"path":"registry/constructive/blocks/billing/billing-ui/billing-ui.tsx","type":"registry:lib","target":"src/blocks/billing/billing-ui/billing-ui.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/billing-ui"},{"name":"billing-pricing-table","type":"registry:block","title":"Billing Pricing Table","description":"Responsive plan comparison with controlled interval selection, fixed and contact-sales pricing, current and featured states, and optional actions.","categories":["blocks","billing"],"docs":"## Usage\n\nPass a plan resource, account context, formatting options, a controlled billing interval, and the actions you want to show.\n\n```tsx\nimport { BillingPricingTable } from '@/blocks/billing/billing-pricing-table/billing-pricing-table';\n\n openPlanSelection({ planId, priceId, account })}\n onContactSales={({ planId, account }) => openSalesRequest({ planId, account })}\n/>\n```\n\nFixed prices use minor-unit decimal strings and the currency on each record. Use `BillingPrice.kind = 'contact_sales'` for custom pricing. Missing callbacks remove their actions, rejected promises appear next to the action, and resolved promises leave the selected plan state under your control.","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/billing-contracts","@constructive/billing-ui","@constructive/button","@constructive/card","@constructive/cn","@constructive/select","@constructive/separator","@constructive/skeleton","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-pricing-table/billing-pricing-table.tsx","type":"registry:component","target":"src/blocks/billing/billing-pricing-table/billing-pricing-table.tsx"},{"path":"registry/constructive/blocks/billing/billing-pricing-table/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-pricing-table/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/billing-pricing-table"},{"name":"billing-subscription-card","type":"registry:block","title":"Billing Subscription Card","description":"Current-plan summary with independent subscription, provider, and payment status plus exact lifecycle dates and optional actions.","categories":["blocks","billing"],"docs":"## Usage\n\nPass the current plan together with any payment and provider states you want to show. Add only the actions that make sense in your billing flow.\n\n```tsx\nimport { BillingSubscriptionCard } from '@/blocks/billing/billing-subscription-card/billing-subscription-card';\n\n openSubscriptionSettings(subscriptionId, account)}\n/>\n```\n\nOnly `renewsAt` is labelled “Renews”; `endsAt` is always labelled “Ends.” Status strings are open, unknown values render neutrally, and missing callbacks hide their controls.","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/billing-contracts","@constructive/billing-ui","@constructive/button","@constructive/card","@constructive/cn","@constructive/skeleton","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-subscription-card/billing-subscription-card.tsx","type":"registry:component","target":"src/blocks/billing/billing-subscription-card/billing-subscription-card.tsx"},{"path":"registry/constructive/blocks/billing/billing-subscription-card/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-subscription-card/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/billing-subscription-card"},{"name":"billing-entitlements-list","type":"registry:block","title":"Billing Entitlements List","description":"Structured display of plan feature flags, caps, discrete quotas, meter allowances, and neutral unknown values.","categories":["blocks","billing"],"docs":"## Usage\n\nPass each entitlement with a semantic kind so features, caps, quotas, and metered allowances keep their distinct meaning.\n\n```tsx\nimport { BillingEntitlementsList } from '@/blocks/billing/billing-entitlements-list/billing-entitlements-list';\n\n\n```\n\nUse explicit `unlimited`, `uninitialized`, and `unknown` variants. Unknown values stay visible with a neutral presentation, and message overrides let you adapt the labels without changing the data model.","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/billing-contracts","@constructive/billing-ui","@constructive/button","@constructive/card","@constructive/cn","@constructive/skeleton","@constructive/tooltip","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx","type":"registry:component","target":"src/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx"},{"path":"registry/constructive/blocks/billing/billing-entitlements-list/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-entitlements-list/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/billing-entitlements-list"},{"name":"billing-usage-overview","type":"registry:block","title":"Billing Usage Overview","description":"Current-period usage with quota, boolean, unlimited, uninitialized, exhausted, overage, category-pool, and universal-pool states.","categories":["blocks","billing"],"docs":"## Usage\n\nPass a current-period usage snapshot and nest child meters beneath category or universal pools when credits are shared.\n\n```tsx\nimport { BillingUsageOverview } from '@/blocks/billing/billing-usage-overview/billing-usage-overview';\n\n openUsageHistory(meterSlug)}\n onBuyCredits={(meterSlug) => openCreditPurchase(meterSlug)}\n/>\n```\n\nCategory and universal pools stay nested so their application order remains clear. Progress caps visually at 100 percent while text and accessible values preserve the actual used, allowance, and overage values. Actions disappear when their callbacks are absent.","dependencies":["lucide-react","motion"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/billing-contracts","@constructive/billing-ui","@constructive/button","@constructive/card","@constructive/cn","@constructive/collapsible","@constructive/progress","@constructive/skeleton","@constructive/tooltip","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-usage-overview/billing-usage-overview.tsx","type":"registry:component","target":"src/blocks/billing/billing-usage-overview/billing-usage-overview.tsx"},{"path":"registry/constructive/blocks/billing/billing-usage-overview/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-usage-overview/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/billing-usage-overview"},{"name":"billing-credits-card","type":"registry:block","title":"Billing Credits Card","description":"Available credits grouped by compatible meter and unit with permanent, period, rollover, expiring, and unknown lot semantics.","categories":["blocks","billing"],"docs":"## Usage\n\nPass available balances and their credit lots while keeping each meter and unit independent.\n\n```tsx\nimport { BillingCreditsCard } from '@/blocks/billing/billing-credits-card/billing-credits-card';\n\n\n```\n\nKeep incompatible meters and units in separate balance groups. Credit lots show the current grant makeup, while `billing-activity-table` provides a chronological view of grants, usage, adjustments, rollover, and expiration.","dependencies":["lucide-react","motion"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/billing-contracts","@constructive/billing-ui","@constructive/button","@constructive/card","@constructive/cn","@constructive/collapsible","@constructive/progress","@constructive/skeleton","@constructive/tooltip","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-credits-card/billing-credits-card.tsx","type":"registry:component","target":"src/blocks/billing/billing-credits-card/billing-credits-card.tsx"},{"path":"registry/constructive/blocks/billing/billing-credits-card/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-credits-card/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/billing-credits-card"},{"name":"billing-usage-history","type":"registry:block","title":"Billing Usage History","description":"Accessible, table-first period history with controlled meter, period, and pagination filters plus explicit quality labels.","categories":["blocks","billing"],"docs":"## Usage\n\nPass a page of usage periods and control the meter, period, and pagination values when you provide their callbacks.\n\n```tsx\nimport { BillingUsageHistory } from '@/blocks/billing/billing-usage-history/billing-usage-history';\n\n\n```\n\nCredits and overage columns appear only when their values are marked as confirmed. Quality labels remain visible on each period, and the table keeps pagination and filter changes under your control.","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/billing-contracts","@constructive/billing-ui","@constructive/button","@constructive/card","@constructive/cn","@constructive/field","@constructive/pagination","@constructive/select","@constructive/separator","@constructive/skeleton","@constructive/table","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-usage-history/billing-usage-history.tsx","type":"registry:component","target":"src/blocks/billing/billing-usage-history/billing-usage-history.tsx"},{"path":"registry/constructive/blocks/billing/billing-usage-history/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-usage-history/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/billing-usage-history"},{"name":"billing-activity-table","type":"registry:block","title":"Billing Activity Table","description":"Paginated ledger activity with controlled filters, semantic class/type presentation, and a titled metadata detail sheet.","categories":["blocks","billing"],"docs":"## Usage\n\nPass ledger class and entry type with each activity entry so labels and badge tones describe the event itself.\n\n```tsx\nimport { BillingActivityTable } from '@/blocks/billing/billing-activity-table/billing-activity-table';\n\n\n```\n\nA positive delta can represent consumption and a negative delta can represent release or reset, so presentation derives from `ledgerClass` and `entryType` rather than the sign. Unknown values remain neutral, and JSON-safe metadata opens in a titled detail sheet.","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/billing-contracts","@constructive/billing-ui","@constructive/button","@constructive/card","@constructive/cn","@constructive/field","@constructive/pagination","@constructive/select","@constructive/separator","@constructive/sheet","@constructive/skeleton","@constructive/table","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-activity-table/billing-activity-table.tsx","type":"registry:component","target":"src/blocks/billing/billing-activity-table/billing-activity-table.tsx"},{"path":"registry/constructive/blocks/billing/billing-activity-table/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-activity-table/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/billing-activity-table"},{"name":"billing-settings-page","type":"registry:block","title":"Billing Settings Page","description":"Router-neutral Overview, Usage, and Plans composition that keeps subscription, usage, credits, entitlements, history, activity, and pricing failures isolated.","categories":["blocks","billing"],"docs":"## Usage\n\nPass one account together with independent resources and actions. Use `section` and `onSectionChange` to synchronize navigation, or `defaultSection` for local state. The page renders its own heading by default; set `showHeader={false}` when the surrounding document already provides it.\n\n```tsx\nimport { BillingSettingsPage } from '@/blocks/billing/billing-settings-page/billing-settings-page';\n\n\n```\n\nEach resource renders its own loading, empty, error, ready, and quality state, so one unavailable section never replaces the whole page. Controlled filters and actions are forwarded to their matching leaf blocks.","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/billing-activity-table","@constructive/billing-contracts","@constructive/billing-credits-card","@constructive/billing-entitlements-list","@constructive/billing-pricing-table","@constructive/billing-subscription-card","@constructive/billing-usage-history","@constructive/billing-usage-overview","@constructive/cn","@constructive/separator","@constructive/tabs","@constructive/tooltip","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-settings-page/billing-settings-page.tsx","type":"registry:component","target":"src/blocks/billing/billing-settings-page/billing-settings-page.tsx"},{"path":"registry/constructive/blocks/billing/billing-settings-page/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-settings-page/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/billing-settings-page"},{"name":"pack-foundation","type":"registry:lib","title":"Feature Pack Foundation","description":"Provider-neutral resource, action-policy, error, loading, empty, and status contracts shared by Constructive feature packs.","categories":[],"docs":null,"dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/button","@constructive/card","@constructive/cn","@constructive/empty","@constructive/skeleton"],"files":[{"path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts","type":"registry:lib","target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts"},{"path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx","type":"registry:component","target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/pack-foundation"},{"name":"console-runtime","type":"registry:lib","title":"Console Runtime","description":"Endpoint, session, transport, cache partitioning, and adapter contracts for identity-scoped Constructive consoles.","categories":[],"docs":null,"dependencies":[],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/blocks/console-runtime/capabilities.ts","type":"registry:lib","target":"src/blocks/console-runtime/capabilities.ts"},{"path":"registry/constructive/blocks/console-runtime/endpoints.ts","type":"registry:lib","target":"src/blocks/console-runtime/endpoints.ts"},{"path":"registry/constructive/blocks/console-runtime/feature-adapter.ts","type":"registry:lib","target":"src/blocks/console-runtime/feature-adapter.ts"},{"path":"registry/constructive/blocks/console-runtime/index.ts","type":"registry:lib","target":"src/blocks/console-runtime/index.ts"},{"path":"registry/constructive/blocks/console-runtime/session.ts","type":"registry:lib","target":"src/blocks/console-runtime/session.ts"},{"path":"registry/constructive/blocks/console-runtime/standalone-session.ts","type":"registry:lib","target":"src/blocks/console-runtime/standalone-session.ts"},{"path":"registry/constructive/blocks/console-runtime/transport.ts","type":"registry:lib","target":"src/blocks/console-runtime/transport.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/console-runtime"},{"name":"console-feature-catalog","type":"registry:lib","title":"Console Feature Catalog","description":"Validated feature-pack capability manifests and stable backend preset profiles.","categories":[],"docs":null,"dependencies":["zod"],"devDependencies":[],"registryDependencies":["@constructive/console-runtime"],"files":[{"path":"registry/constructive/feature-packs/capabilities.ts","type":"registry:lib","target":"src/feature-packs/capabilities.ts"},{"path":"registry/constructive/feature-packs/catalog.ts","type":"registry:lib","target":"src/feature-packs/catalog.ts"},{"path":"registry/constructive/feature-packs/catalog-validation.ts","type":"registry:lib","target":"src/feature-packs/catalog-validation.ts"},{"path":"registry/constructive/feature-packs/index.ts","type":"registry:lib","target":"src/feature-packs/index.ts"},{"path":"registry/constructive/feature-packs/manifest.ts","type":"registry:lib","target":"src/feature-packs/manifest.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/console-feature-catalog"},{"name":"console-kit-core","type":"registry:block","title":"Constructive Console Kit Core","description":"The leaf-independent Console Kit shell, runtime, discovery, and single modular Zustand store.","categories":[],"docs":"`console-kit-core` installed the shell, runtime, semantic routing, callback boundary, and one per-instance modular Zustand store. Core intentionally includes no feature view, so add selected `console-module-*` items.\n\nDegraded states: explicit endpoint, current `_meta`, introspection, capability, and adapter evidence fail closed independently; installation never grants authority.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","dependencies":["@constructive-io/data","@tanstack/react-query","graphql","lucide-react","zustand"],"devDependencies":[],"registryDependencies":["@constructive/console-runtime","@constructive/console-feature-catalog","@constructive/alert","@constructive/app-bar","@constructive/app-shell","@constructive/badge","@constructive/button","@constructive/cn","@constructive/pack-foundation","@constructive/popover","@constructive/skeleton","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/console-kit/feature-module.ts","type":"registry:lib","target":"src/blocks/console-kit/feature-module.ts"},{"path":"registry/constructive/blocks/console-kit/console-kit-routes.ts","type":"registry:lib","target":"src/blocks/console-kit/console-kit-routes.ts"},{"path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts","type":"registry:lib","target":"src/blocks/console-kit/console-kit-contracts.ts"},{"path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx","type":"registry:component","target":"src/blocks/console-kit/console-connection-menu.tsx"},{"path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx","type":"registry:component","target":"src/blocks/console-kit/console-kit-runtime.tsx"},{"path":"registry/constructive/blocks/console-kit/use-latest-callback.ts","type":"registry:lib","target":"src/blocks/console-kit/use-latest-callback.ts"},{"path":"registry/constructive/blocks/console-kit/console-kit-core.tsx","type":"registry:component","target":"src/blocks/console-kit/console-kit-core.tsx"},{"path":"registry/constructive/blocks/console-kit/console-kit.tsx","type":"registry:component","target":"src/blocks/console-kit/console-kit.tsx"},{"path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts"},{"path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/constructive-capabilities.ts"},{"path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/constructive-callback.ts"},{"path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx","type":"registry:component","target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx"},{"path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/constructive-graphql.ts"},{"path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts"},{"path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts","type":"registry:lib","target":"src/blocks/console-kit/store/adapter-slice.ts"},{"path":"registry/constructive/blocks/console-kit/store/context-slice.ts","type":"registry:lib","target":"src/blocks/console-kit/store/context-slice.ts"},{"path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts","type":"registry:lib","target":"src/blocks/console-kit/store/endpoint-capability-slice.ts"},{"path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts","type":"registry:lib","target":"src/blocks/console-kit/store/navigation-slice.ts"},{"path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts","type":"registry:lib","target":"src/blocks/console-kit/store/runtime-slice.ts"},{"path":"registry/constructive/blocks/console-kit/store/session-slice.ts","type":"registry:lib","target":"src/blocks/console-kit/store/session-slice.ts"},{"path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx","type":"registry:component","target":"src/blocks/console-kit/store/console-kit-store.tsx"},{"path":"registry/constructive/blocks/console-kit/store/index.ts","type":"registry:lib","target":"src/blocks/console-kit/store/index.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/console-kit-core"},{"name":"feature-pack-data","type":"registry:block","title":"Data Feature Pack","description":"A current-_meta-only application data explorer with application-table filtering and spreadsheet CRUD.","categories":[],"docs":"`feature-pack-data` installed a provider-neutral view and `.constructive/feature-packs/data.json`. Import from `@/blocks/feature-packs/data/data-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-data` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: The host owns Sheets state and endpoint binding; incompatible metadata stays explicit, and PostgreSQL privileges and RLS decide every query and mutation.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/data/","dependencies":["@constructive-io/data","@constructive-io/sheets","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/pack-foundation","@constructive/alert","@constructive/button","@constructive/card","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/data/data-feature-pack.tsx","type":"registry:component","target":"src/blocks/feature-packs/data/data-feature-pack.tsx"},{"path":"registry/constructive/blocks/feature-packs/data/feature-pack.json","type":"registry:file","target":"~/.constructive/feature-packs/data.json"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-data"},{"name":"console-module-data","type":"registry:block","title":"Data Console Module","description":"Console Kit navigation, capability discovery, and tenant runtime binding for the Data feature pack.","categories":[],"docs":"`console-module-data` installed Console Kit core, the provider-neutral data view, and its Constructive integration. Import from `@/blocks/feature-packs/data/data-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: A missing or incompatible data endpoint, current _meta contract, introspection result, or application table scope keeps Data unavailable; RLS remains authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/data/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/feature-pack-data","@constructive/console-feature-catalog","@constructive/console-runtime","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/data/data-console-module.tsx","type":"registry:component","target":"src/blocks/feature-packs/data/data-console-module.tsx"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/console-module-data"},{"name":"feature-pack-auth","type":"registry:block","title":"Authentication Feature Pack","description":"Provider-neutral public authentication flows and personal account/session management.","categories":[],"docs":"`feature-pack-auth` installed a provider-neutral view and `.constructive/feature-packs/auth.json`. Import from `@/blocks/feature-packs/auth/auth-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-auth` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: Unsupported policy grants or callbacks stay absent, provider failures remain explicit, and callback credentials never enter the view.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/auth/","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/pack-foundation","@constructive/alert","@constructive/alert-dialog","@constructive/avatar","@constructive/badge","@constructive/button","@constructive/card","@constructive/checkbox","@constructive/cn","@constructive/field","@constructive/input","@constructive/input-group","@constructive/separator","@constructive/tabs","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/auth/auth-contracts.ts","type":"registry:lib","target":"src/blocks/feature-packs/auth/auth-contracts.ts"},{"path":"registry/constructive/blocks/feature-packs/auth/auth-entry-panel.tsx","type":"registry:component","target":"src/blocks/feature-packs/auth/auth-entry-panel.tsx"},{"path":"registry/constructive/blocks/feature-packs/auth/auth-challenge-panel.tsx","type":"registry:component","target":"src/blocks/feature-packs/auth/auth-challenge-panel.tsx"},{"path":"registry/constructive/blocks/feature-packs/auth/auth-account-view.tsx","type":"registry:component","target":"src/blocks/feature-packs/auth/auth-account-view.tsx"},{"path":"registry/constructive/blocks/feature-packs/auth/auth-password-policy.ts","type":"registry:lib","target":"src/blocks/feature-packs/auth/auth-password-policy.ts"},{"path":"registry/constructive/blocks/feature-packs/auth/auth-feature-pack.tsx","type":"registry:component","target":"src/blocks/feature-packs/auth/auth-feature-pack.tsx"},{"path":"registry/constructive/blocks/feature-packs/auth/feature-pack.json","type":"registry:file","target":"~/.constructive/feature-packs/auth.json"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-auth"},{"name":"console-module-auth","type":"registry:block","title":"Authentication Console Module","description":"Console Kit session flow, capability discovery, and Constructive adapter for the Authentication feature pack.","categories":[],"docs":"`console-module-auth` installed Console Kit core, the provider-neutral auth view, and its Constructive integration. Import from `@/blocks/feature-packs/auth/auth-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: Auth requires complete public session, credential, and password flows; pass csrfTokenProvider when required, and keep callback credentials outside Zustand.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/auth/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/feature-pack-auth","@constructive/console-feature-catalog","@constructive/console-runtime","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/auth/auth-console-module.tsx","type":"registry:component","target":"src/blocks/feature-packs/auth/auth-console-module.tsx"},{"path":"registry/constructive/blocks/console-kit/constructive/auth-adapter.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/auth-adapter.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/console-module-auth"},{"name":"feature-pack-users","type":"registry:block","title":"App access Feature Pack","description":"App access governance with member lifecycle controls, invitations, access profiles, direct and effective permissions, and new-member defaults.","categories":[],"docs":"`feature-pack-users` installed a provider-neutral view and `.constructive/feature-packs/users.json`. Import from `@/blocks/feature-packs/users/users-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-users` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: Missing resources or callbacks stay unavailable, while row policy, PostgreSQL privileges, RLS, and final-owner constraints decide mutations.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/users/","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/pack-foundation","@constructive/alert","@constructive/alert-dialog","@constructive/avatar","@constructive/badge","@constructive/button","@constructive/checkbox","@constructive/cn","@constructive/dialog","@constructive/dropdown-menu","@constructive/empty","@constructive/field","@constructive/input","@constructive/input-group","@constructive/select","@constructive/table","@constructive/tabs","@constructive/textarea","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/users/users-feature-pack.tsx","type":"registry:component","target":"src/blocks/feature-packs/users/users-feature-pack.tsx"},{"path":"registry/constructive/blocks/feature-packs/users/feature-pack.json","type":"registry:file","target":"~/.constructive/feature-packs/users.json"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-users"},{"name":"console-module-users","type":"registry:block","title":"App access Console Module","description":"Console Kit navigation, capability discovery, and Constructive adapter for the App access feature pack.","categories":[],"docs":"`console-module-users` installed Console Kit core, the provider-neutral users view, and its Constructive integration. Import from `@/blocks/feature-packs/users/users-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: App access requires a compatible admin contract, and every control still depends on pack policy, adapter support, row policy, PostgreSQL privileges, and RLS.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/users/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/feature-pack-users","@constructive/console-feature-catalog","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/users/users-console-module.tsx","type":"registry:component","target":"src/blocks/feature-packs/users/users-console-module.tsx"},{"path":"registry/constructive/blocks/console-kit/constructive/users-adapter.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/users-adapter.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/console-module-users"},{"name":"feature-pack-organizations","type":"registry:block","title":"Organizations Feature Pack","description":"Complete tenant administration for selection, member governance, invitations, profiles, permissions, defaults, hierarchy, settings, principals, and API keys.","categories":[],"docs":"`feature-pack-organizations` installed a provider-neutral view and `.constructive/feature-packs/organizations.json`. Import from `@/blocks/feature-packs/organizations/organizations-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-organizations` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: When the active organization is missing or does not match the host-provided list, the view selects the first available organization. It never infers a principal, policy grant, or mutation authority; missing resources and callbacks stay unavailable, while PostgreSQL privileges and RLS remain authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/organizations/","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/pack-foundation","@constructive/alert-dialog","@constructive/avatar","@constructive/badge","@constructive/button","@constructive/card","@constructive/checkbox","@constructive/cn","@constructive/dialog","@constructive/dropdown-menu","@constructive/empty","@constructive/field","@constructive/input","@constructive/select","@constructive/switch","@constructive/table","@constructive/tabs","@constructive/textarea","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/organizations/organizations-contracts.ts","type":"registry:lib","target":"src/blocks/feature-packs/organizations/organizations-contracts.ts"},{"path":"registry/constructive/blocks/feature-packs/organizations/organizations-access-panels.tsx","type":"registry:component","target":"src/blocks/feature-packs/organizations/organizations-access-panels.tsx"},{"path":"registry/constructive/blocks/feature-packs/organizations/organizations-operation-panels.tsx","type":"registry:component","target":"src/blocks/feature-packs/organizations/organizations-operation-panels.tsx"},{"path":"registry/constructive/blocks/feature-packs/organizations/organizations-feature-pack.tsx","type":"registry:component","target":"src/blocks/feature-packs/organizations/organizations-feature-pack.tsx"},{"path":"registry/constructive/blocks/feature-packs/organizations/feature-pack.json","type":"registry:file","target":"~/.constructive/feature-packs/organizations.json"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-organizations"},{"name":"console-module-organizations","type":"registry:block","title":"Organizations Console Module","description":"Console Kit discovery, metadata resolution, and Constructive adapter for the Organizations feature pack.","categories":[],"docs":"`console-module-organizations` installed Console Kit core, the provider-neutral organizations view, and its Constructive integration. Import from `@/blocks/feature-packs/organizations/organizations-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: Incomplete metadata or ambiguous organization and principal scope fails closed; every mutation remains policy and RLS constrained.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/organizations/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/feature-pack-organizations","@constructive/console-feature-catalog","@constructive/console-runtime","@constructive/pack-foundation","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/organizations/organizations-console-module.tsx","type":"registry:component","target":"src/blocks/feature-packs/organizations/organizations-console-module.tsx"},{"path":"registry/constructive/blocks/feature-packs/organizations/organizations-meta-contract.ts","type":"registry:lib","target":"src/blocks/feature-packs/organizations/organizations-meta-contract.ts"},{"path":"registry/constructive/blocks/console-kit/constructive/organizations-adapter.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/organizations-adapter.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/console-module-organizations"},{"name":"feature-pack-storage","type":"registry:block","title":"Storage Feature Pack","description":"Bucket, folder, object, upload, download, and deletion surfaces backed by injected storage actions.","categories":[],"docs":"`feature-pack-storage` installed a provider-neutral view and `.constructive/feature-packs/storage.json`. Import from `@/blocks/feature-packs/storage/storage-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-storage` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: An object endpoint alone does not prove bucket or file operations; incomplete and read-only contracts keep write controls hidden.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/storage/","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/pack-foundation","@constructive/alert","@constructive/alert-dialog","@constructive/badge","@constructive/button","@constructive/card","@constructive/cn","@constructive/dialog","@constructive/dropdown-menu","@constructive/field","@constructive/input","@constructive/radio-group","@constructive/table","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/storage/storage-feature-pack.tsx","type":"registry:component","target":"src/blocks/feature-packs/storage/storage-feature-pack.tsx"},{"path":"registry/constructive/blocks/feature-packs/storage/feature-pack.json","type":"registry:file","target":"~/.constructive/feature-packs/storage.json"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-storage"},{"name":"console-module-storage","type":"registry:block","title":"Storage Console Module","description":"Console Kit discovery, metadata resolution, adapter, and modular state slice for the Storage feature pack.","categories":[],"docs":"`console-module-storage` installed Console Kit core, the provider-neutral storage view, and its Constructive integration. Import from `@/blocks/feature-packs/storage/storage-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: The objects endpoint alone is insufficient; incomplete contracts stay unavailable and read-only contracts hide write controls.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/storage/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/feature-pack-storage","@constructive/console-feature-catalog","@constructive/console-runtime","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/storage/storage-console-module.tsx","type":"registry:component","target":"src/blocks/feature-packs/storage/storage-console-module.tsx"},{"path":"registry/constructive/blocks/console-kit/constructive/storage-adapter.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/storage-adapter.ts"},{"path":"registry/constructive/blocks/feature-packs/storage/storage-console-slice.ts","type":"registry:lib","target":"src/blocks/feature-packs/storage/storage-console-slice.ts"},{"path":"registry/constructive/blocks/feature-packs/storage/storage-meta-contract.ts","type":"registry:lib","target":"src/blocks/feature-packs/storage/storage-meta-contract.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/console-module-storage"},{"name":"feature-pack-billing","type":"registry:block","title":"Billing Feature Pack","description":"The feature-pack root for Constructive billing plans, subscriptions, usage, entitlements, credits, and activity.","categories":[],"docs":"`feature-pack-billing` installed a provider-neutral view and `.constructive/feature-packs/billing.json`. Import from `@/blocks/feature-packs/billing/billing-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-billing` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: Missing resources remain independent degraded states, and unavailable provider callbacks stay absent.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/billing/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/billing-settings-page","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/billing/billing-feature-pack.tsx","type":"registry:component","target":"src/blocks/feature-packs/billing/billing-feature-pack.tsx"},{"path":"registry/constructive/blocks/feature-packs/billing/feature-pack.json","type":"registry:file","target":"~/.constructive/feature-packs/billing.json"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-billing"},{"name":"console-module-billing","type":"registry:block","title":"Billing Console Module","description":"Console Kit navigation, capability discovery, and Constructive adapter for the Billing feature pack.","categories":[],"docs":"`console-module-billing` installed Console Kit core, the provider-neutral billing view, and its Constructive integration. Import from `@/blocks/feature-packs/billing/billing-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: Missing plans or subscriptions keeps Billing unavailable, missing optional meters produces a partial view, and provider writes require an explicit adapter action.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/billing/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/feature-pack-billing","@constructive/billing-contracts","@constructive/console-feature-catalog","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/billing/billing-console-module.tsx","type":"registry:component","target":"src/blocks/feature-packs/billing/billing-console-module.tsx"},{"path":"registry/constructive/blocks/console-kit/constructive/billing-adapter.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/billing-adapter.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/console-module-billing"},{"name":"feature-pack-notifications","type":"registry:block","title":"Notifications Feature Pack","description":"An application notification inbox with read, open, and deletion actions.","categories":[],"docs":"`feature-pack-notifications` installed a provider-neutral view and `.constructive/feature-packs/notifications.json`. Import from `@/blocks/feature-packs/notifications/notifications-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-notifications` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: The host must provide an authoritative inbox, policy, and callbacks; absent operations stay unavailable and mutations require a refreshed resource.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/notifications/","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/pack-foundation","@constructive/alert","@constructive/alert-dialog","@constructive/badge","@constructive/button","@constructive/card","@constructive/separator","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/notifications/notifications-feature-pack.tsx","type":"registry:component","target":"src/blocks/feature-packs/notifications/notifications-feature-pack.tsx"},{"path":"registry/constructive/blocks/feature-packs/notifications/feature-pack.json","type":"registry:file","target":"~/.constructive/feature-packs/notifications.json"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/feature-pack-notifications"},{"name":"console-module-notifications","type":"registry:block","title":"Notifications Console Module","description":"Console Kit navigation, capability discovery, and Constructive adapter for the Notifications feature pack.","categories":[],"docs":"`console-module-notifications` installed Console Kit core, the provider-neutral notifications view, and its Constructive integration. Import from `@/blocks/feature-packs/notifications/notifications-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: A backend module record without a reachable public inbox is not capability evidence, and realtime remains unavailable until the complete flow is proven.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/notifications/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/feature-pack-notifications","@constructive/console-feature-catalog","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/notifications/notifications-console-module.tsx","type":"registry:component","target":"src/blocks/feature-packs/notifications/notifications-console-module.tsx"},{"path":"registry/constructive/blocks/console-kit/constructive/notifications-adapter.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/notifications-adapter.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/console-module-notifications"},{"name":"preset-auth-hardened","type":"registry:block","title":"Hardened Authentication Preset","description":"Stable Constructive auth-hardened backend preset mapped to its supported Console Kit modules.","categories":[],"docs":"`preset-auth-hardened` installed the stable `auth:hardened` composition: Data, Authentication, and App access. Render `AuthHardenedConsoleKit` with a secret-free tenant descriptor.\n\nDegraded states: each public endpoint and module fails closed independently, and PostgreSQL privileges and RLS remain authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/console-module-data","@constructive/console-module-auth","@constructive/console-module-users","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/presets/auth-hardened-console-kit.tsx","type":"registry:component","target":"src/blocks/presets/auth-hardened-console-kit.tsx"},{"path":"registry/constructive/blocks/presets/auth-hardened.json","type":"registry:file","target":"~/.constructive/feature-packs/auth-hardened.json"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/preset-auth-hardened"},{"name":"preset-b2b-storage","type":"registry:block","title":"B2B with Storage Preset","description":"Stable Constructive b2b-storage backend preset mapped to its supported Console Kit modules.","categories":[],"docs":"`preset-b2b-storage` installed the stable `b2b:storage` composition: Data, Authentication, App access, Organizations, and Storage. Render `B2BStorageConsoleKit` with a secret-free tenant descriptor.\n\nDegraded states: stock Storage can remain unavailable when no supported public bucket and file contract is routed; other proven modules continue independently.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/console-module-data","@constructive/console-module-auth","@constructive/console-module-users","@constructive/console-module-organizations","@constructive/console-module-storage","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/presets/b2b-storage-console-kit.tsx","type":"registry:component","target":"src/blocks/presets/b2b-storage-console-kit.tsx"},{"path":"registry/constructive/blocks/presets/b2b-storage.json","type":"registry:file","target":"~/.constructive/feature-packs/b2b-storage.json"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/preset-b2b-storage"},{"name":"preset-full","type":"registry:block","title":"Full Preset","description":"Stable Constructive full backend preset mapped to its supported Console Kit modules.","categories":[],"docs":"`preset-full` installed all seven Console modules and the stable Full preset component. Render `FullConsoleKit` with a secret-free tenant descriptor.\n\nDegraded states: installed backend modules do not imply public routes or user authority; Storage, Billing, or Notifications can remain partial or unavailable while other modules continue.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/console-module-data","@constructive/console-module-auth","@constructive/console-module-users","@constructive/console-module-organizations","@constructive/console-module-storage","@constructive/console-module-billing","@constructive/console-module-notifications","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/presets/full-console-kit.tsx","type":"registry:component","target":"src/blocks/presets/full-console-kit.tsx"},{"path":"registry/constructive/blocks/presets/full.json","type":"registry:file","target":"~/.constructive/feature-packs/full.json"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/preset-full"},{"name":"console-kit-nextjs","type":"registry:block","title":"Constructive Console Kit for Next.js","description":"A full-page Next.js tenant console with semantic routing, auth, dynamic endpoint discovery, first-party adapters, and every feature pack.","categories":[],"docs":"`console-kit-nextjs` installed the full Next.js tenant console. Render `ConstructiveConsoleKit` with a secret-free database ID and explicit semantic endpoint map; use presets or selected Console modules for smaller compositions.\n\nDegraded states: every endpoint and module fails closed independently, diagnostics are development-only, credentials never enter Zustand, and PostgreSQL privileges and RLS remain authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/preset-full","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/console-kit/constructive/index.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/index.ts"}],"installCommand":"pnpm dlx shadcn@4.13.1 add @constructive/console-kit-nextjs"}]} +{"schemaVersion":1,"kind":"constructive.blocks-registry-catalog","sourceCommit":"1a72e5d95f7ce4a243cd4536ed78c638708d538c","aggregatePath":"apps/registry/registry.json","registryNamespace":"@constructive","itemCount":123,"items":[{"name":"constructive-theme","type":"registry:theme","title":"Constructive Theme","description":"Constructive design system theme — OKLCH colors, z-index layers, shadow utilities, and animations.","categories":[],"docs":null,"dependencies":[],"devDependencies":[],"registryDependencies":[],"files":[],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/constructive-theme"},{"name":"cn","type":"registry:lib","title":"cn utility","description":"Tailwind CSS class name merge utility using clsx and tailwind-merge.","categories":["utility"],"docs":"Import: `import { cn } from '@/lib/utils'`","dependencies":["clsx","tailwind-merge"],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/lib/utils.ts","type":"registry:lib","target":"@lib/utils.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/cn"},{"name":"slot","type":"registry:lib","title":"Slot utility","description":"Polymorphic component utilities for asChild pattern.","categories":["utility"],"docs":"Import: `import { Slot } from '@/lib/slot'`","dependencies":[],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/lib/slot.tsx","type":"registry:lib","target":"@lib/slot.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/slot"},{"name":"use-controllable-state","type":"registry:hook","title":"useControllableState","description":"Hook for components with controlled/uncontrolled state.","categories":["hook"],"docs":"Import: `import { useControllableState } from '@/hooks/use-controllable-state'`","dependencies":[],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/hooks/use-controllable-state.ts","type":"registry:hook","target":"@hooks/use-controllable-state.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/use-controllable-state"},{"name":"use-debounce","type":"registry:hook","title":"useDebounce","description":"Hook for debouncing values.","categories":["hook"],"docs":"Import: `import { useDebounce } from '@/hooks/use-debounce'`","dependencies":[],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/hooks/use-debounce.ts","type":"registry:hook","target":"@hooks/use-debounce.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/use-debounce"},{"name":"use-mobile","type":"registry:hook","title":"useIsMobile","description":"Hook for detecting mobile viewport.","categories":["hook"],"docs":"Import: `import { useIsMobile } from '@/hooks/use-mobile'`","dependencies":[],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/hooks/use-mobile.ts","type":"registry:hook","target":"@hooks/use-mobile.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/use-mobile"},{"name":"motion-config","type":"registry:lib","title":"Motion Config","description":"Animation presets and spring configurations for motion library.","categories":["animation"],"docs":"Import: `import { motionConfig } from '@/lib/motion/motion-config'`","dependencies":["motion"],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/lib/motion/motion-config.ts","type":"registry:lib","target":"@lib/motion/motion-config.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/motion-config"},{"name":"button","type":"registry:ui","title":"Button","description":"A button component with multiple variants and sizes.","categories":["primitive"],"docs":"Import: `import { Button } from '@/components/ui/button'`","dependencies":["class-variance-authority"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/slot","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/button.tsx","type":"registry:ui","target":"@ui/button.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/button"},{"name":"badge","type":"registry:ui","title":"Badge","description":"A badge component for status indicators and labels.","categories":["primitive"],"docs":"Import: `import { Badge } from '@/components/ui/badge'`","dependencies":["class-variance-authority"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/badge.tsx","type":"registry:ui","target":"@ui/badge.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/badge"},{"name":"label","type":"registry:ui","title":"Label","description":"A label component for form fields.","categories":["primitive"],"docs":"Import: `import { Label } from '@/components/ui/label'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/label.tsx","type":"registry:ui","target":"@ui/label.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/label"},{"name":"skeleton","type":"registry:ui","title":"Skeleton","description":"A skeleton loading placeholder component.","categories":["primitive"],"docs":"Import: `import { Skeleton } from '@/components/ui/skeleton'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/skeleton.tsx","type":"registry:ui","target":"@ui/skeleton.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/skeleton"},{"name":"card","type":"registry:ui","title":"Card","description":"A card component with header, content, and footer sections.","categories":["primitive"],"docs":"Import: `import { Card, CardHeader, CardContent, CardFooter } from '@/components/ui/card'`","dependencies":["class-variance-authority"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/card.tsx","type":"registry:ui","target":"@ui/card.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/card"},{"name":"chart","type":"registry:ui","title":"Chart","description":"Accessible TanStack Charts React adapter with a theme-adaptive semantic token configuration.","categories":["data-display"],"docs":"Import: `import { Chart, CONSTRUCTIVE_CHART_THEME } from '@/components/ui/chart'`","dependencies":["@tanstack/charts@0.6.4","@tanstack/react-charts@0.6.4","d3-scale@4.0.2"],"devDependencies":[],"registryDependencies":["@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/chart.tsx","type":"registry:ui","target":"@ui/chart.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/chart"},{"name":"separator","type":"registry:ui","title":"Separator","description":"A visual separator for dividing content.","categories":["primitive"],"docs":"Import: `import { Separator } from '@/components/ui/separator'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/separator.tsx","type":"registry:ui","target":"@ui/separator.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/separator"},{"name":"alert","type":"registry:ui","title":"Alert","description":"An alert component for displaying messages.","categories":["primitive"],"docs":"Import: `import { Alert, AlertTitle, AlertDescription } from '@/components/ui/alert'`","dependencies":["class-variance-authority"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/alert.tsx","type":"registry:ui","target":"@ui/alert.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/alert"},{"name":"input","type":"registry:ui","title":"Input","description":"A text input component built on Base UI.","categories":["form"],"docs":"Import: `import { Input } from '@/components/ui/input'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/input.tsx","type":"registry:ui","target":"@ui/input.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/input"},{"name":"textarea","type":"registry:ui","title":"Textarea","description":"A multiline text input component.","categories":["form"],"docs":"Import: `import { Textarea } from '@/components/ui/textarea'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/textarea.tsx","type":"registry:ui","target":"@ui/textarea.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/textarea"},{"name":"checkbox","type":"registry:ui","title":"Checkbox","description":"A checkbox component built on Base UI.","categories":["form"],"docs":"Import: `import { Checkbox } from '@/components/ui/checkbox'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/checkbox.tsx","type":"registry:ui","target":"@ui/checkbox.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/checkbox"},{"name":"checkbox-group","type":"registry:ui","title":"Checkbox Group","description":"A group wrapper for multiple checkboxes.","categories":["form"],"docs":"Import: `import { CheckboxGroup } from '@/components/ui/checkbox-group'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/checkbox","@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/checkbox-group.tsx","type":"registry:ui","target":"@ui/checkbox-group.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/checkbox-group"},{"name":"radio-group","type":"registry:ui","title":"Radio Group","description":"A radio group component built on Base UI.","categories":["form"],"docs":"Import: `import { RadioGroup } from '@/components/ui/radio-group'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/radio-group.tsx","type":"registry:ui","target":"@ui/radio-group.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/radio-group"},{"name":"switch","type":"registry:ui","title":"Switch","description":"A toggle switch component built on Base UI.","categories":["form"],"docs":"Import: `import { Switch } from '@/components/ui/switch'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/switch.tsx","type":"registry:ui","target":"@ui/switch.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/switch"},{"name":"progress","type":"registry:ui","title":"Progress","description":"A progress bar component built on Base UI.","categories":["form"],"docs":"Import: `import { Progress } from '@/components/ui/progress'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/progress.tsx","type":"registry:ui","target":"@ui/progress.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/progress"},{"name":"avatar","type":"registry:ui","title":"Avatar","description":"An avatar component with image and fallback support.","categories":["data-display"],"docs":"Import: `import { Avatar, AvatarImage, AvatarFallback } from '@/components/ui/avatar'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/avatar.tsx","type":"registry:ui","target":"@ui/avatar.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/avatar"},{"name":"portal","type":"registry:ui","title":"Portal","description":"Portal management for overlay components with z-index layering.","categories":["layout"],"docs":"Import: `import { Portal } from '@/components/ui/portal'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/portal.tsx","type":"registry:ui","target":"@ui/portal.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/portal"},{"name":"scroll-area","type":"registry:ui","title":"Scroll Area","description":"A custom scrollable area component built on Base UI.","categories":["layout"],"docs":"Import: `import { ScrollArea } from '@/components/ui/scroll-area'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/scroll-area.tsx","type":"registry:ui","target":"@ui/scroll-area.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/scroll-area"},{"name":"select","type":"registry:ui","title":"Select","description":"A select/dropdown component built on Base UI.","categories":["form"],"docs":"Import: `import { Select } from '@/components/ui/select'`","dependencies":["@base-ui/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/select.tsx","type":"registry:ui","target":"@ui/select.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/select"},{"name":"tooltip","type":"registry:ui","title":"Tooltip","description":"A tooltip component built on Base UI.","categories":["overlay"],"docs":"Import: `import { Tooltip } from '@/components/ui/tooltip'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/tooltip.tsx","type":"registry:ui","target":"@ui/tooltip.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/tooltip"},{"name":"popover","type":"registry:ui","title":"Popover","description":"A popover component built on Base UI.","categories":["overlay"],"docs":"Import: `import { Popover } from '@/components/ui/popover'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/popover.tsx","type":"registry:ui","target":"@ui/popover.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/popover"},{"name":"dialog","type":"registry:ui","title":"Dialog","description":"A modal dialog component built on Base UI.","categories":["overlay"],"docs":"Import: `import { Dialog } from '@/components/ui/dialog'`","dependencies":["@base-ui/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/button","@constructive/scroll-area","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/dialog.tsx","type":"registry:ui","target":"@ui/dialog.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/dialog"},{"name":"alert-dialog","type":"registry:ui","title":"Alert Dialog","description":"An alert dialog for confirmations built on Base UI.","categories":["overlay"],"docs":"Import: `import { AlertDialog } from '@/components/ui/alert-dialog'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/button","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/alert-dialog.tsx","type":"registry:ui","target":"@ui/alert-dialog.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/alert-dialog"},{"name":"dropdown-menu","type":"registry:ui","title":"Dropdown Menu","description":"A dropdown menu component built on Base UI.","categories":["overlay"],"docs":"Import: `import { DropdownMenu } from '@/components/ui/dropdown-menu'`","dependencies":["@base-ui/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/dropdown-menu.tsx","type":"registry:ui","target":"@ui/dropdown-menu.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/dropdown-menu"},{"name":"sheet","type":"registry:ui","title":"Sheet","description":"A slide-out panel component with animations.","categories":["overlay"],"docs":"Import: `import { Sheet } from '@/components/ui/sheet'`","dependencies":["@base-ui/react","class-variance-authority","lucide-react","motion"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/motion-config","@constructive/use-controllable-state","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/sheet.tsx","type":"registry:ui","target":"@ui/sheet.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/sheet"},{"name":"drawer","type":"registry:ui","title":"Drawer","description":"A bottom drawer component using Vaul.","categories":["overlay"],"docs":"Import: `import { Drawer } from '@/components/ui/drawer'`","dependencies":["vaul"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/drawer.tsx","type":"registry:ui","target":"@ui/drawer.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/drawer"},{"name":"tabs","type":"registry:ui","title":"Tabs","description":"A tabs component built on Base UI.","categories":["layout"],"docs":"Import: `import { Tabs, TabsList, TabsTrigger, TabsContent } from '@/components/ui/tabs'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/tabs.tsx","type":"registry:ui","target":"@ui/tabs.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/tabs"},{"name":"collapsible","type":"registry:ui","title":"Collapsible","description":"A collapsible/accordion component built on Base UI.","categories":["layout"],"docs":"Import: `import { Collapsible } from '@/components/ui/collapsible'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/collapsible.tsx","type":"registry:ui","target":"@ui/collapsible.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/collapsible"},{"name":"resizable","type":"registry:ui","title":"Resizable","description":"Resizable panel layouts using react-resizable-panels.","categories":["layout"],"docs":"Import: `import { ResizablePanel, ResizablePanelGroup, ResizableHandle } from '@/components/ui/resizable'`","dependencies":["lucide-react","react-resizable-panels@^3.0.0"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/resizable.tsx","type":"registry:ui","target":"@ui/resizable.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/resizable"},{"name":"table","type":"registry:ui","title":"Table","description":"A table component with header, body, and cell primitives.","categories":["data-display"],"docs":"Import: `import { Table, TableHeader, TableBody, TableRow, TableCell } from '@/components/ui/table'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/table.tsx","type":"registry:ui","target":"@ui/table.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/table"},{"name":"pagination","type":"registry:ui","title":"Pagination","description":"A pagination component with navigation controls.","categories":["navigation"],"docs":"Import: `import { Pagination } from '@/components/ui/pagination'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/button","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/pagination.tsx","type":"registry:ui","target":"@ui/pagination.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/pagination"},{"name":"breadcrumb","type":"registry:ui","title":"Breadcrumb","description":"A breadcrumb navigation component.","categories":["navigation"],"docs":"Import: `import { Breadcrumb } from '@/components/ui/breadcrumb'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/breadcrumb.tsx","type":"registry:ui","target":"@ui/breadcrumb.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/breadcrumb"},{"name":"form","type":"registry:ui","title":"Form","description":"Form utilities with react-hook-form integration.","categories":["form"],"docs":"Import: `import { Form, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form'`","dependencies":["react-hook-form"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/label","@constructive/slot","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/form.tsx","type":"registry:ui","target":"@ui/form.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/form"},{"name":"form-control","type":"registry:ui","title":"Form Control","description":"A form control wrapper with label and error display.","categories":["form"],"docs":"Import: `import { FormControl } from '@/components/ui/form-control'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/slot","@constructive/label","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/form-control.tsx","type":"registry:ui","target":"@ui/form-control.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/form-control"},{"name":"input-group","type":"registry:ui","title":"Input Group","description":"Input with addons and icons.","categories":["form"],"docs":"Import: `import { InputGroup } from '@/components/ui/input-group'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/input","@constructive/textarea","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/input-group.tsx","type":"registry:ui","target":"@ui/input-group.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/input-group"},{"name":"autocomplete","type":"registry:ui","title":"Autocomplete","description":"An autocomplete component built on Base UI.","categories":["input"],"docs":"Import: `import { Autocomplete } from '@/components/ui/autocomplete'`","dependencies":["@base-ui/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/input","@constructive/scroll-area","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/autocomplete.tsx","type":"registry:ui","target":"@ui/autocomplete.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/autocomplete"},{"name":"command","type":"registry:ui","title":"Command","description":"A command palette component.","categories":["overlay"],"docs":"Import: `import { Command } from '@/components/ui/command'`","dependencies":["cmdk","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/command.tsx","type":"registry:ui","target":"@ui/command.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/command"},{"name":"combobox","type":"registry:ui","title":"Combobox","description":"A combobox component with search built on Base UI.","categories":["input"],"docs":"Import: `import { Combobox } from '@/components/ui/combobox'`","dependencies":["@base-ui/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/input","@constructive/scroll-area","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/combobox.tsx","type":"registry:ui","target":"@ui/combobox.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/combobox"},{"name":"multi-select","type":"registry:ui","title":"Multi Select","description":"A multi-select component with tags.","categories":["input"],"docs":"Import: `import { MultiSelect } from '@/components/ui/multi-select'`","dependencies":["class-variance-authority","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/badge","@constructive/popover","@constructive/separator","@constructive/input","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/multi-select.tsx","type":"registry:ui","target":"@ui/multi-select.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/multi-select"},{"name":"tags","type":"registry:ui","title":"Tags","description":"A tags input component with autocomplete.","categories":["input"],"docs":"Import: `import { Tags } from '@/components/ui/tags'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/badge","@constructive/button","@constructive/command","@constructive/popover","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/tags.tsx","type":"registry:ui","target":"@ui/tags.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/tags"},{"name":"record-picker","type":"registry:ui","title":"Record Picker","description":"A record selection component with search and filtering.","categories":["input"],"docs":"Import: `import { RecordPicker } from '@/components/ui/record-picker'`","dependencies":["@remixicon/react","match-sorter"],"devDependencies":[],"registryDependencies":["@constructive/use-debounce","@constructive/checkbox","@constructive/input-group","@constructive/scroll-area","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/record-picker.tsx","type":"registry:ui","target":"@ui/record-picker.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/record-picker"},{"name":"stepper","type":"registry:ui","title":"Stepper","description":"A stepper component for multi-step workflows.","categories":["navigation"],"docs":"Import: `import { Stepper } from '@/components/ui/stepper'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/slot","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/stepper.tsx","type":"registry:ui","target":"@ui/stepper.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/stepper"},{"name":"sidebar","type":"registry:ui","title":"Sidebar","description":"A responsive Base UI sidebar with off-canvas, icon-only, and fixed collapse modes.","categories":["navigation"],"docs":"Import: `import { Sidebar, SidebarProvider, SidebarTrigger } from '@/components/ui/sidebar'`","dependencies":["@base-ui/react","class-variance-authority","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/use-mobile","@constructive/button","@constructive/input","@constructive/separator","@constructive/sheet","@constructive/skeleton","@constructive/tooltip","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/sidebar.tsx","type":"registry:ui","target":"@ui/sidebar.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/sidebar"},{"name":"calendar-rac","type":"registry:ui","title":"Calendar","description":"A calendar component using React Aria Components.","categories":["input"],"docs":"Import: `import { Calendar } from '@/components/ui/calendar-rac'`","dependencies":["@internationalized/date","react-aria-components"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/calendar-rac.tsx","type":"registry:ui","target":"@ui/calendar-rac.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/calendar-rac"},{"name":"json-input","type":"registry:ui","title":"JSON Input","description":"A JSON editor component using React Ace.","categories":["input"],"docs":"Import: `import { JsonInput } from '@/components/ui/json-input'`","dependencies":["lucide-react","react-ace","ace-builds"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/button","@constructive/tooltip","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/json-input.tsx","type":"registry:ui","target":"@ui/json-input.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/json-input"},{"name":"sonner","type":"registry:ui","title":"Toaster","description":"Toast notifications using Sonner.","categories":["block"],"docs":"Import: `import { Toaster } from '@/components/ui/sonner'`","dependencies":["sonner"],"devDependencies":[],"registryDependencies":["@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/sonner.tsx","type":"registry:ui","target":"@ui/sonner.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/sonner"},{"name":"dock","type":"registry:ui","title":"Dock","description":"A macOS-style dock component.","categories":["navigation"],"docs":"Import: `import { Dock, DockIcon } from '@/components/ui/dock'`","dependencies":["class-variance-authority","motion"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/motion-config","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/dock.tsx","type":"registry:ui","target":"@ui/dock.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/dock"},{"name":"page-header","type":"registry:ui","title":"Page Header","description":"A simple page header component.","categories":["navigation"],"docs":"Import: `import { PageHeader } from '@/components/ui/page-header'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/page-header.tsx","type":"registry:ui","target":"@ui/page-header.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/page-header"},{"name":"flickering-grid","type":"registry:ui","title":"Flickering Grid","description":"An animated grid background effect.","categories":["effect"],"docs":"Import: `import { FlickeringGrid } from '@/components/ui/flickering-grid'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/flickering-grid.tsx","type":"registry:ui","target":"@ui/flickering-grid.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/flickering-grid"},{"name":"flow-zoom-panel","type":"registry:ui","title":"Flow Zoom Panel","description":"Zoom in/out and fit-view controls for React Flow canvases.","categories":["layout"],"docs":"Import: `import { FlowZoomPanel } from '@/components/ui/flow-zoom-panel'`","dependencies":["@xyflow/react","@remixicon/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/button","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/flow-zoom-panel.tsx","type":"registry:ui","target":"@ui/flow-zoom-panel.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/flow-zoom-panel"},{"name":"motion-grid","type":"registry:ui","title":"Motion Grid","description":"An animated grid with frame-based transitions.","categories":["effect"],"docs":"Import: `import { MotionGrid } from '@/components/ui/motion-grid'`","dependencies":["motion"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/motion-config","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/motion-grid.tsx","type":"registry:ui","target":"@ui/motion-grid.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/motion-grid"},{"name":"progressive-blur","type":"registry:ui","title":"Progressive Blur","description":"A gradient blur overlay effect.","categories":["effect"],"docs":"Import: `import { ProgressiveBlur } from '@/components/ui/progressive-blur'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/progressive-blur.tsx","type":"registry:ui","target":"@ui/progressive-blur.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/progressive-blur"},{"name":"progressive-blur-scroll-container","type":"registry:ui","title":"Progressive Blur Scroll Container","description":"A scroll container with blur effects at edges.","categories":["effect"],"docs":"Import: `import { ProgressiveBlurScrollContainer } from '@/components/ui/progressive-blur-scroll-container'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/progressive-blur","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/progressive-blur-scroll-container.tsx","type":"registry:ui","target":"@ui/progressive-blur-scroll-container.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/progressive-blur-scroll-container"},{"name":"responsive-diagram","type":"registry:ui","title":"Responsive Diagram","description":"A responsive diagram container with auto-scaling.","categories":["effect"],"docs":"Import: `import { ResponsiveDiagram } from '@/components/ui/responsive-diagram'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/responsive-diagram.tsx","type":"registry:ui","target":"@ui/responsive-diagram.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/responsive-diagram"},{"name":"unlink-button","type":"registry:ui","title":"Unlink Button","description":"A button for unlinking/removing records.","categories":["action"],"docs":"Import: `import { UnlinkButton } from '@/components/ui/unlink-button'`","dependencies":["@remixicon/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/button","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/unlink-button.tsx","type":"registry:ui","target":"@ui/unlink-button.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/unlink-button"},{"name":"org-chart","type":"registry:block","title":"Org Chart","description":"An interactive organizational chart with automatic hierarchy layout, zoom controls, node actions, and drag-to-reparent behavior.","categories":["block","application"],"docs":"Import: `import { OrgChart } from '@/components/ui/org-chart'`","dependencies":["@xyflow/react","@remixicon/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/button","@constructive/tooltip","@constructive/avatar","@constructive/badge","@constructive/dropdown-menu","@constructive/flow-zoom-panel","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/org-chart/index.ts","type":"registry:component","target":"@ui/org-chart/index.ts"},{"path":"registry/constructive/blocks/org-chart/org-chart.tsx","type":"registry:component","target":"@ui/org-chart/org-chart.tsx"},{"path":"registry/constructive/blocks/org-chart/org-chart-context.tsx","type":"registry:component","target":"@ui/org-chart/org-chart-context.tsx"},{"path":"registry/constructive/blocks/org-chart/org-chart-node.tsx","type":"registry:component","target":"@ui/org-chart/org-chart-node.tsx"},{"path":"registry/constructive/blocks/org-chart/org-chart-edge.tsx","type":"registry:component","target":"@ui/org-chart/org-chart-edge.tsx"},{"path":"registry/constructive/blocks/org-chart/org-chart-empty.tsx","type":"registry:component","target":"@ui/org-chart/org-chart-empty.tsx"},{"path":"registry/constructive/blocks/org-chart/layout.ts","type":"registry:lib","target":"@ui/org-chart/layout.ts"},{"path":"registry/constructive/blocks/org-chart/org-chart-utils.ts","type":"registry:lib","target":"@ui/org-chart/org-chart-utils.ts"},{"path":"registry/constructive/blocks/org-chart/org-chart.types.ts","type":"registry:lib","target":"@ui/org-chart/org-chart.types.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/org-chart"},{"name":"storage","type":"registry:block","title":"Storage Foundation","description":"Shared storage types, formatters, file icons, status badges, breadcrumbs, and object-toolbar primitives.","categories":["block","application"],"docs":"Install this transitively through `storage-browser`, or import its files directly from `@/components/ui/storage/*`.","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/badge","@constructive/breadcrumb","@constructive/button","@constructive/dropdown-menu","@constructive/input-group","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/storage/types.ts","type":"registry:lib","target":"@ui/storage/types.ts"},{"path":"registry/constructive/blocks/storage/utils.ts","type":"registry:lib","target":"@ui/storage/utils.ts"},{"path":"registry/constructive/blocks/storage/file-type-icon.tsx","type":"registry:component","target":"@ui/storage/file-type-icon.tsx"},{"path":"registry/constructive/blocks/storage/visibility-badge.tsx","type":"registry:component","target":"@ui/storage/visibility-badge.tsx"},{"path":"registry/constructive/blocks/storage/storage-breadcrumb.tsx","type":"registry:component","target":"@ui/storage/storage-breadcrumb.tsx"},{"path":"registry/constructive/blocks/storage/object-toolbar.tsx","type":"registry:component","target":"@ui/storage/object-toolbar.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/storage"},{"name":"storage-bucket-rail","type":"registry:block","title":"Storage Bucket Rail","description":"A controlled, scrollable bucket list with visibility, object-count, selection, and create-bucket affordances.","categories":["block","application"],"docs":"Import: `import { BucketRail } from '@/components/ui/storage/bucket-rail'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/storage","@constructive/cn","@constructive/badge","@constructive/button","@constructive/scroll-area","@constructive/separator","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/storage/bucket-rail.tsx","type":"registry:component","target":"@ui/storage/bucket-rail.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/storage-bucket-rail"},{"name":"storage-object-table","type":"registry:block","title":"Storage Object Table","description":"A controlled object table with sorting, selection, row actions, skeleton loading, and empty results.","categories":["block","application"],"docs":"Import: `import { ObjectTable } from '@/components/ui/storage/object-table'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/storage","@constructive/button","@constructive/checkbox","@constructive/dropdown-menu","@constructive/skeleton","@constructive/table","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/storage/object-table.tsx","type":"registry:component","target":"@ui/storage/object-table.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/storage-object-table"},{"name":"storage-upload-dropzone","type":"registry:block","title":"Storage Upload Dropzone","description":"A drag-and-drop upload target with a browse action and an in-flight upload progress list.","categories":["block","application"],"docs":"Import: `import { UploadDropzone } from '@/components/ui/storage/upload-dropzone'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/storage","@constructive/cn","@constructive/button","@constructive/progress","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/storage/upload-dropzone.tsx","type":"registry:component","target":"@ui/storage/upload-dropzone.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/storage-upload-dropzone"},{"name":"storage-object-detail-sheet","type":"registry:block","title":"Storage Object Detail Sheet","description":"A controlled object-detail sheet with preview, metadata, rename, download, link, and confirmed delete actions.","categories":["block","application"],"docs":"Import: `import { ObjectDetailSheet } from '@/components/ui/storage/object-detail-sheet'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/storage","@constructive/cn","@constructive/alert-dialog","@constructive/button","@constructive/input","@constructive/separator","@constructive/skeleton","@constructive/sheet","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/storage/object-detail-sheet.tsx","type":"registry:component","target":"@ui/storage/object-detail-sheet.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/storage-object-detail-sheet"},{"name":"storage-bucket-config-sheet","type":"registry:block","title":"Storage Bucket Config Sheet","description":"A create-or-edit bucket form with visibility and optional controls gated by the host schema.","categories":["block","application"],"docs":"Import: `import { BucketConfigSheet } from '@/components/ui/storage/bucket-config-sheet'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/storage","@constructive/cn","@constructive/badge","@constructive/button","@constructive/input","@constructive/label","@constructive/radio-group","@constructive/switch","@constructive/textarea","@constructive/sheet","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/storage/bucket-config-sheet.tsx","type":"registry:component","target":"@ui/storage/bucket-config-sheet.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/storage-bucket-config-sheet"},{"name":"storage-empty-state","type":"registry:block","title":"Storage Empty State","description":"Accessible empty and unavailable states for missing buckets, unprovisioned storage, empty buckets, and denied access.","categories":["block","application"],"docs":"Import: `import { StorageEmptyState } from '@/components/ui/storage/storage-empty-state'`","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/button","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/storage/storage-empty-state.tsx","type":"registry:component","target":"@ui/storage/storage-empty-state.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/storage-empty-state"},{"name":"storage-browser","type":"registry:block","title":"Storage Browser","description":"A complete controlled storage workspace with bucket navigation, object discovery, upload, configuration, detail, and empty states.","categories":["block","application"],"docs":"Import: `import { StorageBrowser } from '@/components/ui/storage'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/storage","@constructive/storage-bucket-rail","@constructive/storage-object-table","@constructive/storage-upload-dropzone","@constructive/storage-object-detail-sheet","@constructive/storage-bucket-config-sheet","@constructive/storage-empty-state","@constructive/cn","@constructive/separator","@constructive/button","@constructive/select","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/storage/index.ts","type":"registry:component","target":"@ui/storage/index.ts"},{"path":"registry/constructive/blocks/storage/storage-browser.tsx","type":"registry:component","target":"@ui/storage/storage-browser.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/storage-browser"},{"name":"stack","type":"registry:block","title":"Stack Navigation","description":"iOS-style navigation stack with gestures and animations.","categories":["block"],"docs":"Import: `import { Stack, StackCard } from '@/components/ui/stack'`","dependencies":["motion","@use-gesture/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/portal","@constructive/skeleton","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/stack/index.ts","type":"registry:component","target":"@ui/stack/index.ts"},{"path":"registry/constructive/blocks/stack/stack-context.tsx","type":"registry:component","target":"@ui/stack/stack-context.tsx"},{"path":"registry/constructive/blocks/stack/stack-card.tsx","type":"registry:component","target":"@ui/stack/stack-card.tsx"},{"path":"registry/constructive/blocks/stack/stack-header.tsx","type":"registry:component","target":"@ui/stack/stack-header.tsx"},{"path":"registry/constructive/blocks/stack/stack-backdrop.tsx","type":"registry:component","target":"@ui/stack/stack-backdrop.tsx"},{"path":"registry/constructive/blocks/stack/stack-viewport.tsx","type":"registry:component","target":"@ui/stack/stack-viewport.tsx"},{"path":"registry/constructive/blocks/stack/deferred-card-content.tsx","type":"registry:component","target":"@ui/stack/deferred-card-content.tsx"},{"path":"registry/constructive/blocks/stack/stack-animations.ts","type":"registry:lib","target":"@ui/stack/stack-animations.ts"},{"path":"registry/constructive/blocks/stack/stack-utils.ts","type":"registry:lib","target":"@ui/stack/stack-utils.ts"},{"path":"registry/constructive/blocks/stack/stack.types.ts","type":"registry:lib","target":"@ui/stack/stack.types.ts"},{"path":"registry/constructive/blocks/stack/use-stack-gestures.ts","type":"registry:hook","target":"@ui/stack/use-stack-gestures.ts"},{"path":"registry/constructive/blocks/stack/use-peek-gestures.ts","type":"registry:hook","target":"@ui/stack/use-peek-gestures.ts"},{"path":"registry/constructive/blocks/stack/use-stack-responsive.ts","type":"registry:hook","target":"@ui/stack/use-stack-responsive.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/stack"},{"name":"toast","type":"registry:block","title":"Toast Notifications","description":"Styled toast notification functions using Sonner.","categories":["block"],"docs":"Import: `import { toastSuccess, toastError, toastWarning, toastInfo } from '@/components/ui/toast'`","dependencies":["sonner","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/button","@constructive/dialog","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/toast/index.ts","type":"registry:component","target":"@ui/toast/index.ts"},{"path":"registry/constructive/blocks/toast/toast-error.tsx","type":"registry:component","target":"@ui/toast/toast-error.tsx"},{"path":"registry/constructive/blocks/toast/toast-success.tsx","type":"registry:component","target":"@ui/toast/toast-success.tsx"},{"path":"registry/constructive/blocks/toast/toast-warning.tsx","type":"registry:component","target":"@ui/toast/toast-warning.tsx"},{"path":"registry/constructive/blocks/toast/toast-info.tsx","type":"registry:component","target":"@ui/toast/toast-info.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/toast"},{"name":"app-bar","type":"registry:block","title":"App Bar","description":"A sticky application header with a sidebar trigger, responsive breadcrumbs, and framework-neutral search and action slots.","categories":["block","navigation"],"docs":"Import: `import { AppBar } from '@/components/ui/app-bar'`","dependencies":["@base-ui/react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/breadcrumb","@constructive/separator","@constructive/sidebar","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/app-bar.tsx","type":"registry:component","target":"@ui/app-bar.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/app-bar"},{"name":"app-shell","type":"registry:block","title":"App Shell","description":"A provider-neutral application shell with typed navigation, brand, account, breadcrumb, and link-render contracts.","categories":["block","navigation"],"docs":"Import: `import { AppShell } from '@/components/ui/app-shell'`","dependencies":["@base-ui/react","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/app-bar","@constructive/avatar","@constructive/collapsible","@constructive/dropdown-menu","@constructive/sidebar","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/app-shell.tsx","type":"registry:component","target":"@ui/app-shell.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/app-shell"},{"name":"field","type":"registry:ui","title":"Field","description":"Composable form layout with groups, fieldsets, legends, labels, descriptions, separators, and accessible errors.","categories":["form"],"docs":"Import: `import { Field, FieldGroup, FieldLabel, FieldDescription, FieldError } from '@/components/ui/field'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/label","@constructive/separator","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/field.tsx","type":"registry:ui","target":"@ui/field.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/field"},{"name":"empty","type":"registry:ui","title":"Empty","description":"A composable empty-state layout with media, title, description, and action content.","categories":["layout"],"docs":"Import: `import { Empty, EmptyHeader, EmptyMedia, EmptyTitle, EmptyDescription, EmptyContent } from '@/components/ui/empty'`","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/ui/empty.tsx","type":"registry:ui","target":"@ui/empty.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/empty"},{"name":"ai","type":"registry:block","title":"AI Kit","description":"Presentational primitives for AI and agentic chat UIs: composer, messages, reasoning, tools, HITL approval, plan tracking, and streaming surfaces.","categories":["block","ai"],"docs":"Import PromptInput, Message, Tool, Reasoning, and PlanTracker from the installed ai directory under your configured shadcn ui alias.","dependencies":["lucide-react","sugar-high"],"devDependencies":[],"registryDependencies":["@constructive/cn","@constructive/button","@constructive/avatar","@constructive/tooltip","@constructive/alert","@constructive/collapsible","@constructive/badge","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/ai/agent-loader.tsx","type":"registry:component","target":"@ui/ai/agent-loader.tsx"},{"path":"registry/constructive/blocks/ai/approval-card.tsx","type":"registry:component","target":"@ui/ai/approval-card.tsx"},{"path":"registry/constructive/blocks/ai/chat-container.tsx","type":"registry:component","target":"@ui/ai/chat-container.tsx"},{"path":"registry/constructive/blocks/ai/code-block.tsx","type":"registry:component","target":"@ui/ai/code-block.tsx"},{"path":"registry/constructive/blocks/ai/context-card.tsx","type":"registry:component","target":"@ui/ai/context-card.tsx"},{"path":"registry/constructive/blocks/ai/context-ring.tsx","type":"registry:component","target":"@ui/ai/context-ring.tsx"},{"path":"registry/constructive/blocks/ai/diff-table.tsx","type":"registry:component","target":"@ui/ai/diff-table.tsx"},{"path":"registry/constructive/blocks/ai/feedback-bar.tsx","type":"registry:component","target":"@ui/ai/feedback-bar.tsx"},{"path":"registry/constructive/blocks/ai/file-upload.tsx","type":"registry:component","target":"@ui/ai/file-upload.tsx"},{"path":"registry/constructive/blocks/ai/format-duration.ts","type":"registry:component","target":"@ui/ai/format-duration.ts"},{"path":"registry/constructive/blocks/ai/image.tsx","type":"registry:component","target":"@ui/ai/image.tsx"},{"path":"registry/constructive/blocks/ai/index.ts","type":"registry:component","target":"@ui/ai/index.ts"},{"path":"registry/constructive/blocks/ai/inline-diff.tsx","type":"registry:component","target":"@ui/ai/inline-diff.tsx"},{"path":"registry/constructive/blocks/ai/markdown.tsx","type":"registry:component","target":"@ui/ai/markdown.tsx"},{"path":"registry/constructive/blocks/ai/message.tsx","type":"registry:component","target":"@ui/ai/message.tsx"},{"path":"registry/constructive/blocks/ai/plan-tracker.tsx","type":"registry:component","target":"@ui/ai/plan-tracker.tsx"},{"path":"registry/constructive/blocks/ai/prompt-input.tsx","type":"registry:component","target":"@ui/ai/prompt-input.tsx"},{"path":"registry/constructive/blocks/ai/prompt-suggestion.tsx","type":"registry:component","target":"@ui/ai/prompt-suggestion.tsx"},{"path":"registry/constructive/blocks/ai/reasoning.tsx","type":"registry:component","target":"@ui/ai/reasoning.tsx"},{"path":"registry/constructive/blocks/ai/recommendation-card.tsx","type":"registry:component","target":"@ui/ai/recommendation-card.tsx"},{"path":"registry/constructive/blocks/ai/response-stream.tsx","type":"registry:component","target":"@ui/ai/response-stream.tsx"},{"path":"registry/constructive/blocks/ai/scroll-button.tsx","type":"registry:component","target":"@ui/ai/scroll-button.tsx"},{"path":"registry/constructive/blocks/ai/source.tsx","type":"registry:component","target":"@ui/ai/source.tsx"},{"path":"registry/constructive/blocks/ai/steps.tsx","type":"registry:component","target":"@ui/ai/steps.tsx"},{"path":"registry/constructive/blocks/ai/streaming-text.tsx","type":"registry:component","target":"@ui/ai/streaming-text.tsx"},{"path":"registry/constructive/blocks/ai/system-message.tsx","type":"registry:component","target":"@ui/ai/system-message.tsx"},{"path":"registry/constructive/blocks/ai/task-row.tsx","type":"registry:component","target":"@ui/ai/task-row.tsx"},{"path":"registry/constructive/blocks/ai/text-shimmer.tsx","type":"registry:component","target":"@ui/ai/text-shimmer.tsx"},{"path":"registry/constructive/blocks/ai/thinking-trace.tsx","type":"registry:component","target":"@ui/ai/thinking-trace.tsx"},{"path":"registry/constructive/blocks/ai/tool.tsx","type":"registry:component","target":"@ui/ai/tool.tsx"},{"path":"registry/constructive/blocks/ai/types.ts","type":"registry:component","target":"@ui/ai/types.ts"},{"path":"registry/constructive/blocks/ai/use-throttled-text.ts","type":"registry:component","target":"@ui/ai/use-throttled-text.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/ai"},{"name":"form-kit","type":"registry:ui","title":"Form Kit","description":"All form-related components: input, textarea, checkbox, radio, select, switch, progress, form controls.","categories":["bundle"],"docs":null,"dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/input","@constructive/textarea","@constructive/checkbox","@constructive/checkbox-group","@constructive/radio-group","@constructive/switch","@constructive/select","@constructive/progress","@constructive/form","@constructive/form-control","@constructive/input-group","@constructive/field","@constructive/label","@constructive/constructive-theme"],"files":[],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/form-kit"},{"name":"overlay-kit","type":"registry:ui","title":"Overlay Kit","description":"All overlay components: dialog, sheet, drawer, popover, tooltip, dropdown menu, alert dialog.","categories":["bundle"],"docs":null,"dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/dialog","@constructive/sheet","@constructive/drawer","@constructive/popover","@constructive/tooltip","@constructive/dropdown-menu","@constructive/alert-dialog","@constructive/command","@constructive/constructive-theme"],"files":[],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/overlay-kit"},{"name":"layout-kit","type":"registry:ui","title":"Layout Kit","description":"Layout and navigation components: tabs, sidebar, collapsible, resizable panels, scroll area, breadcrumb, pagination.","categories":["bundle"],"docs":null,"dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/tabs","@constructive/sidebar","@constructive/collapsible","@constructive/resizable","@constructive/scroll-area","@constructive/breadcrumb","@constructive/pagination","@constructive/separator","@constructive/empty","@constructive/constructive-theme"],"files":[],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/layout-kit"},{"name":"sheets","type":"registry:block","title":"Sheets","description":"A metadata-driven, spreadsheet-grade CRUD grid with accessible DOM cells and adapter-owned data access.","categories":["blocks","data"],"docs":"Install the complete source-owned grid with `pnpm dlx shadcn@latest add @constructive/sheets`, then import `Sheets`, `SheetsProvider`, and the adapter contracts from `@/components/ui/sheets`. The copied source depends on `@constructive-io/data` for the current `_meta` contract and runtime GraphQL operations; your host remains responsible for its endpoint, session, and RLS-aware execution boundary.","dependencies":["@constructive-io/data@^0.5.0","@internationalized/date","@remixicon/react","@tanstack/react-form","@tanstack/react-query","@tanstack/react-table@9.0.0-beta.58","@tanstack/react-virtual","@types/leaflet","clsx","graphql","inflekt","leaflet","lucide-react","motion","react-aria-components","react-leaflet","tailwind-merge","zod","zustand"],"devDependencies":[],"registryDependencies":["@constructive/alert-dialog","@constructive/badge","@constructive/button","@constructive/calendar-rac","@constructive/card","@constructive/checkbox","@constructive/collapsible","@constructive/dropdown-menu","@constructive/form-control","@constructive/input","@constructive/input-group","@constructive/label","@constructive/pagination","@constructive/popover","@constructive/progressive-blur","@constructive/scroll-area","@constructive/select","@constructive/skeleton","@constructive/tabs","@constructive/textarea","@constructive/toast","@constructive/tooltip","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/sheets/adapter/postgraphile-adapter.ts","type":"registry:lib","target":"@ui/sheets/adapter/postgraphile-adapter.ts"},{"path":"registry/constructive/blocks/sheets/adapter/sheets-adapter.ts","type":"registry:lib","target":"@ui/sheets/adapter/sheets-adapter.ts"},{"path":"registry/constructive/blocks/sheets/adapter/use-sheets-adapter.ts","type":"registry:lib","target":"@ui/sheets/adapter/use-sheets-adapter.ts"},{"path":"registry/constructive/blocks/sheets/advanced.ts","type":"registry:lib","target":"@ui/sheets/advanced.ts"},{"path":"registry/constructive/blocks/sheets/auth/auth-execute.ts","type":"registry:lib","target":"@ui/sheets/auth/auth-execute.ts"},{"path":"registry/constructive/blocks/sheets/auth/auth-gate.tsx","type":"registry:component","target":"@ui/sheets/auth/auth-gate.tsx"},{"path":"registry/constructive/blocks/sheets/auth/auth-types.ts","type":"registry:lib","target":"@ui/sheets/auth/auth-types.ts"},{"path":"registry/constructive/blocks/sheets/auth/hooks/index.ts","type":"registry:lib","target":"@ui/sheets/auth/hooks/index.ts"},{"path":"registry/constructive/blocks/sheets/auth/hooks/use-forgot-password.ts","type":"registry:lib","target":"@ui/sheets/auth/hooks/use-forgot-password.ts"},{"path":"registry/constructive/blocks/sheets/auth/hooks/use-login.ts","type":"registry:lib","target":"@ui/sheets/auth/hooks/use-login.ts"},{"path":"registry/constructive/blocks/sheets/auth/hooks/use-register.ts","type":"registry:lib","target":"@ui/sheets/auth/hooks/use-register.ts"},{"path":"registry/constructive/blocks/sheets/auth/hooks/use-reset-password.ts","type":"registry:lib","target":"@ui/sheets/auth/hooks/use-reset-password.ts"},{"path":"registry/constructive/blocks/sheets/auth/index.ts","type":"registry:lib","target":"@ui/sheets/auth/index.ts"},{"path":"registry/constructive/blocks/sheets/auth/ui/auth-error-alert.tsx","type":"registry:component","target":"@ui/sheets/auth/ui/auth-error-alert.tsx"},{"path":"registry/constructive/blocks/sheets/auth/ui/auth-loading-button.tsx","type":"registry:component","target":"@ui/sheets/auth/ui/auth-loading-button.tsx"},{"path":"registry/constructive/blocks/sheets/auth/ui/auth-screen-header.tsx","type":"registry:component","target":"@ui/sheets/auth/ui/auth-screen-header.tsx"},{"path":"registry/constructive/blocks/sheets/auth/ui/auth-screen-layout.tsx","type":"registry:component","target":"@ui/sheets/auth/ui/auth-screen-layout.tsx"},{"path":"registry/constructive/blocks/sheets/auth/ui/forgot-password-form.tsx","type":"registry:component","target":"@ui/sheets/auth/ui/forgot-password-form.tsx"},{"path":"registry/constructive/blocks/sheets/auth/ui/form-field.tsx","type":"registry:component","target":"@ui/sheets/auth/ui/form-field.tsx"},{"path":"registry/constructive/blocks/sheets/auth/ui/login-form.tsx","type":"registry:component","target":"@ui/sheets/auth/ui/login-form.tsx"},{"path":"registry/constructive/blocks/sheets/auth/ui/password-strength.tsx","type":"registry:component","target":"@ui/sheets/auth/ui/password-strength.tsx"},{"path":"registry/constructive/blocks/sheets/auth/ui/register-form.tsx","type":"registry:component","target":"@ui/sheets/auth/ui/register-form.tsx"},{"path":"registry/constructive/blocks/sheets/auth/ui/reset-password-form.tsx","type":"registry:component","target":"@ui/sheets/auth/ui/reset-password-form.tsx"},{"path":"registry/constructive/blocks/sheets/auth/utils/auth-errors.ts","type":"registry:lib","target":"@ui/sheets/auth/utils/auth-errors.ts"},{"path":"registry/constructive/blocks/sheets/auth/utils/schemas.ts","type":"registry:lib","target":"@ui/sheets/auth/utils/schemas.ts"},{"path":"registry/constructive/blocks/sheets/auth/utils/token-store.ts","type":"registry:lib","target":"@ui/sheets/auth/utils/token-store.ts"},{"path":"registry/constructive/blocks/sheets/auth/utils/validators.ts","type":"registry:lib","target":"@ui/sheets/auth/utils/validators.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/badge-tones.ts","type":"registry:lib","target":"@ui/sheets/cell-model/badge-tones.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/cell-props.ts","type":"registry:lib","target":"@ui/sheets/cell-model/cell-props.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/cell-slots.ts","type":"registry:lib","target":"@ui/sheets/cell-model/cell-slots.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/create-sheets-cell.ts","type":"registry:lib","target":"@ui/sheets/cell-model/create-sheets-cell.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/factories/badges.ts","type":"registry:lib","target":"@ui/sheets/cell-model/factories/badges.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/factories/boolean.ts","type":"registry:lib","target":"@ui/sheets/cell-model/factories/boolean.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/factories/datetime.ts","type":"registry:lib","target":"@ui/sheets/cell-model/factories/datetime.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/factories/geometry.ts","type":"registry:lib","target":"@ui/sheets/cell-model/factories/geometry.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/factories/image.ts","type":"registry:lib","target":"@ui/sheets/cell-model/factories/image.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/factories/interval.ts","type":"registry:lib","target":"@ui/sheets/cell-model/factories/interval.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/factories/number.ts","type":"registry:lib","target":"@ui/sheets/cell-model/factories/number.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/factories/relation.ts","type":"registry:lib","target":"@ui/sheets/cell-model/factories/relation.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/factories/text.ts","type":"registry:lib","target":"@ui/sheets/cell-model/factories/text.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/factories/types.ts","type":"registry:lib","target":"@ui/sheets/cell-model/factories/types.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/factories/uri.ts","type":"registry:lib","target":"@ui/sheets/cell-model/factories/uri.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/image-cache.ts","type":"registry:lib","target":"@ui/sheets/cell-model/image-cache.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/sheets-cell.ts","type":"registry:lib","target":"@ui/sheets/cell-model/sheets-cell.ts"},{"path":"registry/constructive/blocks/sheets/cell-model/views/badges-view.tsx","type":"registry:component","target":"@ui/sheets/cell-model/views/badges-view.tsx"},{"path":"registry/constructive/blocks/sheets/cell-model/views/boolean-view.tsx","type":"registry:component","target":"@ui/sheets/cell-model/views/boolean-view.tsx"},{"path":"registry/constructive/blocks/sheets/cell-model/views/datetime-view.tsx","type":"registry:component","target":"@ui/sheets/cell-model/views/datetime-view.tsx"},{"path":"registry/constructive/blocks/sheets/cell-model/views/draft-action-view.tsx","type":"registry:component","target":"@ui/sheets/cell-model/views/draft-action-view.tsx"},{"path":"registry/constructive/blocks/sheets/cell-model/views/geometry-view.tsx","type":"registry:component","target":"@ui/sheets/cell-model/views/geometry-view.tsx"},{"path":"registry/constructive/blocks/sheets/cell-model/views/image-view.tsx","type":"registry:component","target":"@ui/sheets/cell-model/views/image-view.tsx"},{"path":"registry/constructive/blocks/sheets/cell-model/views/interval-view.tsx","type":"registry:component","target":"@ui/sheets/cell-model/views/interval-view.tsx"},{"path":"registry/constructive/blocks/sheets/cell-model/views/loading-view.tsx","type":"registry:component","target":"@ui/sheets/cell-model/views/loading-view.tsx"},{"path":"registry/constructive/blocks/sheets/cell-model/views/number-view.tsx","type":"registry:component","target":"@ui/sheets/cell-model/views/number-view.tsx"},{"path":"registry/constructive/blocks/sheets/cell-model/views/relation-view.tsx","type":"registry:component","target":"@ui/sheets/cell-model/views/relation-view.tsx"},{"path":"registry/constructive/blocks/sheets/cell-model/views/text-view.tsx","type":"registry:component","target":"@ui/sheets/cell-model/views/text-view.tsx"},{"path":"registry/constructive/blocks/sheets/cell-model/views/uri-view.tsx","type":"registry:component","target":"@ui/sheets/cell-model/views/uri-view.tsx"},{"path":"registry/constructive/blocks/sheets/cell-types/cell-registry-defaults.ts","type":"registry:lib","target":"@ui/sheets/cell-types/cell-registry-defaults.ts"},{"path":"registry/constructive/blocks/sheets/cell-types/cell-registry.ts","type":"registry:lib","target":"@ui/sheets/cell-types/cell-registry.ts"},{"path":"registry/constructive/blocks/sheets/cell-types/cell-type-groups.ts","type":"registry:lib","target":"@ui/sheets/cell-types/cell-type-groups.ts"},{"path":"registry/constructive/blocks/sheets/cell-types/cell-type-registry.ts","type":"registry:lib","target":"@ui/sheets/cell-types/cell-type-registry.ts"},{"path":"registry/constructive/blocks/sheets/cell-types/cell-type-resolver.ts","type":"registry:lib","target":"@ui/sheets/cell-types/cell-type-resolver.ts"},{"path":"registry/constructive/blocks/sheets/cell-types/define-cell-type.ts","type":"registry:lib","target":"@ui/sheets/cell-types/define-cell-type.ts"},{"path":"registry/constructive/blocks/sheets/cell-types/type-mapping.ts","type":"registry:lib","target":"@ui/sheets/cell-types/type-mapping.ts"},{"path":"registry/constructive/blocks/sheets/cell-types/types.ts","type":"registry:lib","target":"@ui/sheets/cell-types/types.ts"},{"path":"registry/constructive/blocks/sheets/commands/context.ts","type":"registry:lib","target":"@ui/sheets/commands/context.ts"},{"path":"registry/constructive/blocks/sheets/commands/dispatch.ts","type":"registry:lib","target":"@ui/sheets/commands/dispatch.ts"},{"path":"registry/constructive/blocks/sheets/commands/index.ts","type":"registry:lib","target":"@ui/sheets/commands/index.ts"},{"path":"registry/constructive/blocks/sheets/commands/keybinding.ts","type":"registry:lib","target":"@ui/sheets/commands/keybinding.ts"},{"path":"registry/constructive/blocks/sheets/commands/keymap.ts","type":"registry:lib","target":"@ui/sheets/commands/keymap.ts"},{"path":"registry/constructive/blocks/sheets/commands/registry.ts","type":"registry:lib","target":"@ui/sheets/commands/registry.ts"},{"path":"registry/constructive/blocks/sheets/commands/types.ts","type":"registry:lib","target":"@ui/sheets/commands/types.ts"},{"path":"registry/constructive/blocks/sheets/config/sheets-concurrency.ts","type":"registry:lib","target":"@ui/sheets/config/sheets-concurrency.ts"},{"path":"registry/constructive/blocks/sheets/context/sheets-context.ts","type":"registry:lib","target":"@ui/sheets/context/sheets-context.ts"},{"path":"registry/constructive/blocks/sheets/context/sheets-execute.ts","type":"registry:lib","target":"@ui/sheets/context/sheets-execute.ts"},{"path":"registry/constructive/blocks/sheets/context/sheets-provider.tsx","type":"registry:component","target":"@ui/sheets/context/sheets-provider.tsx"},{"path":"registry/constructive/blocks/sheets/context/sheets-upload-presigned.ts","type":"registry:lib","target":"@ui/sheets/context/sheets-upload-presigned.ts"},{"path":"registry/constructive/blocks/sheets/forms/form-spec-builder.ts","type":"registry:lib","target":"@ui/sheets/forms/form-spec-builder.ts"},{"path":"registry/constructive/blocks/sheets/forms/index.ts","type":"registry:lib","target":"@ui/sheets/forms/index.ts"},{"path":"registry/constructive/blocks/sheets/forms/metadata-hash.ts","type":"registry:lib","target":"@ui/sheets/forms/metadata-hash.ts"},{"path":"registry/constructive/blocks/sheets/forms/mutations.ts","type":"registry:lib","target":"@ui/sheets/forms/mutations.ts"},{"path":"registry/constructive/blocks/sheets/forms/types.ts","type":"registry:lib","target":"@ui/sheets/forms/types.ts"},{"path":"registry/constructive/blocks/sheets/forms/zod-schema.ts","type":"registry:lib","target":"@ui/sheets/forms/zod-schema.ts"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/array-editor.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/editors/array-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/date-editor.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/editors/date-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/edit-intent.ts","type":"registry:lib","target":"@ui/sheets/grid-dom/editors/edit-intent.ts"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/editor-props.ts","type":"registry:lib","target":"@ui/sheets/grid-dom/editors/editor-props.ts"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/editor-registry-dom.ts","type":"registry:lib","target":"@ui/sheets/grid-dom/editors/editor-registry-dom.ts"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/geometry-editor.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/editors/geometry-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/image-editor.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/editors/image-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/inet-editor.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/editors/inet-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/interval-editor.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/editors/interval-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/json-editor.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/editors/json-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/number-editor.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/editors/number-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/relation-editor.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/editors/relation-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/text-editor.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/editors/text-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/tsvector-editor.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/editors/tsvector-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/upload-editor.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/editors/upload-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/editors/url-editor.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/editors/url-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/inline-cell-editor.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/inline-cell-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/overlay/overlay-manager.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/overlay/overlay-manager.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/overlay/use-overlay-controller.ts","type":"registry:lib","target":"@ui/sheets/grid-dom/overlay/use-overlay-controller.ts"},{"path":"registry/constructive/blocks/sheets/grid-dom/sheets-cell-host.tsx","type":"registry:component","target":"@ui/sheets/grid-dom/sheets-cell-host.tsx"},{"path":"registry/constructive/blocks/sheets/grid-dom/use-sheets-content.ts","type":"registry:lib","target":"@ui/sheets/grid-dom/use-sheets-content.ts"},{"path":"registry/constructive/blocks/sheets/grid/cell-routing.ts","type":"registry:lib","target":"@ui/sheets/grid/cell-routing.ts"},{"path":"registry/constructive/blocks/sheets/grid/draft-types.ts","type":"registry:lib","target":"@ui/sheets/grid/draft-types.ts"},{"path":"registry/constructive/blocks/sheets/grid/editors/array-editor.tsx","type":"registry:component","target":"@ui/sheets/grid/editors/array-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid/editors/date-editor.tsx","type":"registry:component","target":"@ui/sheets/grid/editors/date-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid/editors/editor-focus-trap.tsx","type":"registry:component","target":"@ui/sheets/grid/editors/editor-focus-trap.tsx"},{"path":"registry/constructive/blocks/sheets/grid/editors/geometry-editor.tsx","type":"registry:component","target":"@ui/sheets/grid/editors/geometry-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid/editors/image-editor.tsx","type":"registry:component","target":"@ui/sheets/grid/editors/image-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid/editors/inet-editor.tsx","type":"registry:component","target":"@ui/sheets/grid/editors/inet-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid/editors/interval-editor.tsx","type":"registry:component","target":"@ui/sheets/grid/editors/interval-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid/editors/json-editor.tsx","type":"registry:component","target":"@ui/sheets/grid/editors/json-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid/editors/overlay-presets.ts","type":"registry:lib","target":"@ui/sheets/grid/editors/overlay-presets.ts"},{"path":"registry/constructive/blocks/sheets/grid/editors/overlay-viewport-guard.tsx","type":"registry:component","target":"@ui/sheets/grid/editors/overlay-viewport-guard.tsx"},{"path":"registry/constructive/blocks/sheets/grid/editors/relation-editor.tsx","type":"registry:component","target":"@ui/sheets/grid/editors/relation-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid/editors/relation-record-tooltip.tsx","type":"registry:component","target":"@ui/sheets/grid/editors/relation-record-tooltip.tsx"},{"path":"registry/constructive/blocks/sheets/grid/editors/tsvector-editor.tsx","type":"registry:component","target":"@ui/sheets/grid/editors/tsvector-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid/editors/upload-editor.tsx","type":"registry:component","target":"@ui/sheets/grid/editors/upload-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid/editors/url-editor.tsx","type":"registry:component","target":"@ui/sheets/grid/editors/url-editor.tsx"},{"path":"registry/constructive/blocks/sheets/grid/feedback/dock-status-bar.tsx","type":"registry:component","target":"@ui/sheets/grid/feedback/dock-status-bar.tsx"},{"path":"registry/constructive/blocks/sheets/grid/feedback/editor-error-boundary.tsx","type":"registry:component","target":"@ui/sheets/grid/feedback/editor-error-boundary.tsx"},{"path":"registry/constructive/blocks/sheets/grid/feedback/feedback-context.tsx","type":"registry:component","target":"@ui/sheets/grid/feedback/feedback-context.tsx"},{"path":"registry/constructive/blocks/sheets/grid/feedback/feedback-reducer.ts","type":"registry:lib","target":"@ui/sheets/grid/feedback/feedback-reducer.ts"},{"path":"registry/constructive/blocks/sheets/grid/feedback/floating-status.tsx","type":"registry:component","target":"@ui/sheets/grid/feedback/floating-status.tsx"},{"path":"registry/constructive/blocks/sheets/grid/feedback/index.ts","type":"registry:lib","target":"@ui/sheets/grid/feedback/index.ts"},{"path":"registry/constructive/blocks/sheets/grid/feedback/sheets-error-boundary.tsx","type":"registry:component","target":"@ui/sheets/grid/feedback/sheets-error-boundary.tsx"},{"path":"registry/constructive/blocks/sheets/grid/feedback/sheets-error-state.tsx","type":"registry:component","target":"@ui/sheets/grid/feedback/sheets-error-state.tsx"},{"path":"registry/constructive/blocks/sheets/grid/filter-operators.ts","type":"registry:lib","target":"@ui/sheets/grid/filter-operators.ts"},{"path":"registry/constructive/blocks/sheets/grid/grid-cell-types.ts","type":"registry:lib","target":"@ui/sheets/grid/grid-cell-types.ts"},{"path":"registry/constructive/blocks/sheets/grid/hooks/use-batch-commit.ts","type":"registry:lib","target":"@ui/sheets/grid/hooks/use-batch-commit.ts"},{"path":"registry/constructive/blocks/sheets/grid/hooks/use-cell-editing.ts","type":"registry:lib","target":"@ui/sheets/grid/hooks/use-cell-editing.ts"},{"path":"registry/constructive/blocks/sheets/grid/hooks/use-draft-rows.ts","type":"registry:lib","target":"@ui/sheets/grid/hooks/use-draft-rows.ts"},{"path":"registry/constructive/blocks/sheets/grid/hooks/use-draft-submission.ts","type":"registry:lib","target":"@ui/sheets/grid/hooks/use-draft-submission.ts"},{"path":"registry/constructive/blocks/sheets/grid/hooks/use-filter-grid.ts","type":"registry:lib","target":"@ui/sheets/grid/hooks/use-filter-grid.ts"},{"path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-operations.ts","type":"registry:lib","target":"@ui/sheets/grid/hooks/use-grid-operations.ts"},{"path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-selection.ts","type":"registry:lib","target":"@ui/sheets/grid/hooks/use-grid-selection.ts"},{"path":"registry/constructive/blocks/sheets/grid/hooks/use-grid-state.ts","type":"registry:lib","target":"@ui/sheets/grid/hooks/use-grid-state.ts"},{"path":"registry/constructive/blocks/sheets/grid/hooks/use-infinite-grid-data.ts","type":"registry:lib","target":"@ui/sheets/grid/hooks/use-infinite-grid-data.ts"},{"path":"registry/constructive/blocks/sheets/grid/hooks/use-load-grid.ts","type":"registry:lib","target":"@ui/sheets/grid/hooks/use-load-grid.ts"},{"path":"registry/constructive/blocks/sheets/grid/hooks/use-paginate-grid.ts","type":"registry:lib","target":"@ui/sheets/grid/hooks/use-paginate-grid.ts"},{"path":"registry/constructive/blocks/sheets/grid/hooks/use-undo-redo.ts","type":"registry:lib","target":"@ui/sheets/grid/hooks/use-undo-redo.ts"},{"path":"registry/constructive/blocks/sheets/grid/row-model.ts","type":"registry:lib","target":"@ui/sheets/grid/row-model.ts"},{"path":"registry/constructive/blocks/sheets/grid/sheets.constants.ts","type":"registry:lib","target":"@ui/sheets/grid/sheets.constants.ts"},{"path":"registry/constructive/blocks/sheets/grid/sheets.context-menu.tsx","type":"registry:component","target":"@ui/sheets/grid/sheets.context-menu.tsx"},{"path":"registry/constructive/blocks/sheets/grid/sheets.controls.tsx","type":"registry:component","target":"@ui/sheets/grid/sheets.controls.tsx"},{"path":"registry/constructive/blocks/sheets/grid/sheets.formatters.ts","type":"registry:lib","target":"@ui/sheets/grid/sheets.formatters.ts"},{"path":"registry/constructive/blocks/sheets/grid/sheets.pagination.tsx","type":"registry:component","target":"@ui/sheets/grid/sheets.pagination.tsx"},{"path":"registry/constructive/blocks/sheets/grid/sheets.table-selector.tsx","type":"registry:component","target":"@ui/sheets/grid/sheets.table-selector.tsx"},{"path":"registry/constructive/blocks/sheets/grid/sheets.theme.ts","type":"registry:lib","target":"@ui/sheets/grid/sheets.theme.ts"},{"path":"registry/constructive/blocks/sheets/grid/sheets.tsx","type":"registry:component","target":"@ui/sheets/grid/sheets.tsx"},{"path":"registry/constructive/blocks/sheets/grid/sheets.types.ts","type":"registry:lib","target":"@ui/sheets/grid/sheets.types.ts"},{"path":"registry/constructive/blocks/sheets/grid/sheets.utils.ts","type":"registry:lib","target":"@ui/sheets/grid/sheets.utils.ts"},{"path":"registry/constructive/blocks/sheets/grid/use-sheets.ts","type":"registry:lib","target":"@ui/sheets/grid/use-sheets.ts"},{"path":"registry/constructive/blocks/sheets/hooks/orderby-enum-resolution.ts","type":"registry:lib","target":"@ui/sheets/hooks/orderby-enum-resolution.ts"},{"path":"registry/constructive/blocks/sheets/hooks/query-keys.ts","type":"registry:lib","target":"@ui/sheets/hooks/query-keys.ts"},{"path":"registry/constructive/blocks/sheets/hooks/relation-field-resolution.ts","type":"registry:lib","target":"@ui/sheets/hooks/relation-field-resolution.ts"},{"path":"registry/constructive/blocks/sheets/hooks/use-relation-columns.ts","type":"registry:lib","target":"@ui/sheets/hooks/use-relation-columns.ts"},{"path":"registry/constructive/blocks/sheets/hooks/use-relation-metadata-cache.ts","type":"registry:lib","target":"@ui/sheets/hooks/use-relation-metadata-cache.ts"},{"path":"registry/constructive/blocks/sheets/hooks/use-sheets-infinite-table.ts","type":"registry:lib","target":"@ui/sheets/hooks/use-sheets-infinite-table.ts"},{"path":"registry/constructive/blocks/sheets/hooks/use-sheets-meta.ts","type":"registry:lib","target":"@ui/sheets/hooks/use-sheets-meta.ts"},{"path":"registry/constructive/blocks/sheets/hooks/use-sheets-table-cursor.ts","type":"registry:lib","target":"@ui/sheets/hooks/use-sheets-table-cursor.ts"},{"path":"registry/constructive/blocks/sheets/hooks/use-sheets-table.ts","type":"registry:lib","target":"@ui/sheets/hooks/use-sheets-table.ts"},{"path":"registry/constructive/blocks/sheets/hooks/use-sheets-upload.ts","type":"registry:lib","target":"@ui/sheets/hooks/use-sheets-upload.ts"},{"path":"registry/constructive/blocks/sheets/index.ts","type":"registry:lib","target":"@ui/sheets/index.ts"},{"path":"registry/constructive/blocks/sheets/row-identity.ts","type":"registry:lib","target":"@ui/sheets/row-identity.ts"},{"path":"registry/constructive/blocks/sheets/selection/cell-extract.ts","type":"registry:lib","target":"@ui/sheets/selection/cell-extract.ts"},{"path":"registry/constructive/blocks/sheets/selection/fill.ts","type":"registry:lib","target":"@ui/sheets/selection/fill.ts"},{"path":"registry/constructive/blocks/sheets/selection/range-set.ts","type":"registry:lib","target":"@ui/sheets/selection/range-set.ts"},{"path":"registry/constructive/blocks/sheets/selection/selection-model.ts","type":"registry:lib","target":"@ui/sheets/selection/selection-model.ts"},{"path":"registry/constructive/blocks/sheets/selection/tsv.ts","type":"registry:lib","target":"@ui/sheets/selection/tsv.ts"},{"path":"registry/constructive/blocks/sheets/store/draft-rows-slice.ts","type":"registry:lib","target":"@ui/sheets/store/draft-rows-slice.ts"},{"path":"registry/constructive/blocks/sheets/store/relation-info-slice.ts","type":"registry:lib","target":"@ui/sheets/store/relation-info-slice.ts"},{"path":"registry/constructive/blocks/sheets/store/sheets-store.ts","type":"registry:lib","target":"@ui/sheets/store/sheets-store.ts"},{"path":"registry/constructive/blocks/sheets/table/features.ts","type":"registry:lib","target":"@ui/sheets/table/features.ts"},{"path":"registry/constructive/blocks/sheets/table/grid-viewport.tsx","type":"registry:component","target":"@ui/sheets/table/grid-viewport.tsx"},{"path":"registry/constructive/blocks/sheets/table/use-sheets-table-instance.ts","type":"registry:lib","target":"@ui/sheets/table/use-sheets-table-instance.ts"},{"path":"registry/constructive/blocks/sheets/utils/cn.ts","type":"registry:lib","target":"@ui/sheets/utils/cn.ts"},{"path":"registry/constructive/blocks/sheets/utils/file.utils.ts","type":"registry:lib","target":"@ui/sheets/utils/file.utils.ts"},{"path":"registry/constructive/blocks/sheets/utils/image-with-fallback.tsx","type":"registry:component","target":"@ui/sheets/utils/image-with-fallback.tsx"},{"path":"registry/constructive/blocks/sheets/utils/map-picker.tsx","type":"registry:component","target":"@ui/sheets/utils/map-picker.tsx"},{"path":"registry/constructive/blocks/sheets/utils/motion-config.ts","type":"registry:lib","target":"@ui/sheets/utils/motion-config.ts"},{"path":"registry/constructive/blocks/sheets/utils/relation-utils.ts","type":"registry:lib","target":"@ui/sheets/utils/relation-utils.ts"},{"path":"registry/constructive/blocks/sheets/utils/sheets-i18n.ts","type":"registry:lib","target":"@ui/sheets/utils/sheets-i18n.ts"},{"path":"registry/constructive/blocks/sheets/utils/sheets-logger.ts","type":"registry:lib","target":"@ui/sheets/utils/sheets-logger.ts"},{"path":"registry/constructive/blocks/sheets/utils/use-color-scheme.ts","type":"registry:lib","target":"@ui/sheets/utils/use-color-scheme.ts"},{"path":"registry/constructive/blocks/sheets/utils/use-image-status.ts","type":"registry:lib","target":"@ui/sheets/utils/use-image-status.ts"},{"path":"registry/constructive/blocks/sheets/utils/use-resize-observer.ts","type":"registry:lib","target":"@ui/sheets/utils/use-resize-observer.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/sheets"},{"name":"schema-builder","type":"registry:block","title":"Schema Builder","description":"An adapter-driven PostgreSQL schema editor for tables, fields, relationships, indexes, and RLS policies.","categories":["blocks","schema"],"docs":"Install the complete source-owned editor with `pnpm dlx shadcn@latest add @constructive/schema-builder`, then import `SchemaBuilder` and `defineSchemaBuilderAdapter` from `@/components/schema-builder`. The host supplies its generated-SDK adapter, control-plane scope, navigation, preferences, and invalidation behavior; the block never owns backend endpoints or credentials.","dependencies":["@constructive-io/data@^0.5.0","@dnd-kit/core","@dnd-kit/utilities","@fluentui/react-context-selector","@pgsql/types@17.6.2","@remixicon/react","@tanstack/react-query","clsx","lucide-react","motion","node-type-registry@^1.11.0","pg-ast@2.11.3","tailwind-merge","zustand"],"devDependencies":[],"registryDependencies":["@constructive/alert-dialog","@constructive/button","@constructive/checkbox","@constructive/collapsible","@constructive/combobox","@constructive/dropdown-menu","@constructive/field","@constructive/input","@constructive/input-group","@constructive/label","@constructive/multi-select","@constructive/progressive-blur","@constructive/responsive-diagram","@constructive/scroll-area","@constructive/select","@constructive/stack","@constructive/stepper","@constructive/switch","@constructive/tabs","@constructive/toast","@constructive/tooltip","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/schema-builder/compat/admin-sdk.ts","type":"registry:lib","target":"@components/schema-builder/compat/admin-sdk.ts"},{"path":"registry/constructive/blocks/schema-builder/compat/auth-sdk.ts","type":"registry:lib","target":"@components/schema-builder/compat/auth-sdk.ts"},{"path":"registry/constructive/blocks/schema-builder/compat/block-config.tsx","type":"registry:component","target":"@components/schema-builder/compat/block-config.tsx"},{"path":"registry/constructive/blocks/schema-builder/compat/generated-types.ts","type":"registry:lib","target":"@components/schema-builder/compat/generated-types.ts"},{"path":"registry/constructive/blocks/schema-builder/compat/modules-sdk.ts","type":"registry:lib","target":"@components/schema-builder/compat/modules-sdk.ts"},{"path":"registry/constructive/blocks/schema-builder/compat/relation-provisions.ts","type":"registry:lib","target":"@components/schema-builder/compat/relation-provisions.ts"},{"path":"registry/constructive/blocks/schema-builder/compat/schema-builder-sdk.ts","type":"registry:lib","target":"@components/schema-builder/compat/schema-builder-sdk.ts"},{"path":"registry/constructive/blocks/schema-builder/components/schema-builder.tsx","type":"registry:component","target":"@components/schema-builder/components/schema-builder.tsx"},{"path":"registry/constructive/blocks/schema-builder/core/context.tsx","type":"registry:component","target":"@components/schema-builder/core/context.tsx"},{"path":"registry/constructive/blocks/schema-builder/core/index.ts","type":"registry:lib","target":"@components/schema-builder/core/index.ts"},{"path":"registry/constructive/blocks/schema-builder/core/mutation.ts","type":"registry:lib","target":"@components/schema-builder/core/mutation.ts"},{"path":"registry/constructive/blocks/schema-builder/core/query.ts","type":"registry:lib","target":"@components/schema-builder/core/query.ts"},{"path":"registry/constructive/blocks/schema-builder/core/store.ts","type":"registry:lib","target":"@components/schema-builder/core/store.ts"},{"path":"registry/constructive/blocks/schema-builder/fields/index.ts","type":"registry:lib","target":"@components/schema-builder/fields/index.ts"},{"path":"registry/constructive/blocks/schema-builder/index.ts","type":"registry:lib","target":"@components/schema-builder/index.ts"},{"path":"registry/constructive/blocks/schema-builder/indexes/index.ts","type":"registry:lib","target":"@components/schema-builder/indexes/index.ts"},{"path":"registry/constructive/blocks/schema-builder/lib/utils.ts","type":"registry:lib","target":"@components/schema-builder/lib/utils.ts"},{"path":"registry/constructive/blocks/schema-builder/policies/index.ts","type":"registry:lib","target":"@components/schema-builder/policies/index.ts"},{"path":"registry/constructive/blocks/schema-builder/relationships/index.ts","type":"registry:lib","target":"@components/schema-builder/relationships/index.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/app-config.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/app-config.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/components/databases/index.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-core/components/databases/index.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/components/policies/composite-policy-builder/types.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/components/policies/composite-policy-builder/types.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/components/policies/condition-builder/types.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/components/policies/condition-builder/types.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/components/policies/policy-config.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/components/policies/policy-config.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/components/policies/policy-diagram/diagram-themes.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/components/policies/policy-diagram/diagram-themes.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/components/policies/policy-diagram/svg-icons.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/components/policies/policy-diagram/svg-icons.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/components/policies/policy-diagram/svg-primitives.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-core/components/policies/policy-diagram/svg-primitives.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/components/policies/policy-types.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/components/policies/policy-types.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/components/schemas/schema-state-display.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-core/components/schemas/schema-state-display.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/components/shared/base-state-display.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-core/components/shared/base-state-display.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/components/shared/empty-state-card.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-core/components/shared/empty-state-card.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/components/skeletons/index.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-core/components/skeletons/index.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/components/table-editor/delete-confirm-dialog.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-core/components/table-editor/delete-confirm-dialog.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/context/block-config.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-core/context/block-config.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/constants/membership-types.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/constants/membership-types.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/data/index.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/data/index.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/data/mutation-input.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/data/mutation-input.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/data/policy-provisioning.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/data/policy-provisioning.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/auth-error-handler.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/auth-error-handler.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/hooks/dashboard/dashboard-query-keys.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/hooks/dashboard/dashboard-query-keys.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/database-shared-utils.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/database-shared-utils.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/index.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/index.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/modules/invalidate-database-entities.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/modules/invalidate-database-entities.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/parse-list-field.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/parse-list-field.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/policies/use-database-policies.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/policies/use-database-policies.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/transformers/decimal-constraints.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/transformers/decimal-constraints.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/transformers/field-constraints-mapper.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/transformers/field-constraints-mapper.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/transformers/field-type-mapper.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/transformers/field-type-mapper.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/transformers/transformers.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/transformers/transformers.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/use-accessible-databases.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/use-accessible-databases.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/use-database-constraints.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/use-database-constraints.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/use-database-tables.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/use-database-tables.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/use-schema-builder-selectors.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/use-schema-builder-selectors.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/use-user-databases.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/hooks/schema-builder/use-user-databases.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/gql/type-mapping.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/gql/type-mapping.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/keyboard-activation.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/keyboard-activation.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/motion/motion-config.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/motion/motion-config.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/policies/add-policies-to-table.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/policies/add-policies-to-table.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/policies/ast-helpers.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/policies/ast-helpers.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/policies/policy-type-utils.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/policies/policy-type-utils.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/policies/provision-helpers.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/policies/provision-helpers.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/policies/rls-parser.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/policies/rls-parser.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/schema/common-constraint-registry.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/schema/common-constraint-registry.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/schema/constraint-mapping.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/schema/constraint-mapping.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/schema/field-type-registry.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/schema/field-type-registry.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/schema/index.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/schema/index.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/schema/schema-conversion.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/schema/schema-conversion.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/schema/types.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/schema/types.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/stack/card-widths.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/stack/card-widths.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/lib/types/cell-types.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/lib/types/cell-types.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/store/app-store.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/store/app-store.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/store/preferences-slice.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/store/preferences-slice.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-core/store/schema-slice.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-core/store/schema-slice.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-fields/components/table-editor/add-field-card.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-fields/components/table-editor/add-field-card.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-fields/components/table-editor/constraint-card.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-fields/components/table-editor/constraint-card.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-fields/components/table-editor/constraint-controls.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-fields/components/table-editor/constraint-controls.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-fields/components/table-editor/draggable-field-type-icon.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-fields/components/table-editor/draggable-field-type-icon.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-fields/components/table-editor/draggable-field-type.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-fields/components/table-editor/draggable-field-type.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-fields/components/table-editor/fields-list-view.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-fields/components/table-editor/fields-list-view.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-fields/components/table-editor/fields-section.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-fields/components/table-editor/fields-section.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-fields/components/table-editor/table-editor.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-fields/components/table-editor/table-editor.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-fields/components/table-editor/types-library-rail.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-fields/components/table-editor/types-library-rail.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-fields/components/table-editor/types-library.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-fields/components/table-editor/types-library.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-fields/components/table-editor/use-field-dnd.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-fields/components/table-editor/use-field-dnd.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-fields/components/table-editor/validation-rules-section.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-fields/components/table-editor/validation-rules-section.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-fields/lib/gql/hooks/schema-builder/use-field-mutations.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-fields/lib/gql/hooks/schema-builder/use-field-mutations.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-indexes/components/table-editor/index-card.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-indexes/components/table-editor/index-card.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-indexes/components/table-editor/index-diagram.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-indexes/components/table-editor/index-diagram.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-indexes/components/table-editor/indexes/index-empty-state.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-indexes/components/table-editor/indexes/index-empty-state.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-indexes/components/table-editor/indexes/index.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-indexes/components/table-editor/indexes/index.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-indexes/components/table-editor/indexes/indexes-view.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-indexes/components/table-editor/indexes/indexes-view.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-indexes/lib/gql/hooks/schema-builder/use-index-mutations.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-indexes/lib/gql/hooks/schema-builder/use-index-mutations.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/composite-policy-builder/composite-condition-edit-card.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/composite-policy-builder/composite-condition-edit-card.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/composite-policy-builder/composite-policy-builder.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/composite-policy-builder/composite-policy-builder.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/composite-policy-builder/flat-condition-list.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/composite-policy-builder/flat-condition-list.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/composite-policy-builder/index.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/composite-policy-builder/index.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/multi-value-field-editor.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/multi-value-field-editor.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-config-card.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-config-card.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-config-form/access-control-group.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-config-form/access-control-group.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-config-form/advanced-section.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-config-form/advanced-section.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-config-form/auto-generated-fields-info.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-config-form/auto-generated-fields-info.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-config-form/dynamic-form-field.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-config-form/dynamic-form-field.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-config-form/index.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-config-form/index.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-config-form/policy-config-form.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-config-form/policy-config-form.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-content.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-content.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/diagram-adapters.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/diagram-adapters.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/diagram-primitives.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/diagram-primitives.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/diagrams.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/diagrams.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-allow-all-dark.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-allow-all-dark.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-allow-all-light.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-allow-all-light.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-app-membership-dark.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-app-membership-dark.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-app-membership-light.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-app-membership-light.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-composite-dark.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-composite-dark.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-composite-light.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-composite-light.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-deny-all-dark.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-deny-all-dark.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-deny-all-light.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-deny-all-light.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-direct-owner-any-dark.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-direct-owner-any-dark.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-direct-owner-any-light.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-direct-owner-any-light.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-direct-owner-dark.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-direct-owner-dark.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-direct-owner-light.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-direct-owner-light.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-entity-membership-dark.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-entity-membership-dark.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-entity-membership-light.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-entity-membership-light.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-member-list-dark.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-member-list-dark.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-member-list-light.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-member-list-light.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-org-hierarchy-dark.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-org-hierarchy-dark.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-org-hierarchy-light.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-org-hierarchy-light.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-publishable-dark.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-publishable-dark.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-publishable-light.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-publishable-light.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-related-entity-membership-dark.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-related-entity-membership-dark.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-related-entity-membership-light.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-related-entity-membership-light.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-related-member-list-dark.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-related-member-list-dark.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-related-member-list-light.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-related-member-list-light.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-temporal-dark.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-temporal-dark.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-temporal-light.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/authz-temporal-light.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/index.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/generated/index.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/index.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/index.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/policy-diagram.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-diagram/policy-diagram.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-hooks.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-hooks.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/policy-know-more-card.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/policy-know-more-card.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/policies/use-crud-policy-state.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-policies/components/policies/use-crud-policy-state.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/table-editor/policies/index.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-policies/components/table-editor/policies/index.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/table-editor/policies/policies-empty-state.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/table-editor/policies/policies-empty-state.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/table-editor/policies/policies-view.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/table-editor/policies/policies-view.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/table-editor/policies/policy-edit-card.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/table-editor/policies/policy-edit-card.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/table-editor/policies/policy-operation-group.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/table-editor/policies/policy-operation-group.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/table-editor/policies/policy-pill.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/table-editor/policies/policy-pill.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/table-editor/policies/use-policy-edit-state.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-policies/components/table-editor/policies/use-policy-edit-state.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/components/tables/create-table-card.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-policies/components/tables/create-table-card.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/lib/gql/hooks/schema-builder/policies/use-create-policy-field.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-policies/lib/gql/hooks/schema-builder/policies/use-create-policy-field.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/lib/gql/hooks/schema-builder/policies/use-permissions.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-policies/lib/gql/hooks/schema-builder/policies/use-permissions.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/lib/gql/hooks/schema-builder/use-create-table.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-policies/lib/gql/hooks/schema-builder/use-create-table.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-policies/lib/gql/hooks/schema-builder/use-table-grants.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-policies/lib/gql/hooks/schema-builder/use-table-grants.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/index.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/index.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationship-card.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationship-card.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationship-connectors.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationship-connectors.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationship-diagram-themes.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationship-diagram-themes.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationship-diagrams.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationship-diagrams.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationship-empty-state.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationship-empty-state.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationship-type-selector.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationship-type-selector.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationship-utils.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationship-utils.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationships-view.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-relationships/components/table-editor/relationships/relationships-view.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-relationships/lib/gql/hooks/schema-builder/use-relation-provision.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-relationships/lib/gql/hooks/schema-builder/use-relation-provision.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-relationships/lib/gql/hooks/schema-builder/use-relationship-mutations.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-relationships/lib/gql/hooks/schema-builder/use-relationship-mutations.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-tables/components/schemas/schema-builder-sidebar.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-tables/components/schemas/schema-builder-sidebar.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-tables/components/table-editor/no-table-selected-view.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-tables/components/table-editor/no-table-selected-view.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-tables/components/table-editor/table-metadata-section.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-tables/components/table-editor/table-metadata-section.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-tables/components/tables/delete-table-dialog.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-tables/components/tables/delete-table-dialog.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-tables/components/tables/index.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-tables/components/tables/index.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-tables/components/tables/rename-table-card.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder-tables/components/tables/rename-table-card.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-tables/lib/gql/hooks/schema-builder/use-delete-table.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-tables/lib/gql/hooks/schema-builder/use-delete-table.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder-tables/lib/gql/hooks/schema-builder/use-update-table.ts","type":"registry:lib","target":"@components/schema-builder/schema/schema-builder-tables/lib/gql/hooks/schema-builder/use-update-table.ts"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder/components/client-only.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder/components/client-only.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder/components/schema-builder-header.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder/components/schema-builder-header.tsx"},{"path":"registry/constructive/blocks/schema-builder/schema/schema-builder/components/schemas/schemas-route.tsx","type":"registry:component","target":"@components/schema-builder/schema/schema-builder/components/schemas/schemas-route.tsx"},{"path":"registry/constructive/blocks/schema-builder/tables/index.ts","type":"registry:lib","target":"@components/schema-builder/tables/index.ts"},{"path":"registry/constructive/blocks/schema-builder/types.ts","type":"registry:lib","target":"@components/schema-builder/types.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/schema-builder"},{"name":"billing-contracts","type":"registry:lib","title":"Billing Contracts","description":"Provider-neutral billing DTOs, arbitrary-precision formatters, open-status presentation maps, and explicit resource states shared by every customer billing block.","categories":["blocks","billing"],"docs":"## Usage\n\nInstall this item when building a custom billing composition. It defines the shared resource states, account references, money values, allowances, plans, subscriptions, usage, credits, activity, messages, and formatting options used by the billing blocks.\n\n```ts\nimport type { BillingPlan, BillingResource } from '@/blocks/billing/billing-contracts/billing-contracts';\n\nconst plans: BillingResource = {\n status: 'ready',\n quality: 'authoritative',\n asOf: '2026-07-20T12:00:00.000Z',\n data: [{\n id: 'growth',\n name: 'Growth',\n prices: [{\n kind: 'fixed',\n id: 'growth-monthly',\n interval: 'month',\n money: { amountMinor: '4900', currency: 'USD' }\n }]\n }]\n};\n```\n\nKeep quantities, limits, deltas, and minor-unit money as decimal strings so large values retain their precision. Supply an explicit locale and time zone to the formatters, keep each record's currency, and use the explicit contact-sales, unlimited, uninitialized, and unknown variants when they apply.","dependencies":[],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/blocks/billing/billing-contracts/billing-contracts.ts","type":"registry:lib","target":"src/blocks/billing/billing-contracts/billing-contracts.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/billing-contracts"},{"name":"billing-ui","type":"registry:lib","title":"Billing UI Helpers","description":"Shared formatting and presentation helpers used by the customer billing blocks.","categories":["blocks","billing"],"docs":null,"dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/badge","@constructive/billing-contracts","@constructive/cn"],"files":[{"path":"registry/constructive/blocks/billing/billing-ui/billing-ui.tsx","type":"registry:lib","target":"src/blocks/billing/billing-ui/billing-ui.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/billing-ui"},{"name":"billing-pricing-table","type":"registry:block","title":"Billing Pricing Table","description":"Responsive plan comparison with controlled interval selection, fixed and contact-sales pricing, current and featured states, and optional actions.","categories":["blocks","billing"],"docs":"## Usage\n\nPass a plan resource, account context, formatting options, a controlled billing interval, and the actions you want to show.\n\n```tsx\nimport { BillingPricingTable } from '@/blocks/billing/billing-pricing-table/billing-pricing-table';\n\n openPlanSelection({ planId, priceId, account })}\n onContactSales={({ planId, account }) => openSalesRequest({ planId, account })}\n/>\n```\n\nFixed prices use minor-unit decimal strings and the currency on each record. Use `BillingPrice.kind = 'contact_sales'` for custom pricing. Missing callbacks remove their actions, rejected promises appear next to the action, and resolved promises leave the selected plan state under your control.","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/billing-contracts","@constructive/billing-ui","@constructive/button","@constructive/card","@constructive/cn","@constructive/select","@constructive/separator","@constructive/skeleton","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-pricing-table/billing-pricing-table.tsx","type":"registry:component","target":"src/blocks/billing/billing-pricing-table/billing-pricing-table.tsx"},{"path":"registry/constructive/blocks/billing/billing-pricing-table/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-pricing-table/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/billing-pricing-table"},{"name":"billing-subscription-card","type":"registry:block","title":"Billing Subscription Card","description":"Current-plan summary with independent subscription, provider, and payment status plus exact lifecycle dates and optional actions.","categories":["blocks","billing"],"docs":"## Usage\n\nPass the current plan together with any payment and provider states you want to show. Add only the actions that make sense in your billing flow.\n\n```tsx\nimport { BillingSubscriptionCard } from '@/blocks/billing/billing-subscription-card/billing-subscription-card';\n\n openSubscriptionSettings(subscriptionId, account)}\n/>\n```\n\nOnly `renewsAt` is labelled “Renews”; `endsAt` is always labelled “Ends.” Status strings are open, unknown values render neutrally, and missing callbacks hide their controls.","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/billing-contracts","@constructive/billing-ui","@constructive/button","@constructive/card","@constructive/cn","@constructive/skeleton","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-subscription-card/billing-subscription-card.tsx","type":"registry:component","target":"src/blocks/billing/billing-subscription-card/billing-subscription-card.tsx"},{"path":"registry/constructive/blocks/billing/billing-subscription-card/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-subscription-card/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/billing-subscription-card"},{"name":"billing-entitlements-list","type":"registry:block","title":"Billing Entitlements List","description":"Structured display of plan feature flags, caps, discrete quotas, meter allowances, and neutral unknown values.","categories":["blocks","billing"],"docs":"## Usage\n\nPass each entitlement with a semantic kind so features, caps, quotas, and metered allowances keep their distinct meaning.\n\n```tsx\nimport { BillingEntitlementsList } from '@/blocks/billing/billing-entitlements-list/billing-entitlements-list';\n\n\n```\n\nUse explicit `unlimited`, `uninitialized`, and `unknown` variants. Unknown values stay visible with a neutral presentation, and message overrides let you adapt the labels without changing the data model.","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/billing-contracts","@constructive/billing-ui","@constructive/button","@constructive/card","@constructive/cn","@constructive/skeleton","@constructive/tooltip","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx","type":"registry:component","target":"src/blocks/billing/billing-entitlements-list/billing-entitlements-list.tsx"},{"path":"registry/constructive/blocks/billing/billing-entitlements-list/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-entitlements-list/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/billing-entitlements-list"},{"name":"billing-usage-overview","type":"registry:block","title":"Billing Usage Overview","description":"Current-period usage with quota, boolean, unlimited, uninitialized, exhausted, overage, category-pool, and universal-pool states.","categories":["blocks","billing"],"docs":"## Usage\n\nPass a current-period usage snapshot and nest child meters beneath category or universal pools when credits are shared.\n\n```tsx\nimport { BillingUsageOverview } from '@/blocks/billing/billing-usage-overview/billing-usage-overview';\n\n openUsageHistory(meterSlug)}\n onBuyCredits={(meterSlug) => openCreditPurchase(meterSlug)}\n/>\n```\n\nCategory and universal pools stay nested so their application order remains clear. Progress caps visually at 100 percent while text and accessible values preserve the actual used, allowance, and overage values. Actions disappear when their callbacks are absent.","dependencies":["lucide-react","motion"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/billing-contracts","@constructive/billing-ui","@constructive/button","@constructive/card","@constructive/cn","@constructive/collapsible","@constructive/progress","@constructive/skeleton","@constructive/tooltip","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-usage-overview/billing-usage-overview.tsx","type":"registry:component","target":"src/blocks/billing/billing-usage-overview/billing-usage-overview.tsx"},{"path":"registry/constructive/blocks/billing/billing-usage-overview/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-usage-overview/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/billing-usage-overview"},{"name":"billing-credits-card","type":"registry:block","title":"Billing Credits Card","description":"Available credits grouped by compatible meter and unit with permanent, period, rollover, expiring, and unknown lot semantics.","categories":["blocks","billing"],"docs":"## Usage\n\nPass available balances and their credit lots while keeping each meter and unit independent.\n\n```tsx\nimport { BillingCreditsCard } from '@/blocks/billing/billing-credits-card/billing-credits-card';\n\n\n```\n\nKeep incompatible meters and units in separate balance groups. Credit lots show the current grant makeup, while `billing-activity-table` provides a chronological view of grants, usage, adjustments, rollover, and expiration.","dependencies":["lucide-react","motion"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/billing-contracts","@constructive/billing-ui","@constructive/button","@constructive/card","@constructive/cn","@constructive/collapsible","@constructive/progress","@constructive/skeleton","@constructive/tooltip","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-credits-card/billing-credits-card.tsx","type":"registry:component","target":"src/blocks/billing/billing-credits-card/billing-credits-card.tsx"},{"path":"registry/constructive/blocks/billing/billing-credits-card/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-credits-card/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/billing-credits-card"},{"name":"billing-usage-history","type":"registry:block","title":"Billing Usage History","description":"Accessible, table-first period history with controlled meter, period, and pagination filters plus explicit quality labels.","categories":["blocks","billing"],"docs":"## Usage\n\nPass a page of usage periods and control the meter, period, and pagination values when you provide their callbacks.\n\n```tsx\nimport { BillingUsageHistory } from '@/blocks/billing/billing-usage-history/billing-usage-history';\n\n\n```\n\nCredits and overage columns appear only when their values are marked as confirmed. Quality labels remain visible on each period, and the table keeps pagination and filter changes under your control.","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/billing-contracts","@constructive/billing-ui","@constructive/button","@constructive/card","@constructive/cn","@constructive/field","@constructive/pagination","@constructive/select","@constructive/separator","@constructive/skeleton","@constructive/table","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-usage-history/billing-usage-history.tsx","type":"registry:component","target":"src/blocks/billing/billing-usage-history/billing-usage-history.tsx"},{"path":"registry/constructive/blocks/billing/billing-usage-history/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-usage-history/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/billing-usage-history"},{"name":"billing-activity-table","type":"registry:block","title":"Billing Activity Table","description":"Paginated ledger activity with controlled filters, semantic class/type presentation, and a titled metadata detail sheet.","categories":["blocks","billing"],"docs":"## Usage\n\nPass ledger class and entry type with each activity entry so labels and badge tones describe the event itself.\n\n```tsx\nimport { BillingActivityTable } from '@/blocks/billing/billing-activity-table/billing-activity-table';\n\n\n```\n\nA positive delta can represent consumption and a negative delta can represent release or reset, so presentation derives from `ledgerClass` and `entryType` rather than the sign. Unknown values remain neutral, and JSON-safe metadata opens in a titled detail sheet.","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/billing-contracts","@constructive/billing-ui","@constructive/button","@constructive/card","@constructive/cn","@constructive/field","@constructive/pagination","@constructive/select","@constructive/separator","@constructive/sheet","@constructive/skeleton","@constructive/table","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-activity-table/billing-activity-table.tsx","type":"registry:component","target":"src/blocks/billing/billing-activity-table/billing-activity-table.tsx"},{"path":"registry/constructive/blocks/billing/billing-activity-table/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-activity-table/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/billing-activity-table"},{"name":"billing-settings-page","type":"registry:block","title":"Billing Settings Page","description":"Router-neutral Overview, Usage, and Plans composition that keeps subscription, usage, credits, entitlements, history, activity, and pricing failures isolated.","categories":["blocks","billing"],"docs":"## Usage\n\nPass one account together with independent resources and actions. Use `section` and `onSectionChange` to synchronize navigation, or `defaultSection` for local state. The page renders its own heading by default; set `showHeader={false}` when the surrounding document already provides it.\n\n```tsx\nimport { BillingSettingsPage } from '@/blocks/billing/billing-settings-page/billing-settings-page';\n\n\n```\n\nEach resource renders its own loading, empty, error, ready, and quality state, so one unavailable section never replaces the whole page. Controlled filters and actions are forwarded to their matching leaf blocks.","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/billing-activity-table","@constructive/billing-contracts","@constructive/billing-credits-card","@constructive/billing-entitlements-list","@constructive/billing-pricing-table","@constructive/billing-subscription-card","@constructive/billing-usage-history","@constructive/billing-usage-overview","@constructive/cn","@constructive/separator","@constructive/tabs","@constructive/tooltip","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/billing/billing-settings-page/billing-settings-page.tsx","type":"registry:component","target":"src/blocks/billing/billing-settings-page/billing-settings-page.tsx"},{"path":"registry/constructive/blocks/billing/billing-settings-page/messages.ts","type":"registry:component","target":"src/blocks/billing/billing-settings-page/messages.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/billing-settings-page"},{"name":"command-palette","type":"registry:block","title":"Command Palette","description":"Framework-neutral command discovery with page-scoped registration, structured shortcuts, multi-step flows, and cancellable background tasks.","categories":["blocks","application-shell"],"docs":"## Usage\n\nCreate one registry for the application, adapt navigation at the host boundary, and render the palette near the root layout. Pages can register commands while mounted with `usePageCommands`.\n\n```tsx\nimport { createCommandRegistry, kbd } from '@constructive-io/command-palette';\nimport { CommandPalette } from '@/blocks/command-palette/command-palette';\n\nconst registry = createCommandRegistry({\n groups: [{ id: 'navigation', label: 'Navigation', priority: 1 }],\n commands: [{\n id: 'settings',\n label: 'Open settings',\n type: 'navigation',\n group: 'navigation',\n href: '/settings',\n shortcut: kbd(',', 'mod')\n }]\n});\n\n router.push(href)} />;\n```\n\nThe installed block owns presentation and keyboard interaction. The headless package owns command registration, execution, multi-step state, and background-task lifecycle. Route authorization, action permissions, errors, and business workflows remain the host application's responsibility.","dependencies":["@constructive-io/command-palette@^0.4.0","lucide-react","motion"],"devDependencies":[],"registryDependencies":["@constructive/badge","@constructive/button","@constructive/cn","@constructive/command","@constructive/separator","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/command-palette/command-palette.tsx","type":"registry:component","target":"src/blocks/command-palette/command-palette.tsx"},{"path":"registry/constructive/blocks/command-palette/kbd-shortcut.tsx","type":"registry:component","target":"src/blocks/command-palette/kbd-shortcut.tsx"},{"path":"registry/constructive/blocks/command-palette/multi-step/multi-step-view.tsx","type":"registry:component","target":"src/blocks/command-palette/multi-step/multi-step-view.tsx"},{"path":"registry/constructive/blocks/command-palette/multi-step/step-indicator.tsx","type":"registry:component","target":"src/blocks/command-palette/multi-step/step-indicator.tsx"},{"path":"registry/constructive/blocks/command-palette/background/background-task-stack.tsx","type":"registry:component","target":"src/blocks/command-palette/background/background-task-stack.tsx"},{"path":"registry/constructive/blocks/command-palette/background/inline-task-bar.tsx","type":"registry:component","target":"src/blocks/command-palette/background/inline-task-bar.tsx"},{"path":"registry/constructive/blocks/command-palette/background/task-card.tsx","type":"registry:component","target":"src/blocks/command-palette/background/task-card.tsx"},{"path":"registry/constructive/blocks/command-palette/background/task-icons.tsx","type":"registry:component","target":"src/blocks/command-palette/background/task-icons.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/command-palette"},{"name":"pack-foundation","type":"registry:lib","title":"Feature Pack Foundation","description":"Provider-neutral resource, action-policy, error, loading, empty, and status contracts shared by Constructive feature packs.","categories":[],"docs":null,"dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/badge","@constructive/button","@constructive/card","@constructive/cn","@constructive/empty","@constructive/skeleton"],"files":[{"path":"registry/constructive/blocks/feature-packs/shared/feature-pack-contracts.ts","type":"registry:lib","target":"src/blocks/feature-packs/shared/feature-pack-contracts.ts"},{"path":"registry/constructive/blocks/feature-packs/shared/feature-pack-ui.tsx","type":"registry:component","target":"src/blocks/feature-packs/shared/feature-pack-ui.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/pack-foundation"},{"name":"console-runtime","type":"registry:lib","title":"Console Runtime","description":"Endpoint, session, transport, cache partitioning, and adapter contracts for identity-scoped Constructive consoles.","categories":[],"docs":null,"dependencies":[],"devDependencies":[],"registryDependencies":[],"files":[{"path":"registry/constructive/blocks/console-runtime/capabilities.ts","type":"registry:lib","target":"src/blocks/console-runtime/capabilities.ts"},{"path":"registry/constructive/blocks/console-runtime/endpoints.ts","type":"registry:lib","target":"src/blocks/console-runtime/endpoints.ts"},{"path":"registry/constructive/blocks/console-runtime/feature-adapter.ts","type":"registry:lib","target":"src/blocks/console-runtime/feature-adapter.ts"},{"path":"registry/constructive/blocks/console-runtime/index.ts","type":"registry:lib","target":"src/blocks/console-runtime/index.ts"},{"path":"registry/constructive/blocks/console-runtime/session.ts","type":"registry:lib","target":"src/blocks/console-runtime/session.ts"},{"path":"registry/constructive/blocks/console-runtime/standalone-session.ts","type":"registry:lib","target":"src/blocks/console-runtime/standalone-session.ts"},{"path":"registry/constructive/blocks/console-runtime/transport.ts","type":"registry:lib","target":"src/blocks/console-runtime/transport.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/console-runtime"},{"name":"console-feature-catalog","type":"registry:lib","title":"Console Feature Catalog","description":"Validated feature-pack capability manifests and stable backend preset profiles.","categories":[],"docs":null,"dependencies":["zod"],"devDependencies":[],"registryDependencies":["@constructive/console-runtime"],"files":[{"path":"registry/constructive/feature-packs/capabilities.ts","type":"registry:lib","target":"src/feature-packs/capabilities.ts"},{"path":"registry/constructive/feature-packs/catalog.ts","type":"registry:lib","target":"src/feature-packs/catalog.ts"},{"path":"registry/constructive/feature-packs/catalog-validation.ts","type":"registry:lib","target":"src/feature-packs/catalog-validation.ts"},{"path":"registry/constructive/feature-packs/index.ts","type":"registry:lib","target":"src/feature-packs/index.ts"},{"path":"registry/constructive/feature-packs/manifest.ts","type":"registry:lib","target":"src/feature-packs/manifest.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/console-feature-catalog"},{"name":"console-kit-core","type":"registry:block","title":"Constructive Console Kit Core","description":"The leaf-independent Console Kit shell, runtime, discovery, and single modular Zustand store.","categories":[],"docs":"`console-kit-core` installed the shell, runtime, semantic routing, callback boundary, and one per-instance modular Zustand store. Core intentionally includes no feature view, so add selected `console-module-*` items.\n\nDegraded states: explicit endpoint, current `_meta`, introspection, capability, and adapter evidence fail closed independently; installation never grants authority.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","dependencies":["@constructive-io/data@^0.5.0","@tanstack/react-query","graphql","lucide-react","zustand"],"devDependencies":[],"registryDependencies":["@constructive/console-runtime","@constructive/console-feature-catalog","@constructive/alert","@constructive/app-bar","@constructive/app-shell","@constructive/badge","@constructive/button","@constructive/cn","@constructive/pack-foundation","@constructive/popover","@constructive/skeleton","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/console-kit/feature-module.ts","type":"registry:lib","target":"src/blocks/console-kit/feature-module.ts"},{"path":"registry/constructive/blocks/console-kit/console-kit-routes.ts","type":"registry:lib","target":"src/blocks/console-kit/console-kit-routes.ts"},{"path":"registry/constructive/blocks/console-kit/console-kit-contracts.ts","type":"registry:lib","target":"src/blocks/console-kit/console-kit-contracts.ts"},{"path":"registry/constructive/blocks/console-kit/console-connection-menu.tsx","type":"registry:component","target":"src/blocks/console-kit/console-connection-menu.tsx"},{"path":"registry/constructive/blocks/console-kit/console-kit-runtime.tsx","type":"registry:component","target":"src/blocks/console-kit/console-kit-runtime.tsx"},{"path":"registry/constructive/blocks/console-kit/use-latest-callback.ts","type":"registry:lib","target":"src/blocks/console-kit/use-latest-callback.ts"},{"path":"registry/constructive/blocks/console-kit/console-kit-core.tsx","type":"registry:component","target":"src/blocks/console-kit/console-kit-core.tsx"},{"path":"registry/constructive/blocks/console-kit/console-kit.tsx","type":"registry:component","target":"src/blocks/console-kit/console-kit.tsx"},{"path":"registry/constructive/blocks/console-kit/constructive/constructive-adapter-utils.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/constructive-adapter-utils.ts"},{"path":"registry/constructive/blocks/console-kit/constructive/constructive-capabilities.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/constructive-capabilities.ts"},{"path":"registry/constructive/blocks/console-kit/constructive/constructive-callback.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/constructive-callback.ts"},{"path":"registry/constructive/blocks/console-kit/constructive/constructive-console-kit.tsx","type":"registry:component","target":"src/blocks/console-kit/constructive/constructive-console-kit.tsx"},{"path":"registry/constructive/blocks/console-kit/constructive/constructive-graphql.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/constructive-graphql.ts"},{"path":"registry/constructive/blocks/console-kit/constructive/constructive-meta-utils.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/constructive-meta-utils.ts"},{"path":"registry/constructive/blocks/console-kit/store/adapter-slice.ts","type":"registry:lib","target":"src/blocks/console-kit/store/adapter-slice.ts"},{"path":"registry/constructive/blocks/console-kit/store/context-slice.ts","type":"registry:lib","target":"src/blocks/console-kit/store/context-slice.ts"},{"path":"registry/constructive/blocks/console-kit/store/endpoint-capability-slice.ts","type":"registry:lib","target":"src/blocks/console-kit/store/endpoint-capability-slice.ts"},{"path":"registry/constructive/blocks/console-kit/store/navigation-slice.ts","type":"registry:lib","target":"src/blocks/console-kit/store/navigation-slice.ts"},{"path":"registry/constructive/blocks/console-kit/store/runtime-slice.ts","type":"registry:lib","target":"src/blocks/console-kit/store/runtime-slice.ts"},{"path":"registry/constructive/blocks/console-kit/store/session-slice.ts","type":"registry:lib","target":"src/blocks/console-kit/store/session-slice.ts"},{"path":"registry/constructive/blocks/console-kit/store/console-kit-store.tsx","type":"registry:component","target":"src/blocks/console-kit/store/console-kit-store.tsx"},{"path":"registry/constructive/blocks/console-kit/store/index.ts","type":"registry:lib","target":"src/blocks/console-kit/store/index.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/console-kit-core"},{"name":"feature-pack-data","type":"registry:block","title":"Data Feature Pack","description":"A current-_meta-only application data explorer with application-table filtering and spreadsheet CRUD.","categories":[],"docs":"`feature-pack-data` installed a provider-neutral view and `.constructive/feature-packs/data.json`. Import from `@/blocks/feature-packs/data/data-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-data` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: The host owns Sheets state and endpoint binding; incompatible metadata stays explicit, and PostgreSQL privileges and RLS decide every query and mutation.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/data/","dependencies":["@constructive-io/data@^0.5.0","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/pack-foundation","@constructive/sheets","@constructive/alert","@constructive/button","@constructive/card","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/data/data-feature-pack.tsx","type":"registry:component","target":"src/blocks/feature-packs/data/data-feature-pack.tsx"},{"path":"registry/constructive/blocks/feature-packs/data/feature-pack.json","type":"registry:file","target":"~/.constructive/feature-packs/data.json"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-data"},{"name":"console-module-data","type":"registry:block","title":"Data Console Module","description":"Console Kit navigation, capability discovery, and tenant runtime binding for the Data feature pack.","categories":[],"docs":"`console-module-data` installed Console Kit core, the provider-neutral data view, and its Constructive integration. Import from `@/blocks/feature-packs/data/data-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: A missing or incompatible data endpoint, current _meta contract, introspection result, or application table scope keeps Data unavailable; RLS remains authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/data/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/feature-pack-data","@constructive/console-feature-catalog","@constructive/console-runtime","@constructive/sheets","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/data/data-console-module.tsx","type":"registry:component","target":"src/blocks/feature-packs/data/data-console-module.tsx"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/console-module-data"},{"name":"feature-pack-auth","type":"registry:block","title":"Authentication Feature Pack","description":"Provider-neutral public authentication flows and personal account/session management.","categories":[],"docs":"`feature-pack-auth` installed a provider-neutral view and `.constructive/feature-packs/auth.json`. Import from `@/blocks/feature-packs/auth/auth-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-auth` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: Unsupported policy grants or callbacks stay absent, provider failures remain explicit, and callback credentials never enter the view.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/auth/","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/pack-foundation","@constructive/alert","@constructive/alert-dialog","@constructive/avatar","@constructive/badge","@constructive/button","@constructive/card","@constructive/checkbox","@constructive/cn","@constructive/field","@constructive/input","@constructive/input-group","@constructive/separator","@constructive/tabs","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/auth/auth-contracts.ts","type":"registry:lib","target":"src/blocks/feature-packs/auth/auth-contracts.ts"},{"path":"registry/constructive/blocks/feature-packs/auth/auth-entry-panel.tsx","type":"registry:component","target":"src/blocks/feature-packs/auth/auth-entry-panel.tsx"},{"path":"registry/constructive/blocks/feature-packs/auth/auth-challenge-panel.tsx","type":"registry:component","target":"src/blocks/feature-packs/auth/auth-challenge-panel.tsx"},{"path":"registry/constructive/blocks/feature-packs/auth/auth-account-view.tsx","type":"registry:component","target":"src/blocks/feature-packs/auth/auth-account-view.tsx"},{"path":"registry/constructive/blocks/feature-packs/auth/auth-password-policy.ts","type":"registry:lib","target":"src/blocks/feature-packs/auth/auth-password-policy.ts"},{"path":"registry/constructive/blocks/feature-packs/auth/auth-feature-pack.tsx","type":"registry:component","target":"src/blocks/feature-packs/auth/auth-feature-pack.tsx"},{"path":"registry/constructive/blocks/feature-packs/auth/feature-pack.json","type":"registry:file","target":"~/.constructive/feature-packs/auth.json"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-auth"},{"name":"console-module-auth","type":"registry:block","title":"Authentication Console Module","description":"Console Kit session flow, capability discovery, and Constructive adapter for the Authentication feature pack.","categories":[],"docs":"`console-module-auth` installed Console Kit core, the provider-neutral auth view, and its Constructive integration. Import from `@/blocks/feature-packs/auth/auth-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: Auth requires complete public session, credential, and password flows; pass csrfTokenProvider when required, and keep callback credentials outside Zustand.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/auth/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/feature-pack-auth","@constructive/console-feature-catalog","@constructive/console-runtime","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/auth/auth-console-module.tsx","type":"registry:component","target":"src/blocks/feature-packs/auth/auth-console-module.tsx"},{"path":"registry/constructive/blocks/console-kit/constructive/auth-adapter.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/auth-adapter.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/console-module-auth"},{"name":"feature-pack-users","type":"registry:block","title":"App access Feature Pack","description":"App access governance with member lifecycle controls, invitations, access profiles, direct and effective permissions, and new-member defaults.","categories":[],"docs":"`feature-pack-users` installed a provider-neutral view and `.constructive/feature-packs/users.json`. Import from `@/blocks/feature-packs/users/users-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-users` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: Missing resources or callbacks stay unavailable, while row policy, PostgreSQL privileges, RLS, and final-owner constraints decide mutations.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/users/","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/pack-foundation","@constructive/alert","@constructive/alert-dialog","@constructive/avatar","@constructive/badge","@constructive/button","@constructive/checkbox","@constructive/cn","@constructive/dialog","@constructive/dropdown-menu","@constructive/empty","@constructive/field","@constructive/input","@constructive/input-group","@constructive/select","@constructive/table","@constructive/tabs","@constructive/textarea","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/users/users-feature-pack.tsx","type":"registry:component","target":"src/blocks/feature-packs/users/users-feature-pack.tsx"},{"path":"registry/constructive/blocks/feature-packs/users/feature-pack.json","type":"registry:file","target":"~/.constructive/feature-packs/users.json"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-users"},{"name":"console-module-users","type":"registry:block","title":"App access Console Module","description":"Console Kit navigation, capability discovery, and Constructive adapter for the App access feature pack.","categories":[],"docs":"`console-module-users` installed Console Kit core, the provider-neutral users view, and its Constructive integration. Import from `@/blocks/feature-packs/users/users-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: App access requires a compatible admin contract, and every control still depends on pack policy, adapter support, row policy, PostgreSQL privileges, and RLS.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/users/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/feature-pack-users","@constructive/console-feature-catalog","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/users/users-console-module.tsx","type":"registry:component","target":"src/blocks/feature-packs/users/users-console-module.tsx"},{"path":"registry/constructive/blocks/console-kit/constructive/users-adapter.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/users-adapter.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/console-module-users"},{"name":"feature-pack-organizations","type":"registry:block","title":"Organizations Feature Pack","description":"Complete tenant administration for selection, member governance, invitations, profiles, permissions, defaults, hierarchy, settings, principals, and API keys.","categories":[],"docs":"`feature-pack-organizations` installed a provider-neutral view and `.constructive/feature-packs/organizations.json`. Import from `@/blocks/feature-packs/organizations/organizations-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-organizations` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: When the active organization is missing or does not match the host-provided list, the view selects the first available organization. It never infers a principal, policy grant, or mutation authority; missing resources and callbacks stay unavailable, while PostgreSQL privileges and RLS remain authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/organizations/","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/pack-foundation","@constructive/alert-dialog","@constructive/avatar","@constructive/badge","@constructive/button","@constructive/card","@constructive/checkbox","@constructive/cn","@constructive/dialog","@constructive/dropdown-menu","@constructive/empty","@constructive/field","@constructive/input","@constructive/select","@constructive/switch","@constructive/table","@constructive/tabs","@constructive/textarea","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/organizations/organizations-contracts.ts","type":"registry:lib","target":"src/blocks/feature-packs/organizations/organizations-contracts.ts"},{"path":"registry/constructive/blocks/feature-packs/organizations/organizations-access-panels.tsx","type":"registry:component","target":"src/blocks/feature-packs/organizations/organizations-access-panels.tsx"},{"path":"registry/constructive/blocks/feature-packs/organizations/organizations-operation-panels.tsx","type":"registry:component","target":"src/blocks/feature-packs/organizations/organizations-operation-panels.tsx"},{"path":"registry/constructive/blocks/feature-packs/organizations/organizations-feature-pack.tsx","type":"registry:component","target":"src/blocks/feature-packs/organizations/organizations-feature-pack.tsx"},{"path":"registry/constructive/blocks/feature-packs/organizations/feature-pack.json","type":"registry:file","target":"~/.constructive/feature-packs/organizations.json"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-organizations"},{"name":"console-module-organizations","type":"registry:block","title":"Organizations Console Module","description":"Console Kit discovery, metadata resolution, and Constructive adapter for the Organizations feature pack.","categories":[],"docs":"`console-module-organizations` installed Console Kit core, the provider-neutral organizations view, and its Constructive integration. Import from `@/blocks/feature-packs/organizations/organizations-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: Incomplete metadata or ambiguous organization and principal scope fails closed; every mutation remains policy and RLS constrained.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/organizations/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/feature-pack-organizations","@constructive/console-feature-catalog","@constructive/console-runtime","@constructive/pack-foundation","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/organizations/organizations-console-module.tsx","type":"registry:component","target":"src/blocks/feature-packs/organizations/organizations-console-module.tsx"},{"path":"registry/constructive/blocks/feature-packs/organizations/organizations-meta-contract.ts","type":"registry:lib","target":"src/blocks/feature-packs/organizations/organizations-meta-contract.ts"},{"path":"registry/constructive/blocks/console-kit/constructive/organizations-adapter.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/organizations-adapter.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/console-module-organizations"},{"name":"feature-pack-storage","type":"registry:block","title":"Storage Feature Pack","description":"Bucket, folder, object, upload, download, and deletion surfaces backed by injected storage actions.","categories":[],"docs":"`feature-pack-storage` installed a provider-neutral view and `.constructive/feature-packs/storage.json`. Import from `@/blocks/feature-packs/storage/storage-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-storage` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: An object endpoint alone does not prove bucket or file operations; incomplete and read-only contracts keep write controls hidden.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/storage/","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/pack-foundation","@constructive/alert","@constructive/alert-dialog","@constructive/badge","@constructive/button","@constructive/card","@constructive/cn","@constructive/dialog","@constructive/dropdown-menu","@constructive/field","@constructive/input","@constructive/radio-group","@constructive/table","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/storage/storage-feature-pack.tsx","type":"registry:component","target":"src/blocks/feature-packs/storage/storage-feature-pack.tsx"},{"path":"registry/constructive/blocks/feature-packs/storage/feature-pack.json","type":"registry:file","target":"~/.constructive/feature-packs/storage.json"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-storage"},{"name":"console-module-storage","type":"registry:block","title":"Storage Console Module","description":"Console Kit discovery, metadata resolution, adapter, and modular state slice for the Storage feature pack.","categories":[],"docs":"`console-module-storage` installed Console Kit core, the provider-neutral storage view, and its Constructive integration. Import from `@/blocks/feature-packs/storage/storage-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: The objects endpoint alone is insufficient; incomplete contracts stay unavailable and read-only contracts hide write controls.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/storage/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/feature-pack-storage","@constructive/console-feature-catalog","@constructive/console-runtime","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/storage/storage-console-module.tsx","type":"registry:component","target":"src/blocks/feature-packs/storage/storage-console-module.tsx"},{"path":"registry/constructive/blocks/console-kit/constructive/storage-adapter.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/storage-adapter.ts"},{"path":"registry/constructive/blocks/feature-packs/storage/storage-console-slice.ts","type":"registry:lib","target":"src/blocks/feature-packs/storage/storage-console-slice.ts"},{"path":"registry/constructive/blocks/feature-packs/storage/storage-meta-contract.ts","type":"registry:lib","target":"src/blocks/feature-packs/storage/storage-meta-contract.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/console-module-storage"},{"name":"feature-pack-billing","type":"registry:block","title":"Billing Feature Pack","description":"The feature-pack root for Constructive billing plans, subscriptions, usage, entitlements, credits, and activity.","categories":[],"docs":"`feature-pack-billing` installed a provider-neutral view and `.constructive/feature-packs/billing.json`. Import from `@/blocks/feature-packs/billing/billing-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-billing` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: Missing resources remain independent degraded states, and unavailable provider callbacks stay absent.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/billing/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/billing-settings-page","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/billing/billing-feature-pack.tsx","type":"registry:component","target":"src/blocks/feature-packs/billing/billing-feature-pack.tsx"},{"path":"registry/constructive/blocks/feature-packs/billing/feature-pack.json","type":"registry:file","target":"~/.constructive/feature-packs/billing.json"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-billing"},{"name":"console-module-billing","type":"registry:block","title":"Billing Console Module","description":"Console Kit navigation, capability discovery, and Constructive adapter for the Billing feature pack.","categories":[],"docs":"`console-module-billing` installed Console Kit core, the provider-neutral billing view, and its Constructive integration. Import from `@/blocks/feature-packs/billing/billing-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: Missing plans or subscriptions keeps Billing unavailable, missing optional meters produces a partial view, and provider writes require an explicit adapter action.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/billing/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/feature-pack-billing","@constructive/billing-contracts","@constructive/console-feature-catalog","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/billing/billing-console-module.tsx","type":"registry:component","target":"src/blocks/feature-packs/billing/billing-console-module.tsx"},{"path":"registry/constructive/blocks/console-kit/constructive/billing-adapter.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/billing-adapter.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/console-module-billing"},{"name":"feature-pack-notifications","type":"registry:block","title":"Notifications Feature Pack","description":"An application notification inbox with read, open, and deletion actions.","categories":[],"docs":"`feature-pack-notifications` installed a provider-neutral view and `.constructive/feature-packs/notifications.json`. Import from `@/blocks/feature-packs/notifications/notifications-feature-pack`. The host must supply the view resource, policy, and actions; add `console-module-notifications` when Console Kit should own discovery and Constructive integration.\n\nDegraded states: The host must provide an authoritative inbox, policy, and callbacks; absent operations stay unavailable and mutations require a refreshed resource.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/notifications/","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/pack-foundation","@constructive/alert","@constructive/alert-dialog","@constructive/badge","@constructive/button","@constructive/card","@constructive/separator","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/notifications/notifications-feature-pack.tsx","type":"registry:component","target":"src/blocks/feature-packs/notifications/notifications-feature-pack.tsx"},{"path":"registry/constructive/blocks/feature-packs/notifications/feature-pack.json","type":"registry:file","target":"~/.constructive/feature-packs/notifications.json"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/feature-pack-notifications"},{"name":"console-module-notifications","type":"registry:block","title":"Notifications Console Module","description":"Console Kit navigation, capability discovery, and Constructive adapter for the Notifications feature pack.","categories":[],"docs":"`console-module-notifications` installed Console Kit core, the provider-neutral notifications view, and its Constructive integration. Import from `@/blocks/feature-packs/notifications/notifications-console-module` and compose the exported module with `ConstructiveConsoleKitCore`; the install inspector reports the exact import targets and transitive closure.\n\nDegraded states: A backend module record without a reachable public inbox is not capability evidence, and realtime remains unavailable until the complete flow is proven.\n\nGuide: https://constructive-io.github.io/blocks/blocks/features/notifications/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/feature-pack-notifications","@constructive/console-feature-catalog","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/feature-packs/notifications/notifications-console-module.tsx","type":"registry:component","target":"src/blocks/feature-packs/notifications/notifications-console-module.tsx"},{"path":"registry/constructive/blocks/console-kit/constructive/notifications-adapter.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/notifications-adapter.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/console-module-notifications"},{"name":"preset-auth-hardened","type":"registry:block","title":"Hardened Authentication Preset","description":"Stable Constructive auth-hardened backend preset mapped to its supported Console Kit modules.","categories":[],"docs":"`preset-auth-hardened` installed the stable `auth:hardened` composition: Data, Authentication, and App access. Render `AuthHardenedConsoleKit` with a secret-free tenant descriptor.\n\nDegraded states: each public endpoint and module fails closed independently, and PostgreSQL privileges and RLS remain authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/console-module-data","@constructive/console-module-auth","@constructive/console-module-users","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/presets/auth-hardened-console-kit.tsx","type":"registry:component","target":"src/blocks/presets/auth-hardened-console-kit.tsx"},{"path":"registry/constructive/blocks/presets/auth-hardened.json","type":"registry:file","target":"~/.constructive/feature-packs/auth-hardened.json"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/preset-auth-hardened"},{"name":"preset-b2b-storage","type":"registry:block","title":"B2B with Storage Preset","description":"Stable Constructive b2b-storage backend preset mapped to its supported Console Kit modules.","categories":[],"docs":"`preset-b2b-storage` installed the stable `b2b:storage` composition: Data, Authentication, App access, Organizations, and Storage. Render `B2BStorageConsoleKit` with a secret-free tenant descriptor.\n\nDegraded states: stock Storage can remain unavailable when no supported public bucket and file contract is routed; other proven modules continue independently.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/console-module-data","@constructive/console-module-auth","@constructive/console-module-users","@constructive/console-module-organizations","@constructive/console-module-storage","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/presets/b2b-storage-console-kit.tsx","type":"registry:component","target":"src/blocks/presets/b2b-storage-console-kit.tsx"},{"path":"registry/constructive/blocks/presets/b2b-storage.json","type":"registry:file","target":"~/.constructive/feature-packs/b2b-storage.json"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/preset-b2b-storage"},{"name":"preset-full","type":"registry:block","title":"Full Preset","description":"Stable Constructive full backend preset mapped to its supported Console Kit modules.","categories":[],"docs":"`preset-full` installed all seven Console modules and the stable Full preset component. Render `FullConsoleKit` with a secret-free tenant descriptor.\n\nDegraded states: installed backend modules do not imply public routes or user authority; Storage, Billing, or Notifications can remain partial or unavailable while other modules continue.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/console-kit-core","@constructive/console-module-data","@constructive/console-module-auth","@constructive/console-module-users","@constructive/console-module-organizations","@constructive/console-module-storage","@constructive/console-module-billing","@constructive/console-module-notifications","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/presets/full-console-kit.tsx","type":"registry:component","target":"src/blocks/presets/full-console-kit.tsx"},{"path":"registry/constructive/blocks/presets/full.json","type":"registry:file","target":"~/.constructive/feature-packs/full.json"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/preset-full"},{"name":"console-kit-nextjs","type":"registry:block","title":"Constructive Console Kit for Next.js","description":"A full-page Next.js tenant console with semantic routing, auth, dynamic endpoint discovery, first-party adapters, and every feature pack.","categories":[],"docs":"`console-kit-nextjs` installed the full Next.js tenant console. Render `ConstructiveConsoleKit` with a secret-free database ID and explicit semantic endpoint map; use presets or selected Console modules for smaller compositions.\n\nDegraded states: every endpoint and module fails closed independently, diagnostics are development-only, credentials never enter Zustand, and PostgreSQL privileges and RLS remain authoritative.\n\nGuide: https://constructive-io.github.io/blocks/blocks/console-kit/","dependencies":[],"devDependencies":[],"registryDependencies":["@constructive/preset-full","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/console-kit/constructive/index.ts","type":"registry:lib","target":"src/blocks/console-kit/constructive/index.ts"}],"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/console-kit-nextjs"},{"name":"app-kit-core","type":"registry:block","title":"Constructive App Kit Core","description":"Typed, server-safe application resources, queries, actions, scope partitioning, schema validation, and opt-in client runtime.","categories":[],"docs":"Install this root to define Constructive-native application contracts without choosing a view family. Import the client runtime explicitly when a connected view needs TanStack Query. Credentials never belong in definitions or AppScope.\n\nGuide: https://constructive-io.github.io/blocks/blocks/app-kit/","dependencies":["@tanstack/react-query"],"devDependencies":[],"registryDependencies":["@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/app-kit/core/contracts.ts","type":"registry:lib","target":"src/blocks/app-kit/core/contracts.ts"},{"path":"registry/constructive/blocks/app-kit/core/navigation.ts","type":"registry:lib","target":"src/blocks/app-kit/core/navigation.ts"},{"path":"registry/constructive/blocks/app-kit/core/schema-validation.ts","type":"registry:lib","target":"src/blocks/app-kit/core/schema-validation.ts"},{"path":"registry/constructive/blocks/app-kit/core/scope.ts","type":"registry:lib","target":"src/blocks/app-kit/core/scope.ts"},{"path":"registry/constructive/blocks/app-kit/core/runtime.tsx","type":"registry:component","target":"src/blocks/app-kit/core/runtime.tsx"},{"path":"registry/constructive/blocks/app-kit/core/index.ts","type":"registry:lib","target":"src/blocks/app-kit/core/index.ts"}],"meta":{"constructive":{"version":1,"family":"app-kit","kind":"runtime","boundary":"mixed","provider":"app-kit","dataShapes":["record","collection","aggregate","temporal"],"intents":["define-resources","load-data","execute-actions","validate-schema"],"capabilities":["resource-contracts","query-contracts","action-contracts","scoped-cache","schema-validation","navigation-adapters"],"slots":["record-opener","url-state-adapter"],"events":["query-settled","action-settled","scope-changed"],"compatibleWith":["app-kit-data","app-kit-board","app-kit-dashboard","app-kit-calendar","app-kit-workflow","app-kit-event-studio"]}},"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/app-kit-core"},{"name":"app-kit-data","type":"registry:block","title":"Constructive App Kit Data Views","description":"Controlled and connected tables, lists, cards, record details, forms, relations, collection controls, and action bars.","categories":[],"docs":"Use this root for record and collection applications. Loaders stay server-driven, relation pickers search remotely, ambiguous identities fail read-only, and every view distinguishes loading, empty, denied, and error states.\n\nGuide: https://constructive-io.github.io/blocks/blocks/app-kit/","dependencies":["@tanstack/react-query","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/app-kit-core","@constructive/badge","@constructive/button","@constructive/card","@constructive/checkbox","@constructive/combobox","@constructive/empty","@constructive/field","@constructive/input","@constructive/pagination","@constructive/select","@constructive/separator","@constructive/skeleton","@constructive/switch","@constructive/table","@constructive/textarea","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/app-kit/data/types.ts","type":"registry:lib","target":"src/blocks/app-kit/data/types.ts"},{"path":"registry/constructive/blocks/app-kit/data/states.tsx","type":"registry:component","target":"src/blocks/app-kit/data/states.tsx"},{"path":"registry/constructive/blocks/app-kit/data/controls.tsx","type":"registry:component","target":"src/blocks/app-kit/data/controls.tsx"},{"path":"registry/constructive/blocks/app-kit/data/collections.tsx","type":"registry:component","target":"src/blocks/app-kit/data/collections.tsx"},{"path":"registry/constructive/blocks/app-kit/data/detail-form.tsx","type":"registry:component","target":"src/blocks/app-kit/data/detail-form.tsx"},{"path":"registry/constructive/blocks/app-kit/data/relations.tsx","type":"registry:component","target":"src/blocks/app-kit/data/relations.tsx"},{"path":"registry/constructive/blocks/app-kit/data/action-bars.tsx","type":"registry:component","target":"src/blocks/app-kit/data/action-bars.tsx"},{"path":"registry/constructive/blocks/app-kit/data/index.ts","type":"registry:lib","target":"src/blocks/app-kit/data/index.ts"}],"meta":{"constructive":{"version":1,"family":"app-kit","kind":"view","boundary":"client","provider":"app-kit","dataShapes":["record","collection"],"intents":["browse","search","filter","sort","edit","relate","bulk-act"],"capabilities":["table","list","cards","record-detail","generated-form","relation-picker","relation-panel","pagination","bulk-actions"],"slots":["cell-renderer","record-renderer","form-field","toolbar","footer"],"events":["state-change","open-record","submit","link-record","unlink-record","bulk-action"],"compatibleWith":["app-kit-core","app-kit-board","app-kit-dashboard","app-kit-calendar","app-kit-workflow","app-kit-event-studio"]}},"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/app-kit-data"},{"name":"app-kit-board","type":"registry:block","title":"Constructive App Kit Board","description":"A typed controlled board and connected resource wrapper with semantic moves, keyboard alternatives, and mutation rollback.","categories":[],"docs":"Board movement is disabled until the host supplies an explicit semantic action. Pointer and keyboard moves use the same action contract, restore focus, and roll back optimistic state on denial or failure.\n\nGuide: https://constructive-io.github.io/blocks/blocks/app-kit/","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/app-kit-core","@constructive/button","@constructive/card","@constructive/dropdown-menu","@constructive/skeleton","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/app-kit/board/board.tsx","type":"registry:component","target":"src/blocks/app-kit/board/board.tsx"},{"path":"registry/constructive/blocks/app-kit/board/connected-board.tsx","type":"registry:component","target":"src/blocks/app-kit/board/connected-board.tsx"},{"path":"registry/constructive/blocks/app-kit/board/index.ts","type":"registry:lib","target":"src/blocks/app-kit/board/index.ts"}],"meta":{"constructive":{"version":1,"family":"app-kit","kind":"view","boundary":"client","provider":"app-kit","dataShapes":["collection","board"],"intents":["plan","prioritize","move-records","inspect"],"capabilities":["board","typed-columns","semantic-move","keyboard-move","optimistic-rollback"],"slots":["card"],"events":["open-record","move-record","move-denied"],"compatibleWith":["app-kit-core","app-kit-data","app-kit-dashboard","app-kit-calendar","app-kit-workflow","app-kit-event-studio"]}},"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/app-kit-board"},{"name":"app-kit-dashboard","type":"registry:block","title":"Constructive App Kit Dashboard","description":"Explicit analytical widgets and a versioned, replaceable layout store on the accessible SVG and SSR foundation from TanStack Charts.","categories":[],"docs":"Dashboard widgets always use explicit analytical loaders; they never derive totals from a paginated collection page. Runtime customization is limited to an approved typed catalog, while layout persistence is replaceable.\n\nGuide: https://constructive-io.github.io/blocks/blocks/app-kit/","dependencies":["@tanstack/charts@0.6.4","@tanstack/charts-scales@0.6.4","@tanstack/react-charts@0.6.4","d3-scale@4.0.2","lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/app-kit-core","@constructive/badge","@constructive/button","@constructive/card","@constructive/chart","@constructive/cn","@constructive/dropdown-menu","@constructive/empty","@constructive/skeleton","@constructive/table","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/app-kit/dashboard/widgets.tsx","type":"registry:component","target":"src/blocks/app-kit/dashboard/widgets.tsx"},{"path":"registry/constructive/blocks/app-kit/dashboard/layout-store.ts","type":"registry:lib","target":"src/blocks/app-kit/dashboard/layout-store.ts"},{"path":"registry/constructive/blocks/app-kit/dashboard/dashboard.tsx","type":"registry:component","target":"src/blocks/app-kit/dashboard/dashboard.tsx"},{"path":"registry/constructive/blocks/app-kit/dashboard/connected-dashboard.tsx","type":"registry:component","target":"src/blocks/app-kit/dashboard/connected-dashboard.tsx"},{"path":"registry/constructive/blocks/app-kit/dashboard/persisted-dashboard.tsx","type":"registry:component","target":"src/blocks/app-kit/dashboard/persisted-dashboard.tsx"},{"path":"registry/constructive/blocks/app-kit/dashboard/index.ts","type":"registry:lib","target":"src/blocks/app-kit/dashboard/index.ts"}],"meta":{"constructive":{"version":1,"family":"app-kit","kind":"view","boundary":"client","provider":"app-kit","dataShapes":["aggregate","series","breakdown"],"intents":["monitor","analyze","compare","configure-layout"],"capabilities":["kpi","bar-chart","line-chart","breakdown-table","widget-catalog","layout-store","layout-persistence"],"slots":["widget"],"events":["layout-change"],"compatibleWith":["app-kit-core","app-kit-data","app-kit-board","app-kit-calendar","app-kit-workflow","app-kit-event-studio"]}},"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/app-kit-dashboard"},{"name":"app-kit-calendar","type":"registry:block","title":"Constructive App Kit Calendar","description":"Localized controlled month and agenda views with explicit timezones and connected range-query loading.","categories":[],"docs":"The host owns record opening and editing, while the connected wrapper loads only the visible range. Recurrence, resource scheduling, and drag rescheduling are intentionally outside V1.\n\nGuide: https://constructive-io.github.io/blocks/blocks/app-kit/","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/app-kit-core","@constructive/button","@constructive/cn","@constructive/empty","@constructive/skeleton","@constructive/tabs","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/app-kit/calendar/calendar.tsx","type":"registry:component","target":"src/blocks/app-kit/calendar/calendar.tsx"},{"path":"registry/constructive/blocks/app-kit/calendar/connected-calendar.tsx","type":"registry:component","target":"src/blocks/app-kit/calendar/connected-calendar.tsx"},{"path":"registry/constructive/blocks/app-kit/calendar/index.ts","type":"registry:lib","target":"src/blocks/app-kit/calendar/index.ts"}],"meta":{"constructive":{"version":1,"family":"app-kit","kind":"view","boundary":"client","provider":"app-kit","dataShapes":["temporal","collection"],"intents":["schedule","browse-by-date","inspect"],"capabilities":["temporal","month","agenda","range-query","localization","timezone"],"events":["range-change","view-change","open-record"],"compatibleWith":["app-kit-core","app-kit-data","app-kit-board","app-kit-dashboard","app-kit-workflow","app-kit-event-studio"]}},"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/app-kit-calendar"},{"name":"app-kit-workflow","type":"registry:block","title":"Constructive App Kit Workflow UI","description":"Controlled and connected action surfaces, confirmation and input dialogs, bulk execution, and a multi-step stepper.","categories":[],"docs":"This root composes application and server actions into accessible interaction surfaces; it is not a durable workflow engine. Validation, permission failures, cancellation, and partial errors remain explicit.\n\nGuide: https://constructive-io.github.io/blocks/blocks/app-kit/","dependencies":["lucide-react"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/alert-dialog","@constructive/app-kit-core","@constructive/button","@constructive/dialog","@constructive/dropdown-menu","@constructive/separator","@constructive/stepper","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/app-kit/workflow/actions.tsx","type":"registry:component","target":"src/blocks/app-kit/workflow/actions.tsx"},{"path":"registry/constructive/blocks/app-kit/workflow/connected-actions.tsx","type":"registry:component","target":"src/blocks/app-kit/workflow/connected-actions.tsx"},{"path":"registry/constructive/blocks/app-kit/workflow/stepper.tsx","type":"registry:component","target":"src/blocks/app-kit/workflow/stepper.tsx"},{"path":"registry/constructive/blocks/app-kit/workflow/index.ts","type":"registry:lib","target":"src/blocks/app-kit/workflow/index.ts"}],"meta":{"constructive":{"version":1,"family":"app-kit","kind":"composition","boundary":"client","provider":"app-kit","dataShapes":["record","collection","action-input"],"intents":["execute-action","confirm","collect-input","bulk-execute","guide-steps"],"capabilities":["action-button","action-menu","input-dialog","confirmation-dialog","bulk-execution","stepper"],"slots":["action-input","confirmation-body","step-content"],"events":["action-start","action-settled","step-change","cancel"],"compatibleWith":["app-kit-core","app-kit-data","app-kit-board","app-kit-dashboard","app-kit-calendar","app-kit-event-studio"]}},"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/app-kit-workflow"},{"name":"app-kit-event-studio","type":"registry:block","title":"Constructive App Kit Event Studio","description":"An opt-in page-scale proof starter combining analytical, collection, board, calendar, relation, form, and action views.","categories":[],"docs":"Event Studio pairs with the supported b2b:storage blueprint recipe and demonstrates explicit analytical loaders, semantic board movement, localized range queries, searchable relations, permission-aware actions, and host-controlled URL state. Supply adapters generated from the final executable GraphQL schema.\n\nGuide: https://constructive-io.github.io/blocks/blocks/app-kit/","dependencies":["lucide-react","zod"],"devDependencies":[],"registryDependencies":["@constructive/alert","@constructive/app-kit-board","@constructive/app-kit-calendar","@constructive/app-kit-core","@constructive/app-kit-dashboard","@constructive/app-kit-data","@constructive/app-kit-workflow","@constructive/badge","@constructive/button","@constructive/dialog","@constructive/tabs","@constructive/constructive-theme"],"files":[{"path":"registry/constructive/blocks/app-kit/event-studio/definitions.ts","type":"registry:lib","target":"src/blocks/app-kit/event-studio/definitions.ts"},{"path":"registry/constructive/blocks/app-kit/event-studio/state.ts","type":"registry:lib","target":"src/blocks/app-kit/event-studio/state.ts"},{"path":"registry/constructive/blocks/app-kit/event-studio/event-studio.tsx","type":"registry:component","target":"src/blocks/app-kit/event-studio/event-studio.tsx"},{"path":"registry/constructive/blocks/app-kit/event-studio/index.ts","type":"registry:lib","target":"src/blocks/app-kit/event-studio/index.ts"}],"meta":{"constructive":{"version":1,"family":"app-kit","kind":"starter","boundary":"mixed","provider":"app-kit","dataShapes":["record","collection","aggregate","temporal","board"],"intents":["manage-events","analyze","schedule","publish","relate-people","configure-views"],"capabilities":["event-studio","dashboard","collections","record-detail","generated-form","relations","board","calendar","actions","url-state"],"slots":["record-opener","dashboard-layout-store","url-state-adapter"],"events":["view-change","open-record","move-session","publish-session","schedule-session","link-person"],"compatibleWith":["app-kit-core","app-kit-data","app-kit-board","app-kit-dashboard","app-kit-calendar","app-kit-workflow"]}},"installCommand":"pnpm dlx shadcn@4.16.1 add @constructive/app-kit-event-studio"}]} diff --git a/.agents/skills/constructive-blocks/references/registry-content.v1.json b/.agents/skills/constructive-blocks/references/registry-content.v1.json index c9a0d45..d1959a5 100644 --- a/.agents/skills/constructive-blocks/references/registry-content.v1.json +++ b/.agents/skills/constructive-blocks/references/registry-content.v1.json @@ -1,8 +1,8 @@ { "schemaVersion": 1, "kind": "constructive.blocks-registry-content", - "sourceCommit": "4f2a789fde9a90c0c6ed5977896493bb4818fa77", - "recordCount": 138, + "sourceCommit": "1a72e5d95f7ce4a243cd4536ed78c638708d538c", + "recordCount": 371, "records": [ { "registryItem": "alert-dialog", @@ -22,6 +22,210 @@ "type": "registry:component", "contentSha256": "240c7dea1ada3acbf0be77e30abbbce247a2a274645db9aab34b980a66f3a26a" }, + { + "registryItem": "app-kit-board", + "path": "registry/constructive/blocks/app-kit/board/board.tsx", + "type": "registry:component", + "contentSha256": "ffecbaff4fddf5f117ccb9fb5aaa084a8395178d3a38a4cccb6d9617f07a0010" + }, + { + "registryItem": "app-kit-board", + "path": "registry/constructive/blocks/app-kit/board/connected-board.tsx", + "type": "registry:component", + "contentSha256": "f4cc1f3a0d375383d20bb17cbbef7e9794c38f83e6e7780a2d4e92891ca84f7f" + }, + { + "registryItem": "app-kit-board", + "path": "registry/constructive/blocks/app-kit/board/index.ts", + "type": "registry:lib", + "contentSha256": "d8796770950bed9664900477a266a7b18241337f4df5416dafdc482349a11db0" + }, + { + "registryItem": "app-kit-calendar", + "path": "registry/constructive/blocks/app-kit/calendar/calendar.tsx", + "type": "registry:component", + "contentSha256": "557d9280edd338ebb21a8715e601a53ed09ae9cef819acecfccf9e8bc7e67127" + }, + { + "registryItem": "app-kit-calendar", + "path": "registry/constructive/blocks/app-kit/calendar/connected-calendar.tsx", + "type": "registry:component", + "contentSha256": "8b4e36ec14c46f895b9ab4f44a0daca31503befb6e4d0457a93fae41427593ac" + }, + { + "registryItem": "app-kit-calendar", + "path": "registry/constructive/blocks/app-kit/calendar/index.ts", + "type": "registry:lib", + "contentSha256": "2238d1ea141aee647f36cae55a33d05ceee7a9e38a2be09c47d39390eb70681d" + }, + { + "registryItem": "app-kit-core", + "path": "registry/constructive/blocks/app-kit/core/contracts.ts", + "type": "registry:lib", + "contentSha256": "5960074760c17abf06d837346e1204cbd98e24134bf6c444711a2456523ab89b" + }, + { + "registryItem": "app-kit-core", + "path": "registry/constructive/blocks/app-kit/core/index.ts", + "type": "registry:lib", + "contentSha256": "5685006a83969b5d5222f5674744c124c9396ff919d058e33b9190b6d421ac03" + }, + { + "registryItem": "app-kit-core", + "path": "registry/constructive/blocks/app-kit/core/navigation.ts", + "type": "registry:lib", + "contentSha256": "9f5b9cd09fdcdd82a68f6d3fd81c8b03c5d21fcae1e11b50c1b665027fd1c08c" + }, + { + "registryItem": "app-kit-core", + "path": "registry/constructive/blocks/app-kit/core/runtime.tsx", + "type": "registry:component", + "contentSha256": "179c9a6931552012ea9cb482079ee2ab06530efbca7057a0f1279b80e76a8108" + }, + { + "registryItem": "app-kit-core", + "path": "registry/constructive/blocks/app-kit/core/schema-validation.ts", + "type": "registry:lib", + "contentSha256": "cd3363daad4d4ddd38ac00dc4c0aad950b3fb3b60812a1bfeca3bd2bce3eeef6" + }, + { + "registryItem": "app-kit-core", + "path": "registry/constructive/blocks/app-kit/core/scope.ts", + "type": "registry:lib", + "contentSha256": "ce7b39eb0f639d73b73474701b671600427e4796833d3a6bcd135635bbc2823f" + }, + { + "registryItem": "app-kit-dashboard", + "path": "registry/constructive/blocks/app-kit/dashboard/connected-dashboard.tsx", + "type": "registry:component", + "contentSha256": "a9152bb6004c37ea39de9817e89a73ac7da0d756e5e1b7c01468e65a8b523a7d" + }, + { + "registryItem": "app-kit-dashboard", + "path": "registry/constructive/blocks/app-kit/dashboard/dashboard.tsx", + "type": "registry:component", + "contentSha256": "bdf70beba80b76c525b30d879d0ea0843c292d222ba8e0bf76f60e1b76aa1b77" + }, + { + "registryItem": "app-kit-dashboard", + "path": "registry/constructive/blocks/app-kit/dashboard/index.ts", + "type": "registry:lib", + "contentSha256": "5176f665c9dcc57c43cba0b1b722652835f3cf06b1f9a3524249eb3da64ffa8a" + }, + { + "registryItem": "app-kit-dashboard", + "path": "registry/constructive/blocks/app-kit/dashboard/layout-store.ts", + "type": "registry:lib", + "contentSha256": "bfaa35ac44db3edb1b51a65d6af57d8bfa6023c2bde285da0f8d5c693565ba4b" + }, + { + "registryItem": "app-kit-dashboard", + "path": "registry/constructive/blocks/app-kit/dashboard/persisted-dashboard.tsx", + "type": "registry:component", + "contentSha256": "e52d87bcba4b0020eb8416368807952b00f59ba175f38452c4f7306dff3167e4" + }, + { + "registryItem": "app-kit-dashboard", + "path": "registry/constructive/blocks/app-kit/dashboard/widgets.tsx", + "type": "registry:component", + "contentSha256": "f27a69338ae3e9d60831fa7bf262928e00496ec6c59d1bfcb77cab3bacc6de77" + }, + { + "registryItem": "app-kit-data", + "path": "registry/constructive/blocks/app-kit/data/action-bars.tsx", + "type": "registry:component", + "contentSha256": "58af224233b6aa113a22aaa4c7c74ac74c6aa112f9533162ae529d9b50f3f347" + }, + { + "registryItem": "app-kit-data", + "path": "registry/constructive/blocks/app-kit/data/collections.tsx", + "type": "registry:component", + "contentSha256": "7f3297f770a62de0e28563854bd4545783f917a27d658ae91dcc850eb9fa9785" + }, + { + "registryItem": "app-kit-data", + "path": "registry/constructive/blocks/app-kit/data/controls.tsx", + "type": "registry:component", + "contentSha256": "df9bb67a813e20f36cbfd4df9af6f303927e0a1bd3095467187da1f7beeadb49" + }, + { + "registryItem": "app-kit-data", + "path": "registry/constructive/blocks/app-kit/data/detail-form.tsx", + "type": "registry:component", + "contentSha256": "938a82c12151d23180d5e496dc93831dfd9b33f3edbec7f54a880666fd7c7554" + }, + { + "registryItem": "app-kit-data", + "path": "registry/constructive/blocks/app-kit/data/index.ts", + "type": "registry:lib", + "contentSha256": "79009589f6cbe5de30431631c7e09de73de5fdf7f59420224416b6a549f3ba1d" + }, + { + "registryItem": "app-kit-data", + "path": "registry/constructive/blocks/app-kit/data/relations.tsx", + "type": "registry:component", + "contentSha256": "d0b2b0211bc0caea0bad5171d9651dd286c6a9578d3342f5260d2d3214b9afff" + }, + { + "registryItem": "app-kit-data", + "path": "registry/constructive/blocks/app-kit/data/states.tsx", + "type": "registry:component", + "contentSha256": "c6c358757b851e74856a3d5c1880cb138a1121d9d4567aa0d6480936b4f88a56" + }, + { + "registryItem": "app-kit-data", + "path": "registry/constructive/blocks/app-kit/data/types.ts", + "type": "registry:lib", + "contentSha256": "499c9e014047b66f79f2a785c9a62e78c9f70467d7125cc3b3e8c0bb6e191e50" + }, + { + "registryItem": "app-kit-event-studio", + "path": "registry/constructive/blocks/app-kit/event-studio/definitions.ts", + "type": "registry:lib", + "contentSha256": "fc8f04b58055b763e8342a68058290ee193f352e7bc827cded2cc8772304e360" + }, + { + "registryItem": "app-kit-event-studio", + "path": "registry/constructive/blocks/app-kit/event-studio/event-studio.tsx", + "type": "registry:component", + "contentSha256": "bb802e73153c4fee8c589f24474b08ca5cafc5d1935aed2381da562dab39716e" + }, + { + "registryItem": "app-kit-event-studio", + "path": "registry/constructive/blocks/app-kit/event-studio/index.ts", + "type": "registry:lib", + "contentSha256": "2cdf74d53d811d5ec03d222cc293bfda0279aaf8528a4f1bc86fe7e96e49a6ac" + }, + { + "registryItem": "app-kit-event-studio", + "path": "registry/constructive/blocks/app-kit/event-studio/state.ts", + "type": "registry:lib", + "contentSha256": "d4dbec81f7466ad2d9dfb986085763cb5013c4f52416005c1faf448a6f05ecfe" + }, + { + "registryItem": "app-kit-workflow", + "path": "registry/constructive/blocks/app-kit/workflow/actions.tsx", + "type": "registry:component", + "contentSha256": "fcaa2f4da063454dc424b601469eddd5a091d2ed6d58b2176d6505df12a3346a" + }, + { + "registryItem": "app-kit-workflow", + "path": "registry/constructive/blocks/app-kit/workflow/connected-actions.tsx", + "type": "registry:component", + "contentSha256": "d4434ba35f70f19f414392bcc8354c7850b7b5191d8bc364f2ac13260037c1eb" + }, + { + "registryItem": "app-kit-workflow", + "path": "registry/constructive/blocks/app-kit/workflow/index.ts", + "type": "registry:lib", + "contentSha256": "8e3aa7fad79a53463e9e30f353a216c43d632266a7bd82ed2598cc42cd248b23" + }, + { + "registryItem": "app-kit-workflow", + "path": "registry/constructive/blocks/app-kit/workflow/stepper.tsx", + "type": "registry:component", + "contentSha256": "b88c6a2cc38576a3201bf0fa888f19414cfff48597f0c2b30cb83b97d14931d6" + }, { "registryItem": "app-shell", "path": "registry/constructive/blocks/app-shell.tsx", @@ -160,12 +364,24 @@ "type": "registry:ui", "contentSha256": "241e125f39431085a6002b2302a191aeee6916c137f01b063b2f9c5af33c1b32" }, + { + "registryItem": "calendar-rac", + "path": "registry/constructive/ui/calendar-rac.tsx", + "type": "registry:ui", + "contentSha256": "d098f561d2135f39bbd5b66a48ee9ed3ccafff78217eb7773fb28d1ae7288d0a" + }, { "registryItem": "card", "path": "registry/constructive/ui/card.tsx", "type": "registry:ui", "contentSha256": "2b199060e9791fe6cf506d06ed7d539a1ea57148e14761e21a09df1351ae4434" }, + { + "registryItem": "chart", + "path": "registry/constructive/ui/chart.tsx", + "type": "registry:ui", + "contentSha256": "9a08f404dd1baf3a131e8e5f662d218c2f24a4a1a4382d97d6ad509a235d3e77" + }, { "registryItem": "checkbox", "path": "registry/constructive/ui/checkbox.tsx", @@ -184,6 +400,12 @@ "type": "registry:ui", "contentSha256": "9082d74ff03a219502b39cada2e1bdc1af0ec34187fe94d638f2d0e16afdef89" }, + { + "registryItem": "combobox", + "path": "registry/constructive/ui/combobox.tsx", + "type": "registry:ui", + "contentSha256": "daa2ed5a30f5f347396d00fd6d216a60d162ff2d7ed2fa31684961b1a42cb97f" + }, { "registryItem": "console-feature-catalog", "path": "registry/constructive/feature-packs/capabilities.ts", @@ -380,7 +602,7 @@ "registryItem": "console-module-data", "path": "registry/constructive/blocks/feature-packs/data/data-console-module.tsx", "type": "registry:component", - "contentSha256": "a61200b5f618e0e686bc580557101c463f16dcc52822a83074e6a4c4153dbd7a" + "contentSha256": "906d9a47bf814d9ad17c8881747b58c5f2dedd74a65c712f0e3e4dda04161360" }, { "registryItem": "console-module-notifications", @@ -566,7 +788,7 @@ "registryItem": "feature-pack-data", "path": "registry/constructive/blocks/feature-packs/data/data-feature-pack.tsx", "type": "registry:component", - "contentSha256": "2cb30b47d4bef39370fd7745a785dd1b2145c0bfd2bd019fd6bbdfe075074cba" + "contentSha256": "11fe0720ebafa3a47957c3ae25bb30a7c36cbd097408595cbb91492857e324c5" }, { "registryItem": "feature-pack-data", @@ -646,6 +868,12 @@ "type": "registry:ui", "contentSha256": "de6f605a8964d71e1c9027a46aa71f9a5359e23522408d669740331f235bde68" }, + { + "registryItem": "form-control", + "path": "registry/constructive/ui/form-control.tsx", + "type": "registry:ui", + "contentSha256": "d72c3a7e207433058b9e7b0eac176a80add45e596311eda1a97e328d7621a949" + }, { "registryItem": "input-group", "path": "registry/constructive/ui/input-group.tsx", @@ -742,6 +970,12 @@ "type": "registry:ui", "contentSha256": "88d757e3364ba88a4753d82a9466d2aee4d72aa411879a6a6bc99b45ca91732b" }, + { + "registryItem": "progressive-blur", + "path": "registry/constructive/ui/progressive-blur.tsx", + "type": "registry:ui", + "contentSha256": "4b3e0b1020a4e589a68c33969104646490fb9107c10cf7aabb5403968d598699" + }, { "registryItem": "radio-group", "path": "registry/constructive/ui/radio-group.tsx", @@ -773,46 +1007,1210 @@ "contentSha256": "8ebfe3498b4351c899dfb4a2b0551e9243e95946fb0e1fa8202e2c5f621cb415" }, { - "registryItem": "sidebar", - "path": "registry/constructive/ui/sidebar.tsx", - "type": "registry:ui", - "contentSha256": "f1bef65f21c07ee0cd44d5bb12cd333cc62db4eccc3792244df594f45e1ad5c4" + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/adapter/postgraphile-adapter.ts", + "type": "registry:lib", + "contentSha256": "e0efb76f807240587ec98afa493762ad3ba5ae533212aeee92bd2e41e4acf89c" }, { - "registryItem": "skeleton", - "path": "registry/constructive/ui/skeleton.tsx", - "type": "registry:ui", - "contentSha256": "ac8c4f31303c317eb876880e631b1184aab15fa1b1c1f4ee4ea49ca8e9663afd" + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/adapter/sheets-adapter.ts", + "type": "registry:lib", + "contentSha256": "b31dc48e997c7fc53ea51c3b50b77d442b668be7f9f45a4cdb88baca8a388463" }, { - "registryItem": "slot", - "path": "registry/constructive/lib/slot.tsx", + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/adapter/use-sheets-adapter.ts", "type": "registry:lib", - "contentSha256": "2f546ed1e9aeba31d1b584ff5d6f9f60745a5fb15af098076505c86026ff4b67" + "contentSha256": "cabad4885584a2b6351afd8ecc5058877f380dd9c6157a61409aab139d425428" }, { - "registryItem": "switch", - "path": "registry/constructive/ui/switch.tsx", - "type": "registry:ui", - "contentSha256": "32cab805768c742c7bea2482c27737d955afc184a7e3f93090c5faefc9e4e15a" + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/advanced.ts", + "type": "registry:lib", + "contentSha256": "c49d43b363550e53494a15c9419cc5c9be07c7d22b465067356029f02e535c08" }, { - "registryItem": "table", - "path": "registry/constructive/ui/table.tsx", - "type": "registry:ui", - "contentSha256": "ab830e32d3e10f8ac3e12c6daad57f4686398fdc4a6dbfe1c67ef98bb46ad188" + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/auth-execute.ts", + "type": "registry:lib", + "contentSha256": "202e43e34ccb7677a092ee26ccaab3ee56f27e85d8e6a94b410cefb554fc683b" }, { - "registryItem": "tabs", - "path": "registry/constructive/ui/tabs.tsx", - "type": "registry:ui", - "contentSha256": "7c068c966d4b5de075fa8c4fb8ba493593b7e9381fc13ad5468107dcdc6fc549" + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/auth-gate.tsx", + "type": "registry:component", + "contentSha256": "6c3fef04b29730e687c580f279ade01bfed3fb50ff5214a2214ad364075a2170" }, { - "registryItem": "textarea", - "path": "registry/constructive/ui/textarea.tsx", - "type": "registry:ui", - "contentSha256": "815b0e5c75769a9dc35767200ba3fd4edc5e262267650878f2a229ce2ced91aa" + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/auth-types.ts", + "type": "registry:lib", + "contentSha256": "dbdae43d76cd189cc994a9a8f94501ea8bb140840d6dfefaa3a75effbdfa104a" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/hooks/index.ts", + "type": "registry:lib", + "contentSha256": "1a27f6f11d444584b8aa106e2a3fac47cbdf740d9fc85971e408e18cca36f0ae" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/hooks/use-forgot-password.ts", + "type": "registry:lib", + "contentSha256": "f987a849df420b7332a9ed9aff7553d31795400c15313cd244f89b8423242e01" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/hooks/use-login.ts", + "type": "registry:lib", + "contentSha256": "0128599a8c2a6ba14f7717757f6c0fb8dc407f2f2c2a4d61fb80326ec31b39b3" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/hooks/use-register.ts", + "type": "registry:lib", + "contentSha256": "c967f644cd6a65eb2880cffaecb7de15a4a91ef253085707a23aa94a74afb3a4" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/hooks/use-reset-password.ts", + "type": "registry:lib", + "contentSha256": "b77f53022a7bd8d3e343f85be321d797fd98e614f71320e79b16faa20094f174" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/index.ts", + "type": "registry:lib", + "contentSha256": "bc31ed2db67f9f28bd7771ea52254649fbbeee5bc9da0474ce8ab55f33f42b90" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/ui/auth-error-alert.tsx", + "type": "registry:component", + "contentSha256": "f609ee1a996be18e4f581be218b5865475abe3a77f759106207a3cbbd49a9fee" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/ui/auth-loading-button.tsx", + "type": "registry:component", + "contentSha256": "8e4a523db8c51e1f474d7dbbf16cc74406cf76b76bf6b4756e8414b3e0c7fa94" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/ui/auth-screen-header.tsx", + "type": "registry:component", + "contentSha256": "5ceeaaed45e50171072517a28eb8cb29f31f3399d15a576043ad8d2ce1386ccf" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/ui/auth-screen-layout.tsx", + "type": "registry:component", + "contentSha256": "b7db7710894d7bc87f1ee0bd48e1c07665149f0cfb1448aca3793aa221eb3657" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/ui/forgot-password-form.tsx", + "type": "registry:component", + "contentSha256": "f05bba14c6b1ce933b4d901d5fec6392abf053ac14f88a4f6cddc10342cd984c" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/ui/form-field.tsx", + "type": "registry:component", + "contentSha256": "9324a81a74a1f4cf18093e1e3858c21e885a64e0a0627d7d9d66739e10921026" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/ui/login-form.tsx", + "type": "registry:component", + "contentSha256": "46842f5149e93b914772b8d830e3bf0cce267dc2f9bd18a3358a3e927049d875" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/ui/password-strength.tsx", + "type": "registry:component", + "contentSha256": "f611dbef860c72521ac21a114f4d9ca91f7bd2fe96efc83ed733112d9d673275" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/ui/register-form.tsx", + "type": "registry:component", + "contentSha256": "b047aa579c697960062e6cc30fc46b378cfc3b26c28aff8edde765d663ffd87f" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/ui/reset-password-form.tsx", + "type": "registry:component", + "contentSha256": "fa8c61a441b336ec33b12c33340279a0a4b11b92036ddf903e461c03dc0c8478" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/utils/auth-errors.ts", + "type": "registry:lib", + "contentSha256": "d1888027ec3bc7969f3ed243f476993c5f8b9f93e79aec369ce409218c03c76d" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/utils/schemas.ts", + "type": "registry:lib", + "contentSha256": "c4edc6a174b49cc734b4499b5b3ffb3d7983074af31c140f25cc970973bef1df" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/utils/token-store.ts", + "type": "registry:lib", + "contentSha256": "8f1840ad5b49528cf0c2ad72db725c4f2de5475799c2690e1a6a629ad8956592" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/auth/utils/validators.ts", + "type": "registry:lib", + "contentSha256": "97300dd17b31199e34bcff9e05f17ffb4266262c86dc6c5a2678faf2d24f99bf" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/badge-tones.ts", + "type": "registry:lib", + "contentSha256": "e37012c7e6ba01d24d6f14005c66c4ca2e2b4c6dfec0d6449222e9f2e1960d4e" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/cell-props.ts", + "type": "registry:lib", + "contentSha256": "eaa26476d66594f7218e0218e2f9330276df48d4391d3592f867a5cd51dc42d1" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/cell-slots.ts", + "type": "registry:lib", + "contentSha256": "35e56540282a92b867c719f3b737773f066448eb444fdb126b301f7a13e85f07" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/create-sheets-cell.ts", + "type": "registry:lib", + "contentSha256": "05d78920e66cc0001618bfdb42dcc71cb7f6808ccff4990582606f854c234644" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/factories/badges.ts", + "type": "registry:lib", + "contentSha256": "d6d7a563ecdea437bef882005fb71559d22475cce8f0d2b1f7c50db03a4d353a" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/factories/boolean.ts", + "type": "registry:lib", + "contentSha256": "f79450d184e9949b6ec20988c46ae32831970659a2c95acb9774609555085eda" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/factories/datetime.ts", + "type": "registry:lib", + "contentSha256": "bf3c598226328e64ef3cdbe8f2d6a076bd8b9a7ae69b0e6ec1f21c7a555b588e" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/factories/geometry.ts", + "type": "registry:lib", + "contentSha256": "878e0359e5b02bca68384b566c8cd2a15f0f5654294fcc2fedb35beea88b9460" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/factories/image.ts", + "type": "registry:lib", + "contentSha256": "4a94fec07b36561472a6d887e5429ac4024dcacd753c50b54c5eb5e533ac878e" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/factories/interval.ts", + "type": "registry:lib", + "contentSha256": "ed45fe52a1707c813b828154f327145fe35eeaa3c8ebca03359fad3c06917551" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/factories/number.ts", + "type": "registry:lib", + "contentSha256": "587c21f6daecf426136c6dc37bd9a0823ab14d640e83802c0af0dda00d473b5b" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/factories/relation.ts", + "type": "registry:lib", + "contentSha256": "30e6065340e0d7b954f8c22119a5c2d11c0f292930903e66ca769f73149d395a" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/factories/text.ts", + "type": "registry:lib", + "contentSha256": "cf27b24904c0b0e19c97a4fc3eeb57694faa7f1c5af380934f4b32fcdfec64b7" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/factories/types.ts", + "type": "registry:lib", + "contentSha256": "3f77ddc7f280992d849230fc58c6083beb215daf76802c83c6d1dfaf34222105" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/factories/uri.ts", + "type": "registry:lib", + "contentSha256": "db4e452ed08ff4bf63da93ddd22ad65f41454d665f449deaf748554df992959e" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/image-cache.ts", + "type": "registry:lib", + "contentSha256": "2441787ef4cef8c3c9381db7a8f4b746aabec68509c407a0ee1fb5354c5e821e" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/sheets-cell.ts", + "type": "registry:lib", + "contentSha256": "cefbdcfd7740196312e8ddf08e6ef3264098e4404b1f3fccf3e18501fa1a8300" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/views/badges-view.tsx", + "type": "registry:component", + "contentSha256": "f51eb630340b82820f5db1bd519c9b9b359c9ffb358c1efa3380a7e5bba4a2af" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/views/boolean-view.tsx", + "type": "registry:component", + "contentSha256": "e98d9e8244ea4fa320653355d674d713014dfff2d6462524983007d2a713e51f" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/views/datetime-view.tsx", + "type": "registry:component", + "contentSha256": "f51384126f8d8d479e40986a458470531bfad56a64d3ae6ba7ed8042e308206f" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/views/draft-action-view.tsx", + "type": "registry:component", + "contentSha256": "0eea45c438caf6c5ebeddb843f21ca3061a39f6afdbca26bb53045e4ad4b3d8b" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/views/geometry-view.tsx", + "type": "registry:component", + "contentSha256": "59969b1636a2690a57938b9d099561bc497da4c8d9382d317739039d6d56588b" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/views/image-view.tsx", + "type": "registry:component", + "contentSha256": "185df3ab5e270309a141a3c6f1ad20ce11faf5d8c0670da3da8e5b111067de2b" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/views/interval-view.tsx", + "type": "registry:component", + "contentSha256": "7b8f8ad9eb789a70aa97e893ebe88be0c2b4cfca28ac82023c7a21c309ff4828" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/views/loading-view.tsx", + "type": "registry:component", + "contentSha256": "62c48ae1a77ff94f2eb8e0a03fb8c30388033ba24c52bd06070f340fc2be68df" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/views/number-view.tsx", + "type": "registry:component", + "contentSha256": "89b6e79d97a508d2449bdcb382158a4b9efc736d303550bc4ce80e557f47d5bf" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/views/relation-view.tsx", + "type": "registry:component", + "contentSha256": "9524c8f5438d0148e111656150c34d3e5b5b267462b4984862ecc75ac87db405" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/views/text-view.tsx", + "type": "registry:component", + "contentSha256": "0a54f07b0a5d5e766c01458c7ea4f24216a4a2c532037f45668f81473c66c588" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-model/views/uri-view.tsx", + "type": "registry:component", + "contentSha256": "2daff411a9a17eed159b016191c53c169d88c508e54f8459859b95977df056c0" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-types/cell-registry-defaults.ts", + "type": "registry:lib", + "contentSha256": "cd5fceac77b4a1fd35567c8801918a690b53cc991e83608ea56d7df19ee4bf12" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-types/cell-registry.ts", + "type": "registry:lib", + "contentSha256": "bfb525dce2ebd4e012bfb07ca4b6405bc31224aa133456785b97c53db6aba78e" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-types/cell-type-groups.ts", + "type": "registry:lib", + "contentSha256": "8340907ac521a3771d3c4c52086ea66a2e51e4bdc288113189735709c746cddb" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-types/cell-type-registry.ts", + "type": "registry:lib", + "contentSha256": "ee98d286bfc10b7d82de2279d9f44e065094374849e4f6d84bcbff54f9d2c194" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-types/cell-type-resolver.ts", + "type": "registry:lib", + "contentSha256": "924d90d01e9664d6fa35949e0765f4e91ad613376223340cad860cd26bff93e6" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-types/define-cell-type.ts", + "type": "registry:lib", + "contentSha256": "0812923a9e896cd9efbbf74b53bbeb23eae560128f90314ae23a48b00e54db3f" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-types/type-mapping.ts", + "type": "registry:lib", + "contentSha256": "a4a142290a15de31a50fc1bcafa038d9d202db0fd4e0062e7ffbfaa2a5611c7c" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/cell-types/types.ts", + "type": "registry:lib", + "contentSha256": "97f5b5c5acb34939b70f2f0222227cd2646b0d9ec6928758448906481824c33c" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/commands/context.ts", + "type": "registry:lib", + "contentSha256": "dd9c2df23d39c09f6cd8ae3b090e7d77afba48c3a4845ac174f7caa9d7923e81" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/commands/dispatch.ts", + "type": "registry:lib", + "contentSha256": "89884c802a5b550daf2f7a52969a43e0902cf3cded3536943ddfe07f5711813f" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/commands/index.ts", + "type": "registry:lib", + "contentSha256": "c511ed6d1ca026b4b8ffded755095377cf7ef7aa103d50da3435ceac6c39364d" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/commands/keybinding.ts", + "type": "registry:lib", + "contentSha256": "e85651b6008c2a0efb420e66e4e8ef2c1203747ea61485013abc98fe9d89738f" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/commands/keymap.ts", + "type": "registry:lib", + "contentSha256": "0848f4800723066e1707ccbe50803426b68c2187eb02f897f6eb2238c6bc8578" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/commands/registry.ts", + "type": "registry:lib", + "contentSha256": "51723578f70f7a0ec572a956f9e23099435ccc8ba534ebf5a6588c3cc03c7dee" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/commands/types.ts", + "type": "registry:lib", + "contentSha256": "195e536e0bf21c9f55e3568ac55fb43b5c4a1150e8457f1648056fc2b434743f" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/config/sheets-concurrency.ts", + "type": "registry:lib", + "contentSha256": "b8fe494cedc9514554572ae8211785b0c4f25402b83ede805da7273c41e3129b" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/context/sheets-context.ts", + "type": "registry:lib", + "contentSha256": "fbca1a2b4e4e717d1cf706683b1d97e580117331717999d2a2a1b37a056a581a" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/context/sheets-execute.ts", + "type": "registry:lib", + "contentSha256": "3615f980ee18fd27ab3b1941bbec215d91fc8b8125fcd8b4d293ba764e8902ca" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/context/sheets-provider.tsx", + "type": "registry:component", + "contentSha256": "1e8c52731c6557311562167209f75e88c389b636b2c9355d3dc964957d487cf1" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/context/sheets-upload-presigned.ts", + "type": "registry:lib", + "contentSha256": "99ae5ff396e4c961076aa0ce9ad8ece33b102ca5889f71bfc0d5ccf80fd0b49d" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/forms/form-spec-builder.ts", + "type": "registry:lib", + "contentSha256": "c30f7c65a021c42916057a44a7a88b6f97b269406ad377e09b0f14a3bd9036d9" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/forms/index.ts", + "type": "registry:lib", + "contentSha256": "225a3c571fd1cb3ef419ecc3afe69bbb1524afb0fe369476e516cac1c7d4d515" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/forms/metadata-hash.ts", + "type": "registry:lib", + "contentSha256": "b72009e30e8a8a6beb08c23280dcc4ce878ea8a8ee4efb736375fa2fc373d91d" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/forms/mutations.ts", + "type": "registry:lib", + "contentSha256": "725008892a189d7bdd82bfee086df8ec1b90ee63212f251fc182548c15696d42" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/forms/types.ts", + "type": "registry:lib", + "contentSha256": "0477a05dffc08abc8f3193910ec7a64841e9b403212d28f7416812173f54712d" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/forms/zod-schema.ts", + "type": "registry:lib", + "contentSha256": "1b4bbb5dbd5997d9656367cdc7f02277618614ac6c16c63f0a07fc2efea656d5" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/array-editor.tsx", + "type": "registry:component", + "contentSha256": "91d463a34037420ac40424c5ae2ad344b68904f0f906f9ca1fa39b451693f795" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/date-editor.tsx", + "type": "registry:component", + "contentSha256": "28de25c097b1566ef2c4264672b9094b851b51663f847e5dc97f85afb4c5ac53" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/edit-intent.ts", + "type": "registry:lib", + "contentSha256": "8ebe127dc6726b1fa91f33bbb830ee5bc9996fa7cea13111f1c06ccf40086661" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/editor-props.ts", + "type": "registry:lib", + "contentSha256": "75025db8baaaa5db0df8c700438e6af68a6c142c72562ea5c2de418111c675c1" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/editor-registry-dom.ts", + "type": "registry:lib", + "contentSha256": "da568e84d7926e6f855dc040328cf29e1039d61f2cbef15544a7f131c294d4e2" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/geometry-editor.tsx", + "type": "registry:component", + "contentSha256": "b36768e6552cc6aaa0b9e0f96a26f110c54a3d0daf2a1dc28a8407aa484127ff" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/image-editor.tsx", + "type": "registry:component", + "contentSha256": "51a8d90c36c465d6ff9ef29164fac08d409d648edccd03ebe99254ed45c17b63" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/inet-editor.tsx", + "type": "registry:component", + "contentSha256": "4fafa6377815945af930f7b738c230fe8287f20360843d6a10dc6937288e6089" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/interval-editor.tsx", + "type": "registry:component", + "contentSha256": "3f3fc2bcf44d299d104a25e0641c88e49eaee5614139fb96f9548b0c9e1e8632" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/json-editor.tsx", + "type": "registry:component", + "contentSha256": "03f55497c96a9fac454e79135cb6530050b25ccfcfb22601c60b63b3fa9c32f5" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/number-editor.tsx", + "type": "registry:component", + "contentSha256": "4d4974dcef039cdafafe1eb2a66e8e33dd78b0a1cca002ffabc737d74601bf7b" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/relation-editor.tsx", + "type": "registry:component", + "contentSha256": "c37f976f89b84df7770146d8ca0b3793e6e2fbb5b3df8b548d50ba1590a8953d" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/text-editor.tsx", + "type": "registry:component", + "contentSha256": "925b7cbbcaac6144fdd943bc1ca14dcad398c190ef2fa9e8932babd7dee97e2b" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/tsvector-editor.tsx", + "type": "registry:component", + "contentSha256": "41d24a6ae1df079dd04c30ab8f359e1e4943b8d220e28822486d11ad12b21dc3" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/upload-editor.tsx", + "type": "registry:component", + "contentSha256": "f4996936d9eb3e6fe5b2ca2556431ff09690fb698bceb795265507a26ff8905d" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/editors/url-editor.tsx", + "type": "registry:component", + "contentSha256": "8c2fe225f804905b771e25dfc698ed1d0c01514746921c0442910c5ff416c19b" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/inline-cell-editor.tsx", + "type": "registry:component", + "contentSha256": "37705d76064bb2270bd8a74e31907c122889ff28627319f7609d2ad58c6d9ed4" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/overlay/overlay-manager.tsx", + "type": "registry:component", + "contentSha256": "b9c38875db56f697034790d6b4d2240273ca3a1aaa940408ca18b4d01761f8d2" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/overlay/use-overlay-controller.ts", + "type": "registry:lib", + "contentSha256": "4bbfa55e12ab67d081823fde604e63c653ea87366915ffa9a16ffd678a501a34" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/sheets-cell-host.tsx", + "type": "registry:component", + "contentSha256": "a77be73eaac320a009fadd7131b56c9740d88ab680329d858472234b9a4a3a53" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid-dom/use-sheets-content.ts", + "type": "registry:lib", + "contentSha256": "3b80f353f93361ee45162b0337fce876904095732d36573c0a2283f95e988745" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/cell-routing.ts", + "type": "registry:lib", + "contentSha256": "de1f70e94622ee11c9a9539654f188569715136dc6bf4a188dc6ccac632f3dae" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/draft-types.ts", + "type": "registry:lib", + "contentSha256": "b2386bf11ca47abfdb47a895e45a46e1266b7af7f59e946a92e8e122c9e39e0e" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/editors/array-editor.tsx", + "type": "registry:component", + "contentSha256": "d38f56dde338d3f3f9c93d8086280de4c43152b368df981444d89e4ff58fb801" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/editors/date-editor.tsx", + "type": "registry:component", + "contentSha256": "0dacd343899e78084c3314e23854dfc27bd4af84189b466fb1f3dffa726293ee" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/editors/editor-focus-trap.tsx", + "type": "registry:component", + "contentSha256": "5d60f21db983a996ac130051e067e7afd53b1aef7177b1696c3ce9c12e61161b" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/editors/geometry-editor.tsx", + "type": "registry:component", + "contentSha256": "77744ce63a00b31c7d4ac8f89da078263560480e1b3640f4c37dd61d3d8dadee" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/editors/image-editor.tsx", + "type": "registry:component", + "contentSha256": "4530b05edba2183beee420851444c853233b26340b2927eafe3e87f946ec25a1" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/editors/inet-editor.tsx", + "type": "registry:component", + "contentSha256": "4c68c21b6cef88a3f496f8bda5d57cf313122a6ca64df9c605c8e7bc839a5122" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/editors/interval-editor.tsx", + "type": "registry:component", + "contentSha256": "4b24df03fbb111a2bbbb0bb3f04d8969f4e0caf5bc812bcc36af2f41f3125840" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/editors/json-editor.tsx", + "type": "registry:component", + "contentSha256": "a8e21c9c3c68fd13d12d357527b561793222aac935abb82b1c8c50e80461f617" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/editors/overlay-presets.ts", + "type": "registry:lib", + "contentSha256": "ed9fe391779446dc648d9127dc9ccf69078dd5e0c7173f041a0e95a0f891101c" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/editors/overlay-viewport-guard.tsx", + "type": "registry:component", + "contentSha256": "33bdfc36c5dfe8859d47adc2718420f137672bcc9aa97dfcd59e3a9e0f5930a6" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/editors/relation-editor.tsx", + "type": "registry:component", + "contentSha256": "678147e863dca88b234e01bf9b7b7c8c7f9d745cef4cabad6a7d58fabcf757e7" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/editors/relation-record-tooltip.tsx", + "type": "registry:component", + "contentSha256": "25f26807fcc1eea384828b856546cc31778e2a224b256e589d9e5d249f479b0c" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/editors/tsvector-editor.tsx", + "type": "registry:component", + "contentSha256": "a38759e739991924ea24e8104c9b936ba27a949277b2e33b751b62ee7b2c61f5" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/editors/upload-editor.tsx", + "type": "registry:component", + "contentSha256": "a23b70bcf8a6ab4d087621a20a397509c319e377143e22ca28d851a0786e5bcf" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/editors/url-editor.tsx", + "type": "registry:component", + "contentSha256": "0e69b69ce9aa914e822e3f4bd5f863563a4ff503a95eeb8723bb2b3caa635a50" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/feedback/dock-status-bar.tsx", + "type": "registry:component", + "contentSha256": "8dde3e3c25f3d2c8bf1121cf0348d8f82e68469fa23ca73190cea6b034d0be44" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/feedback/editor-error-boundary.tsx", + "type": "registry:component", + "contentSha256": "af8f6af5e32387dc6fd2ad0817f649c0af865b34f746fad9da4d60d1bbf35ae5" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/feedback/feedback-context.tsx", + "type": "registry:component", + "contentSha256": "4976fe090e586d453f4b0e4ea5b6a825b78b9d3061bac4ffa88e3cac2fcb71c1" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/feedback/feedback-reducer.ts", + "type": "registry:lib", + "contentSha256": "af34a5231039fbf5d0704e2365737ecada6757ed94ba835a0cd0ea73e999d231" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/feedback/floating-status.tsx", + "type": "registry:component", + "contentSha256": "3144aae4fa106c701cb50e62f05686fd04b7e648aec201b1a3c28f8acd13511f" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/feedback/index.ts", + "type": "registry:lib", + "contentSha256": "bc6cb6481d6bd102ef55da6b756b6cf14fd317a5398e90da779ef1e694da9e66" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/feedback/sheets-error-boundary.tsx", + "type": "registry:component", + "contentSha256": "e0048588597dcaa11524b4d3296b1e07e9f9189d875cb9e3ff97397a7ec2c150" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/feedback/sheets-error-state.tsx", + "type": "registry:component", + "contentSha256": "f8f32ebc97653a961dd73184e6598b5a0e33e4fa2c01156b377b7ff243b09d6d" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/filter-operators.ts", + "type": "registry:lib", + "contentSha256": "de2d1cb26f8d2596e04b241e15977e1a3f82deafe0bd182e0cc2be864692b9af" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/grid-cell-types.ts", + "type": "registry:lib", + "contentSha256": "c423e47bc58911d26027ee51a59f1c7af44a5fcd09a74a2ca6276cc99cefe013" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/hooks/use-batch-commit.ts", + "type": "registry:lib", + "contentSha256": "78df8c8af3521ec6db9e0086b3993eb75d3c56d660642b5b8508ff3d9c95775c" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/hooks/use-cell-editing.ts", + "type": "registry:lib", + "contentSha256": "8017b515e49e432fe0fd7d38d49b338f145d076a9b0dac536c4a9b36be3788cf" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/hooks/use-draft-rows.ts", + "type": "registry:lib", + "contentSha256": "6758761a5be09e07b4e16daa2bf940e4ea998715e6f9574dd810184fd33e45c2" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/hooks/use-draft-submission.ts", + "type": "registry:lib", + "contentSha256": "5c15d527f5a1b029f75a7beced55c9c004e4677025b42075ac6a501a038ae484" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/hooks/use-filter-grid.ts", + "type": "registry:lib", + "contentSha256": "eaf51636a34117794506af34b2811690caf72c683fd397febf9f01cbf9dae64e" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/hooks/use-grid-operations.ts", + "type": "registry:lib", + "contentSha256": "d15aeba230b36e257b03fdae47d1769b3379492631126ef29d33c39eee4879a2" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/hooks/use-grid-selection.ts", + "type": "registry:lib", + "contentSha256": "086c7c5393fd97b3af344f1e6028ce4e65073e69442a2ba82b9d29b266260ddd" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/hooks/use-grid-state.ts", + "type": "registry:lib", + "contentSha256": "853fb4f3eb672521ba75e5d447181e02d875037c82c64e4a555e8dcd6a61dfa1" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/hooks/use-infinite-grid-data.ts", + "type": "registry:lib", + "contentSha256": "2ab8bee073dc107a057ac0ce3bb399fc0d4b4532cf98b1fa574cb4e5915763f0" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/hooks/use-load-grid.ts", + "type": "registry:lib", + "contentSha256": "501cb0f53ff34fae4726bf65676623af5224f1968de751d2cdd2e91369433469" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/hooks/use-paginate-grid.ts", + "type": "registry:lib", + "contentSha256": "d278198870a53499eeba970b116f1a5470df91909820d922a98ef7cf47379256" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/hooks/use-undo-redo.ts", + "type": "registry:lib", + "contentSha256": "9c431cff237803d538cba63a81f787b067267828dc50c1f0b2e09c9a4d192054" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/row-model.ts", + "type": "registry:lib", + "contentSha256": "0a923f72b6e13ea471e31c2daee78d6b6f80aa91f868c870f956a2f5be111c84" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/sheets.constants.ts", + "type": "registry:lib", + "contentSha256": "1e6f346a526a9429a1ab1b56272091605ba0b283e8eff3c2e175717f5b679c3e" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/sheets.context-menu.tsx", + "type": "registry:component", + "contentSha256": "bd7543b2a082628c0b7a52cda5ad1d81f13444ddf430ef8654bd0ba028c43444" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/sheets.controls.tsx", + "type": "registry:component", + "contentSha256": "03c0977d751e68247ce579ccab128f62d87cffb0265ae227a7eff1c04797146f" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/sheets.formatters.ts", + "type": "registry:lib", + "contentSha256": "9f47a301c962d66e412389c895da37cbf0da3fc33f19b1291ce2b32e1b4242ce" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/sheets.pagination.tsx", + "type": "registry:component", + "contentSha256": "e291b5352e7769b61fb5ed5bc5fc902b64fe27bb694b0ec76385cae130060891" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/sheets.table-selector.tsx", + "type": "registry:component", + "contentSha256": "35a6f1aee183c55c6adf5aea35cbbc6916094ea450f2d9e786b125a12f07375f" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/sheets.theme.ts", + "type": "registry:lib", + "contentSha256": "4077007803d5a3741be19d6279bd1dd9fce553287657616873ffe63ba5c3c7a1" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/sheets.tsx", + "type": "registry:component", + "contentSha256": "622b51c70ca9b34b4f5703c6a13b104fca567137518e599a25b2857985d79ea2" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/sheets.types.ts", + "type": "registry:lib", + "contentSha256": "ec63ae93b53fb070845787b3a7a22de1f2a84db78ff3ebab0b81b6b41bac8d8c" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/sheets.utils.ts", + "type": "registry:lib", + "contentSha256": "862bccc4b32cc3e00b367cc50d5398f79a8f7b333b833711c21e2b91426b921f" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/grid/use-sheets.ts", + "type": "registry:lib", + "contentSha256": "e939cd53fe480c7cdcfa8dabd919c78118dd0a6f3db9af5e5f9e36f86ae3e29c" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/hooks/orderby-enum-resolution.ts", + "type": "registry:lib", + "contentSha256": "3989466c43820cad301973f7495d83826d516eea915efaa83ea2e4c4a42dc5cd" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/hooks/query-keys.ts", + "type": "registry:lib", + "contentSha256": "5e17badc755f4d780f375d4941b7ae080fc3fc7a2829467e6c45e1d74ebf2330" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/hooks/relation-field-resolution.ts", + "type": "registry:lib", + "contentSha256": "2628b2bb339b1d9cb09f1b094d28d89cd1eeb3b7720fad2b6e92b4180177dc8e" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/hooks/use-relation-columns.ts", + "type": "registry:lib", + "contentSha256": "11e09bb11b88eb04bd3e5dad358182e95121d26237f42d600c551ac493156de8" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/hooks/use-relation-metadata-cache.ts", + "type": "registry:lib", + "contentSha256": "e4af7b63d67d1115b16746f040c297b0b568d99225d089be6aeb2504cadd98d7" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/hooks/use-sheets-infinite-table.ts", + "type": "registry:lib", + "contentSha256": "660077ad92b75c0c9aa84ee6955f1c97654bc1ca29a5344af43a6b86658f2046" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/hooks/use-sheets-meta.ts", + "type": "registry:lib", + "contentSha256": "134fb8e3d7b5da30e62b85eabdf120b288045dceeb33681e173727c48e172478" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/hooks/use-sheets-table-cursor.ts", + "type": "registry:lib", + "contentSha256": "5ca42f9a9ee25b7764e46b16d207994c01dfab6a743ea8b688b0995b35a1fcaa" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/hooks/use-sheets-table.ts", + "type": "registry:lib", + "contentSha256": "2f1292072796547e71a50070dae169f288e0066ffc65e698e97caecbb5b3ecf4" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/hooks/use-sheets-upload.ts", + "type": "registry:lib", + "contentSha256": "01eb4abe44f8922b23052310f9982e4c84dc0b3f937977e521fb9397c25279c3" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/index.ts", + "type": "registry:lib", + "contentSha256": "de57e9b5f58e92c6bdc46194751f5aed1f5d0390495204fd7d3ee93f40506bfe" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/row-identity.ts", + "type": "registry:lib", + "contentSha256": "921fb2fa79eb8b80673a15c8eb35adbde085b567d40e1cb2ea111365f8f7d00f" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/selection/cell-extract.ts", + "type": "registry:lib", + "contentSha256": "ae56765bac37cddc52e32f048c980e02c87eb8ddf0016441b94d59e8c0646ba9" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/selection/fill.ts", + "type": "registry:lib", + "contentSha256": "511c45d271025b50d04e86c6f6e419389ec11d0a7e945e6c9ab070fa5ea857c9" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/selection/range-set.ts", + "type": "registry:lib", + "contentSha256": "d227c5188588838b477bc1eb7e15b6f0cf014eb61e58a565fa7374c135a03266" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/selection/selection-model.ts", + "type": "registry:lib", + "contentSha256": "c6d09f772e36379ad6eca4d33022a3c5ba83f10b90165576a103ffc83593b31e" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/selection/tsv.ts", + "type": "registry:lib", + "contentSha256": "2db1956ade3f2c489460c048a83f32cfa891795db40fae881028eb6161169fe6" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/store/draft-rows-slice.ts", + "type": "registry:lib", + "contentSha256": "6455f0f3f31d997c5a41b208f3233fdbe329d70880faa14909e51238ccb3cf62" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/store/relation-info-slice.ts", + "type": "registry:lib", + "contentSha256": "5b16b43baa28a2c6e701092b56978b74e16695fca1f7ee80fde04bcf6090e7f1" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/store/sheets-store.ts", + "type": "registry:lib", + "contentSha256": "63c9b7a65d9dc0eb890f552dfdc73be8d6e353ee950aae55abfcfc34f525f6a6" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/table/features.ts", + "type": "registry:lib", + "contentSha256": "1d61e2f530ae6d4871636def69d61a457d2aba40f163588b58497d44e72aeac2" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/table/grid-viewport.tsx", + "type": "registry:component", + "contentSha256": "3980f97518b63af685c966525a89fb86771c6ce6d1710db84caa72a6be68d665" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/table/use-sheets-table-instance.ts", + "type": "registry:lib", + "contentSha256": "6897a793161bc5e72061c085e2de64d7fe59f44a49f13b5264eef51a4646a5c1" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/utils/cn.ts", + "type": "registry:lib", + "contentSha256": "572b607d90e5d5658695ce2aac435f9e6ca7ef8e21593bf63bb33a35cdaa5e2d" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/utils/file.utils.ts", + "type": "registry:lib", + "contentSha256": "68651221f735a90febf08c57b1c16c74abfbc1a29bea0fb2f193798e8aff909f" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/utils/image-with-fallback.tsx", + "type": "registry:component", + "contentSha256": "8257f9a8bbe54e908592f9a7372f3ffbbacaa6f92efd9fd6b427e9f1c447f456" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/utils/map-picker.tsx", + "type": "registry:component", + "contentSha256": "f8f76ca20d5d542161e7f15b017acacbfd6cf14b4ad719a8debb9044902ab8a0" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/utils/motion-config.ts", + "type": "registry:lib", + "contentSha256": "a9ebb6fb9d36cb271152cf0c28e575097b272080dbc3765add6c59dc65e3e814" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/utils/relation-utils.ts", + "type": "registry:lib", + "contentSha256": "e487a01043b3ec57133b533ff2df3cbe5b99c0e98c957cd9d59b1854888599b3" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/utils/sheets-i18n.ts", + "type": "registry:lib", + "contentSha256": "bbfd8c9db0ebb7a3b01506203dd04162886218109cee2ad6135e685c1e7fcb6d" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/utils/sheets-logger.ts", + "type": "registry:lib", + "contentSha256": "415d96d0e5b1294c2326567a0025f217eeac58239005ad9c2b0641de0551a83f" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/utils/use-color-scheme.ts", + "type": "registry:lib", + "contentSha256": "dca63023ed840c781c42b9c08269cd1643154e4a4b27ae3a3c2f1b82c6b58015" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/utils/use-image-status.ts", + "type": "registry:lib", + "contentSha256": "040c9fdf537f1fd4657ed2bc9cf6b33d93c5fc6ca55c629848b6b3a84158a727" + }, + { + "registryItem": "sheets", + "path": "registry/constructive/blocks/sheets/utils/use-resize-observer.ts", + "type": "registry:lib", + "contentSha256": "3f8dbfcfac0bf1412f2169d65330e3e1e6e3f33bc1b846d59bf7ee4f664bbf6d" + }, + { + "registryItem": "sidebar", + "path": "registry/constructive/ui/sidebar.tsx", + "type": "registry:ui", + "contentSha256": "f1bef65f21c07ee0cd44d5bb12cd333cc62db4eccc3792244df594f45e1ad5c4" + }, + { + "registryItem": "skeleton", + "path": "registry/constructive/ui/skeleton.tsx", + "type": "registry:ui", + "contentSha256": "ac8c4f31303c317eb876880e631b1184aab15fa1b1c1f4ee4ea49ca8e9663afd" + }, + { + "registryItem": "slot", + "path": "registry/constructive/lib/slot.tsx", + "type": "registry:lib", + "contentSha256": "2f546ed1e9aeba31d1b584ff5d6f9f60745a5fb15af098076505c86026ff4b67" + }, + { + "registryItem": "stepper", + "path": "registry/constructive/ui/stepper.tsx", + "type": "registry:ui", + "contentSha256": "79ae150ba039c03e374dd27765cacfaeec337021d80ae4522d218e7e7815fe3a" + }, + { + "registryItem": "switch", + "path": "registry/constructive/ui/switch.tsx", + "type": "registry:ui", + "contentSha256": "32cab805768c742c7bea2482c27737d955afc184a7e3f93090c5faefc9e4e15a" + }, + { + "registryItem": "table", + "path": "registry/constructive/ui/table.tsx", + "type": "registry:ui", + "contentSha256": "ab830e32d3e10f8ac3e12c6daad57f4686398fdc4a6dbfe1c67ef98bb46ad188" + }, + { + "registryItem": "tabs", + "path": "registry/constructive/ui/tabs.tsx", + "type": "registry:ui", + "contentSha256": "7c068c966d4b5de075fa8c4fb8ba493593b7e9381fc13ad5468107dcdc6fc549" + }, + { + "registryItem": "textarea", + "path": "registry/constructive/ui/textarea.tsx", + "type": "registry:ui", + "contentSha256": "815b0e5c75769a9dc35767200ba3fd4edc5e262267650878f2a229ce2ced91aa" + }, + { + "registryItem": "toast", + "path": "registry/constructive/blocks/toast/index.ts", + "type": "registry:component", + "contentSha256": "feb28b7946096ab3b5fdf5e632153b2ee5c63f9cdc4eb7e479e6b7e4ea594729" + }, + { + "registryItem": "toast", + "path": "registry/constructive/blocks/toast/toast-error.tsx", + "type": "registry:component", + "contentSha256": "73de6e5173da019a6a8069c0531fa804baf6eb192842205a6705f2c56047f2fa" + }, + { + "registryItem": "toast", + "path": "registry/constructive/blocks/toast/toast-info.tsx", + "type": "registry:component", + "contentSha256": "0efb0ee1ac9de310b1b0a97370bf1236fa3d536084d3b434ee69029ae3ddd0e0" + }, + { + "registryItem": "toast", + "path": "registry/constructive/blocks/toast/toast-success.tsx", + "type": "registry:component", + "contentSha256": "d7ca19e398779c5d1978f58070905712fe58b00332bb05842f72b72cebd11e85" + }, + { + "registryItem": "toast", + "path": "registry/constructive/blocks/toast/toast-warning.tsx", + "type": "registry:component", + "contentSha256": "d0c3823cfcb024a3110765fa79eb8dbd8c014195910b6a569e5842b620c1c6b1" }, { "registryItem": "tooltip", @@ -830,7 +2228,7 @@ "registryItem": "use-mobile", "path": "registry/constructive/hooks/use-mobile.ts", "type": "registry:hook", - "contentSha256": "3469afadf0d9f2e5de6faf482312151d1abaccb511929b6962b890295a1ba061" + "contentSha256": "1ba304ed659572c5eba72027298829e65769eae72847d60502d9f197cf8a22f6" } ] } diff --git a/.agents/skills/constructive-blocks/references/runtime-contract.md b/.agents/skills/constructive-blocks/references/runtime-contract.md index 68ac23a..b6ccc24 100644 --- a/.agents/skills/constructive-blocks/references/runtime-contract.md +++ b/.agents/skills/constructive-blocks/references/runtime-contract.md @@ -4,10 +4,19 @@ Use this reference after selecting a registry item. The machine snapshot in `install-roots.v1.json` remains authoritative for the pinned source, release state, endpoints, first-party module bindings, pack manifests, preset profiles, Console runtime, and source limitations. The complete catalog in -`registry-catalog.v1.json` pins all 102 source items, but its Data documentation +`registry-catalog.v1.json` pins the complete source registry, but its Data documentation is retained only as drift evidence; validated queries apply `registry.queryOverrides` before returning it. +## Branch-aware App Kit documentation + +Every validated query returns `installability.appKitDocumentation`. Read its +`authority` before using an exact App Kit API. While +`publicRegistryReady: false`, authority is `kind: pinned-source`; join its path +to the exact Blocks checkout only after source preflight verifies the commit and +SHA-256. The public URL is withheld from query output until authority becomes +`kind: public-url` after Pages and registry publication are verified. + ## Surface ownership | Surface | Installs | Runtime owner | @@ -510,7 +519,8 @@ generated artifacts. Every validated query marks `installability.publicInstall` as `blocked` and `future-only` in this snapshot. Item and plan query surfaces also wrap the -canonical public command in a status-bearing `publicInstall` object; they never +canonical `shadcn@latest` public command in a status-bearing `publicInstall` +object; they never expose a bare `installCommand`. Do not execute that wrapped command until its status is `available`. Use only the pinned local workflow below before release. diff --git a/.agents/skills/constructive-blocks/scripts/check-blocks-contract.mjs b/.agents/skills/constructive-blocks/scripts/check-blocks-contract.mjs index 9ea7f29..0358734 100644 --- a/.agents/skills/constructive-blocks/scripts/check-blocks-contract.mjs +++ b/.agents/skills/constructive-blocks/scripts/check-blocks-contract.mjs @@ -14,22 +14,36 @@ const snapshotPath = path.join( 'references', 'install-roots.v1.json' ); +const briefRoutesPath = path.join( + skillDirectory, + 'references', + 'brief-to-roots.v1.json' +); +const eventStudioBlueprintPath = path.join( + skillDirectory, + 'references', + 'event-studio-blueprint.json' +); -const PINNED = Object.freeze({ +export const PINNED = Object.freeze({ repository: 'https://github.com/constructive-io/blocks', - branch: 'feat/feature-packs-console-kit', - commit: '4f2a789fde9a90c0c6ed5977896493bb4818fa77', + branch: 'feat/app-kit', + commit: '1a72e5d95f7ce4a243cd4536ed78c638708d538c', publicationStatus: 'branch-only', registryNamespace: '@constructive', registryUrl: 'https://constructive-io.github.io/blocks/r/{name}.json', registryHomepage: 'https://constructive-io.github.io/blocks', + appKitDocsUrl: 'https://constructive-io.github.io/blocks/blocks/app-kit/', + appKitDocsPath: 'apps/blocks/src/app/blocks/app-kit/page.tsx', registrySchema: 'https://ui.shadcn.com/schema/registry.json', - shadcnVersion: '4.13.1', + publicShadcnTag: 'latest', + testedShadcnVersion: '4.16.1', + workspaceShadcnVersion: '4.13.1', packageManager: 'pnpm@10.28.0', nodeEngine: '>=24.0.0', metaContractVersion: '2026-07', metaCoordinate: 'Query._meta', - registryItemCount: 102 + registryItemCount: 123 }); const ENDPOINT_KINDS = [ @@ -60,6 +74,42 @@ const PACK_IDS = [ 'notifications' ]; +const APP_KIT_ROOT_NAMES = [ + 'app-kit-core', + 'app-kit-data', + 'app-kit-board', + 'app-kit-dashboard', + 'app-kit-calendar', + 'app-kit-workflow', + 'app-kit-event-studio' +]; + +export function parseNpmPackageRequirement(specifier) { + assertString(specifier, 'npm package requirement'); + const separator = specifier.startsWith('@') + ? specifier.indexOf('@', specifier.indexOf('/') + 1) + : specifier.indexOf('@'); + if (separator === -1) { + return { name: specifier, requested: null, exactVersion: null }; + } + const name = specifier.slice(0, separator); + const requested = specifier.slice(separator + 1); + assert(name.length > 0 && requested.length > 0, `Invalid npm package requirement ${specifier}.`); + const exactVersion = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(requested) + ? requested + : null; + return { name, requested, exactVersion }; +} + +export function pinInspectorInstallCommand(command, itemName) { + const liveCommand = `pnpm dlx shadcn@latest add ${PINNED.registryNamespace}/${itemName}`; + assert( + command === liveCommand, + `${itemName} inspector install command changed from the reviewed latest-version template.` + ); + return `pnpm dlx shadcn@${PINNED.testedShadcnVersion} add ${PINNED.registryNamespace}/${itemName}`; +} + const META_CONTRACT_REQUIREMENTS = { queryType: { typeName: 'Query', fields: ['_meta'] }, metaSchema: { typeName: 'MetaSchema', fields: ['tables'] }, @@ -299,6 +349,7 @@ const CANONICAL_SOURCE_PATHS = [ 'apps/registry/scripts/build.ts', 'packages/ui/registry.json', 'apps/blocks/registry.json', + 'apps/blocks/src/app/blocks/app-kit/page.tsx', 'scripts/inspect-console-kit.ts', 'apps/blocks/src/feature-packs/catalog.ts', 'apps/blocks/src/feature-packs/capabilities.ts', @@ -390,22 +441,22 @@ const ADAPTER_SOURCE_PATHS = { const PACKAGE_RELEASES = [ { name: '@constructive-io/ui', - version: '0.5.0', + version: '0.8.0', manifestPath: 'packages/ui/package.json' }, { name: '@constructive-io/data', - version: '0.2.0', + version: '0.5.0', manifestPath: 'packages/data/package.json' }, { name: '@constructive-io/sheets', - version: '0.5.0', + version: '0.8.1', manifestPath: 'packages/sheets/package.json' }, { name: '@constructive-io/schema-builder', - version: '0.1.0', + version: '0.4.1', manifestPath: 'packages/schema-builder/package.json' } ]; @@ -1897,6 +1948,341 @@ function assertStringArray(value, label) { } } +function constructiveMetadataForItem(item) { + return item?.meta?.constructive ?? null; +} + +function assertConstructiveRegistryMetadata(metadata, label, itemName) { + assertObject(metadata, label); + assert( + APP_KIT_ROOT_NAMES.includes(itemName), + `${itemName} declares App Kit metadata without being an App Kit install root.` + ); + assert(metadata.version === 1, `${label}.version must be 1.`); + assert(metadata.family === 'app-kit', `${label}.family must be app-kit.`); + assertString(metadata.kind, `${label}.kind`); + assert( + ['runtime', 'resource', 'view', 'composition', 'starter'].includes( + metadata.kind + ), + `${label}.kind is not a supported Constructive registry kind.` + ); + assertString(metadata.boundary, `${label}.boundary`); + assert( + ['server-safe', 'client', 'mixed'].includes(metadata.boundary), + `${label}.boundary is not server-safe, client, or mixed.` + ); + assert(metadata.provider === 'app-kit', `${label}.provider must be app-kit.`); + const allowedKeys = new Set([ + 'version', + 'family', + 'kind', + 'boundary', + 'provider', + 'dataShapes', + 'intents', + 'capabilities', + 'slots', + 'events', + 'compatibleWith' + ]); + for (const key of Object.keys(metadata)) { + assert(allowedKeys.has(key), `${label} contains unknown field ${key}.`); + } + for (const field of ['dataShapes', 'intents', 'capabilities']) { + assertStringArray(metadata[field], `${label}.${field}`); + assert(metadata[field].length > 0, `${label}.${field} must not be empty.`); + assert( + metadata[field].every((entry) => entry.trim().length > 0), + `${label}.${field} must contain non-blank strings.` + ); + } + for (const field of ['slots', 'events', 'compatibleWith']) { + if (metadata[field] === undefined) continue; + assertStringArray(metadata[field], `${label}.${field}`); + assert(metadata[field].length > 0, `${label}.${field} must not be empty.`); + assert( + metadata[field].every((entry) => entry.trim().length > 0), + `${label}.${field} must contain non-blank strings.` + ); + } +} + +export function assertBriefRoutes(fixture, catalogItems) { + assertObject(fixture, 'App Kit brief routes'); + assert( + fixture.schemaVersion === 1, + 'App Kit brief routes schemaVersion must be 1.' + ); + assert( + fixture.kind === 'constructive.app-kit-brief-routes', + 'App Kit brief routes kind drifted.' + ); + assert(Array.isArray(fixture.cases), 'App Kit brief routes cases must be an array.'); + assert(Array.isArray(catalogItems), 'App Kit brief routes require registry catalog items.'); + const catalogByName = byName(catalogItems, 'Registry catalog item'); + const cases = byId(fixture.cases, 'App Kit brief route'); + assert(cases.size >= 7, 'App Kit brief routes must cover at least seven application briefs.'); + for (const route of fixture.cases) { + assertString(route.brief, `${route.id}.brief`); + for (const field of [ + 'dataShapes', + 'userIntents', + 'capabilities', + 'expectedRoots', + 'forbiddenRoots', + 'forbiddenAssumptions' + ]) { + assertStringArray(route[field], `${route.id}.${field}`); + assert( + route[field].length > 0, + `${route.id}.${field} must not be empty.` + ); + } + assert( + typeof route.starterRequested === 'boolean', + `${route.id}.starterRequested must be a boolean.` + ); + const selectsStarter = route.expectedRoots.includes('app-kit-event-studio'); + assert( + route.starterRequested === selectsStarter, + `${route.id} may select the Event Studio starter only with explicit starterRequested opt-in.` + ); + assert( + selectsStarter + ? isDeepStrictEqual(route.expectedRoots, ['app-kit-event-studio']) + : route.expectedRoots[0] === 'app-kit-core', + `${route.id} must select either its explicitly requested starter or app-kit-core first.` + ); + assert( + route.expectedRoots.every((root) => root.startsWith('app-kit-')), + `${route.id} must route application composition only to App Kit roots.` + ); + assert( + route.expectedRoots.every((root) => APP_KIT_ROOT_NAMES.includes(root)), + `${route.id} references an unknown App Kit root.` + ); + const selectedMetadata = []; + for (const root of route.expectedRoots) { + const catalogItem = catalogByName.get(root); + assert(catalogItem, `${route.id} references App Kit root ${root} absent from the registry catalog.`); + const metadata = constructiveMetadataForItem(catalogItem); + assert( + metadata?.family === 'app-kit', + `${route.id} root ${root} is not catalogued in the app-kit family.` + ); + assertConstructiveRegistryMetadata( + metadata, + `${route.id} root ${root}.meta.constructive`, + root + ); + assert( + selectsStarter ? metadata.kind === 'starter' : metadata.kind !== 'starter', + `${route.id} root ${root} has incompatible starter metadata.` + ); + selectedMetadata.push({ root, metadata }); + } + for (const [briefField, metadataField] of [ + ['dataShapes', 'dataShapes'], + ['userIntents', 'intents'], + ['capabilities', 'capabilities'] + ]) { + const selectedVocabulary = new Set( + selectedMetadata.flatMap(({ metadata }) => metadata[metadataField]) + ); + for (const value of route[briefField]) { + assert( + selectedVocabulary.has(value), + `${route.id}.${briefField} value ${value} is not declared by a selected root's meta.constructive.${metadataField}.` + ); + } + for (const { root, metadata } of selectedMetadata) { + assert( + metadata[metadataField].some((value) => route[briefField].includes(value)), + `${route.id} root ${root} has no ${briefField} evidence grounded in meta.constructive.${metadataField}.` + ); + } + } + assert( + route.forbiddenRoots.includes('feature-pack-data') && + route.forbiddenRoots.includes('console-kit-nextjs'), + `${route.id} must reject the Sheets and Console defaults.` + ); + assert( + route.expectedRoots.every((root) => !route.forbiddenRoots.includes(root)), + `${route.id} contains a root in both expectedRoots and forbiddenRoots.` + ); + if (!route.starterRequested) { + assert( + route.forbiddenRoots.includes('app-kit-event-studio'), + `${route.id} must explicitly forbid the Event Studio starter by default.` + ); + } + } + assert( + cases.get('event-studio-opt-in')?.backendPreset === 'b2b:storage', + 'Event Studio must pair with the supported b2b:storage preset.' + ); + return cases; +} + +function nodeTypeName(node) { + return typeof node === 'string' ? node : node?.$type; +} + +export function assertEventStudioBlueprint(definition) { + assertObject(definition, 'Event Studio blueprint'); + assert(Array.isArray(definition.tables), 'Event Studio blueprint tables must be an array.'); + assert(Array.isArray(definition.relations), 'Event Studio blueprint relations must be an array.'); + const tableByName = byName( + definition.tables.map((table) => ({ ...table, name: table.table_name })), + 'Event Studio table' + ); + assertExact( + Array.from(tableByName.keys()), + ['programs', 'sessions', 'people', 'venues', 'session_people'], + 'Event Studio table order' + ); + const expectedFields = { + programs: ['name', 'description', 'status', 'starts_on', 'ends_on'], + sessions: [ + 'title', + 'description', + 'status', + 'starts_at', + 'ends_at', + 'capacity', + 'tags' + ], + people: ['display_name', 'email', 'role'], + venues: ['name', 'address', 'time_zone', 'capacity'], + session_people: ['role'] + }; + + const source = JSON.stringify(definition); + assert(!source.includes('DataRealtime'), 'Event Studio V1 must not enable realtime.'); + assert(!/"realtime"\s*:/iu.test(source), 'Event Studio V1 must not declare realtime configuration.'); + assert(!/"(?:raw_?sql|sql|migrations?)"\s*:/iu.test(source), 'Event Studio must use blueprint nodes rather than raw SQL.'); + + for (const table of definition.tables) { + assertExact( + table.fields?.map((field) => field.name), + expectedFields[table.table_name], + `${table.table_name} fields` + ); + assert(table.use_rls === true, `${table.table_name} must enable RLS.`); + assert(Array.isArray(table.nodes), `${table.table_name}.nodes must be an array.`); + assert(nodeTypeName(table.nodes[0]) === 'DataId', `${table.table_name} must start with DataId.`); + const membershipNode = table.nodes.find( + (node) => nodeTypeName(node) === 'DataEntityMembership' + ); + assert( + membershipNode?.data?.entity_field_name === 'org_id', + `${table.table_name} must be org-scoped through DataEntityMembership.` + ); + const authenticatedGrant = table.grants?.find( + (grant) => grant.roles?.includes('authenticated') + ); + assert(authenticatedGrant, `${table.table_name} must grant the authenticated role.`); + const grantedPrivileges = new Set( + authenticatedGrant.privileges?.map((entry) => entry[0]) + ); + assertExact( + Array.from(grantedPrivileges), + ['select', 'insert', 'update', 'delete'], + `${table.table_name} authenticated grants` + ); + const memberPolicy = table.policies?.find( + (policy) => + policy.$type === 'AuthzEntityMembership' && + policy.data?.entity_field === 'org_id' && + policy.data?.membership_type === 2 && + policy.data?.is_admin === undefined && + policy.data?.is_owner === undefined + ); + assertExact( + memberPolicy?.privileges, + ['select', 'insert', 'update'], + `${table.table_name} member privileges` + ); + for (const roleFlag of ['is_admin', 'is_owner']) { + const destructivePolicy = table.policies?.find( + (policy) => + policy.$type === 'AuthzEntityMembership' && + policy.data?.entity_field === 'org_id' && + policy.data?.membership_type === 2 && + policy.data?.[roleFlag] === true + ); + assertExact( + destructivePolicy?.privileges, + ['delete'], + `${table.table_name} ${roleFlag} delete policy` + ); + assert( + destructivePolicy?.policy_name === + (roleFlag === 'is_admin' ? 'admin_delete' : 'owner_delete'), + `${table.table_name} ${roleFlag} delete policy must have a distinct policy_name.` + ); + } + const policyNames = table.policies?.map( + (policy) => policy.policy_name ?? policy.$type + ); + assert( + new Set(policyNames).size === policyNames.length, + `${table.table_name} policy names must be unique.` + ); + } + + for (const tableName of ['programs', 'sessions']) { + const status = tableByName + .get(tableName) + ?.fields?.find((field) => field.name === 'status'); + assertExact( + status?.type, + { name: 'text' }, + `${tableName} status type` + ); + } + const tags = tableByName + .get('sessions') + ?.fields?.find((field) => field.name === 'tags'); + assertExact( + tags?.type, + { name: 'text', array_dimensions: 1 }, + 'sessions tags type' + ); + + const relationCoordinates = definition.relations.map( + (relation) => + `${relation.source_table}.${relation.field_name}->${relation.target_table}` + ); + assertExact( + relationCoordinates, + [ + 'sessions.program_id->programs', + 'sessions.venue_id->venues', + 'session_people.session_id->sessions', + 'session_people.person_id->people' + ], + 'Event Studio relations' + ); + assertExact( + definition.relations.map((relation) => relation.delete_action), + ['r', 'n', 'c', 'c'], + 'Event Studio relation delete actions' + ); + assertExact( + definition.unique_constraints, + [ + { + table_name: 'session_people', + columns: ['session_id', 'person_id'] + } + ], + 'Event Studio relation uniqueness' + ); +} + function assertExact(actual, expected, label) { assert( isDeepStrictEqual(actual, expected), @@ -2066,6 +2452,89 @@ function registryContentKey(registryItem, sourcePath) { return registryItem + '\0' + sourcePath; } +function appKitRegistryItems(catalogItems) { + const catalogByName = byName(catalogItems, 'Registry catalog item'); + const collected = new Map(); + const visit = (name, ancestry = []) => { + assert( + !ancestry.includes(name), + `App Kit registry dependency cycle: ${ancestry.concat(name).join(' -> ')}.` + ); + if (collected.has(name)) return; + const item = catalogByName.get(name); + assert(item, `App Kit registry closure references missing item ${name}.`); + collected.set(name, item); + for (const dependency of item.registryDependencies) { + const prefix = `${PINNED.registryNamespace}/`; + assert( + dependency.startsWith(prefix) && dependency.length > prefix.length, + `${name} has unsupported registry dependency ${dependency}.` + ); + visit(dependency.slice(prefix.length), ancestry.concat(name)); + } + }; + for (const name of APP_KIT_ROOT_NAMES) visit(name); + return Array.from(collected.values()).sort((left, right) => + left.name.localeCompare(right.name) + ); +} + +export function collectAttestedRegistrySources(plans, catalogItems) { + const sources = new Map(); + const add = (registryItem, sourcePath, type) => { + const key = registryContentKey(registryItem, sourcePath); + const existing = sources.get(key); + assert( + !existing || existing.type === type, + `Registry content source type conflict for ${registryItem}/${sourcePath}.` + ); + if (!existing) sources.set(key, { registryItem, path: sourcePath, type }); + }; + for (const plan of plans.values()) { + for (const file of plan.composition.files) { + for (const source of file.sources) { + add(source.registryItem, source.path, file.type); + } + } + } + for (const item of appKitRegistryItems(catalogItems)) { + for (const file of item.files) add(item.name, file.path, file.type); + } + return Array.from(sources.values()).sort((left, right) => + `${left.registryItem}/${left.path}`.localeCompare(`${right.registryItem}/${right.path}`) + ); +} + +export function collectAttestedExternalPackages(snapshot, plans, catalogItems) { + const firstParty = new Set(snapshot.release.packages.map((entry) => entry.name)); + const requirements = new Map(); + const add = (specifier) => { + const requirement = parseNpmPackageRequirement(specifier); + if (firstParty.has(requirement.name)) return; + assert( + requirement.requested === null || requirement.exactVersion !== null, + `External package ${requirement.name} uses unsupported non-exact requirement ${requirement.requested}.` + ); + const versions = requirements.get(requirement.name) ?? new Set(); + versions.add(requirement.exactVersion); + requirements.set(requirement.name, versions); + }; + for (const plan of plans.values()) { + for (const dependency of plan.composition.npmDependencies) add(dependency.name); + } + for (const item of appKitRegistryItems(catalogItems)) { + for (const dependency of item.dependencies) add(dependency); + } + return Array.from(requirements, ([name, versions]) => { + const exactVersions = Array.from(versions).filter((version) => version !== null); + assert( + new Set(exactVersions).size <= 1, + `Package ${name} has conflicting exact requirements.` + ); + return { name, exactVersion: exactVersions[0] ?? null }; + }).sort((left, right) => left.name.localeCompare(right.name)); +} + function sourceMap(snapshot) { return new Map( snapshot.source.attestations.canonicalFiles.map((record) => [ @@ -2300,7 +2769,10 @@ function assertRelease(snapshot, sources) { assert(snapshot.release.publicRegistryReady === false, 'Public registry must remain branch-only.'); assert(snapshot.release.packageManager === PINNED.packageManager, 'release.packageManager drifted.'); assert(snapshot.release.nodeEngine === PINNED.nodeEngine, 'release.nodeEngine drifted.'); - assert(snapshot.release.shadcnVersion === PINNED.shadcnVersion, 'release.shadcnVersion drifted.'); + assert( + snapshot.release.testedShadcnVersion === PINNED.testedShadcnVersion, + 'release.testedShadcnVersion drifted.' + ); assert(Array.isArray(snapshot.release.packages), 'release.packages must be an array.'); assert(snapshot.release.packages.length === PACKAGE_RELEASES.length, 'release.packages count drifted.'); for (let index = 0; index < PACKAGE_RELEASES.length; index += 1) { @@ -2361,7 +2833,7 @@ function assertRelease(snapshot, sources) { 'pnpm --dir pack:local', 'pnpm --dir local:registry', 'python3 -m http.server', - 'shadcn@4.13.1' + 'shadcn@4.16.1' ]) { assert(commands.includes(required), `Local consumption is missing ${required}.`); } @@ -2385,6 +2857,33 @@ function assertRelease(snapshot, sources) { 'pnpm --dir /apps/registry exec shadcn add @constructive/{name} --cwd --yes', 'Local install command template drifted.' ); + assert( + snapshot.release.localConsumption.testedInstallCommandTemplate === + `pnpm dlx shadcn@${PINNED.testedShadcnVersion} add ${PINNED.registryNamespace}/{name}`, + 'Exact tested install command template drifted.' + ); +} + +function assertAppKitDocumentation(snapshot, sources) { + assertObject(snapshot.documentation, 'documentation'); + assertObject(snapshot.documentation.appKit, 'documentation.appKit'); + const documentation = snapshot.documentation.appKit; + assertObject(documentation.public, 'documentation.appKit.public'); + assert( + documentation.public.url === PINNED.appKitDocsUrl, + 'App Kit public documentation URL drifted.' + ); + assert( + documentation.public.status === + (snapshot.release.publicRegistryReady ? 'available' : 'future-only'), + 'App Kit public documentation status must follow publicRegistryReady.' + ); + assertSourceLink( + documentation.pinnedSource, + PINNED.appKitDocsPath, + sources, + 'App Kit pinned documentation source' + ); } function assertMetaAndStandaloneContracts(snapshot, sources) { @@ -3060,10 +3559,22 @@ export function assertSnapshot(snapshot) { assertObject(snapshot.registry, 'registry'); assert(snapshot.registry.namespace === PINNED.registryNamespace, 'registry.namespace drifted.'); assert(snapshot.registry.urlTemplate === PINNED.registryUrl, 'registry.urlTemplate drifted.'); - assert(snapshot.registry.shadcnVersion === PINNED.shadcnVersion, 'registry.shadcnVersion drifted.'); assert( - snapshot.registry.shadcnVersionPolicy === 'exact', - 'registry.shadcnVersionPolicy must be exact.' + snapshot.registry.publicShadcnTag === PINNED.publicShadcnTag, + 'registry.publicShadcnTag drifted.' + ); + assert( + snapshot.registry.publicInstallCommandTemplate === + `pnpm dlx shadcn@${PINNED.publicShadcnTag} add ${PINNED.registryNamespace}/{name}`, + 'registry.publicInstallCommandTemplate drifted.' + ); + assert( + snapshot.registry.testedShadcnVersion === PINNED.testedShadcnVersion, + 'registry.testedShadcnVersion drifted.' + ); + assert( + snapshot.registry.testedShadcnVersionPolicy === 'exact', + 'registry.testedShadcnVersionPolicy must be exact.' ); assert( !Object.hasOwn(snapshot.registry, 'minimumShadcnVersion'), @@ -3127,7 +3638,7 @@ export function assertSnapshot(snapshot) { assertStringArray(item.featurePacks, `${item.name}.featurePacks`); assertStringArray(item.presetProfiles, `${item.name}.presetProfiles`); const command = - `pnpm dlx shadcn@${PINNED.shadcnVersion} add ${PINNED.registryNamespace}/${item.name}`; + `pnpm dlx shadcn@${PINNED.testedShadcnVersion} add ${PINNED.registryNamespace}/${item.name}`; assert(item.installCommand === command, `${item.name} install command drifted.`); } for (const packId of PACK_IDS) { @@ -3194,6 +3705,7 @@ export function assertSnapshot(snapshot) { ); assertRelease(snapshot, sources); + assertAppKitDocumentation(snapshot, sources); assertExact( snapshot.adapterContractProfiles, ADAPTER_CONTRACT_PROFILES, @@ -3281,6 +3793,14 @@ export function projectRegistryCatalog(registry) { type: file.type, target: file.target ?? null })); + const constructive = item.meta?.constructive; + if (constructive !== undefined) { + assertConstructiveRegistryMetadata( + constructive, + `${item.name}.meta.constructive`, + item.name + ); + } return { name: item.name, type: item.type, @@ -3292,8 +3812,11 @@ export function projectRegistryCatalog(registry) { devDependencies: item.devDependencies ?? [], registryDependencies: item.registryDependencies ?? [], files, + ...(constructive === undefined + ? {} + : { meta: { constructive } }), installCommand: - `pnpm dlx shadcn@${PINNED.shadcnVersion} add ${PINNED.registryNamespace}/${item.name}` + `pnpm dlx shadcn@${PINNED.testedShadcnVersion} add ${PINNED.registryNamespace}/${item.name}` }; }); return { @@ -3330,6 +3853,25 @@ export function assertRegistryCatalog(catalog, snapshot) { assertStringArray(item.dependencies, `${item.name}.dependencies`); assertStringArray(item.devDependencies, `${item.name}.devDependencies`); assertStringArray(item.registryDependencies, `${item.name}.registryDependencies`); + if (item.meta !== undefined) { + assertObject(item.meta, `${item.name}.meta`); + assert( + Object.keys(item.meta).length === 1 && item.meta.constructive, + `${item.name}.meta may contain only the portable constructive contract.` + ); + assertConstructiveRegistryMetadata( + item.meta.constructive, + `${item.name}.meta.constructive`, + item.name + ); + for (const compatibleItem of item.meta.constructive.compatibleWith ?? []) { + assert( + APP_KIT_ROOT_NAMES.includes(compatibleItem) && + itemByName.has(compatibleItem), + `${item.name}.meta.constructive.compatibleWith references unknown App Kit root ${compatibleItem}.` + ); + } + } assert(Array.isArray(item.files), `${item.name}.files must be an array.`); for (const file of item.files) { assertObject(file, `${item.name} file`); @@ -3338,7 +3880,7 @@ export function assertRegistryCatalog(catalog, snapshot) { assertNullableString(file.target, `${item.name} file.target`); } const command = - `pnpm dlx shadcn@${PINNED.shadcnVersion} add ${PINNED.registryNamespace}/${item.name}`; + `pnpm dlx shadcn@${PINNED.testedShadcnVersion} add ${PINNED.registryNamespace}/${item.name}`; assert(item.installCommand === command, `${item.name} catalog install command drifted.`); for (const dependency of item.registryDependencies) { if (!dependency.startsWith(`${PINNED.registryNamespace}/`)) continue; @@ -3346,6 +3888,21 @@ export function assertRegistryCatalog(catalog, snapshot) { assert(itemByName.has(dependencyName), `${item.name} references unknown registry item ${dependency}.`); } } + const namedAppKitRoots = catalog.items + .filter((item) => APP_KIT_ROOT_NAMES.includes(item.name)) + .map((item) => item.name); + assertExact( + namedAppKitRoots.slice().sort(), + APP_KIT_ROOT_NAMES.slice().sort(), + 'App Kit registry root set' + ); + for (const rootName of APP_KIT_ROOT_NAMES) { + assert( + constructiveMetadataForItem(itemByName.get(rootName))?.family === + 'app-kit', + `${rootName} is missing versioned meta.constructive.` + ); + } for (const name of [ 'constructive-theme', 'button', @@ -3491,24 +4048,12 @@ export function validateSkillArtifacts(snapshot, root = skillDirectory) { registryContent.recordCount === registryContent.records.length, 'Registry content recordCount is inconsistent.' ); - const expectedSources = new Map(); - for (const plan of planByItem.values()) { - for (const file of plan.composition.files) { - for (const source of file.sources) { - const key = registryContentKey(source.registryItem, source.path); - const expected = expectedSources.get(key); - if (expected) { - assert(expected.type === file.type, 'Registry content source type conflicts across install plans.'); - } else { - expectedSources.set(key, { - registryItem: source.registryItem, - path: source.path, - type: file.type - }); - } - } - } - } + const expectedSources = new Map( + collectAttestedRegistrySources(planByItem, catalog.items).map((source) => [ + registryContentKey(source.registryItem, source.path), + source + ]) + ); const contentBySource = new Map(); for (const record of registryContent.records) { assertObject(record, 'Registry content record'); @@ -3525,7 +4070,7 @@ export function validateSkillArtifacts(snapshot, root = skillDirectory) { } assert( contentBySource.size === expectedSources.size, - 'Registry content must exactly cover every install-plan source.' + 'Registry content must exactly cover every Console-plan and App Kit source.' ); const packageResolutionsPath = assertAttestedFile( root, @@ -3555,15 +4100,11 @@ export function validateSkillArtifacts(snapshot, root = skillDirectory) { packageResolutions.recordCount === packageResolutions.records.length, 'Package resolutions recordCount is inconsistent.' ); - const firstPartyPackages = new Set(snapshot.release.packages.map((entry) => entry.name)); - const expectedExternalPackages = new Set(); - for (const plan of planByItem.values()) { - for (const dependency of plan.composition.npmDependencies) { - if (!firstPartyPackages.has(dependency.name)) { - expectedExternalPackages.add(dependency.name); - } - } - } + const expectedExternalPackages = new Map( + collectAttestedExternalPackages(snapshot, planByItem, catalog.items).map( + ({ name, exactVersion }) => [name, new Set([exactVersion])] + ) + ); const packageByName = new Map(); for (const record of packageResolutions.records) { assertObject(record, 'Package resolution record'); @@ -3575,6 +4116,18 @@ export function validateSkillArtifacts(snapshot, root = skillDirectory) { expectedExternalPackages.has(record.name), 'Package resolutions contain unexpected package ' + record.name + '.' ); + const exactVersions = Array.from(expectedExternalPackages.get(record.name)) + .filter((version) => version !== null); + assert( + new Set(exactVersions).size <= 1, + `Package ${record.name} has conflicting exact requirements.` + ); + if (exactVersions.length === 1) { + assert( + record.version === exactVersions[0], + `Package ${record.name} must resolve exact requested version ${exactVersions[0]}.` + ); + } assert(!packageByName.has(record.name), 'Duplicate package resolution ' + record.name + '.'); let resolvedUrl; try { @@ -3612,6 +4165,8 @@ export function parseArguments(arguments_) { let blocksRepo = null; let help = false; let query = null; + let registryCapability = null; + let registryFamily = null; let registryType = null; let sourcePreflight = false; for (let index = 0; index < arguments_.length; index += 1) { @@ -3660,11 +4215,35 @@ export function parseArguments(arguments_) { index += 1; continue; } + if (argument === '--family') { + assert(registryFamily === null, '--family may be provided only once.'); + const value = arguments_[index + 1]; + assert(value && !value.startsWith('-'), '--family requires a registry family.'); + registryFamily = value; + index += 1; + continue; + } + if (argument === '--capability') { + assert( + registryCapability === null, + '--capability may be provided only once.' + ); + const value = arguments_[index + 1]; + assert( + value && !value.startsWith('-'), + '--capability requires a capability.' + ); + registryCapability = value; + index += 1; + continue; + } fail(`Unknown argument ${argument}.`); } assert( - registryType === null || query?.kind === 'list-registry', - '--type is valid only with --list-registry.' + [registryType, registryFamily, registryCapability].every( + (value) => value === null + ) || query?.kind === 'list-registry', + '--type, --family, and --capability are valid only with --list-registry.' ); assert( !sourcePreflight || blocksRepo !== null, @@ -3674,7 +4253,15 @@ export function parseArguments(arguments_) { !sourcePreflight || query === null, '--source-preflight cannot be combined with a query mode.' ); - return { blocksRepo, help, query, registryType, sourcePreflight }; + return { + blocksRepo, + help, + query, + registryCapability, + registryFamily, + registryType, + sourcePreflight + }; } function usage() { @@ -3687,7 +4274,7 @@ function usage() { ' node /absolute/path/to/check-blocks-contract.mjs --blocks-repo /absolute/path/to/blocks', ' node /absolute/path/to/check-blocks-contract.mjs --list-roots', ' node /absolute/path/to/check-blocks-contract.mjs --root preset-b2b-storage', - ' node /absolute/path/to/check-blocks-contract.mjs --list-registry [--type registry:block]', + ' node /absolute/path/to/check-blocks-contract.mjs --list-registry [--type registry:block] [--family app-kit] [--capability temporal]', ' node /absolute/path/to/check-blocks-contract.mjs --registry-item app-shell', '', 'Without --blocks-repo, validates the portable catalog, all 19 complete plans,', @@ -3811,29 +4398,69 @@ function runtimeStatusForRoot(item, snapshot) { function publicInstallForCommand(snapshot, command) { const available = snapshot.release.publicRegistryReady === true; + const testedPrefix = `pnpm dlx shadcn@${PINNED.testedShadcnVersion} add `; + assert( + command.startsWith(testedPrefix), + 'Public install projection requires an exact tested shadcn command.' + ); + const publicCommand = + `pnpm dlx shadcn@${PINNED.publicShadcnTag} add ${command.slice(testedPrefix.length)}`; return { status: available ? 'available' : 'blocked', availability: available ? 'released' : 'future-only', - command, + command: publicCommand, reason: available ? null : 'The pinned Blocks source is branch-only and its public registry artifacts are not released.' }; } +function appKitDocumentationForQuery(snapshot) { + const documentation = snapshot.documentation.appKit; + const available = snapshot.release.publicRegistryReady === true; + return { + authority: available + ? { + kind: 'public-url', + url: documentation.public.url + } + : { + kind: 'pinned-source', + sourceCommit: snapshot.source.commit, + path: documentation.pinnedSource.path, + sha256: documentation.pinnedSource.sha256 + }, + public: { + status: available ? 'available' : 'future-only', + url: available ? documentation.public.url : null + }, + pinnedSource: { + sourceCommit: snapshot.source.commit, + path: documentation.pinnedSource.path, + sha256: documentation.pinnedSource.sha256 + } + }; +} + function installabilityEnvelope(snapshot) { const local = snapshot.release.localConsumption; + const publicAvailable = snapshot.release.publicRegistryReady === true; return { releaseStatus: snapshot.release.status, publicRegistryReady: snapshot.release.publicRegistryReady, + appKitDocumentation: appKitDocumentationForQuery(snapshot), publicInstall: { - status: 'blocked', - availability: 'future-only', - commandTemplate: local.installCommandTemplate, - reason: 'The pinned Blocks source is branch-only and its public registry artifacts are not released.' + status: publicAvailable ? 'available' : 'blocked', + availability: publicAvailable ? 'released' : 'future-only', + commandTemplate: snapshot.registry.publicInstallCommandTemplate, + reason: publicAvailable + ? null + : 'The pinned Blocks source is branch-only and its public registry artifacts are not released.' }, pinnedLocalConsumption: { sourceCommit: snapshot.source.commit, + testedShadcnVersion: snapshot.registry.testedShadcnVersion, + testedInstallCommandTemplate: local.testedInstallCommandTemplate, acceptedCheckoutStates: snapshot.source.acceptedCheckoutStates, workflow: local.bootstrapSequence, installCommandTemplate: local.localInstallCommandTemplate, @@ -3884,6 +4511,20 @@ function metaContractForItem(snapshot, itemName) { return snapshot.metaContract; } +function registryDocsForQuery(item, snapshot, docs) { + if ( + snapshot.release.publicRegistryReady === true || + constructiveMetadataForItem(item)?.family !== 'app-kit' || + typeof docs !== 'string' + ) { + return docs; + } + return docs.replace( + `Guide: ${PINNED.appKitDocsUrl}`, + 'Guide: resolve installability.appKitDocumentation.authority from this validated query.' + ); +} + function registryItemForQuery(item, snapshot) { const override = registryQueryOverride(snapshot, item.name); const installRoot = snapshot.items.find( @@ -3896,17 +4537,19 @@ function registryItemForQuery(item, snapshot) { reason: override.reason }] : []; + const docs = override ? override.portableValue : item.docs; return { name: item.name, type: item.type, title: item.title, description: item.description, categories: item.categories, - docs: override ? override.portableValue : item.docs, + docs: registryDocsForQuery(item, snapshot, docs), dependencies: item.dependencies, devDependencies: item.devDependencies, registryDependencies: item.registryDependencies, files: item.files, + meta: item.meta ?? null, publicInstall: publicInstallForCommand(snapshot, item.installCommand), portableOverrides, sourceLimitations: sourceLimitationsForRoot(snapshot, item.name), @@ -3967,6 +4610,59 @@ function adapterProfilesForBindings(snapshot, bindings) { }; } +export function filterRegistryItems(items, filters = {}) { + const { + type = null, + family = null, + capability = null + } = filters; + return items.filter((item) => { + const constructive = constructiveMetadataForItem(item); + return ( + (!type || item.type === type) && + (!family || constructive?.family === family) && + (!capability || constructive?.capabilities?.includes(capability)) + ); + }); +} + +function sortedUnique(values) { + return Array.from(new Set(values)).sort(); +} + +export function validateRegistryFilters(items, filters = {}) { + const { family = null, capability = null } = filters; + const catalogued = items.filter( + (item) => constructiveMetadataForItem(item) !== null + ); + const families = sortedUnique( + catalogued.map((item) => constructiveMetadataForItem(item).family) + ); + if (family) { + assert( + families.includes(family), + `Unknown registry family ${family}. Available families: ${families.join(', ') || '(none)'}.` + ); + } + const familyItems = family + ? catalogued.filter( + (item) => constructiveMetadataForItem(item).family === family + ) + : catalogued; + const capabilities = sortedUnique( + familyItems.flatMap( + (item) => constructiveMetadataForItem(item).capabilities ?? [] + ) + ); + if (capability) { + assert( + capabilities.includes(capability), + `Unknown registry capability ${capability}${family ? ` for family ${family}` : ''}. Available capabilities: ${capabilities.join(', ') || '(none)'}.` + ); + } + return { families, capabilities }; +} + function queryOutput(options, loaded) { if (!options.query) return null; switch (options.query.kind) { @@ -4061,8 +4757,17 @@ function queryOutput(options, loaded) { `Unknown registry type ${options.registryType}.` ); } - const selected = loaded.artifacts.catalog.items.filter( - (item) => !options.registryType || item.type === options.registryType + validateRegistryFilters(loaded.artifacts.catalog.items, { + family: options.registryFamily, + capability: options.registryCapability + }); + const selected = filterRegistryItems( + loaded.artifacts.catalog.items, + { + type: options.registryType, + family: options.registryFamily, + capability: options.registryCapability + } ).map((item) => registryItemForQuery(item, loaded.snapshot)); return { schemaVersion: 1, @@ -4071,7 +4776,9 @@ function queryOutput(options, loaded) { installability: installabilityEnvelope(loaded.snapshot), metaContract: loaded.snapshot.metaContract, filter: { - type: options.registryType + type: options.registryType, + family: options.registryFamily, + capability: options.registryCapability }, itemCount: selected.length, items: selected.map((item) => ({ @@ -4081,6 +4788,7 @@ function queryOutput(options, loaded) { description: item.description, categories: item.categories, docs: item.docs, + meta: item.meta, publicInstall: item.publicInstall, runtimeStatus: item.runtimeStatus, sourceLimitationIds: item.sourceLimitations.map( @@ -4154,7 +4862,7 @@ function assertLiveRelease(blocksRepo) { 'Blocks registry package.json' ); assert( - registryPackage.devDependencies?.shadcn === PINNED.shadcnVersion, + registryPackage.devDependencies?.shadcn === PINNED.workspaceShadcnVersion, 'Live shadcn registry dependency drifted.' ); for (const expected of PACKAGE_RELEASES) { @@ -4667,15 +5375,23 @@ export function assertBlocksSource(snapshot, artifacts, blocksRepo) { ); const liveList = runBlocksInspector(blocksRepo, ['--list']); + const normalizedLiveItems = liveList.items.map((item) => ({ + ...item, + installCommand: pinInspectorInstallCommand(item.installCommand, item.name) + })); assert(liveList.schemaVersion === snapshot.source.inspector.schemaVersion, 'Live inspector schemaVersion drifted.'); assert(liveList.kind === snapshot.source.inspector.kind, 'Live inspector kind drifted.'); - assertExact(liveList.items, snapshot.items, 'Live inspector install roots'); + assertExact(normalizedLiveItems, snapshot.items, 'Live inspector install roots'); for (const item of snapshot.items) { const livePlan = runBlocksInspector( blocksRepo, ['--item', item.name, '--compact'] ); + livePlan.install.command = pinInspectorInstallCommand( + livePlan.install.command, + item.name + ); assertExact( livePlan, artifacts.planByItem.get(item.name), @@ -4722,9 +5438,22 @@ export function loadPortableContract() { const snapshot = readJson(snapshotPath, snapshotPath); assertSnapshot(snapshot); const artifacts = validateSkillArtifacts(snapshot); + const briefRoutes = readJson(briefRoutesPath, briefRoutesPath); + const briefRouteById = assertBriefRoutes( + briefRoutes, + artifacts.catalog.items + ); + const eventStudioBlueprint = readJson( + eventStudioBlueprintPath, + eventStudioBlueprintPath + ); + assertEventStudioBlueprint(eventStudioBlueprint); return { snapshot, - artifacts + artifacts, + briefRoutes, + briefRouteById, + eventStudioBlueprint }; } diff --git a/.agents/skills/constructive-blocks/scripts/check-blocks-contract.test.mjs b/.agents/skills/constructive-blocks/scripts/check-blocks-contract.test.mjs index ce65a78..164177c 100644 --- a/.agents/skills/constructive-blocks/scripts/check-blocks-contract.test.mjs +++ b/.agents/skills/constructive-blocks/scripts/check-blocks-contract.test.mjs @@ -1,15 +1,34 @@ import assert from 'node:assert/strict'; -import { execFileSync } from 'node:child_process'; -import { readFileSync } from 'node:fs'; +import { execFileSync, spawnSync } from 'node:child_process'; +import { + mkdirSync, + mkdtempSync, + readFileSync, + rmSync, + writeFileSync +} from 'node:fs'; +import { tmpdir } from 'node:os'; import path from 'node:path'; import test from 'node:test'; import { fileURLToPath } from 'node:url'; import { + assertBriefRoutes, + assertEventStudioBlueprint, assertSnapshot, + filterRegistryItems, loadPortableContract, - parseArguments + parseNpmPackageRequirement, + parseArguments, + pinInspectorInstallCommand, + projectRegistryCatalog, + validateRegistryFilters } from './check-blocks-contract.mjs'; +import { + changedReplacementPaths, + parseArguments as parseSyncArguments, + repinContract +} from './sync-blocks-contract.mjs'; const scriptDirectory = path.dirname(fileURLToPath(import.meta.url)); const checker = path.join(scriptDirectory, 'check-blocks-contract.mjs'); @@ -17,6 +36,147 @@ const runtimeReference = path.join( scriptDirectory, '../references/runtime-contract.md' ); +const briefRoutesReference = path.join( + scriptDirectory, + '../references/brief-to-roots.v1.json' +); +const registryCatalogReference = path.join( + scriptDirectory, + '../references/registry-catalog.v1.json' +); + +test('transactional Blocks contract synchronizer requires an explicit checkout', () => { + assert.deepEqual( + parseSyncArguments(['--blocks-repo', '/tmp/blocks', '--check']), + { + blocksRepo: '/tmp/blocks', + check: true, + repin: false, + refreshPackageResolutions: false, + help: false + } + ); + assert.equal( + parseSyncArguments([ + '--blocks-repo', + '/tmp/blocks', + '--refresh-package-resolutions' + ]).refreshPackageResolutions, + true + ); + assert.equal( + parseSyncArguments(['--blocks-repo', '/tmp/blocks', '--repin']).repin, + true + ); + assert.throws( + () => parseSyncArguments([]), + /--blocks-repo is required/ + ); + assert.throws( + () => parseSyncArguments(['--blocks-repo', '/tmp/blocks', '--check', '--check']), + /--check may be provided only once/ + ); + assert.throws( + () => parseSyncArguments(['--blocks-repo', '/tmp/blocks', '--unknown']), + /Unknown argument --unknown/ + ); +}); + +test('transactional Blocks contract synchronizer repins only release coordinates', () => { + const current = { + source: { commit: 'old' }, + release: { + testedShadcnVersion: '0.0.0', + localConsumption: { testedInstallCommandTemplate: 'old command' } + }, + registry: { testedShadcnVersion: '0.0.0' }, + preserved: { value: true } + }; + + assert.deepEqual(repinContract(current), { + source: { commit: '1a72e5d95f7ce4a243cd4536ed78c638708d538c' }, + release: { + testedShadcnVersion: '4.16.1', + localConsumption: { + testedInstallCommandTemplate: + 'pnpm dlx shadcn@4.16.1 add @constructive/{name}' + } + }, + registry: { testedShadcnVersion: '4.16.1' }, + preserved: { value: true } + }); + assert.equal(current.source.commit, 'old'); +}); + +test('synchronizer check mode detects generated artifact drift', () => { + const stageRoot = mkdtempSync(path.join(tmpdir(), 'blocks-contract-stage-')); + const currentRoot = mkdtempSync(path.join(tmpdir(), 'blocks-contract-current-')); + const contract = { source: { attestations: { installPlans: [] } } }; + const generatedPaths = [ + 'references/registry-catalog.v1.json', + 'references/registry-content.v1.json', + 'references/package-resolutions.v1.json', + 'references/install-roots.v1.json' + ]; + try { + for (const relativePath of generatedPaths) { + for (const root of [stageRoot, currentRoot]) { + const filePath = path.join(root, relativePath); + mkdirSync(path.dirname(filePath), { recursive: true }); + writeFileSync(filePath, 'same\n'); + } + } + assert.deepEqual(changedReplacementPaths(stageRoot, contract, currentRoot), []); + writeFileSync( + path.join(stageRoot, 'references/registry-catalog.v1.json'), + 'changed\n' + ); + assert.deepEqual(changedReplacementPaths(stageRoot, contract, currentRoot), [ + 'references/registry-catalog.v1.json' + ]); + } finally { + rmSync(stageRoot, { recursive: true, force: true }); + rmSync(currentRoot, { recursive: true, force: true }); + } +}); + +test('npm dependency requirements preserve exact versions while canonicalizing names', () => { + assert.deepEqual(parseNpmPackageRequirement('@constructive-io/data@^0.5.0'), { + name: '@constructive-io/data', + requested: '^0.5.0', + exactVersion: null + }); + assert.deepEqual(parseNpmPackageRequirement('@tanstack/react-table@9.0.0-beta.58'), { + name: '@tanstack/react-table', + requested: '9.0.0-beta.58', + exactVersion: '9.0.0-beta.58' + }); + assert.deepEqual(parseNpmPackageRequirement('lucide-react'), { + name: 'lucide-react', + requested: null, + exactVersion: null + }); + assert.equal( + pinInspectorInstallCommand( + 'pnpm dlx shadcn@latest add @constructive/app-kit-data', + 'app-kit-data' + ), + 'pnpm dlx shadcn@4.16.1 add @constructive/app-kit-data' + ); + assert.throws( + () => pinInspectorInstallCommand( + 'pnpm dlx shadcn@next add @constructive/app-kit-data', + 'app-kit-data' + ), + /inspector install command changed/ + ); +}); + +function appKitCatalogFixture() { + return JSON.parse(readFileSync(registryCatalogReference, 'utf8')).items.filter( + (item) => item.meta?.constructive?.family === 'app-kit' + ); +} function runQuery(arguments_) { const output = execFileSync(process.execPath, [checker].concat(arguments_), { @@ -27,17 +187,381 @@ function runQuery(arguments_) { return JSON.parse(output); } +function runQueryFailure(arguments_) { + const result = spawnSync(process.execPath, [checker].concat(arguments_), { + cwd: '/', + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'pipe'] + }); + assert.notEqual(result.status, 0, `Expected query to fail: ${arguments_.join(' ')}`); + return result.stderr; +} + test('portable artifacts validate as one complete contract', () => { const loaded = loadPortableContract(); - assert.equal(loaded.snapshot.registry.catalog.itemCount, 102); + assert.equal(loaded.snapshot.registry.catalog.itemCount, 123); assert.equal(loaded.snapshot.items.length, 19); assert.equal(loaded.artifacts.planByItem.size, 19); - assert.equal(loaded.artifacts.catalog.items.length, 102); - assert.equal(loaded.artifacts.registryContent.records.length, 138); - assert.equal(loaded.artifacts.contentBySource.size, 138); - assert.equal(loaded.artifacts.packageResolutions.records.length, 10); - assert.equal(loaded.artifacts.packageByName.size, 10); + assert.equal( + loaded.artifacts.catalog.items.length, + loaded.snapshot.registry.catalog.itemCount + ); + assert.equal( + loaded.artifacts.registryContent.records.length, + loaded.artifacts.registryContent.recordCount + ); + assert.equal( + loaded.artifacts.contentBySource.size, + loaded.artifacts.registryContent.recordCount + ); + assert.equal( + loaded.artifacts.packageResolutions.records.length, + loaded.artifacts.packageResolutions.recordCount + ); + assert.equal( + loaded.artifacts.packageByName.size, + loaded.artifacts.packageResolutions.recordCount + ); assert.equal(loaded.snapshot.sourceLimitations.length, 15); + assert.equal(loaded.briefRouteById.size, 7); + assert.equal(loaded.eventStudioBlueprint.tables.length, 5); + for (const rootName of [ + 'app-kit-core', + 'app-kit-data', + 'app-kit-board', + 'app-kit-dashboard', + 'app-kit-calendar', + 'app-kit-workflow', + 'app-kit-event-studio' + ]) { + const item = loaded.artifacts.catalog.items.find( + (candidate) => candidate.name === rootName + ); + assert.ok(item, `Missing ${rootName} from the registry catalog.`); + for (const file of item.files) { + assert.ok( + loaded.artifacts.contentBySource.has(`${rootName}\0${file.path}`), + `Missing content attestation for ${rootName}/${file.path}.` + ); + } + } + for (const packageName of [ + '@tanstack/charts', + '@tanstack/charts-scales', + '@tanstack/react-charts', + 'd3-scale' + ]) { + assert.ok( + loaded.artifacts.packageByName.has(packageName), + `Missing package attestation for ${packageName}.` + ); + } +}); + +test('App Kit catalog filters use meta.constructive without a parallel root list', () => { + const metadata = (overrides) => ({ + version: 1, + family: 'app-kit', + kind: 'view', + boundary: 'client', + provider: 'app-kit', + dataShapes: ['collection'], + intents: ['inspect'], + capabilities: ['records'], + ...overrides + }); + const items = [ + { + name: 'app-kit-data', + type: 'registry:block', + meta: { constructive: metadata({ capabilities: ['records', 'relations'] }) } + }, + { + name: 'app-kit-calendar', + type: 'registry:block', + meta: { constructive: metadata({ dataShapes: ['temporal'], capabilities: ['temporal'] }) } + }, + { + name: 'feature-pack-data', + type: 'registry:block' + } + ]; + assert.deepEqual( + filterRegistryItems(items, { family: 'app-kit' }).map((item) => item.name), + ['app-kit-data', 'app-kit-calendar'] + ); + assert.deepEqual( + filterRegistryItems(items, { capability: 'temporal' }).map((item) => item.name), + ['app-kit-calendar'] + ); + assert.deepEqual( + filterRegistryItems(items, { + type: 'registry:block', + family: 'app-kit', + capability: 'relations' + }).map((item) => item.name), + ['app-kit-data'] + ); + assert.deepEqual(validateRegistryFilters(items), { + families: ['app-kit'], + capabilities: ['records', 'relations', 'temporal'] + }); + assert.deepEqual(validateRegistryFilters(items, { family: 'app-kit' }), { + families: ['app-kit'], + capabilities: ['records', 'relations', 'temporal'] + }); + assert.throws( + () => validateRegistryFilters(items, { family: 'application-kit' }), + /Unknown registry family application-kit.*Available families: app-kit/ + ); + assert.throws( + () => validateRegistryFilters(items, { + family: 'app-kit', + capability: 'time-range' + }), + /Unknown registry capability time-range for family app-kit/ + ); + + const options = parseArguments([ + '--list-registry', + '--family', + 'app-kit', + '--capability', + 'temporal' + ]); + assert.equal(options.registryFamily, 'app-kit'); + assert.equal(options.registryCapability, 'temporal'); + assert.throws( + () => parseArguments(['--registry-item', 'app-kit-data', '--family', 'app-kit']), + /valid only with --list-registry/ + ); + + const registryItem = { + name: 'app-kit-data', + type: 'registry:block', + title: 'App Kit Data', + description: 'Typed application data views.', + meta: { + constructive: metadata({ + kind: 'resource', + boundary: 'mixed', + capabilities: ['records', 'relations'] + }) + } + }; + const projection = projectRegistryCatalog({ items: [registryItem] }); + assert.deepEqual( + projection.items[0].meta.constructive, + registryItem.meta.constructive + ); + const invalid = structuredClone(registryItem); + delete invalid.meta.constructive.provider; + assert.throws( + () => projectRegistryCatalog({ items: [invalid] }), + /provider must be app-kit/ + ); + const invalidFamily = structuredClone(registryItem); + invalidFamily.meta.constructive.family = 'platform'; + assert.throws( + () => projectRegistryCatalog({ items: [invalidFamily] }), + /family must be app-kit/ + ); + const invalidRoot = structuredClone(registryItem); + invalidRoot.name = 'app-kit-map'; + assert.throws( + () => projectRegistryCatalog({ items: [invalidRoot] }), + /without being an App Kit install root/ + ); +}); + +test('loaded catalog backs validated App Kit family and capability queries', () => { + const family = runQuery(['--list-registry', '--family', 'app-kit']); + assert.deepEqual( + family.items.map((item) => item.name), + [ + 'app-kit-core', + 'app-kit-data', + 'app-kit-board', + 'app-kit-dashboard', + 'app-kit-calendar', + 'app-kit-workflow', + 'app-kit-event-studio' + ] + ); + for (const item of family.items) { + assert.doesNotMatch( + item.docs, + /constructive-io\.github\.io\/blocks\/blocks\/app-kit/ + ); + assert.match(item.docs, /appKitDocumentation\.authority/); + } + const temporal = runQuery([ + '--list-registry', + '--family', + 'app-kit', + '--capability', + 'temporal' + ]); + assert.deepEqual( + temporal.items.map((item) => item.name), + ['app-kit-calendar'] + ); + assert.match( + runQueryFailure(['--list-registry', '--family', 'application-kit']), + /Unknown registry family application-kit.*Available families: app-kit/ + ); + assert.match( + runQueryFailure([ + '--list-registry', + '--family', + 'app-kit', + '--capability', + 'time-range' + ]), + /Unknown registry capability time-range for family app-kit/ + ); +}); + +test('brief routes select App Kit by shape instead of Sheets, Console, or review queues', () => { + const briefRoutes = JSON.parse(readFileSync(briefRoutesReference, 'utf8')); + const catalogItems = appKitCatalogFixture(); + const briefRouteById = assertBriefRoutes(briefRoutes, catalogItems); + for (const route of briefRoutes.cases) { + assert.equal( + route.expectedRoots[0], + route.starterRequested ? 'app-kit-event-studio' : 'app-kit-core' + ); + assert.ok(route.expectedRoots.every((root) => root.startsWith('app-kit-'))); + assert.ok(route.forbiddenRoots.includes('feature-pack-data')); + assert.ok(route.forbiddenRoots.includes('console-kit-nextjs')); + if (!route.starterRequested) { + assert.ok(route.forbiddenRoots.includes('app-kit-event-studio')); + } + } + assert.ok( + briefRouteById.get('intake-approval').forbiddenAssumptions.includes( + 'review-queue-default' + ) + ); + assert.deepEqual( + briefRouteById.get('event-planning').expectedRoots, + [ + 'app-kit-core', + 'app-kit-data', + 'app-kit-board', + 'app-kit-dashboard', + 'app-kit-calendar', + 'app-kit-workflow' + ] + ); + assert.equal( + briefRouteById.get('event-planning').starterRequested, + false + ); + assert.deepEqual( + briefRouteById.get('event-studio-opt-in').expectedRoots, + ['app-kit-event-studio'] + ); + assert.equal( + briefRouteById.get('event-studio-opt-in').starterRequested, + true + ); + assert.equal( + briefRouteById.get('event-studio-opt-in').backendPreset, + 'b2b:storage' + ); + + const missingOptIn = structuredClone(briefRoutes); + missingOptIn.cases.find((route) => route.id === 'event-studio-opt-in') + .starterRequested = false; + assert.throws( + () => assertBriefRoutes(missingOptIn, catalogItems), + /only with explicit starterRequested opt-in/ + ); + + const unknownCapability = structuredClone(briefRoutes); + unknownCapability.cases.find((route) => route.id === 'service-desk') + .capabilities.push('spatial'); + assert.throws( + () => assertBriefRoutes(unknownCapability, catalogItems), + /capabilities value spatial is not declared by a selected root/ + ); + + const emptyDataShapes = structuredClone(briefRoutes); + emptyDataShapes.cases.find((route) => route.id === 'service-desk') + .dataShapes = []; + assert.throws( + () => assertBriefRoutes(emptyDataShapes, catalogItems), + /service-desk\.dataShapes must not be empty/ + ); + + const unsupportedDashboard = structuredClone(briefRoutes); + unsupportedDashboard.cases.find((route) => route.id === 'service-desk') + .expectedRoots.splice(2, 0, 'app-kit-dashboard'); + assert.throws( + () => assertBriefRoutes(unsupportedDashboard, catalogItems), + /app-kit-dashboard has no dataShapes evidence grounded in meta\.constructive\.dataShapes/ + ); +}); + +test('Event Studio remains a public org-scoped blueprint without realtime or raw SQL', () => { + const loaded = loadPortableContract(); + assertEventStudioBlueprint(loaded.eventStudioBlueprint); + + const realtimeMutation = structuredClone(loaded.eventStudioBlueprint); + realtimeMutation.tables[0].nodes.push('DataRealtime'); + assert.throws( + () => assertEventStudioBlueprint(realtimeMutation), + /must not enable realtime/ + ); + + const deleteMutation = structuredClone(loaded.eventStudioBlueprint); + deleteMutation.tables[0].policies = deleteMutation.tables[0].policies.filter( + (policy) => policy.data?.is_owner !== true + ); + assert.throws( + () => assertEventStudioBlueprint(deleteMutation), + /is_owner delete policy/ + ); + + const policyNameMutation = structuredClone(loaded.eventStudioBlueprint); + const mutatedPolicies = policyNameMutation.tables[0].policies; + mutatedPolicies.find((policy) => policy.data?.is_owner === true).policy_name = + 'admin_delete'; + assert.throws( + () => assertEventStudioBlueprint(policyNameMutation), + /distinct policy_name|policy names must be unique/ + ); + + const fieldMutation = structuredClone(loaded.eventStudioBlueprint); + fieldMutation.tables.find((table) => table.table_name === 'sessions') + .fields.find((field) => field.name === 'description').name = 'summary'; + assert.throws( + () => assertEventStudioBlueprint(fieldMutation), + /sessions fields drifted/ + ); + + const uniquenessMutation = structuredClone(loaded.eventStudioBlueprint); + uniquenessMutation.unique_constraints = []; + assert.throws( + () => assertEventStudioBlueprint(uniquenessMutation), + /Event Studio relation uniqueness drifted/ + ); + + const deleteActionMutation = structuredClone(loaded.eventStudioBlueprint); + deleteActionMutation.relations[0].delete_action = 'RESTRICT'; + assert.throws( + () => assertEventStudioBlueprint(deleteActionMutation), + /relation delete actions drifted/ + ); + + const statusMutation = structuredClone(loaded.eventStudioBlueprint); + statusMutation.tables.find((table) => table.table_name === 'sessions') + .fields.find((field) => field.name === 'status').type.name = 'session_status'; + assert.throws( + () => assertEventStudioBlueprint(statusMutation), + /sessions status type drifted/ + ); }); test('module endpoint and adapter drift fail closed', () => { @@ -97,13 +621,20 @@ test('standalone Data conditional configuration remains complete and exact', () ); }); -test('the shadcn CLI policy remains an exact pin', () => { +test('public shadcn latest stays separate from the exact tested CLI version', () => { const loaded = loadPortableContract(); const mutation = structuredClone(loaded.snapshot); - mutation.registry.shadcnVersionPolicy = 'minimum'; + mutation.registry.testedShadcnVersionPolicy = 'minimum'; assert.throws( () => assertSnapshot(mutation), - /shadcnVersionPolicy must be exact/ + /testedShadcnVersionPolicy must be exact/ + ); + + const publicMutation = structuredClone(loaded.snapshot); + publicMutation.registry.publicShadcnTag = '4.13.1'; + assert.throws( + () => assertSnapshot(publicMutation), + /publicShadcnTag drifted/ ); const legacyMutation = structuredClone(loaded.snapshot); @@ -114,6 +645,29 @@ test('the shadcn CLI policy remains an exact pin', () => { ); }); +test('App Kit documentation follows the release gate and pins local source', () => { + const loaded = loadPortableContract(); + assert.equal(loaded.snapshot.documentation.appKit.public.status, 'future-only'); + assert.equal( + loaded.snapshot.documentation.appKit.pinnedSource.path, + 'apps/blocks/src/app/blocks/app-kit/page.tsx' + ); + + const statusMutation = structuredClone(loaded.snapshot); + statusMutation.documentation.appKit.public.status = 'available'; + assert.throws( + () => assertSnapshot(statusMutation), + /public documentation status must follow publicRegistryReady/ + ); + + const sourceMutation = structuredClone(loaded.snapshot); + sourceMutation.documentation.appKit.pinnedSource.path = 'README.md'; + assert.throws( + () => assertSnapshot(sourceMutation), + /pinned documentation source\.path drifted/ + ); +}); + test('fresh-checkout bootstrap preflights tracked source before generation', () => { const loaded = loadPortableContract(); const sequence = loaded.snapshot.release.localConsumption.bootstrapSequence; @@ -265,7 +819,7 @@ test('query mode validates first and is independent of the current directory', ( assert.equal(item.name, 'app-shell'); assert.equal( item.publicInstall.command, - 'pnpm dlx shadcn@4.13.1 add @constructive/app-shell' + 'pnpm dlx shadcn@latest add @constructive/app-shell' ); assert.equal(item.publicInstall.status, 'blocked'); assert.equal(item.publicInstall.availability, 'future-only'); @@ -335,11 +889,23 @@ test('every query mode exposes the same branch-only installability gate', () => assert.equal(gate.publicInstall.availability, 'future-only'); assert.match( gate.publicInstall.commandTemplate, - /shadcn@4\.13\.1 add @constructive\/\{name\}/ + /shadcn@latest add @constructive\/\{name\}/ + ); + assert.equal(gate.appKitDocumentation.authority.kind, 'pinned-source'); + assert.equal( + gate.appKitDocumentation.authority.path, + 'apps/blocks/src/app/blocks/app-kit/page.tsx' ); + assert.equal(gate.appKitDocumentation.public.status, 'future-only'); + assert.equal(gate.appKitDocumentation.public.url, null); assert.equal( gate.pinnedLocalConsumption.sourceCommit, - '4f2a789fde9a90c0c6ed5977896493bb4818fa77' + '1a72e5d95f7ce4a243cd4536ed78c638708d538c' + ); + assert.equal(gate.pinnedLocalConsumption.testedShadcnVersion, '4.16.1'); + assert.match( + gate.pinnedLocalConsumption.testedInstallCommandTemplate, + /shadcn@4\.16\.1 add @constructive\/\{name\}/ ); assert.equal( gate.pinnedLocalConsumption.consumerIsolation.required, @@ -373,7 +939,7 @@ test('query surfaces expose only status-bearing publicInstall commands', () => { for (const publicInstall of publicInstalls) { assert.equal(publicInstall.status, 'blocked'); assert.equal(publicInstall.availability, 'future-only'); - assert.match(publicInstall.command, /^pnpm dlx shadcn@4\.13\.1 add @constructive\//); + assert.match(publicInstall.command, /^pnpm dlx shadcn@latest add @constructive\//); assert.match(publicInstall.reason, /branch-only/); } for (const item of rootList.items) { diff --git a/.agents/skills/constructive-blocks/scripts/sync-blocks-contract.mjs b/.agents/skills/constructive-blocks/scripts/sync-blocks-contract.mjs new file mode 100644 index 0000000..1aa8d85 --- /dev/null +++ b/.agents/skills/constructive-blocks/scripts/sync-blocks-contract.mjs @@ -0,0 +1,499 @@ +#!/usr/bin/env node + +import crypto from 'node:crypto'; +import { execFileSync } from 'node:child_process'; +import fs from 'node:fs'; +import path from 'node:path'; +import process from 'node:process'; +import { fileURLToPath, pathToFileURL } from 'node:url'; + +import { + assertBlocksSource, + assertSnapshot, + collectAttestedExternalPackages, + collectAttestedRegistrySources, + PINNED, + pinInspectorInstallCommand, + projectRegistryCatalog, + validateSkillArtifacts +} from './check-blocks-contract.mjs'; + +const scriptDirectory = path.dirname(fileURLToPath(import.meta.url)); +const skillDirectory = path.resolve(scriptDirectory, '..'); +const referencesDirectory = path.join(skillDirectory, 'references'); +const contractPath = path.join(referencesDirectory, 'install-roots.v1.json'); +const registryOrigin = 'https://registry.npmjs.org'; + +function fail(message) { + throw new Error(message); +} + +function readJson(filePath, label) { + try { + return JSON.parse(fs.readFileSync(filePath, 'utf8')); + } catch (cause) { + fail(`Unable to read ${label}: ${cause instanceof Error ? cause.message : String(cause)}`); + } +} + +function writeJson(filePath, value, spacing = 2) { + fs.mkdirSync(path.dirname(filePath), { recursive: true }); + fs.writeFileSync(filePath, `${JSON.stringify(value, null, spacing)}\n`, 'utf8'); +} + +function sha256File(filePath) { + return crypto.createHash('sha256').update(fs.readFileSync(filePath)).digest('hex'); +} + +function sha256Text(value) { + return crypto.createHash('sha256').update(value).digest('hex'); +} + +function refreshCanonicalSourceLinks(value, canonicalByPath, seen = new Set()) { + if (value === null || typeof value !== 'object' || seen.has(value)) return; + seen.add(value); + if ( + typeof value.path === 'string' && + typeof value.sha256 === 'string' && + canonicalByPath.has(value.path) + ) { + value.sha256 = canonicalByPath.get(value.path); + } + for (const child of Object.values(value)) { + refreshCanonicalSourceLinks(child, canonicalByPath, seen); + } +} + +function run(command, arguments_, label, options = {}) { + try { + return execFileSync(command, arguments_, { + encoding: 'utf8', + maxBuffer: 32 * 1024 * 1024, + stdio: options.inherit ? 'inherit' : ['ignore', 'pipe', 'pipe'] + }); + } catch (cause) { + const stderr = cause && typeof cause === 'object' && typeof cause.stderr === 'string' + ? cause.stderr.trim() + : ''; + fail(`${label} failed: ${stderr || (cause instanceof Error ? cause.message : String(cause))}`); + } +} + +function parseJsonCommand(command, arguments_, label) { + const stdout = run(command, arguments_, label); + try { + return JSON.parse(stdout); + } catch (cause) { + fail(`${label} did not emit JSON: ${cause instanceof Error ? cause.message : String(cause)}`); + } +} + +function assertCleanPinnedCheckout(contract, blocksRepo) { + if (!fs.existsSync(blocksRepo)) { + fail(`Blocks repository does not exist: ${blocksRepo}`); + } + const commit = run( + 'git', + ['-C', blocksRepo, 'rev-parse', 'HEAD'], + 'Resolving Blocks HEAD' + ).trim(); + if (commit !== contract.source.commit) { + fail(`Blocks HEAD ${commit} does not match pinned commit ${contract.source.commit}.`); + } + const status = run( + 'git', + ['-C', blocksRepo, 'status', '--porcelain=v1', '--untracked-files=all'], + 'Checking Blocks worktree' + ).trim(); + if (status.length > 0) { + fail(`Blocks worktree must be clean before regeneration:\n${status}`); + } +} + +export function parseArguments(arguments_) { + let blocksRepo = null; + let check = false; + let repin = false; + let refreshPackageResolutions = false; + let help = false; + + for (let index = 0; index < arguments_.length; index += 1) { + const argument = arguments_[index]; + if (argument === '--blocks-repo') { + if (blocksRepo !== null) fail('--blocks-repo may be provided only once.'); + const value = arguments_[index + 1]; + if (!value || value.startsWith('-')) fail('--blocks-repo requires a path.'); + blocksRepo = path.resolve(value); + index += 1; + } else if (argument === '--check') { + if (check) fail('--check may be provided only once.'); + check = true; + } else if (argument === '--repin') { + if (repin) fail('--repin may be provided only once.'); + repin = true; + } else if (argument === '--refresh-package-resolutions') { + if (refreshPackageResolutions) { + fail('--refresh-package-resolutions may be provided only once.'); + } + refreshPackageResolutions = true; + } else if (argument === '--help' || argument === '-h') { + help = true; + } else { + fail(`Unknown argument ${argument}.`); + } + } + if (!help && blocksRepo === null) fail('--blocks-repo is required.'); + return { blocksRepo, check, repin, refreshPackageResolutions, help }; +} + +function usage() { + return [ + 'Regenerate the derived Constructive Blocks skill contract transactionally.', + '', + 'Usage:', + ' node sync-blocks-contract.mjs --blocks-repo /absolute/path/to/blocks', + ' node sync-blocks-contract.mjs --blocks-repo /absolute/path/to/blocks --check', + ' node sync-blocks-contract.mjs --blocks-repo /absolute/path/to/blocks --repin', + ' node sync-blocks-contract.mjs --blocks-repo /absolute/path/to/blocks --refresh-package-resolutions', + '', + 'The Blocks checkout must be clean and exactly match the already-pinned commit.', + '--repin deliberately advances generated artifacts to the checker\'s reviewed', + 'commit and exact tested shadcn version before final staged validation.', + 'Without --check, generated catalog, plans, content, package snapshot, and', + 'attestations replace their checked-in counterparts only after staged validation.', + '--refresh-package-resolutions explicitly queries npm latest releases; without it,', + 'the existing exact package records are preserved and only their sourceCommit changes.' + ].join('\n'); +} + +export function repinContract(contract) { + const result = structuredClone(contract); + result.source.commit = PINNED.commit; + result.release.testedShadcnVersion = PINNED.testedShadcnVersion; + result.release.localConsumption.testedInstallCommandTemplate = + `pnpm dlx shadcn@${PINNED.testedShadcnVersion} add ${PINNED.registryNamespace}/{name}`; + result.registry.testedShadcnVersion = PINNED.testedShadcnVersion; + return result; +} + +function inspectorArguments(blocksRepo, arguments_) { + return ['--dir', blocksRepo, '--silent', 'console-kit:inspect', '--no-build'].concat(arguments_); +} + +function expectedRootNames(contract) { + return contract.source.attestations.installPlans.map((record) => record.item); +} + +function exactArray(actual, expected, label) { + if (JSON.stringify(actual) !== JSON.stringify(expected)) { + fail(`${label} changed. Update the checker invariants before regenerating this contract.`); + } +} + +function registryContent(blocksRepo, contract, plans, catalogItems) { + const cache = new Map(); + const records = collectAttestedRegistrySources(plans, catalogItems).map((source) => { + let item = cache.get(source.registryItem); + if (!item) { + item = readJson( + path.join(blocksRepo, 'apps', 'registry', 'public', 'r', `${source.registryItem}.json`), + `built registry item ${source.registryItem}` + ); + cache.set(source.registryItem, item); + } + const matches = Array.isArray(item.files) + ? item.files.filter((candidate) => candidate.path === source.path) + : []; + if (matches.length !== 1 || matches[0].type !== source.type || typeof matches[0].content !== 'string') { + fail(`Built registry item is missing exact source ${source.registryItem}/${source.path}.`); + } + return { + registryItem: source.registryItem, + path: source.path, + type: source.type, + contentSha256: sha256Text(matches[0].content) + }; + }); + return { + schemaVersion: 1, + kind: 'constructive.blocks-registry-content', + sourceCommit: contract.source.commit, + recordCount: records.length, + records + }; +} + +function preservedPackageResolutions(contract, packageRequirements) { + const current = readJson( + path.join(referencesDirectory, 'package-resolutions.v1.json'), + 'current package resolutions' + ); + const byName = new Map(current.records?.map((record) => [record.name, record])); + const records = packageRequirements.map(({ name, exactVersion }) => { + const record = byName.get(name); + if (!record) { + fail(`Package ${name} is newly required. Re-run with --refresh-package-resolutions to resolve it.`); + } + if (exactVersion !== null && record.version !== exactVersion) { + fail( + `Package ${name} must resolve ${exactVersion}. Re-run with --refresh-package-resolutions.` + ); + } + return record; + }); + return { + schemaVersion: 1, + kind: 'constructive.blocks-package-resolutions', + sourceCommit: contract.source.commit, + registry: registryOrigin, + recordCount: records.length, + records + }; +} + +async function refreshedPackageResolutions(contract, packageRequirements) { + const records = []; + for (const { name, exactVersion } of packageRequirements) { + const response = await fetch(`${registryOrigin}/${encodeURIComponent(name)}`, { + headers: { accept: 'application/vnd.npm.install-v1+json' } + }); + if (!response.ok) fail(`npm registry request failed for ${name} with HTTP ${response.status}.`); + const packument = await response.json(); + const version = exactVersion ?? packument?.['dist-tags']?.latest; + const release = typeof version === 'string' ? packument?.versions?.[version] : null; + const integrity = release?.dist?.integrity; + const resolved = release?.dist?.tarball; + if ( + typeof version !== 'string' || + !/^sha512-[A-Za-z0-9+/]+={0,2}$/.test(integrity) || + typeof resolved !== 'string' + ) { + fail(`npm registry metadata is incomplete for ${name}.`); + } + const url = new URL(resolved); + if (url.protocol !== 'https:' || url.hostname !== 'registry.npmjs.org') { + fail(`npm registry returned a non-canonical tarball URL for ${name}.`); + } + records.push({ name, version, integrity, resolved }); + } + return { + schemaVersion: 1, + kind: 'constructive.blocks-package-resolutions', + sourceCommit: contract.source.commit, + registry: registryOrigin, + recordCount: records.length, + records + }; +} + +function stagedContract(blocksRepo, stageReferences, contract, liveItems, plans, catalog, content, packages) { + const result = structuredClone(contract); + result.items = liveItems; + result.registry.catalog.itemCount = catalog.itemCount; + if (!result.registry.catalog.projection.includes('meta.constructive')) { + result.registry.catalog.projection.push('meta.constructive'); + } + for (const packageRecord of result.release.packages) { + const manifestPath = path.join(blocksRepo, packageRecord.manifestSource.path); + const manifest = readJson(manifestPath, `package manifest ${packageRecord.name}`); + if (manifest.name !== packageRecord.name || typeof manifest.version !== 'string') { + fail(`Package manifest identity drifted for ${packageRecord.name}.`); + } + packageRecord.version = manifest.version; + packageRecord.manifestSource.sha256 = sha256File(manifestPath); + } + const attestations = result.source.attestations; + attestations.aggregateRegistry.sha256 = sha256File( + path.join(blocksRepo, attestations.aggregateRegistry.path) + ); + for (const record of attestations.canonicalFiles) { + record.sha256 = sha256File(path.join(blocksRepo, record.path)); + } + refreshCanonicalSourceLinks( + result, + new Map(attestations.canonicalFiles.map((record) => [record.path, record.sha256])) + ); + + writeJson(path.join(stageReferences, 'registry-catalog.v1.json'), catalog, 0); + writeJson(path.join(stageReferences, 'registry-content.v1.json'), content); + writeJson(path.join(stageReferences, 'package-resolutions.v1.json'), packages); + for (const record of attestations.installPlans) { + writeJson( + path.join(stageReferences, record.path.slice('references/'.length)), + plans.get(record.item), + 0 + ); + } + + attestations.registryCatalog.sha256 = sha256File( + path.join(stageReferences, attestations.registryCatalog.path.slice('references/'.length)) + ); + attestations.registryContent.sha256 = sha256File( + path.join(stageReferences, attestations.registryContent.path.slice('references/'.length)) + ); + attestations.packageResolutions.sha256 = sha256File( + path.join(stageReferences, attestations.packageResolutions.path.slice('references/'.length)) + ); + for (const record of attestations.installPlans) { + record.sha256 = sha256File(path.join(stageReferences, record.path.slice('references/'.length))); + } + writeJson(path.join(stageReferences, 'install-roots.v1.json'), result); + return result; +} + +function replacementPaths(contract) { + return [ + 'references/registry-catalog.v1.json', + 'references/registry-content.v1.json', + 'references/package-resolutions.v1.json' + ].concat(contract.source.attestations.installPlans.map((record) => record.path)) + .concat(['references/install-roots.v1.json']); +} + +export function changedReplacementPaths(stageRoot, contract, currentRoot = skillDirectory) { + return replacementPaths(contract).filter((relativePath) => { + const staged = path.join(stageRoot, relativePath); + const current = path.join(currentRoot, relativePath); + return ( + !fs.existsSync(staged) || + !fs.existsSync(current) || + !fs.readFileSync(staged).equals(fs.readFileSync(current)) + ); + }); +} + +function replaceTransaction(stageRoot, contract, validate) { + const transactionRoot = fs.mkdtempSync(path.join(skillDirectory, '.sync-blocks-contract-')); + const backupRoot = path.join(transactionRoot, 'backup'); + const replaced = []; + try { + for (const relativePath of replacementPaths(contract)) { + const target = path.join(skillDirectory, relativePath); + const staged = path.join(stageRoot, relativePath); + const backup = path.join(backupRoot, relativePath); + fs.mkdirSync(path.dirname(backup), { recursive: true }); + fs.renameSync(target, backup); + try { + fs.renameSync(staged, target); + } catch (cause) { + fs.renameSync(backup, target); + throw cause; + } + replaced.push({ target, backup }); + } + validate(); + } catch (cause) { + for (const replacement of replaced.reverse()) { + if (fs.existsSync(replacement.target)) fs.rmSync(replacement.target); + if (fs.existsSync(replacement.backup)) fs.renameSync(replacement.backup, replacement.target); + } + throw cause; + } finally { + fs.rmSync(transactionRoot, { recursive: true, force: true }); + } +} + +async function main() { + const options = parseArguments(process.argv.slice(2)); + if (options.help) { + process.stdout.write(`${usage()}\n`); + return; + } + + const currentContract = readJson(contractPath, 'install-roots contract'); + const contract = options.repin ? repinContract(currentContract) : currentContract; + if (!options.repin) assertSnapshot(contract); + assertCleanPinnedCheckout(contract, options.blocksRepo); + run('pnpm', ['--dir', options.blocksRepo, 'build:registry'], 'Building Blocks registry', { + inherit: true + }); + + const liveList = parseJsonCommand( + 'pnpm', + inspectorArguments(options.blocksRepo, ['--list']), + 'Reading Blocks install roots' + ); + const normalizedLiveItems = liveList.items.map((item) => ({ + ...item, + installCommand: pinInspectorInstallCommand(item.installCommand, item.name) + })); + const rootNames = expectedRootNames(contract); + exactArray( + normalizedLiveItems.map((item) => item.name).sort(), + rootNames.slice().sort(), + 'Inspectable Blocks install-root set' + ); + + const plans = new Map(); + for (const name of rootNames) { + const plan = parseJsonCommand( + 'pnpm', + inspectorArguments(options.blocksRepo, ['--item', name, '--compact']), + `Reading Blocks install plan ${name}` + ); + plan.install.command = pinInspectorInstallCommand(plan.install.command, name); + plans.set(name, plan); + } + const aggregateRegistry = readJson( + path.join(options.blocksRepo, 'apps', 'registry', 'registry.json'), + 'built aggregate registry' + ); + const catalog = projectRegistryCatalog(aggregateRegistry); + const content = registryContent(options.blocksRepo, contract, plans, catalog.items); + const packageNames = collectAttestedExternalPackages(contract, plans, catalog.items); + const packages = options.refreshPackageResolutions + ? await refreshedPackageResolutions(contract, packageNames) + : preservedPackageResolutions(contract, packageNames); + + const stageRoot = fs.mkdtempSync(path.join(skillDirectory, '.sync-blocks-contract-stage-')); + try { + const stageReferences = path.join(stageRoot, 'references'); + fs.cpSync(referencesDirectory, stageReferences, { recursive: true }); + const nextContract = stagedContract( + options.blocksRepo, + stageReferences, + contract, + normalizedLiveItems, + plans, + catalog, + content, + packages + ); + assertSnapshot(nextContract); + const stagedArtifacts = validateSkillArtifacts(nextContract, stageRoot); + assertBlocksSource(nextContract, stagedArtifacts, options.blocksRepo); + + if (options.check) { + const drifted = changedReplacementPaths(stageRoot, contract); + if (drifted.length > 0) { + fail(`Blocks contract regeneration drifted:\n${drifted.join('\n')}`); + } + process.stdout.write( + `Blocks contract regeneration is current: ${catalog.itemCount} registry items, ${plans.size} install plans, ${content.recordCount} content attestations.\n` + ); + return; + } + replaceTransaction(stageRoot, contract, () => { + const written = readJson(contractPath, 'written install-roots contract'); + assertSnapshot(written); + const writtenArtifacts = validateSkillArtifacts(written); + assertBlocksSource(written, writtenArtifacts, options.blocksRepo); + }); + process.stdout.write( + `Regenerated Blocks contract: ${catalog.itemCount} registry items, ${plans.size} install plans, ${content.recordCount} content attestations.\n` + ); + } finally { + fs.rmSync(stageRoot, { recursive: true, force: true }); + } +} + +const isMain = + process.argv[1] && + pathToFileURL(path.resolve(process.argv[1])).href === import.meta.url; + +if (isMain) { + main().catch((cause) => { + process.stderr.write(`${cause instanceof Error ? cause.message : String(cause)}\n`); + process.exitCode = 1; + }); +} diff --git a/.agents/skills/constructive-blocks/scripts/sync-package-resolutions.mjs b/.agents/skills/constructive-blocks/scripts/sync-package-resolutions.mjs index 6aa0e90..56392c0 100644 --- a/.agents/skills/constructive-blocks/scripts/sync-package-resolutions.mjs +++ b/.agents/skills/constructive-blocks/scripts/sync-package-resolutions.mjs @@ -6,6 +6,8 @@ import path from 'node:path'; import process from 'node:process'; import { fileURLToPath } from 'node:url'; +import { parseNpmPackageRequirement } from './check-blocks-contract.mjs'; + const scriptDirectory = path.dirname(fileURLToPath(import.meta.url)); const skillDirectory = path.resolve(scriptDirectory, '..'); const referencesDirectory = path.join(skillDirectory, 'references'); @@ -27,22 +29,36 @@ function readJson(filePath, label) { function expectedExternalPackages(contract) { const firstParty = new Set(contract.release.packages.map((entry) => entry.name)); - const names = new Set(); + const requirements = new Map(); for (const attestation of contract.source.attestations.installPlans) { const plan = readJson( path.join(skillDirectory, attestation.path), 'install plan ' + attestation.item ); for (const dependency of plan.composition.npmDependencies) { - if (!firstParty.has(dependency.name)) { - names.add(dependency.name); + const requirement = parseNpmPackageRequirement(dependency.name); + if (firstParty.has(requirement.name)) continue; + if (requirement.requested !== null && requirement.exactVersion === null) { + fail( + 'External package ' + requirement.name + + ' uses unsupported non-exact requirement ' + requirement.requested + '.' + ); } + const versions = requirements.get(requirement.name) ?? new Set(); + versions.add(requirement.exactVersion); + requirements.set(requirement.name, versions); } } - return Array.from(names).sort((left, right) => left.localeCompare(right)); + return Array.from(requirements, ([name, versions]) => { + const exactVersions = Array.from(versions).filter((version) => version !== null); + if (new Set(exactVersions).size > 1) { + fail('Package ' + name + ' has conflicting exact requirements.'); + } + return { name, exactVersion: exactVersions[0] ?? null }; + }).sort((left, right) => left.name.localeCompare(right.name)); } -async function resolutionForPackage(name) { +async function resolutionForPackage(name, exactVersion) { const response = await fetch(registryOrigin + '/' + encodeURIComponent(name), { headers: { accept: 'application/vnd.npm.install-v1+json' } }); @@ -50,7 +66,7 @@ async function resolutionForPackage(name) { fail('npm registry request failed for ' + name + ' with HTTP ' + response.status + '.'); } const packument = await response.json(); - const version = packument?.['dist-tags']?.latest; + const version = exactVersion ?? packument?.['dist-tags']?.latest; const release = typeof version === 'string' ? packument?.versions?.[version] : null; const integrity = release?.dist?.integrity; const resolved = release?.dist?.tarball; @@ -74,10 +90,10 @@ async function resolutionForPackage(name) { } const contract = readJson(contractPath, 'install-roots contract'); -const names = expectedExternalPackages(contract); +const requirements = expectedExternalPackages(contract); const records = []; -for (const name of names) { - records.push(await resolutionForPackage(name)); +for (const { name, exactVersion } of requirements) { + records.push(await resolutionForPackage(name, exactVersion)); } const snapshot = { schemaVersion: 1, diff --git a/.agents/skills/constructive-features/SKILL.md b/.agents/skills/constructive-features/SKILL.md index 70ac7e3..2e1b2d1 100644 --- a/.agents/skills/constructive-features/SKILL.md +++ b/.agents/skills/constructive-features/SKILL.md @@ -1,6 +1,6 @@ --- name: constructive-features -description: "Route Constructive application capabilities to the correct Blocks feature pack and authoritative domain skill. Use when asked what Constructive supports, which feature pack provides data, auth, users, organizations, storage, billing, or notifications, whether to use Console Kit or a standalone pack, or which skill owns an application capability." +description: "Route Constructive application briefs to App Kit composition, optional Blocks platform-capability packs, and authoritative domain skills. Use when asked how to build an internal app from records, forms, dashboards, boards, calendars, or workflows; what Constructive supports; which feature pack provides auth, users, organizations, storage, billing, or notifications; or which skill owns a capability." metadata: author: constructive-io version: "2.0.0" @@ -8,18 +8,31 @@ metadata: # Constructive Features -Use this skill to translate product intent into a frontend feature-pack choice and the domain skill that owns the underlying behavior. Do not use it as an installation catalog: [`constructive-blocks`](../constructive-blocks/SKILL.md) owns exact registry roots, dependency closure, runtime contracts, and verification. +Translate product intent into an application-composition lane, optional +platform-capability surfaces, and the domain skill that owns backend behavior. +Do not use this as an installation catalog: [`constructive-blocks`](../constructive-blocks/SKILL.md) +owns exact roots, dependency closure, runtime contracts, and verification. -## When to Apply +## Route application composition first -Use this skill when: +1. Rewrite the brief as user intents, record/relationship shapes, + presentation geometry, and workflow behavior. Do not start from a + department name. +2. Activate `constructive-blocks` and query its validated App Kit catalog. + Match the returned metadata and inspect dependency closure instead of + maintaining a root map here. +3. Compare the selection with the deterministic fixtures in + [`constructive-blocks/references/brief-to-roots.v1.json`](../constructive-blocks/references/brief-to-roots.v1.json) + when auditing selection. +4. Activate [`constructive-frontend`](../constructive-frontend/SKILL.md) after + selection when the application needs custom visual composition. -- A user asks what Constructive can do or which skill covers a capability. -- An application brief needs feature-pack intent before installation is planned. -- You need to distinguish a standalone view, a selected Console Kit composition, and a complete Console Kit. -- A capability spans frontend presentation and backend behavior, and ownership needs to be made explicit. +Use the branch-aware App Kit documentation authority returned by the validated +Blocks catalog for exact contracts. Do not default to Sheets, Console Kit, a +dashboard, board, or review queue merely because the domain contains records or +statuses. -## Feature-Pack Router +## Route optional platform capabilities | Product intent | Blocks pack | Domain skills | |---|---|---| @@ -31,7 +44,9 @@ Use this skill when: | Manage plans, subscriptions, usage, entitlements, and credits | Billing (`billing`) | [`constructive-billing`](../constructive-billing/SKILL.md) | | Read and manage an application notification inbox | Notifications (`notifications`) | [`constructive-notifications`](../constructive-notifications/SKILL.md), [`constructive-realtime`](../constructive-realtime/SKILL.md) | -After selecting the product capability, activate `constructive-blocks` to choose and install its supported surface. Do not infer a registry root from the display name or maintain a copied list of registry dependencies here. +After selecting a platform capability, activate `constructive-blocks` to choose +and install its supported surface. Keep it orthogonal to the App Kit application +composition and do not infer a registry root from a display name. ## Surface Router @@ -41,7 +56,8 @@ After selecting the product capability, activate `constructive-blocks` to choose | “Match the console to an official backend preset” | `constructive-blocks` → official preset surface | | “Put these selected capabilities in Console Kit” | `constructive-blocks` → core plus selected Console modules | | “Embed this capability in my own screen” | `constructive-blocks` → standalone feature pack | -| “Build a bespoke domain page” | [`constructive-frontend`](../constructive-frontend/SKILL.md); follow its [current `_meta` guidance](../constructive-frontend/references/meta-forms.md), and use `constructive-codegen` only if a stable generated client is an explicit choice | +| “Build an application around my domain schema” | `constructive-blocks` → App Kit composition, then [`constructive-frontend`](../constructive-frontend/SKILL.md) for visual customization | +| “Build one bespoke domain page with no App Kit view fit” | [`constructive-frontend`](../constructive-frontend/SKILL.md); follow its [current `_meta` guidance](../constructive-frontend/references/meta-forms.md) | | “Assemble and acceptance-check this tenant frontend” | [`constructive-builder`](../constructive-builder/SKILL.md) with an existing app workspace and already-provisioned tenant | ## Rules @@ -50,7 +66,7 @@ After selecting the product capability, activate `constructive-blocks` to choose 2. **Keep installation and acceptance separate.** Sign-up, sign-in, CRUD, membership, and RLS checks are acceptance scenarios inside a capability, not feature-pack identifiers. 3. **Treat runtime evidence as authoritative for Console availability.** An installed Console module may be `ready`, `partial`, or `unavailable` for the active tenant and identity. A non-Data standalone pack instead renders the resources, policy, actions, and state supplied by its host; standalone Data validates its configured endpoint internally. 4. **Do not derive routes.** Pass explicit semantic endpoints through the tenant descriptor; never construct sibling hosts or use private routing headers for application UI. -5. **Do not require generated clients for Blocks.** Console Kit performs capability discovery, standalone Data uses `_meta` plus introspection through Sheets, and the other standalone packs use host-injected resources and actions. Code generation remains opt-in for stable custom-domain UI. +5. **Ground App Kit at build time.** Reconcile `_meta` with final executable GraphQL introspection, then emit explicit typed definitions through the selected SDK/ORM or GraphQL transport. Keep Console discovery and feature-pack host contracts separate from this application lane. ## Domain Skills Beyond Feature Packs diff --git a/.agents/skills/constructive-frontend/SKILL.md b/.agents/skills/constructive-frontend/SKILL.md index b95fabc..62b9eaa 100644 --- a/.agents/skills/constructive-frontend/SKILL.md +++ b/.agents/skills/constructive-frontend/SKILL.md @@ -1,6 +1,6 @@ --- name: constructive-frontend -description: "Build polished Constructive application UI with Constructive primitives, Tailwind CSS v4, app shell and app bar composition, CRUD Stack cards, and custom domain views. Use for visual composition, forms, overlays, layout, theming, accessibility, or bespoke domain UI. Use constructive-blocks for feature-pack and Console Kit installation/runtime work." +description: "Build and polish Constructive application UI with App Kit, Constructive primitives, Tailwind CSS v4, app shell composition, and optional Stack navigation. Use for visual composition, forms, record and collection views, overlays, layout, theming, accessibility, responsive behavior, or bespoke domain UI. Use constructive-blocks to select and install App Kit, platform feature packs, or Console Kit." metadata: author: constructive-io version: "2.0.0" @@ -8,7 +8,10 @@ metadata: # Constructive Frontend -Build and polish custom Constructive application UI. This skill owns visual composition and bespoke domain views; [`constructive-blocks`](../constructive-blocks/SKILL.md) owns the registry, feature packs, Console Kit, tenant descriptors, and runtime integration. +Build and polish custom Constructive application UI. This skill owns visual +composition and domain-specific presentation; [`constructive-blocks`](../constructive-blocks/SKILL.md) +owns App Kit contracts and installation, the registry, platform feature packs, +Console Kit, tenant descriptors, and runtime integration. ## When to Apply @@ -16,11 +19,14 @@ Use this skill when: - Composing pages with Constructive primitives, forms, overlays, tables, or navigation. - Customizing the app shell, app bar, typography, color, motion, responsive behavior, or accessibility. -- Building a bespoke domain screen that does not already exist as a feature pack. -- Creating CRUD actions with Stack cards. +- Composing or extending App Kit controlled views around a domain design. +- Building a bespoke domain screen that does not fit an App Kit view family. +- Choosing a route, page, dialog, or Stack card for record opening and CRUD. - Extending an installed block without changing its endpoint, session, discovery, or store contract. -Use `constructive-blocks` instead when choosing or installing a registry root, mounting Console Kit, supplying tenant endpoints, integrating a feature pack, or diagnosing `ready`, `partial`, or `unavailable` capability state. +Use `constructive-blocks` first when choosing or installing App Kit roots, +defining its resource/query/action boundary, mounting Console Kit, integrating a +feature pack, or diagnosing registry and runtime capability state. ## Pinned Distribution Boundary @@ -40,7 +46,7 @@ node /absolute/path/to/constructive-skills/.agents/skills/constructive-blocks/sc Then follow the pinned local-consumption workflow in [`constructive-blocks/references/runtime-contract.md`](../constructive-blocks/references/runtime-contract.md#pinned-local-consumption-before-release). It verifies the exact Blocks commit, builds local registries and packages, and -installs through shadcn `4.13.1` without treating localhost resolutions as +installs through shadcn `4.16.1` without treating localhost resolutions as release artifacts. Public registry and package installation becomes valid only after the Blocks snapshot says `publicRegistryReady: true` and its checker passes against that released source. @@ -56,7 +62,7 @@ install contract. ## UI Composition -Target Next.js 16 App Router with React Server Components, shadcn `4.13.1`, +Target Next.js 16 App Router with React Server Components, shadcn `4.16.1`, the `base-nova` style, Base UI primitives, Tailwind CSS v4, and Lucide icons. Interactive registry components carry `'use client'`; pages and layouts remain server components until they need browser state. Compose polymorphic Base UI @@ -75,29 +81,51 @@ state close to the component that owns it. ## Custom Domain Data -Start with the Data feature pack when the goal is generic application-table exploration or spreadsheet CRUD. It already uses the current `_meta` contract, standard introspection, explicit endpoints, and authenticated runtime evidence. - -For a bespoke domain screen: - -1. Receive the data endpoint and session through the host's tenant runtime; never derive a related hostname. -2. After the Blocks local package workflow has installed the pinned package, - import the current metadata query and compatibility helpers from - `@constructive-io/data` instead of copying a `_meta` query into the app. -3. Reconcile `_meta` schema facts with standard GraphQL introspection before constructing operations. -4. Treat runtime reads and mutations as the authority for grants and RLS; do not substitute an operator endpoint when rows are hidden. -5. Generate a client only when the domain schema is stable and compile-time types are worth the regeneration workflow. - -See [meta-forms.md](./references/meta-forms.md) for the custom-domain boundary. For optional generated clients, use [`constructive-codegen`](../constructive-codegen/SKILL.md), [`constructive-orm`](../constructive-orm/SKILL.md), or [`constructive-hooks`](../constructive-hooks/SKILL.md). - -## CRUD Stack Cards - -Use Stack cards for focused create, edit, and delete workflows that benefit from maintaining page context. Keep destructive confirmation explicit and preserve mobile sheet behavior. - -See [crud-stack.md](./references/crud-stack.md) for the card API and composition pattern. Use the Data feature pack rather than recreating a generic metadata-driven CRUD stack. +Start with App Kit when the goal is an application around domain records, +relations, actions, aggregates, boards, or time ranges. Read its +[composition](../constructive-blocks/references/app-composition.md), +[resource contract](../constructive-blocks/references/app-resource-contract.md), +and [view patterns](../constructive-blocks/references/app-view-patterns.md), then +use the branch-aware App Kit documentation authority returned by the validated +Blocks catalog for exact APIs before styling the result. + +Use the Data feature pack when the goal is generic application-table +exploration or spreadsheet-style inline CRUD. It owns its separate Sheets +metadata and state boundary; do not use it as the default for a domain app. + +For an App Kit screen: + +1. Receive endpoint and authenticated scope through the host; never derive a + related hostname. +2. Reconcile `_meta` with final GraphQL introspection during generation/build + and follow the canonical resource-validation procedure. +3. Inject abortable SDK, ORM, or GraphQL transport at the documented boundary; + do not make views discover schema at runtime. +4. Preserve the selected controlled/connected ownership when changing visual + composition, and treat runtime reads and mutations as authority for grants + and RLS. + +Use [meta-forms.md](./references/meta-forms.md) only for a bespoke dynamic +metadata surface outside App Kit. For generated clients, use +[`constructive-codegen`](../constructive-codegen/SKILL.md), +[`constructive-orm`](../constructive-orm/SKILL.md), or +[`constructive-hooks`](../constructive-hooks/SKILL.md). + +## Optional CRUD Stack Cards + +Use Stack cards only when a focused create, edit, detail, or delete flow benefits +from maintaining page context. Keep record opening host-controlled so the same +resource can use a route, dedicated page, dialog, or Stack adapter. Preserve +explicit destructive confirmation and mobile sheet behavior when Stack is +selected. + +See [crud-stack.md](./references/crud-stack.md) for the optional adapter pattern. +Use App Kit data views for typed domain CRUD and the Data feature pack for +generic spreadsheet exploration rather than recreating either inside a card. ## Cross-References -- [`constructive-blocks`](../constructive-blocks/SKILL.md) — exact registry roots, feature packs, Console Kit, runtime, and verification. +- [`constructive-blocks`](../constructive-blocks/SKILL.md) — App Kit contracts, exact registry roots, platform feature packs, Console Kit, runtime, and verification. - [`constructive-builder`](../constructive-builder/SKILL.md) — agent-driven tenant frontend assembly and acceptance against an already-provisioned tenant. - [`constructive-security`](../constructive-security/SKILL.md) — RLS and authorization behavior behind application UI. - [`constructive-platform`](../constructive-platform/SKILL.md) — public API and deployment configuration. diff --git a/.agents/skills/constructive-frontend/references/crud-stack.md b/.agents/skills/constructive-frontend/references/crud-stack.md index 7264af6..cd3524b 100644 --- a/.agents/skills/constructive-frontend/references/crud-stack.md +++ b/.agents/skills/constructive-frontend/references/crud-stack.md @@ -1,17 +1,24 @@ --- name: constructive-crud-stack -description: Build custom-domain CRUD actions as Stack cards with typed card props, deferred loading, and stacked confirmation. Use the Data feature pack for generic metadata-driven CRUD. +description: Adapt focused custom-domain CRUD and record details to optional Stack cards with typed card props, deferred loading, and stacked confirmation. Keep App Kit record opening host-controlled and use the Data feature pack only for generic spreadsheet CRUD. --- # Constructive CRUD Stack Cards -Build any create/edit/delete action as a slide-in Stack card. Cancel/Save/Delete CTAs live in a sticky footer. Cards stack naturally — e.g., pushing a confirm-delete card on top of an edit card. +Use this pattern only after the host chooses Stack as its record-opening +presentation. A route, dedicated page, or dialog may fit the same resource +better. Keep `onOpenRecord` host-controlled so changing that presentation does +not change the App Kit resource contract. + +When Stack is selected, render a focused create/edit/delete flow as a slide-in +card with sticky actions. Cards can compose, such as pushing destructive +confirmation over an edit card. --- -## 1. Stack Card Trigger +## 1. Optional Stack Card Adapter -Every CRUD action opens a card. Push it from any button, row click, or link: +Adapt the host callback from any button, row, or link: ```tsx 'use client'; @@ -245,11 +252,11 @@ stack.push({ ## 8. Data boundary -Use Stack cards for bespoke domain workflows whose field layout and validation -belong to the application. Use the Data feature pack when the goal is generic -metadata-driven table CRUD; it already owns the current `_meta` contract, -standard-introspection reconciliation, row identity, pagination, mutation -generation, and RLS-aware failure states. +Use Stack cards for focused domain workflows whose field layout and validation +belong to the application. Keep App Kit data views in control of typed resource +identity, queries, forms, relations, semantic actions, and URL state; the Stack +adapter owns presentation only. Use the Data feature pack when the goal is +generic spreadsheet-style table CRUD. If a custom Stack card still needs runtime metadata, follow [meta-forms.md](./meta-forms.md): import the contract from diff --git a/.agents/skills/constructive-frontend/references/ui-foundations.md b/.agents/skills/constructive-frontend/references/ui-foundations.md index e1625a5..c217fe7 100644 --- a/.agents/skills/constructive-frontend/references/ui-foundations.md +++ b/.agents/skills/constructive-frontend/references/ui-foundations.md @@ -1,7 +1,7 @@ # Constructive UI foundations Build custom UI on the same foundation as the pinned Blocks source: Next.js 16 -App Router, React Server Components, shadcn `4.13.1` with `base-nova`, Base UI, +App Router, React Server Components, shadcn `4.16.1` with `base-nova`, Base UI, Tailwind CSS v4, OKLCH semantic tokens, and Lucide icons. The current UI package and registry are branch-only. Complete the diff --git a/.agents/skills/constructive-frontend/references/ui-registry.md b/.agents/skills/constructive-frontend/references/ui-registry.md index fac4d35..0474a3b 100644 --- a/.agents/skills/constructive-frontend/references/ui-registry.md +++ b/.agents/skills/constructive-frontend/references/ui-registry.md @@ -24,7 +24,7 @@ node /absolute/path/to/constructive-skills/.agents/skills/constructive-blocks/sc Run the source preflight, local builds, package registry, block registry, and consumer verification exactly as documented in [`runtime-contract.md`](../../constructive-blocks/references/runtime-contract.md#pinned-local-consumption-before-release). -That workflow uses shadcn `4.13.1`, preserves the consumer's aliases, and keeps +That workflow uses shadcn `4.16.1`, preserves the consumer's aliases, and keeps temporary localhost package resolutions out of committed lockfiles. ## Source or package ownership @@ -44,6 +44,6 @@ also declare current Constructive packages. Public installation is allowed only when a deliberately updated Blocks snapshot points to a released commit, sets `publicRegistryReady: true`, and passes the full checker. At that point, use the exact namespace and -`installCommand` returned by the validated catalog. Remove local registry -settings, regenerate the lockfile from public registries, and reject every -localhost resolution before committing. +status-bearing `shadcn@latest` `publicInstall.command` returned by the validated +catalog. Remove local registry settings, regenerate the lockfile from public +registries, and reject every localhost resolution before committing. diff --git a/.agents/skills/constructive-troubleshooting/SKILL.md b/.agents/skills/constructive-troubleshooting/SKILL.md index bd6c024..84a99b3 100644 --- a/.agents/skills/constructive-troubleshooting/SKILL.md +++ b/.agents/skills/constructive-troubleshooting/SKILL.md @@ -53,7 +53,7 @@ When you run into issues, read this document for known problems and solutions. - No QueryClient set (SDK hooks vs app react-query instance; prefer generating SDK inside app) - No redirect after login / no Sidebar entry (router.push in onSuccess, add links in sidebar) - UI component import wrong (`@constructive-io/ui/*` vs template `@/components/ui/*`) - - Use Stack when template has it (do not create Dialog for CRUD — check `ls .../ui/stack` first; see constructive-frontend / CRUD Stack) + - Record-opening surface does not match the host choice (route, page, dialog, or optional Stack adapter; see constructive-frontend / CRUD Stack) - SDK query result fields nullable (type errors in form/handler — use `?? ''` or accept nullable type) - Invalid UUID error on create/update (relation field `isRequired: false` missing) - Used confirm() or alert() for delete (must use template AlertDialog from `@/components/ui/alert-dialog`) @@ -1901,28 +1901,35 @@ TypeScript compiles and the update mutation succeeds at runtime. --- -## Phase 3: Use Stack when template has it (do not create Dialog for CRUD panels) +## Phase 3: Preserve the host-selected record-opening surface ### Problem -You added or imported a generic Dialog (e.g. `@/components/ui/dialog`) for create/edit panels, and the template already has `@/components/ui/stack`. UI works but does not match the template’s intended pattern (slide-in Stack cards). +You hard-coded a Dialog or Stack card for record details and CRUD even though +the application brief or existing host adapter selected another presentation. ### Cause -SKILL.md Phase 3.5 requires: **before any CRUD UI**, check whether the template has Stack (`ls packages/app/src/components/ui/stack`). If it exists, you must use **Stack Cards** (constructive-frontend / CRUD Stack), not a generic Dialog. +The record-opening boundary was treated as a component default. App Kit keeps +`onOpenRecord` host-controlled so routes, dedicated pages, dialogs, and Stack +cards can share the same typed resource. ### Solution -1. Run `ls packages/app/src/components/ui/stack` (or your app path). If the directory exists: -2. Read the **constructive-frontend** skill (CRUD Stack section). -3. Implement create/edit/delete with `useCardStack()`, `card.push()`, and `CardComponent`. Use stacked confirm-delete for delete, not a separate Dialog. -4. Do not create or import `@/components/ui/dialog` for CRUD when Stack exists. - -If the template has **no** Stack, then use the template’s Dialog/AlertDialog from `@/components/ui/*`. +1. Read the application brief and existing navigation adapter before choosing a + presentation. +2. Keep App Kit `onOpenRecord` host-controlled. +3. If the host selects Stack, read the **constructive-frontend** CRUD Stack + reference and adapt with `useCardStack()`, `card.push()`, and + `CardComponent`. +4. If the host selects a route, page, or dialog, preserve that choice and use + the installed primitives. Keep destructive confirmation explicit in every + presentation. ### Verification -Create/edit/delete use slide-in panels (Stack) when the template has `ui/stack`; no generic Dialog is used for CRUD. +The same typed resource can open through the selected host adapter, and no view +component silently imposes Stack or Dialog navigation. --- diff --git a/AGENTS.md b/AGENTS.md index 3f4886e..3e3e256 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -11,7 +11,7 @@ A collection of skills for AI coding agents working with Constructive tooling. S | Skill | Absorbs | Purpose | |-------|---------|---------| | **constructive-features** | *(router)* | Maps application capabilities to Blocks feature packs and authoritative domain skills | -| **constructive-blocks** | Constructive Blocks | Feature packs, Console Kit, registry installation, tenant descriptors, discovery, and runtime contracts | +| **constructive-blocks** | Constructive Blocks | App Kit composition, feature packs, Console Kit, registry installation, tenant scope, discovery, and runtime contracts | | **constructive-builder** | application harness | Agent-driven frontend assembly and acceptance against an existing workspace and already-provisioned tenant | | **constructive-blueprints** | blueprint refs from constructive-platform | Declarative schema definition — blueprints, node type registry, presets | | **constructive-auth** | auth/device/service refs from constructive-platform, auth-flow from constructive-sdk | Identity, login, sessions, MFA, devices | @@ -31,7 +31,7 @@ A collection of skills for AI coding agents working with Constructive tooling. S | **constructive-flow-graphs** | graph_module, merkle_store | Graph module + merkle store (SDK-authorable) with FBP spec links | | **constructive-i18n** | constructive-sdk-i18n | Internationalization — DataI18n, multilingual search, i18n_module | | **constructive-history** | *(standalone)* | Row history — DataHistory node, append-only version tables, pg_partman retention, graphile-history (versionAt, versionsBetween, restore) | -| **constructive-frontend** | *(standalone)* | UI primitives, visual composition, CRUD Stack cards, and custom domain UI patterns | +| **constructive-frontend** | *(standalone)* | UI primitives, App Kit visual composition, optional Stack navigation, and custom domain UI patterns | | **constructive-codegen** | codegen refs from constructive-sdk-graphql | Optional generated clients for stable custom-domain schemas | | **constructive-orm** | ORM refs from constructive-sdk-graphql | Optional generated ORM patterns for stable custom-domain schemas | | **constructive-hooks** | hooks refs from constructive-sdk-graphql | Optional generated React Query hook patterns for fixed endpoints | diff --git a/CLAUDE.md b/CLAUDE.md index 30991c8..89f7046 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -11,7 +11,7 @@ A collection of skills for AI coding agents working with Constructive tooling. S | Skill | Description | |-------|-------------| | **constructive-features** | Intent router — maps capabilities to Blocks feature packs and authoritative domain skills | -| **constructive-blocks** | Feature packs, Console Kit, registry installation, tenant descriptors, discovery, and runtime contracts | +| **constructive-blocks** | App Kit composition, feature packs, Console Kit, registry installation, tenant scope, discovery, and runtime contracts | | **constructive-builder** | Agent-driven tenant frontend harness — assembles and acceptance-checks Blocks against an existing workspace and already-provisioned tenant | | **constructive-blueprints** | Declarative schema definition — blueprints, node type registry, module presets | | **constructive-auth** | Identity, login, sessions, MFA, devices, auth settings, service settings | @@ -31,7 +31,7 @@ A collection of skills for AI coding agents working with Constructive tooling. S | **constructive-flow-graphs** | Graph module + merkle store (SDK-authorable) with FBP spec links | | **constructive-i18n** | Internationalization — DataI18n, multilingual search, lang_column, i18n_module | | **constructive-history** | Row history — DataHistory version tables, retention/partitioning, graphile-history (history, versionAt, versionsBetween, restore) | -| **constructive-frontend** | UI primitives, visual composition, CRUD Stack cards, and custom domain UI patterns | +| **constructive-frontend** | UI primitives, App Kit visual composition, optional Stack navigation, and custom domain UI patterns | | **constructive-codegen** | Optional generated clients for stable custom-domain schemas | | **constructive-orm** | Optional generated ORM patterns for stable custom-domain schemas | | **constructive-hooks** | Optional generated React Query hook patterns for fixed endpoints | diff --git a/README.md b/README.md index 52f7319..549c944 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

-A collection of skills for AI coding agents working with [Constructive](https://constructive.io) tooling. Skills cover application feature packs, Console Kit, PostgreSQL development, authorization, GraphQL workflows, and platform operations. +A collection of skills for AI coding agents working with [Constructive](https://constructive.io) tooling. Skills cover App Kit application composition, platform feature packs, Console Kit, PostgreSQL development, authorization, GraphQL workflows, and platform operations. Skills follow the [Agent Skills](https://agentskills.io/) format. @@ -26,8 +26,8 @@ Skills are organized into 25 focused skills. Every skill has a `SKILL.md`; refer | Skill | Description | |-------|-------------| -| `constructive-features` | Intent router — maps application capabilities to Blocks feature packs and the domain skill that explains the underlying behavior | -| `constructive-blocks` | Constructive Blocks — feature packs, Console Kit, registry installation, tenant descriptors, capability discovery, and runtime contracts | +| `constructive-features` | Intent router — maps application briefs to App Kit, optional Blocks capability packs, and authoritative domain skills | +| `constructive-blocks` | Constructive Blocks — App Kit, feature packs, Console Kit, registry installation, tenant scope, capability discovery, and runtime contracts | | `constructive-builder` | Agent-driven tenant frontend harness — assembles and acceptance-checks Blocks against an existing app workspace and already-provisioned tenant | | `constructive-blueprints` | Declarative schema definition — blueprints, node type registry, presets | | `constructive-auth` | Identity, login, sessions, MFA, devices, auth settings | @@ -47,7 +47,7 @@ Skills are organized into 25 focused skills. Every skill has a `SKILL.md`; refer | `constructive-flow-graphs` | Graph module + merkle store (SDK-authorable) with FBP spec links | | `constructive-i18n` | Internationalization — DataI18n, multilingual search, lang_column, i18n_module | | `constructive-history` | Row history — DataHistory version tables, retention/partitioning, graphile-history (history, versionAt, versionsBetween, restore) | -| `constructive-frontend` | Constructive UI primitives, visual composition, CRUD Stack cards, and custom domain UI patterns | +| `constructive-frontend` | Constructive UI primitives, App Kit visual composition, optional Stack navigation, and custom domain UI patterns | | `constructive-codegen` | Optional generated clients for stable, custom domain UI and server workflows | | `constructive-orm` | Optional generated ORM patterns for stable custom-domain schemas | | `constructive-hooks` | Optional generated React Query hook patterns for fixed endpoints | diff --git a/features.md b/features.md index ecd062e..e7cb72c 100644 --- a/features.md +++ b/features.md @@ -1,8 +1,21 @@ -# Constructive application capabilities +# Constructive application composition and capabilities -Constructive applications are assembled from Blocks feature packs. A feature pack is a frontend capability surface with a machine-readable compatibility and host/runtime contract; it does not provision backend modules or grant access by itself. +Constructive domain applications are composed with App Kit resources, queries, +actions, and view families. Feature packs remain frontend surfaces for optional +platform capabilities; they do not provision backend modules or grant access. -Use [`constructive-blocks`](./.agents/skills/constructive-blocks/SKILL.md) for exact registry roots, installation, Console Kit composition, tenant descriptors, endpoint routing, capability discovery, and verification. Use the domain skills below when changing the underlying application behavior. +Use [`constructive-blocks`](./.agents/skills/constructive-blocks/SKILL.md) for +App Kit selection, exact registry roots, installation, Console Kit composition, +tenant scope, capability discovery, and verification. Use the domain skills +below when changing underlying application behavior. + +## App Kit + +Select App Kit from the brief's data geometry and user tasks: core contracts +for every domain application, data views for records and relations, board for +semantic stage movement, dashboard for explicit analytical loaders, calendar +for range-based temporal views, and workflow for semantic actions and guided +steps. Do not default to Sheets, Console Kit, or a review queue. ## Feature packs @@ -28,6 +41,7 @@ Choose the smallest Blocks surface that owns the intended experience: | A backend-aligned application console | Official preset root | | A focused tenant console | Console Kit core plus selected console modules | | A host-controlled screen | Standalone feature pack | +| An application around domain records and actions | App Kit capability roots | | A custom visual component | Constructive UI primitive or block | The six non-Data standalone packs are provider-neutral views driven by host-injected resources, policy, actions, and state. Standalone Data is adapter-driven: the host configures its endpoint and adapter boundary, while the pack performs its own `_meta` and GraphQL introspection. @@ -38,7 +52,7 @@ The canonical names, dependency closure, shadcn command, runtime requirements, a | Intent | Skill | |---|---| -| Install or compose feature packs, Console Kit, app shell, app bar, billing blocks, or UI primitives | [`constructive-blocks`](./.agents/skills/constructive-blocks/SKILL.md) | +| Compose App Kit or install feature packs, Console Kit, app shell, billing blocks, or UI primitives | [`constructive-blocks`](./.agents/skills/constructive-blocks/SKILL.md) | | Assemble and acceptance-check a tenant frontend against an already-provisioned tenant | [`constructive-builder`](./.agents/skills/constructive-builder/SKILL.md) | | Style or compose custom application UI | [`constructive-frontend`](./.agents/skills/constructive-frontend/SKILL.md) | | Configure identity, sessions, MFA, devices, or account linking | [`constructive-auth`](./.agents/skills/constructive-auth/SKILL.md) | @@ -66,6 +80,11 @@ The canonical names, dependency closure, shadcn command, runtime requirements, a - Treat feature-pack installation, backend provisioning, and acceptance scenarios as separate decisions. Authentication scenarios such as password sign-in or recovery are tests within the Authentication pack, not install units. - Pass a secret-free database identity and explicit semantic endpoints. Never derive related endpoint hostnames or send tenant credentials to an inferred route. -- For a custom-domain route, follow the [`2026-07` `_meta` contract sequence](./.agents/skills/constructive-frontend/references/meta-forms.md): use `_meta` for Constructive schema facts and feature tags, then standard introspection for the exact executable GraphQL surface. Neither source proves the current user's write authority. +- For App Kit or another custom-domain route, use `_meta` for Constructive + schema facts and final GraphQL introspection for exact executable names. Run + App Kit resource validation at generation/build time; neither schema source + proves the current user's write authority. - Let runtime reads and mutations establish effective grants and RLS behavior. Do not replace an empty RLS result with an operator endpoint or private routing header. -- Use generated clients only when a custom domain surface benefits from a stable compile-time schema. Console Kit and feature packs do not require generated SDKs or process-wide client configuration. +- Generate or refresh typed App Kit definitions from the final schema. Console + Kit capability discovery and feature-pack host contracts remain separate and + do not require an application-wide process-global client.