prism0x2a 0.6.1 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +4 -0
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/prerender-manifest.json +24 -0
- package/.next/standalone/.next/required-server-files.json +1 -1
- package/.next/standalone/.next/routes-manifest.json +24 -0
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/amber/capabilities/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/amber/capabilities/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/amber/capabilities.html +1 -1
- package/.next/standalone/.next/server/app/amber/capabilities.rsc +3 -3
- package/.next/standalone/.next/server/app/amber/capabilities.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/amber/capabilities.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/amber/capabilities.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/amber/capabilities.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/amber/capabilities.segments/amber/capabilities/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/amber/capabilities.segments/amber/capabilities.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/amber/capabilities.segments/amber.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/amber/coverage/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/amber/coverage.html +1 -1
- package/.next/standalone/.next/server/app/amber/coverage.rsc +3 -3
- package/.next/standalone/.next/server/app/amber/coverage.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/amber/coverage.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/amber/coverage.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/amber/coverage.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/amber/coverage.segments/amber/coverage/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/amber/coverage.segments/amber/coverage.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/amber/coverage.segments/amber.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/amber/files/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/amber/files.html +1 -1
- package/.next/standalone/.next/server/app/amber/files.rsc +3 -3
- package/.next/standalone/.next/server/app/amber/files.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/amber/files.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/amber/files.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/amber/files.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/amber/files.segments/amber/files/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/amber/files.segments/amber/files.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/amber/files.segments/amber.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/amber/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/amber.html +1 -1
- package/.next/standalone/.next/server/app/amber.rsc +3 -3
- package/.next/standalone/.next/server/app/amber.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/amber.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/amber.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/amber.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/amber.segments/amber/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/amber.segments/amber.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/amber/capabilities/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/amber/capabilities/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/amber/capabilities/route.js +1 -1
- package/.next/standalone/.next/server/app/api/amber/capabilities/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/amber/files/route.js +1 -1
- package/.next/standalone/.next/server/app/api/amber/files/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/amber/registry/route.js +1 -1
- package/.next/standalone/.next/server/app/api/amber/registry/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/amber/scan/route.js +1 -1
- package/.next/standalone/.next/server/app/api/amber/scan/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/blue/recommendations/route.js +1 -1
- package/.next/standalone/.next/server/app/api/blue/recommendations/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/blue/scan/route.js +4 -4
- package/.next/standalone/.next/server/app/api/blue/scan/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/blue/sessions/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/blue/sessions/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/config/test/route.js +1 -1
- package/.next/standalone/.next/server/app/api/config/test/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/green/cross-layer/route.js +1 -1
- package/.next/standalone/.next/server/app/api/green/cross-layer/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/green/insights/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/green/insights/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/green/insights/route.js +1 -1
- package/.next/standalone/.next/server/app/api/green/insights/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/green/queries/[id]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/green/queries/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/green/queries/[id]/run/route.js +1 -1
- package/.next/standalone/.next/server/app/api/green/queries/[id]/run/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/green/queries/route.js +1 -1
- package/.next/standalone/.next/server/app/api/green/queries/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/license/activate/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/license/activate/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/license/activate/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/license/activate/route.js +6 -0
- package/.next/standalone/.next/server/app/api/license/activate/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/license/activate/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/license/activate/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/license/deactivate/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/license/deactivate/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/license/deactivate/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/license/deactivate/route.js +6 -0
- package/.next/standalone/.next/server/app/api/license/deactivate/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/license/deactivate/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/license/deactivate/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/license/route.js +1 -1
- package/.next/standalone/.next/server/app/api/license/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/license/validate/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/license/validate/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/license/validate/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/license/validate/route.js +6 -0
- package/.next/standalone/.next/server/app/api/license/validate/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/license/validate/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/license/validate/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/monorepo/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/scan/route.js +1 -1
- package/.next/standalone/.next/server/app/api/scan/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/blue/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/blue/recommendations/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/blue/recommendations/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/blue/recommendations.html +1 -1
- package/.next/standalone/.next/server/app/blue/recommendations.rsc +3 -3
- package/.next/standalone/.next/server/app/blue/recommendations.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/blue/recommendations.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/blue/recommendations.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/blue/recommendations.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/blue/recommendations.segments/blue/recommendations/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/blue/recommendations.segments/blue/recommendations.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/blue/recommendations.segments/blue.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/blue/sessions/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/blue/sessions/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/blue/sessions.html +1 -1
- package/.next/standalone/.next/server/app/blue/sessions.rsc +3 -3
- package/.next/standalone/.next/server/app/blue/sessions.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/blue/sessions.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/blue/sessions.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/blue/sessions.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/blue/sessions.segments/blue/sessions/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/blue/sessions.segments/blue/sessions.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/blue/sessions.segments/blue.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/blue.html +1 -1
- package/.next/standalone/.next/server/app/blue.rsc +3 -3
- package/.next/standalone/.next/server/app/blue.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/blue.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/blue.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/blue.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/blue.segments/blue/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/blue.segments/blue.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/green/cross-layer/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/green/cross-layer.html +1 -1
- package/.next/standalone/.next/server/app/green/cross-layer.rsc +3 -3
- package/.next/standalone/.next/server/app/green/cross-layer.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/green/cross-layer.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/green/cross-layer.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/green/cross-layer.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/green/cross-layer.segments/green/cross-layer/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/green/cross-layer.segments/green/cross-layer.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/green/cross-layer.segments/green.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/green/insights/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/green/insights/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/green/insights.html +1 -1
- package/.next/standalone/.next/server/app/green/insights.rsc +3 -3
- package/.next/standalone/.next/server/app/green/insights.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/green/insights.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/green/insights.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/green/insights.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/green/insights.segments/green/insights/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/green/insights.segments/green/insights.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/green/insights.segments/green.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/green/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/green/queries/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/green/queries/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/green/queries.html +1 -1
- package/.next/standalone/.next/server/app/green/queries.rsc +3 -3
- package/.next/standalone/.next/server/app/green/queries.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/green/queries.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/green/queries.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/green/queries.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/green/queries.segments/green/queries/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/green/queries.segments/green/queries.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/green/queries.segments/green.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/green.html +1 -1
- package/.next/standalone/.next/server/app/green.rsc +3 -3
- package/.next/standalone/.next/server/app/green.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/green.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/green.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/green.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/green.segments/green/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/green.segments/green.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +3 -3
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/pricing/page/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/pricing/page/build-manifest.json +16 -0
- package/.next/standalone/.next/server/app/pricing/page/next-font-manifest.json +10 -0
- package/.next/standalone/.next/server/app/pricing/page/react-loadable-manifest.json +1 -0
- package/.next/standalone/.next/server/app/pricing/page/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/pricing/page.js +14 -0
- package/.next/standalone/.next/server/app/pricing/page.js.map +5 -0
- package/.next/standalone/.next/server/app/pricing/page.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/pricing/page_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/pricing.html +1 -0
- package/.next/standalone/.next/server/app/pricing.meta +15 -0
- package/.next/standalone/.next/server/app/pricing.rsc +21 -0
- package/.next/standalone/.next/server/app/pricing.segments/_full.segment.rsc +21 -0
- package/.next/standalone/.next/server/app/pricing.segments/_head.segment.rsc +6 -0
- package/.next/standalone/.next/server/app/pricing.segments/_index.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/pricing.segments/_tree.segment.rsc +3 -0
- package/.next/standalone/.next/server/app/pricing.segments/pricing/__PAGE__.segment.rsc +9 -0
- package/.next/standalone/.next/server/app/pricing.segments/pricing.segment.rsc +5 -0
- package/.next/standalone/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/settings.html +2 -2
- package/.next/standalone/.next/server/app/settings.rsc +3 -3
- package/.next/standalone/.next/server/app/settings.segments/_full.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/settings.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/settings.segments/_index.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/settings.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/settings.segments/settings/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/settings.segments/settings.segment.rsc +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +4 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0xv4rrt._.js → [root-of-the-server]__04187lj._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0o~b3pl._.js → [root-of-the-server]__057dm7o._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__08rxe0c._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__09l4tge._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0-m3qqb._.js → [root-of-the-server]__09snvkf._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0m54e40._.js → [root-of-the-server]__0ae2a50._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0d_1-q9._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0sqgu0x._.js → [root-of-the-server]__0e-cuw5._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0z3su._._.js → [root-of-the-server]__0ei452y._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0j4r.sn._.js → [root-of-the-server]__0fxxbt1._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0~pq-2q._.js → [root-of-the-server]__0jwdt56._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0idrx7n._.js → [root-of-the-server]__0kgqm5d._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0lut4-l._.js → [root-of-the-server]__0m_11-d._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__13u~wki._.js → [root-of-the-server]__0mh73gz._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0p0b_67._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0i7owf4._.js → [root-of-the-server]__0s130_c._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0skt4tx._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0xbagnl._.js → [root-of-the-server]__0v3_gr6._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0~f~0tr._.js → [root-of-the-server]__119q6r9._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0-61.35._.js → [root-of-the-server]__12glosw._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__13.5op0._.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_license_activate_route_actions_0jh6t~s.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_license_deactivate_route_actions_0tmpd4n.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_license_validate_route_actions_0lhsct4.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/[root-of-the-server]__0es1n-0._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/_0a2egyj._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_next-internal_server_app_pricing_page_actions_0gvv0qw.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_amber_capabilities_[id]_page_tsx_12~.miw._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_amber_capabilities_page_tsx_0.t9mpr._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_amber_coverage_page_tsx_01yia_n._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_amber_files_page_tsx_00pdkc~._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_amber_page_tsx_0ihx6zl._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_blue_page_tsx_0zg5eg-._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_blue_recommendations_[id]_page_tsx_10zzlnx._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_blue_recommendations_page_tsx_08w-50l._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_blue_sessions_[id]_page_tsx_0_~w1xj._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_blue_sessions_page_tsx_0kbuf.c._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_green_cross-layer_page_tsx_0a80o-~._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_green_insights_[id]_page_tsx_0se6uk1._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_green_insights_page_tsx_04g8_lf._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_green_page_tsx_10g2g6w._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_green_queries_[id]_page_tsx_0hg.qma._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_green_queries_page_tsx_0.p0r7z._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_page_tsx_0es_sk2._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/app_pricing_page_tsx_0uxncj9._.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/app_settings_page_tsx_0~q~t-v._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_09d0h78.js +4 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/next-font-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.json +3 -0
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/static/chunks/0-nogwaahf00r.js +1 -0
- package/.next/standalone/.next/static/chunks/0-ozct-0~_~y0.js +1 -0
- package/.next/standalone/.next/static/chunks/0043va.q9c120.js +1 -0
- package/.next/standalone/.next/static/chunks/0062k_6y6ie8k.js +1 -0
- package/.next/standalone/.next/static/chunks/01x6uo5zvt23j.js +1 -0
- package/.next/standalone/.next/static/chunks/03f4g06bhu.q-.js +1 -0
- package/.next/standalone/.next/static/chunks/06ciexs8mfsoh.js +1 -0
- package/.next/standalone/.next/static/chunks/06lbhw~p794rn.js +1 -0
- package/.next/standalone/.next/static/chunks/0921_~z_rxr9h.js +1 -0
- package/.next/standalone/.next/static/chunks/0_uy4bqezjrpu.js +1 -0
- package/.next/standalone/.next/static/chunks/0aqr1e8db8tr2.js +1 -0
- package/.next/standalone/.next/static/chunks/0gtjarbzj_b0s.js +1 -0
- package/.next/standalone/.next/static/chunks/0i826dpus7xfj.js +1 -0
- package/.next/standalone/.next/static/chunks/0l.f7bl92nc~2.css +2 -0
- package/.next/standalone/.next/static/chunks/0mtsra7dpsxy_.js +1 -0
- package/.next/standalone/.next/static/chunks/0nc15zt~yfrj3.js +1 -0
- package/.next/standalone/.next/static/chunks/0ptkiyk6p_hgq.js +1 -0
- package/.next/standalone/.next/static/chunks/0vsoyv8nkj.rx.js +1 -0
- package/.next/standalone/.next/static/chunks/0zpu7b02c6huw.js +1 -0
- package/.next/standalone/.next/static/chunks/10ibvf69namr1.js +1 -0
- package/.next/standalone/.next/static/chunks/1655x4_8fq5li.js +1 -0
- package/.next/standalone/.next/static/static/chunks/0-nogwaahf00r.js +1 -0
- package/.next/standalone/.next/static/static/chunks/0-ozct-0~_~y0.js +1 -0
- package/.next/standalone/.next/static/static/chunks/0043va.q9c120.js +1 -0
- package/.next/standalone/.next/static/static/chunks/0062k_6y6ie8k.js +1 -0
- package/.next/standalone/.next/static/static/chunks/01x6uo5zvt23j.js +1 -0
- package/.next/standalone/.next/static/static/chunks/03f4g06bhu.q-.js +1 -0
- package/.next/standalone/.next/static/static/chunks/06ciexs8mfsoh.js +1 -0
- package/.next/standalone/.next/static/static/chunks/06lbhw~p794rn.js +1 -0
- package/.next/standalone/.next/static/static/chunks/0921_~z_rxr9h.js +1 -0
- package/.next/standalone/.next/static/static/chunks/0_uy4bqezjrpu.js +1 -0
- package/.next/standalone/.next/static/static/chunks/0aqr1e8db8tr2.js +1 -0
- package/.next/standalone/.next/static/static/chunks/0gtjarbzj_b0s.js +1 -0
- package/.next/standalone/.next/static/static/chunks/0i826dpus7xfj.js +1 -0
- package/.next/standalone/.next/static/static/chunks/0l.f7bl92nc~2.css +2 -0
- package/.next/standalone/.next/static/static/chunks/0mtsra7dpsxy_.js +1 -0
- package/.next/standalone/.next/static/static/chunks/0nc15zt~yfrj3.js +1 -0
- package/.next/standalone/.next/static/static/chunks/0ptkiyk6p_hgq.js +1 -0
- package/.next/standalone/.next/static/static/chunks/0vsoyv8nkj.rx.js +1 -0
- package/.next/standalone/.next/static/static/chunks/0zpu7b02c6huw.js +1 -0
- package/.next/standalone/.next/static/static/chunks/10ibvf69namr1.js +1 -0
- package/.next/standalone/.next/static/static/chunks/1655x4_8fq5li.js +1 -0
- package/.next/standalone/CHANGELOG.md +78 -0
- package/.next/standalone/app/api/blue/scan/route.ts +12 -0
- package/.next/standalone/app/api/license/activate/route.ts +41 -0
- package/.next/standalone/app/api/license/deactivate/route.ts +22 -0
- package/.next/standalone/app/api/license/route.ts +23 -3
- package/.next/standalone/app/api/license/validate/route.ts +23 -0
- package/.next/standalone/app/pricing/page.tsx +289 -0
- package/.next/standalone/app/settings/page.tsx +180 -59
- package/.next/standalone/components/PrismDock.tsx +1 -0
- package/.next/standalone/components/pricing/BillingToggle.tsx +53 -0
- package/.next/standalone/components/pricing/FeatureList.tsx +19 -0
- package/.next/standalone/components/pricing/PricingCard.tsx +120 -0
- package/.next/standalone/docs/strategy/monetization-thinking.md +164 -0
- package/.next/standalone/lib/prism/features.shared.ts +15 -5
- package/.next/standalone/lib/prism/features.ts +9 -5
- package/.next/standalone/lib/prism/hooks/useLicense.ts +26 -2
- package/.next/standalone/lib/prism/lemonsqueezy/client.ts +162 -0
- package/.next/standalone/lib/prism/lemonsqueezy/tierMapping.ts +26 -0
- package/.next/standalone/lib/prism/license/lemonsqueezy.ts +142 -0
- package/.next/standalone/lib/prism/license/store.ts +17 -8
- package/.next/standalone/lib/prism/license/types.ts +35 -11
- package/.next/standalone/lib/prism/license/validate.ts +40 -11
- package/.next/standalone/package.json +2 -2
- package/.next/standalone/server.js +1 -1
- package/.next/standalone/tsconfig.tsbuildinfo +1 -1
- package/.next/static/chunks/0-nogwaahf00r.js +1 -0
- package/.next/static/chunks/0-ozct-0~_~y0.js +1 -0
- package/.next/static/chunks/0043va.q9c120.js +1 -0
- package/.next/static/chunks/0062k_6y6ie8k.js +1 -0
- package/.next/static/chunks/01x6uo5zvt23j.js +1 -0
- package/.next/static/chunks/03f4g06bhu.q-.js +1 -0
- package/.next/static/chunks/06ciexs8mfsoh.js +1 -0
- package/.next/static/chunks/06lbhw~p794rn.js +1 -0
- package/.next/static/chunks/0921_~z_rxr9h.js +1 -0
- package/.next/static/chunks/0_uy4bqezjrpu.js +1 -0
- package/.next/static/chunks/0aqr1e8db8tr2.js +1 -0
- package/.next/static/chunks/0gtjarbzj_b0s.js +1 -0
- package/.next/static/chunks/0i826dpus7xfj.js +1 -0
- package/.next/static/chunks/0l.f7bl92nc~2.css +2 -0
- package/.next/static/chunks/0mtsra7dpsxy_.js +1 -0
- package/.next/static/chunks/0nc15zt~yfrj3.js +1 -0
- package/.next/static/chunks/0ptkiyk6p_hgq.js +1 -0
- package/.next/static/chunks/0vsoyv8nkj.rx.js +1 -0
- package/.next/static/chunks/0zpu7b02c6huw.js +1 -0
- package/.next/static/chunks/10ibvf69namr1.js +1 -0
- package/.next/static/chunks/1655x4_8fq5li.js +1 -0
- package/CHANGELOG.md +78 -0
- package/package.json +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0c4z._.._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0tsv3gt._.js +0 -3
- package/.next/standalone/.next/static/chunks/06w_r5ib1et20.css +0 -2
- package/.next/standalone/.next/static/chunks/07c3wweseos.8.js +0 -1
- package/.next/standalone/.next/static/chunks/0_mxo3sdn-obc.js +0 -1
- package/.next/standalone/.next/static/chunks/0_r6ls5m8p~ft.js +0 -1
- package/.next/standalone/.next/static/chunks/0amsn1mknilcs.js +0 -1
- package/.next/standalone/.next/static/chunks/0ca9m7vrn2t7n.js +0 -1
- package/.next/standalone/.next/static/chunks/0c~l5bjb.rw_-.js +0 -1
- package/.next/standalone/.next/static/chunks/0dpf4si7n7imd.js +0 -1
- package/.next/standalone/.next/static/chunks/0du4cx1~k7d83.js +0 -1
- package/.next/standalone/.next/static/chunks/0g6lo0qyyyd8q.js +0 -1
- package/.next/standalone/.next/static/chunks/0lmcd5yqytd7q.js +0 -1
- package/.next/standalone/.next/static/chunks/0mlj0bhfz2s6h.js +0 -1
- package/.next/standalone/.next/static/chunks/0nu3srr5njzka.js +0 -1
- package/.next/standalone/.next/static/chunks/0qsy_4~44nzw1.js +0 -1
- package/.next/standalone/.next/static/chunks/1006uokkrcoe4.js +0 -1
- package/.next/standalone/.next/static/chunks/105mo4ttns4ro.js +0 -1
- package/.next/standalone/.next/static/chunks/10q-0rneqwysg.js +0 -1
- package/.next/standalone/.next/static/chunks/12kh0-iq.4m3c.js +0 -1
- package/.next/standalone/.next/static/chunks/13_6yxs82pu_4.js +0 -1
- package/.next/standalone/.next/static/chunks/16btub.0e2sr1.js +0 -1
- package/.next/standalone/.next/static/static/chunks/06w_r5ib1et20.css +0 -2
- package/.next/standalone/.next/static/static/chunks/07c3wweseos.8.js +0 -1
- package/.next/standalone/.next/static/static/chunks/0_mxo3sdn-obc.js +0 -1
- package/.next/standalone/.next/static/static/chunks/0_r6ls5m8p~ft.js +0 -1
- package/.next/standalone/.next/static/static/chunks/0amsn1mknilcs.js +0 -1
- package/.next/standalone/.next/static/static/chunks/0ca9m7vrn2t7n.js +0 -1
- package/.next/standalone/.next/static/static/chunks/0c~l5bjb.rw_-.js +0 -1
- package/.next/standalone/.next/static/static/chunks/0dpf4si7n7imd.js +0 -1
- package/.next/standalone/.next/static/static/chunks/0du4cx1~k7d83.js +0 -1
- package/.next/standalone/.next/static/static/chunks/0g6lo0qyyyd8q.js +0 -1
- package/.next/standalone/.next/static/static/chunks/0lmcd5yqytd7q.js +0 -1
- package/.next/standalone/.next/static/static/chunks/0mlj0bhfz2s6h.js +0 -1
- package/.next/standalone/.next/static/static/chunks/0nu3srr5njzka.js +0 -1
- package/.next/standalone/.next/static/static/chunks/0qsy_4~44nzw1.js +0 -1
- package/.next/standalone/.next/static/static/chunks/1006uokkrcoe4.js +0 -1
- package/.next/standalone/.next/static/static/chunks/105mo4ttns4ro.js +0 -1
- package/.next/standalone/.next/static/static/chunks/10q-0rneqwysg.js +0 -1
- package/.next/standalone/.next/static/static/chunks/12kh0-iq.4m3c.js +0 -1
- package/.next/standalone/.next/static/static/chunks/13_6yxs82pu_4.js +0 -1
- package/.next/standalone/.next/static/static/chunks/16btub.0e2sr1.js +0 -1
- package/.next/static/chunks/06w_r5ib1et20.css +0 -2
- package/.next/static/chunks/07c3wweseos.8.js +0 -1
- package/.next/static/chunks/0_mxo3sdn-obc.js +0 -1
- package/.next/static/chunks/0_r6ls5m8p~ft.js +0 -1
- package/.next/static/chunks/0amsn1mknilcs.js +0 -1
- package/.next/static/chunks/0ca9m7vrn2t7n.js +0 -1
- package/.next/static/chunks/0c~l5bjb.rw_-.js +0 -1
- package/.next/static/chunks/0dpf4si7n7imd.js +0 -1
- package/.next/static/chunks/0du4cx1~k7d83.js +0 -1
- package/.next/static/chunks/0g6lo0qyyyd8q.js +0 -1
- package/.next/static/chunks/0lmcd5yqytd7q.js +0 -1
- package/.next/static/chunks/0mlj0bhfz2s6h.js +0 -1
- package/.next/static/chunks/0nu3srr5njzka.js +0 -1
- package/.next/static/chunks/0qsy_4~44nzw1.js +0 -1
- package/.next/static/chunks/1006uokkrcoe4.js +0 -1
- package/.next/static/chunks/105mo4ttns4ro.js +0 -1
- package/.next/static/chunks/10q-0rneqwysg.js +0 -1
- package/.next/static/chunks/12kh0-iq.4m3c.js +0 -1
- package/.next/static/chunks/13_6yxs82pu_4.js +0 -1
- package/.next/static/chunks/16btub.0e2sr1.js +0 -1
- /package/.next/standalone/.next/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_ssgManifest.js +0 -0
- /package/.next/standalone/.next/static/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_ssgManifest.js +0 -0
- /package/.next/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_buildManifest.js +0 -0
- /package/.next/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{pxEf_JFJYiGcbQWz1fBY7 → W2AhxwlOVhsTt-b4T3Mjc}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { lsActivate, lsValidate, lsDeactivate, type LsActivateResponse, type LsValidateResponse } from "../lemonsqueezy/client";
|
|
2
|
+
import { mapProductNameToTier } from "../lemonsqueezy/tierMapping";
|
|
3
|
+
import { type License, type LicenseTier, CACHE_TTL_SECS, GRACE_PERIOD_SECS, FREE_LICENSE } from "./types";
|
|
4
|
+
import { loadLicense, saveLicense } from "./store";
|
|
5
|
+
import os from "node:os";
|
|
6
|
+
|
|
7
|
+
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
8
|
+
|
|
9
|
+
function subscriptionStatusFromKey(
|
|
10
|
+
status: LsActivateResponse["license_key"]["status"],
|
|
11
|
+
): License["subscriptionStatus"] {
|
|
12
|
+
switch (status) {
|
|
13
|
+
case "active": return "active";
|
|
14
|
+
case "expired": return "expired";
|
|
15
|
+
case "inactive": return "expired";
|
|
16
|
+
case "disabled": return "expired";
|
|
17
|
+
default: return "active";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function defaultInstanceName(): string {
|
|
22
|
+
return os.hostname().split(".")[0] ?? "prism-instance";
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function nowSecs(): number {
|
|
26
|
+
return Math.floor(Date.now() / 1000);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function buildLicenseFromActivation(licenseKey: string, res: LsActivateResponse): License {
|
|
30
|
+
const tier = mapProductNameToTier(res.meta.product_name);
|
|
31
|
+
const validatedAt = nowSecs();
|
|
32
|
+
const expiresAt = res.license_key.expires_at
|
|
33
|
+
? Math.floor(new Date(res.license_key.expires_at).getTime() / 1000)
|
|
34
|
+
: 0;
|
|
35
|
+
return {
|
|
36
|
+
tier,
|
|
37
|
+
userId: res.meta.customer_email,
|
|
38
|
+
issuedAt: validatedAt,
|
|
39
|
+
expiresAt,
|
|
40
|
+
features: [],
|
|
41
|
+
licenseKey,
|
|
42
|
+
instanceId: res.instance.id,
|
|
43
|
+
productName: res.meta.product_name,
|
|
44
|
+
subscriptionStatus: subscriptionStatusFromKey(res.license_key.status),
|
|
45
|
+
validatedAt,
|
|
46
|
+
revalidationDue: validatedAt + CACHE_TTL_SECS,
|
|
47
|
+
gracePeriodEnd: validatedAt + CACHE_TTL_SECS + GRACE_PERIOD_SECS,
|
|
48
|
+
activationLimit: res.license_key.activation_limit ?? null,
|
|
49
|
+
activationUsage: res.license_key.activation_usage,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function buildLicenseFromValidation(existing: License, res: LsValidateResponse): License {
|
|
54
|
+
const tier = mapProductNameToTier(res.meta.product_name);
|
|
55
|
+
const validatedAt = nowSecs();
|
|
56
|
+
const expiresAt = res.license_key.expires_at
|
|
57
|
+
? Math.floor(new Date(res.license_key.expires_at).getTime() / 1000)
|
|
58
|
+
: existing.expiresAt;
|
|
59
|
+
return {
|
|
60
|
+
...existing,
|
|
61
|
+
tier,
|
|
62
|
+
userId: res.meta.customer_email,
|
|
63
|
+
expiresAt,
|
|
64
|
+
productName: res.meta.product_name,
|
|
65
|
+
subscriptionStatus: subscriptionStatusFromKey(res.license_key.status),
|
|
66
|
+
validatedAt,
|
|
67
|
+
revalidationDue: validatedAt + CACHE_TTL_SECS,
|
|
68
|
+
gracePeriodEnd: validatedAt + CACHE_TTL_SECS + GRACE_PERIOD_SECS,
|
|
69
|
+
activationLimit: res.license_key.activation_limit ?? null,
|
|
70
|
+
activationUsage: res.license_key.activation_usage,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
75
|
+
|
|
76
|
+
export interface ActivateResult {
|
|
77
|
+
tier: LicenseTier;
|
|
78
|
+
productName: string;
|
|
79
|
+
instanceId: string;
|
|
80
|
+
userId: string;
|
|
81
|
+
activationLimit: number | null;
|
|
82
|
+
activationUsage: number;
|
|
83
|
+
expiresAt: number;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Activate a Lemonsqueezy license key for this machine and persist to .prism/license.json. */
|
|
87
|
+
export async function activateLicenseKey(
|
|
88
|
+
targetPath: string,
|
|
89
|
+
licenseKey: string,
|
|
90
|
+
instanceName?: string,
|
|
91
|
+
): Promise<ActivateResult> {
|
|
92
|
+
const name = instanceName ?? defaultInstanceName();
|
|
93
|
+
const res = await lsActivate(licenseKey.trim(), name);
|
|
94
|
+
const license = buildLicenseFromActivation(licenseKey.trim(), res);
|
|
95
|
+
saveLicense(targetPath, license);
|
|
96
|
+
return {
|
|
97
|
+
tier: license.tier,
|
|
98
|
+
productName: license.productName!,
|
|
99
|
+
instanceId: license.instanceId!,
|
|
100
|
+
userId: license.userId!,
|
|
101
|
+
activationLimit: license.activationLimit!,
|
|
102
|
+
activationUsage: license.activationUsage!,
|
|
103
|
+
expiresAt: license.expiresAt,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export interface ValidateResult {
|
|
108
|
+
valid: boolean;
|
|
109
|
+
tier: LicenseTier;
|
|
110
|
+
subscriptionStatus: License["subscriptionStatus"];
|
|
111
|
+
validatedAt: number;
|
|
112
|
+
expiresAt: number;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** Re-validate the cached license against Lemonsqueezy and refresh the cache. */
|
|
116
|
+
export async function revalidateLicense(targetPath: string): Promise<ValidateResult> {
|
|
117
|
+
const existing = loadLicense(targetPath);
|
|
118
|
+
if (!existing.licenseKey || !existing.instanceId) {
|
|
119
|
+
throw new Error("No Lemonsqueezy license active — activate first.");
|
|
120
|
+
}
|
|
121
|
+
const res = await lsValidate(existing.licenseKey, existing.instanceId);
|
|
122
|
+
const updated = buildLicenseFromValidation(existing, res);
|
|
123
|
+
saveLicense(targetPath, updated);
|
|
124
|
+
return {
|
|
125
|
+
valid: res.valid,
|
|
126
|
+
tier: updated.tier,
|
|
127
|
+
subscriptionStatus: updated.subscriptionStatus,
|
|
128
|
+
validatedAt: updated.validatedAt!,
|
|
129
|
+
expiresAt: updated.expiresAt,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Deactivate this instance at Lemonsqueezy and revert to free tier locally. */
|
|
134
|
+
export async function deactivateLicense(targetPath: string): Promise<void> {
|
|
135
|
+
const existing = loadLicense(targetPath);
|
|
136
|
+
if (!existing.licenseKey || !existing.instanceId) {
|
|
137
|
+
saveLicense(targetPath, { ...FREE_LICENSE });
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
await lsDeactivate(existing.licenseKey, existing.instanceId);
|
|
141
|
+
saveLicense(targetPath, { ...FREE_LICENSE });
|
|
142
|
+
}
|
|
@@ -12,15 +12,24 @@ export function licensePath(targetPath: string): string {
|
|
|
12
12
|
export function loadLicense(targetPath: string): License {
|
|
13
13
|
try {
|
|
14
14
|
const raw = fs.readFileSync(licensePath(targetPath), "utf-8");
|
|
15
|
-
const
|
|
16
|
-
if (!
|
|
15
|
+
const p = JSON.parse(raw) as Partial<License>;
|
|
16
|
+
if (!p.tier) return { ...FREE_LICENSE };
|
|
17
17
|
return {
|
|
18
|
-
tier:
|
|
19
|
-
userId:
|
|
20
|
-
issuedAt:
|
|
21
|
-
expiresAt:
|
|
22
|
-
features: Array.isArray(
|
|
23
|
-
signature:
|
|
18
|
+
tier: p.tier,
|
|
19
|
+
userId: p.userId,
|
|
20
|
+
issuedAt: p.issuedAt ?? 0,
|
|
21
|
+
expiresAt: p.expiresAt ?? 0,
|
|
22
|
+
features: Array.isArray(p.features) ? p.features : [],
|
|
23
|
+
signature: p.signature,
|
|
24
|
+
licenseKey: p.licenseKey,
|
|
25
|
+
instanceId: p.instanceId,
|
|
26
|
+
productName: p.productName,
|
|
27
|
+
subscriptionStatus: p.subscriptionStatus,
|
|
28
|
+
validatedAt: p.validatedAt,
|
|
29
|
+
revalidationDue: p.revalidationDue,
|
|
30
|
+
gracePeriodEnd: p.gracePeriodEnd,
|
|
31
|
+
activationLimit: p.activationLimit,
|
|
32
|
+
activationUsage: p.activationUsage,
|
|
24
33
|
};
|
|
25
34
|
} catch {
|
|
26
35
|
return { ...FREE_LICENSE };
|
|
@@ -1,12 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* "forge-pro" — forge0x2B Pro only (no extra prism features)
|
|
3
|
+
* "spectrum" — Spectrum 0x55 Bundle: prism Pro + forge0x2B Pro
|
|
4
|
+
* tier rank for prism features: free < pro ≤ spectrum < team < enterprise
|
|
5
|
+
*/
|
|
6
|
+
export type LicenseTier = "free" | "pro" | "forge-pro" | "spectrum" | "team" | "enterprise";
|
|
2
7
|
|
|
3
8
|
export interface License {
|
|
4
9
|
tier: LicenseTier;
|
|
5
|
-
userId?: string;
|
|
6
|
-
issuedAt: number;
|
|
7
|
-
expiresAt: number;
|
|
8
|
-
features: string[];
|
|
9
|
-
signature?: string;
|
|
10
|
+
userId?: string; // customer email from Lemonsqueezy
|
|
11
|
+
issuedAt: number; // unix (s), 0 = not set
|
|
12
|
+
expiresAt: number; // unix (s), 0 = no expiry (active sub)
|
|
13
|
+
features: string[]; // explicit feature-flag overrides
|
|
14
|
+
signature?: string; // reserved
|
|
15
|
+
// Lemonsqueezy-specific (populated after online activation)
|
|
16
|
+
licenseKey?: string; // LS license key (sk-...)
|
|
17
|
+
instanceId?: string; // LS instance ID for this machine
|
|
18
|
+
productName?: string; // e.g. "prism0x2A Pro"
|
|
19
|
+
subscriptionStatus?: "active" | "cancelled" | "expired" | "paused";
|
|
20
|
+
validatedAt?: number; // unix (s) of last successful LS API validation
|
|
21
|
+
revalidationDue?: number; // validatedAt + CACHE_TTL (30 days)
|
|
22
|
+
gracePeriodEnd?: number; // revalidationDue + GRACE_PERIOD (7 days)
|
|
23
|
+
activationLimit?: number | null;// LS license_key.activation_limit
|
|
24
|
+
activationUsage?: number; // LS license_key.activation_usage
|
|
10
25
|
}
|
|
11
26
|
|
|
12
27
|
export const FREE_LICENSE: License = {
|
|
@@ -16,10 +31,19 @@ export const FREE_LICENSE: License = {
|
|
|
16
31
|
features: [],
|
|
17
32
|
};
|
|
18
33
|
|
|
19
|
-
/**
|
|
34
|
+
/**
|
|
35
|
+
* Prism-feature tier rank.
|
|
36
|
+
* spectrum = pro for prism features (bundle also gives forge-pro).
|
|
37
|
+
* forge-pro = free for prism features.
|
|
38
|
+
*/
|
|
20
39
|
export const TIER_RANK: Record<LicenseTier, number> = {
|
|
21
|
-
free:
|
|
22
|
-
pro:
|
|
23
|
-
|
|
24
|
-
|
|
40
|
+
free: 0,
|
|
41
|
+
"forge-pro": 0, // no extra prism features
|
|
42
|
+
pro: 1,
|
|
43
|
+
spectrum: 1, // same as pro for prism
|
|
44
|
+
team: 2,
|
|
45
|
+
enterprise: 3,
|
|
25
46
|
};
|
|
47
|
+
|
|
48
|
+
export const CACHE_TTL_SECS = 30 * 24 * 60 * 60; // 30 days
|
|
49
|
+
export const GRACE_PERIOD_SECS = 7 * 24 * 60 * 60; // 7-day grace after cache expiry
|
|
@@ -1,38 +1,67 @@
|
|
|
1
|
-
import { type License, type LicenseTier, TIER_RANK } from "./types";
|
|
1
|
+
import { type License, type LicenseTier, TIER_RANK, CACHE_TTL_SECS, GRACE_PERIOD_SECS } from "./types";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
const PAID_TIERS: LicenseTier[] = ["pro", "forge-pro", "spectrum", "team", "enterprise"];
|
|
4
|
+
|
|
5
|
+
/** Returns false for free-tier or structurally invalid objects. */
|
|
4
6
|
export function isValidLicense(license: License): boolean {
|
|
5
|
-
if (!license
|
|
6
|
-
if (license.tier
|
|
7
|
-
if (!["pro", "team", "enterprise"].includes(license.tier)) return false;
|
|
7
|
+
if (!license?.tier) return false;
|
|
8
|
+
if (!PAID_TIERS.includes(license.tier)) return false;
|
|
8
9
|
if (typeof license.issuedAt !== "number") return false;
|
|
9
10
|
return true;
|
|
10
11
|
}
|
|
11
12
|
|
|
12
|
-
/** Returns true when
|
|
13
|
+
/** Returns true when subscription has a hard expiry that has passed. */
|
|
13
14
|
export function isLicenseExpired(license: License): boolean {
|
|
14
|
-
if (!license.expiresAt) return false;
|
|
15
|
-
return Date.now() / 1000 > license.expiresAt;
|
|
15
|
+
if (!license.expiresAt) return false;
|
|
16
|
+
return Math.floor(Date.now() / 1000) > license.expiresAt;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Offline-cache validity check.
|
|
21
|
+
* Returns: "valid" | "grace" | "expired" | "no-cache"
|
|
22
|
+
* valid — within 30-day cache window
|
|
23
|
+
* grace — cache expired, within 7-day grace (allow but schedule re-validation)
|
|
24
|
+
* expired — grace elapsed, revert to free
|
|
25
|
+
* no-cache — no validatedAt (manual JSON license, not LS-activated)
|
|
26
|
+
*/
|
|
27
|
+
export function cacheStatus(license: License): "valid" | "grace" | "expired" | "no-cache" {
|
|
28
|
+
if (!license.validatedAt) return "no-cache";
|
|
29
|
+
const now = Math.floor(Date.now() / 1000);
|
|
30
|
+
const due = license.revalidationDue ?? license.validatedAt + CACHE_TTL_SECS;
|
|
31
|
+
if (now <= due) return "valid";
|
|
32
|
+
if (now <= due + GRACE_PERIOD_SECS) return "grace";
|
|
33
|
+
return "expired";
|
|
16
34
|
}
|
|
17
35
|
|
|
18
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* Effective tier for prism-feature checks.
|
|
38
|
+
* Falls back to "free" when license is invalid, expired, or LS cache has elapsed.
|
|
39
|
+
*/
|
|
19
40
|
export function effectiveTier(license: License): LicenseTier {
|
|
20
41
|
if (!isValidLicense(license)) return "free";
|
|
21
42
|
if (isLicenseExpired(license)) return "free";
|
|
43
|
+
// For LS-backed licenses: check offline cache
|
|
44
|
+
if (license.licenseKey && cacheStatus(license) === "expired") return "free";
|
|
22
45
|
return license.tier;
|
|
23
46
|
}
|
|
24
47
|
|
|
25
48
|
/**
|
|
26
49
|
* Returns true if the license grants access to the given feature tier.
|
|
27
|
-
*
|
|
50
|
+
* Prism-feature TIER_RANK: spectrum = pro = 1, forge-pro = free = 0.
|
|
28
51
|
*/
|
|
29
52
|
export function hasFeatureTier(license: License, requiredTier: LicenseTier): boolean {
|
|
30
53
|
const tier = effectiveTier(license);
|
|
31
54
|
return TIER_RANK[tier] >= TIER_RANK[requiredTier];
|
|
32
55
|
}
|
|
33
56
|
|
|
34
|
-
/** Returns true if the license has an explicit feature flag. */
|
|
57
|
+
/** Returns true if the license has an explicit feature flag or is enterprise. */
|
|
35
58
|
export function hasFeature(license: License, feature: string): boolean {
|
|
36
59
|
if (effectiveTier(license) === "enterprise") return true;
|
|
37
60
|
return license.features.includes(feature);
|
|
38
61
|
}
|
|
62
|
+
|
|
63
|
+
/** True when this license activates forge0x2B Pro features. */
|
|
64
|
+
export function hasForge(license: License): boolean {
|
|
65
|
+
const tier = effectiveTier(license);
|
|
66
|
+
return tier === "forge-pro" || tier === "spectrum" || tier === "enterprise";
|
|
67
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prism0x2a",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.2",
|
|
4
4
|
"description": "prism0x2A — local-first code intelligence dashboard. Powered by prismlens.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"postbuild": "cp -r .next/static .next/standalone/.next/static && cp -r public .next/standalone/public",
|
|
23
23
|
"start": "next start -p 3001",
|
|
24
24
|
"lint": "eslint",
|
|
25
|
-
"test": "tsx --test lib/prism/monorepo/__tests__/detect.test.ts lib/prism/license/__tests__/license.test.ts",
|
|
25
|
+
"test": "tsx --test lib/prism/monorepo/__tests__/detect.test.ts lib/prism/license/__tests__/license.test.ts lib/prism/license/__tests__/lemonsqueezy.test.ts lib/prism/lemonsqueezy/__tests__/tierMapping.test.ts lib/prism/lemonsqueezy/__tests__/client.test.ts",
|
|
26
26
|
"prepublishOnly": "npm run build && npm test",
|
|
27
27
|
"prepare": "npm run build"
|
|
28
28
|
},
|
|
@@ -9,7 +9,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
|
|
|
9
9
|
const hostname = process.env.HOSTNAME || '0.0.0.0'
|
|
10
10
|
|
|
11
11
|
let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
|
|
12
|
-
const nextConfig = {"env":{"NEXT_PUBLIC_PRISM_VERSION":"0.
|
|
12
|
+
const nextConfig = {"env":{"NEXT_PUBLIC_PRISM_VERSION":"0.7.2"},"webpack":null,"typescript":{"ignoreBuildErrors":false},"typedRoutes":false,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":false,"customCacheHandler":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{"serverFunctions":true,"browserToTerminal":"warn"},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/Users/schuldes/prism-dashboard","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"appNewScrollHandler":false,"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"cachedNavigations":false,"partialFallbacks":false,"dynamicOnHover":false,"varyParams":false,"prefetchInlining":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":10,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"strictRouteTypes":false,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":true,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"gestureTransition":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":"warn","lockDistDir":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":true,"turbopackPluginRuntimeStrategy":"childProcesses","optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","turbopack":{"root":"/Users/schuldes/prism-dashboard"},"distDirRoot":".next"}
|
|
13
13
|
|
|
14
14
|
process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
|
|
15
15
|
|