From c34d5ffd3c44aef1734a89c4bf2c635a7d2599a2 Mon Sep 17 00:00:00 2001 From: Ajay Ghanwat Date: Mon, 10 Aug 2026 01:41:32 +0530 Subject: [PATCH] docs: update portal for WRNexusJS 0.8.7 --- app/pages/404.wrn | 4 +- app/pages/access.wrn | 6 +- app/pages/architecture.wrn | 6 +- app/pages/benchmarks.wrn | 4 +- app/pages/changelog.wrn | 6 +- app/pages/examples.wrn | 6 +- app/pages/getting-started.wrn | 6 +- app/pages/guides/api-routes.wrn | 6 +- app/pages/guides/authentication.wrn | 6 +- app/pages/guides/authorization.wrn | 6 +- .../guides/configuration-and-profiles.wrn | 6 +- app/pages/guides/database.wrn | 6 +- app/pages/guides/deployment.wrn | 6 +- app/pages/guides/forms-and-validation.wrn | 6 +- app/pages/guides/i18n-and-themes.wrn | 6 +- app/pages/guides/middleware.wrn | 6 +- app/pages/guides/mobile.wrn | 6 +- app/pages/guides/observability.wrn | 6 +- app/pages/guides/pages-and-components.wrn | 6 +- app/pages/guides/project-structure.wrn | 6 +- app/pages/guides/pubsub.wrn | 6 +- app/pages/guides/queues.wrn | 6 +- app/pages/guides/realtime.wrn | 6 +- app/pages/guides/routing.wrn | 6 +- app/pages/guides/security.wrn | 6 +- app/pages/guides/server-data.wrn | 6 +- app/pages/guides/testing.wrn | 6 +- app/pages/guides/troubleshooting.wrn | 6 +- app/pages/guides/upgrading.wrn | 6 +- app/pages/guides/uploads.wrn | 6 +- app/pages/guides/workspaces-and-gateway.wrn | 8 +- app/pages/index.wrn | 10 +- app/pages/language.wrn | 6 +- app/pages/license.wrn | 4 +- app/pages/packages.wrn | 6 +- app/pages/packages/ai.wrn | 6 +- app/pages/packages/auth.wrn | 8 +- app/pages/packages/authz.wrn | 6 +- app/pages/packages/benchmark.wrn | 6 +- app/pages/packages/cache.wrn | 6 +- app/pages/packages/captcha.wrn | 6 +- app/pages/packages/cli.wrn | 6 +- app/pages/packages/compiler.wrn | 7 +- app/pages/packages/content.wrn | 6 +- app/pages/packages/core.wrn | 6 +- app/pages/packages/csr.wrn | 12 +- app/pages/packages/db.wrn | 6 +- app/pages/packages/dev-server.wrn | 13 +- app/pages/packages/dev-toolbar.wrn | 6 +- app/pages/packages/encryption.wrn | 6 +- app/pages/packages/graphql.wrn | 6 +- app/pages/packages/helpers.wrn | 6 +- app/pages/packages/i18n.wrn | 6 +- app/pages/packages/identity.wrn | 6 +- app/pages/packages/image.wrn | 6 +- app/pages/packages/jwt.wrn | 6 +- app/pages/packages/language-server.wrn | 6 +- app/pages/packages/mcp.wrn | 6 +- app/pages/packages/mobile.wrn | 6 +- app/pages/packages/native.wrn | 6 +- app/pages/packages/oauth.wrn | 6 +- app/pages/packages/observability.wrn | 8 +- app/pages/packages/playground.wrn | 6 +- app/pages/packages/plugin.wrn | 6 +- app/pages/packages/pubsub.wrn | 23 +- app/pages/packages/pwa.wrn | 6 +- app/pages/packages/queue.wrn | 29 +- app/pages/packages/reactive.wrn | 6 +- app/pages/packages/realtime.wrn | 6 +- app/pages/packages/router.wrn | 6 +- app/pages/packages/security.wrn | 6 +- app/pages/packages/ssr.wrn | 6 +- app/pages/packages/store.wrn | 6 +- app/pages/packages/styles.wrn | 13 +- app/pages/packages/syntax.wrn | 6 +- app/pages/packages/test.wrn | 6 +- app/pages/packages/tracking.wrn | 6 +- app/pages/packages/typecheck.wrn | 6 +- app/pages/packages/ui.wrn | 16 +- app/pages/packages/uploader.wrn | 8 +- app/pages/packages/validation.wrn | 6 +- app/pages/releases/0.8.7.wrn | 16 + app/pages/roadmap.wrn | 4 +- app/pages/search.wrn | 4 +- app/pages/security.wrn | 6 +- app/pages/showcase.wrn | 6 +- app/pages/support.wrn | 4 +- app/pages/tutorial.wrn | 6 +- app/routes.gen.ts | 3 + app/types/wrnexus.generated.d.ts | 3 +- app/types/wrnexus.plugins.generated.d.ts | 1 - bun.lock | 188 +- docs/release-access-status.md | 4 +- docs/site-audit.md | 4 +- package-lock.json | 595 +- package.json | 96 +- public/docs-index.json | 184 +- public/llms-full.txt | 6974 +++++++++++++++-- public/llms.txt | 160 +- public/sitemap.xml | 2 +- 100 files changed, 7324 insertions(+), 1499 deletions(-) create mode 100644 app/pages/releases/0.8.7.wrn diff --git a/app/pages/404.wrn b/app/pages/404.wrn index 084dac14..5a8e9dce 100644 --- a/app/pages/404.wrn +++ b/app/pages/404.wrn @@ -7,10 +7,10 @@ page Pagenotfound { view {
-
W WRNexusJS
+
W WRNexusJS
- +
} } \ No newline at end of file diff --git a/app/pages/access.wrn b/app/pages/access.wrn index 94827d95..7abc915a 100644 --- a/app/pages/access.wrn +++ b/app/pages/access.wrn @@ -7,10 +7,10 @@ page Access { view {
-
W WRNexusJS
+
W WRNexusJS
-

Request preview access

WRNexusJS 0.8.6 packages are not available from the public npm registry. Installation requires approval and private registry credentials supplied by WorkRoot. Never paste registry tokens into source control, issue reports, or support messages.

Request process

  1. Contact WorkRoot through the public contact path at workroot.in.
  2. Describe the application, team, expected deployment, and Bun environment.
  3. After approval, follow the registry instructions supplied privately.
  4. Use the canonical scaffold command below only after authentication.
bunx @wrnexus/cli@0.8.6 create my-app

Access approval, response time, licensing terms, and support level remain owner-controlled. This site does not collect access requests directly.

- +

Request preview access

WRNexusJS 0.8.7 packages are not available from the public npm registry. Installation requires approval and private registry credentials supplied by WorkRoot. Never paste registry tokens into source control, issue reports, or support messages.

Request process

  1. Contact WorkRoot through the public contact path at workroot.in.
  2. Describe the application, team, expected deployment, and Bun environment.
  3. After approval, follow the registry instructions supplied privately.
  4. Use the canonical scaffold command below only after authentication.
bunx @wrnexus/cli@0.8.7 create my-app

Access approval, response time, licensing terms, and support level remain owner-controlled. This site does not collect access requests directly.

+
} } \ No newline at end of file diff --git a/app/pages/architecture.wrn b/app/pages/architecture.wrn index f0d1d9cf..57f1b3a1 100644 --- a/app/pages/architecture.wrn +++ b/app/pages/architecture.wrn @@ -7,10 +7,10 @@ page Architecture { view {
-
W WRNexusJS
+
W WRNexusJS
-
Framework architecture · 0.8.6

Architecture

WRNexusJS is Bun-native and SSR-first. File discovery maps pages and API handlers; middleware enriches or short-circuits a request; the compiler turns .wrn declarations into server render functions and small feature runtimes.

Request and build lifecycle

  1. DiscoverPages, APIs, middleware, components, layouts, schemas, rooms
  2. CompileParse .wrn, validate grammar, generate server code
  3. RequestLimits, security, locale, session, middleware
  4. MatchStatic and dynamic file route
  5. RenderSSR data, escaped interpolation, components, metadata
  6. EnhanceOnly required reactive/directive runtimes

Package boundaries

core owns contexts, middleware, sessions and rooms; router discovers routes; compiler parses .wrn; ssr renders documents; csr supplies browser runtimes; dev-server and cli orchestrate development and builds.

Security and data flow

Validation happens at trust boundaries. Session authentication establishes identity; authorization makes resource decisions. CSP, Trusted Types, CSRF, upload checks, WebSocket origins, request limits, and output escaping are layered controls—not substitutes for application policy.

Realtime and scale

Rooms are process-local unless connected through pub/sub. Redis-backed pub/sub distributes events. Queue durability depends on the selected driver and must be evaluated explicitly.

Workspaces and gateways

The gateway can dispatch multiple applications while preserving route, component, asset, config, and session boundaries. Validate host routing and isolation before production.

Build and deployment

wrnexus build . produces dist/server.js and hashed/static assets. Run the server with Bun, apply migrations before traffic, terminate TLS at a trusted edge, and forward only expected proxy headers.

Mobile

Mobile compatibility bridges SSR-safe Capacitor capabilities; native route generation is experimental and is not general web portability. Test each target platform.

Generated files and limits

app/routes.gen.ts, .wrnexus/, and dist/ are generated. The runtime is Bun-only. Preview packages are private. Historical compatibility and long-term support policy are not yet published.

- +
Framework architecture · 0.8.7

Architecture

WRNexusJS is Bun-native and SSR-first. File discovery maps pages and API handlers; middleware enriches or short-circuits a request; the compiler turns .wrn declarations into server render functions and small feature runtimes.

Request and build lifecycle

  1. DiscoverPages, APIs, middleware, components, layouts, schemas, rooms
  2. CompileParse .wrn, validate grammar, generate server code
  3. RequestLimits, security, locale, session, middleware
  4. MatchStatic and dynamic file route
  5. RenderSSR data, escaped interpolation, components, metadata
  6. EnhanceOnly required reactive/directive runtimes

Package boundaries

core owns contexts, middleware, sessions and rooms; router discovers routes; compiler parses .wrn; ssr renders documents; csr supplies browser runtimes; dev-server and cli orchestrate development and builds.

Security and data flow

Validation happens at trust boundaries. Session authentication establishes identity; authorization makes resource decisions. CSP, Trusted Types, CSRF, upload checks, WebSocket origins, request limits, and output escaping are layered controls—not substitutes for application policy.

Realtime and scale

Rooms are process-local unless connected through pub/sub. Redis-backed pub/sub distributes events. Queue durability depends on the selected driver and must be evaluated explicitly.

Workspaces and gateways

The gateway can dispatch multiple applications while preserving route, component, asset, config, and session boundaries. Validate host routing and isolation before production.

Build and deployment

wrnexus build . produces dist/server.js and hashed/static assets. Run the server with Bun, apply migrations before traffic, terminate TLS at a trusted edge, and forward only expected proxy headers.

Mobile

Mobile compatibility bridges SSR-safe Capacitor capabilities; native route generation is experimental and is not general web portability. Test each target platform.

Generated files and limits

app/routes.gen.ts, .wrnexus/, and dist/ are generated. The runtime is Bun-only. Preview packages are private. Historical compatibility and long-term support policy are not yet published.

+
} } \ No newline at end of file diff --git a/app/pages/benchmarks.wrn b/app/pages/benchmarks.wrn index f5c3665e..3a8a4c85 100644 --- a/app/pages/benchmarks.wrn +++ b/app/pages/benchmarks.wrn @@ -7,10 +7,10 @@ page Benchmarks { view {
-
W WRNexusJS
+
W WRNexusJS

Benchmarks

No publishable benchmark dataset yet

No comparative speed claims are published. A valid baseline must record scripts, commit, Bun/framework versions, hardware, OS, warmup, samples, workload, raw results, median, percentiles, memory, HTML size, browser JavaScript size, and run date.

The roadmap starts with WRNexusJS-only measurements before any maintained equivalent-workload comparison.

- +
} } \ No newline at end of file diff --git a/app/pages/changelog.wrn b/app/pages/changelog.wrn index 315e3ca9..d9831511 100644 --- a/app/pages/changelog.wrn +++ b/app/pages/changelog.wrn @@ -7,10 +7,10 @@ page Changelog { view {
-
W WRNexusJS
+
W WRNexusJS
-

Changelog

0.8.6 2026-07-13

Documentation is aligned to all 47 installed packages. This release adds @wrnexus/helpers, original-request URL helpers, safe login redirects, working wrnexus workspace add, and forward-auth redirect propagation.

Migration notes

Run wrnexus update --latest and keep every @wrnexus/* package on 0.8.6. Existing applications must explicitly add @wrnexus/helpers before importing it; newly scaffolded applications include it automatically.

Versioning and support

The packages use semantic-looking versions, but a formal compatibility and old-release support policy has not been approved. Preview consumers should treat minor releases as potentially requiring migration review.

- +

Changelog

0.8.7 2026-07-13

Documentation is aligned to all 47 installed packages. This release adds @wrnexus/helpers, original-request URL helpers, safe login redirects, working wrnexus workspace add, and forward-auth redirect propagation.

Migration notes

Run wrnexus update --latest and keep every @wrnexus/* package on 0.8.7. Existing applications must explicitly add @wrnexus/helpers before importing it; newly scaffolded applications include it automatically.

Versioning and support

The packages use semantic-looking versions, but a formal compatibility and old-release support policy has not been approved. Preview consumers should treat minor releases as potentially requiring migration review.

+
} } \ No newline at end of file diff --git a/app/pages/examples.wrn b/app/pages/examples.wrn index 7feae008..0923c41c 100644 --- a/app/pages/examples.wrn +++ b/app/pages/examples.wrn @@ -7,10 +7,10 @@ page Examples { view {
-
W WRNexusJS
+
W WRNexusJS
-

Examples

Examples are tied to installed 0.8.6 package documentation. The focused snippets in guides are source-verified; standalone runnable projects and CI compilation are tracked as remaining work.

Minimal .wrn page

Documented

Database CRUD

Planned fixture

Authentication and protected route

Planned fixture

Permissions

Planned fixture

Forms and validation

Documented

Realtime dashboard

Planned fixture

File upload

Planned fixture

Background queue

Planned fixture

Redis pub/sub

Planned fixture

Workspace gateway

Planned fixture

Deployment

Planned fixture

Experimental mobile mode

Planned fixture
- +

Examples

Examples are tied to installed 0.8.7 package documentation. The focused snippets in guides are source-verified; standalone runnable projects and CI compilation are tracked as remaining work.

Minimal .wrn page

Documented

Database CRUD

Planned fixture

Authentication and protected route

Planned fixture

Permissions

Planned fixture

Forms and validation

Documented

Realtime dashboard

Planned fixture

File upload

Planned fixture

Background queue

Planned fixture

Redis pub/sub

Planned fixture

Workspace gateway

Planned fixture

Deployment

Planned fixture

Experimental mobile mode

Planned fixture
+
} } \ No newline at end of file diff --git a/app/pages/getting-started.wrn b/app/pages/getting-started.wrn index f412168e..c5a8daea 100644 --- a/app/pages/getting-started.wrn +++ b/app/pages/getting-started.wrn @@ -7,9 +7,9 @@ page Gettingstarted { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · v0.8.6

Build a contact inbox

This path creates a server-rendered page, validated API route, middleware, and realtime next step. It requires approved registry access and Bun 1.3.x; this site was verified with Bun 1.3.14.

1. Create the project

bunx @wrnexus/cli@0.8.6 create my-app
+      
Preview guide · v0.8.7

Build a contact inbox

This path creates a server-rendered page, validated API route, middleware, and realtime next step. It requires approved registry access and Bun 1.3.x; this site was verified with Bun 1.3.14.

1. Create the project

bunx @wrnexus/cli@0.8.7 create my-app
 cd my-app
 bun install
 bun run dev

2. Know the structure

app/pages/       # file-based .wrn routes
@@ -39,7 +39,7 @@ export const POST = async (ctx) => {
 }

7. Test and ship

bun run test
 bun run build
 bun dist/server.js

Next: deployment, database, authentication, and workspaces.

- +
} } \ No newline at end of file diff --git a/app/pages/guides/api-routes.wrn b/app/pages/guides/api-routes.wrn index 9559f9e8..fa64a776 100644 --- a/app/pages/guides/api-routes.wrn +++ b/app/pages/guides/api-routes.wrn @@ -7,10 +7,10 @@ page APIroutes { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

API routes

Export GET, POST, PUT, PATCH, or DELETE from app/api files. Validate request bodies, enforce authentication and authorization, cap request sizes, and return Web Responses.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

API routes

Export GET, POST, PUT, PATCH, or DELETE from app/api files. Validate request bodies, enforce authentication and authorization, cap request sizes, and return Web Responses.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/authentication.wrn b/app/pages/guides/authentication.wrn index da349596..b0161a28 100644 --- a/app/pages/guides/authentication.wrn +++ b/app/pages/guides/authentication.wrn @@ -7,10 +7,10 @@ page Authentication { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Authentication

Configure session authentication, log users in through supported auth helpers, and read identity from context. Cookie flags, rotation, expiry, and secret storage remain deployment responsibilities.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Authentication

Configure session authentication, log users in through supported auth helpers, and read identity from context. Cookie flags, rotation, expiry, and secret storage remain deployment responsibilities.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/authorization.wrn b/app/pages/guides/authorization.wrn index fe0a4a94..80a24e4e 100644 --- a/app/pages/guides/authorization.wrn +++ b/app/pages/guides/authorization.wrn @@ -7,10 +7,10 @@ page Authorization { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Authorization

Authentication identifies; authorization decides. Enforce permissions in server routes and policies, including object ownership. UI hiding is never an authorization boundary.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Authorization

Authentication identifies; authorization decides. Enforce permissions in server routes and policies, including object ownership. UI hiding is never an authorization boundary.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/configuration-and-profiles.wrn b/app/pages/guides/configuration-and-profiles.wrn index b3a4b390..5382a28d 100644 --- a/app/pages/guides/configuration-and-profiles.wrn +++ b/app/pages/guides/configuration-and-profiles.wrn @@ -7,10 +7,10 @@ page Configurationandprofiles { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Configuration and profiles

wrnexus.config.ts owns styles, SEO, security, data, mobile, fonts, and profiles. Keep secrets in validated environment variables and review merged production configuration.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Configuration and profiles

wrnexus.config.ts owns styles, SEO, security, data, mobile, fonts, and profiles. Keep secrets in validated environment variables and review merged production configuration.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/database.wrn b/app/pages/guides/database.wrn index d2be37ac..b68c7881 100644 --- a/app/pages/guides/database.wrn +++ b/app/pages/guides/database.wrn @@ -7,10 +7,10 @@ page Database { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Database

Configure SQLite or the installed supported driver, keep queries in named SQL blocks, generate typed functions, and apply migrations before traffic. Back up data and test rollback independently.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Database

Configure SQLite or the installed supported driver, keep queries in named SQL blocks, generate typed functions, and apply migrations before traffic. Back up data and test rollback independently.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/deployment.wrn b/app/pages/guides/deployment.wrn index 715e70d0..3a4e51d1 100644 --- a/app/pages/guides/deployment.wrn +++ b/app/pages/guides/deployment.wrn @@ -7,10 +7,10 @@ page Deployment { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Deployment

Run bun run build, apply migrations, and start dist/server.js with Bun. Configure TLS, proxy trust, environment validation, health checks, graceful restarts, logs, backups, and restrictive security headers.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Deployment

Run bun run build, apply migrations, and start dist/server.js with Bun. Configure TLS, proxy trust, environment validation, health checks, graceful restarts, logs, backups, and restrictive security headers.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/forms-and-validation.wrn b/app/pages/guides/forms-and-validation.wrn index 60685dbd..d4bf83f4 100644 --- a/app/pages/guides/forms-and-validation.wrn +++ b/app/pages/guides/forms-and-validation.wrn @@ -7,10 +7,10 @@ page Formsandvalidation { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Forms and validation

Define a v.object schema, use data-schema on the form, show field errors with data-error, and always call parseBody on the server. refine is server-only.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Forms and validation

Define a v.object schema, use data-schema on the form, show field errors with data-error, and always call parseBody on the server. refine is server-only.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/i18n-and-themes.wrn b/app/pages/guides/i18n-and-themes.wrn index 461c2c29..113593fa 100644 --- a/app/pages/guides/i18n-and-themes.wrn +++ b/app/pages/guides/i18n-and-themes.wrn @@ -7,10 +7,10 @@ page Internationalizationandthemes { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Internationalization and themes

Store locale JSON under app/locales and use translation directives. Themes resolve CSS tokens; ensure contrast, system preference behavior, persistence, and non-color cues.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Internationalization and themes

Store locale JSON under app/locales and use translation directives. Themes resolve CSS tokens; ensure contrast, system preference behavior, persistence, and non-color cues.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/middleware.wrn b/app/pages/guides/middleware.wrn index a21e08d7..fe314db8 100644 --- a/app/pages/guides/middleware.wrn +++ b/app/pages/guides/middleware.wrn @@ -7,10 +7,10 @@ page Middleware { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Middleware

Middleware receives context and next. Return next() to continue or return a Response to stop. Put request limits and trust-boundary controls before business logic.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Middleware

Middleware receives context and next. Return next() to continue or return a Response to stop. Put request limits and trust-boundary controls before business logic.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/mobile.wrn b/app/pages/guides/mobile.wrn index 2661ffb3..62824c73 100644 --- a/app/pages/guides/mobile.wrn +++ b/app/pages/guides/mobile.wrn @@ -7,10 +7,10 @@ page Mobile { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Mobile

Mobile capabilities are experimental in this preview. Test Capacitor permissions and lifecycle on each platform; do not assume every .wrn or browser API converts to native.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Mobile

Mobile capabilities are experimental in this preview. Test Capacitor permissions and lifecycle on each platform; do not assume every .wrn or browser API converts to native.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/observability.wrn b/app/pages/guides/observability.wrn index 55881bc8..01abe0e1 100644 --- a/app/pages/guides/observability.wrn +++ b/app/pages/guides/observability.wrn @@ -7,10 +7,10 @@ page Observability { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Observability

Use tracking middleware and sinks with redaction, sampling, stable request identifiers, alert ownership, and retention limits. Never capture registry tokens or session secrets.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Observability

Use tracking middleware and sinks with redaction, sampling, stable request identifiers, alert ownership, and retention limits. Never capture registry tokens or session secrets.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/pages-and-components.wrn b/app/pages/guides/pages-and-components.wrn index 5f5bd429..27e380f4 100644 --- a/app/pages/guides/pages-and-components.wrn +++ b/app/pages/guides/pages-and-components.wrn @@ -7,10 +7,10 @@ page Pagesandcomponents { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Pages and components

Pages are routable, components are reusable, and layouts provide shared slots. Mount a component with data-component and keep browser state scoped and minimal.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Pages and components

Pages are routable, components are reusable, and layouts provide shared slots. Mount a component with data-component and keep browser state scoped and minimal.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/project-structure.wrn b/app/pages/guides/project-structure.wrn index 2a66d9ac..084e0851 100644 --- a/app/pages/guides/project-structure.wrn +++ b/app/pages/guides/project-structure.wrn @@ -7,10 +7,10 @@ page Projectstructure { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Project structure

Pages, components, layouts, APIs, middleware, schemas, database files, locales, realtime rooms, and styles live under app. Never edit app/routes.gen.ts, .wrnexus, or dist by hand.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Project structure

Pages, components, layouts, APIs, middleware, schemas, database files, locales, realtime rooms, and styles live under app. Never edit app/routes.gen.ts, .wrnexus, or dist by hand.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/pubsub.wrn b/app/pages/guides/pubsub.wrn index 94f75ff3..35c14ebc 100644 --- a/app/pages/guides/pubsub.wrn +++ b/app/pages/guides/pubsub.wrn @@ -7,10 +7,10 @@ page Pubsub { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Pub/sub

The in-process driver cannot cross processes. Use Redis where instances must share events, define channel ownership, and design for reconnects and duplicate delivery.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Pub/sub

The in-process driver cannot cross processes. Use Redis where instances must share events, define channel ownership, and design for reconnects and duplicate delivery.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/queues.wrn b/app/pages/guides/queues.wrn index 9b602404..0517f02b 100644 --- a/app/pages/guides/queues.wrn +++ b/app/pages/guides/queues.wrn @@ -7,10 +7,10 @@ page Queues { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Queues

Queue behavior is preview-level. Treat in-process work as non-durable, make handlers idempotent, cap retries, record failures, and choose a production persistence strategy.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Queues

Queue behavior is preview-level. Treat in-process work as non-durable, make handlers idempotent, cap retries, record failures, and choose a production persistence strategy.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/realtime.wrn b/app/pages/guides/realtime.wrn index 339d53c2..08d800bf 100644 --- a/app/pages/guides/realtime.wrn +++ b/app/pages/guides/realtime.wrn @@ -7,10 +7,10 @@ page Realtime { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Realtime

defineRoom handles connection and messages. Validate message shapes, authorize subscriptions, restrict origins, bound payloads, and use pub/sub to scale across processes.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Realtime

defineRoom handles connection and messages. Validate message shapes, authorize subscriptions, restrict origins, bound payloads, and use pub/sub to scale across processes.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/routing.wrn b/app/pages/guides/routing.wrn index 5a9cb96d..cb08d5b9 100644 --- a/app/pages/guides/routing.wrn +++ b/app/pages/guides/routing.wrn @@ -7,10 +7,10 @@ page Routing { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Routing

A page filename defines its URL; index maps to the directory root and bracket segments are dynamic parameters. API files under app/api expose HTTP method functions and receive a Context.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Routing

A page filename defines its URL; index maps to the directory root and bracket segments are dynamic parameters. API files under app/api expose HTTP method functions and receive a Context.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/security.wrn b/app/pages/guides/security.wrn index 7a62cb34..2735becf 100644 --- a/app/pages/guides/security.wrn +++ b/app/pages/guides/security.wrn @@ -7,10 +7,10 @@ page Applicationsecurity { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Application security

Use CSP, CSRF, Trusted Types, session hardening, validation, origin checks, upload restrictions, encryption, request limits, and explicit CORS. See the security policy for reporting.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Application security

Use CSP, CSRF, Trusted Types, session hardening, validation, origin checks, upload restrictions, encryption, request limits, and explicit CORS. See the security policy for reporting.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/server-data.wrn b/app/pages/guides/server-data.wrn index 87989223..f5696a07 100644 --- a/app/pages/guides/server-data.wrn +++ b/app/pages/guides/server-data.wrn @@ -7,10 +7,10 @@ page Serverdata { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Server data

Use an ssr API binding, return the desired response field, and render it with a server #each block. Values are escaped. Avoid fetching private data through a route that lacks authorization.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Server data

Use an ssr API binding, return the desired response field, and render it with a server #each block. Values are escaped. Avoid fetching private data through a route that lacks authorization.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/testing.wrn b/app/pages/guides/testing.wrn index c5be743c..e04ad633 100644 --- a/app/pages/guides/testing.wrn +++ b/app/pages/guides/testing.wrn @@ -7,10 +7,10 @@ page Testing { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Testing

Use Bun tests and @wrnexus/test helpers. Cover server HTML, API status and validation, authorization failures, reactive behavior, and a production startup smoke test.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Testing

Use Bun tests and @wrnexus/test helpers. Cover server HTML, API status and validation, authorization failures, reactive behavior, and a production startup smoke test.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/troubleshooting.wrn b/app/pages/guides/troubleshooting.wrn index e275622b..e0f31d72 100644 --- a/app/pages/guides/troubleshooting.wrn +++ b/app/pages/guides/troubleshooting.wrn @@ -7,10 +7,10 @@ page Troubleshooting { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Troubleshooting

Confirm Bun and package versions, regenerate docs/routes through supported commands, read the first compiler diagnostic, check file naming, validate config, and reproduce under a production build.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Troubleshooting

Confirm Bun and package versions, regenerate docs/routes through supported commands, read the first compiler diagnostic, check file naming, validate config, and reproduce under a production build.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/upgrading.wrn b/app/pages/guides/upgrading.wrn index 64c0a967..cdd1a074 100644 --- a/app/pages/guides/upgrading.wrn +++ b/app/pages/guides/upgrading.wrn @@ -7,10 +7,10 @@ page Upgrading { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Upgrading

Back up and commit first, then use wrnexus update --latest as documented by the installed CLI. Review migrations and keep every @wrnexus package aligned. Current release: 0.8.6.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Upgrading

Back up and commit first, then use wrnexus update --latest as documented by the installed CLI. Review migrations and keep every @wrnexus package aligned. Current release: 0.8.7.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/uploads.wrn b/app/pages/guides/uploads.wrn index 3e5ea628..4f20a29b 100644 --- a/app/pages/guides/uploads.wrn +++ b/app/pages/guides/uploads.wrn @@ -7,10 +7,10 @@ page Uploads { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Uploads

Configure named stores, accepted MIME/extensions, and maxBytes. Random keys avoid path traversal. Private files require an authenticated serving route; v1 buffers each file in memory.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +
Preview guide · 0.8.7

Uploads

Configure named stores, accepted MIME/extensions, and maxBytes. Random keys avoid path traversal. Private files require an authenticated serving route; v1 buffers each file in memory.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/guides/workspaces-and-gateway.wrn b/app/pages/guides/workspaces-and-gateway.wrn index 784aee06..c685b92b 100644 --- a/app/pages/guides/workspaces-and-gateway.wrn +++ b/app/pages/guides/workspaces-and-gateway.wrn @@ -7,9 +7,9 @@ page Workspacesandgateway { view {
-
W WRNexusJS
+
W WRNexusJS
-
Preview guide · 0.8.6

Workspaces and gateway

A workspace runs isolated applications behind one domain-routing gateway. Add an application from the workspace root; the CLI scaffolds apps/reports and registers it in wrnexus.workspace.ts:

wrnexus workspace add reports --domain=reports.localhost
+      
Preview guide · 0.8.7

Workspaces and gateway

A workspace runs isolated applications behind one domain-routing gateway. Add an application from the workspace root; the CLI scaffolds apps/reports and registers it in wrnexus.workspace.ts:

wrnexus workspace add reports --domain=reports.localhost
 bun install
 bun run dev

Forward authentication

Point protected applications at a dedicated verifier endpoint. The verifier must return 2xx for an authenticated session, 401/403 to deny access, or an HTTP redirect to begin browser login.

// wrnexus.workspace.ts
 {
@@ -28,8 +28,8 @@ export const GET = async (ctx: Context) => {
   return redirectToLogin(ctx, "/login", {
     allowedHosts: ["admin.localhost:3000", "reports.localhost:3000"],
   });
-};

Always allowlist redirect hosts. After login, validate or sign the returnTo value before redirecting. Keep internal app ports private and open applications through the gateway port.

Release scope

This guide describes installed 0.8.6 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

- +};

Always allowlist redirect hosts. After login, validate or sign the returnTo value before redirecting. Keep internal app ports private and open applications through the gateway port.

Release scope

This guide describes installed 0.8.7 capabilities. Follow linked package declarations for exact signatures; undocumented behavior is not guaranteed.

Browse package APIs · Troubleshooting · Support

+
} } \ No newline at end of file diff --git a/app/pages/index.wrn b/app/pages/index.wrn index bf128588..7d13f847 100644 --- a/app/pages/index.wrn +++ b/app/pages/index.wrn @@ -7,9 +7,9 @@ page Home { view {
-
W WRNexusJS
+
W WRNexusJS
-

WRNexusJS v0.8.6

Build from the server.
Ship only what matters.

WRNexusJS is an SSR-first, Bun-native full-stack framework. Build typed pages, APIs, validated forms, realtime rooms, secure sessions, workspaces, and optional mobile experiences with the .wrn component language.

Private developer preview. Request access to the package registry.

app/pages/dashboard.wrn
page Dashboard {
+      

WRNexusJS v0.8.7

Build from the server.
Ship only what matters.

WRNexusJS is an SSR-first, Bun-native full-stack framework. Build typed pages, APIs, validated forms, realtime rooms, secure sessions, workspaces, and optional mobile experiences with the .wrn component language.

Private developer preview. Request access to the package registry.

app/pages/dashboard.wrn
page Dashboard {
   ssr { api tasks GET /api/tasks { return tasks } }
   view {
     <main>
@@ -35,10 +35,10 @@ export const POST = async (ctx) => {
   return result.ok ? Response.json({ ok: true }, { status: 201 }) : result.response;
 };

Request lifecycle

  1. RequestSecurity headers and request limits
  2. MiddlewareAuthentication, policy, and context
  3. File routePage or API handler
  4. Compiler + SSRSafe HTML and scoped runtime
  5. ResponseHTML, JSON, stream, or realtime upgrade
-

Production proof

WorkRoot

Public creator/company site and approved WRNexusJS production showcase.

wrnexusjs.dev

This documentation application runs WRNexusJS 0.8.6.

View deployment notes and showcase status →

-

Capability status

CapabilityStatusDetails
SSR, routing, compiler, APIsPreviewInstalled in 0.8.6; public support policy pending.
Mobile/nativeExperimentalCapacitor compatibility and native generation have platform limitations.
Durable queuesExperimentalProduction durability requires an appropriate driver strategy.
+

Production proof

WorkRoot

Public creator/company site and approved WRNexusJS production showcase.

wrnexusjs.dev

This documentation application runs WRNexusJS 0.8.7.

View deployment notes and showcase status →

+

Capability status

CapabilityStatusDetails
SSR, routing, compiler, APIsPreviewInstalled in 0.8.7; public support policy pending.
Mobile/nativeExperimentalCapacitor compatibility and native generation have platform limitations.
Durable queuesExperimentalProduction durability requires an appropriate driver strategy.

Continue exploring

- +
} } \ No newline at end of file diff --git a/app/pages/language.wrn b/app/pages/language.wrn index 7853c85d..ad04d746 100644 --- a/app/pages/language.wrn +++ b/app/pages/language.wrn @@ -7,15 +7,15 @@ page Thewrnlanguage { view {
-
W WRNexusJS
+
W WRNexusJS
-
Language reference · 0.8.6

The .wrn language

File anatomy

page Account {
+      
Language reference · 0.8.7

The .wrn language

File anatomy

page Account {
   layout = "public"
   seo { title = "Account" description = "Manage your account." }
   state count = 0
   view { <button @click="count++">Count {count}</button> }
 }

Pages, components, layouts, props, and state

Pages are routes. Components declare default-valued props and may hold state. Layouts provide shared slots. Mount components with data-component; fill default or named slots with data-slot.

Interpolation, conditionals, and loops

Interpolation is HTML-escaped. Use server {#if} and {#each} for SSR data. Use data-show for reactive client visibility.

Events and directives

@click and other events execute in the reactive scope. Data attributes opt into forms, i18n, themes, realtime, uploader, browser, and mobile behavior. Consult the exact package page because availability varies.

Forms, i18n, themes, and realtime

form[data-schema] connects descriptors to client and server validation. Translation keys use {t:key}. Theme toggles use data-wire-theme-toggle. Realtime pages opt into a named room.

Escaping and security

Text interpolation is escaped by default. Do not construct trusted HTML from user input. Server-only refinements must be repeated at the authoritative mutation boundary.

Common compiler errors

  • Use balanced braces; a literal brace must be escaped.
  • Declare UI in view, not JSX or hooks.
  • Use a valid page, component, or layout declaration matching the file role.
  • Keep server loops tied to available SSR bindings.
  • Check troubleshooting and compiler API for this release.
- +
} } \ No newline at end of file diff --git a/app/pages/license.wrn b/app/pages/license.wrn index c3a30d51..53b2a7ae 100644 --- a/app/pages/license.wrn +++ b/app/pages/license.wrn @@ -7,10 +7,10 @@ page License { view {
-
W WRNexusJS
+
W WRNexusJS

License

Owner decision required

This documentation repository contains no public license file, and the packages are unavailable from the public npm registry. No open-source license or redistribution right should be inferred.

Approved preview users must follow the private/commercial terms supplied by WorkRoot. Contact WorkRoot before copying, redistributing, or using WRNexusJS in production.

- +
} } \ No newline at end of file diff --git a/app/pages/packages.wrn b/app/pages/packages.wrn index fb0f8638..e12cdaff 100644 --- a/app/pages/packages.wrn +++ b/app/pages/packages.wrn @@ -12,10 +12,10 @@ page Packages {
W WRNexusJS - +
-
46 focused packages

Package reference

Everything in the framework, organized by responsibility and documented from the published 0.8.6 APIs.

Showing {category} packages

+
46 focused packages

Package reference

Everything in the framework, organized by responsibility and documented from the published 0.8.7 APIs.

Showing {category} packages

AI

@wrnexus/ai

Server-side Anthropic client with generation and streaming.

Open documentation →
@@ -153,7 +153,7 @@ page Packages { Security

@wrnexus/validation

Typed schemas, coercion, validation, and browser descriptors.

Open documentation →
- +
} } diff --git a/app/pages/packages/ai.wrn b/app/pages/packages/ai.wrn index 51ed90ae..0ec8ca79 100644 --- a/app/pages/packages/ai.wrn +++ b/app/pages/packages/ai.wrn @@ -10,11 +10,11 @@ page wrnexusai {
W WRNexusJS - +
-
AI · Package reference

@wrnexus/ai

Server-side Anthropic client with generation and streaming.

v0.8.6Private registryAI

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/ai@0.8.6

Request preview access. Never put registry tokens in source control.

Provider-neutral AI orchestration for OpenAI, Anthropic, Google and local OpenAI-compatible models, with streaming, structured output, tools, embeddings, vector search/RAG, conversation persistence, templates, guardrails, usage events, fallback, rate limits and evaluation reports.

+
AI · Package reference

@wrnexus/ai

Server-side Anthropic client with generation and streaming.

v0.8.7Private registryAI

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/ai@0.8.7

Request preview access. Never put registry tokens in source control.

Provider-neutral AI orchestration for OpenAI, Anthropic, Google and local OpenAI-compatible models, with streaming, structured output, tools, embeddings, vector search/RAG, conversation persistence, templates, guardrails, usage events, fallback, rate limits and evaluation reports.

A tiny, zero-dependency Claude (Anthropic) client for WRNexusJS apps — generate and stream text with Claude from any server-side code.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@@ -151,7 +151,7 @@ export const POST = async (ctx) => { };
- + } } diff --git a/app/pages/packages/auth.wrn b/app/pages/packages/auth.wrn index eee12672..af233918 100644 --- a/app/pages/packages/auth.wrn +++ b/app/pages/packages/auth.wrn @@ -10,11 +10,11 @@ page wrnexusauth {
W WRNexusJS - +
-
Security · Package reference

@wrnexus/auth

Authentication routes, sessions, forms, guards, and account flows.

v0.8.6Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/auth@0.8.6

Request preview access. Never put registry tokens in source control.

Framework-native authentication, identity, account-security, and session management for WRNexusJS.

+
Security · Package reference

@wrnexus/auth

Authentication routes, sessions, forms, guards, and account flows.

v0.8.7Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/auth@0.8.7

Request preview access. Never put registry tokens in source control.

Framework-native authentication, identity, account-security, and session management for WRNexusJS.

Capabilities

  • Password registration, login, recovery, reset, and authenticated password changes
  • @@ -287,7 +287,7 @@ export { A as AUTH_SECURITY_EVENT_TYPES, a as AuthAccountStatus, b as AuthC export { MemoryAuthStore } from './stores/memory.js'; export { SqlAuthStore } from './stores/sql.js'; export { AUTH_SESSION_KEY, authSession, clearAuthSession, establishAuthSession, getAuthSession, getAuthUser, isAuthenticatedContext, requireAuth } from './middleware.js'; -export { A as AuthHttpOptions, a as AuthPasskeyHttpOptions, b as AuthSchemaOverrides, c as AuthSchemaSet, d as authBrowserSchemaDescriptors, e as authBrowserSchemaMap, f as authSchemas, g as authenticatorConfirmSchema, h as authenticatorDisableSchema, i as authenticatorSetupSchema, j as changePasswordSchema, k as createAuthHttpHandlers, l as emptyActionSchema, m as impersonationStartSchema, n as invitationAcceptSchema, o as loginSchema, p as magicLinkConsumeSchema, q as magicLinkRequestSchema, r as mfaOtpRequestSchema, s as mfaSchema, t as otpIssueSchema, u as otpLoginCompleteSchema, v as otpLoginRequestSchema, w as otpSchema, x as passkeyAuthenticationOptionsSchema, y as passkeyAuthenticationVerifySchema, z as passkeyRegistrationOptionsSchema, B as passkeyRegistrationVerifySchema, C as passwordResetRequestSchema, D as passwordResetSchema, E as recoveryCodesSchema, F as registerSchema, G as resolveAuthSchemas, H as sessionRevokeSchema, I as signUpSchema, J as verificationRequestSchema, K as verificationTokenSchema } from './index-B4uaD0Z3.js'; +export { A as AuthHttpOptions, a as AuthPasskeyHttpOptions, b as AuthSchemaOverrides, c as AuthSchemaSet, d as authBrowserSchemaDescriptors, e as authBrowserSchemaMap, f as authSchemas, g as authenticatorConfirmSchema, h as authenticatorDisableSchema, i as authenticatorSetupSchema, j as changePasswordSchema, k as createAuthHttpHandlers, l as emptyActionSchema, m as impersonationStartSchema, n as invitationAcceptSchema, o as loginSchema, p as magicLinkConsumeSchema, q as magicLinkRequestSchema, r as mfaOtpRequestSchema, s as mfaSchema, t as otpIssueSchema, u as otpLoginCompleteSchema, v as otpLoginRequestSchema, w as otpSchema, x as passkeyAuthenticationOptionsSchema, y as passkeyAuthenticationVerifySchema, z as passkeyRegistrationOptionsSchema, B as passkeyRegistrationVerifySchema, C as passwordResetRequestSchema, D as passwordResetSchema, E as recoveryCodesSchema, F as registerSchema, G as resolveAuthSchemas, H as sessionRevokeSchema, I as signUpSchema, J as verificationRequestSchema, K as verificationTokenSchema } from './index-CSXo5T-F.js'; export { AuthAuditIssue, AuthConfig, AuthPluginOptions, AuthRoutesConfig, authComponentsDir, authPlugin } from './plugin.js'; export { DefaultAuthRouteOptions, clearDefaultAuthEngine, getDefaultAuthEngine, getDefaultAuthRouteOptions, getDefaultAuthSchemas, hasDefaultAuthEngine, setDefaultAuthEngine, setDefaultAuthRouteOptions, setDefaultAuthSchemas, tryGetDefaultAuthEngine } from './runtime.js'; export { createAuthSecretProtector } from './protector.js'; @@ -386,7 +386,7 @@ export const auth = createAuthEngine({ };
- + } } diff --git a/app/pages/packages/authz.wrn b/app/pages/packages/authz.wrn index 4c61aae1..289ca9ff 100644 --- a/app/pages/packages/authz.wrn +++ b/app/pages/packages/authz.wrn @@ -10,11 +10,11 @@ page wrnexusauthz {
W WRNexusJS - +
-
Security · Package reference

@wrnexus/authz

Role, permission, policy, and authorization guards.

v0.8.6Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/authz@0.8.6

Request preview access. Never put registry tokens in source control.

Composable authorization for WRNexusJS — role-based (RBAC), policy-based (PBAC), and attribute-based (ABAC) access control that reduces to a boolean check plus an authorize() guard.
+
Security · Package reference

@wrnexus/authz

Role, permission, policy, and authorization guards.

v0.8.7Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/authz@0.8.7

Request preview access. Never put registry tokens in source control.

Composable authorization for WRNexusJS — role-based (RBAC), policy-based (PBAC), and attribute-based (ABAC) access control that reduces to a boolean check plus an authorize() guard.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

Overview

@wrnexus/authz is a small, server-side authorization toolkit. It gives you three interchangeable models — RBAC (roles → permissions), PBAC (policy predicates), and ABAC (attribute matchers) — that all collapse to a boolean | Promise<boolean> decision. Wrap any decision in a Middleware guard (authorize, requireRole, requirePermission) to protect WRNexusJS routes. Reach for it whenever a route or action needs to be gated on who the user is, what roles they hold, or attributes of the user and the resource. It plugs into @wrnexus/core by reading ctx.user as the authorization subject.

@@ -580,7 +580,7 @@ app.put( );
- + } } diff --git a/app/pages/packages/benchmark.wrn b/app/pages/packages/benchmark.wrn index d270517e..03b10227 100644 --- a/app/pages/packages/benchmark.wrn +++ b/app/pages/packages/benchmark.wrn @@ -10,11 +10,11 @@ page wrnexusbenchmark {
W WRNexusJS - +
-
Tooling · Package reference

@wrnexus/benchmark

Framework benchmark scenarios and repeatable performance measurements.

v0.8.6Private registryTooling

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/benchmark@0.8.6

Request preview access. Never put registry tokens in source control.

Deterministic benchmark execution, percentiles, baseline comparisons, and regression budgets for builds, SSR, hydration, stores, and application hot paths.

+
Tooling · Package reference

@wrnexus/benchmark

Framework benchmark scenarios and repeatable performance measurements.

v0.8.7Private registryTooling

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/benchmark@0.8.7

Request preview access. Never put registry tokens in source control.

Deterministic benchmark execution, percentiles, baseline comparisons, and regression budgets for builds, SSR, hydration, stores, and application hot paths.

import { runBenchmark, assertBenchmarkBudget } from "@wrnexus/benchmark";
 const result = await runBenchmark("render", render, { iterations: 100 });
 assertBenchmarkBudget(result, baseline, { p95Percent: 5 });

Complete TypeScript API

Generated from the exact installed package declarations.

interface BenchmarkOptions {
@@ -61,7 +61,7 @@ const result = await runBenchmark("render", render, { iterations:
 assertBenchmarkBudget(result, baseline, { p95Percent: 5 });

Install @wrnexus/benchmark

bun add @wrnexus/benchmark
- + } } diff --git a/app/pages/packages/cache.wrn b/app/pages/packages/cache.wrn index 98a0725c..2dc95414 100644 --- a/app/pages/packages/cache.wrn +++ b/app/pages/packages/cache.wrn @@ -10,11 +10,11 @@ page wrnexuscache {
W WRNexusJS - +
-
Data · Package reference

@wrnexus/cache

Memory and distributed caching with coordination and invalidation.

v0.8.6Private registryData

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/cache@0.8.6

Request preview access. Never put registry tokens in source control.

Bounded in-memory/tag caching and HTTP response caching for WRNexusJS. Supports request deduplication, tag invalidation, ETags, fresh/stale states, and optional detached stale revalidation.

+
Data · Package reference

@wrnexus/cache

Memory and distributed caching with coordination and invalidation.

v0.8.7Private registryData

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/cache@0.8.7

Request preview access. Never put registry tokens in source control.

Bounded in-memory/tag caching and HTTP response caching for WRNexusJS. Supports request deduplication, tag invalidation, ETags, fresh/stale states, and optional detached stale revalidation.

import { connectCacheInvalidation, TagCache, responseCache } from "@wrnexus/cache";
 const cache = new TagCache({ ttlMs: 60_000, staleWhileRevalidateMs: 300_000 });
 export default responseCache({ cache, tags: ["products"] });
@@ -235,7 +235,7 @@ await bus.close();

Pages }

- + } } diff --git a/app/pages/packages/captcha.wrn b/app/pages/packages/captcha.wrn index 505114e1..6bdcddb2 100644 --- a/app/pages/packages/captcha.wrn +++ b/app/pages/packages/captcha.wrn @@ -10,11 +10,11 @@ page wrnexuscaptcha {
W WRNexusJS - +
-
Security · Package reference

@wrnexus/captcha

Managed CAPTCHA verification, middleware, and UI integration.

v0.8.6Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/captcha@0.8.6

Request preview access. Never put registry tokens in source control.

A first-class CAPTCHA and anti-automation package for WRNexusJS. It supports self-hosted challenges, a managed WRNexus service, external providers, form submission guards, page gates, accessible audio, adaptive risk checks, and a Tailwind-only .wrn component.

+
Security · Package reference

@wrnexus/captcha

Managed CAPTCHA verification, middleware, and UI integration.

v0.8.7Private registrySecurity

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/captcha@0.8.7

Request preview access. Never put registry tokens in source control.

A first-class CAPTCHA and anti-automation package for WRNexusJS. It supports self-hosted challenges, a managed WRNexus service, external providers, form submission guards, page gates, accessible audio, adaptive risk checks, and a Tailwind-only .wrn component.

Install

bun add @wrnexus/captcha

WRNexusJS automatically discovers the package plugin, component, client runtime, styles, and DevToolbar audit. Use <Captcha /> directly after installation. The browser runtime is injected once only on responses that render a CAPTCHA; no script tag, public-file copy, or manual plugin registration is required. Call captchaPlugin(options) explicitly only when an application needs to override the discovered package configuration.

@@ -333,7 +333,7 @@ export const HEAD = POST;
- + } } diff --git a/app/pages/packages/cli.wrn b/app/pages/packages/cli.wrn index 1db1ce4c..87cf5010 100644 --- a/app/pages/packages/cli.wrn +++ b/app/pages/packages/cli.wrn @@ -10,11 +10,11 @@ page wrnexuscli {
W WRNexusJS - +
-
Tooling · Package reference

@wrnexus/cli

Create, develop, build, generate, test, and maintain WRNexusJS apps.

v0.8.6Private registryTooling

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/cli@0.8.6

Request preview access. Never put registry tokens in source control.

Production parity commands:

+
Tooling · Package reference

@wrnexus/cli

Create, develop, build, generate, test, and maintain WRNexusJS apps.

v0.8.7Private registryTooling

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/cli@0.8.7

Request preview access. Never put registry tokens in source control.

Production parity commands:

wrnexus build .
 wrnexus preview . --port=3000
 wrnexus dev . --production-runtime
@@ -167,7 +167,7 @@ wrnexus update --latest wrnexus doctor
- + } } diff --git a/app/pages/packages/compiler.wrn b/app/pages/packages/compiler.wrn index 69d2c6b6..fe7922c7 100644 --- a/app/pages/packages/compiler.wrn +++ b/app/pages/packages/compiler.wrn @@ -10,11 +10,11 @@ page wrnexuscompiler {
W WRNexusJS - +
-
Core · Package reference

@wrnexus/compiler

Parser and code generators for the .wrn language.

v0.8.6Private registryCore

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/compiler@0.8.6

Request preview access. Never put registry tokens in source control.

Partial-static rendering

+
Core · Package reference

@wrnexus/compiler

Parser and code generators for the .wrn language.

v0.8.7Private registryCore

Install the package

After WorkRoot approves private registry access, install the release-aligned package:

bun add @wrnexus/compiler@0.8.7

Request preview access. Never put registry tokens in source control.

Partial-static rendering

Pages can select render = "partial-static" and divide their view with <Static> and <Dynamic> boundaries. The compiler emits a build-only shell renderer that never evaluates dynamic-boundary children. wrnexus build expands static component mounts into dist/partial-shells.json, records byte/region evidence in build-report.json, and embeds the shell in the production route manifest. At request time the production runtime retains request-aware layouts, locale/theme metadata and security nonces while streaming dynamic regions into stable placeholders.

Compiler for the .wrn language — tokenizes, parses, and lowers .wrn page and component files to TypeScript.

Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

@@ -125,6 +125,7 @@ lx.next(); // { type: "lbrace", value: "{", pos: 1
  • @event name = function inside props — declares a public component event. Emit it from component behavior with name(detail) or $emit("name", detail), and consume it with <Component @name="handler(event)" />.
  • state <ident>: Type = <expr> — typed reactive state seeded from a raw JS expression, including native array and object literals. The annotation is optional for backward compatibility.
  • view { <html> } — plain HTML with {expr} interpolation in text and attributes, JSX-style component props such as items={items}, items={[...]}, and options={{...}}, hyphenated attributes, boolean attributes, @event="..." client bindings, and <!-- comments -->. Structured component props are serialized safely for SSR; expressions that reference state retain their initial value and update reactively in the browser.
  • +
  • Client functions automatically commit state changed by setTimeout callbacks. For other deferred callbacks (observers, third-party APIs, or detached promise callbacks), call the injected commit() function after changing local state; returning/awaiting a promise also commits through the normal function boundary.
  • seo { key = "value" ... } — metadata merged into the generated meta.
  • style { <raw css> } — inlined page/component stylesheet (repeatable).
  • functions { <TypeScript> } — helpers with typed parameters and return values. Types remain in server output and are safely erased from browser behavior code.
  • @@ -409,7 +410,7 @@ lx.next(); // { type: "ident", value: "Home", pos: 5 &# lx.next(); // { type: "lbrace", value: "{", pos: 10 }
    - + } } diff --git a/app/pages/packages/content.wrn b/app/pages/packages/content.wrn index b7451d49..01df8aa5 100644 --- a/app/pages/packages/content.wrn +++ b/app/pages/packages/content.wrn @@ -10,11 +10,11 @@ page wrnexuscontent {
    W WRNexusJS - +
    -
    Data · Package reference

    @wrnexus/content

    Content collections, validation, querying, and publishing workflows.

    v0.8.6Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/content@0.8.6

    Request preview access. Never put registry tokens in source control.

    Typed content collections for Markdown/MDX-like documents and remote CMS records. Collections validate frontmatter through any { parse(input) } schema, render escaped HTML, and expose draft preview, versions, references, headings, search indexes, pagination, RSS and sitemaps.

    +
    Data · Package reference

    @wrnexus/content

    Content collections, validation, querying, and publishing workflows.

    v0.8.7Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/content@0.8.7

    Request preview access. Never put registry tokens in source control.

    Typed content collections for Markdown/MDX-like documents and remote CMS records. Collections validate frontmatter through any { parse(input) } schema, render escaped HTML, and expose draft preview, versions, references, headings, search indexes, pagination, RSS and sitemaps.

    const posts = defineCollection({
       name: "posts",
       schema: PostSchema,
    @@ -170,7 +170,7 @@ const published = await posts.load();
     const preview = await posts.load({ previewToken: request.headers.get("x-preview-token") ?? "" });

    Install @wrnexus/content

    bun add @wrnexus/content
    - + } } diff --git a/app/pages/packages/core.wrn b/app/pages/packages/core.wrn index c1ebc5b8..a8880c51 100644 --- a/app/pages/packages/core.wrn +++ b/app/pages/packages/core.wrn @@ -10,11 +10,11 @@ page wrnexuscore {
    W WRNexusJS - +
    -
    Core · Package reference

    @wrnexus/core

    Contexts, middleware, security, sessions, caching, JSX, and realtime.

    v0.8.6Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/core@0.8.6

    Request preview access. Never put registry tokens in source control.

    The framework core: the request Context, middleware contract, and the security, session, caching, streaming, realtime, and JSX primitives every other WRNexusJS package builds on.
    +
    Core · Package reference

    @wrnexus/core

    Contexts, middleware, security, sessions, caching, JSX, and realtime.

    v0.8.7Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/core@0.8.7

    Request preview access. Never put registry tokens in source control.

    The framework core: the request Context, middleware contract, and the security, session, caching, streaming, realtime, and JSX primitives every other WRNexusJS package builds on.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/core is the shared foundation of WRNexusJS. It defines the Context object that flows through every middleware, page, and API route, plus the Middleware/Next contract they implement. On top of that it ships the building blocks a real app needs: cookie-backed sessions, password auth, CSRF protection, rate limiting, request logging, HTTP + in-memory caching, file uploads, streaming/SSE responses, WebSocket "rooms", security headers/CORS, and a server-side JSX runtime that renders to HTML strings. Everything here is server-side and Bun-native (it uses Bun.password, Bun.write, the web-standard Request/Response, and crypto). You depend on it directly and transitively through the rest of the framework.

    @@ -1550,7 +1550,7 @@ const registry = createRealtimeRegistry(); bridgeRealtime(registry, createPubSub(redisDriver(process.env.REDIS_URL)));
    - + } } diff --git a/app/pages/packages/csr.wrn b/app/pages/packages/csr.wrn index 0ef460b0..d84439be 100644 --- a/app/pages/packages/csr.wrn +++ b/app/pages/packages/csr.wrn @@ -10,11 +10,11 @@ page wrnexuscsr {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/csr

    Reactive, navigation, and realtime browser runtimes.

    v0.8.6Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/csr@0.8.6

    Request preview access. Never put registry tokens in source control.

    +
    Frontend · Package reference

    @wrnexus/csr

    Reactive, navigation, and realtime browser runtimes.

    v0.8.7Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/csr@0.8.7

    Request preview access. Never put registry tokens in source control.

    Pages can opt into restoration across client navigation:

    page Users {
       navigation {
    @@ -277,14 +277,16 @@ interface WrnexusBrowserGlobals {
      */
     
     /** The reactive runtime served at `/__wrnexus/reactive.js` (plain browser JS). */
    -declare function getReactiveRuntime(): string;
    +declare function getReactiveRuntime(development?: boolean): string;
    +/** Component-specific controllers, loaded only when their marker is present. */
    +declare function getComponentControllerRuntime(development?: boolean): string;
     /** The client-side navigation runtime served at `/__wrnexus/nav.js`. */
     declare function getNavRuntime(): string;
     /** The realtime client runtime served at `/__wrnexus/realtime.js`. */
     declare function getRealtimeRuntime(): string;
     declare function getActionRuntime(): string;
     
    -export { ACTION_RUNTIME, ActionClientError, type ActionClientOptions, type ActionResult, type ClientModuleScope, type HydrationScopeApi, NAV_RUNTIME, type OutputHandler, type OutputHost, REACTIVE_RUNTIME, REALTIME_RUNTIME, type ServerCallOptions, WrnServerCallError, type WrnexusBrowserGlobals, callServerFunction, collectRefs, createActionClient, createOutputProxy, createServerProxy, getActionRuntime, getNavRuntime, getReactiveRuntime, getRealtimeRuntime, invalidateClientModule, invokeOutput, loadClientFunctions, registerOutputHandler };
    +export { ACTION_RUNTIME, ActionClientError, type ActionClientOptions, type ActionResult, type ClientModuleScope, type HydrationScopeApi, NAV_RUNTIME, type OutputHandler, type OutputHost, REACTIVE_RUNTIME, REALTIME_RUNTIME, type ServerCallOptions, WrnServerCallError, type WrnexusBrowserGlobals, callServerFunction, collectRefs, createActionClient, createOutputProxy, createServerProxy, getActionRuntime, getComponentControllerRuntime, getNavRuntime, getReactiveRuntime, getRealtimeRuntime, invalidateClientModule, invokeOutput, loadClientFunctions, registerOutputHandler };
     

    Examples

    Copy-ready examples from the installed package documentation.

    Server side — serve the runtime strings from your router (example with Bun.serve)

    import { getReactiveRuntime, getNavRuntime, getRealtimeRuntime } from "@wrnexus/csr";
     
     const routes: Record<string, string> = {
    @@ -330,7 +332,7 @@ room.on("chat", (msg) => console.log(msg.user, msg.text));
     room.send({ type: "chat", user: "ada", text: "hi" });
    - + } } diff --git a/app/pages/packages/db.wrn b/app/pages/packages/db.wrn index a7036c3a..c897d159 100644 --- a/app/pages/packages/db.wrn +++ b/app/pages/packages/db.wrn @@ -10,11 +10,11 @@ page wrnexusdb {
    W WRNexusJS - +
    -
    Data · Package reference

    @wrnexus/db

    Database adapters, typed queries, models, migrations, and sessions.

    v0.8.6Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/db@0.8.6

    Request preview access. Never put registry tokens in source control.

    Rollout-safe migrations

    +
    Data · Package reference

    @wrnexus/db

    Database adapters, typed queries, models, migrations, and sessions.

    v0.8.7Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/db@0.8.7

    Request preview access. Never put registry tokens in source control.

    Rollout-safe migrations

    Run wrnexus db check in CI before deployment. The analyzer reports stable diagnostics for drops, renames, type changes, new/enforced required columns, and potentially blocking index creation, with an expand/backfill/switch/contract recommendation. wrnexus db migrate blocks critical issues in pending migrations. --allow-breaking is an explicit operator override; already-applied migrations do not block later releases.

    The database layer for WRNexusJS: TS models as the single source of truth for DDL, validation, and result typing, plus a driver-based Db client, migrations, and a sqlc-style query generator.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    @@ -527,7 +527,7 @@ await repo.insert({ email: "a@b.com" }); const active = await repo.find({ active: true });
    - + } } diff --git a/app/pages/packages/dev-server.wrn b/app/pages/packages/dev-server.wrn index f3e1bb04..bd4525b2 100644 --- a/app/pages/packages/dev-server.wrn +++ b/app/pages/packages/dev-server.wrn @@ -10,11 +10,11 @@ page wrnexusdevserver {
    W WRNexusJS - +
    -
    Runtime · Package reference

    @wrnexus/dev-server

    Development and production servers, HMR, assets, and gateways.

    v0.8.6Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/dev-server@0.8.6

    Request preview access. Never put registry tokens in source control.

    The WRNexusJS HTTP + WebSocket server runtime — request dispatch, SSR document assembly, live-reload (HMR), and the portable production handler.
    +
    Runtime · Package reference

    @wrnexus/dev-server

    Development and production servers, HMR, assets, and gateways.

    v0.8.7Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/dev-server@0.8.7

    Request preview access. Never put registry tokens in source control.

    The WRNexusJS HTTP + WebSocket server runtime — request dispatch, SSR document assembly, live-reload (HMR), and the portable production handler.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    This package is the server runtime that powers a WRNexusJS app in both development and production. A single request runtime (createHandlers) owns HTTP/WebSocket dispatch and SSR document assembly; it knows nothing about _how_ modules and assets are produced, so the dev and prod entry points wire in different backends: dev uses dynamic module loading plus on-the-fly bundling and injects a live-reload client; prod uses a static, pre-built manifest with cache-immutable assets. The package also ships a multi-app gateway (route several apps by Host header behind one port) and a portable node:http adapter for WinterCG hosts. It is entirely server-side and Bun-native (Bun.serve, Bun.file, Bun.gzipSync).

    @@ -367,6 +367,7 @@ interface RuntimeDeps { hasFrameworkStyles?: boolean; /** App stylesheet already contains theme + UI CSS and is the only CSS request needed. */ stylesIncludeFramework?: boolean; + stylesIncludeUi?: boolean; /** Resolved theme config: enables `/__wrnexus/theme.css` + `<html data-theme>`. */ theme?: ResolvedTheme; /** Resolved i18n bundle: enables `ctx.t`, `<html lang>`, and `{t:key}` markers. */ @@ -594,12 +595,18 @@ interface ProdOptions { inlineStyles?: string; /** `stylesPath` contains theme + UI + app CSS in cascade order. */ stylesIncludeFramework?: boolean; + /** `stylesPath` already contains the shared Wire UI stylesheet. */ + stylesIncludeUi?: boolean; /** Absolute path to the pre-built reactive runtime. */ reactivePath?: string; + /** Absolute path to the on-demand component controller runtime. */ + controllersPath?: string; /** Absolute directory containing bundled per-WRN browser modules. */ clientModulesDir?: string; /** Absolute path to the pre-built theme stylesheet (`theme.css`). */ themePath?: string; + /** Pre-built active theme/accent stylesheets, loaded on demand. */ + themeAssetsDir?: string; /** Absolute path to the pre-built theme runtime (`theme.js`). */ themeJsPath?: string; /** Resolved theme config: enables `<html data-theme>` + `theme.css` link. */ @@ -860,7 +867,7 @@ await startGateway({ });
    - + } } diff --git a/app/pages/packages/dev-toolbar.wrn b/app/pages/packages/dev-toolbar.wrn index 0813b90e..8781d516 100644 --- a/app/pages/packages/dev-toolbar.wrn +++ b/app/pages/packages/dev-toolbar.wrn @@ -10,11 +10,11 @@ page wrnexusdevtoolbar {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/dev-toolbar

    Development toolbar diagnostics, inspection, and runtime status.

    v0.8.6Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/dev-toolbar@0.8.6

    Request preview access. Never put registry tokens in source control.

    Development-only page quality toolbar for WRNexusJS.

    +
    Tooling · Package reference

    @wrnexus/dev-toolbar

    Development toolbar diagnostics, inspection, and runtime status.

    v0.8.7Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/dev-toolbar@0.8.7

    Request preview access. Never put registry tokens in source control.

    Development-only page quality toolbar for WRNexusJS.

    Features

    • Runtime, resource and unhandled promise error capture
    • @@ -41,7 +41,7 @@ export { DEV_TOOLBAR_CSS, DEV_TOOLBAR_RUNTIME } from './client/index.j const issues = runDevToolbarRules(context);
    - + } } diff --git a/app/pages/packages/encryption.wrn b/app/pages/packages/encryption.wrn index bb245a49..c00005bd 100644 --- a/app/pages/packages/encryption.wrn +++ b/app/pages/packages/encryption.wrn @@ -10,11 +10,11 @@ page wrnexusencryption {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/encryption

    Hashing, HMAC, authenticated encryption, and key derivation.

    v0.8.6Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/encryption@0.8.6

    Request preview access. Never put registry tokens in source control.

    Authenticated encryption, hashing, HMAC, key rotation, and optional encrypted HTTP exchanges for WRNexusJS.

    +
    Security · Package reference

    @wrnexus/encryption

    Hashing, HMAC, authenticated encryption, and key derivation.

    v0.8.7Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/encryption@0.8.7

    Request preview access. Never put registry tokens in source control.

    Authenticated encryption, hashing, HMAC, key rotation, and optional encrypted HTTP exchanges for WRNexusJS.

    Core helpers

    • generateKey() — random 256-bit AES key encoded as base64.
    • @@ -213,7 +213,7 @@ const response = await fetch(request); const result = await decryptEncryptedResponse(response, request, { keyring });

    Install @wrnexus/encryption

    bun add @wrnexus/encryption
    - + } } diff --git a/app/pages/packages/graphql.wrn b/app/pages/packages/graphql.wrn index 8d64fc3e..e1c15456 100644 --- a/app/pages/packages/graphql.wrn +++ b/app/pages/packages/graphql.wrn @@ -10,16 +10,16 @@ page wrnexusgraphql {
    W WRNexusJS - +
    -
    Data · Package reference

    @wrnexus/graphql

    GraphQL schemas, routes, and framework plugin integration.

    v0.8.6Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/graphql@0.8.6

    Request preview access. Never put registry tokens in source control.

    Optional GraphQL endpoint plugin. Supply the executor from GraphQL.js, GraphQL Yoga, Mercurius, or another maintained engine; WRNexus owns bounded HTTP input, depth/alias limits, introspection policy, generic production errors and plugin route integration.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    export { G as GraphqlExecutionResult, a as GraphqlOptions, b as GraphqlRequest, c as createGraphqlHandler, default as graphqlPlugin } from './plugin.js';
    +      
    Data · Package reference

    @wrnexus/graphql

    GraphQL schemas, routes, and framework plugin integration.

    v0.8.7Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/graphql@0.8.7

    Request preview access. Never put registry tokens in source control.

    Optional GraphQL endpoint plugin. Supply the executor from GraphQL.js, GraphQL Yoga, Mercurius, or another maintained engine; WRNexus owns bounded HTTP input, depth/alias limits, introspection policy, generic production errors and plugin route integration.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    export { G as GraphqlExecutionResult, a as GraphqlOptions, b as GraphqlRequest, c as createGraphqlHandler, default as graphqlPlugin } from './plugin.js';
     import '@wrnexus/plugin';
     

    Examples

    Copy-ready examples from the installed package documentation.

    Install @wrnexus/graphql

    bun add @wrnexus/graphql

    Import @wrnexus/graphql

    import * as graphql from "@wrnexus/graphql";
    - + } } diff --git a/app/pages/packages/helpers.wrn b/app/pages/packages/helpers.wrn index 1e41bc73..5dfc45f4 100644 --- a/app/pages/packages/helpers.wrn +++ b/app/pages/packages/helpers.wrn @@ -10,11 +10,11 @@ page wrnexushelpers {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/helpers

    Safe Context URL helpers and forward-auth login redirects.

    v0.8.6Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/helpers@0.8.6

    Request preview access. Never put registry tokens in source control.

    Safe convenience helpers for common WRNexusJS application flows. The package uses standard Context, URL, and Response values and has no runtime dependency beyond @wrnexus/core.

    +
    Tooling · Package reference

    @wrnexus/helpers

    Safe Context URL helpers and forward-auth login redirects.

    v0.8.7Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/helpers@0.8.7

    Request preview access. Never put registry tokens in source control.

    Safe convenience helpers for common WRNexusJS application flows. The package uses standard Context, URL, and Response values and has no runtime dependency beyond @wrnexus/core.

    bun add @wrnexus/helpers

    The package is private, so the machine must be authenticated to the wrnexus npm organization.

    Usage

    @@ -156,7 +156,7 @@ export const GET = async (ctx: Context) => { };
    - + } } diff --git a/app/pages/packages/i18n.wrn b/app/pages/packages/i18n.wrn index 2310a1e8..fb0baa65 100644 --- a/app/pages/packages/i18n.wrn +++ b/app/pages/packages/i18n.wrn @@ -10,11 +10,11 @@ page wrnexusi18n {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/i18n

    Translation loading, locale resolution, and Intl formatting.

    v0.8.6Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/i18n@0.8.6

    Request preview access. Never put registry tokens in source control.

    Recursive locale loading, fallback resolution, SSR/browser translations, locale formatting, and language UI blocks for WRNexusJS.

    +
    Frontend · Package reference

    @wrnexus/i18n

    Translation loading, locale resolution, and Intl formatting.

    v0.8.7Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/i18n@0.8.7

    Request preview access. Never put registry tokens in source control.

    Recursive locale loading, fallback resolution, SSR/browser translations, locale formatting, and language UI blocks for WRNexusJS.

    Locale files

    Both layouts can be used together:

    app/locales/en.json
    @@ -231,7 +231,7 @@ const enXA = createPseudoLocale(messages.en);
     const arXB = createPseudoLocale(messages.en, { rtl: true });
    - + } } diff --git a/app/pages/packages/identity.wrn b/app/pages/packages/identity.wrn index 5060700c..f24e6c4c 100644 --- a/app/pages/packages/identity.wrn +++ b/app/pages/packages/identity.wrn @@ -10,11 +10,11 @@ page wrnexusidentity {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/identity

    Portable identity records, claims, and account linking.

    v0.8.6Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/identity@0.8.6

    Request preview access. Never put registry tokens in source control.

    Enterprise identity and governance for WRNexusJS: OIDC discovery, signed SAML adapter flows, LDAP/Active Directory synchronization adapters, SCIM provisioning, scoped API keys, service accounts, approval workflows, consent history, retention, subject export/deletion and audit.

    +
    Security · Package reference

    @wrnexus/identity

    Portable identity records, claims, and account linking.

    v0.8.7Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/identity@0.8.7

    Request preview access. Never put registry tokens in source control.

    Enterprise identity and governance for WRNexusJS: OIDC discovery, signed SAML adapter flows, LDAP/Active Directory synchronization adapters, SCIM provisioning, scoped API keys, service accounts, approval workflows, consent history, retention, subject export/deletion and audit.

    The package complements @wrnexus/auth (passkeys, MFA, devices, sessions, OAuth and audited impersonation) and @wrnexus/authz (RBAC, ABAC and policy decisions). Protocol-specific SAML and directory parsing is supplied through adapters so applications can select a maintained vendor SDK without weakening framework validation, replay protection or governance auditing.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    interface OidcMetadata {
         issuer: string;
         authorization_endpoint: string;
    @@ -233,7 +233,7 @@ export { type DirectoryAdapter, type EnterpriseIdentity, type GovernanceEve
     

    Examples

    Copy-ready examples from the installed package documentation.

    Install @wrnexus/identity

    bun add @wrnexus/identity

    Import @wrnexus/identity

    import * as identity from "@wrnexus/identity";
    - + } } diff --git a/app/pages/packages/image.wrn b/app/pages/packages/image.wrn index 26dbc160..ab0eaae3 100644 --- a/app/pages/packages/image.wrn +++ b/app/pages/packages/image.wrn @@ -10,11 +10,11 @@ page wrnexusimage {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/image

    Responsive image optimization, loaders, placeholders, and components.

    v0.8.6Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/image@0.8.6

    Request preview access. Never put registry tokens in source control.

    Secure responsive-image planning, loader adapters, picture sources, preload hints, placeholders, and performance auditing for WRNexusJS.

    +
    Frontend · Package reference

    @wrnexus/image

    Responsive image optimization, loaders, placeholders, and components.

    v0.8.7Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/image@0.8.7

    Request preview access. Never put registry tokens in source control.

    Secure responsive-image planning, loader adapters, picture sources, preload hints, placeholders, and performance auditing for WRNexusJS.

    Build-time conversion is available through optimizeImage. It normalizes and bounds width/format variants, prevents variant explosions, writes deterministic filenames, and returns a manifest with dimensions and byte sizes:

    import { optimizeImage } from "@wrnexus/image";
     
    @@ -219,7 +219,7 @@ const picture = createPicture({
     });
    - + } } diff --git a/app/pages/packages/jwt.wrn b/app/pages/packages/jwt.wrn index dd4b0c15..7b117ca0 100644 --- a/app/pages/packages/jwt.wrn +++ b/app/pages/packages/jwt.wrn @@ -10,11 +10,11 @@ page wrnexusjwt {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/jwt

    HS256 JWT signing, verification, and bearer authentication.

    v0.8.6Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/jwt@0.8.6

    Request preview access. Never put registry tokens in source control.

    Dependency-free JSON Web Tokens (HS256) via Web Crypto, plus a bearer-token auth middleware for WRNexusJS.
    +
    Security · Package reference

    @wrnexus/jwt

    HS256 JWT signing, verification, and bearer authentication.

    v0.8.7Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/jwt@0.8.7

    Request preview access. Never put registry tokens in source control.

    Dependency-free JSON Web Tokens (HS256) via Web Crypto, plus a bearer-token auth middleware for WRNexusJS.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/jwt signs and verifies stateless JSON Web Tokens using the HS256 (HMAC-SHA-256) algorithm. It has no runtime dependencies — signing and verification are implemented directly on the standard Web Crypto API (crypto.subtle), which Bun provides natively. It runs server-side and pairs with the session-based auth in @wrnexus/core, giving you a stateless option for API and mobile clients. Reach for it when you need bearer-token auth rather than cookie sessions.

    @@ -316,7 +316,7 @@ app.use(jwtAuth({ secret: process.env.JWT_SECRET! })); app.use(jwtAuth({ secret: process.env.JWT_SECRET!, required: false }));
    - + } } diff --git a/app/pages/packages/language-server.wrn b/app/pages/packages/language-server.wrn index 2d3b7bca..7285d84f 100644 --- a/app/pages/packages/language-server.wrn +++ b/app/pages/packages/language-server.wrn @@ -10,11 +10,11 @@ page wrnexuslanguageserver {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/language-server

    Editor-neutral language intelligence for WRN files.

    v0.8.6Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/language-server@0.8.6

    Request preview access. Never put registry tokens in source control.

    Editor-neutral Language Server Protocol support for .wrn files. It uses the canonical @wrnexus/syntax parser, diagnostics, accessibility rules, and formatter.

    +
    Tooling · Package reference

    @wrnexus/language-server

    Editor-neutral language intelligence for WRN files.

    v0.8.7Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/language-server@0.8.7

    Request preview access. Never put registry tokens in source control.

    Editor-neutral Language Server Protocol support for .wrn files. It uses the canonical @wrnexus/syntax parser, diagnostics, accessibility rules, and formatter.

    bunx wrnexus-language-server --stdio

    Capabilities include syntax, accessibility and TypeScript expression diagnostics, formatting, completion, hover, document symbols, go-to-definition, references, rename, and quick fixes. The custom wrnexus/virtualDocument request returns the mapped TypeScript representation of an open .wrn document for editor TypeScript plugins and safe refactoring tools. Any LSP 3.x client can launch the stdio command. Example Neovim configuration:

    vim.lsp.start({
    @@ -157,7 +157,7 @@ export { type Position, type Range, type TextDocument, WRN_COMPLETIONS, typ
     })
    - + } } diff --git a/app/pages/packages/mcp.wrn b/app/pages/packages/mcp.wrn index f3c5c317..3fb02fb3 100644 --- a/app/pages/packages/mcp.wrn +++ b/app/pages/packages/mcp.wrn @@ -10,11 +10,11 @@ page wrnexusmcp {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/mcp

    Model Context Protocol tools for WRNexus projects.

    v0.8.6Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/mcp@0.8.6

    Request preview access. Never put registry tokens in source control.

    Editor-neutral Model Context Protocol server for AI development tools.

    +
    Tooling · Package reference

    @wrnexus/mcp

    Model Context Protocol tools for WRNexus projects.

    v0.8.7Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/mcp@0.8.7

    Request preview access. Never put registry tokens in source control.

    Editor-neutral Model Context Protocol server for AI development tools.

    bunx wrnexus-mcp --root=.

    It exposes current routes, components with props/events, database schema files, compiler diagnostics, runtime errors, dev-server health, framework documentation and installed packages. Files are resolved inside the configured application root and returned as bounded structured JSON.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    interface McpTool {
         name: string;
    @@ -43,7 +43,7 @@ export { type McpServer, type McpServerOptions, type McpTool, createFramewo
     

    Examples

    Copy-ready examples from the installed package documentation.

    Editor-neutral Model Context Protocol server for AI development tools.

    bunx wrnexus-mcp --root=.

    Install @wrnexus/mcp

    bun add @wrnexus/mcp
    - + } } diff --git a/app/pages/packages/mobile.wrn b/app/pages/packages/mobile.wrn index 63edc6f5..f87643e0 100644 --- a/app/pages/packages/mobile.wrn +++ b/app/pages/packages/mobile.wrn @@ -10,11 +10,11 @@ page wrnexusmobile {
    W WRNexusJS - +
    -
    Native · Package reference

    @wrnexus/mobile

    SSR-safe compatibility access to Capacitor plugins.

    v0.8.6Private registryNative

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/mobile@0.8.6

    Request preview access. Never put registry tokens in source control.

    SSR-safe access to Capacitor plugins from WRNexusJS browser code.
    +
    Native · Package reference

    @wrnexus/mobile

    SSR-safe compatibility access to Capacitor plugins.

    v0.8.7Private registryNative

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/mobile@0.8.7

    Request preview access. Never put registry tokens in source control.

    SSR-safe access to Capacitor plugins from WRNexusJS browser code.

    Overview

    @wrnexus/mobile keeps optional native imports out of server rendering while giving browser-owned modules one consistent registry for Capacitor plugins. During SSR, mobile.isNative() is false and mobile.platform() is "web".

    Install a plugin through the WRNexusJS CLI so the web and native projects stay aligned:

    @@ -213,7 +213,7 @@ const network = mobile.plugin<NetworkPlugin>("Network"); const status = network ? await network.getStatus() : { connected: true, connectionType: "unknown" };
    - + } } diff --git a/app/pages/packages/native.wrn b/app/pages/packages/native.wrn index 3401b9b2..1e2e5909 100644 --- a/app/pages/packages/native.wrn +++ b/app/pages/packages/native.wrn @@ -10,11 +10,11 @@ page wrnexusnative {
    W WRNexusJS - +
    -
    Native · Package reference

    @wrnexus/native

    Cross-platform browser and Capacitor capability registry.

    v0.8.6Private registryNative

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/native@0.8.6

    Request preview access. Never put registry tokens in source control.

    Cross-platform capabilities for browsers, Capacitor WebViews, and compiled native apps.
    +
    Native · Package reference

    @wrnexus/native

    Cross-platform browser and Capacitor capability registry.

    v0.8.7Private registryNative

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/native@0.8.7

    Request preview access. Never put registry tokens in source control.

    Cross-platform capabilities for browsers, Capacitor WebViews, and compiled native apps.

    Overview

    @wrnexus/native exposes capabilities by name so application code can ask what the current platform supports before presenting an action. Browser capabilities use Web APIs; mobile capabilities use installed Capacitor plugins. platform() returns "server" during SSR, "browser" on the web, and the Capacitor platform in a native WebView.

    bun add @wrnexus/native
    @@ -154,7 +154,7 @@ const position = await native.run( );
    - + } } diff --git a/app/pages/packages/oauth.wrn b/app/pages/packages/oauth.wrn index 529f7a22..ab83785c 100644 --- a/app/pages/packages/oauth.wrn +++ b/app/pages/packages/oauth.wrn @@ -10,11 +10,11 @@ page wrnexusoauth {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/oauth

    OAuth 2.0, PKCE, provider presets, and profile mapping.

    v0.8.6Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/oauth@0.8.6

    Request preview access. Never put registry tokens in source control.

    Dependency-free OAuth 2.0 sign-in for any provider, with PKCE and presets for Google, GitHub, and Discord.
    +
    Security · Package reference

    @wrnexus/oauth

    OAuth 2.0, PKCE, provider presets, and profile mapping.

    v0.8.7Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/oauth@0.8.7

    Request preview access. Never put registry tokens in source control.

    Dependency-free OAuth 2.0 sign-in for any provider, with PKCE and presets for Google, GitHub, and Discord.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/oauth implements the OAuth 2.0 Authorization Code flow (with PKCE) for server-side sign-in. It ships ready-made provider presets and a defineProvider helper for custom providers, then gives you two flow functions — startAuth (build the redirect) and completeAuth (exchange the code and fetch the user's profile). It has no runtime dependencies: it uses the platform fetch and WebCrypto only. Pairs naturally with @wrnexus/core's logIn to establish a session once you have a normalized profile.

    @@ -350,7 +350,7 @@ const gitlab = defineProvider({ });
    - + } } diff --git a/app/pages/packages/observability.wrn b/app/pages/packages/observability.wrn index 8e435d3c..6491b8bf 100644 --- a/app/pages/packages/observability.wrn +++ b/app/pages/packages/observability.wrn @@ -10,11 +10,11 @@ page wrnexusobservability {
    W WRNexusJS - +
    -
    Runtime · Package reference

    @wrnexus/observability

    Structured logging, tracing, health, and integration adapters.

    v0.8.6Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/observability@0.8.6

    Request preview access. Never put registry tokens in source control.

    Open-standard traces, metrics, logs, health checks, Web Vitals, error reporting and profiling.

    +
    Runtime · Package reference

    @wrnexus/observability

    Structured logging, tracing, health, and integration adapters.

    v0.8.7Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/observability@0.8.7

    Request preview access. Never put registry tokens in source control.

    Open-standard traces, metrics, logs, health checks, Web Vitals, error reporting and profiling.

    Use createOperationTracer() for database, cache, queue, realtime, server-action or custom application spans. Export through OTLP, Prometheus, Zipkin/Jaeger, or the Sentry-compatible error reporter; Grafana can consume the Prometheus or OTLP signals.

    Privacy-conscious counters, gauges, histograms, HTTP middleware, Web Vitals ingestion, browser collection, and exporter adapters. Request bodies and user identifiers are not collected by default.

    export default {
    @@ -72,7 +72,7 @@ export const ready = createReadinessHandler(health);

    Liveness reports whether the process can answer requests. Readiness returns HTTP 503 when a registered dependency is down. Dependency messages and details are hidden unless exposeDetails: true is explicitly selected for a trusted endpoint.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    export { MetricLabels, MetricPoint, MetricsRegistry } from './metrics.js';
     export { MetricExporter, MetricsMiddlewareOptions, WebVitalRecord, WebVitalsHandlerOptions, createHttpMetricExporter, createOtlpMetricExporter, createWebVitalsHandler, defaultMetrics, metricsMiddleware } from './server.js';
     export { WebVitalsClientOptions, webVitalsClient } from './client.js';
    -export { SpanExporter, SpanRecord, TraceContext, TraceMiddlewareOptions, createOtlpTraceExporter, formatTraceparent, parseTraceparent, traceMiddleware } from './trace.js';
    +export { S as SpanExporter, a as SpanRecord, T as TraceContext, b as TraceMiddlewareOptions, c as createOtlpTraceExporter, f as formatTraceparent, p as parseTraceparent, t as traceMiddleware } from './trace-CvRlPzhE.js';
     export { HealthHandlerOptions, createLivenessHandler, createReadinessHandler } from './health.js';
     export { LogLevel, LogRecord, StructuredLogger, StructuredLoggerOptions, createStructuredLogger } from './logging.js';
     export { ErrorReporter, FrameworkSpanKind, LogExporter, OperationTracer, createJaegerExporter, createOperationTracer, createOtlpLogExporter, createPerformanceProfiler, createPrometheusPushExporter, createSentryCompatibleReporter, createZipkinExporter, renderPrometheus } from './integrations.js';
    @@ -126,7 +126,7 @@ export const live = createLivenessHandler();
     export const ready = createReadinessHandler(health);
    - + } } diff --git a/app/pages/packages/playground.wrn b/app/pages/packages/playground.wrn index 7f0f4f91..49b871a4 100644 --- a/app/pages/packages/playground.wrn +++ b/app/pages/packages/playground.wrn @@ -10,11 +10,11 @@ page wrnexusplayground {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/playground

    Interactive framework examples and executable playground utilities.

    v0.8.6Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/playground@0.8.6

    Request preview access. Never put registry tokens in source control.

    A deployable, shareable .wrn playground with diagnostics, generated JavaScript, safe SSR-shaped HTML, sandboxed preview, reactive/UI examples, and version adapters.

    +
    Tooling · Package reference

    @wrnexus/playground

    Interactive framework examples and executable playground utilities.

    v0.8.7Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/playground@0.8.7

    Request preview access. Never put registry tokens in source control.

    A deployable, shareable .wrn playground with diagnostics, generated JavaScript, safe SSR-shaped HTML, sandboxed preview, reactive/UI examples, and version adapters.

    Run wrnexus playground, or deploy createPlaygroundHandler().

    Complete TypeScript API

    Generated from the exact installed package declarations.

    interface PlaygroundCompilation {
         source: string;
         generated: string;
    @@ -59,7 +59,7 @@ export { type PlaygroundCompilation, type PlaygroundVersionAdapter, compare
     

    Examples

    Copy-ready examples from the installed package documentation.

    Install @wrnexus/playground

    bun add @wrnexus/playground

    Import @wrnexus/playground

    import * as playground from "@wrnexus/playground";
    - + } } diff --git a/app/pages/packages/plugin.wrn b/app/pages/packages/plugin.wrn index c40199ab..00c8bdb9 100644 --- a/app/pages/packages/plugin.wrn +++ b/app/pages/packages/plugin.wrn @@ -10,11 +10,11 @@ page wrnexusplugin {
    W WRNexusJS - +
    -
    Core · Package reference

    @wrnexus/plugin

    Plugin contracts, lifecycle hooks, composition, and framework integration.

    v0.8.6Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/plugin@0.8.6

    Request preview access. Never put registry tokens in source control.

    Least-privilege package permissions

    +
    Core · Package reference

    @wrnexus/plugin

    Plugin contracts, lifecycle hooks, composition, and framework integration.

    v0.8.7Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/plugin@0.8.7

    Request preview access. Never put registry tokens in source control.

    Least-privilege package permissions

    Package manifests declare every framework capability they register:

    {
       "wrnexus": {
    @@ -79,7 +79,7 @@ export { type PluginCompatibilityResult, type PluginCompatibilityTarget, Pl
     };
    - + } } diff --git a/app/pages/packages/pubsub.wrn b/app/pages/packages/pubsub.wrn index ff1395b7..f277108f 100644 --- a/app/pages/packages/pubsub.wrn +++ b/app/pages/packages/pubsub.wrn @@ -10,11 +10,11 @@ page wrnexuspubsub {
    W WRNexusJS - +
    -
    Realtime · Package reference

    @wrnexus/pubsub

    In-process and Redis-backed publish/subscribe.

    v0.8.6Private registryRealtime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/pubsub@0.8.6

    Request preview access. Never put registry tokens in source control.

    Topic-based publish/subscribe with a pluggable driver — in-process by default, Redis for cross-process messaging.
    +
    Realtime · Package reference

    @wrnexus/pubsub

    In-process and Redis-backed publish/subscribe.

    v0.8.7Private registryRealtime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/pubsub@0.8.7

    Request preview access. Never put registry tokens in source control.

    Topic-based publish/subscribe with a pluggable driver — in-process by default, Redis for cross-process messaging.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/pubsub is a small server-side pub/sub bus. You publish messages to a topic and subscribe with topic patterns; handlers fire for matching topics. The default driver keeps everything in-process, and you can swap in the Redis driver (@wrnexus/pubsub/redis) to fan messages out across processes or hosts. It also backs @wrnexus/core's realtime bridge for horizontal scaling.

    @@ -98,7 +98,10 @@ await bus.close();
  • The Redis driver reads REDIS_URL from the environment when no url is passed.
  • Backs [@wrnexus/core](../core)'s realtime bridge for horizontal scaling.
  • No external npm dependencies — the Redis client is a self-contained RESP codec.
  • -

    Complete TypeScript API

    Generated from the exact installed package declarations.

    interface MessageEnvelope<T = unknown> {
    +

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { Context } from '@wrnexus/core';
    +import { SubjectContext } from '@wrnexus/rpc';
    +
    +interface MessageEnvelope<T = unknown> {
         id: string;
         topic: string;
         data: T;
    @@ -128,6 +131,16 @@ declare class PresenceChannel {
         prune(): number;
     }
     
    +interface SubjectPubSub {
    +    publish<T>(ctx: Context, topic: string, message: T): Promise<void>;
    +    subscribe<T>(pattern: string, handler: (message: T, topic: string, subject?: SubjectContext) => void | Promise<void>): () => void;
    +}
    +/**
    + * Authenticated pub/sub envelope. The token uses a fixed, purpose-specific
    + * audience; subscribers verify it before exposing the message to a handler.
    + */
    +declare function subjectPubSub(bus: PubSub): SubjectPubSub;
    +
     /**
      * @wrnexus/pubsub — topic-based publish/subscribe with a pluggable driver.
      * The default is in-process; swap in a Redis/NATS driver for cross-instance
    @@ -170,7 +183,7 @@ interface KafkaClient {
     /** Kafka adapter contract; consumer-group/rebalance policy remains owned by the selected client. */
     declare function kafkaDriver(client: KafkaClient): PubSubDriver;
     
    -export { type Handler, type KafkaClient, type MessageEnvelope, type NatsClient, PresenceChannel, type PresenceMember, type PubSub, type PubSubDriver, type ResilientPubSubOptions, createPubSub, createResilientPubSub, kafkaDriver, memoryDriver, natsDriver };
    +export { type Handler, type KafkaClient, type MessageEnvelope, type NatsClient, PresenceChannel, type PresenceMember, type PubSub, type PubSubDriver, type ResilientPubSubOptions, type SubjectPubSub, createPubSub, createResilientPubSub, kafkaDriver, memoryDriver, natsDriver, subjectPubSub };
     

    Examples

    Copy-ready examples from the installed package documentation.

    In-process (default)

    import { createPubSub } from "@wrnexus/pubsub";
     
     const bus = createPubSub();
    @@ -197,7 +210,7 @@ await bus.publish("order:created", { id: 7 });
     await bus.close();
    - + } } diff --git a/app/pages/packages/pwa.wrn b/app/pages/packages/pwa.wrn index 73bb5bd6..c79e9666 100644 --- a/app/pages/packages/pwa.wrn +++ b/app/pages/packages/pwa.wrn @@ -10,11 +10,11 @@ page wrnexuspwa {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/pwa

    Progressive Web App manifests, service workers, and offline strategies.

    v0.8.6Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/pwa@0.8.6

    Request preview access. Never put registry tokens in source control.

    Official PWA primitives for manifests, service workers, offline pages and precaching, runtime caching, background synchronization, push notifications, install/update events, offline mutation stores, and conflict resolution. createOfflineQueue() accepts a durable IndexedDB-style store and retries requests with stable idempotency headers.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    interface IndexedDbMigration {
    +      
    Frontend · Package reference

    @wrnexus/pwa

    Progressive Web App manifests, service workers, and offline strategies.

    v0.8.7Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/pwa@0.8.7

    Request preview access. Never put registry tokens in source control.

    Official PWA primitives for manifests, service workers, offline pages and precaching, runtime caching, background synchronization, push notifications, install/update events, offline mutation stores, and conflict resolution. createOfflineQueue() accepts a durable IndexedDB-style store and retries requests with stable idempotency headers.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    interface IndexedDbMigration {
         version: number;
         migrate(db: IDBDatabase, transaction: IDBTransaction): void;
     }
    @@ -176,7 +176,7 @@ export { type ConflictResolution, type IndexedDbMigration, type OfflineMuta
     

    Examples

    Copy-ready examples from the installed package documentation.

    Install @wrnexus/pwa

    bun add @wrnexus/pwa

    Import @wrnexus/pwa

    import * as pwa from "@wrnexus/pwa";
    - + } } diff --git a/app/pages/packages/queue.wrn b/app/pages/packages/queue.wrn index e6740cf9..a0c4bfd4 100644 --- a/app/pages/packages/queue.wrn +++ b/app/pages/packages/queue.wrn @@ -10,11 +10,11 @@ page wrnexusqueue {
    W WRNexusJS - +
    -
    Data · Package reference

    @wrnexus/queue

    Background jobs with delay, concurrency, retry, and repetition.

    v0.8.6Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/queue@0.8.6

    Request preview access. Never put registry tokens in source control.

    A background job queue with delays, retries + exponential backoff, recurring jobs, and concurrent workers.
    +
    Data · Package reference

    @wrnexus/queue

    Background jobs with delay, concurrency, retry, and repetition.

    v0.8.7Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/queue@0.8.7

    Request preview access. Never put registry tokens in source control.

    A background job queue with delays, retries + exponential backoff, recurring jobs, and concurrent workers.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/queue is a server-side in-process job queue. You register named workers, enqueue jobs (optionally delayed or recurring), and let the queue poll and run them on a timer — with per-job retry limits and doubling backoff between attempts. The default store lives in memory; the design allows a pluggable driver to back it with Redis/SQL for durability across restarts. Reach for it when you need to defer work (emails, webhooks, cleanup) off the request path without a heavyweight external broker. Tests can drive it deterministically via drain().

    @@ -125,7 +125,8 @@ await engine.approve(workflow, run.id, "approve", currentUser.id);The default store is in-process, so queued jobs do not survive a restart; a

    pluggable driver is intended for backing it with Redis/SQL for durability.

  • Works alongside @wrnexus/core for offloading work from the request path.
  • -

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { ExecutionContext } from '@wrnexus/core';
    +

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { ExecutionContext, Context } from '@wrnexus/core';
    +import { SubjectContext } from '@wrnexus/rpc';
     
     /**
      * Persistence contract for the durable queue.
    @@ -284,6 +285,24 @@ interface WorkflowEngine {
     declare function createWorkflowEngine(store?: WorkflowStore): WorkflowEngine;
     declare function defineDurableWorkflow<I>(definition: WorkflowDefinition<I>): WorkflowDefinition<I>;
     
    +interface SubjectEnvelope<T> {
    +    payload: T;
    +    identity?: string;
    +}
    +interface SubjectJob<T> extends Omit<Job<SubjectEnvelope<T>>, "data"> {
    +    data: T;
    +    subject?: SubjectContext;
    +}
    +interface SubjectQueue {
    +    add<T>(ctx: Context, name: string, data: T, options?: AddOptions): Promise<Job<SubjectEnvelope<T>>>;
    +    process<T>(name: string, handler: (job: SubjectJob<T>, context: {
    +        signal: AbortSignal;
    +    }) => void | Promise<void>): void;
    +}
    +/** Queue adapter that persists a signed end-user context alongside job data. */
    +/** Works with both the in-memory Queue and createDurableQueue(). */
    +declare function subjectQueue(queue: Queue | DurableQueue): SubjectQueue;
    +
     /**
      * @wrnexus/queue — a background job queue with delays, retries + backoff, and
      * concurrent workers. The default store is in-process; a pluggable driver lets
    @@ -381,7 +400,7 @@ declare function defineWorkflow<T>(name: string, steps: Array<WorkflowS
     declare function cronToInterval(cron: string): number;
     declare function createQueue(options?: QueueOptions): Queue;
     
    -export { type AddOptions, type DurableQueue, type DurableQueueOptions, type Job, type JobContext, type JobDefinition, type JobHandler, POSTGRES_QUEUE_SCHEMA, type Queue, type QueueDashboardSnapshot, type QueueOptions, type QueueScheduler, type QueueStore, type RedisQueueClient, type ScheduledJob, type SqlQueueClient, type WorkflowDefinition, type WorkflowEngine, type WorkflowRunContext, type WorkflowSnapshot, type WorkflowStatus, type WorkflowStep, type WorkflowStore, addBatch, createDurableQueue, createQueue, createQueueScheduler, createWorkflowEngine, cronToInterval, defineDurableWorkflow, defineJob, defineWorkflow, memoryQueueStore, memoryWorkflowStore, postgresQueueStore, queueDashboardSnapshot, redisQueueStore, renderQueueDashboard, runQueueDaemon };
    +export { type AddOptions, type DurableQueue, type DurableQueueOptions, type Job, type JobContext, type JobDefinition, type JobHandler, POSTGRES_QUEUE_SCHEMA, type Queue, type QueueDashboardSnapshot, type QueueOptions, type QueueScheduler, type QueueStore, type RedisQueueClient, type ScheduledJob, type SqlQueueClient, type SubjectJob, type SubjectQueue, type WorkflowDefinition, type WorkflowEngine, type WorkflowRunContext, type WorkflowSnapshot, type WorkflowStatus, type WorkflowStep, type WorkflowStore, addBatch, createDurableQueue, createQueue, createQueueScheduler, createWorkflowEngine, cronToInterval, defineDurableWorkflow, defineJob, defineWorkflow, memoryQueueStore, memoryWorkflowStore, postgresQueueStore, queueDashboardSnapshot, redisQueueStore, renderQueueDashboard, runQueueDaemon, subjectQueue };
     

    Examples

    Copy-ready examples from the installed package documentation.

    Register workers, enqueue jobs, then start the poller

    import { createQueue } from "@wrnexus/queue";
     
     const queue = createQueue({ maxAttempts: 3, backoffMs: 1000 });
    @@ -421,7 +440,7 @@ const run = await engine.start(workflow, input);
     await engine.approve(workflow, run.id, "approve", currentUser.id);
    - + } } diff --git a/app/pages/packages/reactive.wrn b/app/pages/packages/reactive.wrn index 57295364..edcdc869 100644 --- a/app/pages/packages/reactive.wrn +++ b/app/pages/packages/reactive.wrn @@ -10,11 +10,11 @@ page wrnexusreactive {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/reactive

    Small type-safe reactive signal primitives.

    v0.8.6Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/reactive@0.8.6

    Request preview access. Never put registry tokens in source control.

    Tiny, type-safe reactive primitives (signals) with zero dependencies.
    +
    Frontend · Package reference

    @wrnexus/reactive

    Small type-safe reactive signal primitives.

    v0.8.7Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/reactive@0.8.7

    Request preview access. Never put registry tokens in source control.

    Tiny, type-safe reactive primitives (signals) with zero dependencies.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/reactive is the seed of WRNexusJS's reactivity layer: a minimal signal primitive that holds a value, notifies subscribers when it changes, and hands back an unsubscribe function. It is deliberately small and framework-agnostic — it powers nothing on its own, but is shaped so client islands (and later the .wrn compiler's state blocks) can build reactive bindings on top of it. Reach for it when you need observable state without pulling in a full reactivity library.

    @@ -206,7 +206,7 @@ const user: Signal<{ name: string } | null> = signal(null); user.set({ name: "Ada" });
    - + } } diff --git a/app/pages/packages/realtime.wrn b/app/pages/packages/realtime.wrn index 98786175..0d5ba6ca 100644 --- a/app/pages/packages/realtime.wrn +++ b/app/pages/packages/realtime.wrn @@ -10,11 +10,11 @@ page wrnexusrealtime {
    W WRNexusJS - +
    -
    Realtime · Package reference

    @wrnexus/realtime

    Rooms, presence, messaging, history, streams, and UI components.

    v0.8.6Private registryRealtime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/realtime@0.8.6

    Request preview access. Never put registry tokens in source control.

    Typed rooms, secure message envelopes, browser room helpers, presence utilities, and complete realtime UI blocks for WRNexusJS.

    +
    Realtime · Package reference

    @wrnexus/realtime

    Rooms, presence, messaging, history, streams, and UI components.

    v0.8.7Private registryRealtime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/realtime@0.8.7

    Request preview access. Never put registry tokens in source control.

    Typed rooms, secure message envelopes, browser room helpers, presence utilities, and complete realtime UI blocks for WRNexusJS.

    Server rooms

    import { defineRoom } from "@wrnexus/realtime";
     
    @@ -267,7 +267,7 @@ history.acknowledge("support", clientId, entry.sequence);
     const missed = history.resume("support", clientId);
    - + } } diff --git a/app/pages/packages/router.wrn b/app/pages/packages/router.wrn index 29b37248..dcb3d482 100644 --- a/app/pages/packages/router.wrn +++ b/app/pages/packages/router.wrn @@ -10,11 +10,11 @@ page wrnexusrouter {
    W WRNexusJS - +
    -
    Core · Package reference

    @wrnexus/router

    Filesystem discovery, route matching, and typed route generation.

    v0.8.6Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/router@0.8.6

    Request preview access. Never put registry tokens in source control.

    File-based router that maps an app/ directory onto route tables and matches request paths against them.
    +
    Core · Package reference

    @wrnexus/router

    Filesystem discovery, route matching, and typed route generation.

    v0.8.7Private registryCore

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/router@0.8.7

    Request preview access. Never put registry tokens in source control.

    File-based router that maps an app/ directory onto route tables and matches request paths against them.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/router scans an application's app/ directory once at startup and builds route tables for pages, API endpoints, realtime channels, middleware, server-rendered .wrn components, layouts, and validation schemas. It also compiles URL patterns (/users/[id]) into RegExps and matches request paths against them. Request input is never turned into a file path, which makes the router immune to path traversal. This is a server-side package used by the WRNexusJS runtime to resolve incoming requests, plus a codegen helper for compile-time typed links.

    @@ -306,7 +306,7 @@ const routes = sortRoutes([{ raw: "/posts/[slug]", file: " const m = matchRoute(routes, "/posts/hello"); // { route, params: { slug: "hello" } }
    - + } } diff --git a/app/pages/packages/security.wrn b/app/pages/packages/security.wrn index c386c8f5..7e00e6ef 100644 --- a/app/pages/packages/security.wrn +++ b/app/pages/packages/security.wrn @@ -10,11 +10,11 @@ page wrnexussecurity {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/security

    Security headers, CSRF protection, rate limits, and safe rendering.

    v0.8.6Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/security@0.8.6

    Request preview access. Never put registry tokens in source control.

    Secure-by-default utilities for WRNexusJS: bounded HTML-safe serialization, prototype-pollution rejection, URL policy, secure cookies, request hardening, security presets, and SSRF-safe remote fetches.

    +
    Security · Package reference

    @wrnexus/security

    Security headers, CSRF protection, rate limits, and safe rendering.

    v0.8.7Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/security@0.8.7

    Request preview access. Never put registry tokens in source control.

    Secure-by-default utilities for WRNexusJS: bounded HTML-safe serialization, prototype-pollution rejection, URL policy, secure cookies, request hardening, security presets, and SSRF-safe remote fetches.

    import { safeFetch, securityPreset, setSecureCookie } from "@wrnexus/security";
     
     export default { security: securityPreset("strict") };
    @@ -59,7 +59,7 @@ const response = await safeFetch(remoteUrl, { allowedHosts: ["api.exam
     setSecureCookie(ctx, "__Host-session", sessionId);

    Install @wrnexus/security

    bun add @wrnexus/security
    - + } } diff --git a/app/pages/packages/ssr.wrn b/app/pages/packages/ssr.wrn index b7c7d2b2..52c5e494 100644 --- a/app/pages/packages/ssr.wrn +++ b/app/pages/packages/ssr.wrn @@ -10,11 +10,11 @@ page wrnexusssr {
    W WRNexusJS - +
    -
    Runtime · Package reference

    @wrnexus/ssr

    Secure HTML document rendering and SEO metadata.

    v0.8.6Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/ssr@0.8.6

    Request preview access. Never put registry tokens in source control.

    Server-side rendering: wraps a page's HTML body in a complete HTML document with a metadata-driven <head>.
    +
    Runtime · Package reference

    @wrnexus/ssr

    Secure HTML document rendering and SEO metadata.

    v0.8.7Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/ssr@0.8.7

    Request preview access. Never put registry tokens in source control.

    Server-side rendering: wraps a page's HTML body in a complete HTML document with a metadata-driven <head>.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    Pages in WRNexusJS return an HTML string for the body. @wrnexus/ssr takes that body and produces a full HTML document — building the <head> from page metadata and global SEO defaults, resolving canonical/Open Graph/Twitter tags, and injecting module preloads and <script type="module"> tags. It is deliberately server-only: nothing in this package touches the DOM or ships to the browser, keeping server code genuinely server-only. Reach for it on the server when turning a rendered page body into a response document.

    @@ -224,7 +224,7 @@ return new Response(html, { return new Response(html, { headers: { "content-type": "text/html; charset=utf-8" } });
    - + } } diff --git a/app/pages/packages/store.wrn b/app/pages/packages/store.wrn index c9cdcbc0..2ce2c017 100644 --- a/app/pages/packages/store.wrn +++ b/app/pages/packages/store.wrn @@ -10,11 +10,11 @@ page wrnexusstore {
    W WRNexusJS - +
    -
    Data · Package reference

    @wrnexus/store

    Application state stores shared across server and browser runtimes.

    v0.8.6Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/store@0.8.6

    Request preview access. Never put registry tokens in source control.

    Typed global and page-scoped WRNexusJS stores with runtime-specific state, computed values, actions, lifecycle hooks, persistence, SSR isolation, and HMR support.

    +
    Data · Package reference

    @wrnexus/store

    Application state stores shared across server and browser runtimes.

    v0.8.7Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/store@0.8.7

    Request preview access. Never put registry tokens in source control.

    Typed global and page-scoped WRNexusJS stores with runtime-specific state, computed values, actions, lifecycle hooks, persistence, SSR isolation, and HMR support.

    Use defineStore() to declare a store and createStoreContainer() to create an isolated request or browser container. Store definitions are framework helpers and do not require UI components.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { StoreMutation, StoreFunction, StoreDefinition, StoreInstance, StoreCombinedState } from './types.js';
     export { PersistenceStorage, StoreActionContext, StoreActionDefinition, StoreInstanceCore, StoreKind, StoreLifecycleContext, StorePersistenceConfig, StoreRuntime } from './types.js';
     
    @@ -62,7 +62,7 @@ export { StoreCombinedState, StoreContainer, type StoreContainerOptions, St
     

    Examples

    Copy-ready examples from the installed package documentation.

    Install @wrnexus/store

    bun add @wrnexus/store

    Import @wrnexus/store

    import * as store from "@wrnexus/store";
    - + } } diff --git a/app/pages/packages/styles.wrn b/app/pages/packages/styles.wrn index 341e92a2..ec4a3a14 100644 --- a/app/pages/packages/styles.wrn +++ b/app/pages/packages/styles.wrn @@ -10,11 +10,11 @@ page wrnexusstyles {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/styles

    CSS pipeline, themes, fonts, profiles, and application config.

    v0.8.6Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/styles@0.8.6

    Request preview access. Never put registry tokens in source control.

    Reusable layers and presets

    +
    Frontend · Package reference

    @wrnexus/styles

    CSS pipeline, themes, fonts, profiles, and application config.

    v0.8.7Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/styles@0.8.7

    Request preview access. Never put registry tokens in source control.

    Reusable layers and presets

    Compose local or package foundations in order; later layers override earlier ones and the application has final base-config precedence:

    export default defineConfig({
       extends: ["@workroot/wrnexus-enterprise", "./layers/company"],
    @@ -251,6 +251,7 @@ interface ResolvedTheme {
     declare const THEME_COOKIE = "wire-theme";
     declare const ACCENT_COOKIE = "wire-accent";
     declare const THEME_CSS_HREF = "/__wrnexus/theme.css";
    +declare const THEME_CSS_PREFIX = "/__wrnexus/theme/";
     declare const THEME_JS_HREF = "/__wrnexus/theme.js";
     /**
      * Single source of truth for both configured palettes and runtime accents.
    @@ -265,6 +266,10 @@ declare function resolveThemeConfig(config?: ThemeConfig): ResolvedTheme;
     declare function resolveThemeName(cookieValue: string | undefined, theme: ResolvedTheme): string;
     /** Pick a valid accent name from a cookie value, falling back to the configured default. */
     declare function resolveAccentName(cookieValue: string | undefined, theme: ResolvedTheme): ThemePaletteName | undefined;
    +/** URL for the small stylesheet containing only one active theme/accent pair. */
    +declare function activeThemeCssHref(themeName: string, accentName?: string): string;
    +/** Render only the tokens needed for the current SSR-selected theme and accent. */
    +declare function renderActiveThemeCss(theme: ResolvedTheme, themeName: string, accentName?: string): string;
     /**
      * Generate the theme stylesheet.
      *
    @@ -812,7 +817,7 @@ declare function auditCssPerformance(source: string): CssPerformanceAuditIssue[]
      */
     declare function renderStyles(ctx: StyleProcessContext, styles?: StylesConfig): Promise<string>;
     
    -export { ACCENT_COOKIE, type AppConfig, type BuildConfig, CURRENT_COMPATIBILITY_DATE, CURRENT_FRAMEWORK_BEHAVIOUR, type CompatibilityPolicy, type CompatibilityReport, type ConfigIssue, type ContrastResult, type CssPerformanceAuditIssue, type CssTokenAudit, type CustomThemePalette, DEFAULT_THEMES, type DevToolbarConfig, type ExperimentalConfig, type ExplainedConfig, type FontConfig, type FontDisplay, type GoogleFont, type LocalFontFace, type MobileConfig, type Mode, type NavigationConfig, type ObservabilityConfig, type PerformanceConfig, type PwaConfig, type ResolvedConfigLayers, type ResolvedTheme, type StyleProcessContext, type StyleSource, type StylesConfig, type Mode as StylesMode, THEME_COOKIE, THEME_CSS_HREF, THEME_JS_HREF, THEME_PALETTES, THEME_PALETTE_NAMES, type TenancyConfig, type ThemeAccentConfig, type ThemeConfig, type ThemePaletteName, type ThemeSemanticColor, type ThemeToken, type ThemeTokens, auditCssPerformance, auditWireTokens, bundleCss, contrast, defineConfig, defineThemeTokens, explainAppConfig, findStyleEntry, fontCspSources, headToString, isCompatibilityDate, loadAppConfig, loadEnv, loadRawConfig, normalizeStyleSources, renderFontHead, renderProductionFontHead, renderStyles, renderThemeCss, renderThemeRuntime, resolveAccentName, resolveCompatibility, resolveConfigLayers, resolveProfile, resolveThemeConfig, resolveThemeName, tailwindSourceDirectives, themeVar, validateAppConfig };
    +export { ACCENT_COOKIE, type AppConfig, type BuildConfig, CURRENT_COMPATIBILITY_DATE, CURRENT_FRAMEWORK_BEHAVIOUR, type CompatibilityPolicy, type CompatibilityReport, type ConfigIssue, type ContrastResult, type CssPerformanceAuditIssue, type CssTokenAudit, type CustomThemePalette, DEFAULT_THEMES, type DevToolbarConfig, type ExperimentalConfig, type ExplainedConfig, type FontConfig, type FontDisplay, type GoogleFont, type LocalFontFace, type MobileConfig, type Mode, type NavigationConfig, type ObservabilityConfig, type PerformanceConfig, type PwaConfig, type ResolvedConfigLayers, type ResolvedTheme, type StyleProcessContext, type StyleSource, type StylesConfig, type Mode as StylesMode, THEME_COOKIE, THEME_CSS_HREF, THEME_CSS_PREFIX, THEME_JS_HREF, THEME_PALETTES, THEME_PALETTE_NAMES, type TenancyConfig, type ThemeAccentConfig, type ThemeConfig, type ThemePaletteName, type ThemeSemanticColor, type ThemeToken, type ThemeTokens, activeThemeCssHref, auditCssPerformance, auditWireTokens, bundleCss, contrast, defineConfig, defineThemeTokens, explainAppConfig, findStyleEntry, fontCspSources, headToString, isCompatibilityDate, loadAppConfig, loadEnv, loadRawConfig, normalizeStyleSources, renderActiveThemeCss, renderFontHead, renderProductionFontHead, renderStyles, renderThemeCss, renderThemeRuntime, resolveAccentName, resolveCompatibility, resolveConfigLayers, resolveProfile, resolveThemeConfig, resolveThemeName, tailwindSourceDirectives, themeVar, validateAppConfig };
     

    Examples

    Copy-ready examples from the installed package documentation.

    wrnexus.config.ts

    import type { AppConfig } from "@wrnexus/styles";
     
     export default {
    @@ -885,7 +890,7 @@ const themeJs = renderThemeRuntime(theme); // served at THEME_JS_HREF
    - + } } diff --git a/app/pages/packages/syntax.wrn b/app/pages/packages/syntax.wrn index 71c4b333..44711ebf 100644 --- a/app/pages/packages/syntax.wrn +++ b/app/pages/packages/syntax.wrn @@ -10,11 +10,11 @@ page wrnexussyntax {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/syntax

    Editor syntax definitions and language tooling for .wrn files.

    v0.8.6Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/syntax@0.8.6

    Request preview access. Never put registry tokens in source control.

    Canonical WRN lexer, parser, AST, language metadata, source positions, and stable diagnostics. Framework tooling should import this package instead of implementing a separate .wrn parser.

    +
    Frontend · Package reference

    @wrnexus/syntax

    Editor syntax definitions and language tooling for .wrn files.

    v0.8.7Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/syntax@0.8.7

    Request preview access. Never put registry tokens in source control.

    Canonical WRN lexer, parser, AST, language metadata, source positions, and stable diagnostics. Framework tooling should import this package instead of implementing a separate .wrn parser.

    See docs/WRN-LANGUAGE-SPEC-1.0.md in the WRNexusJS repository.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    export { LexError, Lexer } from './tokenizer.js';
     export { FormatWrnOptions, formatWrn } from './formatter.js';
     export { A as ActionBlock, a as ApiBlock, b as Attr, C as ComputedDecl, D as DataApiBlock, c as DataMode, E as EffectBlock, d as EventDecl, F as FunctionParameterDecl, e as FunctionRuntime, L as LifecycleBlock, f as LoadBlock, M as ModeFunctionsBlock, O as OutputDecl, P as PageAst, g as ParseError, h as PersistDecl, i as PropDecl, R as RealtimeBlock, j as RealtimeHandler, k as RuntimeFunctionDecl, S as SeoBlock, l as StateDecl, m as StateRuntime, n as StoreKind, o as StoreLifecycleDecl, p as StructuredImportDecl, V as VOID_ELEMENTS, q as ViewNode, W as WatchBlock, r as parse, s as parseComputedDeclarations, t as parseHtmlView, u as parseOutputs, v as parsePersist, w as parseRuntimeFunctions, x as parseStateDeclarations, y as parseStoreLifecycle, z as parseStructuredImports, B as stripRuntimeFunctionModifiers } from './parser-CTLO4mcT.js';
    @@ -49,7 +49,7 @@ const ast = parse('component Greeting { view { <p>Hello</p>
     const summary = diagnosticSummary(diagnose(source));
    - + } } diff --git a/app/pages/packages/test.wrn b/app/pages/packages/test.wrn index 6b0cc531..2d48b244 100644 --- a/app/pages/packages/test.wrn +++ b/app/pages/packages/test.wrn @@ -10,11 +10,11 @@ page wrnexustest {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/test

    WRNexusJS-aware component, route, and browser testing utilities.

    v0.8.6Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/test@0.8.6

    Request preview access. Never put registry tokens in source control.

    Testing utilities for WRNexusJS apps — component rendering, reactive-DOM mounting, route handler calls, and a full in-process app harness, plus a one-import re-export of bun:test.
    +
    Tooling · Package reference

    @wrnexus/test

    WRNexusJS-aware component, route, and browser testing utilities.

    v0.8.7Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/test@0.8.7

    Request preview access. Never put registry tokens in source control.

    Testing utilities for WRNexusJS apps — component rendering, reactive-DOM mounting, route handler calls, and a full in-process app harness, plus a one-import re-export of bun:test.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/test is the server-side test toolkit you reach for when writing tests for a WRNexusJS app. It runs under bun test (invoked via wrnexus test) and gives you a single import surface: the bun:test primitives (test, expect, mock, …) re-exported alongside WRNexusJS-aware helpers that compile .wrn components, hydrate server HTML in a DOM, invoke API route handlers, and boot the real app on an ephemeral port for integration tests.

    @@ -267,7 +267,7 @@ test("health endpoint", async () => { });
    - + } } diff --git a/app/pages/packages/tracking.wrn b/app/pages/packages/tracking.wrn index d8e1e36f..b493f5d6 100644 --- a/app/pages/packages/tracking.wrn +++ b/app/pages/packages/tracking.wrn @@ -10,11 +10,11 @@ page wrnexustracking {
    W WRNexusJS - +
    -
    Runtime · Package reference

    @wrnexus/tracking

    Error/event capture, middleware, filtering, and sinks.

    v0.8.6Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/tracking@0.8.6

    Request preview access. Never put registry tokens in source control.

    Error tracking for WRNexusJS apps: capture exceptions manually or via middleware and fan them out to pluggable sinks.
    +
    Runtime · Package reference

    @wrnexus/tracking

    Error/event capture, middleware, filtering, and sinks.

    v0.8.7Private registryRuntime

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/tracking@0.8.7

    Request preview access. Never put registry tokens in source control.

    Error tracking for WRNexusJS apps: capture exceptions manually or via middleware and fan them out to pluggable sinks.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/tracking is a small, server-side error-capture layer. You create a tracker with one or more sinks, then feed it errors — either manually with tracker.capture(err, context) or automatically by mounting tracker.middleware() in your request pipeline. A consoleSink is included; forwarding to Sentry, Datadog, or any other backend is just a matter of writing a tiny sink. Reach for it when you want a single, sink-agnostic place to route application errors. Sinks run best-effort — a throwing sink never breaks the request.

    @@ -199,7 +199,7 @@ const tracker = createTracker({ tracker.addSink(anotherSink); // add more sinks later
    - + } } diff --git a/app/pages/packages/typecheck.wrn b/app/pages/packages/typecheck.wrn index cf9f4cbd..2cb949a0 100644 --- a/app/pages/packages/typecheck.wrn +++ b/app/pages/packages/typecheck.wrn @@ -10,11 +10,11 @@ page wrnexustypecheck {
    W WRNexusJS - +
    -
    Tooling · Package reference

    @wrnexus/typecheck

    WRN-aware TypeScript diagnostics and virtual documents.

    v0.8.6Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/typecheck@0.8.6

    Request preview access. Never put registry tokens in source control.

    Static type checking for .wrn declarations, props, state, outputs, functions, stores, and generated virtual TypeScript files.

    +
    Tooling · Package reference

    @wrnexus/typecheck

    WRN-aware TypeScript diagnostics and virtual documents.

    v0.8.7Private registryTooling

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/typecheck@0.8.7

    Request preview access. Never put registry tokens in source control.

    Static type checking for .wrn declarations, props, state, outputs, functions, stores, and generated virtual TypeScript files.

    The package is compiler tooling rather than a browser UI package, so its public kit consists of programmatic typecheck helpers and diagnostics.

    Complete TypeScript API

    Generated from the exact installed package declarations.

    import { PageAst } from '@wrnexus/syntax';
     export { componentContract, storeContract } from './contracts.js';
     export { findAppRoot, loadApplicationTypes } from './project.js';
    @@ -65,7 +65,7 @@ export { type TypecheckOptions, type VirtualTypeScriptModule, type WrnTypeD
     

    Examples

    Copy-ready examples from the installed package documentation.

    Install @wrnexus/typecheck

    bun add @wrnexus/typecheck

    Import @wrnexus/typecheck

    import * as typecheck from "@wrnexus/typecheck";
    - + } } diff --git a/app/pages/packages/ui.wrn b/app/pages/packages/ui.wrn index 7ec6c9dc..972fba92 100644 --- a/app/pages/packages/ui.wrn +++ b/app/pages/packages/ui.wrn @@ -10,11 +10,11 @@ page wrnexusui {
    W WRNexusJS - +
    -
    Frontend · Package reference

    @wrnexus/ui

    Themeable server-rendered UI components and CSS.

    v0.8.6Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/ui@0.8.6

    Request preview access. Never put registry tokens in source control.

    First-party Wire UI component library — a set of themeable .wrn components plus a single tokenized stylesheet.
    +
    Frontend · Package reference

    @wrnexus/ui

    Themeable server-rendered UI components and CSS.

    v0.8.7Private registryFrontend

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/ui@0.8.7

    Request preview access. Never put registry tokens in source control.

    First-party Wire UI component library — a set of themeable .wrn components plus a single tokenized stylesheet.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Overview

    @wrnexus/ui ships a library of server-rendered .wrn components (layout, form controls, and feedback UI) together with one themeable stylesheet, ui.css. The components are auto-discovered by the framework router — you don't import them in code. Once the package's component directory is on the router's scan path, you mount any component in a page with data-component="<name>". Every visual is driven by var(--wire-*) theme tokens, so components restyle instantly when the theme changes. The tiny JS surface (src/index.ts) exists only so the toolchain (CLI build + dev server) can locate the component directory and stylesheet.

    @@ -51,10 +51,8 @@ page wrnexusui { "./ui.css": "./ui.css" }

    The framework serves this stylesheet once at /__wrnexus/ui.css, so pages get all component styles from a single request.

    -

    Tailwind and motion

    -

    Components use static Tailwind utility classes alongside the shared .wire-* layer. If the package is consumed by a separate Tailwind build, include its component sources so every utility is generated:

    -
    @import "tailwindcss";
    -@source "../node_modules/@wrnexus/ui/components/*.wrn";
    +

    Component styles and motion

    +

    Components own their BEM styles in local style {} blocks and do not require a Tailwind scan. ui.css supplies only global tokens, resets, and shared primitives. Applications can still use Tailwind independently in their own source files.

    The shared stylesheet gives all component boundaries consistent, GPU-friendly entry and interaction motion. Override --wire-motion-fast, --wire-motion-base, --wire-motion-slow, --wire-ease-standard, or --wire-ease-emphasized to tune it. Hover lift is limited to precise pointing devices and prefers-reduced-motion is honored automatically.

    Using the selected theme in application UI

    The active theme and palette are not limited to @wrnexus/ui components. The framework exposes the resolved values as semantic CSS custom properties, so pages and custom .wrn components can use the same contract:

    @@ -105,10 +103,10 @@ const router = buildRouter(appDir, { componentDirs: [uiComponentsDir()]  <div data-component="badge" label="New"></div> <button data-component="button" label="Save" variant="primary" size="lg"></button> <div data-component="alert" variant="success" title="Done" message="Saved."></div> -</div>

    Explore the component library

    Browse interactive examples and complete component usage in the dedicated WRNexusJS component showcase.

    Browse all 108 components →

    - +</div>

    Explore the component library

    Browse interactive examples and complete component usage in the dedicated WRNexusJS component showcase.

    Browse all 102 components →

    +
    - + } } diff --git a/app/pages/packages/uploader.wrn b/app/pages/packages/uploader.wrn index b7d676c7..c0d6da04 100644 --- a/app/pages/packages/uploader.wrn +++ b/app/pages/packages/uploader.wrn @@ -10,11 +10,11 @@ page wrnexusuploader {
    W WRNexusJS - +
    -
    Data · Package reference

    @wrnexus/uploader

    Validated local/S3 uploads and secure file serving.

    v0.8.6Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/uploader@0.8.6

    Request preview access. Never put registry tokens in source control.

    Config-driven file uploads + serving for WRNexusJS. Declare named storage stores (local disk or any S3-compatible backend) in wrnexus.config.ts, upload with one function call, drop a drag-and-drop widget on a page, and serve files back — public or private. Zero external dependencies (S3 is signed with a built-in AWS SigV4 implementation, like the rest of the framework).

    +
    Data · Package reference

    @wrnexus/uploader

    Validated local/S3 uploads and secure file serving.

    v0.8.7Private registryData

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/uploader@0.8.7

    Request preview access. Never put registry tokens in source control.

    Config-driven file uploads + serving for WRNexusJS. Declare named storage stores (local disk or any S3-compatible backend) in wrnexus.config.ts, upload with one function call, drop a drag-and-drop widget on a page, and serve files back — public or private. Zero external dependencies (S3 is signed with a built-in AWS SigV4 implementation, like the rest of the framework).

    Usage

    Configure local and S3 stores

    // wrnexus.config.ts
    @@ -334,7 +334,7 @@ declare function serveStoredFile(pathname: string): Promise<Response | null&g
      * backticks and no ${...}, so it embeds safely in the exported template string.
      */
     declare const UPLOAD_JS_HREF = "/__wrnexus/uploader.js";
    -declare const UPLOAD_RUNTIME = "\n(function () {\n  if (typeof document === \"undefined\") return;\n  var CSRF_COOKIE = \"wire-csrf\";\n\n  var CSS =\n    \".wire-uploader{display:block}\" +\n    \".wire-uploader-zone{display:flex;align-items:center;justify-content:center;text-align:center;\" +\n      \"min-height:8rem;padding:1.25rem;border:2px dashed var(--wire-border,#cbd5e1);border-radius:12px;\" +\n      \"background:var(--wire-surface,transparent);color:var(--wire-muted,#64748b);cursor:pointer;\" +\n      \"transition:border-color .15s ease,background-color .15s ease;position:relative}\" +\n    \".wire-uploader-zone:hover,.wire-uploader-zone:focus-visible{border-color:var(--wire-brand,#3f7dff);outline:none}\" +\n    \".wire-uploader-zone.is-drag{border-color:var(--wire-brand,#3f7dff);background:color-mix(in oklab,var(--wire-brand,#3f7dff) 8%,transparent)}\" +\n    \".wire-uploader-prompt{font-size:.9rem;pointer-events:none}\" +\n    \".wire-uploader-input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}\" +\n    \".wire-uploader-list{list-style:none;margin:.75rem 0 0;padding:0;display:flex;flex-direction:column;gap:.5rem}\" +\n    \".wire-uploader-item{display:grid;grid-template-columns:1fr auto;gap:.15rem .75rem;align-items:center;\" +\n      \"font-size:.82rem;padding:.5rem .7rem;border:1px solid var(--wire-border,#e2e8f0);border-radius:8px}\" +\n    \".wire-uploader-name{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--wire-text,#0f172a)}\" +\n    \".wire-uploader-meta{color:var(--wire-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n    \".wire-uploader-bar{grid-column:1/-1;height:5px;border-radius:999px;background:var(--wire-border,#e2e8f0);overflow:hidden}\" +\n    \".wire-uploader-fill{height:100%;width:0;border-radius:999px;background:var(--wire-brand,#3f7dff);transition:width .15s ease}\" +\n    \".wire-uploader-status{grid-column:1/-1;font-size:.75rem;color:var(--wire-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n    \".wire-uploader-item.is-done .wire-uploader-fill{background:var(--wire-success,#16a34a)}\" +\n    \".wire-uploader-item.is-done .wire-uploader-status{color:var(--wire-success,#16a34a)}\" +\n    \".wire-uploader-item.is-error .wire-uploader-fill{background:var(--wire-danger,#dc2626)}\" +\n    \".wire-uploader-item.is-error .wire-uploader-status{color:var(--wire-danger,#dc2626)}\";\n\n  function injectCss() {\n    if (document.getElementById(\"wire-uploader-css\")) return;\n    var s = document.createElement(\"style\");\n    s.id = \"wire-uploader-css\";\n    s.textContent = CSS;\n    document.head.appendChild(s);\n  }\n\n  function cookie(name) {\n    var m = document.cookie.match(new RegExp(\"(?:^|; )\" + name + \"=([^;]*)\"));\n    return m ? decodeURIComponent(m[1]) : \"\";\n  }\n  function el(tag, cls, text) {\n    var e = document.createElement(tag);\n    if (cls) e.className = cls;\n    if (text != null) e.textContent = text;\n    return e;\n  }\n  function fmt(n) {\n    if (n < 1024) return n + \" B\";\n    if (n < 1048576) return (n / 1024).toFixed(1) + \" KB\";\n    return (n / 1048576).toFixed(1) + \" MB\";\n  }\n  function accepts(accept, file) {\n    var list = (accept || \"\").split(\",\").map(function (s) { return s.trim().toLowerCase(); }).filter(Boolean);\n    if (!list.length) return true;\n    var type = (file.type || \"\").toLowerCase();\n    var name = (file.name || \"\").toLowerCase();\n    var ext = name.indexOf(\".\") >= 0 ? name.slice(name.lastIndexOf(\".\")) : \"\";\n    return list.some(function (rule) {\n      if (rule.charAt(0) === \".\") return rule === ext;\n      if (rule.slice(-2) === \"/*\") return type.indexOf(rule.slice(0, -1)) === 0;\n      return rule === type;\n    });\n  }\n\n  function setup(root) {\n    if (root.__wrnexusUploader) return;\n    root.__wrnexusUploader = true;\n\n    var endpoint = root.getAttribute(\"data-endpoint\") || \"/api/upload\";\n    var multipleAttr = root.getAttribute(\"data-multiple\");\n    var multiple = root.hasAttribute(\"data-multiple\") && multipleAttr !== \"false\";\n    var accept = root.getAttribute(\"data-accept\") || \"\";\n    var maxBytes = parseInt(root.getAttribute(\"data-max\") || \"0\", 10) || 0;\n    var field = root.getAttribute(\"data-field\") || (multiple ? \"files\" : \"file\");\n    var invalidate = String(root.getAttribute(\"data-invalidate\") || \"\")\n      .split(\",\")\n      .map(function (tag) { return tag.trim(); })\n      .filter(Boolean);\n    var promptText = root.getAttribute(\"data-label\") || \"Drag files here or click to browse\";\n\n    root.classList.add(\"wire-uploader\");\n    var zone = el(\"div\", \"wire-uploader-zone\");\n    zone.setAttribute(\"role\", \"button\");\n    zone.setAttribute(\"tabindex\", \"0\");\n    zone.appendChild(el(\"div\", \"wire-uploader-prompt\", promptText));\n    var input = document.createElement(\"input\");\n    input.type = \"file\";\n    input.className = \"wire-uploader-input\";\n    if (multiple) input.multiple = true;\n    if (accept) input.accept = accept;\n    zone.appendChild(input);\n    var listEl = el(\"ul\", \"wire-uploader-list\");\n    root.appendChild(zone);\n    root.appendChild(listEl);\n\n    zone.addEventListener(\"keydown\", function (e) {\n      if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); input.click(); }\n    });\n    [\"dragenter\", \"dragover\"].forEach(function (ev) {\n      zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.add(\"is-drag\"); });\n    });\n    [\"dragleave\", \"drop\"].forEach(function (ev) {\n      zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.remove(\"is-drag\"); });\n    });\n    zone.addEventListener(\"drop\", function (e) {\n      if (e.dataTransfer && e.dataTransfer.files) handle(e.dataTransfer.files);\n    });\n    input.addEventListener(\"change\", function () {\n      if (input.files) handle(input.files);\n      input.value = \"\";\n    });\n\n    function handle(files) {\n      var arr = Array.prototype.slice.call(files);\n      if (!multiple) arr = arr.slice(0, 1);\n      arr.forEach(uploadOne);\n    }\n\n    function row(file) {\n      var li = el(\"li\", \"wire-uploader-item\");\n      li.appendChild(el(\"span\", \"wire-uploader-name\", file.name));\n      li.appendChild(el(\"span\", \"wire-uploader-meta\", fmt(file.size)));\n      var bar = el(\"div\", \"wire-uploader-bar\");\n      var fill = el(\"div\", \"wire-uploader-fill\");\n      bar.appendChild(fill);\n      li.appendChild(bar);\n      var status = el(\"span\", \"wire-uploader-status\", \"\");\n      li.appendChild(status);\n      listEl.appendChild(li);\n      return { li: li, fill: fill, status: status };\n    }\n\n    function uploadOne(file) {\n      var ui = row(file);\n      if (maxBytes && file.size > maxBytes) return fail(ui, \"Too large (max \" + fmt(maxBytes) + \")\", file);\n      if (!accepts(accept, file)) return fail(ui, \"Type not allowed\", file);\n\n      var fd = new FormData();\n      fd.append(field, file, file.name);\n      var xhr = new XMLHttpRequest();\n      xhr.open(\"POST\", endpoint, true);\n      var token = cookie(CSRF_COOKIE);\n      if (token) xhr.setRequestHeader(\"x-csrf-token\", token);\n      xhr.upload.addEventListener(\"progress\", function (e) {\n        if (e.lengthComputable) {\n          var pct = Math.round((e.loaded / e.total) * 100);\n          ui.fill.style.width = pct + \"%\";\n          ui.status.textContent = pct + \"%\";\n        }\n      });\n      xhr.addEventListener(\"load\", function () {\n        var data = null;\n        try { data = JSON.parse(xhr.responseText); } catch (e2) {}\n        if (xhr.status >= 200 && xhr.status < 300 && data && data.ok) {\n          done(ui, (data.files && data.files[0]) || null, file);\n        } else {\n          fail(ui, (data && data.error) || (\"Upload failed (\" + xhr.status + \")\"), file);\n        }\n      });\n      xhr.addEventListener(\"error\", function () { fail(ui, \"Network error\", file); });\n      xhr.send(fd);\n    }\n\n    function done(ui, info, file) {\n      ui.li.classList.remove(\"is-error\");\n      ui.li.classList.add(\"is-done\");\n      ui.fill.style.width = \"100%\";\n      ui.status.textContent = \"\\u2713 Uploaded\";\n      root.dispatchEvent(new CustomEvent(\"wrnexus:upload\", { bubbles: true, detail: { file: file, result: info } }));\n      if (invalidate.length) {\n        window.dispatchEvent(new CustomEvent(\"wrnexus:cache:invalidate\", {\n          detail: { tags: invalidate, source: \"uploader\", file: file, result: info }\n        }));\n      }\n    }\n    function fail(ui, msg, file) {\n      ui.li.classList.add(\"is-error\");\n      ui.status.textContent = \"\\u2717 \" + msg;\n      root.dispatchEvent(new CustomEvent(\"wrnexus:upload-error\", { bubbles: true, detail: { file: file, error: msg } }));\n    }\n  }\n\n  function init() {\n    injectCss();\n    var nodes = document.querySelectorAll(\"[data-uploader]\");\n    for (var i = 0; i < nodes.length; i++) setup(nodes[i]);\n  }\n  if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", init);\n  else init();\n})();\n";
    +declare const UPLOAD_RUNTIME = "\n(function () {\n  if (typeof document === \"undefined\") return;\n  var CSRF_COOKIE = \"wire-csrf\";\n\n  var CSS =\n    \".wire-uploader{display:block}\" +\n    \".wire-uploader-zone{display:flex;align-items:center;justify-content:center;text-align:center;\" +\n      \"min-height:8rem;padding:1.25rem;border:2px dashed var(--wire-border,#cbd5e1);border-radius:12px;\" +\n      \"background:var(--wire-surface,transparent);color:var(--wire-muted,#64748b);cursor:pointer;\" +\n      \"transition:border-color .15s ease,background-color .15s ease;position:relative}\" +\n    \".wire-uploader-zone:hover,.wire-uploader-zone:focus-visible{border-color:var(--wire-brand,#3f7dff);outline:none}\" +\n    \".wire-uploader-zone.is-drag{border-color:var(--wire-brand,#3f7dff);background:color-mix(in oklab,var(--wire-brand,#3f7dff) 8%,transparent)}\" +\n    \".wire-uploader-prompt{font-size:.9rem;pointer-events:none}\" +\n    \".wire-uploader-input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}\" +\n    \".wire-uploader-list{list-style:none;margin:.75rem 0 0;padding:0;display:flex;flex-direction:column;gap:.5rem}\" +\n    \".wire-uploader-item{display:grid;grid-template-columns:1fr auto;gap:.15rem .75rem;align-items:center;\" +\n      \"font-size:.82rem;padding:.5rem .7rem;border:1px solid var(--wire-border,#e2e8f0);border-radius:8px}\" +\n    \".wire-uploader-name{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--wire-text,#0f172a)}\" +\n    \".wire-uploader-meta{color:var(--wire-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n    \".wire-uploader-bar{grid-column:1/-1;height:5px;border-radius:999px;background:var(--wire-border,#e2e8f0);overflow:hidden}\" +\n    \".wire-uploader-fill{height:100%;width:0;border-radius:999px;background:var(--wire-brand,#3f7dff);transition:width .15s ease}\" +\n    \".wire-uploader-status{grid-column:1/-1;font-size:.75rem;color:var(--wire-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n    \".wire-uploader-item.is-done .wire-uploader-fill{background:var(--wire-success,#16a34a)}\" +\n    \".wire-uploader-item.is-done .wire-uploader-status{color:var(--wire-success,#16a34a)}\" +\n    \".wire-uploader-item.is-error .wire-uploader-fill{background:var(--wire-danger,#dc2626)}\" +\n    \".wire-uploader-item.is-error .wire-uploader-status{color:var(--wire-danger,#dc2626)}\";\n\n  function injectCss() {\n    if (document.getElementById(\"wire-uploader-css\")) return;\n    var s = document.createElement(\"style\");\n    s.id = \"wire-uploader-css\";\n    s.textContent = CSS;\n    document.head.appendChild(s);\n  }\n\n  function cookie(name) {\n    var m = document.cookie.match(new RegExp(\"(?:^|; )\" + name + \"=([^;]*)\"));\n    return m ? decodeURIComponent(m[1]) : \"\";\n  }\n  function el(tag, cls, text) {\n    var e = document.createElement(tag);\n    if (cls) e.className = cls;\n    if (text != null) e.textContent = text;\n    return e;\n  }\n  function fmt(n) {\n    if (n < 1024) return n + \" B\";\n    if (n < 1048576) return (n / 1024).toFixed(1) + \" KB\";\n    return (n / 1048576).toFixed(1) + \" MB\";\n  }\n  function accepts(accept, file) {\n    var list = (accept || \"\").split(\",\").map(function (s) { return s.trim().toLowerCase(); }).filter(Boolean);\n    if (!list.length) return true;\n    var type = (file.type || \"\").toLowerCase();\n    var name = (file.name || \"\").toLowerCase();\n    var ext = name.indexOf(\".\") >= 0 ? name.slice(name.lastIndexOf(\".\")) : \"\";\n    return list.some(function (rule) {\n      if (rule.charAt(0) === \".\") return rule === ext;\n      if (rule.slice(-2) === \"/*\") return type.indexOf(rule.slice(0, -1)) === 0;\n      return rule === type;\n    });\n  }\n\n  function setup(root) {\n    if (root.__wrnexusUploader) return;\n    root.__wrnexusUploader = true;\n\n    var endpoint = root.getAttribute(\"data-endpoint\") || \"/api/upload\";\n    var multipleAttr = root.getAttribute(\"data-multiple\");\n    var multiple = root.hasAttribute(\"data-multiple\") && multipleAttr !== \"false\";\n    var accept = root.getAttribute(\"data-accept\") || \"\";\n    var maxBytes = parseInt(root.getAttribute(\"data-max\") || \"0\", 10) || 0;\n    var field = root.getAttribute(\"data-field\") || (multiple ? \"files\" : \"file\");\n    var invalidate = String(root.getAttribute(\"data-invalidate\") || \"\")\n      .split(\",\")\n      .map(function (tag) { return tag.trim(); })\n      .filter(Boolean);\n    var promptText = root.getAttribute(\"data-label\") || \"Drag files here or click to browse\";\n\n    root.classList.add(\"wire-uploader\");\n    var zone = el(\"div\", \"wire-uploader-zone\");\n    zone.setAttribute(\"role\", \"button\");\n    zone.setAttribute(\"tabindex\", \"0\");\n    zone.appendChild(el(\"div\", \"wire-uploader-prompt\", promptText));\n    var input = document.createElement(\"input\");\n    input.type = \"file\";\n    input.className = \"wire-uploader-input\";\n    if (multiple) input.multiple = true;\n    if (accept) input.accept = accept;\n    zone.appendChild(input);\n    var listEl = el(\"ul\", \"wire-uploader-list\");\n    root.appendChild(zone);\n    root.appendChild(listEl);\n\n    zone.addEventListener(\"keydown\", function (e) {\n      if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); input.click(); }\n    });\n    [\"dragenter\", \"dragover\"].forEach(function (ev) {\n      zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.add(\"is-drag\"); });\n    });\n    [\"dragleave\", \"drop\"].forEach(function (ev) {\n      zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.remove(\"is-drag\"); });\n    });\n    zone.addEventListener(\"drop\", function (e) {\n      if (e.dataTransfer && e.dataTransfer.files) handle(e.dataTransfer.files);\n    });\n    input.addEventListener(\"change\", function () {\n      if (input.files) handle(input.files);\n      input.value = \"\";\n    });\n\n    function handle(files) {\n      var arr = Array.prototype.slice.call(files);\n      if (!multiple) arr = arr.slice(0, 1);\n      arr.forEach(uploadOne);\n    }\n\n    function row(file) {\n      var li = el(\"li\", \"wire-uploader-item\");\n      li.appendChild(el(\"span\", \"wire-uploader-name\", file.name));\n      li.appendChild(el(\"span\", \"wire-uploader-meta\", fmt(file.size)));\n      var bar = el(\"div\", \"wire-uploader-bar\");\n      var fill = el(\"div\", \"wire-uploader-fill\");\n      bar.appendChild(fill);\n      li.appendChild(bar);\n      var status = el(\"span\", \"wire-uploader-status\", \"\");\n      li.appendChild(status);\n      listEl.appendChild(li);\n      return { li: li, fill: fill, status: status };\n    }\n\n    function uploadOne(file) {\n      var ui = row(file);\n      if (maxBytes && file.size > maxBytes) return fail(ui, \"Too large (max \" + fmt(maxBytes) + \")\", file);\n      if (!accepts(accept, file)) return fail(ui, \"Type not allowed\", file);\n\n      var fd = new FormData();\n      fd.append(field, file, file.name);\n      var xhr = new XMLHttpRequest();\n      xhr.open(\"POST\", endpoint, true);\n      var token = cookie(CSRF_COOKIE);\n      if (token) xhr.setRequestHeader(\"x-csrf-token\", token);\n      xhr.upload.addEventListener(\"progress\", function (e) {\n        if (e.lengthComputable) {\n          var pct = Math.round((e.loaded / e.total) * 100);\n          ui.fill.style.width = pct + \"%\";\n          ui.status.textContent = pct + \"%\";\n        }\n      });\n      xhr.addEventListener(\"load\", function () {\n        var data = null;\n        try { data = JSON.parse(xhr.responseText); }\n        catch (error) { console.warn(\"[wrnexus:uploader] upload response was not valid JSON\", error); }\n        if (xhr.status >= 200 && xhr.status < 300 && data && data.ok) {\n          done(ui, (data.files && data.files[0]) || null, file);\n        } else {\n          fail(ui, (data && data.error) || (\"Upload failed (\" + xhr.status + \")\"), file);\n        }\n      });\n      xhr.addEventListener(\"error\", function () { fail(ui, \"Network error\", file); });\n      xhr.send(fd);\n    }\n\n    function done(ui, info, file) {\n      ui.li.classList.remove(\"is-error\");\n      ui.li.classList.add(\"is-done\");\n      ui.fill.style.width = \"100%\";\n      ui.status.textContent = \"\\u2713 Uploaded\";\n      root.dispatchEvent(new CustomEvent(\"wrnexus:upload\", { bubbles: true, detail: { file: file, result: info } }));\n      if (invalidate.length) {\n        window.dispatchEvent(new CustomEvent(\"wrnexus:cache:invalidate\", {\n          detail: { tags: invalidate, source: \"uploader\", file: file, result: info }\n        }));\n      }\n    }\n    function fail(ui, msg, file) {\n      ui.li.classList.add(\"is-error\");\n      ui.status.textContent = \"\\u2717 \" + msg;\n      root.dispatchEvent(new CustomEvent(\"wrnexus:upload-error\", { bubbles: true, detail: { file: file, error: msg } }));\n    }\n  }\n\n  function init() {\n    injectCss();\n    var nodes = document.querySelectorAll(\"[data-uploader]\");\n    for (var i = 0; i < nodes.length; i++) setup(nodes[i]);\n  }\n  if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", init);\n  else init();\n})();\n";
     
     /**
      * Local-disk storage driver. Files live under a configured directory; keys map
    @@ -632,7 +632,7 @@ import { serveFromStore } from "@wrnexus/uploader";
     export const GET = serveFromStore("docs"); // your middleware decides who gets in
    - + } } diff --git a/app/pages/packages/validation.wrn b/app/pages/packages/validation.wrn index 65e54198..2afca7c2 100644 --- a/app/pages/packages/validation.wrn +++ b/app/pages/packages/validation.wrn @@ -10,11 +10,11 @@ page wrnexusvalidation {
    W WRNexusJS - +
    -
    Security · Package reference

    @wrnexus/validation

    Typed schemas, coercion, validation, and browser descriptors.

    v0.8.6Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/validation@0.8.6

    Request preview access. Never put registry tokens in source control.

    One fluent schema, validated on the server (API bodies, env vars) and mirrored to an eval-free browser validator for forms.
    +
    Security · Package reference

    @wrnexus/validation

    Typed schemas, coercion, validation, and browser descriptors.

    v0.8.7Private registrySecurity

    Install the package

    After WorkRoot approves private registry access, install the release-aligned package:

    bun add @wrnexus/validation@0.8.7

    Request preview access. Never put registry tokens in source control.

    One fluent schema, validated on the server (API bodies, env vars) and mirrored to an eval-free browser validator for forms.

    Part of the WRNexusJS framework — an SSR-first, Bun-native full-stack web framework.

    Boundary contracts

    Use ContractRegistry with defineContract or defineEvent to publish the same schema descriptors for APIs, actions, webhooks, realtime, queues, cron, pub/sub, plugins, configuration, and environment variables.

    @@ -545,7 +545,7 @@ const head = `<script>${renderSchemasScript({ signup: signupSche // render a <form data-schema="signup"> with [data-error="email"] etc.
    - + } } diff --git a/app/pages/releases/0.8.7.wrn b/app/pages/releases/0.8.7.wrn new file mode 100644 index 00000000..a315ec4f --- /dev/null +++ b/app/pages/releases/0.8.7.wrn @@ -0,0 +1,16 @@ +page Release087 { + seo { + title = "Release 0.8.7" + description = "WRNexusJS 0.8.7 release notes." + canonical = "https://wrnexusjs.dev/releases/0.8.7" + } + view { + +
    +
    W WRNexusJS
    + +

    WRNexusJS 0.8.7

    Released 2026-07-13. All 47 installed packages are aligned to this version. Highlights include the new helpers package, reliable workspace app addition, and browser SSO redirects through forward authentication. See the changelog, upgrade guide, and package references.

    + +
    + } +} \ No newline at end of file diff --git a/app/pages/roadmap.wrn b/app/pages/roadmap.wrn index 8583c352..43fea649 100644 --- a/app/pages/roadmap.wrn +++ b/app/pages/roadmap.wrn @@ -7,10 +7,10 @@ page Roadmap { view {
    -
    W WRNexusJS
    +
    W WRNexusJS

    Roadmap

    Roadmap items are direction, not delivery commitments. Dates require explicit owner approval.

    Now

    • Private preview onboarding and accurate package references
    • Runnable documentation fixtures and link/accessibility checks
    • License, support, and disclosure owner decisions

    Next

    • Durable queue driver guidance
    • Expanded database/auth/realtime examples
    • Versioned release notes and migration fixtures

    Later / exploration

    • Historical documentation selector
    • Maintained reproducible benchmarks
    • Broader mobile/native coverage
    - +
    } } \ No newline at end of file diff --git a/app/pages/search.wrn b/app/pages/search.wrn index 026572ca..0875de0a 100644 --- a/app/pages/search.wrn +++ b/app/pages/search.wrn @@ -7,10 +7,10 @@ page Search { view {
    -
    W WRNexusJS
    +
    W WRNexusJS

    Search documentation

    This build-time index is local and sends no query to a third party. Use your browser’s find command to filter this compact index.

    Core documentation

    Get started · Packages · Components · Language · Architecture

    Guides

    Project structure · Routing · Pages and components · Server data · API routes · Middleware · Forms and validation · Authentication · Authorization · Application security · Database · Uploads · Realtime · Pub/sub · Queues · Testing · Workspaces and gateway · Deployment · Configuration and profiles · Internationalization and themes · Mobile · Observability · Upgrading · Troubleshooting

    Package APIs

    @wrnexus/ai · @wrnexus/authz · @wrnexus/compiler · @wrnexus/core · @wrnexus/csr · @wrnexus/db · @wrnexus/dev-server · @wrnexus/encryption · @wrnexus/helpers · @wrnexus/i18n · @wrnexus/jwt · @wrnexus/mobile · @wrnexus/native · @wrnexus/oauth · @wrnexus/pubsub · @wrnexus/queue · @wrnexus/reactive · @wrnexus/router · @wrnexus/ssr · @wrnexus/styles · @wrnexus/test · @wrnexus/tracking · @wrnexus/ui · @wrnexus/uploader · @wrnexus/validation · @wrnexus/dev-toolbar · @wrnexus/syntax · @wrnexus/plugin · @wrnexus/captcha · @wrnexus/auth · @wrnexus/store · @wrnexus/typecheck · @wrnexus/security · @wrnexus/cache · @wrnexus/image · @wrnexus/observability · @wrnexus/benchmark · @wrnexus/realtime · @wrnexus/content · @wrnexus/graphql · @wrnexus/identity · @wrnexus/language-server · @wrnexus/mcp · @wrnexus/playground · @wrnexus/pwa · @wrnexus/rpc · @wrnexus/cli

    - +
    } } \ No newline at end of file diff --git a/app/pages/security.wrn b/app/pages/security.wrn index 5b2d9711..79a3631f 100644 --- a/app/pages/security.wrn +++ b/app/pages/security.wrn @@ -7,10 +7,10 @@ page Security { view {
    -
    W WRNexusJS
    +
    W WRNexusJS
    -

    Security

    WRNexusJS provides primitives for CSP, CSRF, Trusted Types, sessions, validation, authorization, encryption, upload restrictions, request limits, and WebSocket-origin checks. Applications remain responsible for correct configuration, business authorization, secrets, dependencies, data protection, and operations.

    Supported releases

    Only the current private-preview release 0.8.6 is documented here. A formal old-release support window is not yet published.

    Report a vulnerability

    Use WorkRoot’s approved private contact path at workroot.in. Do not publish exploit details or secrets. Include affected version, impact, reproduction, and a safe contact method. Response targets, encryption key, bounty, audit, and certification are not currently claimed.

    Deployment controls

    Use restrictive CSP and permissions policies, HSTS only on HTTPS production origins, MIME sniffing protection, restrictive referrers, explicit CORS, secure cookies, CSRF validation, request limits, and origin checks. See application security.

    - +

    Security

    WRNexusJS provides primitives for CSP, CSRF, Trusted Types, sessions, validation, authorization, encryption, upload restrictions, request limits, and WebSocket-origin checks. Applications remain responsible for correct configuration, business authorization, secrets, dependencies, data protection, and operations.

    Supported releases

    Only the current private-preview release 0.8.7 is documented here. A formal old-release support window is not yet published.

    Report a vulnerability

    Use WorkRoot’s approved private contact path at workroot.in. Do not publish exploit details or secrets. Include affected version, impact, reproduction, and a safe contact method. Response targets, encryption key, bounty, audit, and certification are not currently claimed.

    Deployment controls

    Use restrictive CSP and permissions policies, HSTS only on HTTPS production origins, MIME sniffing protection, restrictive referrers, explicit CORS, secure cookies, CSRF validation, request limits, and origin checks. See application security.

    +
    } } \ No newline at end of file diff --git a/app/pages/showcase.wrn b/app/pages/showcase.wrn index a9dbb152..f1cb3fe1 100644 --- a/app/pages/showcase.wrn +++ b/app/pages/showcase.wrn @@ -7,10 +7,10 @@ page Showcase { view {
    -
    W WRNexusJS
    +
    W WRNexusJS
    -

    Showcase

    Only confirmed public properties are listed; no customer or traffic claims are made.

    WorkRoot

    Creator/company site demonstrating a public WRNexusJS deployment. Exact deployed version and infrastructure notes await owner confirmation.

    WRNexusJS docs

    This documentation portal, built and verified against WRNexusJS 0.8.6 on Bun.

    Screenshots are intentionally deferred until approved assets and alt text are available.

    - +

    Showcase

    Only confirmed public properties are listed; no customer or traffic claims are made.

    WorkRoot

    Creator/company site demonstrating a public WRNexusJS deployment. Exact deployed version and infrastructure notes await owner confirmation.

    WRNexusJS docs

    This documentation portal, built and verified against WRNexusJS 0.8.7 on Bun.

    Screenshots are intentionally deferred until approved assets and alt text are available.

    +
    } } \ No newline at end of file diff --git a/app/pages/support.wrn b/app/pages/support.wrn index 2aedfd16..1e850702 100644 --- a/app/pages/support.wrn +++ b/app/pages/support.wrn @@ -7,10 +7,10 @@ page Support { view {
    -
    W WRNexusJS
    +
    W WRNexusJS

    Support

    WRNexusJS has no public Discord, public issue tracker, or guaranteed community support channel listed by this repository. Preview access and support begin through WorkRoot’s public contact path.

    Include WRNexusJS version, Bun version, OS, a minimal reproduction, expected and actual behavior, and sanitized logs. Never include registry tokens, credentials, session cookies, or private data.

    Support scope, service levels, and commercial terms require owner confirmation.

    - +
    } } \ No newline at end of file diff --git a/app/pages/tutorial.wrn b/app/pages/tutorial.wrn index 4cd22a74..2cf93823 100644 --- a/app/pages/tutorial.wrn +++ b/app/pages/tutorial.wrn @@ -7,9 +7,9 @@ page Tutorial { view {
    -
    W WRNexusJS
    +
    W WRNexusJS
    -
    Preview · runnable-project extraction pending

    Secure task board

    This tutorial connects the installed 0.8.6 APIs into one design. Snippets are limited to declarations and README patterns verified in the installed packages; a CI-compiled standalone fixture remains on the roadmap.

    Application shape

    A .wrn page renders tasks from an SSR API binding. A shared validation schema protects mutations. Session middleware identifies users, authorization policies gate updates, and a realtime room broadcasts changes.

    Schema and create route

    import { v, parseBody } from "@wrnexus/validation";
    +      
    Preview · runnable-project extraction pending

    Secure task board

    This tutorial connects the installed 0.8.7 APIs into one design. Snippets are limited to declarations and README patterns verified in the installed packages; a CI-compiled standalone fixture remains on the roadmap.

    Application shape

    A .wrn page renders tasks from an SSR API binding. A shared validation schema protects mutations. Session middleware identifies users, authorization policies gate updates, and a realtime room broadcasts changes.

    Schema and create route

    import { v, parseBody } from "@wrnexus/validation";
     const task = v.object({ title: v.string().trim().min(3).max(120) });
     export const POST = async (ctx) => {
       const parsed = await parseBody(task, ctx.req);
    @@ -23,7 +23,7 @@ export const POST = async (ctx) => {
         </ul></main>
       }
     }

    Production checklist

    • Choose SQLite for local development or configure the supported PostgreSQL driver.
    • Run migrations before accepting traffic.
    • Enable session authentication and enforce authorization on every mutation.
    • Validate upload types and sizes; keep private objects behind authenticated routes.
    • Use Redis pub/sub when realtime rooms span processes.
    • Treat the default queue as non-durable until a production driver is selected.

    Follow the focused database, authentication, authorization, realtime, and upload guides.

    - +
    } } \ No newline at end of file diff --git a/app/routes.gen.ts b/app/routes.gen.ts index fa3fa738..2362f918 100644 --- a/app/routes.gen.ts +++ b/app/routes.gen.ts @@ -170,6 +170,7 @@ export interface Routes { "/releases/0.8.4": Record; "/releases/0.8.5": Record; "/releases/0.8.6": Record; + "/releases/0.8.7": Record; "/roadmap": Record; "/search": Record; "/security": Record; @@ -347,6 +348,7 @@ export interface RouteNames { "releases.0.8.4": "/releases/0.8.4"; "releases.0.8.5": "/releases/0.8.5"; "releases.0.8.6": "/releases/0.8.6"; + "releases.0.8.7": "/releases/0.8.7"; "roadmap": "/roadmap"; "search": "/search"; "security": "/security"; @@ -593,6 +595,7 @@ export function route( "releases.0.8.4": "/releases/0.8.4", "releases.0.8.5": "/releases/0.8.5", "releases.0.8.6": "/releases/0.8.6", + "releases.0.8.7": "/releases/0.8.7", "roadmap": "/roadmap", "search": "/search", "security": "/security", diff --git a/app/types/wrnexus.generated.d.ts b/app/types/wrnexus.generated.d.ts index 4454a309..30a73199 100644 --- a/app/types/wrnexus.generated.d.ts +++ b/app/types/wrnexus.generated.d.ts @@ -1,5 +1,4 @@ // AUTO-GENERATED by `wrnexus generate types` - do not edit. -/* eslint-disable @typescript-eslint/no-empty-object-type */ declare namespace WRNexusGenerated { type ApiContract = T extends import("@wrnexus/core").DefinedEndpoint ? { input: I; output: O } @@ -14,7 +13,7 @@ declare namespace WRNexusGenerated { : never; type RealtimeMessage = T extends import("@wrnexus/core").RoomDefinition ? M : unknown; type QueuePayload = T extends import("@wrnexus/queue").JobDefinition ? I : unknown; - type RouteName = "404" | "access" | "architecture" | "benchmarks" | "changelog" | "examples" | "getting.started" | "guides.api.routes" | "guides.authentication" | "guides.authorization" | "guides.configuration.and.profiles" | "guides.database" | "guides.deployment" | "guides.forms.and.validation" | "guides.i18n.and.themes" | "guides.middleware" | "guides.mobile" | "guides.observability" | "guides.pages.and.components" | "guides.project.structure" | "guides.pubsub" | "guides.queues" | "guides.realtime" | "guides.routing" | "guides.security" | "guides.server.data" | "guides.testing" | "guides.troubleshooting" | "guides.upgrading" | "guides.uploads" | "guides.workspaces.and.gateway" | "index" | "language" | "license" | "packages" | "packages.ai" | "packages.auth" | "packages.authz" | "packages.benchmark" | "packages.cache" | "packages.captcha" | "packages.cli" | "packages.compiler" | "packages.content" | "packages.core" | "packages.csr" | "packages.db" | "packages.dev.server" | "packages.dev.toolbar" | "packages.encryption" | "packages.graphql" | "packages.helpers" | "packages.i18n" | "packages.identity" | "packages.image" | "packages.jwt" | "packages.language.server" | "packages.mcp" | "packages.mobile" | "packages.native" | "packages.oauth" | "packages.observability" | "packages.playground" | "packages.plugin" | "packages.pubsub" | "packages.pwa" | "packages.queue" | "packages.reactive" | "packages.realtime" | "packages.router" | "packages.security" | "packages.ssr" | "packages.store" | "packages.styles" | "packages.syntax" | "packages.test" | "packages.tracking" | "packages.typecheck" | "packages.ui" | "packages.uploader" | "packages.validation" | "releases.0.2.15" | "releases.0.2.17" | "releases.0.2.18" | "releases.0.2.19" | "releases.0.2.20" | "releases.0.2.21" | "releases.0.2.22" | "releases.0.2.23" | "releases.0.2.24" | "releases.0.2.25" | "releases.0.2.26" | "releases.0.2.27" | "releases.0.2.28" | "releases.0.2.29" | "releases.0.2.30" | "releases.0.2.31" | "releases.0.2.32" | "releases.0.2.33" | "releases.0.2.34" | "releases.0.2.35" | "releases.0.2.36" | "releases.0.2.37" | "releases.0.2.38" | "releases.0.2.39" | "releases.0.2.40" | "releases.0.2.41" | "releases.0.2.42" | "releases.0.2.43" | "releases.0.2.44" | "releases.0.2.45" | "releases.0.2.46" | "releases.0.2.47" | "releases.0.2.48" | "releases.0.2.49" | "releases.0.2.50" | "releases.0.2.51" | "releases.0.2.52" | "releases.0.2.53" | "releases.0.2.54" | "releases.0.2.55" | "releases.0.2.56" | "releases.0.2.57" | "releases.0.2.58" | "releases.0.2.59" | "releases.0.2.60" | "releases.0.2.61" | "releases.0.2.62" | "releases.0.2.63" | "releases.0.2.64" | "releases.0.2.65" | "releases.0.2.66" | "releases.0.2.67" | "releases.0.2.68" | "releases.0.2.69" | "releases.0.2.70" | "releases.0.2.71" | "releases.0.2.72" | "releases.0.2.73" | "releases.0.2.74" | "releases.0.2.75" | "releases.0.2.76" | "releases.0.2.77" | "releases.0.2.78" | "releases.0.2.79" | "releases.0.3.0" | "releases.0.3.1" | "releases.0.3.2" | "releases.0.3.3" | "releases.0.3.4" | "releases.0.3.5" | "releases.0.3.6" | "releases.0.4.0" | "releases.0.5.0" | "releases.0.5.1" | "releases.0.5.10" | "releases.0.5.11" | "releases.0.5.12" | "releases.0.5.13" | "releases.0.6.0" | "releases.0.7.0" | "releases.0.8.0" | "releases.0.8.1" | "releases.0.8.2" | "releases.0.8.3" | "releases.0.8.4" | "releases.0.8.5" | "releases.0.8.6" | "roadmap" | "search" | "security" | "showcase" | "support" | "tutorial"; + type RouteName = "404" | "access" | "architecture" | "benchmarks" | "changelog" | "examples" | "getting.started" | "guides.api.routes" | "guides.authentication" | "guides.authorization" | "guides.configuration.and.profiles" | "guides.database" | "guides.deployment" | "guides.forms.and.validation" | "guides.i18n.and.themes" | "guides.middleware" | "guides.mobile" | "guides.observability" | "guides.pages.and.components" | "guides.project.structure" | "guides.pubsub" | "guides.queues" | "guides.realtime" | "guides.routing" | "guides.security" | "guides.server.data" | "guides.testing" | "guides.troubleshooting" | "guides.upgrading" | "guides.uploads" | "guides.workspaces.and.gateway" | "index" | "language" | "license" | "packages" | "packages.ai" | "packages.auth" | "packages.authz" | "packages.benchmark" | "packages.cache" | "packages.captcha" | "packages.cli" | "packages.compiler" | "packages.content" | "packages.core" | "packages.csr" | "packages.db" | "packages.dev.server" | "packages.dev.toolbar" | "packages.encryption" | "packages.graphql" | "packages.helpers" | "packages.i18n" | "packages.identity" | "packages.image" | "packages.jwt" | "packages.language.server" | "packages.mcp" | "packages.mobile" | "packages.native" | "packages.oauth" | "packages.observability" | "packages.playground" | "packages.plugin" | "packages.pubsub" | "packages.pwa" | "packages.queue" | "packages.reactive" | "packages.realtime" | "packages.router" | "packages.security" | "packages.ssr" | "packages.store" | "packages.styles" | "packages.syntax" | "packages.test" | "packages.tracking" | "packages.typecheck" | "packages.ui" | "packages.uploader" | "packages.validation" | "releases.0.2.15" | "releases.0.2.17" | "releases.0.2.18" | "releases.0.2.19" | "releases.0.2.20" | "releases.0.2.21" | "releases.0.2.22" | "releases.0.2.23" | "releases.0.2.24" | "releases.0.2.25" | "releases.0.2.26" | "releases.0.2.27" | "releases.0.2.28" | "releases.0.2.29" | "releases.0.2.30" | "releases.0.2.31" | "releases.0.2.32" | "releases.0.2.33" | "releases.0.2.34" | "releases.0.2.35" | "releases.0.2.36" | "releases.0.2.37" | "releases.0.2.38" | "releases.0.2.39" | "releases.0.2.40" | "releases.0.2.41" | "releases.0.2.42" | "releases.0.2.43" | "releases.0.2.44" | "releases.0.2.45" | "releases.0.2.46" | "releases.0.2.47" | "releases.0.2.48" | "releases.0.2.49" | "releases.0.2.50" | "releases.0.2.51" | "releases.0.2.52" | "releases.0.2.53" | "releases.0.2.54" | "releases.0.2.55" | "releases.0.2.56" | "releases.0.2.57" | "releases.0.2.58" | "releases.0.2.59" | "releases.0.2.60" | "releases.0.2.61" | "releases.0.2.62" | "releases.0.2.63" | "releases.0.2.64" | "releases.0.2.65" | "releases.0.2.66" | "releases.0.2.67" | "releases.0.2.68" | "releases.0.2.69" | "releases.0.2.70" | "releases.0.2.71" | "releases.0.2.72" | "releases.0.2.73" | "releases.0.2.74" | "releases.0.2.75" | "releases.0.2.76" | "releases.0.2.77" | "releases.0.2.78" | "releases.0.2.79" | "releases.0.3.0" | "releases.0.3.1" | "releases.0.3.2" | "releases.0.3.3" | "releases.0.3.4" | "releases.0.3.5" | "releases.0.3.6" | "releases.0.4.0" | "releases.0.5.0" | "releases.0.5.1" | "releases.0.5.10" | "releases.0.5.11" | "releases.0.5.12" | "releases.0.5.13" | "releases.0.6.0" | "releases.0.7.0" | "releases.0.8.0" | "releases.0.8.1" | "releases.0.8.2" | "releases.0.8.3" | "releases.0.8.4" | "releases.0.8.5" | "releases.0.8.6" | "releases.0.8.7" | "roadmap" | "search" | "security" | "showcase" | "support" | "tutorial"; type ApiRoute = never; type RealtimeRoute = never; type EnvironmentKey = never; diff --git a/app/types/wrnexus.plugins.generated.d.ts b/app/types/wrnexus.plugins.generated.d.ts index b82c221b..c8d0064d 100644 --- a/app/types/wrnexus.plugins.generated.d.ts +++ b/app/types/wrnexus.plugins.generated.d.ts @@ -1,2 +1 @@ // AUTO-GENERATED plugin type aggregation - do not edit. - diff --git a/bun.lock b/bun.lock index b5c25a0d..52d03fb1 100644 --- a/bun.lock +++ b/bun.lock @@ -7,59 +7,59 @@ "dependencies": { "@iconify-json/lucide": "^1.2.118", "@iconify/tailwind4": "^1.2.3", - "@wrnexus/ai": "^0.8.6", - "@wrnexus/auth": "^0.8.6", - "@wrnexus/authz": "^0.8.6", - "@wrnexus/benchmark": "^0.8.6", - "@wrnexus/cache": "^0.8.6", - "@wrnexus/captcha": "^0.8.6", - "@wrnexus/compiler": "^0.8.6", - "@wrnexus/content": "^0.8.6", - "@wrnexus/core": "^0.8.6", - "@wrnexus/csr": "^0.8.6", - "@wrnexus/db": "^0.8.6", - "@wrnexus/dev-server": "^0.8.6", - "@wrnexus/dev-toolbar": "^0.8.6", - "@wrnexus/encryption": "^0.8.6", - "@wrnexus/graphql": "^0.8.6", - "@wrnexus/helpers": "^0.8.6", - "@wrnexus/i18n": "^0.8.6", - "@wrnexus/identity": "^0.8.6", - "@wrnexus/image": "^0.8.6", - "@wrnexus/jwt": "^0.8.6", - "@wrnexus/language-server": "^0.8.6", - "@wrnexus/mcp": "^0.8.6", - "@wrnexus/mobile": "^0.8.6", - "@wrnexus/native": "^0.8.6", - "@wrnexus/oauth": "^0.8.6", - "@wrnexus/observability": "^0.8.6", - "@wrnexus/playground": "^0.8.6", - "@wrnexus/plugin": "^0.8.6", - "@wrnexus/pubsub": "^0.8.6", - "@wrnexus/pwa": "^0.8.6", - "@wrnexus/queue": "^0.8.6", - "@wrnexus/reactive": "^0.8.6", - "@wrnexus/realtime": "^0.8.6", - "@wrnexus/router": "^0.8.6", - "@wrnexus/rpc": "^0.8.6", - "@wrnexus/security": "^0.8.6", - "@wrnexus/ssr": "^0.8.6", - "@wrnexus/store": "^0.8.6", - "@wrnexus/styles": "^0.8.6", - "@wrnexus/syntax": "^0.8.6", - "@wrnexus/test": "^0.8.6", - "@wrnexus/tracking": "^0.8.6", - "@wrnexus/typecheck": "^0.8.6", - "@wrnexus/ui": "^0.8.6", - "@wrnexus/uploader": "^0.8.6", - "@wrnexus/validation": "^0.8.6", + "@wrnexus/ai": "^0.8.7", + "@wrnexus/auth": "^0.8.7", + "@wrnexus/authz": "^0.8.7", + "@wrnexus/benchmark": "^0.8.7", + "@wrnexus/cache": "^0.8.7", + "@wrnexus/captcha": "^0.8.7", + "@wrnexus/compiler": "^0.8.7", + "@wrnexus/content": "^0.8.7", + "@wrnexus/core": "^0.8.7", + "@wrnexus/csr": "^0.8.7", + "@wrnexus/db": "^0.8.7", + "@wrnexus/dev-server": "^0.8.7", + "@wrnexus/dev-toolbar": "^0.8.7", + "@wrnexus/encryption": "^0.8.7", + "@wrnexus/graphql": "^0.8.7", + "@wrnexus/helpers": "^0.8.7", + "@wrnexus/i18n": "^0.8.7", + "@wrnexus/identity": "^0.8.7", + "@wrnexus/image": "^0.8.7", + "@wrnexus/jwt": "^0.8.7", + "@wrnexus/language-server": "^0.8.7", + "@wrnexus/mcp": "^0.8.7", + "@wrnexus/mobile": "^0.8.7", + "@wrnexus/native": "^0.8.7", + "@wrnexus/oauth": "^0.8.7", + "@wrnexus/observability": "^0.8.7", + "@wrnexus/playground": "^0.8.7", + "@wrnexus/plugin": "^0.8.7", + "@wrnexus/pubsub": "^0.8.7", + "@wrnexus/pwa": "^0.8.7", + "@wrnexus/queue": "^0.8.7", + "@wrnexus/reactive": "^0.8.7", + "@wrnexus/realtime": "^0.8.7", + "@wrnexus/router": "^0.8.7", + "@wrnexus/rpc": "^0.8.7", + "@wrnexus/security": "^0.8.7", + "@wrnexus/ssr": "^0.8.7", + "@wrnexus/store": "^0.8.7", + "@wrnexus/styles": "^0.8.7", + "@wrnexus/syntax": "^0.8.7", + "@wrnexus/test": "^0.8.7", + "@wrnexus/tracking": "^0.8.7", + "@wrnexus/typecheck": "^0.8.7", + "@wrnexus/ui": "^0.8.7", + "@wrnexus/uploader": "^0.8.7", + "@wrnexus/validation": "^0.8.7", }, "devDependencies": { "@eslint/js": "^9.0.0", "@tailwindcss/cli": "^4.0.0", "@types/bun": "latest", "@types/node": "^26.1.1", - "@wrnexus/cli": "^0.8.6", + "@wrnexus/cli": "^0.8.7", "eslint": "^9.0.0", "prettier": "latest", "tailwindcss": "^4.0.0", @@ -233,99 +233,99 @@ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.63.0", "", { "dependencies": { "@typescript-eslint/types": "8.63.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw=="], - "@wrnexus/ai": ["@wrnexus/ai@0.8.6", "", {}, "sha512-s+dG8qezNis6Km81SG+2WESFmk1kn+wT1FSfv6FwKm6PyvMB35So4PFXz9BNqsSI1giA+6zW4tlihJFBmSX05w=="], + "@wrnexus/ai": ["@wrnexus/ai@0.8.7", "", {}, "sha512-Q+62hKfkdV29ImxBfwf934BaHIVu6Q5anh264azotMUmzKh9FOTQG03PIVUfiYFJDUR6iBKMVh3o1cv00WFzZQ=="], - "@wrnexus/auth": ["@wrnexus/auth@0.8.6", "", { "dependencies": { "@wrnexus/authz": "^0.8.6", "@wrnexus/captcha": "^0.8.6", "@wrnexus/core": "^0.8.6", "@wrnexus/db": "^0.8.6", "@wrnexus/encryption": "^0.8.6", "@wrnexus/jwt": "^0.8.6", "@wrnexus/oauth": "^0.8.6", "@wrnexus/plugin": "^0.8.6", "@wrnexus/queue": "^0.8.6", "@wrnexus/ui": "^0.8.6", "@wrnexus/validation": "^0.8.6" } }, "sha512-SBKsfYMib/blRk4CrUw0WOXxb2dNcOwoCxx1S2gq4KYnvNOu18NMH5Vs3DpuxF9/uOLrfOXxOpSXWG1+XbMlUw=="], + "@wrnexus/auth": ["@wrnexus/auth@0.8.7", "", { "dependencies": { "@wrnexus/authz": "^0.8.7", "@wrnexus/captcha": "^0.8.7", "@wrnexus/core": "^0.8.7", "@wrnexus/db": "^0.8.7", "@wrnexus/encryption": "^0.8.7", "@wrnexus/jwt": "^0.8.7", "@wrnexus/oauth": "^0.8.7", "@wrnexus/plugin": "^0.8.7", "@wrnexus/queue": "^0.8.7", "@wrnexus/ui": "^0.8.7", "@wrnexus/validation": "^0.8.7" } }, "sha512-BZHVk8maM4aDvqk1TIPBYjxdp4buEcImzycnqAxk4Uv6XwFey89zCtZ25Yi6rbMz9QfsnJiVUugNB5SrSpzn7Q=="], - "@wrnexus/authz": ["@wrnexus/authz@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6", "@wrnexus/db": "^0.8.6" } }, "sha512-2n3dqXdxXS1lXxb7m/WzPbcP4PzBS/d2rm4nNpVbXBD1p26ajnqJTPcph/71LMUJnxuYGJOsUIvNwJsRoJil3w=="], + "@wrnexus/authz": ["@wrnexus/authz@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7", "@wrnexus/db": "^0.8.7" } }, "sha512-TW4xb4zeRroAhWIcwUnqCx6RgIGnOnAM/XXvrV0OVeA8/GWv99Toh+176OBl66b5wkLHbFCm+XIw+SBrJdqEvw=="], - "@wrnexus/benchmark": ["@wrnexus/benchmark@0.8.6", "", {}, "sha512-GEnaw2tWgmMkZxJFaS9LTJiX4JM+fI/tu9Mub4Uj+apmZkorRkGvqaSqJ4FMBAv2xlpUCIzaM8LdsZCQj/vc0A=="], + "@wrnexus/benchmark": ["@wrnexus/benchmark@0.8.7", "", {}, "sha512-8ImVkRCqEdSYZlwSGNkuOs8RDumsVpQ6Ih9r7MQQvzRc4M/7D/OFmq00G6kKsRyefNE9iwvSQAoEGjm1lYL5FQ=="], - "@wrnexus/cache": ["@wrnexus/cache@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6" } }, "sha512-jUmx6mglnS8NtHBc8tnrKcPRsJd0pKJ2EN9HZqSDT2aNLaocoVHt+JwJNy4s1XWPmp/aHMT6JxSBACrPGaZYgQ=="], + "@wrnexus/cache": ["@wrnexus/cache@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7" } }, "sha512-bu9aQBmgIziiLwWV0yOx0fU4K8MxRDinD1HyUqWG02zP6IHh6e65A3JdAnZWINV5Ot/JhF5NtMXAtT2QChtu0A=="], - "@wrnexus/captcha": ["@wrnexus/captcha@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6", "@wrnexus/plugin": "^0.8.6", "@wrnexus/ui": "^0.8.6", "@wrnexus/validation": "^0.8.6" } }, "sha512-tjL1RckyI8u8a2QGJ2rh3YVDl+V2k/CfPS7+H8/jLGI1EyaYYVHLyqDZOkFE0dxrVNhJa9zz6HD6bfmRFf+N6Q=="], + "@wrnexus/captcha": ["@wrnexus/captcha@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7", "@wrnexus/plugin": "^0.8.7", "@wrnexus/ui": "^0.8.7", "@wrnexus/validation": "^0.8.7" } }, "sha512-t/kNu2X4Zb9wj1njgEZ+4Hw/V8ulYlvZ1IR+qIWm1dXtv6sul47pBxlh7sScZobaZ7E3IOpMGsRSDz3i39vMPA=="], - "@wrnexus/cli": ["@wrnexus/cli@0.8.6", "", { "dependencies": { "@wrnexus/authz": "^0.8.6", "@wrnexus/compiler": "^0.8.6", "@wrnexus/core": "^0.8.6", "@wrnexus/csr": "^0.8.6", "@wrnexus/db": "^0.8.6", "@wrnexus/dev-server": "^0.8.6", "@wrnexus/i18n": "^0.8.6", "@wrnexus/mcp": "^0.8.6", "@wrnexus/playground": "^0.8.6", "@wrnexus/plugin": "^0.8.6", "@wrnexus/router": "^0.8.6", "@wrnexus/security": "^0.8.6", "@wrnexus/styles": "^0.8.6", "@wrnexus/syntax": "^0.8.6", "@wrnexus/typecheck": "^0.8.6", "@wrnexus/ui": "^0.8.6", "@wrnexus/validation": "^0.8.6", "selfsigned": "^5.5.0" }, "bin": { "wrnexus": "dist/index.js" } }, "sha512-Av8XUTfFh4XFX6Z2iJl//xLAmiJ2mIOiZMCNEAdY97kD8H5Ev5KOb8HPb2uiTIfKrDL0aHRqHW+6xzWN/kAgUg=="], + "@wrnexus/cli": ["@wrnexus/cli@0.8.7", "", { "dependencies": { "@wrnexus/authz": "^0.8.7", "@wrnexus/compiler": "^0.8.7", "@wrnexus/core": "^0.8.7", "@wrnexus/csr": "^0.8.7", "@wrnexus/db": "^0.8.7", "@wrnexus/dev-server": "^0.8.7", "@wrnexus/i18n": "^0.8.7", "@wrnexus/mcp": "^0.8.7", "@wrnexus/playground": "^0.8.7", "@wrnexus/plugin": "^0.8.7", "@wrnexus/router": "^0.8.7", "@wrnexus/security": "^0.8.7", "@wrnexus/styles": "^0.8.7", "@wrnexus/syntax": "^0.8.7", "@wrnexus/typecheck": "^0.8.7", "@wrnexus/ui": "^0.8.7", "@wrnexus/validation": "^0.8.7", "selfsigned": "^5.5.0" }, "bin": { "wrnexus": "dist/index.js" } }, "sha512-E8OxydwUo4W73wCyboLNZ7x+91iGQUOXjXvrBf0FHPpZkBWcYbwUdDXpBetdxhAmvmDgasylXL3FSwxOoe+ihw=="], - "@wrnexus/compiler": ["@wrnexus/compiler@0.8.6", "", { "dependencies": { "@wrnexus/csr": "^0.8.6", "@wrnexus/store": "^0.8.6", "@wrnexus/syntax": "^0.8.6", "@wrnexus/validation": "^0.8.6" } }, "sha512-/fa1U37+A8itfFPxMyAtVe5JVgo0dSMavq72omJNQk8yB7r46HuQ7AUtm2DBwCQxv16kq6USvHXo1lRIOvsy0A=="], + "@wrnexus/compiler": ["@wrnexus/compiler@0.8.7", "", { "dependencies": { "@wrnexus/csr": "^0.8.7", "@wrnexus/store": "^0.8.7", "@wrnexus/syntax": "^0.8.7", "@wrnexus/validation": "^0.8.7" } }, "sha512-Qn+6FBVyZkCxrXl9p3zn0pSGoCSHvHJmAZZ4bXiAA/IKN+ZqHdK5XfOseK/8RJn3UwufAC1SaLshfCweLDKPcQ=="], - "@wrnexus/content": ["@wrnexus/content@0.8.6", "", {}, "sha512-gOYn2A53ZCqNpI954HvAaeaYblEr2c2TZtUSik/VXScDn6M/rLqpPuIk9EHKvenHDYOW28QOHPxswUAYwmtNoQ=="], + "@wrnexus/content": ["@wrnexus/content@0.8.7", "", {}, "sha512-4EqnsrGHQcQ5vsv5tUMCk46IU/Uik7ACuCeomno02+mO5gk/hz0G9XO9VLfZeMZAnwe03NM9/c4yt86C72A6FA=="], - "@wrnexus/core": ["@wrnexus/core@0.8.6", "", {}, "sha512-m/VUFVc736ijvSOKqVrsA2Nd6Ty7CZmtrKgYOMOoQELoxtmWM8CifjKicJQgTX7NwlOLYFa7PITqpqiBRDizQA=="], + "@wrnexus/core": ["@wrnexus/core@0.8.7", "", {}, "sha512-iXr7h25cP9MQ/qzjfYlwNq6YAe4xSVDvM754bxTicwD0QbHY9KJYkd+jhkhW5E/5NnGuKBg8bS0LKXdoK/+ihg=="], - "@wrnexus/csr": ["@wrnexus/csr@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6" } }, "sha512-leB5XDZVApT6tw+EdIsnZhqaQ4aT3CpwNZWCRcyp+LNYmoohWu5rI342Zb2cuvEWGeA45Xma+lQ/y/8oGvkbQA=="], + "@wrnexus/csr": ["@wrnexus/csr@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7" } }, "sha512-IZaajUnIVJc2YCBPaDS2Hxd4I8Bs5U1mV4OqlNXatj7d8q7I0P8Nqq2WTaZ0Skv1TnDH0N56D0ndxyrRc2kHKg=="], - "@wrnexus/db": ["@wrnexus/db@0.8.6", "", {}, "sha512-t7OrLnEKoLYds6F/IhLq8LRx61WWErym7mcETuJWPzsRV+Wlv0z3qTj8S/S4hKMc9Lv94X9CyxGq1u4hd1gJfQ=="], + "@wrnexus/db": ["@wrnexus/db@0.8.7", "", {}, "sha512-nwvG/NUAoY9K+KY42fBsN6PzOhYAfI5njM5tYCmt896XPVgnhkqnvVCCP0ugINgWjiFEqOq04p/4kR04rM7Sng=="], - "@wrnexus/dev-server": ["@wrnexus/dev-server@0.8.6", "", { "dependencies": { "@wrnexus/authz": "^0.8.6", "@wrnexus/cache": "^0.8.6", "@wrnexus/compiler": "^0.8.6", "@wrnexus/core": "^0.8.6", "@wrnexus/csr": "^0.8.6", "@wrnexus/db": "^0.8.6", "@wrnexus/dev-toolbar": "^0.8.6", "@wrnexus/i18n": "^0.8.6", "@wrnexus/observability": "^0.8.6", "@wrnexus/plugin": "^0.8.6", "@wrnexus/pubsub": "^0.8.6", "@wrnexus/pwa": "^0.8.6", "@wrnexus/router": "^0.8.6", "@wrnexus/rpc": "^0.8.6", "@wrnexus/security": "^0.8.6", "@wrnexus/ssr": "^0.8.6", "@wrnexus/store": "^0.8.6", "@wrnexus/styles": "^0.8.6", "@wrnexus/ui": "^0.8.6", "@wrnexus/uploader": "^0.8.6", "@wrnexus/validation": "^0.8.6" } }, "sha512-yLlt9UB+wlXUhVxnqBGXfCF0+TxiB7GEgO0bsY/6qt/he9p4lcZ3ig4flJ608oppk8CZcpEKv+/pWAE8GkpSYQ=="], + "@wrnexus/dev-server": ["@wrnexus/dev-server@0.8.7", "", { "dependencies": { "@wrnexus/authz": "^0.8.7", "@wrnexus/cache": "^0.8.7", "@wrnexus/compiler": "^0.8.7", "@wrnexus/core": "^0.8.7", "@wrnexus/csr": "^0.8.7", "@wrnexus/db": "^0.8.7", "@wrnexus/dev-toolbar": "^0.8.7", "@wrnexus/i18n": "^0.8.7", "@wrnexus/observability": "^0.8.7", "@wrnexus/plugin": "^0.8.7", "@wrnexus/pubsub": "^0.8.7", "@wrnexus/pwa": "^0.8.7", "@wrnexus/router": "^0.8.7", "@wrnexus/rpc": "^0.8.7", "@wrnexus/security": "^0.8.7", "@wrnexus/ssr": "^0.8.7", "@wrnexus/store": "^0.8.7", "@wrnexus/styles": "^0.8.7", "@wrnexus/ui": "^0.8.7", "@wrnexus/uploader": "^0.8.7", "@wrnexus/validation": "^0.8.7" } }, "sha512-6OKNa2RsZ2mO8wYKy+0ZxbV5396ENWTStHpIvVmcsFiVCeEj5Sf7ccy77L+tN5GOtXAFW8YzFBUuwGMNwwNXgw=="], - "@wrnexus/dev-toolbar": ["@wrnexus/dev-toolbar@0.8.6", "", {}, "sha512-YfRbMBlFEci8Idoqt68dO66oVfEZqduC45EaR4i1GllwNmwe6POoeZCmn1DbCE5LVLRM8RtDOmT8AZaaRjdvoQ=="], + "@wrnexus/dev-toolbar": ["@wrnexus/dev-toolbar@0.8.7", "", {}, "sha512-8WUaF03jlqkRcU7mqDhnaWonXYukLhr2MujZuo1YQ4Cixd74mhkd4+cM6vj1s3qyJ+Q+0O+eZNg9VAVzV32SWg=="], - "@wrnexus/encryption": ["@wrnexus/encryption@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6" } }, "sha512-b2zfDgsHgDEeNX1R6dPH5HoxAVBJgQx8pGt9UydN2d02HS6hIbUBg5k679DFDlI1GEZ8qT2BcD8e64DjVXdjuw=="], + "@wrnexus/encryption": ["@wrnexus/encryption@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7" } }, "sha512-z1lhGBpxzFml+mpz8QDx1WJUQ97TjLscmiwqpLVISdeJ3KWUh1uy8xvNdIiWa4fI3mynVuWgowAtPiPD8OUYIA=="], - "@wrnexus/graphql": ["@wrnexus/graphql@0.8.6", "", { "dependencies": { "@wrnexus/plugin": "^0.8.6" } }, "sha512-Q8w9IGpqD6NU+qFXEa01Pp+9iMyRAujB/YMALMGE5KjLZI7iP71o8oF7EOXe1fdGNQfMTJSk+CX4SsXVaZi4mQ=="], + "@wrnexus/graphql": ["@wrnexus/graphql@0.8.7", "", { "dependencies": { "@wrnexus/plugin": "^0.8.7" } }, "sha512-xaFbKP4A9iOmipu4vMvYTphwYti9hJIuhQoPZFGayFenQ/iP2f4kiQmAhyxkvxYp7UUmhk7jrvyhdbDEn6YSPQ=="], - "@wrnexus/helpers": ["@wrnexus/helpers@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6" } }, "sha512-0jOjKn5scK3qAKcK9fEv++yiND174/Mw0f6k+3ICM1mbWL4sZFLN1mJFcF5qdcyKU3yzax9H3f7szt/iYjJthw=="], + "@wrnexus/helpers": ["@wrnexus/helpers@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7" } }, "sha512-ScYjQE2XiB8UBUcpXfRhUOcD1/hiVD+6IezlDJDklebC6oUUA/psdMp7CdkMxjm0CqnaUzmYsTaGOAiG4rL67A=="], - "@wrnexus/i18n": ["@wrnexus/i18n@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6", "@wrnexus/plugin": "^0.8.6", "@wrnexus/ui": "^0.8.6" } }, "sha512-IGKn35S1tc5yUrC30+RU82ToxXhEElFuro2LF8tJq/PUjQFWDv0GPuml6eadgwwya2wPoztqOY6kFzC8fX6GyQ=="], + "@wrnexus/i18n": ["@wrnexus/i18n@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7", "@wrnexus/plugin": "^0.8.7", "@wrnexus/ui": "^0.8.7" } }, "sha512-CmsgyJrMHHmynK1TLyk+MRbWmlolf10znvOgQWYWKJJQ4B0El7la73BsPAMof52Bp1IrVMMX8OpUoXl/r3QNtQ=="], - "@wrnexus/identity": ["@wrnexus/identity@0.8.6", "", { "dependencies": { "@wrnexus/auth": "^0.8.6", "@wrnexus/authz": "^0.8.6", "@wrnexus/oauth": "^0.8.6" } }, "sha512-vGXUPk9Do3Qxe3g1K2QqE8e7QMZpFTEsTtny4pmQNrlMJqVMptvTh41Md2ftRN7Q+LB56ggNOqXDMiN3ycaM9A=="], + "@wrnexus/identity": ["@wrnexus/identity@0.8.7", "", { "dependencies": { "@wrnexus/auth": "^0.8.7", "@wrnexus/authz": "^0.8.7", "@wrnexus/oauth": "^0.8.7" } }, "sha512-hhq/nLiDOEA6myaBJPInFUSebe2swa+eNNTL5asfQwx6lsz/GBwrs5NgZtRQjN6Ma/PHQEcuJ/qLGoxKA4Teww=="], - "@wrnexus/image": ["@wrnexus/image@0.8.6", "", { "dependencies": { "@wrnexus/plugin": "^0.8.6", "@wrnexus/security": "^0.8.6", "@wrnexus/ui": "^0.8.6" } }, "sha512-QvdAEj0YhPRiH6TA4DX7mmJdwbvxqQ6+1znnZyiWNpj4xggsyurOWBz/fXH3Shzqno4Tw3uchYTqdkYceb1q4g=="], + "@wrnexus/image": ["@wrnexus/image@0.8.7", "", { "dependencies": { "@wrnexus/plugin": "^0.8.7", "@wrnexus/security": "^0.8.7", "@wrnexus/ui": "^0.8.7" } }, "sha512-gsmlsx13vX/yP9lKvrI1EVa+rZA1caT6CaOOUyHcbwpDo7MMvYLmbo1CbO43Fx+TaNYx/PmQTEOyh8kFaRbyaQ=="], - "@wrnexus/jwt": ["@wrnexus/jwt@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6" } }, "sha512-Cf8mQ/aRr74S1mRbeN1Qx3ICWOeHQkXFVqJljHROlWpinpfKurE59XT1jENYCghzIfZH6jKUqWOGXNHilIqduQ=="], + "@wrnexus/jwt": ["@wrnexus/jwt@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7" } }, "sha512-x5QZYFftlXVJqh15RhLNehAty8mANQ1IZVIb+P7kF0+chRb8nDMfIjg4CGPBqMNYnRCQMcanllopcW0C4rtfHw=="], - "@wrnexus/language-server": ["@wrnexus/language-server@0.8.6", "", { "dependencies": { "@wrnexus/syntax": "^0.8.6", "@wrnexus/typecheck": "^0.8.6" }, "bin": { "wrnexus-language-server": "dist/server.js" } }, "sha512-fdcQLd9rzYxWMDqIZYF1WCIDOAaRDrdR2+K0Bk7MoVApgKd6FD20AN6Qs1MKhr5grUfMzvLxaDIcXSuL9yGDlQ=="], + "@wrnexus/language-server": ["@wrnexus/language-server@0.8.7", "", { "dependencies": { "@wrnexus/syntax": "^0.8.7", "@wrnexus/typecheck": "^0.8.7" }, "bin": { "wrnexus-language-server": "dist/server.js" } }, "sha512-a+a/ZpBt/19Iwi9nNiZfkdsj7VfFYUGS6sN7fg9IWMwAUTYoLkjY454qKpaY+xZSLcizKdWT+Sx6XLWSZLADnQ=="], - "@wrnexus/mcp": ["@wrnexus/mcp@0.8.6", "", { "bin": { "wrnexus-mcp": "dist/stdio.js" } }, "sha512-x24SqmbGw+mILna/5uf16t00ll0fAzCB95/BHlC4xmlQOmnU6jCQpg/c5Et9j9I698H1a6LvG9x6TB7/Ft9ybA=="], + "@wrnexus/mcp": ["@wrnexus/mcp@0.8.7", "", { "bin": { "wrnexus-mcp": "dist/stdio.js" } }, "sha512-EfzLMt2d4WCWv4w67JhPG/kUS6Me7LjMqHoeKVSCMdROXBhxl5k0/IylE1YVsjpctWHaEBEvTzUlZYTELZX4SQ=="], - "@wrnexus/mobile": ["@wrnexus/mobile@0.8.6", "", { "dependencies": { "@wrnexus/native": "^0.8.6" } }, "sha512-QLi80kt8ia2OubaWyW9Bwnf2k2veUJ49n5WPKn2DiuDCfHAoWapark8xPmrxVJLw8ctDr0DtM4BvP+a+m2OdoQ=="], + "@wrnexus/mobile": ["@wrnexus/mobile@0.8.7", "", { "dependencies": { "@wrnexus/native": "^0.8.7" } }, "sha512-fzovP+ZxJ/NYHMFGOPQn5TKdIeV8wvPTeO0JMSO+26dV7X/8vZnxicFRhxXDRXXazwv4NBp/kenTKCmr2QQlCw=="], - "@wrnexus/native": ["@wrnexus/native@0.8.6", "", {}, "sha512-tvixeM+JnBG+lndVBZn9SmlaNq/Pvj/JjpV+gjkmmg9XH4Cnh0egh4uyqxGv+kC9svnAgzq+WOb20binOp+0ZQ=="], + "@wrnexus/native": ["@wrnexus/native@0.8.7", "", {}, "sha512-mTD4CyuRtVBAQRdBzeJ/7VPnTPpSp1yYcxmGV+Qtr6L7YGCoLffJiSxSloIaNozkFYZdZ/9KdhrxEijURDwwiA=="], - "@wrnexus/oauth": ["@wrnexus/oauth@0.8.6", "", { "dependencies": { "@wrnexus/jwt": "^0.8.6" } }, "sha512-PaIvb+MHMQ+s2SRantoHo4AgtMRImMxZ4EiI7DtiPrd/lhGvXkwQXaX0mDDOwV5lMhkvWq2cx5gMhewOKuceJw=="], + "@wrnexus/oauth": ["@wrnexus/oauth@0.8.7", "", { "dependencies": { "@wrnexus/jwt": "^0.8.7" } }, "sha512-tIn/YsDCsZAeSdflKWlDrBxIE87BJanMD9nVd5mFj/l9371ZFUt7OwK3n+6bJJCOYYekLLGVP5TGnwvzDrOuTA=="], - "@wrnexus/observability": ["@wrnexus/observability@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6" } }, "sha512-tAdVBGLx/xJpcYtQLkLc8YAFMNlXH2KrHeefU/Hx/ZVtDNgwrVhQqLYctq7s6q7a3i6zDUuJ50DX4J9XFUJmOA=="], + "@wrnexus/observability": ["@wrnexus/observability@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7" } }, "sha512-W7lAH1M30HvW0W64g9Q6Smj0itS7kawb/Bw+9xNplIvTkcTFw9Gz4Tjv3DqNhQy9VXJbF8+KsmiRvmKOvDtFpA=="], - "@wrnexus/playground": ["@wrnexus/playground@0.8.6", "", { "dependencies": { "@wrnexus/compiler": "^0.8.6", "@wrnexus/syntax": "^0.8.6" } }, "sha512-m6kGb3hQchlWd+2Q211BCoFo2Qd0J3ItL1vNAGxEwpA+WO4zj3mcXK6YEgP4cHns+90AFP6GjEgCjUAa4Ldrhg=="], + "@wrnexus/playground": ["@wrnexus/playground@0.8.7", "", { "dependencies": { "@wrnexus/compiler": "^0.8.7", "@wrnexus/syntax": "^0.8.7" } }, "sha512-j8m81p3yDeAm3c43ZvFJyt3ZP4ZmTn2iY/HoesqbfpdOAjtGKy/vV3ndrwjovTFn3iM1ebxQqnQGse3X+mZLfA=="], - "@wrnexus/plugin": ["@wrnexus/plugin@0.8.6", "", { "dependencies": { "@wrnexus/syntax": "^0.8.6" } }, "sha512-W2OtscCsv7PPuCAWCQ5pj8bVk9qcoGm12LYnQ+QUOd7a5wPBb1ucedl8+vbZS+HHYfNs9eOIywMz/dXo8otluA=="], + "@wrnexus/plugin": ["@wrnexus/plugin@0.8.7", "", { "dependencies": { "@wrnexus/syntax": "^0.8.7" } }, "sha512-MXY/iVTD2jvtMEpE+GqZm/ohUu1AnA9U2vveP+Wp0HdaJD8IRuUbpanJZCPMs4xDqSTy56quQ/AZBy25MI4E+g=="], - "@wrnexus/pubsub": ["@wrnexus/pubsub@0.8.6", "", {}, "sha512-34TlBxf0HvpcTNp5hPOufWuqIZqUYivbfp0BCdMMUvZqhcG3YCnhH0K5PPkJzVS04wj6myaNcv9nu24wxRGb9w=="], + "@wrnexus/pubsub": ["@wrnexus/pubsub@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7", "@wrnexus/rpc": "^0.8.7" } }, "sha512-OL+etmnYrXoH915a8RO7hhOHf1ZksC8OySm/hyfOGvc8AiHbTMv6WQ8P90cwEU99cMqBjvvw6txNo+w7DYWXMQ=="], - "@wrnexus/pwa": ["@wrnexus/pwa@0.8.6", "", {}, "sha512-t6ZQezxbAPuTkpFfUSZhOfNOOtrog3sV1JiJOiPmK/aSL05l2o5KBpqxLczzR6wbxTLFn3nLEt1h84ub5mzOEA=="], + "@wrnexus/pwa": ["@wrnexus/pwa@0.8.7", "", {}, "sha512-pZ83UhTo3IIG8yK/9KGDJEfDpu6QuQAkEuaYNUzk9iTDQYHXT9bG4xAV1/VYrFY0O9XC4Lrw9wvTwwaVOCi6qg=="], - "@wrnexus/queue": ["@wrnexus/queue@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6" } }, "sha512-fWJsLZOcLkuiYHqOa/jHjyqVMTlUxexO46S/7iXFYEgKEvOb+gnrF/4efdsqnvjjjYEkmGypUkRxTP1vgfVzlw=="], + "@wrnexus/queue": ["@wrnexus/queue@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7", "@wrnexus/rpc": "^0.8.7" } }, "sha512-5oHdkCdr91ETbuKBPcWnyUOiHVW47wWTDjg0kx5iAx3pz72Zr3xZKLLrjTmrL6Mzol6lqtptOT2R2aB7pzI9EA=="], - "@wrnexus/reactive": ["@wrnexus/reactive@0.8.6", "", {}, "sha512-tgzFwilkjsG8JawcTS99cuKSgD+ZiKD72KE5KGQmEBAzgP8NMYmmCdhTxTzeqKTwo1P7KKZi5MOFDnlu7LfdMw=="], + "@wrnexus/reactive": ["@wrnexus/reactive@0.8.7", "", {}, "sha512-MUJ/DyIKPKElQpkJH9WDRMUfAfKc/qZm7S6op9Ld67UabKNb9Dfb1cXNqcm3K5U+3nP7hnox8oDljzqOhxnLww=="], - "@wrnexus/realtime": ["@wrnexus/realtime@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6", "@wrnexus/plugin": "^0.8.6", "@wrnexus/ui": "^0.8.6" } }, "sha512-m3zlV67fcAGdkpVQxwwybbVy97gjsWscJn+Cz/xOQNJXPjPW1sL7VPCJYiujDgTKhoobSJT4nBVUMbdwqQ+4ew=="], + "@wrnexus/realtime": ["@wrnexus/realtime@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7", "@wrnexus/plugin": "^0.8.7", "@wrnexus/ui": "^0.8.7" } }, "sha512-fuUBaVgUgS2NfhAJy0pLFBRH6h+SCJHaMqtTNiRIS/Ji2PvJ1KuxPawZ1oleNK54nxVItLP9kt3HLusGUC1fFw=="], - "@wrnexus/router": ["@wrnexus/router@0.8.6", "", { "dependencies": { "@wrnexus/compiler": "^0.8.6", "@wrnexus/core": "^0.8.6" } }, "sha512-q8zB9jq7ZCptvX+9O84Be/hBpySkzCif6EqAVt0l75mDIjaHd3aK1SrdgXkQcKOi2KlU+4zP4iUc/f2pTyPryQ=="], + "@wrnexus/router": ["@wrnexus/router@0.8.7", "", { "dependencies": { "@wrnexus/compiler": "^0.8.7", "@wrnexus/core": "^0.8.7" } }, "sha512-nJggyMU5W4k3brrq7lWkjnyhoahqsrwraiM0zWD5+ukD50X0uEu5NHyM4Tox5bVpFPUbg0V4lzi6xHl0yGuaBA=="], - "@wrnexus/rpc": ["@wrnexus/rpc@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6", "@wrnexus/helpers": "^0.8.6", "@wrnexus/jwt": "^0.8.6", "@wrnexus/validation": "^0.8.6" } }, "sha512-nQWFHd7LPrerbWZQk8Nru0+1muQCRbMc8alvP041JRnUL+YlKFC9zG2lt4Ftux6pMGIFB8T2v1pVEzwgBQgqjg=="], + "@wrnexus/rpc": ["@wrnexus/rpc@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7", "@wrnexus/helpers": "^0.8.7", "@wrnexus/jwt": "^0.8.7", "@wrnexus/validation": "^0.8.7" } }, "sha512-AVmFWHeaiio/tLq5B2iryR+TozyUOQdjktDjtx8Hqfl+oHkQNsoNizfFY8rbl7IGcCq3vt6N/9HDxtxqE2eNzg=="], - "@wrnexus/security": ["@wrnexus/security@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6" } }, "sha512-Yuld+0JZYzJSG41bcr63V81OyOuTzrkHWO1F7rauNeARalIuWJE5RsoiQFvaS7G9mBXM858QoIqUz5hUlfv9gg=="], + "@wrnexus/security": ["@wrnexus/security@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7" } }, "sha512-dDp5D7fFMUc8Fcep67EAokgWB2dIeGiDUeepgTDtgjy5lXYfuE0b7iAUJNJQL2KnJV1KOjxYgxeiC4Rd972C6Q=="], - "@wrnexus/ssr": ["@wrnexus/ssr@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6", "@wrnexus/security": "^0.8.6", "@wrnexus/store": "^0.8.6" } }, "sha512-YE1TrNRhJN5e0bIJLTSgBns/ggjwN7CgOXrQ8PZZ58FWjqxrMxVVG5/0rfcnlHo1mvm6I6+QWcI+11HCK1xW+g=="], + "@wrnexus/ssr": ["@wrnexus/ssr@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7", "@wrnexus/security": "^0.8.7", "@wrnexus/store": "^0.8.7" } }, "sha512-WwBSGfXzlakVrtUjqwVhpHA7KT76Ghj1jxQ6iUogxP/8NOhb65y4pKoaXyxR5mcV4iFgMbI65YajxK8VrTskcw=="], - "@wrnexus/store": ["@wrnexus/store@0.8.6", "", {}, "sha512-aufLAYyFNx7U2b1c0hDDIUj9CxG79ENckVqAVV41Bl5GxmqizHEVnX5G8dNw1aBe0smuwWsqgN7ipTB91VftqA=="], + "@wrnexus/store": ["@wrnexus/store@0.8.7", "", {}, "sha512-whLCY/UzDsD/7AFw11XkHXDOmTbMfFGuN2Wyn5GgHexUJwPvZFTa+50chuIOKF80IyJPL3I+h7vLNYzhHqYFTg=="], - "@wrnexus/styles": ["@wrnexus/styles@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6", "@wrnexus/plugin": "^0.8.6", "@wrnexus/uploader": "^0.8.6" } }, "sha512-d1uvrmC1yRuvdfW/Gao8jfJYw1FUD186Ndrm5zFfKGB3AelXxw+3a/CviVDdYF9MucgoPGhYXbDFlsn5gR4TpA=="], + "@wrnexus/styles": ["@wrnexus/styles@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7", "@wrnexus/plugin": "^0.8.7", "@wrnexus/uploader": "^0.8.7" } }, "sha512-iHCegd15joSjmn6ODl6N8uYkYFps1xiQizy26qvDxwQlCp5JnO92SyJD+1CEj9pZO6et9Who0+VpNEeJ3HlMWA=="], - "@wrnexus/syntax": ["@wrnexus/syntax@0.8.6", "", {}, "sha512-ODHB6mNba2W7dRCTb46NeqFByac3y1RuIUVTfhsMijoGRmN6YOfqsR2Qcchril8SIH3xolzdUqzbSJF/RCkuNw=="], + "@wrnexus/syntax": ["@wrnexus/syntax@0.8.7", "", {}, "sha512-JyaRG8ZflAeZqF7Nb/21hs8m3jG5okYn0oC/Jmk1ARjiGvy4DbEog0dqrRehrU7S97kkj/yMO+or5oH6Yb53wg=="], - "@wrnexus/test": ["@wrnexus/test@0.8.6", "", {}, "sha512-BKQT4636XgbnwTlJVBqHKaL1k+5diN5GStQbvz76LbSsnRDTWP4m8f//JFnUxL27r1/YXxSxsP2hIdWf5adKeg=="], + "@wrnexus/test": ["@wrnexus/test@0.8.7", "", {}, "sha512-iNUPugWNa11+joNl5ULA2kA7EvjrMQSCWNv0xMVnnqipNqIgY/A5Puy0Ac29/tesUVQF/qQvIYReFp0uLFrOmw=="], - "@wrnexus/tracking": ["@wrnexus/tracking@0.8.6", "", {}, "sha512-CHN+Xk5+F5L5wis8xUMLt9aQ7khvCdBQbCDFl4ELRgcbQHajzO45kBDUz5rV3XolYkzRRHrH7LNWqMArZ1kAlQ=="], + "@wrnexus/tracking": ["@wrnexus/tracking@0.8.7", "", {}, "sha512-aP8kbVYpyKakJEb/zk1ZM5DOZsJiwuT75i1IPcKzCEBraeAJnSIp5ddnV9rG43VWV1pB2qMSlkGx6Y+NpdmR7A=="], - "@wrnexus/typecheck": ["@wrnexus/typecheck@0.8.6", "", { "dependencies": { "@wrnexus/syntax": "^0.8.6", "typescript": "^5.5.0" } }, "sha512-j5uE6eK5AxurHhN4Aw9ngnKE5PUEQF93SywtGYMXw91chtdAH1Fx4u1xLewB7n4jLCXPCEg8blAs3GmNfNvMLw=="], + "@wrnexus/typecheck": ["@wrnexus/typecheck@0.8.7", "", { "dependencies": { "@wrnexus/syntax": "^0.8.7", "typescript": "^5.5.0" } }, "sha512-QxCVu/524W8oXjMQ8So/2FANZ4wRd6nbIrzdf/jHOc4HkFVwuqzDFBWvT+FlQQGqw2hCVfqsiEBeIMAxvzV26g=="], - "@wrnexus/ui": ["@wrnexus/ui@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6" } }, "sha512-SFgbDQRZaY3chIAUxnlLqVOU/52hK/Ytpg5I6D8v1DqYX0W9rjGhF6kkJT1X+yu4/XGhj2dndsg7ik4tZYF3uA=="], + "@wrnexus/ui": ["@wrnexus/ui@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7" } }, "sha512-BMw/kSM47K2TeqdmnMCStReu78a0PGMixRXz4FM2XEX0ofHo8yziNkZaNm3N5yj7ruaSurwZSIJnMFpKokJi+g=="], - "@wrnexus/uploader": ["@wrnexus/uploader@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6", "@wrnexus/plugin": "^0.8.6", "@wrnexus/ui": "^0.8.6" } }, "sha512-z5fySfqpSXsikGyFMpOgOAydlIeK/N9ZbiHDfWEUMd9HwZO8PVLnZydLafN8L+uMKslbJVhLGB2zGH04L+7eAA=="], + "@wrnexus/uploader": ["@wrnexus/uploader@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7", "@wrnexus/plugin": "^0.8.7", "@wrnexus/ui": "^0.8.7" } }, "sha512-8UemIpR4hDrD75Kq8hYg6+fGpgvyaRBAGfQCyWgnK03cNTnWOvu8zETufHSIuPXv2qErhWsA8B/VWFLWn46m0A=="], - "@wrnexus/validation": ["@wrnexus/validation@0.8.6", "", { "dependencies": { "@wrnexus/core": "^0.8.6", "@wrnexus/plugin": "^0.8.6", "@wrnexus/ui": "^0.8.6" } }, "sha512-BTbpjkg7A0d/bhjeg6veNK8weyn/1O3r+MOmxjDn4ESZhBCw/fxBQO6Mj1FhcOu4rs2hiS3TvNpd9B7UY/cMaA=="], + "@wrnexus/validation": ["@wrnexus/validation@0.8.7", "", { "dependencies": { "@wrnexus/core": "^0.8.7", "@wrnexus/plugin": "^0.8.7", "@wrnexus/ui": "^0.8.7" } }, "sha512-M/uNEJdj5BHPu3e+YTLsOQK9YzlHMiTSkuBxm12F434rR8Pccl/TIteOzag2ZEi+BSIxB1svLP/KPi88nZiqSw=="], "acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], diff --git a/docs/release-access-status.md b/docs/release-access-status.md index ce63794c..c119cb8e 100644 --- a/docs/release-access-status.md +++ b/docs/release-access-status.md @@ -2,6 +2,6 @@ ## Decision: Mode B — Private Developer Preview -Active version: 0.8.6, derived from package.json#wrnexus.version. All 47 installed @wrnexus packages resolve to 0.8.6 and npm reports restricted access. The repository remote is a private WorkRoot Git service and no public license file exists. +Active version: 0.8.7, derived from package.json#wrnexus.version. All 47 installed @wrnexus packages resolve to 0.8.7 and npm reports restricted access. The repository remote is a private WorkRoot Git service and no public license file exists. -External users cannot execute an installation without approved private registry credentials. The truthful CTA is Request preview access. After approval, the canonical command is bunx @wrnexus/cli@0.8.6 create my-app. Tokens must never appear in documentation or source. +External users cannot execute an installation without approved private registry credentials. The truthful CTA is Request preview access. After approval, the canonical command is bunx @wrnexus/cli@0.8.7 create my-app. Tokens must never appear in documentation or source. diff --git a/docs/site-audit.md b/docs/site-audit.md index 0a088906..d0a8ca1c 100644 --- a/docs/site-audit.md +++ b/docs/site-audit.md @@ -1,6 +1,6 @@ # WRNexusJS site audit -Date: 2026-07-13. Baseline: Bun 1.3.14, framework 0.8.6. +Date: 2026-07-13. Baseline: Bun 1.3.14, framework 0.8.7. ## Baseline results @@ -12,7 +12,7 @@ Date: 2026-07-13. Baseline: Bun 1.3.14, framework 0.8.6. ## Findings -Package documentation, discovery assets, and AI-readable references are generated from the installed release. The 0.8.6 portal includes the helpers package, workspace app addition, and safe forward-auth login redirect guidance. +Package documentation, discovery assets, and AI-readable references are generated from the installed release. The 0.8.7 portal includes the helpers package, workspace app addition, and safe forward-auth login redirect guidance. ## Audit limitations diff --git a/package-lock.json b/package-lock.json index 1a16a6f7..f6e1d273 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,59 +10,59 @@ "dependencies": { "@iconify-json/lucide": "^1.2.118", "@iconify/tailwind4": "^1.2.3", - "@wrnexus/ai": "^0.8.6", - "@wrnexus/auth": "^0.8.6", - "@wrnexus/authz": "^0.8.6", - "@wrnexus/benchmark": "^0.8.6", - "@wrnexus/cache": "^0.8.6", - "@wrnexus/captcha": "^0.8.6", - "@wrnexus/compiler": "^0.8.6", - "@wrnexus/content": "^0.8.6", - "@wrnexus/core": "^0.8.6", - "@wrnexus/csr": "^0.8.6", - "@wrnexus/db": "^0.8.6", - "@wrnexus/dev-server": "^0.8.6", - "@wrnexus/dev-toolbar": "^0.8.6", - "@wrnexus/encryption": "^0.8.6", - "@wrnexus/graphql": "^0.8.6", - "@wrnexus/helpers": "^0.8.6", - "@wrnexus/i18n": "^0.8.6", - "@wrnexus/identity": "^0.8.6", - "@wrnexus/image": "^0.8.6", - "@wrnexus/jwt": "^0.8.6", - "@wrnexus/language-server": "^0.8.6", - "@wrnexus/mcp": "^0.8.6", - "@wrnexus/mobile": "^0.8.6", - "@wrnexus/native": "^0.8.6", - "@wrnexus/oauth": "^0.8.6", - "@wrnexus/observability": "^0.8.6", - "@wrnexus/playground": "^0.8.6", - "@wrnexus/plugin": "^0.8.6", - "@wrnexus/pubsub": "^0.8.6", - "@wrnexus/pwa": "^0.8.6", - "@wrnexus/queue": "^0.8.6", - "@wrnexus/reactive": "^0.8.6", - "@wrnexus/realtime": "^0.8.6", - "@wrnexus/router": "^0.8.6", - "@wrnexus/rpc": "^0.8.6", - "@wrnexus/security": "^0.8.6", - "@wrnexus/ssr": "^0.8.6", - "@wrnexus/store": "^0.8.6", - "@wrnexus/styles": "^0.8.6", - "@wrnexus/syntax": "^0.8.6", - "@wrnexus/test": "^0.8.6", - "@wrnexus/tracking": "^0.8.6", - "@wrnexus/typecheck": "^0.8.6", - "@wrnexus/ui": "^0.8.6", - "@wrnexus/uploader": "^0.8.6", - "@wrnexus/validation": "^0.8.6" + "@wrnexus/ai": "^0.8.7", + "@wrnexus/auth": "^0.8.7", + "@wrnexus/authz": "^0.8.7", + "@wrnexus/benchmark": "^0.8.7", + "@wrnexus/cache": "^0.8.7", + "@wrnexus/captcha": "^0.8.7", + "@wrnexus/compiler": "^0.8.7", + "@wrnexus/content": "^0.8.7", + "@wrnexus/core": "^0.8.7", + "@wrnexus/csr": "^0.8.7", + "@wrnexus/db": "^0.8.7", + "@wrnexus/dev-server": "^0.8.7", + "@wrnexus/dev-toolbar": "^0.8.7", + "@wrnexus/encryption": "^0.8.7", + "@wrnexus/graphql": "^0.8.7", + "@wrnexus/helpers": "^0.8.7", + "@wrnexus/i18n": "^0.8.7", + "@wrnexus/identity": "^0.8.7", + "@wrnexus/image": "^0.8.7", + "@wrnexus/jwt": "^0.8.7", + "@wrnexus/language-server": "^0.8.7", + "@wrnexus/mcp": "^0.8.7", + "@wrnexus/mobile": "^0.8.7", + "@wrnexus/native": "^0.8.7", + "@wrnexus/oauth": "^0.8.7", + "@wrnexus/observability": "^0.8.7", + "@wrnexus/playground": "^0.8.7", + "@wrnexus/plugin": "^0.8.7", + "@wrnexus/pubsub": "^0.8.7", + "@wrnexus/pwa": "^0.8.7", + "@wrnexus/queue": "^0.8.7", + "@wrnexus/reactive": "^0.8.7", + "@wrnexus/realtime": "^0.8.7", + "@wrnexus/router": "^0.8.7", + "@wrnexus/rpc": "^0.8.7", + "@wrnexus/security": "^0.8.7", + "@wrnexus/ssr": "^0.8.7", + "@wrnexus/store": "^0.8.7", + "@wrnexus/styles": "^0.8.7", + "@wrnexus/syntax": "^0.8.7", + "@wrnexus/test": "^0.8.7", + "@wrnexus/tracking": "^0.8.7", + "@wrnexus/typecheck": "^0.8.7", + "@wrnexus/ui": "^0.8.7", + "@wrnexus/uploader": "^0.8.7", + "@wrnexus/validation": "^0.8.7" }, "devDependencies": { "@eslint/js": "^9.0.0", "@tailwindcss/cli": "^4.0.0", "@types/bun": "latest", "@types/node": "^26.1.1", - "@wrnexus/cli": "^0.8.6", + "@wrnexus/cli": "^0.8.7", "eslint": "^9.0.0", "prettier": "latest", "tailwindcss": "^4.0.0", @@ -1504,109 +1504,109 @@ } }, "node_modules/@wrnexus/ai": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/ai/-/ai-0.8.6.tgz", - "integrity": "sha512-s+dG8qezNis6Km81SG+2WESFmk1kn+wT1FSfv6FwKm6PyvMB35So4PFXz9BNqsSI1giA+6zW4tlihJFBmSX05w==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/ai/-/ai-0.8.7.tgz", + "integrity": "sha512-Q+62hKfkdV29ImxBfwf934BaHIVu6Q5anh264azotMUmzKh9FOTQG03PIVUfiYFJDUR6iBKMVh3o1cv00WFzZQ==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/auth": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/auth/-/auth-0.8.6.tgz", - "integrity": "sha512-SBKsfYMib/blRk4CrUw0WOXxb2dNcOwoCxx1S2gq4KYnvNOu18NMH5Vs3DpuxF9/uOLrfOXxOpSXWG1+XbMlUw==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/auth/-/auth-0.8.7.tgz", + "integrity": "sha512-BZHVk8maM4aDvqk1TIPBYjxdp4buEcImzycnqAxk4Uv6XwFey89zCtZ25Yi6rbMz9QfsnJiVUugNB5SrSpzn7Q==", "license": "MIT", "dependencies": { - "@wrnexus/authz": "^0.8.6", - "@wrnexus/captcha": "^0.8.6", - "@wrnexus/core": "^0.8.6", - "@wrnexus/db": "^0.8.6", - "@wrnexus/encryption": "^0.8.6", - "@wrnexus/jwt": "^0.8.6", - "@wrnexus/oauth": "^0.8.6", - "@wrnexus/plugin": "^0.8.6", - "@wrnexus/queue": "^0.8.6", - "@wrnexus/ui": "^0.8.6", - "@wrnexus/validation": "^0.8.6" + "@wrnexus/authz": "^0.8.7", + "@wrnexus/captcha": "^0.8.7", + "@wrnexus/core": "^0.8.7", + "@wrnexus/db": "^0.8.7", + "@wrnexus/encryption": "^0.8.7", + "@wrnexus/jwt": "^0.8.7", + "@wrnexus/oauth": "^0.8.7", + "@wrnexus/plugin": "^0.8.7", + "@wrnexus/queue": "^0.8.7", + "@wrnexus/ui": "^0.8.7", + "@wrnexus/validation": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/authz": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/authz/-/authz-0.8.6.tgz", - "integrity": "sha512-2n3dqXdxXS1lXxb7m/WzPbcP4PzBS/d2rm4nNpVbXBD1p26ajnqJTPcph/71LMUJnxuYGJOsUIvNwJsRoJil3w==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/authz/-/authz-0.8.7.tgz", + "integrity": "sha512-TW4xb4zeRroAhWIcwUnqCx6RgIGnOnAM/XXvrV0OVeA8/GWv99Toh+176OBl66b5wkLHbFCm+XIw+SBrJdqEvw==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6", - "@wrnexus/db": "^0.8.6" + "@wrnexus/core": "^0.8.7", + "@wrnexus/db": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/benchmark": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/benchmark/-/benchmark-0.8.6.tgz", - "integrity": "sha512-GEnaw2tWgmMkZxJFaS9LTJiX4JM+fI/tu9Mub4Uj+apmZkorRkGvqaSqJ4FMBAv2xlpUCIzaM8LdsZCQj/vc0A==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/benchmark/-/benchmark-0.8.7.tgz", + "integrity": "sha512-8ImVkRCqEdSYZlwSGNkuOs8RDumsVpQ6Ih9r7MQQvzRc4M/7D/OFmq00G6kKsRyefNE9iwvSQAoEGjm1lYL5FQ==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/cache": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/cache/-/cache-0.8.6.tgz", - "integrity": "sha512-jUmx6mglnS8NtHBc8tnrKcPRsJd0pKJ2EN9HZqSDT2aNLaocoVHt+JwJNy4s1XWPmp/aHMT6JxSBACrPGaZYgQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/cache/-/cache-0.8.7.tgz", + "integrity": "sha512-bu9aQBmgIziiLwWV0yOx0fU4K8MxRDinD1HyUqWG02zP6IHh6e65A3JdAnZWINV5Ot/JhF5NtMXAtT2QChtu0A==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6" + "@wrnexus/core": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/captcha": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/captcha/-/captcha-0.8.6.tgz", - "integrity": "sha512-tjL1RckyI8u8a2QGJ2rh3YVDl+V2k/CfPS7+H8/jLGI1EyaYYVHLyqDZOkFE0dxrVNhJa9zz6HD6bfmRFf+N6Q==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/captcha/-/captcha-0.8.7.tgz", + "integrity": "sha512-t/kNu2X4Zb9wj1njgEZ+4Hw/V8ulYlvZ1IR+qIWm1dXtv6sul47pBxlh7sScZobaZ7E3IOpMGsRSDz3i39vMPA==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6", - "@wrnexus/plugin": "^0.8.6", - "@wrnexus/ui": "^0.8.6", - "@wrnexus/validation": "^0.8.6" + "@wrnexus/core": "^0.8.7", + "@wrnexus/plugin": "^0.8.7", + "@wrnexus/ui": "^0.8.7", + "@wrnexus/validation": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/cli": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/cli/-/cli-0.8.6.tgz", - "integrity": "sha512-Av8XUTfFh4XFX6Z2iJl//xLAmiJ2mIOiZMCNEAdY97kD8H5Ev5KOb8HPb2uiTIfKrDL0aHRqHW+6xzWN/kAgUg==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/cli/-/cli-0.8.7.tgz", + "integrity": "sha512-E8OxydwUo4W73wCyboLNZ7x+91iGQUOXjXvrBf0FHPpZkBWcYbwUdDXpBetdxhAmvmDgasylXL3FSwxOoe+ihw==", "dev": true, "license": "MIT", "dependencies": { - "@wrnexus/authz": "^0.8.6", - "@wrnexus/compiler": "^0.8.6", - "@wrnexus/core": "^0.8.6", - "@wrnexus/csr": "^0.8.6", - "@wrnexus/db": "^0.8.6", - "@wrnexus/dev-server": "^0.8.6", - "@wrnexus/i18n": "^0.8.6", - "@wrnexus/mcp": "^0.8.6", - "@wrnexus/playground": "^0.8.6", - "@wrnexus/plugin": "^0.8.6", - "@wrnexus/router": "^0.8.6", - "@wrnexus/security": "^0.8.6", - "@wrnexus/styles": "^0.8.6", - "@wrnexus/syntax": "^0.8.6", - "@wrnexus/typecheck": "^0.8.6", - "@wrnexus/ui": "^0.8.6", - "@wrnexus/validation": "^0.8.6", + "@wrnexus/authz": "^0.8.7", + "@wrnexus/compiler": "^0.8.7", + "@wrnexus/core": "^0.8.7", + "@wrnexus/csr": "^0.8.7", + "@wrnexus/db": "^0.8.7", + "@wrnexus/dev-server": "^0.8.7", + "@wrnexus/i18n": "^0.8.7", + "@wrnexus/mcp": "^0.8.7", + "@wrnexus/playground": "^0.8.7", + "@wrnexus/plugin": "^0.8.7", + "@wrnexus/router": "^0.8.7", + "@wrnexus/security": "^0.8.7", + "@wrnexus/styles": "^0.8.7", + "@wrnexus/syntax": "^0.8.7", + "@wrnexus/typecheck": "^0.8.7", + "@wrnexus/ui": "^0.8.7", + "@wrnexus/validation": "^0.8.7", "selfsigned": "^5.5.0" }, "bin": { @@ -1617,198 +1617,198 @@ } }, "node_modules/@wrnexus/compiler": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/compiler/-/compiler-0.8.6.tgz", - "integrity": "sha512-/fa1U37+A8itfFPxMyAtVe5JVgo0dSMavq72omJNQk8yB7r46HuQ7AUtm2DBwCQxv16kq6USvHXo1lRIOvsy0A==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/compiler/-/compiler-0.8.7.tgz", + "integrity": "sha512-Qn+6FBVyZkCxrXl9p3zn0pSGoCSHvHJmAZZ4bXiAA/IKN+ZqHdK5XfOseK/8RJn3UwufAC1SaLshfCweLDKPcQ==", "license": "MIT", "dependencies": { - "@wrnexus/csr": "^0.8.6", - "@wrnexus/store": "^0.8.6", - "@wrnexus/syntax": "^0.8.6", - "@wrnexus/validation": "^0.8.6" + "@wrnexus/csr": "^0.8.7", + "@wrnexus/store": "^0.8.7", + "@wrnexus/syntax": "^0.8.7", + "@wrnexus/validation": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/content": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/content/-/content-0.8.6.tgz", - "integrity": "sha512-gOYn2A53ZCqNpI954HvAaeaYblEr2c2TZtUSik/VXScDn6M/rLqpPuIk9EHKvenHDYOW28QOHPxswUAYwmtNoQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/content/-/content-0.8.7.tgz", + "integrity": "sha512-4EqnsrGHQcQ5vsv5tUMCk46IU/Uik7ACuCeomno02+mO5gk/hz0G9XO9VLfZeMZAnwe03NM9/c4yt86C72A6FA==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/core": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/core/-/core-0.8.6.tgz", - "integrity": "sha512-m/VUFVc736ijvSOKqVrsA2Nd6Ty7CZmtrKgYOMOoQELoxtmWM8CifjKicJQgTX7NwlOLYFa7PITqpqiBRDizQA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/core/-/core-0.8.7.tgz", + "integrity": "sha512-iXr7h25cP9MQ/qzjfYlwNq6YAe4xSVDvM754bxTicwD0QbHY9KJYkd+jhkhW5E/5NnGuKBg8bS0LKXdoK/+ihg==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/csr": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/csr/-/csr-0.8.6.tgz", - "integrity": "sha512-leB5XDZVApT6tw+EdIsnZhqaQ4aT3CpwNZWCRcyp+LNYmoohWu5rI342Zb2cuvEWGeA45Xma+lQ/y/8oGvkbQA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/csr/-/csr-0.8.7.tgz", + "integrity": "sha512-IZaajUnIVJc2YCBPaDS2Hxd4I8Bs5U1mV4OqlNXatj7d8q7I0P8Nqq2WTaZ0Skv1TnDH0N56D0ndxyrRc2kHKg==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6" + "@wrnexus/core": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/db": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/db/-/db-0.8.6.tgz", - "integrity": "sha512-t7OrLnEKoLYds6F/IhLq8LRx61WWErym7mcETuJWPzsRV+Wlv0z3qTj8S/S4hKMc9Lv94X9CyxGq1u4hd1gJfQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/db/-/db-0.8.7.tgz", + "integrity": "sha512-nwvG/NUAoY9K+KY42fBsN6PzOhYAfI5njM5tYCmt896XPVgnhkqnvVCCP0ugINgWjiFEqOq04p/4kR04rM7Sng==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/dev-server": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/dev-server/-/dev-server-0.8.6.tgz", - "integrity": "sha512-yLlt9UB+wlXUhVxnqBGXfCF0+TxiB7GEgO0bsY/6qt/he9p4lcZ3ig4flJ608oppk8CZcpEKv+/pWAE8GkpSYQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/dev-server/-/dev-server-0.8.7.tgz", + "integrity": "sha512-6OKNa2RsZ2mO8wYKy+0ZxbV5396ENWTStHpIvVmcsFiVCeEj5Sf7ccy77L+tN5GOtXAFW8YzFBUuwGMNwwNXgw==", "license": "MIT", "dependencies": { - "@wrnexus/authz": "^0.8.6", - "@wrnexus/cache": "^0.8.6", - "@wrnexus/compiler": "^0.8.6", - "@wrnexus/core": "^0.8.6", - "@wrnexus/csr": "^0.8.6", - "@wrnexus/db": "^0.8.6", - "@wrnexus/dev-toolbar": "^0.8.6", - "@wrnexus/i18n": "^0.8.6", - "@wrnexus/observability": "^0.8.6", - "@wrnexus/plugin": "^0.8.6", - "@wrnexus/pubsub": "^0.8.6", - "@wrnexus/pwa": "^0.8.6", - "@wrnexus/router": "^0.8.6", - "@wrnexus/rpc": "^0.8.6", - "@wrnexus/security": "^0.8.6", - "@wrnexus/ssr": "^0.8.6", - "@wrnexus/store": "^0.8.6", - "@wrnexus/styles": "^0.8.6", - "@wrnexus/ui": "^0.8.6", - "@wrnexus/uploader": "^0.8.6", - "@wrnexus/validation": "^0.8.6" + "@wrnexus/authz": "^0.8.7", + "@wrnexus/cache": "^0.8.7", + "@wrnexus/compiler": "^0.8.7", + "@wrnexus/core": "^0.8.7", + "@wrnexus/csr": "^0.8.7", + "@wrnexus/db": "^0.8.7", + "@wrnexus/dev-toolbar": "^0.8.7", + "@wrnexus/i18n": "^0.8.7", + "@wrnexus/observability": "^0.8.7", + "@wrnexus/plugin": "^0.8.7", + "@wrnexus/pubsub": "^0.8.7", + "@wrnexus/pwa": "^0.8.7", + "@wrnexus/router": "^0.8.7", + "@wrnexus/rpc": "^0.8.7", + "@wrnexus/security": "^0.8.7", + "@wrnexus/ssr": "^0.8.7", + "@wrnexus/store": "^0.8.7", + "@wrnexus/styles": "^0.8.7", + "@wrnexus/ui": "^0.8.7", + "@wrnexus/uploader": "^0.8.7", + "@wrnexus/validation": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/dev-toolbar": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/dev-toolbar/-/dev-toolbar-0.8.6.tgz", - "integrity": "sha512-YfRbMBlFEci8Idoqt68dO66oVfEZqduC45EaR4i1GllwNmwe6POoeZCmn1DbCE5LVLRM8RtDOmT8AZaaRjdvoQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/dev-toolbar/-/dev-toolbar-0.8.7.tgz", + "integrity": "sha512-8WUaF03jlqkRcU7mqDhnaWonXYukLhr2MujZuo1YQ4Cixd74mhkd4+cM6vj1s3qyJ+Q+0O+eZNg9VAVzV32SWg==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/encryption": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/encryption/-/encryption-0.8.6.tgz", - "integrity": "sha512-b2zfDgsHgDEeNX1R6dPH5HoxAVBJgQx8pGt9UydN2d02HS6hIbUBg5k679DFDlI1GEZ8qT2BcD8e64DjVXdjuw==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/encryption/-/encryption-0.8.7.tgz", + "integrity": "sha512-z1lhGBpxzFml+mpz8QDx1WJUQ97TjLscmiwqpLVISdeJ3KWUh1uy8xvNdIiWa4fI3mynVuWgowAtPiPD8OUYIA==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6" + "@wrnexus/core": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/graphql": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/graphql/-/graphql-0.8.6.tgz", - "integrity": "sha512-Q8w9IGpqD6NU+qFXEa01Pp+9iMyRAujB/YMALMGE5KjLZI7iP71o8oF7EOXe1fdGNQfMTJSk+CX4SsXVaZi4mQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/graphql/-/graphql-0.8.7.tgz", + "integrity": "sha512-xaFbKP4A9iOmipu4vMvYTphwYti9hJIuhQoPZFGayFenQ/iP2f4kiQmAhyxkvxYp7UUmhk7jrvyhdbDEn6YSPQ==", "license": "MIT", "dependencies": { - "@wrnexus/plugin": "^0.8.6" + "@wrnexus/plugin": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/helpers": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/helpers/-/helpers-0.8.6.tgz", - "integrity": "sha512-0jOjKn5scK3qAKcK9fEv++yiND174/Mw0f6k+3ICM1mbWL4sZFLN1mJFcF5qdcyKU3yzax9H3f7szt/iYjJthw==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/helpers/-/helpers-0.8.7.tgz", + "integrity": "sha512-ScYjQE2XiB8UBUcpXfRhUOcD1/hiVD+6IezlDJDklebC6oUUA/psdMp7CdkMxjm0CqnaUzmYsTaGOAiG4rL67A==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6" + "@wrnexus/core": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/i18n": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/i18n/-/i18n-0.8.6.tgz", - "integrity": "sha512-IGKn35S1tc5yUrC30+RU82ToxXhEElFuro2LF8tJq/PUjQFWDv0GPuml6eadgwwya2wPoztqOY6kFzC8fX6GyQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/i18n/-/i18n-0.8.7.tgz", + "integrity": "sha512-CmsgyJrMHHmynK1TLyk+MRbWmlolf10znvOgQWYWKJJQ4B0El7la73BsPAMof52Bp1IrVMMX8OpUoXl/r3QNtQ==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6", - "@wrnexus/plugin": "^0.8.6", - "@wrnexus/ui": "^0.8.6" + "@wrnexus/core": "^0.8.7", + "@wrnexus/plugin": "^0.8.7", + "@wrnexus/ui": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/identity": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/identity/-/identity-0.8.6.tgz", - "integrity": "sha512-vGXUPk9Do3Qxe3g1K2QqE8e7QMZpFTEsTtny4pmQNrlMJqVMptvTh41Md2ftRN7Q+LB56ggNOqXDMiN3ycaM9A==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/identity/-/identity-0.8.7.tgz", + "integrity": "sha512-hhq/nLiDOEA6myaBJPInFUSebe2swa+eNNTL5asfQwx6lsz/GBwrs5NgZtRQjN6Ma/PHQEcuJ/qLGoxKA4Teww==", "license": "MIT", "dependencies": { - "@wrnexus/auth": "^0.8.6", - "@wrnexus/authz": "^0.8.6", - "@wrnexus/oauth": "^0.8.6" + "@wrnexus/auth": "^0.8.7", + "@wrnexus/authz": "^0.8.7", + "@wrnexus/oauth": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/image": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/image/-/image-0.8.6.tgz", - "integrity": "sha512-QvdAEj0YhPRiH6TA4DX7mmJdwbvxqQ6+1znnZyiWNpj4xggsyurOWBz/fXH3Shzqno4Tw3uchYTqdkYceb1q4g==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/image/-/image-0.8.7.tgz", + "integrity": "sha512-gsmlsx13vX/yP9lKvrI1EVa+rZA1caT6CaOOUyHcbwpDo7MMvYLmbo1CbO43Fx+TaNYx/PmQTEOyh8kFaRbyaQ==", "license": "MIT", "dependencies": { - "@wrnexus/plugin": "^0.8.6", - "@wrnexus/security": "^0.8.6", - "@wrnexus/ui": "^0.8.6" + "@wrnexus/plugin": "^0.8.7", + "@wrnexus/security": "^0.8.7", + "@wrnexus/ui": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/jwt": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/jwt/-/jwt-0.8.6.tgz", - "integrity": "sha512-Cf8mQ/aRr74S1mRbeN1Qx3ICWOeHQkXFVqJljHROlWpinpfKurE59XT1jENYCghzIfZH6jKUqWOGXNHilIqduQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/jwt/-/jwt-0.8.7.tgz", + "integrity": "sha512-x5QZYFftlXVJqh15RhLNehAty8mANQ1IZVIb+P7kF0+chRb8nDMfIjg4CGPBqMNYnRCQMcanllopcW0C4rtfHw==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6" + "@wrnexus/core": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/language-server": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/language-server/-/language-server-0.8.6.tgz", - "integrity": "sha512-fdcQLd9rzYxWMDqIZYF1WCIDOAaRDrdR2+K0Bk7MoVApgKd6FD20AN6Qs1MKhr5grUfMzvLxaDIcXSuL9yGDlQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/language-server/-/language-server-0.8.7.tgz", + "integrity": "sha512-a+a/ZpBt/19Iwi9nNiZfkdsj7VfFYUGS6sN7fg9IWMwAUTYoLkjY454qKpaY+xZSLcizKdWT+Sx6XLWSZLADnQ==", "license": "MIT", "dependencies": { - "@wrnexus/syntax": "^0.8.6", - "@wrnexus/typecheck": "^0.8.6" + "@wrnexus/syntax": "^0.8.7", + "@wrnexus/typecheck": "^0.8.7" }, "bin": { "wrnexus-language-server": "dist/server.js" @@ -1818,9 +1818,9 @@ } }, "node_modules/@wrnexus/mcp": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/mcp/-/mcp-0.8.6.tgz", - "integrity": "sha512-x24SqmbGw+mILna/5uf16t00ll0fAzCB95/BHlC4xmlQOmnU6jCQpg/c5Et9j9I698H1a6LvG9x6TB7/Ft9ybA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/mcp/-/mcp-0.8.7.tgz", + "integrity": "sha512-EfzLMt2d4WCWv4w67JhPG/kUS6Me7LjMqHoeKVSCMdROXBhxl5k0/IylE1YVsjpctWHaEBEvTzUlZYTELZX4SQ==", "license": "MIT", "bin": { "wrnexus-mcp": "dist/stdio.js" @@ -1830,239 +1830,244 @@ } }, "node_modules/@wrnexus/mobile": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/mobile/-/mobile-0.8.6.tgz", - "integrity": "sha512-QLi80kt8ia2OubaWyW9Bwnf2k2veUJ49n5WPKn2DiuDCfHAoWapark8xPmrxVJLw8ctDr0DtM4BvP+a+m2OdoQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/mobile/-/mobile-0.8.7.tgz", + "integrity": "sha512-fzovP+ZxJ/NYHMFGOPQn5TKdIeV8wvPTeO0JMSO+26dV7X/8vZnxicFRhxXDRXXazwv4NBp/kenTKCmr2QQlCw==", "license": "MIT", "dependencies": { - "@wrnexus/native": "^0.8.6" + "@wrnexus/native": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/native": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/native/-/native-0.8.6.tgz", - "integrity": "sha512-tvixeM+JnBG+lndVBZn9SmlaNq/Pvj/JjpV+gjkmmg9XH4Cnh0egh4uyqxGv+kC9svnAgzq+WOb20binOp+0ZQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/native/-/native-0.8.7.tgz", + "integrity": "sha512-mTD4CyuRtVBAQRdBzeJ/7VPnTPpSp1yYcxmGV+Qtr6L7YGCoLffJiSxSloIaNozkFYZdZ/9KdhrxEijURDwwiA==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/oauth": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/oauth/-/oauth-0.8.6.tgz", - "integrity": "sha512-PaIvb+MHMQ+s2SRantoHo4AgtMRImMxZ4EiI7DtiPrd/lhGvXkwQXaX0mDDOwV5lMhkvWq2cx5gMhewOKuceJw==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/oauth/-/oauth-0.8.7.tgz", + "integrity": "sha512-tIn/YsDCsZAeSdflKWlDrBxIE87BJanMD9nVd5mFj/l9371ZFUt7OwK3n+6bJJCOYYekLLGVP5TGnwvzDrOuTA==", "license": "MIT", "dependencies": { - "@wrnexus/jwt": "^0.8.6" + "@wrnexus/jwt": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/observability": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/observability/-/observability-0.8.6.tgz", - "integrity": "sha512-tAdVBGLx/xJpcYtQLkLc8YAFMNlXH2KrHeefU/Hx/ZVtDNgwrVhQqLYctq7s6q7a3i6zDUuJ50DX4J9XFUJmOA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/observability/-/observability-0.8.7.tgz", + "integrity": "sha512-W7lAH1M30HvW0W64g9Q6Smj0itS7kawb/Bw+9xNplIvTkcTFw9Gz4Tjv3DqNhQy9VXJbF8+KsmiRvmKOvDtFpA==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6" + "@wrnexus/core": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/playground": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/playground/-/playground-0.8.6.tgz", - "integrity": "sha512-m6kGb3hQchlWd+2Q211BCoFo2Qd0J3ItL1vNAGxEwpA+WO4zj3mcXK6YEgP4cHns+90AFP6GjEgCjUAa4Ldrhg==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/playground/-/playground-0.8.7.tgz", + "integrity": "sha512-j8m81p3yDeAm3c43ZvFJyt3ZP4ZmTn2iY/HoesqbfpdOAjtGKy/vV3ndrwjovTFn3iM1ebxQqnQGse3X+mZLfA==", "license": "MIT", "dependencies": { - "@wrnexus/compiler": "^0.8.6", - "@wrnexus/syntax": "^0.8.6" + "@wrnexus/compiler": "^0.8.7", + "@wrnexus/syntax": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/plugin": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/plugin/-/plugin-0.8.6.tgz", - "integrity": "sha512-W2OtscCsv7PPuCAWCQ5pj8bVk9qcoGm12LYnQ+QUOd7a5wPBb1ucedl8+vbZS+HHYfNs9eOIywMz/dXo8otluA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/plugin/-/plugin-0.8.7.tgz", + "integrity": "sha512-MXY/iVTD2jvtMEpE+GqZm/ohUu1AnA9U2vveP+Wp0HdaJD8IRuUbpanJZCPMs4xDqSTy56quQ/AZBy25MI4E+g==", "license": "MIT", "dependencies": { - "@wrnexus/syntax": "^0.8.6" + "@wrnexus/syntax": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/pubsub": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/pubsub/-/pubsub-0.8.6.tgz", - "integrity": "sha512-34TlBxf0HvpcTNp5hPOufWuqIZqUYivbfp0BCdMMUvZqhcG3YCnhH0K5PPkJzVS04wj6myaNcv9nu24wxRGb9w==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/pubsub/-/pubsub-0.8.7.tgz", + "integrity": "sha512-OL+etmnYrXoH915a8RO7hhOHf1ZksC8OySm/hyfOGvc8AiHbTMv6WQ8P90cwEU99cMqBjvvw6txNo+w7DYWXMQ==", "license": "MIT", + "dependencies": { + "@wrnexus/core": "^0.8.7", + "@wrnexus/rpc": "^0.8.7" + }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/pwa": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/pwa/-/pwa-0.8.6.tgz", - "integrity": "sha512-t6ZQezxbAPuTkpFfUSZhOfNOOtrog3sV1JiJOiPmK/aSL05l2o5KBpqxLczzR6wbxTLFn3nLEt1h84ub5mzOEA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/pwa/-/pwa-0.8.7.tgz", + "integrity": "sha512-pZ83UhTo3IIG8yK/9KGDJEfDpu6QuQAkEuaYNUzk9iTDQYHXT9bG4xAV1/VYrFY0O9XC4Lrw9wvTwwaVOCi6qg==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/queue": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/queue/-/queue-0.8.6.tgz", - "integrity": "sha512-fWJsLZOcLkuiYHqOa/jHjyqVMTlUxexO46S/7iXFYEgKEvOb+gnrF/4efdsqnvjjjYEkmGypUkRxTP1vgfVzlw==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/queue/-/queue-0.8.7.tgz", + "integrity": "sha512-5oHdkCdr91ETbuKBPcWnyUOiHVW47wWTDjg0kx5iAx3pz72Zr3xZKLLrjTmrL6Mzol6lqtptOT2R2aB7pzI9EA==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6" + "@wrnexus/core": "^0.8.7", + "@wrnexus/rpc": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/reactive": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/reactive/-/reactive-0.8.6.tgz", - "integrity": "sha512-tgzFwilkjsG8JawcTS99cuKSgD+ZiKD72KE5KGQmEBAzgP8NMYmmCdhTxTzeqKTwo1P7KKZi5MOFDnlu7LfdMw==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/reactive/-/reactive-0.8.7.tgz", + "integrity": "sha512-MUJ/DyIKPKElQpkJH9WDRMUfAfKc/qZm7S6op9Ld67UabKNb9Dfb1cXNqcm3K5U+3nP7hnox8oDljzqOhxnLww==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/realtime": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/realtime/-/realtime-0.8.6.tgz", - "integrity": "sha512-m3zlV67fcAGdkpVQxwwybbVy97gjsWscJn+Cz/xOQNJXPjPW1sL7VPCJYiujDgTKhoobSJT4nBVUMbdwqQ+4ew==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/realtime/-/realtime-0.8.7.tgz", + "integrity": "sha512-fuUBaVgUgS2NfhAJy0pLFBRH6h+SCJHaMqtTNiRIS/Ji2PvJ1KuxPawZ1oleNK54nxVItLP9kt3HLusGUC1fFw==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6", - "@wrnexus/plugin": "^0.8.6", - "@wrnexus/ui": "^0.8.6" + "@wrnexus/core": "^0.8.7", + "@wrnexus/plugin": "^0.8.7", + "@wrnexus/ui": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/router": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/router/-/router-0.8.6.tgz", - "integrity": "sha512-q8zB9jq7ZCptvX+9O84Be/hBpySkzCif6EqAVt0l75mDIjaHd3aK1SrdgXkQcKOi2KlU+4zP4iUc/f2pTyPryQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/router/-/router-0.8.7.tgz", + "integrity": "sha512-nJggyMU5W4k3brrq7lWkjnyhoahqsrwraiM0zWD5+ukD50X0uEu5NHyM4Tox5bVpFPUbg0V4lzi6xHl0yGuaBA==", "license": "MIT", "dependencies": { - "@wrnexus/compiler": "^0.8.6", - "@wrnexus/core": "^0.8.6" + "@wrnexus/compiler": "^0.8.7", + "@wrnexus/core": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/rpc": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/rpc/-/rpc-0.8.6.tgz", - "integrity": "sha512-nQWFHd7LPrerbWZQk8Nru0+1muQCRbMc8alvP041JRnUL+YlKFC9zG2lt4Ftux6pMGIFB8T2v1pVEzwgBQgqjg==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/rpc/-/rpc-0.8.7.tgz", + "integrity": "sha512-AVmFWHeaiio/tLq5B2iryR+TozyUOQdjktDjtx8Hqfl+oHkQNsoNizfFY8rbl7IGcCq3vt6N/9HDxtxqE2eNzg==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6", - "@wrnexus/helpers": "^0.8.6", - "@wrnexus/jwt": "^0.8.6", - "@wrnexus/validation": "^0.8.6" + "@wrnexus/core": "^0.8.7", + "@wrnexus/helpers": "^0.8.7", + "@wrnexus/jwt": "^0.8.7", + "@wrnexus/validation": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/security": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/security/-/security-0.8.6.tgz", - "integrity": "sha512-Yuld+0JZYzJSG41bcr63V81OyOuTzrkHWO1F7rauNeARalIuWJE5RsoiQFvaS7G9mBXM858QoIqUz5hUlfv9gg==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/security/-/security-0.8.7.tgz", + "integrity": "sha512-dDp5D7fFMUc8Fcep67EAokgWB2dIeGiDUeepgTDtgjy5lXYfuE0b7iAUJNJQL2KnJV1KOjxYgxeiC4Rd972C6Q==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6" + "@wrnexus/core": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/ssr": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/ssr/-/ssr-0.8.6.tgz", - "integrity": "sha512-YE1TrNRhJN5e0bIJLTSgBns/ggjwN7CgOXrQ8PZZ58FWjqxrMxVVG5/0rfcnlHo1mvm6I6+QWcI+11HCK1xW+g==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/ssr/-/ssr-0.8.7.tgz", + "integrity": "sha512-WwBSGfXzlakVrtUjqwVhpHA7KT76Ghj1jxQ6iUogxP/8NOhb65y4pKoaXyxR5mcV4iFgMbI65YajxK8VrTskcw==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6", - "@wrnexus/security": "^0.8.6", - "@wrnexus/store": "^0.8.6" + "@wrnexus/core": "^0.8.7", + "@wrnexus/security": "^0.8.7", + "@wrnexus/store": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/store": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/store/-/store-0.8.6.tgz", - "integrity": "sha512-aufLAYyFNx7U2b1c0hDDIUj9CxG79ENckVqAVV41Bl5GxmqizHEVnX5G8dNw1aBe0smuwWsqgN7ipTB91VftqA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/store/-/store-0.8.7.tgz", + "integrity": "sha512-whLCY/UzDsD/7AFw11XkHXDOmTbMfFGuN2Wyn5GgHexUJwPvZFTa+50chuIOKF80IyJPL3I+h7vLNYzhHqYFTg==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/styles": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/styles/-/styles-0.8.6.tgz", - "integrity": "sha512-d1uvrmC1yRuvdfW/Gao8jfJYw1FUD186Ndrm5zFfKGB3AelXxw+3a/CviVDdYF9MucgoPGhYXbDFlsn5gR4TpA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/styles/-/styles-0.8.7.tgz", + "integrity": "sha512-iHCegd15joSjmn6ODl6N8uYkYFps1xiQizy26qvDxwQlCp5JnO92SyJD+1CEj9pZO6et9Who0+VpNEeJ3HlMWA==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6", - "@wrnexus/plugin": "^0.8.6", - "@wrnexus/uploader": "^0.8.6" + "@wrnexus/core": "^0.8.7", + "@wrnexus/plugin": "^0.8.7", + "@wrnexus/uploader": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/syntax": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/syntax/-/syntax-0.8.6.tgz", - "integrity": "sha512-ODHB6mNba2W7dRCTb46NeqFByac3y1RuIUVTfhsMijoGRmN6YOfqsR2Qcchril8SIH3xolzdUqzbSJF/RCkuNw==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/syntax/-/syntax-0.8.7.tgz", + "integrity": "sha512-JyaRG8ZflAeZqF7Nb/21hs8m3jG5okYn0oC/Jmk1ARjiGvy4DbEog0dqrRehrU7S97kkj/yMO+or5oH6Yb53wg==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/test": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/test/-/test-0.8.6.tgz", - "integrity": "sha512-BKQT4636XgbnwTlJVBqHKaL1k+5diN5GStQbvz76LbSsnRDTWP4m8f//JFnUxL27r1/YXxSxsP2hIdWf5adKeg==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/test/-/test-0.8.7.tgz", + "integrity": "sha512-iNUPugWNa11+joNl5ULA2kA7EvjrMQSCWNv0xMVnnqipNqIgY/A5Puy0Ac29/tesUVQF/qQvIYReFp0uLFrOmw==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/tracking": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/tracking/-/tracking-0.8.6.tgz", - "integrity": "sha512-CHN+Xk5+F5L5wis8xUMLt9aQ7khvCdBQbCDFl4ELRgcbQHajzO45kBDUz5rV3XolYkzRRHrH7LNWqMArZ1kAlQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/tracking/-/tracking-0.8.7.tgz", + "integrity": "sha512-aP8kbVYpyKakJEb/zk1ZM5DOZsJiwuT75i1IPcKzCEBraeAJnSIp5ddnV9rG43VWV1pB2qMSlkGx6Y+NpdmR7A==", "license": "MIT", "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/typecheck": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/typecheck/-/typecheck-0.8.6.tgz", - "integrity": "sha512-j5uE6eK5AxurHhN4Aw9ngnKE5PUEQF93SywtGYMXw91chtdAH1Fx4u1xLewB7n4jLCXPCEg8blAs3GmNfNvMLw==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/typecheck/-/typecheck-0.8.7.tgz", + "integrity": "sha512-QxCVu/524W8oXjMQ8So/2FANZ4wRd6nbIrzdf/jHOc4HkFVwuqzDFBWvT+FlQQGqw2hCVfqsiEBeIMAxvzV26g==", "license": "MIT", "dependencies": { - "@wrnexus/syntax": "^0.8.6", + "@wrnexus/syntax": "^0.8.7", "typescript": "^5.5.0" }, "engines": { @@ -2070,40 +2075,40 @@ } }, "node_modules/@wrnexus/ui": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/ui/-/ui-0.8.6.tgz", - "integrity": "sha512-SFgbDQRZaY3chIAUxnlLqVOU/52hK/Ytpg5I6D8v1DqYX0W9rjGhF6kkJT1X+yu4/XGhj2dndsg7ik4tZYF3uA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/ui/-/ui-0.8.7.tgz", + "integrity": "sha512-BMw/kSM47K2TeqdmnMCStReu78a0PGMixRXz4FM2XEX0ofHo8yziNkZaNm3N5yj7ruaSurwZSIJnMFpKokJi+g==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6" + "@wrnexus/core": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/uploader": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/uploader/-/uploader-0.8.6.tgz", - "integrity": "sha512-z5fySfqpSXsikGyFMpOgOAydlIeK/N9ZbiHDfWEUMd9HwZO8PVLnZydLafN8L+uMKslbJVhLGB2zGH04L+7eAA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/uploader/-/uploader-0.8.7.tgz", + "integrity": "sha512-8UemIpR4hDrD75Kq8hYg6+fGpgvyaRBAGfQCyWgnK03cNTnWOvu8zETufHSIuPXv2qErhWsA8B/VWFLWn46m0A==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6", - "@wrnexus/plugin": "^0.8.6", - "@wrnexus/ui": "^0.8.6" + "@wrnexus/core": "^0.8.7", + "@wrnexus/plugin": "^0.8.7", + "@wrnexus/ui": "^0.8.7" }, "engines": { "bun": ">=1.3.0" } }, "node_modules/@wrnexus/validation": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@wrnexus/validation/-/validation-0.8.6.tgz", - "integrity": "sha512-BTbpjkg7A0d/bhjeg6veNK8weyn/1O3r+MOmxjDn4ESZhBCw/fxBQO6Mj1FhcOu4rs2hiS3TvNpd9B7UY/cMaA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/@wrnexus/validation/-/validation-0.8.7.tgz", + "integrity": "sha512-M/uNEJdj5BHPu3e+YTLsOQK9YzlHMiTSkuBxm12F434rR8Pccl/TIteOzag2ZEi+BSIxB1svLP/KPi88nZiqSw==", "license": "MIT", "dependencies": { - "@wrnexus/core": "^0.8.6", - "@wrnexus/plugin": "^0.8.6", - "@wrnexus/ui": "^0.8.6" + "@wrnexus/core": "^0.8.7", + "@wrnexus/plugin": "^0.8.7", + "@wrnexus/ui": "^0.8.7" }, "engines": { "bun": ">=1.3.0" diff --git a/package.json b/package.json index 070e6598..9b1e1123 100644 --- a/package.json +++ b/package.json @@ -27,59 +27,59 @@ "dependencies": { "@iconify-json/lucide": "^1.2.118", "@iconify/tailwind4": "^1.2.3", - "@wrnexus/ai": "^0.8.6", - "@wrnexus/authz": "^0.8.6", - "@wrnexus/compiler": "^0.8.6", - "@wrnexus/core": "^0.8.6", - "@wrnexus/csr": "^0.8.6", - "@wrnexus/db": "^0.8.6", - "@wrnexus/dev-server": "^0.8.6", - "@wrnexus/encryption": "^0.8.6", - "@wrnexus/helpers": "^0.8.6", - "@wrnexus/i18n": "^0.8.6", - "@wrnexus/jwt": "^0.8.6", - "@wrnexus/mobile": "^0.8.6", - "@wrnexus/native": "^0.8.6", - "@wrnexus/oauth": "^0.8.6", - "@wrnexus/pubsub": "^0.8.6", - "@wrnexus/queue": "^0.8.6", - "@wrnexus/reactive": "^0.8.6", - "@wrnexus/router": "^0.8.6", - "@wrnexus/ssr": "^0.8.6", - "@wrnexus/styles": "^0.8.6", - "@wrnexus/test": "^0.8.6", - "@wrnexus/tracking": "^0.8.6", - "@wrnexus/ui": "^0.8.6", - "@wrnexus/uploader": "^0.8.6", - "@wrnexus/validation": "^0.8.6", - "@wrnexus/dev-toolbar": "^0.8.6", - "@wrnexus/syntax": "^0.8.6", - "@wrnexus/plugin": "^0.8.6", - "@wrnexus/captcha": "^0.8.6", - "@wrnexus/auth": "^0.8.6", - "@wrnexus/store": "^0.8.6", - "@wrnexus/typecheck": "^0.8.6", - "@wrnexus/security": "^0.8.6", - "@wrnexus/cache": "^0.8.6", - "@wrnexus/image": "^0.8.6", - "@wrnexus/observability": "^0.8.6", - "@wrnexus/benchmark": "^0.8.6", - "@wrnexus/realtime": "^0.8.6", - "@wrnexus/content": "^0.8.6", - "@wrnexus/graphql": "^0.8.6", - "@wrnexus/identity": "^0.8.6", - "@wrnexus/language-server": "^0.8.6", - "@wrnexus/mcp": "^0.8.6", - "@wrnexus/playground": "^0.8.6", - "@wrnexus/pwa": "^0.8.6", - "@wrnexus/rpc": "^0.8.6" + "@wrnexus/ai": "^0.8.7", + "@wrnexus/authz": "^0.8.7", + "@wrnexus/compiler": "^0.8.7", + "@wrnexus/core": "^0.8.7", + "@wrnexus/csr": "^0.8.7", + "@wrnexus/db": "^0.8.7", + "@wrnexus/dev-server": "^0.8.7", + "@wrnexus/encryption": "^0.8.7", + "@wrnexus/helpers": "^0.8.7", + "@wrnexus/i18n": "^0.8.7", + "@wrnexus/jwt": "^0.8.7", + "@wrnexus/mobile": "^0.8.7", + "@wrnexus/native": "^0.8.7", + "@wrnexus/oauth": "^0.8.7", + "@wrnexus/pubsub": "^0.8.7", + "@wrnexus/queue": "^0.8.7", + "@wrnexus/reactive": "^0.8.7", + "@wrnexus/router": "^0.8.7", + "@wrnexus/ssr": "^0.8.7", + "@wrnexus/styles": "^0.8.7", + "@wrnexus/test": "^0.8.7", + "@wrnexus/tracking": "^0.8.7", + "@wrnexus/ui": "^0.8.7", + "@wrnexus/uploader": "^0.8.7", + "@wrnexus/validation": "^0.8.7", + "@wrnexus/dev-toolbar": "^0.8.7", + "@wrnexus/syntax": "^0.8.7", + "@wrnexus/plugin": "^0.8.7", + "@wrnexus/captcha": "^0.8.7", + "@wrnexus/auth": "^0.8.7", + "@wrnexus/store": "^0.8.7", + "@wrnexus/typecheck": "^0.8.7", + "@wrnexus/security": "^0.8.7", + "@wrnexus/cache": "^0.8.7", + "@wrnexus/image": "^0.8.7", + "@wrnexus/observability": "^0.8.7", + "@wrnexus/benchmark": "^0.8.7", + "@wrnexus/realtime": "^0.8.7", + "@wrnexus/content": "^0.8.7", + "@wrnexus/graphql": "^0.8.7", + "@wrnexus/identity": "^0.8.7", + "@wrnexus/language-server": "^0.8.7", + "@wrnexus/mcp": "^0.8.7", + "@wrnexus/playground": "^0.8.7", + "@wrnexus/pwa": "^0.8.7", + "@wrnexus/rpc": "^0.8.7" }, "devDependencies": { "@eslint/js": "^9.0.0", "@tailwindcss/cli": "^4.0.0", "@types/bun": "latest", "@types/node": "^26.1.1", - "@wrnexus/cli": "^0.8.6", + "@wrnexus/cli": "^0.8.7", "eslint": "^9.0.0", "prettier": "latest", "tailwindcss": "^4.0.0", @@ -87,6 +87,6 @@ "typescript-eslint": "latest" }, "wrnexus": { - "version": "0.8.6" + "version": "0.8.7" } } diff --git a/public/docs-index.json b/public/docs-index.json index ae36fca8..011539ae 100644 --- a/public/docs-index.json +++ b/public/docs-index.json @@ -1,5 +1,5 @@ { - "version": "0.8.6", + "version": "0.8.7", "status": "private-developer-preview", "generatedAt": "2026-07-13", "documents": [ @@ -7,623 +7,623 @@ "url": "/", "title": "WRNexusJS", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/access", "title": "access", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/getting-started", "title": "getting started", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/tutorial", "title": "tutorial", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/architecture", "title": "architecture", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/language", "title": "language", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages", "title": "packages", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/project-structure", "title": "project structure", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/routing", "title": "routing", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/pages-and-components", "title": "pages and components", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/server-data", "title": "server data", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/api-routes", "title": "api routes", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/middleware", "title": "middleware", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/forms-and-validation", "title": "forms and validation", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/authentication", "title": "authentication", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/authorization", "title": "authorization", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/security", "title": "security", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/database", "title": "database", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/uploads", "title": "uploads", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/realtime", "title": "realtime", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/pubsub", "title": "pubsub", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/queues", "title": "queues", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "experimental" }, { "url": "/guides/testing", "title": "testing", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/workspaces-and-gateway", "title": "workspaces and gateway", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/deployment", "title": "deployment", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/configuration-and-profiles", "title": "configuration and profiles", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/i18n-and-themes", "title": "i18n and themes", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/mobile", "title": "mobile", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "experimental" }, { "url": "/guides/observability", "title": "observability", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/upgrading", "title": "upgrading", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/guides/troubleshooting", "title": "troubleshooting", "section": "guide", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/examples", "title": "examples", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/showcase", "title": "showcase", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/benchmarks", "title": "benchmarks", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/roadmap", "title": "roadmap", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/changelog", "title": "changelog", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { - "url": "/releases/0.8.6", - "title": "0.8.6", + "url": "/releases/0.8.7", + "title": "0.8.7", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/security", "title": "security", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/support", "title": "support", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/license", "title": "license", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/search", "title": "search", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/404", "title": "404", "section": "portal", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/ai", "title": "ai", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/auth", "title": "auth", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/authz", "title": "authz", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/benchmark", "title": "benchmark", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/cache", "title": "cache", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/captcha", "title": "captcha", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/cli", "title": "cli", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/compiler", "title": "compiler", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/content", "title": "content", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/core", "title": "core", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/csr", "title": "csr", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/db", "title": "db", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/dev-server", "title": "dev server", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/dev-toolbar", "title": "dev toolbar", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/encryption", "title": "encryption", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/graphql", "title": "graphql", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/helpers", "title": "helpers", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/i18n", "title": "i18n", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/identity", "title": "identity", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/image", "title": "image", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/jwt", "title": "jwt", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/language-server", "title": "language server", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/mcp", "title": "mcp", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/mobile", "title": "mobile", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "experimental" }, { "url": "/packages/native", "title": "native", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/oauth", "title": "oauth", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/observability", "title": "observability", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/playground", "title": "playground", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/plugin", "title": "plugin", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/pubsub", "title": "pubsub", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/pwa", "title": "pwa", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/queue", "title": "queue", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/reactive", "title": "reactive", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/realtime", "title": "realtime", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/router", "title": "router", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/rpc", "title": "rpc", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/security", "title": "security", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/ssr", "title": "ssr", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/store", "title": "store", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/styles", "title": "styles", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/syntax", "title": "syntax", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/test", "title": "test", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/tracking", "title": "tracking", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/typecheck", "title": "typecheck", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/ui", "title": "ui", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/uploader", "title": "uploader", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" }, { "url": "/packages/validation", "title": "validation", "section": "package", - "version": "0.8.6", + "version": "0.8.7", "stability": "preview" } ] diff --git a/public/llms-full.txt b/public/llms-full.txt index 83052806..8f8cc667 100644 --- a/public/llms-full.txt +++ b/public/llms-full.txt @@ -1,4 +1,4 @@ -# WRNexusJS documentation 0.8.6 +# WRNexusJS documentation 0.8.7 Status: Private Developer Preview. This site documents 47 release-aligned packages. @@ -279,7 +279,7 @@ wrnexus eject # copy a Wire UI component's .wrn into app/compone 4. Style with Tailwind utility classes in the view, or theme tokens (`var(--wire-*)`), or `style { }`. 5. Never emit React/JSX, a manual router, or client-side island JS — the framework handles hydration. -Release: WRNexusJS 0.8.6 +Release: WRNexusJS 0.8.7 # Canonical documentation locations @@ -288,7 +288,7 @@ Release: WRNexusJS 0.8.6 # Installed package documentation -The following README files and declarations come from the installed private 0.8.6 release. +The following README files and declarations come from the installed private 0.8.7 release. ## @wrnexus/ai @@ -896,7 +896,7 @@ export { A as AUTH_SECURITY_EVENT_TYPES, a as AuthAccountStatus, b as AuthClock, export { MemoryAuthStore } from './stores/memory.js'; export { SqlAuthStore } from './stores/sql.js'; export { AUTH_SESSION_KEY, authSession, clearAuthSession, establishAuthSession, getAuthSession, getAuthUser, isAuthenticatedContext, requireAuth } from './middleware.js'; -export { A as AuthHttpOptions, a as AuthPasskeyHttpOptions, b as AuthSchemaOverrides, c as AuthSchemaSet, d as authBrowserSchemaDescriptors, e as authBrowserSchemaMap, f as authSchemas, g as authenticatorConfirmSchema, h as authenticatorDisableSchema, i as authenticatorSetupSchema, j as changePasswordSchema, k as createAuthHttpHandlers, l as emptyActionSchema, m as impersonationStartSchema, n as invitationAcceptSchema, o as loginSchema, p as magicLinkConsumeSchema, q as magicLinkRequestSchema, r as mfaOtpRequestSchema, s as mfaSchema, t as otpIssueSchema, u as otpLoginCompleteSchema, v as otpLoginRequestSchema, w as otpSchema, x as passkeyAuthenticationOptionsSchema, y as passkeyAuthenticationVerifySchema, z as passkeyRegistrationOptionsSchema, B as passkeyRegistrationVerifySchema, C as passwordResetRequestSchema, D as passwordResetSchema, E as recoveryCodesSchema, F as registerSchema, G as resolveAuthSchemas, H as sessionRevokeSchema, I as signUpSchema, J as verificationRequestSchema, K as verificationTokenSchema } from './index-B4uaD0Z3.js'; +export { A as AuthHttpOptions, a as AuthPasskeyHttpOptions, b as AuthSchemaOverrides, c as AuthSchemaSet, d as authBrowserSchemaDescriptors, e as authBrowserSchemaMap, f as authSchemas, g as authenticatorConfirmSchema, h as authenticatorDisableSchema, i as authenticatorSetupSchema, j as changePasswordSchema, k as createAuthHttpHandlers, l as emptyActionSchema, m as impersonationStartSchema, n as invitationAcceptSchema, o as loginSchema, p as magicLinkConsumeSchema, q as magicLinkRequestSchema, r as mfaOtpRequestSchema, s as mfaSchema, t as otpIssueSchema, u as otpLoginCompleteSchema, v as otpLoginRequestSchema, w as otpSchema, x as passkeyAuthenticationOptionsSchema, y as passkeyAuthenticationVerifySchema, z as passkeyRegistrationOptionsSchema, B as passkeyRegistrationVerifySchema, C as passwordResetRequestSchema, D as passwordResetSchema, E as recoveryCodesSchema, F as registerSchema, G as resolveAuthSchemas, H as sessionRevokeSchema, I as signUpSchema, J as verificationRequestSchema, K as verificationTokenSchema } from './index-CSXo5T-F.js'; export { AuthAuditIssue, AuthConfig, AuthPluginOptions, AuthRoutesConfig, authComponentsDir, authPlugin } from './plugin.js'; export { DefaultAuthRouteOptions, clearDefaultAuthEngine, getDefaultAuthEngine, getDefaultAuthRouteOptions, getDefaultAuthSchemas, hasDefaultAuthEngine, setDefaultAuthEngine, setDefaultAuthRouteOptions, setDefaultAuthSchemas, tryGetDefaultAuthEngine } from './runtime.js'; export { createAuthSecretProtector } from './protector.js'; @@ -2834,6 +2834,7 @@ A file opens with `page ` or `component ` followed by a `{ ... }` bo - `@event name = function` inside `props` — declares a public component event. Emit it from component behavior with `name(detail)` or `$emit("name", detail)`, and consume it with ``. - `state : Type = ` — typed reactive state seeded from a raw JS expression, including native array and object literals. The annotation is optional for backward compatibility. - `view { }` — plain HTML with `{expr}` interpolation in text and attributes, JSX-style component props such as `items={items}`, `items={[...]}`, and `options={{...}}`, hyphenated attributes, boolean attributes, `@event="..."` client bindings, and ``. Structured component props are serialized safely for SSR; expressions that reference `state` retain their initial value and update reactively in the browser. +- Client functions automatically commit state changed by `setTimeout` callbacks. For other deferred callbacks (observers, third-party APIs, or detached promise callbacks), call the injected `commit()` function after changing local state; returning/awaiting a promise also commits through the normal function boundary. - `seo { key = "value" ... }` — metadata merged into the generated `meta`. - `style { }` — inlined page/component stylesheet (repeatable). - `functions { }` — helpers with typed parameters and return values. Types remain in server output and are safely erased from browser behavior code. @@ -5315,14 +5316,16 @@ interface WrnexusBrowserGlobals { */ /** The reactive runtime served at `/__wrnexus/reactive.js` (plain browser JS). */ -declare function getReactiveRuntime(): string; +declare function getReactiveRuntime(development?: boolean): string; +/** Component-specific controllers, loaded only when their marker is present. */ +declare function getComponentControllerRuntime(development?: boolean): string; /** The client-side navigation runtime served at `/__wrnexus/nav.js`. */ declare function getNavRuntime(): string; /** The realtime client runtime served at `/__wrnexus/realtime.js`. */ declare function getRealtimeRuntime(): string; declare function getActionRuntime(): string; -export { ACTION_RUNTIME, ActionClientError, type ActionClientOptions, type ActionResult, type ClientModuleScope, type HydrationScopeApi, NAV_RUNTIME, type OutputHandler, type OutputHost, REACTIVE_RUNTIME, REALTIME_RUNTIME, type ServerCallOptions, WrnServerCallError, type WrnexusBrowserGlobals, callServerFunction, collectRefs, createActionClient, createOutputProxy, createServerProxy, getActionRuntime, getNavRuntime, getReactiveRuntime, getRealtimeRuntime, invalidateClientModule, invokeOutput, loadClientFunctions, registerOutputHandler }; +export { ACTION_RUNTIME, ActionClientError, type ActionClientOptions, type ActionResult, type ClientModuleScope, type HydrationScopeApi, NAV_RUNTIME, type OutputHandler, type OutputHost, REACTIVE_RUNTIME, REALTIME_RUNTIME, type ServerCallOptions, WrnServerCallError, type WrnexusBrowserGlobals, callServerFunction, collectRefs, createActionClient, createOutputProxy, createServerProxy, getActionRuntime, getComponentControllerRuntime, getNavRuntime, getReactiveRuntime, getRealtimeRuntime, invalidateClientModule, invokeOutput, loadClientFunctions, registerOutputHandler }; ``` --- @@ -6393,6 +6396,7 @@ interface RuntimeDeps { hasFrameworkStyles?: boolean; /** App stylesheet already contains theme + UI CSS and is the only CSS request needed. */ stylesIncludeFramework?: boolean; + stylesIncludeUi?: boolean; /** Resolved theme config: enables `/__wrnexus/theme.css` + ``. */ theme?: ResolvedTheme; /** Resolved i18n bundle: enables `ctx.t`, ``, and `{t:key}` markers. */ @@ -6620,12 +6624,18 @@ interface ProdOptions { inlineStyles?: string; /** `stylesPath` contains theme + UI + app CSS in cascade order. */ stylesIncludeFramework?: boolean; + /** `stylesPath` already contains the shared Wire UI stylesheet. */ + stylesIncludeUi?: boolean; /** Absolute path to the pre-built reactive runtime. */ reactivePath?: string; + /** Absolute path to the on-demand component controller runtime. */ + controllersPath?: string; /** Absolute directory containing bundled per-WRN browser modules. */ clientModulesDir?: string; /** Absolute path to the pre-built theme stylesheet (`theme.css`). */ themePath?: string; + /** Pre-built active theme/accent stylesheets, loaded on demand. */ + themeAssetsDir?: string; /** Absolute path to the pre-built theme runtime (`theme.js`). */ themeJsPath?: string; /** Resolved theme config: enables `` + `theme.css` link. */ @@ -9357,7 +9367,7 @@ registered dependency is down. Dependency messages and details are hidden unless export { MetricLabels, MetricPoint, MetricsRegistry } from './metrics.js'; export { MetricExporter, MetricsMiddlewareOptions, WebVitalRecord, WebVitalsHandlerOptions, createHttpMetricExporter, createOtlpMetricExporter, createWebVitalsHandler, defaultMetrics, metricsMiddleware } from './server.js'; export { WebVitalsClientOptions, webVitalsClient } from './client.js'; -export { SpanExporter, SpanRecord, TraceContext, TraceMiddlewareOptions, createOtlpTraceExporter, formatTraceparent, parseTraceparent, traceMiddleware } from './trace.js'; +export { S as SpanExporter, a as SpanRecord, T as TraceContext, b as TraceMiddlewareOptions, c as createOtlpTraceExporter, f as formatTraceparent, p as parseTraceparent, t as traceMiddleware } from './trace-CvRlPzhE.js'; export { HealthHandlerOptions, createLivenessHandler, createReadinessHandler } from './health.js'; export { LogLevel, LogRecord, StructuredLogger, StructuredLoggerOptions, createStructuredLogger } from './logging.js'; export { ErrorReporter, FrameworkSpanKind, LogExporter, OperationTracer, createJaegerExporter, createOperationTracer, createOtlpLogExporter, createPerformanceProfiler, createPrometheusPushExporter, createSentryCompatibleReporter, createZipkinExporter, renderPrometheus } from './integrations.js'; @@ -9669,6 +9679,9 @@ await bus.close(); ### Exported TypeScript declarations ```ts +import { Context } from '@wrnexus/core'; +import { SubjectContext } from '@wrnexus/rpc'; + interface MessageEnvelope { id: string; topic: string; @@ -9699,6 +9712,16 @@ declare class PresenceChannel { prune(): number; } +interface SubjectPubSub { + publish(ctx: Context, topic: string, message: T): Promise; + subscribe(pattern: string, handler: (message: T, topic: string, subject?: SubjectContext) => void | Promise): () => void; +} +/** + * Authenticated pub/sub envelope. The token uses a fixed, purpose-specific + * audience; subscribers verify it before exposing the message to a handler. + */ +declare function subjectPubSub(bus: PubSub): SubjectPubSub; + /** * @wrnexus/pubsub — topic-based publish/subscribe with a pluggable driver. * The default is in-process; swap in a Redis/NATS driver for cross-instance @@ -9741,7 +9764,7 @@ interface KafkaClient { /** Kafka adapter contract; consumer-group/rebalance policy remains owned by the selected client. */ declare function kafkaDriver(client: KafkaClient): PubSubDriver; -export { type Handler, type KafkaClient, type MessageEnvelope, type NatsClient, PresenceChannel, type PresenceMember, type PubSub, type PubSubDriver, type ResilientPubSubOptions, createPubSub, createResilientPubSub, kafkaDriver, memoryDriver, natsDriver }; +export { type Handler, type KafkaClient, type MessageEnvelope, type NatsClient, PresenceChannel, type PresenceMember, type PubSub, type PubSubDriver, type ResilientPubSubOptions, type SubjectPubSub, createPubSub, createResilientPubSub, kafkaDriver, memoryDriver, natsDriver, subjectPubSub }; ``` --- @@ -10142,7 +10165,8 @@ Use `memoryWorkflowStore()` for tests. Production stores implement the small `ge ### Exported TypeScript declarations ```ts -import { ExecutionContext } from '@wrnexus/core'; +import { ExecutionContext, Context } from '@wrnexus/core'; +import { SubjectContext } from '@wrnexus/rpc'; /** * Persistence contract for the durable queue. @@ -10301,6 +10325,24 @@ interface WorkflowEngine { declare function createWorkflowEngine(store?: WorkflowStore): WorkflowEngine; declare function defineDurableWorkflow(definition: WorkflowDefinition): WorkflowDefinition; +interface SubjectEnvelope { + payload: T; + identity?: string; +} +interface SubjectJob extends Omit>, "data"> { + data: T; + subject?: SubjectContext; +} +interface SubjectQueue { + add(ctx: Context, name: string, data: T, options?: AddOptions): Promise>>; + process(name: string, handler: (job: SubjectJob, context: { + signal: AbortSignal; + }) => void | Promise): void; +} +/** Queue adapter that persists a signed end-user context alongside job data. */ +/** Works with both the in-memory Queue and createDurableQueue(). */ +declare function subjectQueue(queue: Queue | DurableQueue): SubjectQueue; + /** * @wrnexus/queue — a background job queue with delays, retries + backoff, and * concurrent workers. The default store is in-process; a pluggable driver lets @@ -10398,7 +10440,7 @@ declare function defineWorkflow(name: string, steps: Array; } +interface RetryTransportOptions { + /** Retries after the initial attempt. Default: 2. */ + retries?: number; + /** Initial exponential-backoff delay in milliseconds. Default: 50. */ + backoffMs?: number; + /** Consecutive retryable failures before the target circuit opens. Default: 3. */ + circuitFailureThreshold?: number; + /** How long an open circuit rejects calls before one probe is allowed. Default: 5s. */ + circuitCooldownMs?: number; + now?: () => number; + sleep?: (ms: number, signal?: AbortSignal) => Promise; +} +/** + * Add bounded retry and a per-procedure circuit breaker to any transport. + * The idempotency bit comes from the contract and is not caller-controlled. + */ +declare function retryingTransport(base: Transport, options?: RetryTransportOptions): Transport; type InProcessHandler = (payload: unknown, identity?: string) => Promise | ServiceResult; /** Direct transport for tests and local integration harnesses. */ declare function inProcessTransport(handlers: Record): Transport; @@ -11541,7 +11602,59 @@ interface HttpTransportOptions { } declare function httpTransport(options?: HttpTransportOptions): Transport; -export { type AnyProcedures, type CallOptions, type ExportOptions, type HandlerContext, type HttpTransportOptions, type ImplementOptions, type ImportOptions, type InProcessHandler, type InferInput, type InferProcedureInput, type InferProcedureOutput, type InputSchema, ProcedureBuilder, type ProcedureDef, RPC_ERROR_CODES, RPC_IDENTITY_HEADER, RPC_INTERNAL_HEADER, RPC_PATH_PREFIX, type RpcErrorCode, type RpcTarget, type ServiceClient, type ServiceClientOptions, type ServiceContract, ServiceError, type ServiceHandlers, type ServiceImplementation, type ServiceResult, type SubjectContext, type ToResultOptions, type Transport, defineService, exportSubjectContext, failure, httpTransport, implement, importSubjectContext, inProcessTransport, isRetryableStatus, procedure, resolveAppOrigin, rpcPath, rpcSecret, serviceClient, success }; +declare const RPC_STREAM_PATH_PREFIX = "/__wrnexus/rpc-stream"; +declare function rpcStreamPath(service: string, procedure: string): string; +interface StreamImplementation { + contract: ServiceContract; + stream(procedure: string, payload: unknown, identity?: string): AsyncIterable; + streamOptions: Required>; + metrics: StreamMetrics; +} +type StreamHandlers = { + [K in keyof Procedures]: (input: InferProcedureInput, ctx: { + subject?: SubjectContext; + }) => AsyncIterable>; +}; +interface StreamImplementOptions { + selfApp: string; + checkPermission?: (permission: string, subject?: SubjectContext) => Promise | boolean; + /** Maximum serialized SSE data frame. Default: 64 KiB. */ + maxFrameBytes?: number; + /** Emit an SSE comment while idle. Default: 15 seconds. */ + heartbeatMs?: number; +} +interface StreamMetricsSnapshot { + started: number; + completed: number; + failed: number; + active: number; +} +declare class StreamMetrics { + private started; + private completed; + private failed; + private active; + begin(): void; + complete(): void; + fail(): void; + snapshot(): StreamMetricsSnapshot; +} +/** Define an authenticated, validated stream endpoint. */ +declare function implementStream(contract: ServiceContract, handlers: StreamHandlers, options: StreamImplementOptions): StreamImplementation; +interface StreamClientOptions { + app?: string; + as?: Context; + fetch?: typeof fetch; + signal?: AbortSignal; + /** Reject oversized server frames before parsing. Default: 64 KiB. */ + maxFrameBytes?: number; +} +type StreamClient = { + [K in keyof Procedures]: (input: InferProcedureInput) => AsyncIterable>; +}; +declare function streamClient(contract: ServiceContract, options?: StreamClientOptions): StreamClient; + +export { type AnyProcedures, type CallOptions, type ExportOptions, type HandlerContext, type HttpTransportOptions, type ImplementOptions, type ImportOptions, type InProcessHandler, type InferInput, type InferProcedureInput, type InferProcedureOutput, type InputSchema, ProcedureBuilder, type ProcedureDef, RPC_ERROR_CODES, RPC_IDENTITY_HEADER, RPC_INTERNAL_HEADER, RPC_PATH_PREFIX, RPC_STREAM_PATH_PREFIX, type RetryTransportOptions, type RpcErrorCode, type RpcTarget, type ServiceClient, type ServiceClientOptions, type ServiceContract, ServiceError, type ServiceHandlers, type ServiceImplementation, type ServiceResult, type StreamClient, type StreamClientOptions, type StreamHandlers, type StreamImplementOptions, type StreamImplementation, StreamMetrics, type StreamMetricsSnapshot, type SubjectContext, type ToResultOptions, type Transport, defineService, exportSubjectContext, failure, httpTransport, implement, implementStream, importSubjectContext, inProcessTransport, isRetryableStatus, procedure, resolveAppOrigin, retryingTransport, rpcPath, rpcSecret, rpcStreamPath, serviceClient, streamClient, success }; ``` --- @@ -12246,6 +12359,7 @@ interface ResolvedTheme { declare const THEME_COOKIE = "wire-theme"; declare const ACCENT_COOKIE = "wire-accent"; declare const THEME_CSS_HREF = "/__wrnexus/theme.css"; +declare const THEME_CSS_PREFIX = "/__wrnexus/theme/"; declare const THEME_JS_HREF = "/__wrnexus/theme.js"; /** * Single source of truth for both configured palettes and runtime accents. @@ -12260,6 +12374,10 @@ declare function resolveThemeConfig(config?: ThemeConfig): ResolvedTheme; declare function resolveThemeName(cookieValue: string | undefined, theme: ResolvedTheme): string; /** Pick a valid accent name from a cookie value, falling back to the configured default. */ declare function resolveAccentName(cookieValue: string | undefined, theme: ResolvedTheme): ThemePaletteName | undefined; +/** URL for the small stylesheet containing only one active theme/accent pair. */ +declare function activeThemeCssHref(themeName: string, accentName?: string): string; +/** Render only the tokens needed for the current SSR-selected theme and accent. */ +declare function renderActiveThemeCss(theme: ResolvedTheme, themeName: string, accentName?: string): string; /** * Generate the theme stylesheet. * @@ -12807,7 +12925,7 @@ declare function auditCssPerformance(source: string): CssPerformanceAuditIssue[] */ declare function renderStyles(ctx: StyleProcessContext, styles?: StylesConfig): Promise; -export { ACCENT_COOKIE, type AppConfig, type BuildConfig, CURRENT_COMPATIBILITY_DATE, CURRENT_FRAMEWORK_BEHAVIOUR, type CompatibilityPolicy, type CompatibilityReport, type ConfigIssue, type ContrastResult, type CssPerformanceAuditIssue, type CssTokenAudit, type CustomThemePalette, DEFAULT_THEMES, type DevToolbarConfig, type ExperimentalConfig, type ExplainedConfig, type FontConfig, type FontDisplay, type GoogleFont, type LocalFontFace, type MobileConfig, type Mode, type NavigationConfig, type ObservabilityConfig, type PerformanceConfig, type PwaConfig, type ResolvedConfigLayers, type ResolvedTheme, type StyleProcessContext, type StyleSource, type StylesConfig, type Mode as StylesMode, THEME_COOKIE, THEME_CSS_HREF, THEME_JS_HREF, THEME_PALETTES, THEME_PALETTE_NAMES, type TenancyConfig, type ThemeAccentConfig, type ThemeConfig, type ThemePaletteName, type ThemeSemanticColor, type ThemeToken, type ThemeTokens, auditCssPerformance, auditWireTokens, bundleCss, contrast, defineConfig, defineThemeTokens, explainAppConfig, findStyleEntry, fontCspSources, headToString, isCompatibilityDate, loadAppConfig, loadEnv, loadRawConfig, normalizeStyleSources, renderFontHead, renderProductionFontHead, renderStyles, renderThemeCss, renderThemeRuntime, resolveAccentName, resolveCompatibility, resolveConfigLayers, resolveProfile, resolveThemeConfig, resolveThemeName, tailwindSourceDirectives, themeVar, validateAppConfig }; +export { ACCENT_COOKIE, type AppConfig, type BuildConfig, CURRENT_COMPATIBILITY_DATE, CURRENT_FRAMEWORK_BEHAVIOUR, type CompatibilityPolicy, type CompatibilityReport, type ConfigIssue, type ContrastResult, type CssPerformanceAuditIssue, type CssTokenAudit, type CustomThemePalette, DEFAULT_THEMES, type DevToolbarConfig, type ExperimentalConfig, type ExplainedConfig, type FontConfig, type FontDisplay, type GoogleFont, type LocalFontFace, type MobileConfig, type Mode, type NavigationConfig, type ObservabilityConfig, type PerformanceConfig, type PwaConfig, type ResolvedConfigLayers, type ResolvedTheme, type StyleProcessContext, type StyleSource, type StylesConfig, type Mode as StylesMode, THEME_COOKIE, THEME_CSS_HREF, THEME_CSS_PREFIX, THEME_JS_HREF, THEME_PALETTES, THEME_PALETTE_NAMES, type TenancyConfig, type ThemeAccentConfig, type ThemeConfig, type ThemePaletteName, type ThemeSemanticColor, type ThemeToken, type ThemeTokens, activeThemeCssHref, auditCssPerformance, auditWireTokens, bundleCss, contrast, defineConfig, defineThemeTokens, explainAppConfig, findStyleEntry, fontCspSources, headToString, isCompatibilityDate, loadAppConfig, loadEnv, loadRawConfig, normalizeStyleSources, renderActiveThemeCss, renderFontHead, renderProductionFontHead, renderStyles, renderThemeCss, renderThemeRuntime, resolveAccentName, resolveCompatibility, resolveConfigLayers, resolveProfile, resolveThemeConfig, resolveThemeName, tailwindSourceDirectives, themeVar, validateAppConfig }; ``` --- @@ -13567,16 +13685,12 @@ are `.wrn` files rendered server-side. The framework serves this stylesheet once at `/__wrnexus/ui.css`, so pages get all component styles from a single request. -### Tailwind and motion +### Component styles and motion -Components use static Tailwind utility classes alongside the shared `.wire-*` -layer. If the package is consumed by a separate Tailwind build, include its -component sources so every utility is generated: - -```css -@import "tailwindcss"; -@source "../node_modules/@wrnexus/ui/components/*.wrn"; -``` +Components own their BEM styles in local `style {}` blocks and do not require a +Tailwind scan. `ui.css` supplies only global tokens, resets, and shared +primitives. Applications can still use Tailwind independently in their own +source files. The shared stylesheet gives all component boundaries consistent, GPU-friendly entry and interaction motion. Override `--wire-motion-fast`, @@ -14068,7 +14182,7 @@ declare function serveStoredFile(pathname: string): Promise; * backticks and no ${...}, so it embeds safely in the exported template string. */ declare const UPLOAD_JS_HREF = "/__wrnexus/uploader.js"; -declare const UPLOAD_RUNTIME = "\n(function () {\n if (typeof document === \"undefined\") return;\n var CSRF_COOKIE = \"wire-csrf\";\n\n var CSS =\n \".wire-uploader{display:block}\" +\n \".wire-uploader-zone{display:flex;align-items:center;justify-content:center;text-align:center;\" +\n \"min-height:8rem;padding:1.25rem;border:2px dashed var(--wire-border,#cbd5e1);border-radius:12px;\" +\n \"background:var(--wire-surface,transparent);color:var(--wire-muted,#64748b);cursor:pointer;\" +\n \"transition:border-color .15s ease,background-color .15s ease;position:relative}\" +\n \".wire-uploader-zone:hover,.wire-uploader-zone:focus-visible{border-color:var(--wire-brand,#3f7dff);outline:none}\" +\n \".wire-uploader-zone.is-drag{border-color:var(--wire-brand,#3f7dff);background:color-mix(in oklab,var(--wire-brand,#3f7dff) 8%,transparent)}\" +\n \".wire-uploader-prompt{font-size:.9rem;pointer-events:none}\" +\n \".wire-uploader-input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}\" +\n \".wire-uploader-list{list-style:none;margin:.75rem 0 0;padding:0;display:flex;flex-direction:column;gap:.5rem}\" +\n \".wire-uploader-item{display:grid;grid-template-columns:1fr auto;gap:.15rem .75rem;align-items:center;\" +\n \"font-size:.82rem;padding:.5rem .7rem;border:1px solid var(--wire-border,#e2e8f0);border-radius:8px}\" +\n \".wire-uploader-name{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--wire-text,#0f172a)}\" +\n \".wire-uploader-meta{color:var(--wire-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n \".wire-uploader-bar{grid-column:1/-1;height:5px;border-radius:999px;background:var(--wire-border,#e2e8f0);overflow:hidden}\" +\n \".wire-uploader-fill{height:100%;width:0;border-radius:999px;background:var(--wire-brand,#3f7dff);transition:width .15s ease}\" +\n \".wire-uploader-status{grid-column:1/-1;font-size:.75rem;color:var(--wire-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n \".wire-uploader-item.is-done .wire-uploader-fill{background:var(--wire-success,#16a34a)}\" +\n \".wire-uploader-item.is-done .wire-uploader-status{color:var(--wire-success,#16a34a)}\" +\n \".wire-uploader-item.is-error .wire-uploader-fill{background:var(--wire-danger,#dc2626)}\" +\n \".wire-uploader-item.is-error .wire-uploader-status{color:var(--wire-danger,#dc2626)}\";\n\n function injectCss() {\n if (document.getElementById(\"wire-uploader-css\")) return;\n var s = document.createElement(\"style\");\n s.id = \"wire-uploader-css\";\n s.textContent = CSS;\n document.head.appendChild(s);\n }\n\n function cookie(name) {\n var m = document.cookie.match(new RegExp(\"(?:^|; )\" + name + \"=([^;]*)\"));\n return m ? decodeURIComponent(m[1]) : \"\";\n }\n function el(tag, cls, text) {\n var e = document.createElement(tag);\n if (cls) e.className = cls;\n if (text != null) e.textContent = text;\n return e;\n }\n function fmt(n) {\n if (n < 1024) return n + \" B\";\n if (n < 1048576) return (n / 1024).toFixed(1) + \" KB\";\n return (n / 1048576).toFixed(1) + \" MB\";\n }\n function accepts(accept, file) {\n var list = (accept || \"\").split(\",\").map(function (s) { return s.trim().toLowerCase(); }).filter(Boolean);\n if (!list.length) return true;\n var type = (file.type || \"\").toLowerCase();\n var name = (file.name || \"\").toLowerCase();\n var ext = name.indexOf(\".\") >= 0 ? name.slice(name.lastIndexOf(\".\")) : \"\";\n return list.some(function (rule) {\n if (rule.charAt(0) === \".\") return rule === ext;\n if (rule.slice(-2) === \"/*\") return type.indexOf(rule.slice(0, -1)) === 0;\n return rule === type;\n });\n }\n\n function setup(root) {\n if (root.__wrnexusUploader) return;\n root.__wrnexusUploader = true;\n\n var endpoint = root.getAttribute(\"data-endpoint\") || \"/api/upload\";\n var multipleAttr = root.getAttribute(\"data-multiple\");\n var multiple = root.hasAttribute(\"data-multiple\") && multipleAttr !== \"false\";\n var accept = root.getAttribute(\"data-accept\") || \"\";\n var maxBytes = parseInt(root.getAttribute(\"data-max\") || \"0\", 10) || 0;\n var field = root.getAttribute(\"data-field\") || (multiple ? \"files\" : \"file\");\n var invalidate = String(root.getAttribute(\"data-invalidate\") || \"\")\n .split(\",\")\n .map(function (tag) { return tag.trim(); })\n .filter(Boolean);\n var promptText = root.getAttribute(\"data-label\") || \"Drag files here or click to browse\";\n\n root.classList.add(\"wire-uploader\");\n var zone = el(\"div\", \"wire-uploader-zone\");\n zone.setAttribute(\"role\", \"button\");\n zone.setAttribute(\"tabindex\", \"0\");\n zone.appendChild(el(\"div\", \"wire-uploader-prompt\", promptText));\n var input = document.createElement(\"input\");\n input.type = \"file\";\n input.className = \"wire-uploader-input\";\n if (multiple) input.multiple = true;\n if (accept) input.accept = accept;\n zone.appendChild(input);\n var listEl = el(\"ul\", \"wire-uploader-list\");\n root.appendChild(zone);\n root.appendChild(listEl);\n\n zone.addEventListener(\"keydown\", function (e) {\n if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); input.click(); }\n });\n [\"dragenter\", \"dragover\"].forEach(function (ev) {\n zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.add(\"is-drag\"); });\n });\n [\"dragleave\", \"drop\"].forEach(function (ev) {\n zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.remove(\"is-drag\"); });\n });\n zone.addEventListener(\"drop\", function (e) {\n if (e.dataTransfer && e.dataTransfer.files) handle(e.dataTransfer.files);\n });\n input.addEventListener(\"change\", function () {\n if (input.files) handle(input.files);\n input.value = \"\";\n });\n\n function handle(files) {\n var arr = Array.prototype.slice.call(files);\n if (!multiple) arr = arr.slice(0, 1);\n arr.forEach(uploadOne);\n }\n\n function row(file) {\n var li = el(\"li\", \"wire-uploader-item\");\n li.appendChild(el(\"span\", \"wire-uploader-name\", file.name));\n li.appendChild(el(\"span\", \"wire-uploader-meta\", fmt(file.size)));\n var bar = el(\"div\", \"wire-uploader-bar\");\n var fill = el(\"div\", \"wire-uploader-fill\");\n bar.appendChild(fill);\n li.appendChild(bar);\n var status = el(\"span\", \"wire-uploader-status\", \"\");\n li.appendChild(status);\n listEl.appendChild(li);\n return { li: li, fill: fill, status: status };\n }\n\n function uploadOne(file) {\n var ui = row(file);\n if (maxBytes && file.size > maxBytes) return fail(ui, \"Too large (max \" + fmt(maxBytes) + \")\", file);\n if (!accepts(accept, file)) return fail(ui, \"Type not allowed\", file);\n\n var fd = new FormData();\n fd.append(field, file, file.name);\n var xhr = new XMLHttpRequest();\n xhr.open(\"POST\", endpoint, true);\n var token = cookie(CSRF_COOKIE);\n if (token) xhr.setRequestHeader(\"x-csrf-token\", token);\n xhr.upload.addEventListener(\"progress\", function (e) {\n if (e.lengthComputable) {\n var pct = Math.round((e.loaded / e.total) * 100);\n ui.fill.style.width = pct + \"%\";\n ui.status.textContent = pct + \"%\";\n }\n });\n xhr.addEventListener(\"load\", function () {\n var data = null;\n try { data = JSON.parse(xhr.responseText); } catch (e2) {}\n if (xhr.status >= 200 && xhr.status < 300 && data && data.ok) {\n done(ui, (data.files && data.files[0]) || null, file);\n } else {\n fail(ui, (data && data.error) || (\"Upload failed (\" + xhr.status + \")\"), file);\n }\n });\n xhr.addEventListener(\"error\", function () { fail(ui, \"Network error\", file); });\n xhr.send(fd);\n }\n\n function done(ui, info, file) {\n ui.li.classList.remove(\"is-error\");\n ui.li.classList.add(\"is-done\");\n ui.fill.style.width = \"100%\";\n ui.status.textContent = \"\\u2713 Uploaded\";\n root.dispatchEvent(new CustomEvent(\"wrnexus:upload\", { bubbles: true, detail: { file: file, result: info } }));\n if (invalidate.length) {\n window.dispatchEvent(new CustomEvent(\"wrnexus:cache:invalidate\", {\n detail: { tags: invalidate, source: \"uploader\", file: file, result: info }\n }));\n }\n }\n function fail(ui, msg, file) {\n ui.li.classList.add(\"is-error\");\n ui.status.textContent = \"\\u2717 \" + msg;\n root.dispatchEvent(new CustomEvent(\"wrnexus:upload-error\", { bubbles: true, detail: { file: file, error: msg } }));\n }\n }\n\n function init() {\n injectCss();\n var nodes = document.querySelectorAll(\"[data-uploader]\");\n for (var i = 0; i < nodes.length; i++) setup(nodes[i]);\n }\n if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", init);\n else init();\n})();\n"; +declare const UPLOAD_RUNTIME = "\n(function () {\n if (typeof document === \"undefined\") return;\n var CSRF_COOKIE = \"wire-csrf\";\n\n var CSS =\n \".wire-uploader{display:block}\" +\n \".wire-uploader-zone{display:flex;align-items:center;justify-content:center;text-align:center;\" +\n \"min-height:8rem;padding:1.25rem;border:2px dashed var(--wire-border,#cbd5e1);border-radius:12px;\" +\n \"background:var(--wire-surface,transparent);color:var(--wire-muted,#64748b);cursor:pointer;\" +\n \"transition:border-color .15s ease,background-color .15s ease;position:relative}\" +\n \".wire-uploader-zone:hover,.wire-uploader-zone:focus-visible{border-color:var(--wire-brand,#3f7dff);outline:none}\" +\n \".wire-uploader-zone.is-drag{border-color:var(--wire-brand,#3f7dff);background:color-mix(in oklab,var(--wire-brand,#3f7dff) 8%,transparent)}\" +\n \".wire-uploader-prompt{font-size:.9rem;pointer-events:none}\" +\n \".wire-uploader-input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}\" +\n \".wire-uploader-list{list-style:none;margin:.75rem 0 0;padding:0;display:flex;flex-direction:column;gap:.5rem}\" +\n \".wire-uploader-item{display:grid;grid-template-columns:1fr auto;gap:.15rem .75rem;align-items:center;\" +\n \"font-size:.82rem;padding:.5rem .7rem;border:1px solid var(--wire-border,#e2e8f0);border-radius:8px}\" +\n \".wire-uploader-name{font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--wire-text,#0f172a)}\" +\n \".wire-uploader-meta{color:var(--wire-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n \".wire-uploader-bar{grid-column:1/-1;height:5px;border-radius:999px;background:var(--wire-border,#e2e8f0);overflow:hidden}\" +\n \".wire-uploader-fill{height:100%;width:0;border-radius:999px;background:var(--wire-brand,#3f7dff);transition:width .15s ease}\" +\n \".wire-uploader-status{grid-column:1/-1;font-size:.75rem;color:var(--wire-muted,#94a3b8);font-variant-numeric:tabular-nums}\" +\n \".wire-uploader-item.is-done .wire-uploader-fill{background:var(--wire-success,#16a34a)}\" +\n \".wire-uploader-item.is-done .wire-uploader-status{color:var(--wire-success,#16a34a)}\" +\n \".wire-uploader-item.is-error .wire-uploader-fill{background:var(--wire-danger,#dc2626)}\" +\n \".wire-uploader-item.is-error .wire-uploader-status{color:var(--wire-danger,#dc2626)}\";\n\n function injectCss() {\n if (document.getElementById(\"wire-uploader-css\")) return;\n var s = document.createElement(\"style\");\n s.id = \"wire-uploader-css\";\n s.textContent = CSS;\n document.head.appendChild(s);\n }\n\n function cookie(name) {\n var m = document.cookie.match(new RegExp(\"(?:^|; )\" + name + \"=([^;]*)\"));\n return m ? decodeURIComponent(m[1]) : \"\";\n }\n function el(tag, cls, text) {\n var e = document.createElement(tag);\n if (cls) e.className = cls;\n if (text != null) e.textContent = text;\n return e;\n }\n function fmt(n) {\n if (n < 1024) return n + \" B\";\n if (n < 1048576) return (n / 1024).toFixed(1) + \" KB\";\n return (n / 1048576).toFixed(1) + \" MB\";\n }\n function accepts(accept, file) {\n var list = (accept || \"\").split(\",\").map(function (s) { return s.trim().toLowerCase(); }).filter(Boolean);\n if (!list.length) return true;\n var type = (file.type || \"\").toLowerCase();\n var name = (file.name || \"\").toLowerCase();\n var ext = name.indexOf(\".\") >= 0 ? name.slice(name.lastIndexOf(\".\")) : \"\";\n return list.some(function (rule) {\n if (rule.charAt(0) === \".\") return rule === ext;\n if (rule.slice(-2) === \"/*\") return type.indexOf(rule.slice(0, -1)) === 0;\n return rule === type;\n });\n }\n\n function setup(root) {\n if (root.__wrnexusUploader) return;\n root.__wrnexusUploader = true;\n\n var endpoint = root.getAttribute(\"data-endpoint\") || \"/api/upload\";\n var multipleAttr = root.getAttribute(\"data-multiple\");\n var multiple = root.hasAttribute(\"data-multiple\") && multipleAttr !== \"false\";\n var accept = root.getAttribute(\"data-accept\") || \"\";\n var maxBytes = parseInt(root.getAttribute(\"data-max\") || \"0\", 10) || 0;\n var field = root.getAttribute(\"data-field\") || (multiple ? \"files\" : \"file\");\n var invalidate = String(root.getAttribute(\"data-invalidate\") || \"\")\n .split(\",\")\n .map(function (tag) { return tag.trim(); })\n .filter(Boolean);\n var promptText = root.getAttribute(\"data-label\") || \"Drag files here or click to browse\";\n\n root.classList.add(\"wire-uploader\");\n var zone = el(\"div\", \"wire-uploader-zone\");\n zone.setAttribute(\"role\", \"button\");\n zone.setAttribute(\"tabindex\", \"0\");\n zone.appendChild(el(\"div\", \"wire-uploader-prompt\", promptText));\n var input = document.createElement(\"input\");\n input.type = \"file\";\n input.className = \"wire-uploader-input\";\n if (multiple) input.multiple = true;\n if (accept) input.accept = accept;\n zone.appendChild(input);\n var listEl = el(\"ul\", \"wire-uploader-list\");\n root.appendChild(zone);\n root.appendChild(listEl);\n\n zone.addEventListener(\"keydown\", function (e) {\n if (e.key === \"Enter\" || e.key === \" \") { e.preventDefault(); input.click(); }\n });\n [\"dragenter\", \"dragover\"].forEach(function (ev) {\n zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.add(\"is-drag\"); });\n });\n [\"dragleave\", \"drop\"].forEach(function (ev) {\n zone.addEventListener(ev, function (e) { e.preventDefault(); zone.classList.remove(\"is-drag\"); });\n });\n zone.addEventListener(\"drop\", function (e) {\n if (e.dataTransfer && e.dataTransfer.files) handle(e.dataTransfer.files);\n });\n input.addEventListener(\"change\", function () {\n if (input.files) handle(input.files);\n input.value = \"\";\n });\n\n function handle(files) {\n var arr = Array.prototype.slice.call(files);\n if (!multiple) arr = arr.slice(0, 1);\n arr.forEach(uploadOne);\n }\n\n function row(file) {\n var li = el(\"li\", \"wire-uploader-item\");\n li.appendChild(el(\"span\", \"wire-uploader-name\", file.name));\n li.appendChild(el(\"span\", \"wire-uploader-meta\", fmt(file.size)));\n var bar = el(\"div\", \"wire-uploader-bar\");\n var fill = el(\"div\", \"wire-uploader-fill\");\n bar.appendChild(fill);\n li.appendChild(bar);\n var status = el(\"span\", \"wire-uploader-status\", \"\");\n li.appendChild(status);\n listEl.appendChild(li);\n return { li: li, fill: fill, status: status };\n }\n\n function uploadOne(file) {\n var ui = row(file);\n if (maxBytes && file.size > maxBytes) return fail(ui, \"Too large (max \" + fmt(maxBytes) + \")\", file);\n if (!accepts(accept, file)) return fail(ui, \"Type not allowed\", file);\n\n var fd = new FormData();\n fd.append(field, file, file.name);\n var xhr = new XMLHttpRequest();\n xhr.open(\"POST\", endpoint, true);\n var token = cookie(CSRF_COOKIE);\n if (token) xhr.setRequestHeader(\"x-csrf-token\", token);\n xhr.upload.addEventListener(\"progress\", function (e) {\n if (e.lengthComputable) {\n var pct = Math.round((e.loaded / e.total) * 100);\n ui.fill.style.width = pct + \"%\";\n ui.status.textContent = pct + \"%\";\n }\n });\n xhr.addEventListener(\"load\", function () {\n var data = null;\n try { data = JSON.parse(xhr.responseText); }\n catch (error) { console.warn(\"[wrnexus:uploader] upload response was not valid JSON\", error); }\n if (xhr.status >= 200 && xhr.status < 300 && data && data.ok) {\n done(ui, (data.files && data.files[0]) || null, file);\n } else {\n fail(ui, (data && data.error) || (\"Upload failed (\" + xhr.status + \")\"), file);\n }\n });\n xhr.addEventListener(\"error\", function () { fail(ui, \"Network error\", file); });\n xhr.send(fd);\n }\n\n function done(ui, info, file) {\n ui.li.classList.remove(\"is-error\");\n ui.li.classList.add(\"is-done\");\n ui.fill.style.width = \"100%\";\n ui.status.textContent = \"\\u2713 Uploaded\";\n root.dispatchEvent(new CustomEvent(\"wrnexus:upload\", { bubbles: true, detail: { file: file, result: info } }));\n if (invalidate.length) {\n window.dispatchEvent(new CustomEvent(\"wrnexus:cache:invalidate\", {\n detail: { tags: invalidate, source: \"uploader\", file: file, result: info }\n }));\n }\n }\n function fail(ui, msg, file) {\n ui.li.classList.add(\"is-error\");\n ui.status.textContent = \"\\u2717 \" + msg;\n root.dispatchEvent(new CustomEvent(\"wrnexus:upload-error\", { bubbles: true, detail: { file: file, error: msg } }));\n }\n }\n\n function init() {\n injectCss();\n var nodes = document.querySelectorAll(\"[data-uploader]\");\n for (var i = 0; i < nodes.length; i++) setup(nodes[i]);\n }\n if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", init);\n else init();\n})();\n"; /** * Local-disk storage driver. Files live under a configured directory; keys map @@ -14934,6 +15048,8 @@ Events: change, open, close ### Complete .wrn source contract ```wrn +import ComponentBaseStyles from "../styles/ComponentBaseStyles.wrn" + component Accordion { outputs { change(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) @@ -15039,7 +15155,7 @@ component Accordion { data-variant="{variant}" data-indicator="{indicator}" data-multiple="{allowsMultiple() ? 'true' : 'false'}" - class="wire-next wire-next--color-{color} wire-next--size-{size} wire-next--accordion wire-next--accordion-{variant} {bordered ? 'wire-next--accordion-bordered' : ''} {separated ? 'wire-next--accordion-separated' : ''} {flush ? 'wire-next--accordion-flush' : ''} {disabled ? 'wire-next--disabled' : ''} {class}" + class="wire-component wire-component--color-{color} wire-component--size-{size} wire-next--accordion wire-next--accordion-{variant} {bordered ? 'wire-next--accordion-bordered' : ''} {separated ? 'wire-next--accordion-separated' : ''} {flush ? 'wire-next--accordion-flush' : ''} {disabled ? 'wire-next--disabled' : ''} {class}" > {#each items as item, index}
    {/each} - } -} -``` - ---- - -## AdvancedDatePicker - -Showcase: https://component.wrnexusjs.dev/ -Mount: (legacy: data-component="AdvancedDatePicker") -Category: integrations -Purpose: Theme-aware, responsive advanced date picker component. -Props: size: string = "default", color: string = "primary", title: string = "Advanced Date Picker", description: string = "", items: unknown[] = [], variant: string = "default", class: string = "" -Slots: default -Events: input, change, open, close, clear - -### Complete .wrn source contract - -```wrn -component AdvancedDatePicker { - outputs { - input(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) - change(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) - open(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) - close(payload: { sourceEvent?: Event; [key: string]: string | number | boolean | null | object }) - clear(payload: { value?: string | number | boolean | null; values?: Array; sourceEvent?: Event; [key: string]: string | number | boolean | null | object } | string | number | boolean | null) +
    +