/home/techb158/balavpn.abdallabala.com/.next/cache/webpack/server-production
Edit: /home/techb158/balavpn.abdallabala.com/.next/cache/webpack/server-production/10.pack (235832B)
wpc , webpack/lib/cache/PackFileCacheStrategyPackContentItems
ResolverCachePlugin|normal|default|alias=[|server-only$=|next/dist/compiled/server-only/empty|client-only$=|next/dist/compiled/client-only/error|next/dist/compiled/server-only$=|next/dist/compiled/server-only/empty|next/dist/compiled/client-only$=|next/dist/compiled/client-only/error|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\head.js=|next/dist/client/components/noop-head|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\image.js=|next/dist/api/image|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\constants.js=|next/dist/api/constants|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\router.js=|next/dist/api/router|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\dynamic.js=|next/dist/api/app-dynamic|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\script.js=|next/dist/api/script|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\link.js=|next/dist/client/app-dir/link|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\form.js=|next/dist/client/app-dir/form|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\navigation.js=|next/dist/api/navigation.react-server|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\headers.js=|next/dist/api/headers|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\og.js=|next/dist/api/og|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\server.js=|next/dist/api/server|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\document.js=|next/dist/api/document|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\app.js=|next/dist/api/app|react$=|next/dist/server/route-modules/app-page/vendored/rsc/react|react/compiler-runtime$=|next/dist/server/route-modules/app-page/vendored/rsc/react-compiler-runtime|react/jsx-dev-runtime$=|next/dist/server/route-modules/app-page/vendored/rsc/react-jsx-dev-runtime|react/jsx-runtime$=|next/dist/server/route-modules/app-page/vendored/rsc/react-jsx-runtime|react-dom$=|next/dist/server/route-modules/app-page/vendored/rsc/react-dom|react-dom/client$=|next/dist/compiled/react-dom/client|react-dom/server$=|next/dist/compiled/react-dom/server.node|react-dom/server.browser$=|next/dist/compiled/react-dom/server.browser|react-dom/server.edge$=|next/dist/build/webpack/alias/react-dom-server.js|react-dom/static$=|next/dist/compiled/react-dom/static.node|react-dom/static.browser$=|next/dist/compiled/react-dom/static.browser|react-dom/static.edge$=|next/dist/compiled/react-dom/static.edge|react-server-dom-webpack/client$=|next/dist/compiled/react-server-dom-webpack/client.node|react-server-dom-webpack/server$=|next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server|react-server-dom-webpack/server.node$=|next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server|react-server-dom-webpack/static$=|next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-static|@vercel/turbopack-ecmascript-runtime/browser/dev/hmr-client/hmr-client.ts=|next/dist/client/dev/noop-turbopack-hmr|next=|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next|]|mainFields=[|0=|main|]|conditionNames=[|0=|node|1=|require|]|fullySpecified=|false|dependencyType=|commonjs|modules=[|0=|node_modules|]|fallback=|false|exportsFields=[|0=|exports|]|importsFields=[|0=|imports|]|descriptionFiles=[|0=|package.json|]|extensions=[|0=|.js|1=|.json|2=|.node|]|enforceExtensions=|false|symlinks=|true|mainFiles=[|0=|index|]|roots=[|]|preferRelative=|false|preferAbsolute=|false|restrictions=[|]|path=|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\app\api\projects\[projectId]|request=|../../../../services/project-service ResolverCachePlugin|normal|default|alias=[|server-only$=|next/dist/compiled/server-only/empty|client-only$=|next/dist/compiled/client-only/error|next/dist/compiled/server-only$=|next/dist/compiled/server-only/empty|next/dist/compiled/client-only$=|next/dist/compiled/client-only/error|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\head.js=|next/dist/client/components/noop-head|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\image.js=|next/dist/api/image|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\constants.js=|next/dist/api/constants|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\router.js=|next/dist/api/router|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\dynamic.js=|next/dist/api/app-dynamic|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\script.js=|next/dist/api/script|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\link.js=|next/dist/client/app-dir/link|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\form.js=|next/dist/client/app-dir/form|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\navigation.js=|next/dist/api/navigation.react-server|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\headers.js=|next/dist/api/headers|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\og.js=|next/dist/api/og|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\server.js=|next/dist/api/server|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\document.js=|next/dist/api/document|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\app.js=|next/dist/api/app|react$=|next/dist/server/route-modules/app-page/vendored/rsc/react|react/compiler-runtime$=|next/dist/server/route-modules/app-page/vendored/rsc/react-compiler-runtime|react/jsx-dev-runtime$=|next/dist/server/route-modules/app-page/vendored/rsc/react-jsx-dev-runtime|react/jsx-runtime$=|next/dist/server/route-modules/app-page/vendored/rsc/react-jsx-runtime|react-dom$=|next/dist/server/route-modules/app-page/vendored/rsc/react-dom|react-dom/client$=|next/dist/compiled/react-dom/client|react-dom/server$=|next/dist/compiled/react-dom/server.node|react-dom/server.browser$=|next/dist/compiled/react-dom/server.browser|react-dom/server.edge$=|next/dist/build/webpack/alias/react-dom-server.js|react-dom/static$=|next/dist/compiled/react-dom/static.node|react-dom/static.browser$=|next/dist/compiled/react-dom/static.browser|react-dom/static.edge$=|next/dist/compiled/react-dom/static.edge|react-server-dom-webpack/client$=|next/dist/compiled/react-server-dom-webpack/client.node|react-server-dom-webpack/server$=|next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server|react-server-dom-webpack/server.node$=|next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server|react-server-dom-webpack/static$=|next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-static|@vercel/turbopack-ecmascript-runtime/browser/dev/hmr-client/hmr-client.ts=|next/dist/client/dev/noop-turbopack-hmr|next=|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next|]|mainFields=[|0=|main|]|conditionNames=[|0=|node|1=|require|]|fullySpecified=|false|dependencyType=|commonjs|modules=[|0=|node_modules|]|fallback=|false|exportsFields=[|0=|exports|]|importsFields=[|0=|imports|]|descriptionFiles=[|0=|package.json|]|extensions=[|0=|.js|1=|.json|2=|.node|]|enforceExtensions=|false|symlinks=|true|mainFiles=[|0=|index|]|roots=[|]|preferRelative=|false|preferAbsolute=|false|restrictions=[|]|path=|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\app\api\workspaces\[workspaceId]\projects|request=|../../../../../services/project-service ResolverCachePlugin|normal|default|alias=[|server-only$=|next/dist/compiled/server-only/empty|client-only$=|next/dist/compiled/client-only/error|next/dist/compiled/server-only$=|next/dist/compiled/server-only/empty|next/dist/compiled/client-only$=|next/dist/compiled/client-only/error|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\head.js=|next/dist/client/components/noop-head|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\image.js=|next/dist/api/image|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\constants.js=|next/dist/api/constants|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\router.js=|next/dist/api/router|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\dynamic.js=|next/dist/api/app-dynamic|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\script.js=|next/dist/api/script|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\link.js=|next/dist/client/app-dir/link|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\form.js=|next/dist/client/app-dir/form|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\navigation.js=|next/dist/api/navigation.react-server|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\headers.js=|next/dist/api/headers|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\og.js=|next/dist/api/og|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\server.js=|next/dist/api/server|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\document.js=|next/dist/api/document|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\app.js=|next/dist/api/app|react$=|next/dist/server/route-modules/app-page/vendored/rsc/react|react/compiler-runtime$=|next/dist/server/route-modules/app-page/vendored/rsc/react-compiler-runtime|react/jsx-dev-runtime$=|next/dist/server/route-modules/app-page/vendored/rsc/react-jsx-dev-runtime|react/jsx-runtime$=|next/dist/server/route-modules/app-page/vendored/rsc/react-jsx-runtime|react-dom$=|next/dist/server/route-modules/app-page/vendored/rsc/react-dom|react-dom/client$=|next/dist/compiled/react-dom/client|react-dom/server$=|next/dist/compiled/react-dom/server.node|react-dom/server.browser$=|next/dist/compiled/react-dom/server.browser|react-dom/server.edge$=|next/dist/build/webpack/alias/react-dom-server.js|react-dom/static$=|next/dist/compiled/react-dom/static.node|react-dom/static.browser$=|next/dist/compiled/react-dom/static.browser|react-dom/static.edge$=|next/dist/compiled/react-dom/static.edge|react-server-dom-webpack/client$=|next/dist/compiled/react-server-dom-webpack/client.node|react-server-dom-webpack/server$=|next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server|react-server-dom-webpack/server.node$=|next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server|react-server-dom-webpack/static$=|next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-static|@vercel/turbopack-ecmascript-runtime/browser/dev/hmr-client/hmr-client.ts=|next/dist/client/dev/noop-turbopack-hmr|next=|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next|]|mainFields=[|0=|module|1=|main|]|conditionNames=[|0=|react-server|1=|...|]|fullySpecified=|false|dependencyType=|commonjs|path=|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\app\api\projects\[projectId]|request=|../../../../services/project-service ResolverCachePlugin|normal|default|alias=[|server-only$=|next/dist/compiled/server-only/empty|client-only$=|next/dist/compiled/client-only/error|next/dist/compiled/server-only$=|next/dist/compiled/server-only/empty|next/dist/compiled/client-only$=|next/dist/compiled/client-only/error|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\head.js=|next/dist/client/components/noop-head|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\image.js=|next/dist/api/image|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\constants.js=|next/dist/api/constants|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\router.js=|next/dist/api/router|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\dynamic.js=|next/dist/api/app-dynamic|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\script.js=|next/dist/api/script|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\link.js=|next/dist/client/app-dir/link|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\form.js=|next/dist/client/app-dir/form|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\navigation.js=|next/dist/api/navigation.react-server|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\headers.js=|next/dist/api/headers|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\og.js=|next/dist/api/og|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\server.js=|next/dist/api/server|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\document.js=|next/dist/api/document|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\app.js=|next/dist/api/app|react$=|next/dist/server/route-modules/app-page/vendored/rsc/react|react/compiler-runtime$=|next/dist/server/route-modules/app-page/vendored/rsc/react-compiler-runtime|react/jsx-dev-runtime$=|next/dist/server/route-modules/app-page/vendored/rsc/react-jsx-dev-runtime|react/jsx-runtime$=|next/dist/server/route-modules/app-page/vendored/rsc/react-jsx-runtime|react-dom$=|next/dist/server/route-modules/app-page/vendored/rsc/react-dom|react-dom/client$=|next/dist/compiled/react-dom/client|react-dom/server$=|next/dist/compiled/react-dom/server.node|react-dom/server.browser$=|next/dist/compiled/react-dom/server.browser|react-dom/server.edge$=|next/dist/build/webpack/alias/react-dom-server.js|react-dom/static$=|next/dist/compiled/react-dom/static.node|react-dom/static.browser$=|next/dist/compiled/react-dom/static.browser|react-dom/static.edge$=|next/dist/compiled/react-dom/static.edge|react-server-dom-webpack/client$=|next/dist/compiled/react-server-dom-webpack/client.node|react-server-dom-webpack/server$=|next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server|react-server-dom-webpack/server.node$=|next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-server|react-server-dom-webpack/static$=|next/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-static|@vercel/turbopack-ecmascript-runtime/browser/dev/hmr-client/hmr-client.ts=|next/dist/client/dev/noop-turbopack-hmr|next=|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next|]|mainFields=[|0=|module|1=|main|]|conditionNames=[|0=|react-server|1=|...|]|fullySpecified=|false|dependencyType=|commonjs|path=|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\app\api\workspaces\[workspaceId]\projects|request=|../../../../../services/project-service Compilation/modules|javascript/auto|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\dist\build\webpack\loaders\next-flight-loader\index.js!C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\dist\build\webpack\loaders\next-swc-loader.js??ruleSet[1].rules[16].oneOf[4].use[0]!C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\services\project-service.js|rsc[ ResolverCachePlugin|normal|default|dependencyType=|esm|fallback=|false|exportsFields=[|0=|exports|]|importsFields=[|0=|imports|]|conditionNames=[|0=|node|1=|import|]|descriptionFiles=[|0=|package.json|]|enforceExtensions=|false|symlinks=|true|mainFields=[|0=|main|]|mainFiles=[|0=|index|]|roots=[|]|preferRelative=|false|preferAbsolute=|false|restrictions=[|]|alias=|false|path=|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\app\api\projects\[projectId]|request=|../../../../services/project-servicek ResolverCachePlugin|normal|default|dependencyType=|esm|fallback=|false|exportsFields=[|0=|exports|]|importsFields=[|0=|imports|]|conditionNames=[|0=|node|1=|import|]|descriptionFiles=[|0=|package.json|]|enforceExtensions=|false|symlinks=|true|mainFields=[|0=|main|]|mainFiles=[|0=|index|]|roots=[|]|preferRelative=|false|preferAbsolute=|false|restrictions=[|]|alias=|false|path=|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\app\api\workspaces\[workspaceId]\projects|request=|../../../../../services/project-service Compilation/codeGeneration|javascript/auto|C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\dist\build\webpack\loaders\next-flight-loader\index.js!C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\dist\build\webpack\loaders\next-swc-loader.js??ruleSet[1].rules[16].oneOf[4].use[0]!C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\services\project-service.js|rsc|webpack-runtimeCompilation/assets|chunk9978MinifierWebpackPlugin|9978.jswebpack/lib/cache/ResolverCachePlugin`_ResolverCachePluginCacheMisscontextpathrequestqueryfragmentmoduledirectoryfileinternalfullySpecifieddescriptionFilePathdescriptionFileDatadescriptionFileRootrelativePath C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\services\project-service.js C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\package.jsonnameversionprivatedescriptionscriptsdependenciesdevDependenciesenginescosmic-ai-risk-saas0.1.0 Commercial SaaS rebuild of the COSMIC AI-Risk Dashboard with multi-tenant workspaces, PostgreSQL, Prisma, invite-only auth, billing entitlements, and enterprise-ready boundaries.`devbuildstartlinttestprisma:generatedb:migratedb:pushdb:seedcheck:configtest:locallocal:fallbackmock-oidcdev:ssosso:setupnext dev -p 8091next buildnext start -p 8091next lint node tests/saas-domain.test.js && node tests/tenant-security.test.js && node tests/idempotency.test.js && node tests/metrics.test.js && node tests/oidc.test.js && node tests/rate-limit.test.js && node tests/integration-service.test.jsprisma generateprisma migrate deployprisma db pushnode prisma/seed.jsnode scripts/check-config.jsnode tests/local-server.test.jsnode local-server.jsnode mock-oidc-provider.jsnode mock-oidc-provider.js & npm run dev@prisma/clientbcryptjsnextreactreact-domstripezod^5.22.0^2.4.3^15.0.3^19.0.0^17.3.1^3.23.8eslinteslint-config-nextprisma^9.14.0node>=20.11.0 C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app./src/services/project-service.jswebpack/lib/FileSystemInfoSnapshot@ P_yB`
C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\srcC:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\applicationC:\Users\abd_b\OneDriveC:\Users\abd_b\OneDrive\DesktopC:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission FreezeC:\Users\abd_bC:\C:\Users C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\servicessafeTimetimestamphash! `yyB `yyB36eec3f057a5f493! ќyB @˜yB404ac705cc6d108a @ C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\app\api\projects\[projectId]\package.json C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\app\api\projects\package.json C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\app\api\package.json C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\app\package.json C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\package.json C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\services\package.json C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\services\project-service @ P_yB`
! ќyB @˜yB ~ } | { z y x w v u @ C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\app\api\workspaces\[workspaceId]\projects\package.json C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\app\api\workspaces\[workspaceId]\package.json C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\app\api\workspaces\package.json rissuerissuerLayercompiler C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\app\api\projects\[projectId]\route.jsrscserverl m@ _yBk _yB`k! ќyB @˜yB _ ^ ] \ [ Z Y X W VX C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\src\app\api\workspaces\[workspaceId]\projects\route.jsX Y@ _yBWwebpack/lib/NormalModulewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource "use strict";
const { prisma } = require("../lib/prisma");
const { buildEntitlements, assertWithinLimit } = require("../domain/entitlements");
const { writeAuditEvent } = require("./audit-service");
async function getLatestSubscription(organizationId) {
return prisma.subscription.findFirst({
where: {
organizationId
},
orderBy: {
createdAt: "desc"
}
});
}
async function listWorkspaceProjects(workspaceId) {
return prisma.project.findMany({
where: {
workspaceId
},
orderBy: {
createdAt: "desc"
}
});
}
async function createProject({ workspace, actor, payload, request }) {
const subscription = await getLatestSubscription(workspace.organizationId);
const organization = await prisma.organization.findUnique({
where: {
id: workspace.organizationId
}
});
const entitlements = buildEntitlements(subscription, organization);
const currentCount = await prisma.project.count({
where: {
workspace: {
organizationId: workspace.organizationId
}
}
});
assertWithinLimit(entitlements, "projects", currentCount, 1);
const project = await prisma.project.create({
data: {
workspaceId: workspace.id,
name: payload.name,
subtitle: payload.subtitle || "COSMIC AI risk measurement workspace",
projectType: payload.projectType || "AI-Enabler",
currentLifecyclePhase: payload.currentLifecyclePhase || "Needs identification",
riskAppetite: Number(payload.riskAppetite || 50),
assessmentDate: payload.assessmentDate ? new Date(payload.assessmentDate) : new Date(),
status: "Active",
ownerDisplayName: payload.ownerDisplayName || actor.displayName,
description: payload.description || "",
thresholds: payload.thresholds || {},
reviews: payload.reviews || {}
}
});
await writeAuditEvent({
organizationId: workspace.organizationId,
workspaceId: workspace.id,
projectId: project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "create",
afterJson: project,
request
});
return project;
}
async function getProject(projectId) {
const project = await prisma.project.findUnique({
where: {
id: projectId
},
include: {
lifecyclePhases: {
orderBy: {
sequence: "asc"
}
},
risks: {
include: {
mitigations: true,
evidence: true
}
},
indicators: true,
experiments: {
include: {
metrics: true
}
}
}
});
if (!project) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
return project;
}
async function updateProject({ projectScope, actor, payload, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectScope.project.id
}
});
const project = await prisma.project.update({
where: {
id: projectScope.project.id
},
data: {
name: payload.name ?? before.name,
subtitle: payload.subtitle ?? before.subtitle,
projectType: payload.projectType ?? before.projectType,
currentLifecyclePhase: payload.currentLifecyclePhase ?? before.currentLifecyclePhase,
riskAppetite: payload.riskAppetite !== undefined ? Number(payload.riskAppetite) : before.riskAppetite,
status: payload.status ?? before.status,
ownerDisplayName: payload.ownerDisplayName ?? before.ownerDisplayName,
description: payload.description ?? before.description,
thresholds: payload.thresholds ?? before.thresholds,
reviews: payload.reviews ?? before.reviews
}
});
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId: projectScope.project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "update",
beforeJson: before,
afterJson: project,
request
});
return project;
}
async function deleteProject({ projectScope, projectId, actor, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectId
}
});
if (!before) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId,
actorUserId: actor.id,
entityType: "Project",
entityId: projectId,
action: "delete",
beforeJson: before,
request
}).catch(()=>{});
const expIds = (await prisma.experiment.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((e)=>e.id);
await prisma.modelMetric.deleteMany({
where: {
experimentId: {
in: expIds
}
}
});
await prisma.auditEvent.deleteMany({
where: {
projectId
}
});
await prisma.reportExport.deleteMany({
where: {
projectId
}
});
await prisma.externalWorkItemMapping.deleteMany({
where: {
projectId
}
});
await prisma.integrationSyncRun.deleteMany({
where: {
projectId
}
});
const gateIds = (await prisma.gateEvaluation.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((g)=>g.id);
await prisma.gateDecision.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateCriterion.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateEvaluation.deleteMany({
where: {
projectId
}
});
await prisma.evidence.deleteMany({
where: {
projectId
}
});
const riskIds = (await prisma.risk.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((r)=>r.id);
await prisma.mitigation.deleteMany({
where: {
riskId: {
in: riskIds
}
}
});
await prisma.risk.deleteMany({
where: {
projectId
}
});
await prisma.experiment.deleteMany({
where: {
projectId
}
});
await prisma.lifecyclePhase.deleteMany({
where: {
projectId
}
});
await prisma.indicator.deleteMany({
where: {
projectId
}
});
await prisma.project.delete({
where: {
id: projectId
}
});
return {
deleted: true
};
}
module.exports = {
getLatestSubscription,
listWorkspaceProjects,
createProject,
getProject,
updateProject,
deleteProject
};
javascript/autoaliasmainFieldsconditionNamesD`$server-only$client-only$next/dist/compiled/server-only$next/dist/compiled/client-only$ C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\head.js C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\image.js C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\constants.js C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\router.js C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\dynamic.js C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\script.js C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\link.js C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\form.js C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\navigation.js C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\headers.js C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\og.js C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\server.js C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\document.js C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\app.jsreact$react/compiler-runtime$react/jsx-dev-runtime$react/jsx-runtime$react-dom$react-dom/client$react-dom/server$react-dom/server.browser$react-dom/server.edge$react-dom/static$react-dom/static.browser$react-dom/static.edge$react-server-dom-webpack/client$react-server-dom-webpack/server$react-server-dom-webpack/server.node$react-server-dom-webpack/static$@vercel/turbopack-ecmascript-runtime/browser/dev/hmr-client/hmr-client.tsVnext/dist/compiled/server-only/emptynext/dist/compiled/client-only/errornext/dist/client/components/noop-headnext/dist/api/imagenext/dist/api/constantsnext/dist/api/routernext/dist/api/app-dynamicnext/dist/api/scriptnext/dist/client/app-dir/linknext/dist/client/app-dir/formnext/dist/api/navigation.react-servernext/dist/api/headersnext/dist/api/ognext/dist/api/servernext/dist/api/documentnext/dist/api/appnext/dist/server/route-modules/app-page/vendored/rsc/reactnext/dist/server/route-modules/app-page/vendored/rsc/react-compiler-runtimenext/dist/server/route-modules/app-page/vendored/rsc/react-jsx-dev-runtimenext/dist/server/route-modules/app-page/vendored/rsc/react-jsx-runtimenext/dist/server/route-modules/app-page/vendored/rsc/react-domnext/dist/compiled/react-dom/clientnext/dist/compiled/react-dom/server.nodenext/dist/compiled/react-dom/server.browsernext/dist/build/webpack/alias/react-dom-server.jsnext/dist/compiled/react-dom/static.nodenext/dist/compiled/react-dom/static.browsernext/dist/compiled/react-dom/static.edgenext/dist/compiled/react-server-dom-webpack/client.nodenext/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-servernext/dist/server/route-modules/app-page/vendored/rsc/react-server-dom-webpack-staticnext/dist/client/dev/noop-turbopack-hmr C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\nextmainreact-server...
`cacheableparsedfileDependenciescontextDependenciesmissingDependenciesbuildDependenciesvalueDependenciesLassetsassetsInfostricttopLevelDeclarationssnapshotwebpack/lib/util/LazySet C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\dist\build\webpack\loaders\next-flight-loader\index.js C:\Users\abd_b\OneDrive\Desktop\COSMIC AI-Risk Dashboard\Step 12 is complete Final QA, Demo Readiness, and Submission Freeze\application\saas-app\node_modules\next\dist\build\webpack\loaders\next-swc-loader.js webpack/DefinePlugin_hashb5546ded45df2f9ac13e8157typeactionIdsclientRefsclientEntryTypeisClientRefv
getLatestSubscriptionlistWorkspaceProjectscreateProjectgetProjectupdateProjectdeleteProjectbuildEntitlementsassertWithinLimitwriteAuditEvent _yB 0webpack/lib/dependencies/ConstDependency `
`
webpack/lib/dependencies/RequireHeaderDependencya!(
b+als
b1RA
b6webpack/lib/dependencies/CommonJsRequireDependency../lib/prisma a)8
b+../domain/entitlements `t@
b1R./audit-service A
b6webpack/lib/dependencies/CommonJsSelfReferenceDependency
A~ module.exports
@ @ `
@ _yB
;[) @ _yB
5U;
sourcesruntimeRequirementsdata
javascriptwebpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource "use strict";
const { prisma } = require("../lib/prisma");
const { buildEntitlements, assertWithinLimit } = require("../domain/entitlements");
const { writeAuditEvent } = require("./audit-service");
async function getLatestSubscription(organizationId) {
return prisma.subscription.findFirst({
where: {
organizationId
},
orderBy: {
createdAt: "desc"
}
});
}
async function listWorkspaceProjects(workspaceId) {
return prisma.project.findMany({
where: {
workspaceId
},
orderBy: {
createdAt: "desc"
}
});
}
async function createProject({ workspace, actor, payload, request }) {
const subscription = await getLatestSubscription(workspace.organizationId);
const organization = await prisma.organization.findUnique({
where: {
id: workspace.organizationId
}
});
const entitlements = buildEntitlements(subscription, organization);
const currentCount = await prisma.project.count({
where: {
workspace: {
organizationId: workspace.organizationId
}
}
});
assertWithinLimit(entitlements, "projects", currentCount, 1);
const project = await prisma.project.create({
data: {
workspaceId: workspace.id,
name: payload.name,
subtitle: payload.subtitle || "COSMIC AI risk measurement workspace",
projectType: payload.projectType || "AI-Enabler",
currentLifecyclePhase: payload.currentLifecyclePhase || "Needs identification",
riskAppetite: Number(payload.riskAppetite || 50),
assessmentDate: payload.assessmentDate ? new Date(payload.assessmentDate) : new Date(),
status: "Active",
ownerDisplayName: payload.ownerDisplayName || actor.displayName,
description: payload.description || "",
thresholds: payload.thresholds || {},
reviews: payload.reviews || {}
}
});
await writeAuditEvent({
organizationId: workspace.organizationId,
workspaceId: workspace.id,
projectId: project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "create",
afterJson: project,
request
});
return project;
}
async function getProject(projectId) {
const project = await prisma.project.findUnique({
where: {
id: projectId
},
include: {
lifecyclePhases: {
orderBy: {
sequence: "asc"
}
},
risks: {
include: {
mitigations: true,
evidence: true
}
},
indicators: true,
experiments: {
include: {
metrics: true
}
}
}
});
if (!project) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
return project;
}
async function updateProject({ projectScope, actor, payload, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectScope.project.id
}
});
const project = await prisma.project.update({
where: {
id: projectScope.project.id
},
data: {
name: payload.name ?? before.name,
subtitle: payload.subtitle ?? before.subtitle,
projectType: payload.projectType ?? before.projectType,
currentLifecyclePhase: payload.currentLifecyclePhase ?? before.currentLifecyclePhase,
riskAppetite: payload.riskAppetite !== undefined ? Number(payload.riskAppetite) : before.riskAppetite,
status: payload.status ?? before.status,
ownerDisplayName: payload.ownerDisplayName ?? before.ownerDisplayName,
description: payload.description ?? before.description,
thresholds: payload.thresholds ?? before.thresholds,
reviews: payload.reviews ?? before.reviews
}
});
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId: projectScope.project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "update",
beforeJson: before,
afterJson: project,
request
});
return project;
}
async function deleteProject({ projectScope, projectId, actor, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectId
}
});
if (!before) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId,
actorUserId: actor.id,
entityType: "Project",
entityId: projectId,
action: "delete",
beforeJson: before,
request
}).catch(()=>{});
const expIds = (await prisma.experiment.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((e)=>e.id);
await prisma.modelMetric.deleteMany({
where: {
experimentId: {
in: expIds
}
}
});
await prisma.auditEvent.deleteMany({
where: {
projectId
}
});
await prisma.reportExport.deleteMany({
where: {
projectId
}
});
await prisma.externalWorkItemMapping.deleteMany({
where: {
projectId
}
});
await prisma.integrationSyncRun.deleteMany({
where: {
projectId
}
});
const gateIds = (await prisma.gateEvaluation.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((g)=>g.id);
await prisma.gateDecision.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateCriterion.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateEvaluation.deleteMany({
where: {
projectId
}
});
await prisma.evidence.deleteMany({
where: {
projectId
}
});
const riskIds = (await prisma.risk.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((r)=>r.id);
await prisma.mitigation.deleteMany({
where: {
riskId: {
in: riskIds
}
}
});
await prisma.risk.deleteMany({
where: {
projectId
}
});
await prisma.experiment.deleteMany({
where: {
projectId
}
});
await prisma.lifecyclePhase.deleteMany({
where: {
projectId
}
});
await prisma.indicator.deleteMany({
where: {
projectId
}
});
await prisma.project.delete({
where: {
id: projectId
}
});
return {
deleted: true
};
}
module.exports = {
getLatestSubscription,
listWorkspaceProjects,
createProject,
getProject,
updateProject,
deleteProject
};
g!')7lrtD __webpack_require__796487633518buffersourcesizemaps
const { prisma } = __webpack_require__(7964);
const { buildEntitlements, assertWithinLimit } = __webpack_require__(8763);
const { writeAuditEvent } = __webpack_require__(3518);
async function getLatestSubscription(organizationId) {
return prisma.subscription.findFirst({
where: {
organizationId
},
orderBy: {
createdAt: "desc"
}
});
}
async function listWorkspaceProjects(workspaceId) {
return prisma.project.findMany({
where: {
workspaceId
},
orderBy: {
createdAt: "desc"
}
});
}
async function createProject({ workspace, actor, payload, request }) {
const subscription = await getLatestSubscription(workspace.organizationId);
const organization = await prisma.organization.findUnique({
where: {
id: workspace.organizationId
}
});
const entitlements = buildEntitlements(subscription, organization);
const currentCount = await prisma.project.count({
where: {
workspace: {
organizationId: workspace.organizationId
}
}
});
assertWithinLimit(entitlements, "projects", currentCount, 1);
const project = await prisma.project.create({
data: {
workspaceId: workspace.id,
name: payload.name,
subtitle: payload.subtitle || "COSMIC AI risk measurement workspace",
projectType: payload.projectType || "AI-Enabler",
currentLifecyclePhase: payload.currentLifecyclePhase || "Needs identification",
riskAppetite: Number(payload.riskAppetite || 50),
assessmentDate: payload.assessmentDate ? new Date(payload.assessmentDate) : new Date(),
status: "Active",
ownerDisplayName: payload.ownerDisplayName || actor.displayName,
description: payload.description || "",
thresholds: payload.thresholds || {},
reviews: payload.reviews || {}
}
});
await writeAuditEvent({
organizationId: workspace.organizationId,
workspaceId: workspace.id,
projectId: project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "create",
afterJson: project,
request
});
return project;
}
async function getProject(projectId) {
const project = await prisma.project.findUnique({
where: {
id: projectId
},
include: {
lifecyclePhases: {
orderBy: {
sequence: "asc"
}
},
risks: {
include: {
mitigations: true,
evidence: true
}
},
indicators: true,
experiments: {
include: {
metrics: true
}
}
}
});
if (!project) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
return project;
}
async function updateProject({ projectScope, actor, payload, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectScope.project.id
}
});
const project = await prisma.project.update({
where: {
id: projectScope.project.id
},
data: {
name: payload.name ?? before.name,
subtitle: payload.subtitle ?? before.subtitle,
projectType: payload.projectType ?? before.projectType,
currentLifecyclePhase: payload.currentLifecyclePhase ?? before.currentLifecyclePhase,
riskAppetite: payload.riskAppetite !== undefined ? Number(payload.riskAppetite) : before.riskAppetite,
status: payload.status ?? before.status,
ownerDisplayName: payload.ownerDisplayName ?? before.ownerDisplayName,
description: payload.description ?? before.description,
thresholds: payload.thresholds ?? before.thresholds,
reviews: payload.reviews ?? before.reviews
}
});
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId: projectScope.project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "update",
beforeJson: before,
afterJson: project,
request
});
return project;
}
async function deleteProject({ projectScope, projectId, actor, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectId
}
});
if (!before) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId,
actorUserId: actor.id,
entityType: "Project",
entityId: projectId,
action: "delete",
beforeJson: before,
request
}).catch(()=>{});
const expIds = (await prisma.experiment.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((e)=>e.id);
await prisma.modelMetric.deleteMany({
where: {
experimentId: {
in: expIds
}
}
});
await prisma.auditEvent.deleteMany({
where: {
projectId
}
});
await prisma.reportExport.deleteMany({
where: {
projectId
}
});
await prisma.externalWorkItemMapping.deleteMany({
where: {
projectId
}
});
await prisma.integrationSyncRun.deleteMany({
where: {
projectId
}
});
const gateIds = (await prisma.gateEvaluation.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((g)=>g.id);
await prisma.gateDecision.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateCriterion.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateEvaluation.deleteMany({
where: {
projectId
}
});
await prisma.evidence.deleteMany({
where: {
projectId
}
});
const riskIds = (await prisma.risk.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((r)=>r.id);
await prisma.mitigation.deleteMany({
where: {
riskId: {
in: riskIds
}
}
});
await prisma.risk.deleteMany({
where: {
projectId
}
});
await prisma.experiment.deleteMany({
where: {
projectId
}
});
await prisma.lifecyclePhase.deleteMany({
where: {
projectId
}
});
await prisma.indicator.deleteMany({
where: {
projectId
}
});
await prisma.project.delete({
where: {
id: projectId
}
});
return {
deleted: true
};
}
module.exports = {
getLatestSubscription,
listWorkspaceProjects,
createProject,
getProject,
updateProject,
deleteProject
};
{"finalSource":true}mapbufferedMap ReplaceSourceRawSourceK 012undefined3339__webpack_require__undefined41557964undefined108114__webpack_require__undefined1161398763undefined171177__webpack_require__undefined1791953518undefined __webpack_require__G webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSource`webpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceJ exports.id = 9978;
exports.ids = [9978];
exports.modules = {
/***/ 2488:
webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource$ /***/ ((module) => {
"use strict";
webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourcel "use strict";
function jsonResponse(payload, status = 200, headers = {}) {
return Response.json(payload, {
status,
headers: Object.assign({
"Cache-Control": "no-store"
}, headers)
});
}
function errorResponse(error) {
return jsonResponse({
error: error.message || "Unexpected error",
details: error.details || undefined
}, error.status || 500);
}
async function parseJson(request) {
const text = await request.text();
if (!text) return {};
return JSON.parse(text);
}
module.exports = {
jsonResponse,
errorResponse,
parseJson
};
`buffersourcesizemapshash_
function jsonResponse(payload, status = 200, headers = {}) {
return Response.json(payload, {
status,
headers: Object.assign({
"Cache-Control": "no-store"
}, headers)
});
}
function errorResponse(error) {
return jsonResponse({
error: error.message || "Unexpected error",
details: error.details || undefined
}, error.status || 500);
}
async function parseJson(request) {
const text = await request.text();
if (!text) return {};
return JSON.parse(text);
}
module.exports = {
jsonResponse,
errorResponse,
parseJson
};
{"finalSource":true}mapbufferedMap ReplaceSourceRawSourcel "use strict";
function jsonResponse(payload, status = 200, headers = {}) {
return Response.json(payload, {
status,
headers: Object.assign({
"Cache-Control": "no-store"
}, headers)
});
}
function errorResponse(error) {
return jsonResponse({
error: error.message || "Unexpected error",
details: error.details || undefined
}, error.status || 500);
}
async function parseJson(request) {
const text = await request.text();
if (!text) return {};
return JSON.parse(text);
}
module.exports = {
jsonResponse,
errorResponse,
parseJson
};
012undefined
/***/ })buffersourcesizemapshash /***/ ((module) => {
"use strict";
function jsonResponse(payload, status = 200, headers = {}) {
return Response.json(payload, {
status,
headers: Object.assign({
"Cache-Control": "no-store"
}, headers)
});
}
function errorResponse(error) {
return jsonResponse({
error: error.message || "Unexpected error",
details: error.details || undefined
}, error.status || 500);
}
async function parseJson(request) {
const text = await request.text();
if (!text) return {};
return JSON.parse(text);
}
module.exports = {
jsonResponse,
errorResponse,
parseJson
};
/***/ }){"finalSource":true}mapbufferedMap ConcatSourceRawSource$ /***/ ((module) => {
"use strict";
ReplaceSourceRawSourcel "use strict";
function jsonResponse(payload, status = 200, headers = {}) {
return Response.json(payload, {
status,
headers: Object.assign({
"Cache-Control": "no-store"
}, headers)
});
}
function errorResponse(error) {
return jsonResponse({
error: error.message || "Unexpected error",
details: error.details || undefined
}, error.status || 500);
}
async function parseJson(request) {
const text = await request.text();
if (!text) return {};
return JSON.parse(text);
}
module.exports = {
jsonResponse,
errorResponse,
parseJson
};
012undefined RawSource
/***/ }) ,
/***/ 2773:
# webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceS /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource
"use strict";
const { prisma } = require("./prisma");
async function getActorFromRequest(request) {
const cookie = request.headers.get("cookie") || "";
const sessionMatch = cookie.match(/cosmic_session=([^;]+)/);
if (sessionMatch) {
const session = await prisma.session.findUnique({
where: {
token: sessionMatch[1]
},
include: {
user: {
include: {
memberships: {
where: {
status: "ACTIVE"
},
include: {
role: true,
organization: true
}
}
}
}
}
});
if (session && session.expiresAt > new Date()) {
return session.user;
}
if (session) {
await prisma.session.delete({
where: {
id: session.id
}
}).catch(()=>{});
}
}
const email = request.headers.get("x-cosmic-user-email") || process.env.COSMIC_BOOTSTRAP_EMAIL || "owner@cosmic.local";
const user = await prisma.user.findUnique({
where: {
email
},
include: {
memberships: {
where: {
status: "ACTIVE"
},
include: {
role: true,
organization: true
}
}
}
});
if (!user) {
const error = new Error(`Unknown actor: ${email}`);
error.status = 401;
throw error;
}
return user;
}
function getMembership(actor, organizationId) {
return actor.memberships.find((item)=>item.organizationId === organizationId && item.status === "ACTIVE");
}
async function requireOrganizationActor(request, organizationId, permission = "project:read") {
const { hasPermission } = require("../domain/permissions");
const actor = await getActorFromRequest(request);
const membership = getMembership(actor, organizationId);
if (!membership) {
const error = new Error("Actor is not a member of this organization.");
error.status = 403;
throw error;
}
if (!hasPermission(membership.role.permissions, permission)) {
const error = new Error(`Permission denied: ${permission}`);
error.status = 403;
throw error;
}
return {
actor,
membership,
organization: membership.organization
};
}
module.exports = {
getActorFromRequest,
requireOrganizationActor
};
d!')2C( . 0 F __webpack_require__79645707buffersourcesizemapshash
const { prisma } = __webpack_require__(7964);
async function getActorFromRequest(request) {
const cookie = request.headers.get("cookie") || "";
const sessionMatch = cookie.match(/cosmic_session=([^;]+)/);
if (sessionMatch) {
const session = await prisma.session.findUnique({
where: {
token: sessionMatch[1]
},
include: {
user: {
include: {
memberships: {
where: {
status: "ACTIVE"
},
include: {
role: true,
organization: true
}
}
}
}
}
});
if (session && session.expiresAt > new Date()) {
return session.user;
}
if (session) {
await prisma.session.delete({
where: {
id: session.id
}
}).catch(()=>{});
}
}
const email = request.headers.get("x-cosmic-user-email") || process.env.COSMIC_BOOTSTRAP_EMAIL || "owner@cosmic.local";
const user = await prisma.user.findUnique({
where: {
email
},
include: {
memberships: {
where: {
status: "ACTIVE"
},
include: {
role: true,
organization: true
}
}
}
});
if (!user) {
const error = new Error(`Unknown actor: ${email}`);
error.status = 401;
throw error;
}
return user;
}
function getMembership(actor, organizationId) {
return actor.memberships.find((item)=>item.organizationId === organizationId && item.status === "ACTIVE");
}
async function requireOrganizationActor(request, organizationId, permission = "project:read") {
const { hasPermission } = __webpack_require__(5707);
const actor = await getActorFromRequest(request);
const membership = getMembership(actor, organizationId);
if (!membership) {
const error = new Error("Actor is not a member of this organization.");
error.status = 403;
throw error;
}
if (!hasPermission(membership.role.permissions, permission)) {
const error = new Error(`Permission denied: ${permission}`);
error.status = 403;
throw error;
}
return {
actor,
membership,
organization: membership.organization
};
}
module.exports = {
getActorFromRequest,
requireOrganizationActor
};
{"finalSource":true}mapbufferedMap ReplaceSourceRawSource
"use strict";
const { prisma } = require("./prisma");
async function getActorFromRequest(request) {
const cookie = request.headers.get("cookie") || "";
const sessionMatch = cookie.match(/cosmic_session=([^;]+)/);
if (sessionMatch) {
const session = await prisma.session.findUnique({
where: {
token: sessionMatch[1]
},
include: {
user: {
include: {
memberships: {
where: {
status: "ACTIVE"
},
include: {
role: true,
organization: true
}
}
}
}
}
});
if (session && session.expiresAt > new Date()) {
return session.user;
}
if (session) {
await prisma.session.delete({
where: {
id: session.id
}
}).catch(()=>{});
}
}
const email = request.headers.get("x-cosmic-user-email") || process.env.COSMIC_BOOTSTRAP_EMAIL || "owner@cosmic.local";
const user = await prisma.user.findUnique({
where: {
email
},
include: {
memberships: {
where: {
status: "ACTIVE"
},
include: {
role: true,
organization: true
}
}
}
});
if (!user) {
const error = new Error(`Unknown actor: ${email}`);
error.status = 401;
throw error;
}
return user;
}
function getMembership(actor, organizationId) {
return actor.memberships.find((item)=>item.organizationId === organizationId && item.status === "ACTIVE");
}
async function requireOrganizationActor(request, organizationId, permission = "project:read") {
const { hasPermission } = require("../domain/permissions");
const actor = await getActorFromRequest(request);
const membership = getMembership(actor, organizationId);
if (!membership) {
const error = new Error("Actor is not a member of this organization.");
error.status = 403;
throw error;
}
if (!hasPermission(membership.role.permissions, permission)) {
const error = new Error(`Permission denied: ${permission}`);
error.status = 403;
throw error;
}
return {
actor,
membership,
organization: membership.organization
};
}
module.exports = {
getActorFromRequest,
requireOrganizationActor
};
v 012undefined3339__webpack_require__undefined41507964undefined20882094__webpack_require__undefined209621185707undefined
/***/ }) /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
const { prisma } = __webpack_require__(7964);
async function getActorFromRequest(request) {
const cookie = request.headers.get("cookie") || "";
const sessionMatch = cookie.match(/cosmic_session=([^;]+)/);
if (sessionMatch) {
const session = await prisma.session.findUnique({
where: {
token: sessionMatch[1]
},
include: {
user: {
include: {
memberships: {
where: {
status: "ACTIVE"
},
include: {
role: true,
organization: true
}
}
}
}
}
});
if (session && session.expiresAt > new Date()) {
return session.user;
}
if (session) {
await prisma.session.delete({
where: {
id: session.id
}
}).catch(()=>{});
}
}
const email = request.headers.get("x-cosmic-user-email") || process.env.COSMIC_BOOTSTRAP_EMAIL || "owner@cosmic.local";
const user = await prisma.user.findUnique({
where: {
email
},
include: {
memberships: {
where: {
status: "ACTIVE"
},
include: {
role: true,
organization: true
}
}
}
});
if (!user) {
const error = new Error(`Unknown actor: ${email}`);
error.status = 401;
throw error;
}
return user;
}
function getMembership(actor, organizationId) {
return actor.memberships.find((item)=>item.organizationId === organizationId && item.status === "ACTIVE");
}
async function requireOrganizationActor(request, organizationId, permission = "project:read") {
const { hasPermission } = __webpack_require__(5707);
const actor = await getActorFromRequest(request);
const membership = getMembership(actor, organizationId);
if (!membership) {
const error = new Error("Actor is not a member of this organization.");
error.status = 403;
throw error;
}
if (!hasPermission(membership.role.permissions, permission)) {
const error = new Error(`Permission denied: ${permission}`);
error.status = 403;
throw error;
}
return {
actor,
membership,
organization: membership.organization
};
}
module.exports = {
getActorFromRequest,
requireOrganizationActor
};
/***/ })S /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
"use strict";
const { prisma } = require("./prisma");
async function getActorFromRequest(request) {
const cookie = request.headers.get("cookie") || "";
const sessionMatch = cookie.match(/cosmic_session=([^;]+)/);
if (sessionMatch) {
const session = await prisma.session.findUnique({
where: {
token: sessionMatch[1]
},
include: {
user: {
include: {
memberships: {
where: {
status: "ACTIVE"
},
include: {
role: true,
organization: true
}
}
}
}
}
});
if (session && session.expiresAt > new Date()) {
return session.user;
}
if (session) {
await prisma.session.delete({
where: {
id: session.id
}
}).catch(()=>{});
}
}
const email = request.headers.get("x-cosmic-user-email") || process.env.COSMIC_BOOTSTRAP_EMAIL || "owner@cosmic.local";
const user = await prisma.user.findUnique({
where: {
email
},
include: {
memberships: {
where: {
status: "ACTIVE"
},
include: {
role: true,
organization: true
}
}
}
});
if (!user) {
const error = new Error(`Unknown actor: ${email}`);
error.status = 401;
throw error;
}
return user;
}
function getMembership(actor, organizationId) {
return actor.memberships.find((item)=>item.organizationId === organizationId && item.status === "ACTIVE");
}
async function requireOrganizationActor(request, organizationId, permission = "project:read") {
const { hasPermission } = require("../domain/permissions");
const actor = await getActorFromRequest(request);
const membership = getMembership(actor, organizationId);
if (!membership) {
const error = new Error("Actor is not a member of this organization.");
error.status = 403;
throw error;
}
if (!hasPermission(membership.role.permissions, permission)) {
const error = new Error(`Permission denied: ${permission}`);
error.status = 403;
throw error;
}
return {
actor,
membership,
organization: membership.organization
};
}
module.exports = {
getActorFromRequest,
requireOrganizationActor
};
v 012undefined3339__webpack_require__undefined41507964undefined20882094__webpack_require__undefined209621185707undefined ,
/***/ 3421:
( webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceS /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource
webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource var __webpack_unused_export__;
webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSource "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "sendResponse", {
enumerable: true,
get: function() {
return sendResponse;
}
});
const _helpers = require("./base-http/helpers");
const _pipereadable = require("./pipe-readable");
const _utils = require("./web/utils");
async function sendResponse(req, res, response, waitUntil) {
if (// The type check here ensures that `req` is correctly typed, and the
// environment variable check provides dead code elimination.
process.env.NEXT_RUNTIME !== 'edge' && (0, _helpers.isNodeNextResponse)(res)) {
var // Copy over the response headers.
_response_headers;
// Copy over the response status.
res.statusCode = response.status;
res.statusMessage = response.statusText;
// TODO: this is not spec-compliant behavior and we should not restrict
// headers that are allowed to appear many times.
//
// See:
// https://github.com/vercel/next.js/pull/70127
const headersWithMultipleValuesAllowed = [
// can add more headers to this list if needed
'set-cookie',
'www-authenticate',
'proxy-authenticate',
'vary'
];
(_response_headers = response.headers) == null ? void 0 : _response_headers.forEach((value, name)=>{
// `x-middleware-set-cookie` is an internal header not needed for the response
if (name.toLowerCase() === 'x-middleware-set-cookie') {
return;
}
// The append handling is special cased for `set-cookie`.
if (name.toLowerCase() === 'set-cookie') {
// TODO: (wyattjoh) replace with native response iteration when we can upgrade undici
for (const cookie of (0, _utils.splitCookiesString)(value)){
res.appendHeader(name, cookie);
}
} else {
// only append the header if it is either not present in the outbound response
// or if the header supports multiple values
const isHeaderPresent = typeof res.getHeader(name) !== 'undefined';
if (headersWithMultipleValuesAllowed.includes(name.toLowerCase()) || !isHeaderPresent) {
res.appendHeader(name, value);
}
}
});
/**
* The response can't be directly piped to the underlying response. The
* following is duplicated from the edge runtime handler.
*
* See packages/next/server/next-server.ts
*/ const { originalResponse } = res;
// A response body must not be sent for HEAD requests. See https://httpwg.org/specs/rfc9110.html#HEAD
if (response.body && req.method !== 'HEAD') {
await (0, _pipereadable.pipeToNodeResponse)(response.body, originalResponse, waitUntil);
} else {
originalResponse.end();
}
}
}
//# sourceMappingURL=send-response.js.maph :NNQO " $ 4 G M O [ 0 R __webpack_unused_export__ = ()Object.defineProperty(exports, "I", ())__webpack_require__123750887679 truebuffersourcesizemapshash var __webpack_unused_export__;
__webpack_unused_export__ = ({
value: true
});
Object.defineProperty(exports, "I", ({
enumerable: true,
get: function() {
return sendResponse;
}
}));
const _helpers = __webpack_require__(1237);
const _pipereadable = __webpack_require__(5088);
const _utils = __webpack_require__(7679);
async function sendResponse(req, res, response, waitUntil) {
if (// The type check here ensures that `req` is correctly typed, and the
// environment variable check provides dead code elimination.
true && (0, _helpers.isNodeNextResponse)(res)) {
var // Copy over the response headers.
_response_headers;
// Copy over the response status.
res.statusCode = response.status;
res.statusMessage = response.statusText;
// TODO: this is not spec-compliant behavior and we should not restrict
// headers that are allowed to appear many times.
//
// See:
// https://github.com/vercel/next.js/pull/70127
const headersWithMultipleValuesAllowed = [
// can add more headers to this list if needed
'set-cookie',
'www-authenticate',
'proxy-authenticate',
'vary'
];
(_response_headers = response.headers) == null ? void 0 : _response_headers.forEach((value, name)=>{
// `x-middleware-set-cookie` is an internal header not needed for the response
if (name.toLowerCase() === 'x-middleware-set-cookie') {
return;
}
// The append handling is special cased for `set-cookie`.
if (name.toLowerCase() === 'set-cookie') {
// TODO: (wyattjoh) replace with native response iteration when we can upgrade undici
for (const cookie of (0, _utils.splitCookiesString)(value)){
res.appendHeader(name, cookie);
}
} else {
// only append the header if it is either not present in the outbound response
// or if the header supports multiple values
const isHeaderPresent = typeof res.getHeader(name) !== 'undefined';
if (headersWithMultipleValuesAllowed.includes(name.toLowerCase()) || !isHeaderPresent) {
res.appendHeader(name, value);
}
}
});
/**
* The response can't be directly piped to the underlying response. The
* following is duplicated from the edge runtime handler.
*
* See packages/next/server/next-server.ts
*/ const { originalResponse } = res;
// A response body must not be sent for HEAD requests. See https://httpwg.org/specs/rfc9110.html#HEAD
if (response.body && req.method !== 'HEAD') {
await (0, _pipereadable.pipeToNodeResponse)(response.body, originalResponse, waitUntil);
} else {
originalResponse.end();
}
}
}
//# sourceMappingURL=send-response.js.map{"finalSource":true}mapbufferedMap ConcatSourceRawSource var __webpack_unused_export__;
ReplaceSourceRawSource "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "sendResponse", {
enumerable: true,
get: function() {
return sendResponse;
}
});
const _helpers = require("./base-http/helpers");
const _pipereadable = require("./pipe-readable");
const _utils = require("./web/utils");
async function sendResponse(req, res, response, waitUntil) {
if (// The type check here ensures that `req` is correctly typed, and the
// environment variable check provides dead code elimination.
process.env.NEXT_RUNTIME !== 'edge' && (0, _helpers.isNodeNextResponse)(res)) {
var // Copy over the response headers.
_response_headers;
// Copy over the response status.
res.statusCode = response.status;
res.statusMessage = response.statusText;
// TODO: this is not spec-compliant behavior and we should not restrict
// headers that are allowed to appear many times.
//
// See:
// https://github.com/vercel/next.js/pull/70127
const headersWithMultipleValuesAllowed = [
// can add more headers to this list if needed
'set-cookie',
'www-authenticate',
'proxy-authenticate',
'vary'
];
(_response_headers = response.headers) == null ? void 0 : _response_headers.forEach((value, name)=>{
// `x-middleware-set-cookie` is an internal header not needed for the response
if (name.toLowerCase() === 'x-middleware-set-cookie') {
return;
}
// The append handling is special cased for `set-cookie`.
if (name.toLowerCase() === 'set-cookie') {
// TODO: (wyattjoh) replace with native response iteration when we can upgrade undici
for (const cookie of (0, _utils.splitCookiesString)(value)){
res.appendHeader(name, cookie);
}
} else {
// only append the header if it is either not present in the outbound response
// or if the header supports multiple values
const isHeaderPresent = typeof res.getHeader(name) !== 'undefined';
if (headersWithMultipleValuesAllowed.includes(name.toLowerCase()) || !isHeaderPresent) {
res.appendHeader(name, value);
}
}
});
/**
* The response can't be directly piped to the underlying response. The
* following is duplicated from the edge runtime handler.
*
* See packages/next/server/next-server.ts
*/ const { originalResponse } = res;
// A response body must not be sent for HEAD requests. See https://httpwg.org/specs/rfc9110.html#HEAD
if (response.body && req.method !== 'HEAD') {
await (0, _pipereadable.pipeToNodeResponse)(response.body, originalResponse, waitUntil);
} else {
originalResponse.end();
}
}
}
//# sourceMappingURL=send-response.js.map; 012undefined1458__webpack_unused_export__ = (undefined7878)undefined81127Object.defineProperty(exports, "I", (undefined210210))undefined230236__webpack_require__undefined2382581237undefined284290__webpack_require__undefined2923085088undefined327333__webpack_require__undefined3353477679undefined560594 trueundefined
/***/ }). /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
var __webpack_unused_export__;
__webpack_unused_export__ = ({
value: true
});
Object.defineProperty(exports, "I", ({
enumerable: true,
get: function() {
return sendResponse;
}
}));
const _helpers = __webpack_require__(1237);
const _pipereadable = __webpack_require__(5088);
const _utils = __webpack_require__(7679);
async function sendResponse(req, res, response, waitUntil) {
if (// The type check here ensures that `req` is correctly typed, and the
// environment variable check provides dead code elimination.
true && (0, _helpers.isNodeNextResponse)(res)) {
var // Copy over the response headers.
_response_headers;
// Copy over the response status.
res.statusCode = response.status;
res.statusMessage = response.statusText;
// TODO: this is not spec-compliant behavior and we should not restrict
// headers that are allowed to appear many times.
//
// See:
// https://github.com/vercel/next.js/pull/70127
const headersWithMultipleValuesAllowed = [
// can add more headers to this list if needed
'set-cookie',
'www-authenticate',
'proxy-authenticate',
'vary'
];
(_response_headers = response.headers) == null ? void 0 : _response_headers.forEach((value, name)=>{
// `x-middleware-set-cookie` is an internal header not needed for the response
if (name.toLowerCase() === 'x-middleware-set-cookie') {
return;
}
// The append handling is special cased for `set-cookie`.
if (name.toLowerCase() === 'set-cookie') {
// TODO: (wyattjoh) replace with native response iteration when we can upgrade undici
for (const cookie of (0, _utils.splitCookiesString)(value)){
res.appendHeader(name, cookie);
}
} else {
// only append the header if it is either not present in the outbound response
// or if the header supports multiple values
const isHeaderPresent = typeof res.getHeader(name) !== 'undefined';
if (headersWithMultipleValuesAllowed.includes(name.toLowerCase()) || !isHeaderPresent) {
res.appendHeader(name, value);
}
}
});
/**
* The response can't be directly piped to the underlying response. The
* following is duplicated from the edge runtime handler.
*
* See packages/next/server/next-server.ts
*/ const { originalResponse } = res;
// A response body must not be sent for HEAD requests. See https://httpwg.org/specs/rfc9110.html#HEAD
if (response.body && req.method !== 'HEAD') {
await (0, _pipereadable.pipeToNodeResponse)(response.body, originalResponse, waitUntil);
} else {
originalResponse.end();
}
}
}
//# sourceMappingURL=send-response.js.map
/***/ }) S /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
var __webpack_unused_export__;
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "sendResponse", {
enumerable: true,
get: function() {
return sendResponse;
}
});
const _helpers = require("./base-http/helpers");
const _pipereadable = require("./pipe-readable");
const _utils = require("./web/utils");
async function sendResponse(req, res, response, waitUntil) {
if (// The type check here ensures that `req` is correctly typed, and the
// environment variable check provides dead code elimination.
process.env.NEXT_RUNTIME !== 'edge' && (0, _helpers.isNodeNextResponse)(res)) {
var // Copy over the response headers.
_response_headers;
// Copy over the response status.
res.statusCode = response.status;
res.statusMessage = response.statusText;
// TODO: this is not spec-compliant behavior and we should not restrict
// headers that are allowed to appear many times.
//
// See:
// https://github.com/vercel/next.js/pull/70127
const headersWithMultipleValuesAllowed = [
// can add more headers to this list if needed
'set-cookie',
'www-authenticate',
'proxy-authenticate',
'vary'
];
(_response_headers = response.headers) == null ? void 0 : _response_headers.forEach((value, name)=>{
// `x-middleware-set-cookie` is an internal header not needed for the response
if (name.toLowerCase() === 'x-middleware-set-cookie') {
return;
}
// The append handling is special cased for `set-cookie`.
if (name.toLowerCase() === 'set-cookie') {
// TODO: (wyattjoh) replace with native response iteration when we can upgrade undici
for (const cookie of (0, _utils.splitCookiesString)(value)){
res.appendHeader(name, cookie);
}
} else {
// only append the header if it is either not present in the outbound response
// or if the header supports multiple values
const isHeaderPresent = typeof res.getHeader(name) !== 'undefined';
if (headersWithMultipleValuesAllowed.includes(name.toLowerCase()) || !isHeaderPresent) {
res.appendHeader(name, value);
}
}
});
/**
* The response can't be directly piped to the underlying response. The
* following is duplicated from the edge runtime handler.
*
* See packages/next/server/next-server.ts
*/ const { originalResponse } = res;
// A response body must not be sent for HEAD requests. See https://httpwg.org/specs/rfc9110.html#HEAD
if (response.body && req.method !== 'HEAD') {
await (0, _pipereadable.pipeToNodeResponse)(response.body, originalResponse, waitUntil);
} else {
originalResponse.end();
}
}
}
//# sourceMappingURL=send-response.js.map; 012undefined1458__webpack_unused_export__ = (undefined7878)undefined81127Object.defineProperty(exports, "I", (undefined210210))undefined230236__webpack_require__undefined2382581237undefined284290__webpack_require__undefined2923085088undefined327333__webpack_require__undefined3353477679undefined560594 trueundefined ,
/***/ 3518:
webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceS /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource "use strict";
const { prisma } = require("../lib/prisma");
async function writeAuditEvent({ organizationId, workspaceId = null, projectId = null, actorUserId = null, entityType, entityId, action, beforeJson = null, afterJson = null, request = null }) {
return prisma.auditEvent.create({
data: {
organizationId,
workspaceId,
projectId,
actorUserId,
entityType,
entityId,
action,
beforeJson,
afterJson,
ipAddress: request ? request.headers.get("x-forwarded-for") || null : null,
userAgent: request ? request.headers.get("user-agent") || null : null
}
});
}
module.exports = {
writeAuditEvent
};
d!')7__webpack_require__7964buffersourcesizemapshash
const { prisma } = __webpack_require__(7964);
async function writeAuditEvent({ organizationId, workspaceId = null, projectId = null, actorUserId = null, entityType, entityId, action, beforeJson = null, afterJson = null, request = null }) {
return prisma.auditEvent.create({
data: {
organizationId,
workspaceId,
projectId,
actorUserId,
entityType,
entityId,
action,
beforeJson,
afterJson,
ipAddress: request ? request.headers.get("x-forwarded-for") || null : null,
userAgent: request ? request.headers.get("user-agent") || null : null
}
});
}
module.exports = {
writeAuditEvent
};
{"finalSource":true}mapbufferedMap ReplaceSourceRawSource "use strict";
const { prisma } = require("../lib/prisma");
async function writeAuditEvent({ organizationId, workspaceId = null, projectId = null, actorUserId = null, entityType, entityId, action, beforeJson = null, afterJson = null, request = null }) {
return prisma.auditEvent.create({
data: {
organizationId,
workspaceId,
projectId,
actorUserId,
entityType,
entityId,
action,
beforeJson,
afterJson,
ipAddress: request ? request.headers.get("x-forwarded-for") || null : null,
userAgent: request ? request.headers.get("user-agent") || null : null
}
});
}
module.exports = {
writeAuditEvent
};
= 012undefined3339__webpack_require__undefined41557964undefined
/***/ })B /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
const { prisma } = __webpack_require__(7964);
async function writeAuditEvent({ organizationId, workspaceId = null, projectId = null, actorUserId = null, entityType, entityId, action, beforeJson = null, afterJson = null, request = null }) {
return prisma.auditEvent.create({
data: {
organizationId,
workspaceId,
projectId,
actorUserId,
entityType,
entityId,
action,
beforeJson,
afterJson,
ipAddress: request ? request.headers.get("x-forwarded-for") || null : null,
userAgent: request ? request.headers.get("user-agent") || null : null
}
});
}
module.exports = {
writeAuditEvent
};
/***/ }) "use strict";
const { prisma } = require("../lib/prisma");
async function writeAuditEvent({ organizationId, workspaceId = null, projectId = null, actorUserId = null, entityType, entityId, action, beforeJson = null, afterJson = null, request = null }) {
return prisma.auditEvent.create({
data: {
organizationId,
workspaceId,
projectId,
actorUserId,
entityType,
entityId,
action,
beforeJson,
afterJson,
ipAddress: request ? request.headers.get("x-forwarded-for") || null : null,
userAgent: request ? request.headers.get("user-agent") || null : null
}
});
}
module.exports = {
writeAuditEvent
};
= 012undefined3339__webpack_require__undefined41557964undefined ,
/***/ 5707:
}, webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource$ /***/ ((module) => {
"use strict";
webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource "use strict";
const PERMISSIONS = [
"organization:manage",
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"risk:delete",
"mitigation:write",
"gate:read",
"gate:evaluate",
"gate:review",
"report:export",
"integration:read",
"integration:manage",
"integration:sync",
"oauth:manage",
"billing:manage",
"audit:read"
];
const ROLE_PERMISSIONS = {
owner: [
"*"
],
admin: [
"organization:manage",
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"risk:delete",
"mitigation:write",
"gate:evaluate",
"gate:review",
"report:export",
"integration:manage",
"billing:manage",
"audit:read"
],
project_manager: [
"project:read",
"project:write",
"risk:read",
"risk:write",
"mitigation:write",
"gate:evaluate",
"report:export",
"integration:read",
"audit:read"
],
risk_owner: [
"project:read",
"risk:read",
"risk:write",
"mitigation:write",
"gate:read"
],
governance_reviewer: [
"project:read",
"risk:read",
"gate:evaluate",
"gate:review",
"report:export",
"audit:read"
],
legal_ethics_reviewer: [
"project:read",
"risk:read",
"mitigation:write",
"gate:review",
"report:export",
"audit:read"
],
integration_admin: [
"project:read",
"integration:read",
"integration:manage",
"integration:sync",
"oauth:manage",
"audit:read"
],
viewer: [
"project:read",
"risk:read",
"gate:read",
"integration:read",
"report:export"
],
consultant: [
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"mitigation:write",
"gate:evaluate",
"gate:review",
"report:export",
"audit:read"
]
};
function unique(values) {
return Array.from(new Set(values.filter(Boolean)));
}
function resolvePermissions(roleCodeOrPermissions) {
if (Array.isArray(roleCodeOrPermissions)) return unique(roleCodeOrPermissions);
return ROLE_PERMISSIONS[roleCodeOrPermissions] ? ROLE_PERMISSIONS[roleCodeOrPermissions].slice() : [];
}
function hasPermission(roleCodeOrPermissions, permission) {
const permissions = resolvePermissions(roleCodeOrPermissions);
return permissions.includes("*") || permissions.includes(permission);
}
function assertPermission(roleCodeOrPermissions, permission) {
if (!hasPermission(roleCodeOrPermissions, permission)) {
const error = new Error(`Permission denied: ${permission}`);
error.status = 403;
throw error;
}
}
function canAccessWorkspace(membership, workspaceId) {
if (!membership || membership.status !== "ACTIVE") return false;
if (!membership.workspaceScope || membership.workspaceScope.length === 0) return true;
return membership.workspaceScope.includes(workspaceId);
}
function canMutateRisk(membership) {
return canAccessWorkspace(membership, "workspace-a") && hasPermission(membership.permissions || membership.role?.permissions, "risk:write");
}
module.exports = {
PERMISSIONS,
ROLE_PERMISSIONS,
resolvePermissions,
hasPermission,
assertPermission,
canAccessWorkspace,
canMutateRisk
};
`buffersourcesizemapshash
const PERMISSIONS = [
"organization:manage",
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"risk:delete",
"mitigation:write",
"gate:read",
"gate:evaluate",
"gate:review",
"report:export",
"integration:read",
"integration:manage",
"integration:sync",
"oauth:manage",
"billing:manage",
"audit:read"
];
const ROLE_PERMISSIONS = {
owner: [
"*"
],
admin: [
"organization:manage",
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"risk:delete",
"mitigation:write",
"gate:evaluate",
"gate:review",
"report:export",
"integration:manage",
"billing:manage",
"audit:read"
],
project_manager: [
"project:read",
"project:write",
"risk:read",
"risk:write",
"mitigation:write",
"gate:evaluate",
"report:export",
"integration:read",
"audit:read"
],
risk_owner: [
"project:read",
"risk:read",
"risk:write",
"mitigation:write",
"gate:read"
],
governance_reviewer: [
"project:read",
"risk:read",
"gate:evaluate",
"gate:review",
"report:export",
"audit:read"
],
legal_ethics_reviewer: [
"project:read",
"risk:read",
"mitigation:write",
"gate:review",
"report:export",
"audit:read"
],
integration_admin: [
"project:read",
"integration:read",
"integration:manage",
"integration:sync",
"oauth:manage",
"audit:read"
],
viewer: [
"project:read",
"risk:read",
"gate:read",
"integration:read",
"report:export"
],
consultant: [
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"mitigation:write",
"gate:evaluate",
"gate:review",
"report:export",
"audit:read"
]
};
function unique(values) {
return Array.from(new Set(values.filter(Boolean)));
}
function resolvePermissions(roleCodeOrPermissions) {
if (Array.isArray(roleCodeOrPermissions)) return unique(roleCodeOrPermissions);
return ROLE_PERMISSIONS[roleCodeOrPermissions] ? ROLE_PERMISSIONS[roleCodeOrPermissions].slice() : [];
}
function hasPermission(roleCodeOrPermissions, permission) {
const permissions = resolvePermissions(roleCodeOrPermissions);
return permissions.includes("*") || permissions.includes(permission);
}
function assertPermission(roleCodeOrPermissions, permission) {
if (!hasPermission(roleCodeOrPermissions, permission)) {
const error = new Error(`Permission denied: ${permission}`);
error.status = 403;
throw error;
}
}
function canAccessWorkspace(membership, workspaceId) {
if (!membership || membership.status !== "ACTIVE") return false;
if (!membership.workspaceScope || membership.workspaceScope.length === 0) return true;
return membership.workspaceScope.includes(workspaceId);
}
function canMutateRisk(membership) {
return canAccessWorkspace(membership, "workspace-a") && hasPermission(membership.permissions || membership.role?.permissions, "risk:write");
}
module.exports = {
PERMISSIONS,
ROLE_PERMISSIONS,
resolvePermissions,
hasPermission,
assertPermission,
canAccessWorkspace,
canMutateRisk
};
{"finalSource":true}mapbufferedMap ReplaceSourceRawSource "use strict";
const PERMISSIONS = [
"organization:manage",
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"risk:delete",
"mitigation:write",
"gate:read",
"gate:evaluate",
"gate:review",
"report:export",
"integration:read",
"integration:manage",
"integration:sync",
"oauth:manage",
"billing:manage",
"audit:read"
];
const ROLE_PERMISSIONS = {
owner: [
"*"
],
admin: [
"organization:manage",
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"risk:delete",
"mitigation:write",
"gate:evaluate",
"gate:review",
"report:export",
"integration:manage",
"billing:manage",
"audit:read"
],
project_manager: [
"project:read",
"project:write",
"risk:read",
"risk:write",
"mitigation:write",
"gate:evaluate",
"report:export",
"integration:read",
"audit:read"
],
risk_owner: [
"project:read",
"risk:read",
"risk:write",
"mitigation:write",
"gate:read"
],
governance_reviewer: [
"project:read",
"risk:read",
"gate:evaluate",
"gate:review",
"report:export",
"audit:read"
],
legal_ethics_reviewer: [
"project:read",
"risk:read",
"mitigation:write",
"gate:review",
"report:export",
"audit:read"
],
integration_admin: [
"project:read",
"integration:read",
"integration:manage",
"integration:sync",
"oauth:manage",
"audit:read"
],
viewer: [
"project:read",
"risk:read",
"gate:read",
"integration:read",
"report:export"
],
consultant: [
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"mitigation:write",
"gate:evaluate",
"gate:review",
"report:export",
"audit:read"
]
};
function unique(values) {
return Array.from(new Set(values.filter(Boolean)));
}
function resolvePermissions(roleCodeOrPermissions) {
if (Array.isArray(roleCodeOrPermissions)) return unique(roleCodeOrPermissions);
return ROLE_PERMISSIONS[roleCodeOrPermissions] ? ROLE_PERMISSIONS[roleCodeOrPermissions].slice() : [];
}
function hasPermission(roleCodeOrPermissions, permission) {
const permissions = resolvePermissions(roleCodeOrPermissions);
return permissions.includes("*") || permissions.includes(permission);
}
function assertPermission(roleCodeOrPermissions, permission) {
if (!hasPermission(roleCodeOrPermissions, permission)) {
const error = new Error(`Permission denied: ${permission}`);
error.status = 403;
throw error;
}
}
function canAccessWorkspace(membership, workspaceId) {
if (!membership || membership.status !== "ACTIVE") return false;
if (!membership.workspaceScope || membership.workspaceScope.length === 0) return true;
return membership.workspaceScope.includes(workspaceId);
}
function canMutateRisk(membership) {
return canAccessWorkspace(membership, "workspace-a") && hasPermission(membership.permissions || membership.role?.permissions, "risk:write");
}
module.exports = {
PERMISSIONS,
ROLE_PERMISSIONS,
resolvePermissions,
hasPermission,
assertPermission,
canAccessWorkspace,
canMutateRisk
};
012undefined
/***/ })/ /***/ ((module) => {
"use strict";
const PERMISSIONS = [
"organization:manage",
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"risk:delete",
"mitigation:write",
"gate:read",
"gate:evaluate",
"gate:review",
"report:export",
"integration:read",
"integration:manage",
"integration:sync",
"oauth:manage",
"billing:manage",
"audit:read"
];
const ROLE_PERMISSIONS = {
owner: [
"*"
],
admin: [
"organization:manage",
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"risk:delete",
"mitigation:write",
"gate:evaluate",
"gate:review",
"report:export",
"integration:manage",
"billing:manage",
"audit:read"
],
project_manager: [
"project:read",
"project:write",
"risk:read",
"risk:write",
"mitigation:write",
"gate:evaluate",
"report:export",
"integration:read",
"audit:read"
],
risk_owner: [
"project:read",
"risk:read",
"risk:write",
"mitigation:write",
"gate:read"
],
governance_reviewer: [
"project:read",
"risk:read",
"gate:evaluate",
"gate:review",
"report:export",
"audit:read"
],
legal_ethics_reviewer: [
"project:read",
"risk:read",
"mitigation:write",
"gate:review",
"report:export",
"audit:read"
],
integration_admin: [
"project:read",
"integration:read",
"integration:manage",
"integration:sync",
"oauth:manage",
"audit:read"
],
viewer: [
"project:read",
"risk:read",
"gate:read",
"integration:read",
"report:export"
],
consultant: [
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"mitigation:write",
"gate:evaluate",
"gate:review",
"report:export",
"audit:read"
]
};
function unique(values) {
return Array.from(new Set(values.filter(Boolean)));
}
function resolvePermissions(roleCodeOrPermissions) {
if (Array.isArray(roleCodeOrPermissions)) return unique(roleCodeOrPermissions);
return ROLE_PERMISSIONS[roleCodeOrPermissions] ? ROLE_PERMISSIONS[roleCodeOrPermissions].slice() : [];
}
function hasPermission(roleCodeOrPermissions, permission) {
const permissions = resolvePermissions(roleCodeOrPermissions);
return permissions.includes("*") || permissions.includes(permission);
}
function assertPermission(roleCodeOrPermissions, permission) {
if (!hasPermission(roleCodeOrPermissions, permission)) {
const error = new Error(`Permission denied: ${permission}`);
error.status = 403;
throw error;
}
}
function canAccessWorkspace(membership, workspaceId) {
if (!membership || membership.status !== "ACTIVE") return false;
if (!membership.workspaceScope || membership.workspaceScope.length === 0) return true;
return membership.workspaceScope.includes(workspaceId);
}
function canMutateRisk(membership) {
return canAccessWorkspace(membership, "workspace-a") && hasPermission(membership.permissions || membership.role?.permissions, "risk:write");
}
module.exports = {
PERMISSIONS,
ROLE_PERMISSIONS,
resolvePermissions,
hasPermission,
assertPermission,
canAccessWorkspace,
canMutateRisk
};
/***/ }) "use strict";
const PERMISSIONS = [
"organization:manage",
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"risk:delete",
"mitigation:write",
"gate:read",
"gate:evaluate",
"gate:review",
"report:export",
"integration:read",
"integration:manage",
"integration:sync",
"oauth:manage",
"billing:manage",
"audit:read"
];
const ROLE_PERMISSIONS = {
owner: [
"*"
],
admin: [
"organization:manage",
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"risk:delete",
"mitigation:write",
"gate:evaluate",
"gate:review",
"report:export",
"integration:manage",
"billing:manage",
"audit:read"
],
project_manager: [
"project:read",
"project:write",
"risk:read",
"risk:write",
"mitigation:write",
"gate:evaluate",
"report:export",
"integration:read",
"audit:read"
],
risk_owner: [
"project:read",
"risk:read",
"risk:write",
"mitigation:write",
"gate:read"
],
governance_reviewer: [
"project:read",
"risk:read",
"gate:evaluate",
"gate:review",
"report:export",
"audit:read"
],
legal_ethics_reviewer: [
"project:read",
"risk:read",
"mitigation:write",
"gate:review",
"report:export",
"audit:read"
],
integration_admin: [
"project:read",
"integration:read",
"integration:manage",
"integration:sync",
"oauth:manage",
"audit:read"
],
viewer: [
"project:read",
"risk:read",
"gate:read",
"integration:read",
"report:export"
],
consultant: [
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"mitigation:write",
"gate:evaluate",
"gate:review",
"report:export",
"audit:read"
]
};
function unique(values) {
return Array.from(new Set(values.filter(Boolean)));
}
function resolvePermissions(roleCodeOrPermissions) {
if (Array.isArray(roleCodeOrPermissions)) return unique(roleCodeOrPermissions);
return ROLE_PERMISSIONS[roleCodeOrPermissions] ? ROLE_PERMISSIONS[roleCodeOrPermissions].slice() : [];
}
function hasPermission(roleCodeOrPermissions, permission) {
const permissions = resolvePermissions(roleCodeOrPermissions);
return permissions.includes("*") || permissions.includes(permission);
}
function assertPermission(roleCodeOrPermissions, permission) {
if (!hasPermission(roleCodeOrPermissions, permission)) {
const error = new Error(`Permission denied: ${permission}`);
error.status = 403;
throw error;
}
}
function canAccessWorkspace(membership, workspaceId) {
if (!membership || membership.status !== "ACTIVE") return false;
if (!membership.workspaceScope || membership.workspaceScope.length === 0) return true;
return membership.workspaceScope.includes(workspaceId);
}
function canMutateRisk(membership) {
return canAccessWorkspace(membership, "workspace-a") && hasPermission(membership.permissions || membership.role?.permissions, "risk:write");
}
module.exports = {
PERMISSIONS,
ROLE_PERMISSIONS,
resolvePermissions,
hasPermission,
assertPermission,
canAccessWorkspace,
canMutateRisk
};
,
/***/ 5736:
webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceS /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource } webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceR "use strict";
if (process.env.NEXT_RUNTIME === 'edge') {
module.exports = require('next/dist/server/route-modules/app-route/module.js');
} else {
if (process.env.__NEXT_EXPERIMENTAL_REACT) {
if (process.env.NODE_ENV === 'development') {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo-experimental.runtime.dev.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route-experimental.runtime.dev.js');
}
} else {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo-experimental.runtime.prod.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route-experimental.runtime.prod.js');
}
}
} else {
if (process.env.NODE_ENV === 'development') {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo.runtime.dev.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route.runtime.dev.js');
}
} else {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo.runtime.prod.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route.runtime.prod.js');
}
}
}
}
//# sourceMappingURL=module.compiled.js.map
c47N false{}module.exports = __webpack_require__(4870)buffersourcesizemapshash
if (false) {} else {
if (false) {} else {
if (false) {} else {
if (false) {} else {
module.exports = __webpack_require__(4870);
}
}
}
}
//# sourceMappingURL=module.compiled.js.map{"finalSource":true}mapbufferedMap ReplaceSourceRawSourceR "use strict";
if (process.env.NEXT_RUNTIME === 'edge') {
module.exports = require('next/dist/server/route-modules/app-route/module.js');
} else {
if (process.env.__NEXT_EXPERIMENTAL_REACT) {
if (process.env.NODE_ENV === 'development') {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo-experimental.runtime.dev.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route-experimental.runtime.dev.js');
}
} else {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo-experimental.runtime.prod.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route-experimental.runtime.prod.js');
}
}
} else {
if (process.env.NODE_ENV === 'development') {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo.runtime.dev.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route.runtime.dev.js');
}
} else {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo.runtime.prod.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route.runtime.prod.js');
}
}
}
}
//# sourceMappingURL=module.compiled.js.map 012undefined1852falseundefined55141{}undefined158194falseundefined197906{}undefined927964falseundefined9671261{}undefined12861306falseundefined13091431{}undefined14561539module.exports = __webpack_require__(4870)undefined
/***/ })R /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
if (false) {} else {
if (false) {} else {
if (false) {} else {
if (false) {} else {
module.exports = __webpack_require__(4870);
}
}
}
}
//# sourceMappingURL=module.compiled.js.map
/***/ })R "use strict";
if (process.env.NEXT_RUNTIME === 'edge') {
module.exports = require('next/dist/server/route-modules/app-route/module.js');
} else {
if (process.env.__NEXT_EXPERIMENTAL_REACT) {
if (process.env.NODE_ENV === 'development') {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo-experimental.runtime.dev.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route-experimental.runtime.dev.js');
}
} else {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo-experimental.runtime.prod.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route-experimental.runtime.prod.js');
}
}
} else {
if (process.env.NODE_ENV === 'development') {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo.runtime.dev.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route.runtime.dev.js');
}
} else {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo.runtime.prod.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route.runtime.prod.js');
}
}
}
}
//# sourceMappingURL=module.compiled.js.map 012undefined1852falseundefined55141{}undefined158194falseundefined197906{}undefined927964falseundefined9671261{}undefined12861306falseundefined13091431{}undefined14561539module.exports = __webpack_require__(4870)undefined ,
/***/ 6487:
4 webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource /***/ (() => {
webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource buffersourcesizemapshash{"finalSource":true}mapbufferedMap ReplaceSourceRawSource
/***/ }) /***/ (() => {
/***/ }) /***/ (() => {
,
/***/ 7964:
- webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceS /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource "use strict";
const { PrismaClient } = require("@prisma/client");
const globalForPrisma = globalThis;
const prisma = globalForPrisma.__cosmicPrisma || new PrismaClient();
if ("production" !== "production") {
globalForPrisma.__cosmicPrisma = prisma;
}
module.exports = {
prisma
};
d'-/>C __webpack_require__6330false{}buffersourcesizemapshash
const { PrismaClient } = __webpack_require__(6330);
const globalForPrisma = globalThis;
const prisma = globalForPrisma.__cosmicPrisma || new PrismaClient();
if (false) {}
module.exports = {
prisma
};
{"finalSource":true}mapbufferedMap ReplaceSourceRawSource "use strict";
const { PrismaClient } = require("@prisma/client");
const globalForPrisma = globalThis;
const prisma = globalForPrisma.__cosmicPrisma || new PrismaClient();
if ("production" !== "production") {
globalForPrisma.__cosmicPrisma = prisma;
}
module.exports = {
prisma
};
b 012undefined3945__webpack_require__undefined47626330undefined175203falseundefined206253{}undefined
/***/ })* /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
const { PrismaClient } = __webpack_require__(6330);
const globalForPrisma = globalThis;
const prisma = globalForPrisma.__cosmicPrisma || new PrismaClient();
if (false) {}
module.exports = {
prisma
};
/***/ }) "use strict";
const { PrismaClient } = require("@prisma/client");
const globalForPrisma = globalThis;
const prisma = globalForPrisma.__cosmicPrisma || new PrismaClient();
if ("production" !== "production") {
globalForPrisma.__cosmicPrisma = prisma;
}
module.exports = {
prisma
};
b 012undefined3945__webpack_require__undefined47626330undefined175203falseundefined206253{}undefined ,
/***/ 8335:
4 webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource /***/ (() => {
webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource buffersourcesizemapshash{"finalSource":true}mapbufferedMap ReplaceSourceRawSource
/***/ }) ,
/***/ 8763:
W% webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource$ /***/ ((module) => {
"use strict";
webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource N webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource "use strict";
const PLAN_LIMITS = {
pilot: {
users: 10,
projects: 5,
reportsPerMonth: 100,
integrations: 4,
storageMb: 1024
},
starter: {
users: 5,
projects: 3,
reportsPerMonth: 25,
integrations: 1,
storageMb: 512
},
team: {
users: 25,
projects: 20,
reportsPerMonth: 500,
integrations: 4,
storageMb: 10240
},
enterprise: {
users: 1000,
projects: 1000,
reportsPerMonth: 100000,
integrations: 100,
storageMb: 102400
}
};
const ACTIVE_SUBSCRIPTION_STATUSES = [
"TRIALING",
"ACTIVE"
];
function getPlanLimits(planCode) {
return PLAN_LIMITS[planCode] || PLAN_LIMITS.starter;
}
function subscriptionAllowsAccess(subscription, organization) {
if (organization && organization.status === "SUSPENDED") return false;
if (!subscription) return false;
if (subscription.adminOverride) return true;
return ACTIVE_SUBSCRIPTION_STATUSES.includes(subscription.status);
}
function buildEntitlements(subscription, organization) {
const baseLimits = getPlanLimits(subscription ? subscription.planCode : organization ? organization.planCode : "starter");
return {
active: subscriptionAllowsAccess(subscription, organization),
source: subscription ? subscription.source : "MANUAL",
status: subscription ? subscription.status : "SUSPENDED",
planCode: subscription ? subscription.planCode : organization ? organization.planCode : "starter",
limits: {
users: subscription && subscription.userLimit ? subscription.userLimit : baseLimits.users,
projects: subscription && subscription.projectLimit ? subscription.projectLimit : baseLimits.projects,
reportsPerMonth: subscription && subscription.reportLimitMonthly ? subscription.reportLimitMonthly : baseLimits.reportsPerMonth,
integrations: subscription && subscription.integrationLimit ? subscription.integrationLimit : baseLimits.integrations,
storageMb: subscription && subscription.storageMbLimit ? subscription.storageMbLimit : baseLimits.storageMb
}
};
}
function assertWithinLimit(entitlements, metric, currentCount, increment = 1) {
if (!entitlements.active) {
const error = new Error("Subscription is not active.");
error.status = 402;
throw error;
}
const limit = entitlements.limits[metric];
if (limit !== undefined && currentCount + increment > limit) {
const error = new Error(`Plan limit exceeded for ${metric}.`);
error.status = 402;
error.details = {
metric,
currentCount,
increment,
limit
};
throw error;
}
}
module.exports = {
PLAN_LIMITS,
ACTIVE_SUBSCRIPTION_STATUSES,
getPlanLimits,
buildEntitlements,
subscriptionAllowsAccess,
assertWithinLimit
};
`buffersourcesizemapshash
const PLAN_LIMITS = {
pilot: {
users: 10,
projects: 5,
reportsPerMonth: 100,
integrations: 4,
storageMb: 1024
},
starter: {
users: 5,
projects: 3,
reportsPerMonth: 25,
integrations: 1,
storageMb: 512
},
team: {
users: 25,
projects: 20,
reportsPerMonth: 500,
integrations: 4,
storageMb: 10240
},
enterprise: {
users: 1000,
projects: 1000,
reportsPerMonth: 100000,
integrations: 100,
storageMb: 102400
}
};
const ACTIVE_SUBSCRIPTION_STATUSES = [
"TRIALING",
"ACTIVE"
];
function getPlanLimits(planCode) {
return PLAN_LIMITS[planCode] || PLAN_LIMITS.starter;
}
function subscriptionAllowsAccess(subscription, organization) {
if (organization && organization.status === "SUSPENDED") return false;
if (!subscription) return false;
if (subscription.adminOverride) return true;
return ACTIVE_SUBSCRIPTION_STATUSES.includes(subscription.status);
}
function buildEntitlements(subscription, organization) {
const baseLimits = getPlanLimits(subscription ? subscription.planCode : organization ? organization.planCode : "starter");
return {
active: subscriptionAllowsAccess(subscription, organization),
source: subscription ? subscription.source : "MANUAL",
status: subscription ? subscription.status : "SUSPENDED",
planCode: subscription ? subscription.planCode : organization ? organization.planCode : "starter",
limits: {
users: subscription && subscription.userLimit ? subscription.userLimit : baseLimits.users,
projects: subscription && subscription.projectLimit ? subscription.projectLimit : baseLimits.projects,
reportsPerMonth: subscription && subscription.reportLimitMonthly ? subscription.reportLimitMonthly : baseLimits.reportsPerMonth,
integrations: subscription && subscription.integrationLimit ? subscription.integrationLimit : baseLimits.integrations,
storageMb: subscription && subscription.storageMbLimit ? subscription.storageMbLimit : baseLimits.storageMb
}
};
}
function assertWithinLimit(entitlements, metric, currentCount, increment = 1) {
if (!entitlements.active) {
const error = new Error("Subscription is not active.");
error.status = 402;
throw error;
}
const limit = entitlements.limits[metric];
if (limit !== undefined && currentCount + increment > limit) {
const error = new Error(`Plan limit exceeded for ${metric}.`);
error.status = 402;
error.details = {
metric,
currentCount,
increment,
limit
};
throw error;
}
}
module.exports = {
PLAN_LIMITS,
ACTIVE_SUBSCRIPTION_STATUSES,
getPlanLimits,
buildEntitlements,
subscriptionAllowsAccess,
assertWithinLimit
};
{"finalSource":true}mapbufferedMap ReplaceSourceRawSource "use strict";
const PLAN_LIMITS = {
pilot: {
users: 10,
projects: 5,
reportsPerMonth: 100,
integrations: 4,
storageMb: 1024
},
starter: {
users: 5,
projects: 3,
reportsPerMonth: 25,
integrations: 1,
storageMb: 512
},
team: {
users: 25,
projects: 20,
reportsPerMonth: 500,
integrations: 4,
storageMb: 10240
},
enterprise: {
users: 1000,
projects: 1000,
reportsPerMonth: 100000,
integrations: 100,
storageMb: 102400
}
};
const ACTIVE_SUBSCRIPTION_STATUSES = [
"TRIALING",
"ACTIVE"
];
function getPlanLimits(planCode) {
return PLAN_LIMITS[planCode] || PLAN_LIMITS.starter;
}
function subscriptionAllowsAccess(subscription, organization) {
if (organization && organization.status === "SUSPENDED") return false;
if (!subscription) return false;
if (subscription.adminOverride) return true;
return ACTIVE_SUBSCRIPTION_STATUSES.includes(subscription.status);
}
function buildEntitlements(subscription, organization) {
const baseLimits = getPlanLimits(subscription ? subscription.planCode : organization ? organization.planCode : "starter");
return {
active: subscriptionAllowsAccess(subscription, organization),
source: subscription ? subscription.source : "MANUAL",
status: subscription ? subscription.status : "SUSPENDED",
planCode: subscription ? subscription.planCode : organization ? organization.planCode : "starter",
limits: {
users: subscription && subscription.userLimit ? subscription.userLimit : baseLimits.users,
projects: subscription && subscription.projectLimit ? subscription.projectLimit : baseLimits.projects,
reportsPerMonth: subscription && subscription.reportLimitMonthly ? subscription.reportLimitMonthly : baseLimits.reportsPerMonth,
integrations: subscription && subscription.integrationLimit ? subscription.integrationLimit : baseLimits.integrations,
storageMb: subscription && subscription.storageMbLimit ? subscription.storageMbLimit : baseLimits.storageMb
}
};
}
function assertWithinLimit(entitlements, metric, currentCount, increment = 1) {
if (!entitlements.active) {
const error = new Error("Subscription is not active.");
error.status = 402;
throw error;
}
const limit = entitlements.limits[metric];
if (limit !== undefined && currentCount + increment > limit) {
const error = new Error(`Plan limit exceeded for ${metric}.`);
error.status = 402;
error.details = {
metric,
currentCount,
increment,
limit
};
throw error;
}
}
module.exports = {
PLAN_LIMITS,
ACTIVE_SUBSCRIPTION_STATUSES,
getPlanLimits,
buildEntitlements,
subscriptionAllowsAccess,
assertWithinLimit
};
012undefined
/***/ }) /***/ ((module) => {
"use strict";
const PLAN_LIMITS = {
pilot: {
users: 10,
projects: 5,
reportsPerMonth: 100,
integrations: 4,
storageMb: 1024
},
starter: {
users: 5,
projects: 3,
reportsPerMonth: 25,
integrations: 1,
storageMb: 512
},
team: {
users: 25,
projects: 20,
reportsPerMonth: 500,
integrations: 4,
storageMb: 10240
},
enterprise: {
users: 1000,
projects: 1000,
reportsPerMonth: 100000,
integrations: 100,
storageMb: 102400
}
};
const ACTIVE_SUBSCRIPTION_STATUSES = [
"TRIALING",
"ACTIVE"
];
function getPlanLimits(planCode) {
return PLAN_LIMITS[planCode] || PLAN_LIMITS.starter;
}
function subscriptionAllowsAccess(subscription, organization) {
if (organization && organization.status === "SUSPENDED") return false;
if (!subscription) return false;
if (subscription.adminOverride) return true;
return ACTIVE_SUBSCRIPTION_STATUSES.includes(subscription.status);
}
function buildEntitlements(subscription, organization) {
const baseLimits = getPlanLimits(subscription ? subscription.planCode : organization ? organization.planCode : "starter");
return {
active: subscriptionAllowsAccess(subscription, organization),
source: subscription ? subscription.source : "MANUAL",
status: subscription ? subscription.status : "SUSPENDED",
planCode: subscription ? subscription.planCode : organization ? organization.planCode : "starter",
limits: {
users: subscription && subscription.userLimit ? subscription.userLimit : baseLimits.users,
projects: subscription && subscription.projectLimit ? subscription.projectLimit : baseLimits.projects,
reportsPerMonth: subscription && subscription.reportLimitMonthly ? subscription.reportLimitMonthly : baseLimits.reportsPerMonth,
integrations: subscription && subscription.integrationLimit ? subscription.integrationLimit : baseLimits.integrations,
storageMb: subscription && subscription.storageMbLimit ? subscription.storageMbLimit : baseLimits.storageMb
}
};
}
function assertWithinLimit(entitlements, metric, currentCount, increment = 1) {
if (!entitlements.active) {
const error = new Error("Subscription is not active.");
error.status = 402;
throw error;
}
const limit = entitlements.limits[metric];
if (limit !== undefined && currentCount + increment > limit) {
const error = new Error(`Plan limit exceeded for ${metric}.`);
error.status = 402;
error.details = {
metric,
currentCount,
increment,
limit
};
throw error;
}
}
module.exports = {
PLAN_LIMITS,
ACTIVE_SUBSCRIPTION_STATUSES,
getPlanLimits,
buildEntitlements,
subscriptionAllowsAccess,
assertWithinLimit
};
/***/ }) "use strict";
const PLAN_LIMITS = {
pilot: {
users: 10,
projects: 5,
reportsPerMonth: 100,
integrations: 4,
storageMb: 1024
},
starter: {
users: 5,
projects: 3,
reportsPerMonth: 25,
integrations: 1,
storageMb: 512
},
team: {
users: 25,
projects: 20,
reportsPerMonth: 500,
integrations: 4,
storageMb: 10240
},
enterprise: {
users: 1000,
projects: 1000,
reportsPerMonth: 100000,
integrations: 100,
storageMb: 102400
}
};
const ACTIVE_SUBSCRIPTION_STATUSES = [
"TRIALING",
"ACTIVE"
];
function getPlanLimits(planCode) {
return PLAN_LIMITS[planCode] || PLAN_LIMITS.starter;
}
function subscriptionAllowsAccess(subscription, organization) {
if (organization && organization.status === "SUSPENDED") return false;
if (!subscription) return false;
if (subscription.adminOverride) return true;
return ACTIVE_SUBSCRIPTION_STATUSES.includes(subscription.status);
}
function buildEntitlements(subscription, organization) {
const baseLimits = getPlanLimits(subscription ? subscription.planCode : organization ? organization.planCode : "starter");
return {
active: subscriptionAllowsAccess(subscription, organization),
source: subscription ? subscription.source : "MANUAL",
status: subscription ? subscription.status : "SUSPENDED",
planCode: subscription ? subscription.planCode : organization ? organization.planCode : "starter",
limits: {
users: subscription && subscription.userLimit ? subscription.userLimit : baseLimits.users,
projects: subscription && subscription.projectLimit ? subscription.projectLimit : baseLimits.projects,
reportsPerMonth: subscription && subscription.reportLimitMonthly ? subscription.reportLimitMonthly : baseLimits.reportsPerMonth,
integrations: subscription && subscription.integrationLimit ? subscription.integrationLimit : baseLimits.integrations,
storageMb: subscription && subscription.storageMbLimit ? subscription.storageMbLimit : baseLimits.storageMb
}
};
}
function assertWithinLimit(entitlements, metric, currentCount, increment = 1) {
if (!entitlements.active) {
const error = new Error("Subscription is not active.");
error.status = 402;
throw error;
}
const limit = entitlements.limits[metric];
if (limit !== undefined && currentCount + increment > limit) {
const error = new Error(`Plan limit exceeded for ${metric}.`);
error.status = 402;
error.details = {
metric,
currentCount,
increment,
limit
};
throw error;
}
}
module.exports = {
PLAN_LIMITS,
ACTIVE_SUBSCRIPTION_STATUSES,
getPlanLimits,
buildEntitlements,
subscriptionAllowsAccess,
assertWithinLimit
};
,
/***/ 9316:
] webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceS /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
webpack/lib/util/registerExternalSerializerwebpack-sources/CachedSource webpack/lib/util/registerExternalSerializerwebpack-sources/ReplaceSourcewebpack/lib/util/registerExternalSerializerwebpack-sources/RawSource "use strict";
const { prisma } = require("../lib/prisma");
const { buildEntitlements, assertWithinLimit } = require("../domain/entitlements");
const { writeAuditEvent } = require("./audit-service");
async function getLatestSubscription(organizationId) {
return prisma.subscription.findFirst({
where: {
organizationId
},
orderBy: {
createdAt: "desc"
}
});
}
async function listWorkspaceProjects(workspaceId) {
return prisma.project.findMany({
where: {
workspaceId
},
orderBy: {
createdAt: "desc"
}
});
}
async function createProject({ workspace, actor, payload, request }) {
const subscription = await getLatestSubscription(workspace.organizationId);
const organization = await prisma.organization.findUnique({
where: {
id: workspace.organizationId
}
});
const entitlements = buildEntitlements(subscription, organization);
const currentCount = await prisma.project.count({
where: {
workspace: {
organizationId: workspace.organizationId
}
}
});
assertWithinLimit(entitlements, "projects", currentCount, 1);
const project = await prisma.project.create({
data: {
workspaceId: workspace.id,
name: payload.name,
subtitle: payload.subtitle || "COSMIC AI risk measurement workspace",
projectType: payload.projectType || "AI-Enabler",
currentLifecyclePhase: payload.currentLifecyclePhase || "Needs identification",
riskAppetite: Number(payload.riskAppetite || 50),
assessmentDate: payload.assessmentDate ? new Date(payload.assessmentDate) : new Date(),
status: "Active",
ownerDisplayName: payload.ownerDisplayName || actor.displayName,
description: payload.description || "",
thresholds: payload.thresholds || {},
reviews: payload.reviews || {}
}
});
await writeAuditEvent({
organizationId: workspace.organizationId,
workspaceId: workspace.id,
projectId: project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "create",
afterJson: project,
request
});
return project;
}
async function getProject(projectId) {
const project = await prisma.project.findUnique({
where: {
id: projectId
},
include: {
lifecyclePhases: {
orderBy: {
sequence: "asc"
}
},
risks: {
include: {
mitigations: true,
evidence: true
}
},
indicators: true,
experiments: {
include: {
metrics: true
}
}
}
});
if (!project) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
return project;
}
async function updateProject({ projectScope, actor, payload, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectScope.project.id
}
});
const project = await prisma.project.update({
where: {
id: projectScope.project.id
},
data: {
name: payload.name ?? before.name,
subtitle: payload.subtitle ?? before.subtitle,
projectType: payload.projectType ?? before.projectType,
currentLifecyclePhase: payload.currentLifecyclePhase ?? before.currentLifecyclePhase,
riskAppetite: payload.riskAppetite !== undefined ? Number(payload.riskAppetite) : before.riskAppetite,
status: payload.status ?? before.status,
ownerDisplayName: payload.ownerDisplayName ?? before.ownerDisplayName,
description: payload.description ?? before.description,
thresholds: payload.thresholds ?? before.thresholds,
reviews: payload.reviews ?? before.reviews
}
});
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId: projectScope.project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "update",
beforeJson: before,
afterJson: project,
request
});
return project;
}
async function deleteProject({ projectScope, projectId, actor, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectId
}
});
if (!before) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId,
actorUserId: actor.id,
entityType: "Project",
entityId: projectId,
action: "delete",
beforeJson: before,
request
}).catch(()=>{});
const expIds = (await prisma.experiment.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((e)=>e.id);
await prisma.modelMetric.deleteMany({
where: {
experimentId: {
in: expIds
}
}
});
await prisma.auditEvent.deleteMany({
where: {
projectId
}
});
await prisma.reportExport.deleteMany({
where: {
projectId
}
});
await prisma.externalWorkItemMapping.deleteMany({
where: {
projectId
}
});
await prisma.integrationSyncRun.deleteMany({
where: {
projectId
}
});
const gateIds = (await prisma.gateEvaluation.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((g)=>g.id);
await prisma.gateDecision.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateCriterion.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateEvaluation.deleteMany({
where: {
projectId
}
});
await prisma.evidence.deleteMany({
where: {
projectId
}
});
const riskIds = (await prisma.risk.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((r)=>r.id);
await prisma.mitigation.deleteMany({
where: {
riskId: {
in: riskIds
}
}
});
await prisma.risk.deleteMany({
where: {
projectId
}
});
await prisma.experiment.deleteMany({
where: {
projectId
}
});
await prisma.lifecyclePhase.deleteMany({
where: {
projectId
}
});
await prisma.indicator.deleteMany({
where: {
projectId
}
});
await prisma.project.delete({
where: {
id: projectId
}
});
return {
deleted: true
};
}
module.exports = {
getLatestSubscription,
listWorkspaceProjects,
createProject,
getProject,
updateProject,
deleteProject
};
g!')7lrtD __webpack_require__796487633518buffersourcesizemapshash
const { prisma } = __webpack_require__(7964);
const { buildEntitlements, assertWithinLimit } = __webpack_require__(8763);
const { writeAuditEvent } = __webpack_require__(3518);
async function getLatestSubscription(organizationId) {
return prisma.subscription.findFirst({
where: {
organizationId
},
orderBy: {
createdAt: "desc"
}
});
}
async function listWorkspaceProjects(workspaceId) {
return prisma.project.findMany({
where: {
workspaceId
},
orderBy: {
createdAt: "desc"
}
});
}
async function createProject({ workspace, actor, payload, request }) {
const subscription = await getLatestSubscription(workspace.organizationId);
const organization = await prisma.organization.findUnique({
where: {
id: workspace.organizationId
}
});
const entitlements = buildEntitlements(subscription, organization);
const currentCount = await prisma.project.count({
where: {
workspace: {
organizationId: workspace.organizationId
}
}
});
assertWithinLimit(entitlements, "projects", currentCount, 1);
const project = await prisma.project.create({
data: {
workspaceId: workspace.id,
name: payload.name,
subtitle: payload.subtitle || "COSMIC AI risk measurement workspace",
projectType: payload.projectType || "AI-Enabler",
currentLifecyclePhase: payload.currentLifecyclePhase || "Needs identification",
riskAppetite: Number(payload.riskAppetite || 50),
assessmentDate: payload.assessmentDate ? new Date(payload.assessmentDate) : new Date(),
status: "Active",
ownerDisplayName: payload.ownerDisplayName || actor.displayName,
description: payload.description || "",
thresholds: payload.thresholds || {},
reviews: payload.reviews || {}
}
});
await writeAuditEvent({
organizationId: workspace.organizationId,
workspaceId: workspace.id,
projectId: project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "create",
afterJson: project,
request
});
return project;
}
async function getProject(projectId) {
const project = await prisma.project.findUnique({
where: {
id: projectId
},
include: {
lifecyclePhases: {
orderBy: {
sequence: "asc"
}
},
risks: {
include: {
mitigations: true,
evidence: true
}
},
indicators: true,
experiments: {
include: {
metrics: true
}
}
}
});
if (!project) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
return project;
}
async function updateProject({ projectScope, actor, payload, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectScope.project.id
}
});
const project = await prisma.project.update({
where: {
id: projectScope.project.id
},
data: {
name: payload.name ?? before.name,
subtitle: payload.subtitle ?? before.subtitle,
projectType: payload.projectType ?? before.projectType,
currentLifecyclePhase: payload.currentLifecyclePhase ?? before.currentLifecyclePhase,
riskAppetite: payload.riskAppetite !== undefined ? Number(payload.riskAppetite) : before.riskAppetite,
status: payload.status ?? before.status,
ownerDisplayName: payload.ownerDisplayName ?? before.ownerDisplayName,
description: payload.description ?? before.description,
thresholds: payload.thresholds ?? before.thresholds,
reviews: payload.reviews ?? before.reviews
}
});
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId: projectScope.project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "update",
beforeJson: before,
afterJson: project,
request
});
return project;
}
async function deleteProject({ projectScope, projectId, actor, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectId
}
});
if (!before) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId,
actorUserId: actor.id,
entityType: "Project",
entityId: projectId,
action: "delete",
beforeJson: before,
request
}).catch(()=>{});
const expIds = (await prisma.experiment.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((e)=>e.id);
await prisma.modelMetric.deleteMany({
where: {
experimentId: {
in: expIds
}
}
});
await prisma.auditEvent.deleteMany({
where: {
projectId
}
});
await prisma.reportExport.deleteMany({
where: {
projectId
}
});
await prisma.externalWorkItemMapping.deleteMany({
where: {
projectId
}
});
await prisma.integrationSyncRun.deleteMany({
where: {
projectId
}
});
const gateIds = (await prisma.gateEvaluation.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((g)=>g.id);
await prisma.gateDecision.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateCriterion.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateEvaluation.deleteMany({
where: {
projectId
}
});
await prisma.evidence.deleteMany({
where: {
projectId
}
});
const riskIds = (await prisma.risk.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((r)=>r.id);
await prisma.mitigation.deleteMany({
where: {
riskId: {
in: riskIds
}
}
});
await prisma.risk.deleteMany({
where: {
projectId
}
});
await prisma.experiment.deleteMany({
where: {
projectId
}
});
await prisma.lifecyclePhase.deleteMany({
where: {
projectId
}
});
await prisma.indicator.deleteMany({
where: {
projectId
}
});
await prisma.project.delete({
where: {
id: projectId
}
});
return {
deleted: true
};
}
module.exports = {
getLatestSubscription,
listWorkspaceProjects,
createProject,
getProject,
updateProject,
deleteProject
};
{"finalSource":true}mapbufferedMap ReplaceSourceRawSource "use strict";
const { prisma } = require("../lib/prisma");
const { buildEntitlements, assertWithinLimit } = require("../domain/entitlements");
const { writeAuditEvent } = require("./audit-service");
async function getLatestSubscription(organizationId) {
return prisma.subscription.findFirst({
where: {
organizationId
},
orderBy: {
createdAt: "desc"
}
});
}
async function listWorkspaceProjects(workspaceId) {
return prisma.project.findMany({
where: {
workspaceId
},
orderBy: {
createdAt: "desc"
}
});
}
async function createProject({ workspace, actor, payload, request }) {
const subscription = await getLatestSubscription(workspace.organizationId);
const organization = await prisma.organization.findUnique({
where: {
id: workspace.organizationId
}
});
const entitlements = buildEntitlements(subscription, organization);
const currentCount = await prisma.project.count({
where: {
workspace: {
organizationId: workspace.organizationId
}
}
});
assertWithinLimit(entitlements, "projects", currentCount, 1);
const project = await prisma.project.create({
data: {
workspaceId: workspace.id,
name: payload.name,
subtitle: payload.subtitle || "COSMIC AI risk measurement workspace",
projectType: payload.projectType || "AI-Enabler",
currentLifecyclePhase: payload.currentLifecyclePhase || "Needs identification",
riskAppetite: Number(payload.riskAppetite || 50),
assessmentDate: payload.assessmentDate ? new Date(payload.assessmentDate) : new Date(),
status: "Active",
ownerDisplayName: payload.ownerDisplayName || actor.displayName,
description: payload.description || "",
thresholds: payload.thresholds || {},
reviews: payload.reviews || {}
}
});
await writeAuditEvent({
organizationId: workspace.organizationId,
workspaceId: workspace.id,
projectId: project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "create",
afterJson: project,
request
});
return project;
}
async function getProject(projectId) {
const project = await prisma.project.findUnique({
where: {
id: projectId
},
include: {
lifecyclePhases: {
orderBy: {
sequence: "asc"
}
},
risks: {
include: {
mitigations: true,
evidence: true
}
},
indicators: true,
experiments: {
include: {
metrics: true
}
}
}
});
if (!project) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
return project;
}
async function updateProject({ projectScope, actor, payload, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectScope.project.id
}
});
const project = await prisma.project.update({
where: {
id: projectScope.project.id
},
data: {
name: payload.name ?? before.name,
subtitle: payload.subtitle ?? before.subtitle,
projectType: payload.projectType ?? before.projectType,
currentLifecyclePhase: payload.currentLifecyclePhase ?? before.currentLifecyclePhase,
riskAppetite: payload.riskAppetite !== undefined ? Number(payload.riskAppetite) : before.riskAppetite,
status: payload.status ?? before.status,
ownerDisplayName: payload.ownerDisplayName ?? before.ownerDisplayName,
description: payload.description ?? before.description,
thresholds: payload.thresholds ?? before.thresholds,
reviews: payload.reviews ?? before.reviews
}
});
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId: projectScope.project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "update",
beforeJson: before,
afterJson: project,
request
});
return project;
}
async function deleteProject({ projectScope, projectId, actor, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectId
}
});
if (!before) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId,
actorUserId: actor.id,
entityType: "Project",
entityId: projectId,
action: "delete",
beforeJson: before,
request
}).catch(()=>{});
const expIds = (await prisma.experiment.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((e)=>e.id);
await prisma.modelMetric.deleteMany({
where: {
experimentId: {
in: expIds
}
}
});
await prisma.auditEvent.deleteMany({
where: {
projectId
}
});
await prisma.reportExport.deleteMany({
where: {
projectId
}
});
await prisma.externalWorkItemMapping.deleteMany({
where: {
projectId
}
});
await prisma.integrationSyncRun.deleteMany({
where: {
projectId
}
});
const gateIds = (await prisma.gateEvaluation.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((g)=>g.id);
await prisma.gateDecision.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateCriterion.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateEvaluation.deleteMany({
where: {
projectId
}
});
await prisma.evidence.deleteMany({
where: {
projectId
}
});
const riskIds = (await prisma.risk.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((r)=>r.id);
await prisma.mitigation.deleteMany({
where: {
riskId: {
in: riskIds
}
}
});
await prisma.risk.deleteMany({
where: {
projectId
}
});
await prisma.experiment.deleteMany({
where: {
projectId
}
});
await prisma.lifecyclePhase.deleteMany({
where: {
projectId
}
});
await prisma.indicator.deleteMany({
where: {
projectId
}
});
await prisma.project.delete({
where: {
id: projectId
}
});
return {
deleted: true
};
}
module.exports = {
getLatestSubscription,
listWorkspaceProjects,
createProject,
getProject,
updateProject,
deleteProject
};
012undefined3339__webpack_require__undefined41557964undefined108114__webpack_require__undefined1161398763undefined171177__webpack_require__undefined1791953518undefined
/***/ })Z /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
const { prisma } = __webpack_require__(7964);
const { buildEntitlements, assertWithinLimit } = __webpack_require__(8763);
const { writeAuditEvent } = __webpack_require__(3518);
async function getLatestSubscription(organizationId) {
return prisma.subscription.findFirst({
where: {
organizationId
},
orderBy: {
createdAt: "desc"
}
});
}
async function listWorkspaceProjects(workspaceId) {
return prisma.project.findMany({
where: {
workspaceId
},
orderBy: {
createdAt: "desc"
}
});
}
async function createProject({ workspace, actor, payload, request }) {
const subscription = await getLatestSubscription(workspace.organizationId);
const organization = await prisma.organization.findUnique({
where: {
id: workspace.organizationId
}
});
const entitlements = buildEntitlements(subscription, organization);
const currentCount = await prisma.project.count({
where: {
workspace: {
organizationId: workspace.organizationId
}
}
});
assertWithinLimit(entitlements, "projects", currentCount, 1);
const project = await prisma.project.create({
data: {
workspaceId: workspace.id,
name: payload.name,
subtitle: payload.subtitle || "COSMIC AI risk measurement workspace",
projectType: payload.projectType || "AI-Enabler",
currentLifecyclePhase: payload.currentLifecyclePhase || "Needs identification",
riskAppetite: Number(payload.riskAppetite || 50),
assessmentDate: payload.assessmentDate ? new Date(payload.assessmentDate) : new Date(),
status: "Active",
ownerDisplayName: payload.ownerDisplayName || actor.displayName,
description: payload.description || "",
thresholds: payload.thresholds || {},
reviews: payload.reviews || {}
}
});
await writeAuditEvent({
organizationId: workspace.organizationId,
workspaceId: workspace.id,
projectId: project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "create",
afterJson: project,
request
});
return project;
}
async function getProject(projectId) {
const project = await prisma.project.findUnique({
where: {
id: projectId
},
include: {
lifecyclePhases: {
orderBy: {
sequence: "asc"
}
},
risks: {
include: {
mitigations: true,
evidence: true
}
},
indicators: true,
experiments: {
include: {
metrics: true
}
}
}
});
if (!project) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
return project;
}
async function updateProject({ projectScope, actor, payload, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectScope.project.id
}
});
const project = await prisma.project.update({
where: {
id: projectScope.project.id
},
data: {
name: payload.name ?? before.name,
subtitle: payload.subtitle ?? before.subtitle,
projectType: payload.projectType ?? before.projectType,
currentLifecyclePhase: payload.currentLifecyclePhase ?? before.currentLifecyclePhase,
riskAppetite: payload.riskAppetite !== undefined ? Number(payload.riskAppetite) : before.riskAppetite,
status: payload.status ?? before.status,
ownerDisplayName: payload.ownerDisplayName ?? before.ownerDisplayName,
description: payload.description ?? before.description,
thresholds: payload.thresholds ?? before.thresholds,
reviews: payload.reviews ?? before.reviews
}
});
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId: projectScope.project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "update",
beforeJson: before,
afterJson: project,
request
});
return project;
}
async function deleteProject({ projectScope, projectId, actor, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectId
}
});
if (!before) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId,
actorUserId: actor.id,
entityType: "Project",
entityId: projectId,
action: "delete",
beforeJson: before,
request
}).catch(()=>{});
const expIds = (await prisma.experiment.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((e)=>e.id);
await prisma.modelMetric.deleteMany({
where: {
experimentId: {
in: expIds
}
}
});
await prisma.auditEvent.deleteMany({
where: {
projectId
}
});
await prisma.reportExport.deleteMany({
where: {
projectId
}
});
await prisma.externalWorkItemMapping.deleteMany({
where: {
projectId
}
});
await prisma.integrationSyncRun.deleteMany({
where: {
projectId
}
});
const gateIds = (await prisma.gateEvaluation.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((g)=>g.id);
await prisma.gateDecision.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateCriterion.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateEvaluation.deleteMany({
where: {
projectId
}
});
await prisma.evidence.deleteMany({
where: {
projectId
}
});
const riskIds = (await prisma.risk.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((r)=>r.id);
await prisma.mitigation.deleteMany({
where: {
riskId: {
in: riskIds
}
}
});
await prisma.risk.deleteMany({
where: {
projectId
}
});
await prisma.experiment.deleteMany({
where: {
projectId
}
});
await prisma.lifecyclePhase.deleteMany({
where: {
projectId
}
});
await prisma.indicator.deleteMany({
where: {
projectId
}
});
await prisma.project.delete({
where: {
id: projectId
}
});
return {
deleted: true
};
}
module.exports = {
getLatestSubscription,
listWorkspaceProjects,
createProject,
getProject,
updateProject,
deleteProject
};
/***/ }) "use strict";
const { prisma } = require("../lib/prisma");
const { buildEntitlements, assertWithinLimit } = require("../domain/entitlements");
const { writeAuditEvent } = require("./audit-service");
async function getLatestSubscription(organizationId) {
return prisma.subscription.findFirst({
where: {
organizationId
},
orderBy: {
createdAt: "desc"
}
});
}
async function listWorkspaceProjects(workspaceId) {
return prisma.project.findMany({
where: {
workspaceId
},
orderBy: {
createdAt: "desc"
}
});
}
async function createProject({ workspace, actor, payload, request }) {
const subscription = await getLatestSubscription(workspace.organizationId);
const organization = await prisma.organization.findUnique({
where: {
id: workspace.organizationId
}
});
const entitlements = buildEntitlements(subscription, organization);
const currentCount = await prisma.project.count({
where: {
workspace: {
organizationId: workspace.organizationId
}
}
});
assertWithinLimit(entitlements, "projects", currentCount, 1);
const project = await prisma.project.create({
data: {
workspaceId: workspace.id,
name: payload.name,
subtitle: payload.subtitle || "COSMIC AI risk measurement workspace",
projectType: payload.projectType || "AI-Enabler",
currentLifecyclePhase: payload.currentLifecyclePhase || "Needs identification",
riskAppetite: Number(payload.riskAppetite || 50),
assessmentDate: payload.assessmentDate ? new Date(payload.assessmentDate) : new Date(),
status: "Active",
ownerDisplayName: payload.ownerDisplayName || actor.displayName,
description: payload.description || "",
thresholds: payload.thresholds || {},
reviews: payload.reviews || {}
}
});
await writeAuditEvent({
organizationId: workspace.organizationId,
workspaceId: workspace.id,
projectId: project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "create",
afterJson: project,
request
});
return project;
}
async function getProject(projectId) {
const project = await prisma.project.findUnique({
where: {
id: projectId
},
include: {
lifecyclePhases: {
orderBy: {
sequence: "asc"
}
},
risks: {
include: {
mitigations: true,
evidence: true
}
},
indicators: true,
experiments: {
include: {
metrics: true
}
}
}
});
if (!project) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
return project;
}
async function updateProject({ projectScope, actor, payload, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectScope.project.id
}
});
const project = await prisma.project.update({
where: {
id: projectScope.project.id
},
data: {
name: payload.name ?? before.name,
subtitle: payload.subtitle ?? before.subtitle,
projectType: payload.projectType ?? before.projectType,
currentLifecyclePhase: payload.currentLifecyclePhase ?? before.currentLifecyclePhase,
riskAppetite: payload.riskAppetite !== undefined ? Number(payload.riskAppetite) : before.riskAppetite,
status: payload.status ?? before.status,
ownerDisplayName: payload.ownerDisplayName ?? before.ownerDisplayName,
description: payload.description ?? before.description,
thresholds: payload.thresholds ?? before.thresholds,
reviews: payload.reviews ?? before.reviews
}
});
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId: projectScope.project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "update",
beforeJson: before,
afterJson: project,
request
});
return project;
}
async function deleteProject({ projectScope, projectId, actor, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectId
}
});
if (!before) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId,
actorUserId: actor.id,
entityType: "Project",
entityId: projectId,
action: "delete",
beforeJson: before,
request
}).catch(()=>{});
const expIds = (await prisma.experiment.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((e)=>e.id);
await prisma.modelMetric.deleteMany({
where: {
experimentId: {
in: expIds
}
}
});
await prisma.auditEvent.deleteMany({
where: {
projectId
}
});
await prisma.reportExport.deleteMany({
where: {
projectId
}
});
await prisma.externalWorkItemMapping.deleteMany({
where: {
projectId
}
});
await prisma.integrationSyncRun.deleteMany({
where: {
projectId
}
});
const gateIds = (await prisma.gateEvaluation.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((g)=>g.id);
await prisma.gateDecision.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateCriterion.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateEvaluation.deleteMany({
where: {
projectId
}
});
await prisma.evidence.deleteMany({
where: {
projectId
}
});
const riskIds = (await prisma.risk.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((r)=>r.id);
await prisma.mitigation.deleteMany({
where: {
riskId: {
in: riskIds
}
}
});
await prisma.risk.deleteMany({
where: {
projectId
}
});
await prisma.experiment.deleteMany({
where: {
projectId
}
});
await prisma.lifecyclePhase.deleteMany({
where: {
projectId
}
});
await prisma.indicator.deleteMany({
where: {
projectId
}
});
await prisma.project.delete({
where: {
id: projectId
}
});
return {
deleted: true
};
}
module.exports = {
getLatestSubscription,
listWorkspaceProjects,
createProject,
getProject,
updateProject,
deleteProject
};
012undefined3339__webpack_require__undefined41557964undefined108114__webpack_require__undefined1161398763undefined171177__webpack_require__undefined1791953518undefined
};
;Y exports.id = 9978;
exports.ids = [9978];
exports.modules = {
/***/ 2488:
/***/ ((module) => {
"use strict";
function jsonResponse(payload, status = 200, headers = {}) {
return Response.json(payload, {
status,
headers: Object.assign({
"Cache-Control": "no-store"
}, headers)
});
}
function errorResponse(error) {
return jsonResponse({
error: error.message || "Unexpected error",
details: error.details || undefined
}, error.status || 500);
}
async function parseJson(request) {
const text = await request.text();
if (!text) return {};
return JSON.parse(text);
}
module.exports = {
jsonResponse,
errorResponse,
parseJson
};
/***/ }),
/***/ 2773:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
const { prisma } = __webpack_require__(7964);
async function getActorFromRequest(request) {
const cookie = request.headers.get("cookie") || "";
const sessionMatch = cookie.match(/cosmic_session=([^;]+)/);
if (sessionMatch) {
const session = await prisma.session.findUnique({
where: {
token: sessionMatch[1]
},
include: {
user: {
include: {
memberships: {
where: {
status: "ACTIVE"
},
include: {
role: true,
organization: true
}
}
}
}
}
});
if (session && session.expiresAt > new Date()) {
return session.user;
}
if (session) {
await prisma.session.delete({
where: {
id: session.id
}
}).catch(()=>{});
}
}
const email = request.headers.get("x-cosmic-user-email") || process.env.COSMIC_BOOTSTRAP_EMAIL || "owner@cosmic.local";
const user = await prisma.user.findUnique({
where: {
email
},
include: {
memberships: {
where: {
status: "ACTIVE"
},
include: {
role: true,
organization: true
}
}
}
});
if (!user) {
const error = new Error(`Unknown actor: ${email}`);
error.status = 401;
throw error;
}
return user;
}
function getMembership(actor, organizationId) {
return actor.memberships.find((item)=>item.organizationId === organizationId && item.status === "ACTIVE");
}
async function requireOrganizationActor(request, organizationId, permission = "project:read") {
const { hasPermission } = __webpack_require__(5707);
const actor = await getActorFromRequest(request);
const membership = getMembership(actor, organizationId);
if (!membership) {
const error = new Error("Actor is not a member of this organization.");
error.status = 403;
throw error;
}
if (!hasPermission(membership.role.permissions, permission)) {
const error = new Error(`Permission denied: ${permission}`);
error.status = 403;
throw error;
}
return {
actor,
membership,
organization: membership.organization
};
}
module.exports = {
getActorFromRequest,
requireOrganizationActor
};
/***/ }),
/***/ 3421:
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
var __webpack_unused_export__;
__webpack_unused_export__ = ({
value: true
});
Object.defineProperty(exports, "I", ({
enumerable: true,
get: function() {
return sendResponse;
}
}));
const _helpers = __webpack_require__(1237);
const _pipereadable = __webpack_require__(5088);
const _utils = __webpack_require__(7679);
async function sendResponse(req, res, response, waitUntil) {
if (// The type check here ensures that `req` is correctly typed, and the
// environment variable check provides dead code elimination.
true && (0, _helpers.isNodeNextResponse)(res)) {
var // Copy over the response headers.
_response_headers;
// Copy over the response status.
res.statusCode = response.status;
res.statusMessage = response.statusText;
// TODO: this is not spec-compliant behavior and we should not restrict
// headers that are allowed to appear many times.
//
// See:
// https://github.com/vercel/next.js/pull/70127
const headersWithMultipleValuesAllowed = [
// can add more headers to this list if needed
'set-cookie',
'www-authenticate',
'proxy-authenticate',
'vary'
];
(_response_headers = response.headers) == null ? void 0 : _response_headers.forEach((value, name)=>{
// `x-middleware-set-cookie` is an internal header not needed for the response
if (name.toLowerCase() === 'x-middleware-set-cookie') {
return;
}
// The append handling is special cased for `set-cookie`.
if (name.toLowerCase() === 'set-cookie') {
// TODO: (wyattjoh) replace with native response iteration when we can upgrade undici
for (const cookie of (0, _utils.splitCookiesString)(value)){
res.appendHeader(name, cookie);
}
} else {
// only append the header if it is either not present in the outbound response
// or if the header supports multiple values
const isHeaderPresent = typeof res.getHeader(name) !== 'undefined';
if (headersWithMultipleValuesAllowed.includes(name.toLowerCase()) || !isHeaderPresent) {
res.appendHeader(name, value);
}
}
});
/**
* The response can't be directly piped to the underlying response. The
* following is duplicated from the edge runtime handler.
*
* See packages/next/server/next-server.ts
*/ const { originalResponse } = res;
// A response body must not be sent for HEAD requests. See https://httpwg.org/specs/rfc9110.html#HEAD
if (response.body && req.method !== 'HEAD') {
await (0, _pipereadable.pipeToNodeResponse)(response.body, originalResponse, waitUntil);
} else {
originalResponse.end();
}
}
}
//# sourceMappingURL=send-response.js.map
/***/ }),
/***/ 3518:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
const { prisma } = __webpack_require__(7964);
async function writeAuditEvent({ organizationId, workspaceId = null, projectId = null, actorUserId = null, entityType, entityId, action, beforeJson = null, afterJson = null, request = null }) {
return prisma.auditEvent.create({
data: {
organizationId,
workspaceId,
projectId,
actorUserId,
entityType,
entityId,
action,
beforeJson,
afterJson,
ipAddress: request ? request.headers.get("x-forwarded-for") || null : null,
userAgent: request ? request.headers.get("user-agent") || null : null
}
});
}
module.exports = {
writeAuditEvent
};
/***/ }),
/***/ 5707:
/***/ ((module) => {
"use strict";
const PERMISSIONS = [
"organization:manage",
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"risk:delete",
"mitigation:write",
"gate:read",
"gate:evaluate",
"gate:review",
"report:export",
"integration:read",
"integration:manage",
"integration:sync",
"oauth:manage",
"billing:manage",
"audit:read"
];
const ROLE_PERMISSIONS = {
owner: [
"*"
],
admin: [
"organization:manage",
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"risk:delete",
"mitigation:write",
"gate:evaluate",
"gate:review",
"report:export",
"integration:manage",
"billing:manage",
"audit:read"
],
project_manager: [
"project:read",
"project:write",
"risk:read",
"risk:write",
"mitigation:write",
"gate:evaluate",
"report:export",
"integration:read",
"audit:read"
],
risk_owner: [
"project:read",
"risk:read",
"risk:write",
"mitigation:write",
"gate:read"
],
governance_reviewer: [
"project:read",
"risk:read",
"gate:evaluate",
"gate:review",
"report:export",
"audit:read"
],
legal_ethics_reviewer: [
"project:read",
"risk:read",
"mitigation:write",
"gate:review",
"report:export",
"audit:read"
],
integration_admin: [
"project:read",
"integration:read",
"integration:manage",
"integration:sync",
"oauth:manage",
"audit:read"
],
viewer: [
"project:read",
"risk:read",
"gate:read",
"integration:read",
"report:export"
],
consultant: [
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"mitigation:write",
"gate:evaluate",
"gate:review",
"report:export",
"audit:read"
]
};
function unique(values) {
return Array.from(new Set(values.filter(Boolean)));
}
function resolvePermissions(roleCodeOrPermissions) {
if (Array.isArray(roleCodeOrPermissions)) return unique(roleCodeOrPermissions);
return ROLE_PERMISSIONS[roleCodeOrPermissions] ? ROLE_PERMISSIONS[roleCodeOrPermissions].slice() : [];
}
function hasPermission(roleCodeOrPermissions, permission) {
const permissions = resolvePermissions(roleCodeOrPermissions);
return permissions.includes("*") || permissions.includes(permission);
}
function assertPermission(roleCodeOrPermissions, permission) {
if (!hasPermission(roleCodeOrPermissions, permission)) {
const error = new Error(`Permission denied: ${permission}`);
error.status = 403;
throw error;
}
}
function canAccessWorkspace(membership, workspaceId) {
if (!membership || membership.status !== "ACTIVE") return false;
if (!membership.workspaceScope || membership.workspaceScope.length === 0) return true;
return membership.workspaceScope.includes(workspaceId);
}
function canMutateRisk(membership) {
return canAccessWorkspace(membership, "workspace-a") && hasPermission(membership.permissions || membership.role?.permissions, "risk:write");
}
module.exports = {
PERMISSIONS,
ROLE_PERMISSIONS,
resolvePermissions,
hasPermission,
assertPermission,
canAccessWorkspace,
canMutateRisk
};
/***/ }),
/***/ 5736:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
if (false) {} else {
if (false) {} else {
if (false) {} else {
if (false) {} else {
module.exports = __webpack_require__(4870);
}
}
}
}
//# sourceMappingURL=module.compiled.js.map
/***/ }),
/***/ 6487:
/***/ (() => {
/***/ }),
/***/ 7964:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
const { PrismaClient } = __webpack_require__(6330);
const globalForPrisma = globalThis;
const prisma = globalForPrisma.__cosmicPrisma || new PrismaClient();
if (false) {}
module.exports = {
prisma
};
/***/ }),
/***/ 8335:
/***/ (() => {
/***/ }),
/***/ 8763:
/***/ ((module) => {
"use strict";
const PLAN_LIMITS = {
pilot: {
users: 10,
projects: 5,
reportsPerMonth: 100,
integrations: 4,
storageMb: 1024
},
starter: {
users: 5,
projects: 3,
reportsPerMonth: 25,
integrations: 1,
storageMb: 512
},
team: {
users: 25,
projects: 20,
reportsPerMonth: 500,
integrations: 4,
storageMb: 10240
},
enterprise: {
users: 1000,
projects: 1000,
reportsPerMonth: 100000,
integrations: 100,
storageMb: 102400
}
};
const ACTIVE_SUBSCRIPTION_STATUSES = [
"TRIALING",
"ACTIVE"
];
function getPlanLimits(planCode) {
return PLAN_LIMITS[planCode] || PLAN_LIMITS.starter;
}
function subscriptionAllowsAccess(subscription, organization) {
if (organization && organization.status === "SUSPENDED") return false;
if (!subscription) return false;
if (subscription.adminOverride) return true;
return ACTIVE_SUBSCRIPTION_STATUSES.includes(subscription.status);
}
function buildEntitlements(subscription, organization) {
const baseLimits = getPlanLimits(subscription ? subscription.planCode : organization ? organization.planCode : "starter");
return {
active: subscriptionAllowsAccess(subscription, organization),
source: subscription ? subscription.source : "MANUAL",
status: subscription ? subscription.status : "SUSPENDED",
planCode: subscription ? subscription.planCode : organization ? organization.planCode : "starter",
limits: {
users: subscription && subscription.userLimit ? subscription.userLimit : baseLimits.users,
projects: subscription && subscription.projectLimit ? subscription.projectLimit : baseLimits.projects,
reportsPerMonth: subscription && subscription.reportLimitMonthly ? subscription.reportLimitMonthly : baseLimits.reportsPerMonth,
integrations: subscription && subscription.integrationLimit ? subscription.integrationLimit : baseLimits.integrations,
storageMb: subscription && subscription.storageMbLimit ? subscription.storageMbLimit : baseLimits.storageMb
}
};
}
function assertWithinLimit(entitlements, metric, currentCount, increment = 1) {
if (!entitlements.active) {
const error = new Error("Subscription is not active.");
error.status = 402;
throw error;
}
const limit = entitlements.limits[metric];
if (limit !== undefined && currentCount + increment > limit) {
const error = new Error(`Plan limit exceeded for ${metric}.`);
error.status = 402;
error.details = {
metric,
currentCount,
increment,
limit
};
throw error;
}
}
module.exports = {
PLAN_LIMITS,
ACTIVE_SUBSCRIPTION_STATUSES,
getPlanLimits,
buildEntitlements,
subscriptionAllowsAccess,
assertWithinLimit
};
/***/ }),
/***/ 9316:
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
const { prisma } = __webpack_require__(7964);
const { buildEntitlements, assertWithinLimit } = __webpack_require__(8763);
const { writeAuditEvent } = __webpack_require__(3518);
async function getLatestSubscription(organizationId) {
return prisma.subscription.findFirst({
where: {
organizationId
},
orderBy: {
createdAt: "desc"
}
});
}
async function listWorkspaceProjects(workspaceId) {
return prisma.project.findMany({
where: {
workspaceId
},
orderBy: {
createdAt: "desc"
}
});
}
async function createProject({ workspace, actor, payload, request }) {
const subscription = await getLatestSubscription(workspace.organizationId);
const organization = await prisma.organization.findUnique({
where: {
id: workspace.organizationId
}
});
const entitlements = buildEntitlements(subscription, organization);
const currentCount = await prisma.project.count({
where: {
workspace: {
organizationId: workspace.organizationId
}
}
});
assertWithinLimit(entitlements, "projects", currentCount, 1);
const project = await prisma.project.create({
data: {
workspaceId: workspace.id,
name: payload.name,
subtitle: payload.subtitle || "COSMIC AI risk measurement workspace",
projectType: payload.projectType || "AI-Enabler",
currentLifecyclePhase: payload.currentLifecyclePhase || "Needs identification",
riskAppetite: Number(payload.riskAppetite || 50),
assessmentDate: payload.assessmentDate ? new Date(payload.assessmentDate) : new Date(),
status: "Active",
ownerDisplayName: payload.ownerDisplayName || actor.displayName,
description: payload.description || "",
thresholds: payload.thresholds || {},
reviews: payload.reviews || {}
}
});
await writeAuditEvent({
organizationId: workspace.organizationId,
workspaceId: workspace.id,
projectId: project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "create",
afterJson: project,
request
});
return project;
}
async function getProject(projectId) {
const project = await prisma.project.findUnique({
where: {
id: projectId
},
include: {
lifecyclePhases: {
orderBy: {
sequence: "asc"
}
},
risks: {
include: {
mitigations: true,
evidence: true
}
},
indicators: true,
experiments: {
include: {
metrics: true
}
}
}
});
if (!project) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
return project;
}
async function updateProject({ projectScope, actor, payload, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectScope.project.id
}
});
const project = await prisma.project.update({
where: {
id: projectScope.project.id
},
data: {
name: payload.name ?? before.name,
subtitle: payload.subtitle ?? before.subtitle,
projectType: payload.projectType ?? before.projectType,
currentLifecyclePhase: payload.currentLifecyclePhase ?? before.currentLifecyclePhase,
riskAppetite: payload.riskAppetite !== undefined ? Number(payload.riskAppetite) : before.riskAppetite,
status: payload.status ?? before.status,
ownerDisplayName: payload.ownerDisplayName ?? before.ownerDisplayName,
description: payload.description ?? before.description,
thresholds: payload.thresholds ?? before.thresholds,
reviews: payload.reviews ?? before.reviews
}
});
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId: projectScope.project.id,
actorUserId: actor.id,
entityType: "Project",
entityId: project.id,
action: "update",
beforeJson: before,
afterJson: project,
request
});
return project;
}
async function deleteProject({ projectScope, projectId, actor, request }) {
const before = await prisma.project.findUnique({
where: {
id: projectId
}
});
if (!before) {
const error = new Error(`Project not found: ${projectId}`);
error.status = 404;
throw error;
}
await writeAuditEvent({
organizationId: projectScope.organization.id,
workspaceId: projectScope.project.workspaceId,
projectId,
actorUserId: actor.id,
entityType: "Project",
entityId: projectId,
action: "delete",
beforeJson: before,
request
}).catch(()=>{});
const expIds = (await prisma.experiment.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((e)=>e.id);
await prisma.modelMetric.deleteMany({
where: {
experimentId: {
in: expIds
}
}
});
await prisma.auditEvent.deleteMany({
where: {
projectId
}
});
await prisma.reportExport.deleteMany({
where: {
projectId
}
});
await prisma.externalWorkItemMapping.deleteMany({
where: {
projectId
}
});
await prisma.integrationSyncRun.deleteMany({
where: {
projectId
}
});
const gateIds = (await prisma.gateEvaluation.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((g)=>g.id);
await prisma.gateDecision.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateCriterion.deleteMany({
where: {
gateId: {
in: gateIds
}
}
});
await prisma.gateEvaluation.deleteMany({
where: {
projectId
}
});
await prisma.evidence.deleteMany({
where: {
projectId
}
});
const riskIds = (await prisma.risk.findMany({
where: {
projectId
},
select: {
id: true
}
})).map((r)=>r.id);
await prisma.mitigation.deleteMany({
where: {
riskId: {
in: riskIds
}
}
});
await prisma.risk.deleteMany({
where: {
projectId
}
});
await prisma.experiment.deleteMany({
where: {
projectId
}
});
await prisma.lifecyclePhase.deleteMany({
where: {
projectId
}
});
await prisma.indicator.deleteMany({
where: {
projectId
}
});
await prisma.project.delete({
where: {
id: projectId
}
});
return {
deleted: true
};
}
module.exports = {
getLatestSubscription,
listWorkspaceProjects,
createProject,
getProject,
updateProject,
deleteProject
};
/***/ })
};
;{}`g ConcatSourceRawSourceJ exports.id = 9978;
exports.ids = [9978];
exports.modules = {
/***/ 2488:
$ /***/ ((module) => {
"use strict";
l "use strict";
function jsonResponse(payload, status = 200, headers = {}) {
return Response.json(payload, {
status,
headers: Object.assign({
"Cache-Control": "no-store"
}, headers)
});
}
function errorResponse(error) {
return jsonResponse({
error: error.message || "Unexpected error",
details: error.details || undefined
}, error.status || 500);
}
async function parseJson(request) {
const text = await request.text();
if (!text) return {};
return JSON.parse(text);
}
module.exports = {
jsonResponse,
errorResponse,
parseJson
};
012undefined RawSource
/***/ }) ,
/***/ 2773:
S /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
"use strict";
const { prisma } = require("./prisma");
async function getActorFromRequest(request) {
const cookie = request.headers.get("cookie") || "";
const sessionMatch = cookie.match(/cosmic_session=([^;]+)/);
if (sessionMatch) {
const session = await prisma.session.findUnique({
where: {
token: sessionMatch[1]
},
include: {
user: {
include: {
memberships: {
where: {
status: "ACTIVE"
},
include: {
role: true,
organization: true
}
}
}
}
}
});
if (session && session.expiresAt > new Date()) {
return session.user;
}
if (session) {
await prisma.session.delete({
where: {
id: session.id
}
}).catch(()=>{});
}
}
const email = request.headers.get("x-cosmic-user-email") || process.env.COSMIC_BOOTSTRAP_EMAIL || "owner@cosmic.local";
const user = await prisma.user.findUnique({
where: {
email
},
include: {
memberships: {
where: {
status: "ACTIVE"
},
include: {
role: true,
organization: true
}
}
}
});
if (!user) {
const error = new Error(`Unknown actor: ${email}`);
error.status = 401;
throw error;
}
return user;
}
function getMembership(actor, organizationId) {
return actor.memberships.find((item)=>item.organizationId === organizationId && item.status === "ACTIVE");
}
async function requireOrganizationActor(request, organizationId, permission = "project:read") {
const { hasPermission } = require("../domain/permissions");
const actor = await getActorFromRequest(request);
const membership = getMembership(actor, organizationId);
if (!membership) {
const error = new Error("Actor is not a member of this organization.");
error.status = 403;
throw error;
}
if (!hasPermission(membership.role.permissions, permission)) {
const error = new Error(`Permission denied: ${permission}`);
error.status = 403;
throw error;
}
return {
actor,
membership,
organization: membership.organization
};
}
module.exports = {
getActorFromRequest,
requireOrganizationActor
};
v 012undefined3339__webpack_require__undefined41507964undefined20882094__webpack_require__undefined209621185707undefined ,
/***/ 3421:
S /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
var __webpack_unused_export__;
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "sendResponse", {
enumerable: true,
get: function() {
return sendResponse;
}
});
const _helpers = require("./base-http/helpers");
const _pipereadable = require("./pipe-readable");
const _utils = require("./web/utils");
async function sendResponse(req, res, response, waitUntil) {
if (// The type check here ensures that `req` is correctly typed, and the
// environment variable check provides dead code elimination.
process.env.NEXT_RUNTIME !== 'edge' && (0, _helpers.isNodeNextResponse)(res)) {
var // Copy over the response headers.
_response_headers;
// Copy over the response status.
res.statusCode = response.status;
res.statusMessage = response.statusText;
// TODO: this is not spec-compliant behavior and we should not restrict
// headers that are allowed to appear many times.
//
// See:
// https://github.com/vercel/next.js/pull/70127
const headersWithMultipleValuesAllowed = [
// can add more headers to this list if needed
'set-cookie',
'www-authenticate',
'proxy-authenticate',
'vary'
];
(_response_headers = response.headers) == null ? void 0 : _response_headers.forEach((value, name)=>{
// `x-middleware-set-cookie` is an internal header not needed for the response
if (name.toLowerCase() === 'x-middleware-set-cookie') {
return;
}
// The append handling is special cased for `set-cookie`.
if (name.toLowerCase() === 'set-cookie') {
// TODO: (wyattjoh) replace with native response iteration when we can upgrade undici
for (const cookie of (0, _utils.splitCookiesString)(value)){
res.appendHeader(name, cookie);
}
} else {
// only append the header if it is either not present in the outbound response
// or if the header supports multiple values
const isHeaderPresent = typeof res.getHeader(name) !== 'undefined';
if (headersWithMultipleValuesAllowed.includes(name.toLowerCase()) || !isHeaderPresent) {
res.appendHeader(name, value);
}
}
});
/**
* The response can't be directly piped to the underlying response. The
* following is duplicated from the edge runtime handler.
*
* See packages/next/server/next-server.ts
*/ const { originalResponse } = res;
// A response body must not be sent for HEAD requests. See https://httpwg.org/specs/rfc9110.html#HEAD
if (response.body && req.method !== 'HEAD') {
await (0, _pipereadable.pipeToNodeResponse)(response.body, originalResponse, waitUntil);
} else {
originalResponse.end();
}
}
}
//# sourceMappingURL=send-response.js.map; 012undefined1458__webpack_unused_export__ = (undefined7878)undefined81127Object.defineProperty(exports, "I", (undefined210210))undefined230236__webpack_require__undefined2382581237undefined284290__webpack_require__undefined2923085088undefined327333__webpack_require__undefined3353477679undefined560594 trueundefined ,
/***/ 3518:
"use strict";
const { prisma } = require("../lib/prisma");
async function writeAuditEvent({ organizationId, workspaceId = null, projectId = null, actorUserId = null, entityType, entityId, action, beforeJson = null, afterJson = null, request = null }) {
return prisma.auditEvent.create({
data: {
organizationId,
workspaceId,
projectId,
actorUserId,
entityType,
entityId,
action,
beforeJson,
afterJson,
ipAddress: request ? request.headers.get("x-forwarded-for") || null : null,
userAgent: request ? request.headers.get("user-agent") || null : null
}
});
}
module.exports = {
writeAuditEvent
};
= 012undefined3339__webpack_require__undefined41557964undefined ,
/***/ 5707:
"use strict";
const PERMISSIONS = [
"organization:manage",
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"risk:delete",
"mitigation:write",
"gate:read",
"gate:evaluate",
"gate:review",
"report:export",
"integration:read",
"integration:manage",
"integration:sync",
"oauth:manage",
"billing:manage",
"audit:read"
];
const ROLE_PERMISSIONS = {
owner: [
"*"
],
admin: [
"organization:manage",
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"risk:delete",
"mitigation:write",
"gate:evaluate",
"gate:review",
"report:export",
"integration:manage",
"billing:manage",
"audit:read"
],
project_manager: [
"project:read",
"project:write",
"risk:read",
"risk:write",
"mitigation:write",
"gate:evaluate",
"report:export",
"integration:read",
"audit:read"
],
risk_owner: [
"project:read",
"risk:read",
"risk:write",
"mitigation:write",
"gate:read"
],
governance_reviewer: [
"project:read",
"risk:read",
"gate:evaluate",
"gate:review",
"report:export",
"audit:read"
],
legal_ethics_reviewer: [
"project:read",
"risk:read",
"mitigation:write",
"gate:review",
"report:export",
"audit:read"
],
integration_admin: [
"project:read",
"integration:read",
"integration:manage",
"integration:sync",
"oauth:manage",
"audit:read"
],
viewer: [
"project:read",
"risk:read",
"gate:read",
"integration:read",
"report:export"
],
consultant: [
"workspace:manage",
"project:read",
"project:write",
"risk:read",
"risk:write",
"mitigation:write",
"gate:evaluate",
"gate:review",
"report:export",
"audit:read"
]
};
function unique(values) {
return Array.from(new Set(values.filter(Boolean)));
}
function resolvePermissions(roleCodeOrPermissions) {
if (Array.isArray(roleCodeOrPermissions)) return unique(roleCodeOrPermissions);
return ROLE_PERMISSIONS[roleCodeOrPermissions] ? ROLE_PERMISSIONS[roleCodeOrPermissions].slice() : [];
}
function hasPermission(roleCodeOrPermissions, permission) {
const permissions = resolvePermissions(roleCodeOrPermissions);
return permissions.includes("*") || permissions.includes(permission);
}
function assertPermission(roleCodeOrPermissions, permission) {
if (!hasPermission(roleCodeOrPermissions, permission)) {
const error = new Error(`Permission denied: ${permission}`);
error.status = 403;
throw error;
}
}
function canAccessWorkspace(membership, workspaceId) {
if (!membership || membership.status !== "ACTIVE") return false;
if (!membership.workspaceScope || membership.workspaceScope.length === 0) return true;
return membership.workspaceScope.includes(workspaceId);
}
function canMutateRisk(membership) {
return canAccessWorkspace(membership, "workspace-a") && hasPermission(membership.permissions || membership.role?.permissions, "risk:write");
}
module.exports = {
PERMISSIONS,
ROLE_PERMISSIONS,
resolvePermissions,
hasPermission,
assertPermission,
canAccessWorkspace,
canMutateRisk
};
,
/***/ 5736:
R "use strict";
if (process.env.NEXT_RUNTIME === 'edge') {
module.exports = require('next/dist/server/route-modules/app-route/module.js');
} else {
if (process.env.__NEXT_EXPERIMENTAL_REACT) {
if (process.env.NODE_ENV === 'development') {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo-experimental.runtime.dev.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route-experimental.runtime.dev.js');
}
} else {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo-experimental.runtime.prod.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route-experimental.runtime.prod.js');
}
}
} else {
if (process.env.NODE_ENV === 'development') {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo.runtime.dev.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route.runtime.dev.js');
}
} else {
if (process.env.TURBOPACK) {
module.exports = require('next/dist/compiled/next-server/app-route-turbo.runtime.prod.js');
} else {
module.exports = require('next/dist/compiled/next-server/app-route.runtime.prod.js');
}
}
}
}
//# sourceMappingURL=module.compiled.js.map 012undefined1852falseundefined55141{}undefined158194falseundefined197906{}undefined927964falseundefined9671261{}undefined12861306falseundefined13091431{}undefined14561539module.exports = __webpack_require__(4870)undefined ,
/***/ 6487:
/***/ (() => {
,
/***/ 7964:
"use strict";
const { PrismaClient } = require("@prisma/client");
const globalForPrisma = globalThis;
const prisma = globalForPrisma.__cosmicPrisma || new PrismaClient();
if ("production" !== "production") {
globalForPrisma.__cosmicPrisma = prisma;
}
module.exports = {
prisma
};
b 012undefined3945__webpack_require__undefined47626330undefined175203falseundefined206253{}undefined ,
/***/ 8335:
,
/***/ 8763:
"use strict";
const PLAN_LIMITS = {
pilot: {
users: 10,
projects: 5,
reportsPerMonth: 100,
integrations: 4,
storageMb: 1024
},
starter: {
users: 5,
projects: 3,
reportsPerMonth: 25,
integrations: 1,
storageMb: 512
},
team: {
users: 25,
projects: 20,
reportsPerMonth: 500,
integrations: 4,
storageMb: 10240
},
enterprise: {
users: 1000,
projects: 1000,
reportsPerMonth: 100000,
integrations: 100,
storageMb: 102400
}
};
const ACTIVE_SUBSCRIPTION_STATUSES = [
"TRIALING",
"ACTIVE"
];
function getPlanLimits(planCode) {
return PLAN_LIMITS[planCode] || PLAN_LIMITS.starter;
}
function subscriptionAllowsAccess(subscription, organization) {
if (organization && organization.status === "SUSPENDED") return false;
if (!subscription) return false;
if (subscription.adminOverride) return true;
return ACTIVE_SUBSCRIPTION_STATUSES.includes(subscription.status);
}
function buildEntitlements(subscription, organization) {
const baseLimits = getPlanLimits(subscription ? subscription.planCode : organization ? organization.planCode : "starter");
return {
active: subscriptionAllowsAccess(subscription, organization),
source: subscription ? subscription.source : "MANUAL",
status: subscription ? subscription.status : "SUSPENDED",
planCode: subscription ? subscription.planCode : organization ? organization.planCode : "starter",
limits: {
users: subscription && subscription.userLimit ? subscription.userLimit : baseLimits.users,
projects: subscription && subscription.projectLimit ? subscription.projectLimit : baseLimits.projects,
reportsPerMonth: subscription && subscription.reportLimitMonthly ? subscription.reportLimitMonthly : baseLimits.reportsPerMonth,
integrations: subscription && subscription.integrationLimit ? subscription.integrationLimit : baseLimits.integrations,
storageMb: subscription && subscription.storageMbLimit ? subscription.storageMbLimit : baseLimits.storageMb
}
};
}
function assertWithinLimit(entitlements, metric, currentCount, increment = 1) {
if (!entitlements.active) {
const error = new Error("Subscription is not active.");
error.status = 402;
throw error;
}
const limit = entitlements.limits[metric];
if (limit !== undefined && currentCount + increment > limit) {
const error = new Error(`Plan limit exceeded for ${metric}.`);
error.status = 402;
error.details = {
metric,
currentCount,
increment,
limit
};
throw error;
}
}
module.exports = {
PLAN_LIMITS,
ACTIVE_SUBSCRIPTION_STATUSES,
getPlanLimits,
buildEntitlements,
subscriptionAllowsAccess,
assertWithinLimit
};
,
/***/ 9316:
};
;.( exports.id=9978,exports.ids=[9978],exports.modules={2488:a=>{"use strict";function b(a,c=200,d={}){return Response.json(a,{status:c,headers:Object.assign({"Cache-Control":"no-store"},d)})}a.exports={jsonResponse:b,errorResponse:function(a){return b({error:a.message||"Unexpected error",details:a.details||void 0},a.status||500)},parseJson:async function(a){let b=await a.text();return b?JSON.parse(b):{}}}},2773:(a,b,c)=>{"use strict";let{prisma:d}=c(7964);async function e(a){let b=(a.headers.get("cookie")||"").match(/cosmic_session=([^;]+)/);if(b){let a=await d.session.findUnique({where:{token:b[1]},include:{user:{include:{memberships:{where:{status:"ACTIVE"},include:{role:!0,organization:!0}}}}}});if(a&&a.expiresAt>new Date)return a.user;a&&await d.session.delete({where:{id:a.id}}).catch(()=>{})}let c=a.headers.get("x-cosmic-user-email")||process.env.COSMIC_BOOTSTRAP_EMAIL||"owner@cosmic.local",e=await d.user.findUnique({where:{email:c},include:{memberships:{where:{status:"ACTIVE"},include:{role:!0,organization:!0}}}});if(!e){let a=Error(`Unknown actor: ${c}`);throw a.status=401,a}return e}async function f(a,b,d="project:read"){let{hasPermission:g}=c(5707),h=await e(a),i=h.memberships.find(a=>a.organizationId===b&&"ACTIVE"===a.status);if(!i){let a=Error("Actor is not a member of this organization.");throw a.status=403,a}if(!g(i.role.permissions,d)){let a=Error(`Permission denied: ${d}`);throw a.status=403,a}return{actor:h,membership:i,organization:i.organization}}a.exports={getActorFromRequest:e,requireOrganizationActor:f}},3421:(a,b,c)=>{"use strict";Object.defineProperty(b,"I",{enumerable:!0,get:function(){return g}});let d=c(1237),e=c(5088),f=c(7679);async function g(a,b,c,g){if((0,d.isNodeNextResponse)(b)){var h;b.statusCode=c.status,b.statusMessage=c.statusText;let d=["set-cookie","www-authenticate","proxy-authenticate","vary"];null==(h=c.headers)||h.forEach((a,c)=>{if("x-middleware-set-cookie"!==c.toLowerCase())if("set-cookie"===c.toLowerCase())for(let d of(0,f.splitCookiesString)(a))b.appendHeader(c,d);else{let e=void 0!==b.getHeader(c);(d.includes(c.toLowerCase())||!e)&&b.appendHeader(c,a)}});let{originalResponse:i}=b;c.body&&"HEAD"!==a.method?await (0,e.pipeToNodeResponse)(c.body,i,g):i.end()}}},3518:(a,b,c)=>{"use strict";let{prisma:d}=c(7964);a.exports={writeAuditEvent:async function({organizationId:a,workspaceId:b=null,projectId:c=null,actorUserId:e=null,entityType:f,entityId:g,action:h,beforeJson:i=null,afterJson:j=null,request:k=null}){return d.auditEvent.create({data:{organizationId:a,workspaceId:b,projectId:c,actorUserId:e,entityType:f,entityId:g,action:h,beforeJson:i,afterJson:j,ipAddress:k&&k.headers.get("x-forwarded-for")||null,userAgent:k&&k.headers.get("user-agent")||null}})}}},5707:a=>{"use strict";let b={owner:["*"],admin:["organization:manage","workspace:manage","project:read","project:write","risk:read","risk:write","risk:delete","mitigation:write","gate:evaluate","gate:review","report:export","integration:manage","billing:manage","audit:read"],project_manager:["project:read","project:write","risk:read","risk:write","mitigation:write","gate:evaluate","report:export","integration:read","audit:read"],risk_owner:["project:read","risk:read","risk:write","mitigation:write","gate:read"],governance_reviewer:["project:read","risk:read","gate:evaluate","gate:review","report:export","audit:read"],legal_ethics_reviewer:["project:read","risk:read","mitigation:write","gate:review","report:export","audit:read"],integration_admin:["project:read","integration:read","integration:manage","integration:sync","oauth:manage","audit:read"],viewer:["project:read","risk:read","gate:read","integration:read","report:export"],consultant:["workspace:manage","project:read","project:write","risk:read","risk:write","mitigation:write","gate:evaluate","gate:review","report:export","audit:read"]};function c(a){return Array.isArray(a)?Array.from(new Set(a.filter(Boolean))):b[a]?b[a].slice():[]}function d(a,b){let d=c(a);return d.includes("*")||d.includes(b)}function e(a,b){return!!a&&"ACTIVE"===a.status&&(!a.workspaceScope||0===a.workspaceScope.length||a.workspaceScope.includes(b))}a.exports={PERMISSIONS:["organization:manage","workspace:manage","project:read","project:write","risk:read","risk:write","risk:delete","mitigation:write","gate:read","gate:evaluate","gate:review","report:export","integration:read","integration:manage","integration:sync","oauth:manage","billing:manage","audit:read"],ROLE_PERMISSIONS:b,resolvePermissions:c,hasPermission:d,assertPermission:function(a,b){if(!d(a,b)){let a=Error(`Permission denied: ${b}`);throw a.status=403,a}},canAccessWorkspace:e,canMutateRisk:function(a){return e(a,"workspace-a")&&d(a.permissions||a.role?.permissions,"risk:write")}}},5736:(a,b,c)=>{"use strict";a.exports=c(4870)},6487:()=>{},7964:(a,b,c)=>{"use strict";let{PrismaClient:d}=c(6330);a.exports={prisma:globalThis.__cosmicPrisma||new d}},8335:()=>{},8763:a=>{"use strict";let b={pilot:{users:10,projects:5,reportsPerMonth:100,integrations:4,storageMb:1024},starter:{users:5,projects:3,reportsPerMonth:25,integrations:1,storageMb:512},team:{users:25,projects:20,reportsPerMonth:500,integrations:4,storageMb:10240},enterprise:{users:1e3,projects:1e3,reportsPerMonth:1e5,integrations:100,storageMb:102400}},c=["TRIALING","ACTIVE"];function d(a){return b[a]||b.starter}function e(a,b){return(!b||"SUSPENDED"!==b.status)&&!!a&&(!!a.adminOverride||c.includes(a.status))}a.exports={PLAN_LIMITS:b,ACTIVE_SUBSCRIPTION_STATUSES:c,getPlanLimits:d,buildEntitlements:function(a,b){let c=d(a?a.planCode:b?b.planCode:"starter");return{active:e(a,b),source:a?a.source:"MANUAL",status:a?a.status:"SUSPENDED",planCode:a?a.planCode:b?b.planCode:"starter",limits:{users:a&&a.userLimit?a.userLimit:c.users,projects:a&&a.projectLimit?a.projectLimit:c.projects,reportsPerMonth:a&&a.reportLimitMonthly?a.reportLimitMonthly:c.reportsPerMonth,integrations:a&&a.integrationLimit?a.integrationLimit:c.integrations,storageMb:a&&a.storageMbLimit?a.storageMbLimit:c.storageMb}}},subscriptionAllowsAccess:e,assertWithinLimit:function(a,b,c,d=1){if(!a.active){let a=Error("Subscription is not active.");throw a.status=402,a}let e=a.limits[b];if(void 0!==e&&c+d>e){let a=Error(`Plan limit exceeded for ${b}.`);throw a.status=402,a.details={metric:b,currentCount:c,increment:d,limit:e},a}}}},9316:(a,b,c)=>{"use strict";let{prisma:d}=c(7964),{buildEntitlements:e,assertWithinLimit:f}=c(8763),{writeAuditEvent:g}=c(3518);async function h(a){return d.subscription.findFirst({where:{organizationId:a},orderBy:{createdAt:"desc"}})}async function i({workspace:a,actor:b,payload:c,request:i}){f(e(await h(a.organizationId),await d.organization.findUnique({where:{id:a.organizationId}})),"projects",await d.project.count({where:{workspace:{organizationId:a.organizationId}}}),1);let j=await d.project.create({data:{workspaceId:a.id,name:c.name,subtitle:c.subtitle||"COSMIC AI risk measurement workspace",projectType:c.projectType||"AI-Enabler",currentLifecyclePhase:c.currentLifecyclePhase||"Needs identification",riskAppetite:Number(c.riskAppetite||50),assessmentDate:c.assessmentDate?new Date(c.assessmentDate):new Date,status:"Active",ownerDisplayName:c.ownerDisplayName||b.displayName,description:c.description||"",thresholds:c.thresholds||{},reviews:c.reviews||{}}});return await g({organizationId:a.organizationId,workspaceId:a.id,projectId:j.id,actorUserId:b.id,entityType:"Project",entityId:j.id,action:"create",afterJson:j,request:i}),j}a.exports={getLatestSubscription:h,listWorkspaceProjects:async function(a){return d.project.findMany({where:{workspaceId:a},orderBy:{createdAt:"desc"}})},createProject:i,getProject:async function(a){let b=await d.project.findUnique({where:{id:a},include:{lifecyclePhases:{orderBy:{sequence:"asc"}},risks:{include:{mitigations:!0,evidence:!0}},indicators:!0,experiments:{include:{metrics:!0}}}});if(!b){let b=Error(`Project not found: ${a}`);throw b.status=404,b}return b},updateProject:async function({projectScope:a,actor:b,payload:c,request:e}){let f=await d.project.findUnique({where:{id:a.project.id}}),h=await d.project.update({where:{id:a.project.id},data:{name:c.name??f.name,subtitle:c.subtitle??f.subtitle,projectType:c.projectType??f.projectType,currentLifecyclePhase:c.currentLifecyclePhase??f.currentLifecyclePhase,riskAppetite:void 0!==c.riskAppetite?Number(c.riskAppetite):f.riskAppetite,status:c.status??f.status,ownerDisplayName:c.ownerDisplayName??f.ownerDisplayName,description:c.description??f.description,thresholds:c.thresholds??f.thresholds,reviews:c.reviews??f.reviews}});return await g({organizationId:a.organization.id,workspaceId:a.project.workspaceId,projectId:a.project.id,actorUserId:b.id,entityType:"Project",entityId:h.id,action:"update",beforeJson:f,afterJson:h,request:e}),h},deleteProject:async function({projectScope:a,projectId:b,actor:c,request:e}){let f=await d.project.findUnique({where:{id:b}});if(!f){let a=Error(`Project not found: ${b}`);throw a.status=404,a}await g({organizationId:a.organization.id,workspaceId:a.project.workspaceId,projectId:b,actorUserId:c.id,entityType:"Project",entityId:b,action:"delete",beforeJson:f,request:e}).catch(()=>{});let h=(await d.experiment.findMany({where:{projectId:b},select:{id:!0}})).map(a=>a.id);await d.modelMetric.deleteMany({where:{experimentId:{in:h}}}),await d.auditEvent.deleteMany({where:{projectId:b}}),await d.reportExport.deleteMany({where:{projectId:b}}),await d.externalWorkItemMapping.deleteMany({where:{projectId:b}}),await d.integrationSyncRun.deleteMany({where:{projectId:b}});let i=(await d.gateEvaluation.findMany({where:{projectId:b},select:{id:!0}})).map(a=>a.id);await d.gateDecision.deleteMany({where:{gateId:{in:i}}}),await d.gateCriterion.deleteMany({where:{gateId:{in:i}}}),await d.gateEvaluation.deleteMany({where:{projectId:b}}),await d.evidence.deleteMany({where:{projectId:b}});let j=(await d.risk.findMany({where:{projectId:b},select:{id:!0}})).map(a=>a.id);return await d.mitigation.deleteMany({where:{riskId:{in:j}}}),await d.risk.deleteMany({where:{projectId:b}}),await d.experiment.deleteMany({where:{projectId:b}}),await d.lifecyclePhase.deleteMany({where:{projectId:b}}),await d.indicator.deleteMany({where:{projectId:b}}),await d.project.delete({where:{id:b}}),{deleted:!0}}}}};