/home/techb158/balavpn.abdallabala.com/.next/cache/webpack/server-production
NameSizeModeActions
0.pack75919080666editdlrm
1.pack13755910666editdlrm
2.pack2103570666editdlrm
3.pack435023240666editdlrm
4.pack8831030666editdlrm
5.pack2236720666editdlrm
6.pack124000666editdlrm
7.pack1863090666editdlrm
8.pack2143630666editdlrm
9.pack7358150666editdlrm
10.pack2358320666editdlrm
11.pack30785860666editdlrm
12.pack33078460666editdlrm
index.pack85782510666editdlrm
index.pack.old85783080666editdlrm
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-serviceResolverCachePlugin|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-serviceResolverCachePlugin|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-serviceResolverCachePlugin|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-serviceCompilation/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-servicekResolverCachePlugin|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-serviceCompilation/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 lintnode 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.0C:\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 DashboardC:\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:\UsersC:\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.jsonC:\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.jsonC:\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.jsonC:\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.jsonC:\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.jsonC:\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.jsonC:\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~}|{zyxwvu@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.jsonC:\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.jsonC:\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.jsonr issuerissuerLayercompilerC:\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_^]\[ZYXWVX 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.jsC:\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.jsC:\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.jsC:\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.jsC:\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.jsC:\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.jsC:\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.jsC:\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.jsC:\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.jsC:\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.jsC:\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.jsC:\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.jsC:\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.jsC:\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-hmrC:\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... `cacheableparsedfileDependenciescontextDependenciesmissingDependenciesbuildDependenciesvalueDependenciesLassetsassetsInfostricttopLevelDeclarationssnapshot webpack/lib/util/LazySetC:\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.jsC:\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__796487633518  buffersourcesizemaps 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  ReplaceSourceRawSourceK012undefined3339__webpack_require__undefined41557964undefined108114__webpack_require__undefined1161398763undefined171177__webpack_require__undefined1791953518undefined __webpack_require__G webpack/lib/util/registerExternalSerializerwebpack-sources/ConcatSource`webpack/lib/util/registerExternalSerializerwebpack-sources/RawSourceJexports.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(.0F__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 }; v012undefined3339__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 }; v012undefined3339__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/RawSourcevar __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.map h :NNQO"$4GMO[0R__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 ConcatSourceRawSourcevar __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  c 47Nfalse{}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.map012undefined1852falseundefined55141{}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.map012undefined1852falseundefined55141{}undefined158194falseundefined197906{}undefined927964falseundefined9671261{}undefined12861306falseundefined13091431{}undefined14561539module.exports = __webpack_require__(4870)undefined, /***/ 6487:  4webpack/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 }; b012undefined3945__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 }; b012undefined3945__webpack_require__undefined47626330undefined175203falseundefined206253{}undefined, /***/ 8335:  4webpack/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 }; ;  Yexports.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 }; /***/ }) }; ; {}   `gConcatSourceRawSourceJexports.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 }; v012undefined3339__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.map012undefined1852falseundefined55141{}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 }; b012undefined3945__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}}}}};