@llmops/app 0.1.7 → 0.1.9-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/.vite/manifest.json +285 -366
  2. package/dist/assets/Form-DHA5ZPmK.js +1 -0
  3. package/dist/assets/_environment-Bj632BW3.js +1 -0
  4. package/dist/assets/_observability-Bsw31e8i.js +1 -0
  5. package/dist/assets/_settings-MuCcKpRb.js +1 -0
  6. package/dist/assets/{_tabs-DaucGqpx.js → _tabs-DR5WY23M.js} +1 -1
  7. package/dist/assets/{_tabs-D9USU0yw.js → _tabs-Osf37WI9.js} +1 -1
  8. package/dist/assets/_variant-DGrwitKk.js +30 -0
  9. package/dist/assets/{_variants-Bjp8ZEvO.js → _variants-C7fc4T8_.js} +1 -1
  10. package/dist/assets/{area.css-CSjofvHM.js → area.css-ByjMFuMe.js} +1 -1
  11. package/dist/assets/auth-BkNQi67-.css +1 -0
  12. package/dist/assets/auth.css-CbKu-iME.js +1 -0
  13. package/dist/assets/button-J5fxAIyE.js +1 -0
  14. package/dist/assets/check-BdOT-uCr.js +1 -0
  15. package/dist/assets/{chevron-right-fMWRsRLZ.js → chevron-right-CcvZen9O.js} +1 -1
  16. package/dist/assets/combobox-BKEpKROu.js +1 -0
  17. package/dist/assets/configs-BEKTOPIS.js +1 -0
  18. package/dist/assets/{copy-DADLeZ69.js → copy-Btrg1ewH.js} +1 -1
  19. package/dist/assets/{costs-Fh0OPnEw.js → costs-C0sD1amq.js} +1 -1
  20. package/dist/assets/environments-CZ6PX9PA.js +1 -0
  21. package/dist/assets/index-C1Qc7Z7W.js +27 -0
  22. package/dist/assets/index-C8Gwa2Ui.js +1 -0
  23. package/dist/assets/{index-DeuSY0Yv.js → index-CAScpK2G.js} +1 -1
  24. package/dist/assets/{index-DW-cTzEh.js → index-CPQ3xdGh.js} +1 -1
  25. package/dist/assets/index-CPokRl9v.js +1 -0
  26. package/dist/assets/index-CQALuvff.js +1 -0
  27. package/dist/assets/{index-BFe2NM3q.css → index-CgbnU9Zg.css} +1 -1
  28. package/dist/assets/{index-Cns5MLjo.js → index-ChLdrp-m.js} +1 -1
  29. package/dist/assets/{index.esm-oCSEvUVx.js → index.esm-BVbruXk6.js} +1 -1
  30. package/dist/assets/info-box.css-BzqwxgQm.js +1 -0
  31. package/dist/assets/logo-D4ybjOzp.css +1 -0
  32. package/dist/assets/logo.css-BHDDnlVa.js +1 -0
  33. package/dist/assets/new-config-state-B8sMe-TC.css +1 -0
  34. package/dist/assets/new-config-state.css-DccH1TI0.js +1 -0
  35. package/dist/assets/{observability.css-wgjHtY3p.js → observability.css-D5kKsJ4z.js} +1 -1
  36. package/dist/assets/{overview-D1QIYPBL.js → overview-Czui5UTZ.js} +5 -5
  37. package/dist/assets/plus-DqiZvCBU.js +1 -0
  38. package/dist/assets/popover-BndR7yWD.js +1 -0
  39. package/dist/assets/requests-DrSJLtrE.js +1 -0
  40. package/dist/assets/{route-Df57lqxl.js → route-22shZRiS.js} +1 -1
  41. package/dist/assets/route-7Tn2yELm.js +1 -0
  42. package/dist/assets/{route-CjAw8hSU.js → route-CqIm0KnA.js} +1 -1
  43. package/dist/assets/{route-timDYxX2.js → route-D_QnUz7-.js} +1 -1
  44. package/dist/assets/{route-DmWZbVk6.js → route-DwYQMwtZ.js} +1 -1
  45. package/dist/assets/secrets-DnWQ2F0V.js +1 -0
  46. package/dist/assets/settings-c6c9IYPa.js +1 -0
  47. package/dist/assets/settings-sisslKb5.js +1 -0
  48. package/dist/assets/setup-G_oS-RU-.js +1 -0
  49. package/dist/assets/signin-B-qadLup.js +1 -0
  50. package/dist/assets/table-jMzD3FNy.js +1 -0
  51. package/dist/assets/{tabs.css-CG5ugi0p.js → tabs.css-CkcP1Ksc.js} +1 -1
  52. package/dist/assets/targeting-CaE84Lx8.js +1 -0
  53. package/dist/assets/tooltip-BiUUXiGj.js +1 -0
  54. package/dist/assets/{update-or-create-name-B-M46wHl.js → update-or-create-name-DGt2MGEI.js} +1 -1
  55. package/dist/assets/useAnalytics-CHDelHQa.js +1 -0
  56. package/dist/assets/useConfigList-Bx9xKceA.js +1 -0
  57. package/dist/assets/{useConfigVariants-CLc_hPw1.js → useConfigVariants-CB0S5gfJ.js} +1 -1
  58. package/dist/assets/useEnvironments-DILRhv_b.js +1 -0
  59. package/dist/assets/{useMutation-D4JglXWk.js → useMutation-CNzYa4ST.js} +1 -1
  60. package/dist/assets/usePopupAutoResize-CaO9EPHk.js +1 -0
  61. package/dist/assets/{useSetTargeting-bk0Ixhqq.js → useSetTargeting-DY3jI95T.js} +1 -1
  62. package/dist/assets/useTargetingRules-D10mXxut.js +1 -0
  63. package/dist/assets/useValueChanged-8LsiEynk.js +1 -0
  64. package/dist/assets/{user-profile-BB3dPOc5.js → user-profile-8xq1f7_D.js} +1 -1
  65. package/dist/assets/variants-rQQlpgeF.js +1 -0
  66. package/dist/assets/variants.css-Dzb38Nu1.js +1 -0
  67. package/dist/assets/{workspace-general-DYXfOF9H.js → workspace-general-dH65Sm8D.js} +1 -1
  68. package/dist/index.cjs +136 -66
  69. package/dist/index.d.cts +8 -5
  70. package/dist/index.d.mts +8 -5
  71. package/dist/index.mjs +138 -68
  72. package/package.json +4 -3
  73. package/dist/assets/Form-Bh6BPtQ_.js +0 -1
  74. package/dist/assets/InternalBackdrop-Za9lpJi7.js +0 -12
  75. package/dist/assets/_environment-COxSWJ9w.js +0 -1
  76. package/dist/assets/_observability-C8wSXZk2.js +0 -1
  77. package/dist/assets/_settings-DOmj1R7I.js +0 -1
  78. package/dist/assets/_variant-DxME2BL0.js +0 -30
  79. package/dist/assets/button-CMZqhyXB.js +0 -1
  80. package/dist/assets/check-D9E8RKB4.js +0 -1
  81. package/dist/assets/chevron-down-BJFxhYkh.js +0 -1
  82. package/dist/assets/combobox-iSbUYz0A.js +0 -1
  83. package/dist/assets/configs-BflhBVlY.js +0 -1
  84. package/dist/assets/environments-ChldQPyq.js +0 -1
  85. package/dist/assets/getDisabledMountTransitionStyles-TZFYxPIU.js +0 -1
  86. package/dist/assets/index-BDsrc1Q7.js +0 -1
  87. package/dist/assets/index-BWU02PnY.js +0 -1
  88. package/dist/assets/index-DYoud8po.js +0 -1
  89. package/dist/assets/index-FrTQ7TcS.js +0 -16
  90. package/dist/assets/info-box.css-DuVI9M9-.js +0 -1
  91. package/dist/assets/llmops-B3IIte87.css +0 -1
  92. package/dist/assets/llmops-CdOQq40D.js +0 -1
  93. package/dist/assets/plus-JQ0TORpd.js +0 -1
  94. package/dist/assets/popover-DXj4s-ni.js +0 -1
  95. package/dist/assets/popupStateMapping-DolkyTT3.js +0 -1
  96. package/dist/assets/requests-CzvYwfwV.js +0 -1
  97. package/dist/assets/reselect-DVmmTZGf.js +0 -1
  98. package/dist/assets/secrets-BxFGEuKj.js +0 -1
  99. package/dist/assets/settings-DpSRw7LL.js +0 -1
  100. package/dist/assets/settings-pgWZnVf6.js +0 -1
  101. package/dist/assets/table-DggTSlPh.js +0 -1
  102. package/dist/assets/targeting-CkqRTjnZ.js +0 -1
  103. package/dist/assets/tooltip-BuSsMQ8P.js +0 -1
  104. package/dist/assets/useAnalytics-DTf81POS.js +0 -1
  105. package/dist/assets/useButton-CsZ8hBM8.js +0 -1
  106. package/dist/assets/useConfigList-CAf01_dV.js +0 -1
  107. package/dist/assets/useEnvironments-Bu_0SIUj.js +0 -1
  108. package/dist/assets/useFocus-9TCY0h5x.js +0 -1
  109. package/dist/assets/usePopupAutoResize-D6RSlB-m.js +0 -1
  110. package/dist/assets/useRole-CiSaVva3.js +0 -1
  111. package/dist/assets/useSyncedFloatingRootContext-BKbVh8Gq.js +0 -1
  112. package/dist/assets/useTargetingRules-BrgaEdxR.js +0 -1
  113. package/dist/assets/useValueChanged-CTjBqaGs.js +0 -1
  114. package/dist/assets/variants-BH682hHM.js +0 -1
  115. package/dist/assets/variants.css-rCWHZycz.js +0 -1
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Hono } from "hono";
2
- import { SupportedProviders, createDataLayer, generateId, logger, validateLLMOpsConfig, variantJsonDataSchema } from "@llmops/core";
2
+ import { SupportedProviders, createDataLayer, generateId, getAuthClientOptions, logger, validateLLMOpsConfig, variantJsonDataSchema } from "@llmops/core";
3
3
  import reactServer from "react-dom/server";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
5
5
  import { fileURLToPath } from "node:url";
@@ -9,15 +9,15 @@ import { serveStatic } from "hono/serve-static";
9
9
  import { fileURLToPath as fileURLToPath$1 } from "url";
10
10
  import { dirname as dirname$1, join as join$1 } from "path";
11
11
  import { readFile } from "fs/promises";
12
- import { basicAuth } from "hono/basic-auth";
12
+ import { HTTPException } from "hono/http-exception";
13
13
  import { zValidator } from "@hono/zod-validator";
14
14
  import { prettyJSON } from "hono/pretty-json";
15
- import { HTTPException } from "hono/http-exception";
16
15
  import { cors } from "hono/cors";
17
16
  import { randomUUID } from "node:crypto";
18
17
  import gateway from "@llmops/gateway";
19
18
  import { env } from "node:process";
20
- import { createDatabaseFromConnection } from "@llmops/core/db";
19
+ import { createDatabaseFromConnection, detectDatabaseType } from "@llmops/core/db";
20
+ import { betterAuth } from "better-auth";
21
21
 
22
22
  //#region rolldown:runtime
23
23
  var __defProp = Object.defineProperty;
@@ -37,7 +37,7 @@ var __export = (all, symbols) => {
37
37
 
38
38
  //#endregion
39
39
  //#region src/client/index.tsx?url
40
- var client_default = "/assets/index-FrTQ7TcS.js";
40
+ var client_default = "/assets/index-C1Qc7Z7W.js";
41
41
 
42
42
  //#endregion
43
43
  //#region src/client/styles/styles.css?url
@@ -68,7 +68,7 @@ const ReactRefresh = () => {
68
68
  const { renderToString } = reactServer;
69
69
  const manifestPath = join(dirname(fileURLToPath(import.meta.url)), "./.vite/manifest.json");
70
70
  const manifest = existsSync(manifestPath) ? JSON.parse(readFileSync(manifestPath, "utf-8")) : {};
71
- const renderer = ({ basePath = "", dev = false, llmProviders, authType }) => {
71
+ const renderer = ({ basePath = "", dev = false, llmProviders, authType, setupComplete = false }) => {
72
72
  const stylesPath = basePath === "/" ? styles_default : basePath + styles_default;
73
73
  const clientPath = basePath === "/" ? client_default : basePath + client_default;
74
74
  const faviconPath = basePath === "/" ? "/favicon.ico" : basePath + "/assets/favicon.ico";
@@ -77,7 +77,7 @@ const renderer = ({ basePath = "", dev = false, llmProviders, authType }) => {
77
77
  });
78
78
  return renderToString(/* @__PURE__ */ jsxs("html", {
79
79
  lang: "en",
80
- className: "dark",
80
+ className: "",
81
81
  children: [/* @__PURE__ */ jsxs("head", { children: [
82
82
  /* @__PURE__ */ jsx("meta", {
83
83
  name: "viewport",
@@ -332,7 +332,8 @@ const renderer = ({ basePath = "", dev = false, llmProviders, authType }) => {
332
332
  window.bootstrapData = {
333
333
  basePath: "${basePath}",
334
334
  llmProviders: ${JSON.stringify(llmProviders || [])},
335
- authType: "${authType || "basic"}"
335
+ authType: "${authType || "basic"}",
336
+ setupComplete: ${setupComplete}
336
337
  };
337
338
  ` }),
338
339
  dev && /* @__PURE__ */ jsx(ReactRefresh, {})
@@ -12789,7 +12790,7 @@ function parseTags(tagsJson) {
12789
12790
  /**
12790
12791
  * Analytics API routes for cost and usage tracking
12791
12792
  */
12792
- const app$10 = new Hono().get("/requests", zv("query", zod_default.object({
12793
+ const app$11 = new Hono().get("/requests", zv("query", zod_default.object({
12793
12794
  limit: zod_default.string().transform(Number).optional(),
12794
12795
  offset: zod_default.string().transform(Number).optional(),
12795
12796
  configId: zod_default.string().uuid().optional(),
@@ -12803,13 +12804,6 @@ const app$10 = new Hono().get("/requests", zv("query", zod_default.object({
12803
12804
  })), async (c) => {
12804
12805
  const db = c.get("db");
12805
12806
  const query = c.req.valid("query");
12806
- console.log("[Analytics] Request filters:", {
12807
- configId: query.configId,
12808
- variantId: query.variantId,
12809
- environmentId: query.environmentId,
12810
- startDate: query.startDate,
12811
- endDate: query.endDate
12812
- });
12813
12807
  let parsedTags;
12814
12808
  if (query.tags) try {
12815
12809
  parsedTags = JSON.parse(query.tags);
@@ -12991,11 +12985,11 @@ const app$10 = new Hono().get("/requests", zv("query", zod_default.object({
12991
12985
  return c.json(internalServerError("Failed to fetch tags", 500), 500);
12992
12986
  }
12993
12987
  });
12994
- var analytics_default = app$10;
12988
+ var analytics_default = app$11;
12995
12989
 
12996
12990
  //#endregion
12997
12991
  //#region src/server/handlers/configs/index.ts
12998
- const app$9 = new Hono().post("/", zv("json", zod_default.object({ name: zod_default.string().min(1) })), async (c) => {
12992
+ const app$10 = new Hono().post("/", zv("json", zod_default.object({ name: zod_default.string().min(1) })), async (c) => {
12999
12993
  const db = c.get("db");
13000
12994
  try {
13001
12995
  const value = await db.createNewConfig({ name: c.req.valid("json").name });
@@ -13099,7 +13093,7 @@ const app$9 = new Hono().post("/", zv("json", zod_default.object({ name: zod_def
13099
13093
  return c.json(internalServerError("Failed to delete config", 500), 500);
13100
13094
  }
13101
13095
  });
13102
- var configs_default = app$9;
13096
+ var configs_default = app$10;
13103
13097
 
13104
13098
  //#endregion
13105
13099
  //#region src/server/handlers/environments/index.ts
@@ -13110,7 +13104,7 @@ var configs_default = app$9;
13110
13104
  const generateSecretKey$1 = (slug) => {
13111
13105
  return `sec_${slug.slice(0, 4).toLowerCase()}_${generateId(24)}`;
13112
13106
  };
13113
- const app$8 = new Hono().post("/", zv("json", zod_default.object({
13107
+ const app$9 = new Hono().post("/", zv("json", zod_default.object({
13114
13108
  name: zod_default.string().min(1),
13115
13109
  slug: zod_default.string().min(1),
13116
13110
  isProd: zod_default.boolean().optional()
@@ -13195,7 +13189,7 @@ const app$8 = new Hono().post("/", zv("json", zod_default.object({
13195
13189
  return c.json(internalServerError("Failed to fetch environment secrets", 500), 500);
13196
13190
  }
13197
13191
  });
13198
- var environments_default = app$8;
13192
+ var environments_default = app$9;
13199
13193
 
13200
13194
  //#endregion
13201
13195
  //#region src/server/handlers/providers/index.ts
@@ -13215,7 +13209,7 @@ async function fetchModelsDevData() {
13215
13209
  cacheTimestamp = now;
13216
13210
  return modelsCache;
13217
13211
  }
13218
- const app$7 = new Hono().get("/", async (c) => {
13212
+ const app$8 = new Hono().get("/", async (c) => {
13219
13213
  try {
13220
13214
  const data = await fetchModelsDevData();
13221
13215
  const providers = Object.values(data).map((provider) => ({
@@ -13323,11 +13317,11 @@ const app$7 = new Hono().get("/", async (c) => {
13323
13317
  return c.json(internalServerError("Failed to fetch models", 500), 500);
13324
13318
  }
13325
13319
  });
13326
- var providers_default = app$7;
13320
+ var providers_default = app$8;
13327
13321
 
13328
13322
  //#endregion
13329
13323
  //#region src/server/handlers/targeting/index.ts
13330
- const app$6 = new Hono().post("/", zv("json", zod_default.object({
13324
+ const app$7 = new Hono().post("/", zv("json", zod_default.object({
13331
13325
  environmentId: zod_default.string().uuid(),
13332
13326
  configId: zod_default.string().uuid(),
13333
13327
  configVariantId: zod_default.string().uuid(),
@@ -13454,11 +13448,11 @@ const app$6 = new Hono().post("/", zv("json", zod_default.object({
13454
13448
  return c.json(internalServerError("Failed to set targeting for environment", 500), 500);
13455
13449
  }
13456
13450
  });
13457
- var targeting_default = app$6;
13451
+ var targeting_default = app$7;
13458
13452
 
13459
13453
  //#endregion
13460
13454
  //#region src/server/handlers/variants.ts
13461
- const app$5 = new Hono().get("/:id", zv("param", zod_default.object({ id: zod_default.string().uuid() })), async (c) => {
13455
+ const app$6 = new Hono().get("/:id", zv("param", zod_default.object({ id: zod_default.string().uuid() })), async (c) => {
13462
13456
  const db = c.get("db");
13463
13457
  const { id } = c.req.valid("param");
13464
13458
  const versionParam = c.req.query("version");
@@ -13605,11 +13599,43 @@ const app$5 = new Hono().get("/:id", zv("param", zod_default.object({ id: zod_de
13605
13599
  return c.json(internalServerError("Failed to fetch variant version", 500), 500);
13606
13600
  }
13607
13601
  });
13608
- var variants_default = app$5;
13602
+ var variants_default = app$6;
13603
+
13604
+ //#endregion
13605
+ //#region src/server/middlewares/verifySession.ts
13606
+ let cachedSuperAdminId = void 0;
13607
+ /**
13608
+ * Middleware that verifies the user is the super admin.
13609
+ * Must be used after the auth client middleware has set user/session in context.
13610
+ *
13611
+ * SuperAdminId is cached in memory since it's set once during setup and never changes.
13612
+ *
13613
+ * @throws HTTPException 401 if no valid session exists
13614
+ * @throws HTTPException 403 if user is not the super admin
13615
+ */
13616
+ const verifySuperAdmin = async (c, next) => {
13617
+ const user = c.get("user");
13618
+ const session = c.get("session");
13619
+ if (!user || !session) throw new HTTPException(401, { message: "Unauthorized - valid session required" });
13620
+ if (cachedSuperAdminId === void 0) cachedSuperAdminId = await c.get("db").getSuperAdminId();
13621
+ if (!cachedSuperAdminId) {
13622
+ await next();
13623
+ return;
13624
+ }
13625
+ if (user.id !== cachedSuperAdminId) throw new HTTPException(403, { message: "Forbidden - only the super admin can access this resource" });
13626
+ await next();
13627
+ };
13628
+ /**
13629
+ * Clear the cached superAdminId.
13630
+ * Call this after setting the superAdminId during setup.
13631
+ */
13632
+ const clearSuperAdminCache = () => {
13633
+ cachedSuperAdminId = void 0;
13634
+ };
13609
13635
 
13610
13636
  //#endregion
13611
13637
  //#region src/server/handlers/workspace-settings/index.ts
13612
- const app$4 = new Hono().get("/", async (c) => {
13638
+ const app$5 = new Hono().get("/", async (c) => {
13613
13639
  const db = c.get("db");
13614
13640
  try {
13615
13641
  const settings = await db.getWorkspaceSettings();
@@ -13618,40 +13644,28 @@ const app$4 = new Hono().get("/", async (c) => {
13618
13644
  console.error("Error fetching workspace settings:", error$45);
13619
13645
  return c.json(internalServerError("Failed to fetch workspace settings", 500), 500);
13620
13646
  }
13621
- }).patch("/", zv("json", zod_default.object({ name: zod_default.string().nullable().optional() })), async (c) => {
13647
+ }).patch("/", zv("json", zod_default.object({
13648
+ name: zod_default.string().nullable().optional(),
13649
+ setupComplete: zod_default.boolean().optional(),
13650
+ superAdminId: zod_default.string().nullable().optional()
13651
+ })), async (c) => {
13622
13652
  const db = c.get("db");
13623
13653
  const body = c.req.valid("json");
13624
13654
  try {
13625
13655
  const settings = await db.updateWorkspaceSettings(body);
13656
+ if (body.superAdminId !== void 0) clearSuperAdminCache();
13626
13657
  return c.json(successResponse(settings, 200));
13627
13658
  } catch (error$45) {
13628
13659
  console.error("Error updating workspace settings:", error$45);
13629
13660
  return c.json(internalServerError("Failed to update workspace settings", 500), 500);
13630
13661
  }
13631
13662
  });
13632
- var workspace_settings_default = app$4;
13663
+ var workspace_settings_default = app$5;
13633
13664
 
13634
13665
  //#endregion
13635
13666
  //#region src/server/handlers/v1.ts
13636
- /**
13637
- * Type guard to check if auth config is basic auth
13638
- */
13639
- function isBasicAuth(auth) {
13640
- return auth.type === "basic";
13641
- }
13642
- const app$3 = new Hono().use("*", async (c, next) => {
13643
- if (c.get("authHandled")) return next();
13644
- const config$1 = c.get("llmopsConfig");
13645
- if (isBasicAuth(config$1.auth)) return basicAuth({
13646
- username: config$1.auth.defaultUser,
13647
- password: config$1.auth.defaultPassword
13648
- })(c, next);
13649
- return c.json({
13650
- error: "Auth middleware not configured",
13651
- message: `Auth type "${config$1.auth.type}" requires @llmops/enterprise middleware. Either use basicAuth() from @llmops/sdk or install @llmops/enterprise and add the auth middleware.`
13652
- }, 501);
13653
- }).route("/analytics", analytics_default).route("/configs", configs_default).route("/environments", environments_default).route("/providers", providers_default).route("/targeting", targeting_default).route("/variants", variants_default).route("/workspace-settings", workspace_settings_default);
13654
- var v1_default = app$3;
13667
+ const app$4 = new Hono().use("*", verifySuperAdmin).route("/analytics", analytics_default).route("/configs", configs_default).route("/environments", environments_default).route("/providers", providers_default).route("/targeting", targeting_default).route("/variants", variants_default).route("/workspace-settings", workspace_settings_default);
13668
+ var v1_default = app$4;
13655
13669
 
13656
13670
  //#endregion
13657
13671
  //#region src/server/handlers/genai/requestValidator.ts
@@ -14350,8 +14364,8 @@ async function processUsageAndLog(params) {
14350
14364
 
14351
14365
  //#endregion
14352
14366
  //#region src/server/handlers/genai/index.ts
14353
- const app$2 = new Hono();
14354
- app$2.use("*", prettyJSON()).get("/health", async (c) => {
14367
+ const app$3 = new Hono();
14368
+ app$3.use("*", prettyJSON()).get("/health", async (c) => {
14355
14369
  return c.json({ status: "healthy" });
14356
14370
  }).use("*", requestValidator).use("*", createRequestGuardMiddleware()).use("*", createCostTrackingMiddleware()).use("*", createGatewayAdapterMiddleware()).route("/", gateway).notFound((c) => c.json({ error: {
14357
14371
  message: "Not Found",
@@ -14363,12 +14377,42 @@ app$2.use("*", prettyJSON()).get("/health", async (c) => {
14363
14377
  type: "api_error"
14364
14378
  } }, 500);
14365
14379
  });
14366
- var genai_default = app$2;
14380
+ var genai_default = app$3;
14381
+
14382
+ //#endregion
14383
+ //#region src/server/handlers/auth/index.ts
14384
+ const app$2 = new Hono().post("/complete-setup", async (c) => {
14385
+ const db = c.get("db");
14386
+ try {
14387
+ const settings = await db.markSetupComplete();
14388
+ return c.json(successResponse(settings, 200));
14389
+ } catch (error$45) {
14390
+ console.error("Error completing setup:", error$45);
14391
+ return c.json(internalServerError("Failed to complete setup", 500), 500);
14392
+ }
14393
+ });
14394
+ var auth_default = app$2;
14367
14395
 
14368
14396
  //#endregion
14369
14397
  //#region src/server/handlers/api.ts
14370
14398
  const app$1 = new Hono();
14371
- const routes = app$1.route("/genai", genai_default).route("/v1", v1_default);
14399
+ const routes = app$1.post("/auth/sign-up/*", async (c, next) => {
14400
+ if (c.get("setupComplete")) throw new HTTPException(403, { message: "Registration is disabled. Only one user is allowed." });
14401
+ await next();
14402
+ }).on(["POST", "GET"], "/auth/*", (c) => {
14403
+ return c.get("authClient").handler(c.req.raw);
14404
+ }).route("/auth", auth_default).use("*", async (c, next) => {
14405
+ const session = await c.get("authClient").api.getSession({ headers: c.req.raw.headers });
14406
+ if (!session) {
14407
+ c.set("user", null);
14408
+ c.set("session", null);
14409
+ await next();
14410
+ return;
14411
+ }
14412
+ c.set("user", session.user);
14413
+ c.set("session", session.session);
14414
+ await next();
14415
+ }).route("/genai", genai_default).route("/v1", v1_default);
14372
14416
  var api_default = app$1;
14373
14417
 
14374
14418
  //#endregion
@@ -14385,11 +14429,13 @@ app.use("/assets/*", serveStatic({
14385
14429
  const basePath = c.var.llmopsConfig?.basePath || "";
14386
14430
  const llmProviders = c.var.llmProviders || [];
14387
14431
  const authType = c.var.llmopsConfig?.auth?.type || "basic";
14432
+ const setupComplete = c.var.setupComplete ?? false;
14388
14433
  return c.html(renderer({
14389
14434
  basePath,
14390
14435
  dev: env.LLMOPS_DEV === "true",
14391
14436
  llmProviders,
14392
- authType
14437
+ authType,
14438
+ setupComplete
14393
14439
  }));
14394
14440
  }
14395
14441
  await next();
@@ -14462,12 +14508,10 @@ const createSeedMiddleware = () => {
14462
14508
  //#endregion
14463
14509
  //#region src/server/middlewares/migration.ts
14464
14510
  /**
14465
- * Creates a middleware that handles auto-migration based on config
14511
+ * Creates a middleware that handles auto-migration on startup
14466
14512
  *
14467
- * This middleware runs once on application startup and handles:
14468
- * - autoMigrate: true - Always run migrations
14469
- * - autoMigrate: false - Never run migrations (default)
14470
- * - autoMigrate: 'development' - Only run when NODE_ENV is 'development'
14513
+ * This middleware runs once on application startup and automatically
14514
+ * runs database migrations if needed.
14471
14515
  *
14472
14516
  * IMPORTANT: This middleware should run BEFORE the seed middleware
14473
14517
  * but AFTER the database middleware creates the connection.
@@ -14476,16 +14520,15 @@ const createMigrationMiddleware = (config$1) => {
14476
14520
  let migrationComplete = false;
14477
14521
  let migrationPromise = null;
14478
14522
  return async (c, next) => {
14479
- const autoMigrate = config$1.autoMigrate ?? false;
14480
- if (migrationComplete || autoMigrate === false) {
14523
+ if (migrationComplete) {
14481
14524
  await next();
14482
14525
  return;
14483
14526
  }
14484
14527
  if (!migrationPromise) migrationPromise = (async () => {
14485
14528
  try {
14486
- const { detectDatabaseType, runAutoMigrations, createDatabaseFromConnection: createDatabaseFromConnection$1 } = await import("@llmops/core/db");
14529
+ const { detectDatabaseType: detectDatabaseType$1, runAutoMigrations, createDatabaseFromConnection: createDatabaseFromConnection$1 } = await import("@llmops/core/db");
14487
14530
  const rawConnection = config$1.database;
14488
- const dbType = detectDatabaseType(rawConnection);
14531
+ const dbType = detectDatabaseType$1(rawConnection);
14489
14532
  if (!dbType) {
14490
14533
  console.warn("[Migration] Could not detect database type, skipping auto-migration");
14491
14534
  return;
@@ -14496,7 +14539,10 @@ const createMigrationMiddleware = (config$1) => {
14496
14539
  console.warn("[Migration] Could not create database connection, skipping auto-migration");
14497
14540
  return;
14498
14541
  }
14499
- const result = await runAutoMigrations(db, dbType, autoMigrate, { schema });
14542
+ const result = await runAutoMigrations(db, dbType, {
14543
+ rawConnection,
14544
+ schema
14545
+ });
14500
14546
  if (result.ran) console.log(`[Migration] Auto-migration completed: ${result.tables.length} table(s) created, ${result.fields.length} field(s) added`);
14501
14547
  } catch (error$45) {
14502
14548
  console.error("[Migration] Auto-migration failed:", error$45);
@@ -14509,6 +14555,24 @@ const createMigrationMiddleware = (config$1) => {
14509
14555
  };
14510
14556
  };
14511
14557
 
14558
+ //#endregion
14559
+ //#region src/server/middlewares/auth.ts
14560
+ /**
14561
+ * Creates auth client middleware that uses the pre-configured Kysely instance
14562
+ * from context. This ensures Better Auth uses the same database connection
14563
+ * with the correct schema (search_path) configuration.
14564
+ */
14565
+ const createAuthClientMiddleware = () => {
14566
+ return async (c, next) => {
14567
+ const authClient = betterAuth(getAuthClientOptions({
14568
+ db: c.get("kyselyDb"),
14569
+ type: c.get("dbType")
14570
+ }));
14571
+ c.set("authClient", authClient);
14572
+ await next();
14573
+ };
14574
+ };
14575
+
14512
14576
  //#endregion
14513
14577
  //#region src/index.ts
14514
14578
  const MODELS_DEV_LOGOS = "https://models.dev/logos";
@@ -14527,10 +14591,16 @@ const setConfigMiddleware = (config$1) => {
14527
14591
  };
14528
14592
  const createDatabaseMiddleware = (validatedConfig) => {
14529
14593
  return async (c, next) => {
14530
- const db = await createDatabaseFromConnection(validatedConfig.database, { schema: validatedConfig.schema });
14531
- if (!db) throw new Error("Failed to create database connection");
14532
- const dataLayer = await createDataLayer(db);
14594
+ const kyselyDb = await createDatabaseFromConnection(validatedConfig.database, { schema: validatedConfig.schema });
14595
+ if (!kyselyDb) throw new Error("Failed to create database connection");
14596
+ const dbType = detectDatabaseType(validatedConfig.database);
14597
+ if (!dbType) throw new Error("Failed to detect database type");
14598
+ const dataLayer = await createDataLayer(kyselyDb);
14533
14599
  c.set("db", dataLayer);
14600
+ c.set("kyselyDb", kyselyDb);
14601
+ c.set("dbType", dbType);
14602
+ const setupComplete = await dataLayer.isSetupComplete();
14603
+ c.set("setupComplete", setupComplete);
14534
14604
  await next();
14535
14605
  };
14536
14606
  };
@@ -14552,7 +14622,7 @@ const createLLMProvidersMiddleware = (config$1) => {
14552
14622
  };
14553
14623
  const createApp = (config$1) => {
14554
14624
  const validatedConfig = validateLLMOpsConfig(config$1);
14555
- return { app: new Hono().use("*", createEnvValidatorMiddleware()).use("*", setConfigMiddleware(validatedConfig)).use("*", createMigrationMiddleware(validatedConfig)).use("*", createDatabaseMiddleware(validatedConfig)).use("*", createSeedMiddleware()).use("*", createLLMProvidersMiddleware(validatedConfig)).route("/", server_default).basePath(validatedConfig.basePath) };
14625
+ return { app: new Hono().use("*", createEnvValidatorMiddleware()).use("*", setConfigMiddleware(validatedConfig)).use("*", createMigrationMiddleware(validatedConfig)).use("*", createDatabaseMiddleware(validatedConfig)).use("*", createSeedMiddleware()).use("*", createLLMProvidersMiddleware(validatedConfig)).use("*", createAuthClientMiddleware()).route("/", server_default).basePath(validatedConfig.basePath) };
14556
14626
  };
14557
14627
  var src_default = server_default;
14558
14628
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@llmops/app",
3
- "version": "0.1.7",
3
+ "version": "0.1.9-beta.1",
4
4
  "description": "LLMOps application with server and client",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -54,6 +54,7 @@
54
54
  "@vanilla-extract/recipes": "^0.5.7",
55
55
  "@vanilla-extract/sprinkles": "^1.6.5",
56
56
  "@vanilla-extract/vite-plugin": "^5.1.3",
57
+ "better-auth": "^1.4.10",
57
58
  "clsx": "^2.1.1",
58
59
  "date-fns": "^4.1.0",
59
60
  "hono": "^4.10.7",
@@ -65,8 +66,8 @@
65
66
  "react-aria-components": "^1.13.0",
66
67
  "react-hook-form": "^7.68.0",
67
68
  "recharts": "^3.6.0",
68
- "@llmops/gateway": "^0.1.7",
69
- "@llmops/core": "^0.1.7"
69
+ "@llmops/core": "^0.1.9-beta.1",
70
+ "@llmops/gateway": "^0.1.9-beta.1"
70
71
  },
71
72
  "peerDependencies": {
72
73
  "react": "^19.2.1",
@@ -1 +0,0 @@
1
- import{r as s,j as k}from"./index-FrTQ7TcS.js";import{a as B,f as V,b as H,c as M,d as A,E as U}from"./useButton-CsZ8hBM8.js";import{u as J,a as $,F as q,I as z,i as Q,b as X}from"./InternalBackdrop-Za9lpJi7.js";import{c as K,m as Z,k as ee,l as W,g as te,a as ne,R as oe,P as se,d as O,r as _,v as G,w as re,o as j,C as F,s as ae,F as ie,x as le,p as ue,y as ce,n as de}from"./popupStateMapping-DolkyTT3.js";import{a as pe,b as fe,u as ge,p as me,c as Ce,d as Se}from"./useSyncedFloatingRootContext-BKbVh8Gq.js";import{u as Re,C as he}from"./useRole-CiSaVva3.js";import{u as xe,F as Ee}from"./useValueChanged-CTjBqaGs.js";function ve(t){const{store:e,parentContext:o,actionsRef:C}=t,l=e.useState("open"),r=e.useState("disablePointerDismissal"),u=e.useState("modal"),i=e.useState("popupElement"),{openMethod:n,triggerProps:g,reset:p}=J(l);pe(e);const{forceUnmount:f}=fe(l,e,()=>{p()}),a=B(E=>{const b=K(E);return b.preventUnmountOnClose=()=>{e.set("preventUnmountingOnClose",!0)},b}),S=s.useCallback(()=>{e.setOpen(!1,a(Z))},[e,a]);s.useImperativeHandle(C,()=>({unmount:f,close:S}),[f,S]);const d=ge({popupStore:e,onOpenChange:e.setOpen,treatPopupAsFloatingElement:!0,noEmit:!0}),[R,v]=s.useState(0),h=R===0,y=Re(d),c=ee(d,{outsidePressEvent(){return e.context.internalBackdropRef.current||e.context.backdropRef.current?"intentional":{mouse:u==="trap-focus"?"sloppy":"intentional",touch:"sloppy"}},outsidePress(E){if("button"in E&&E.button!==0||"touches"in E&&E.touches.length!==1)return!1;const b=te(E);if(h&&!r){const w=b;return u&&(e.context.internalBackdropRef.current||e.context.backdropRef.current)?e.context.internalBackdropRef.current===w||e.context.backdropRef.current===w||ne(w,i)&&!w?.hasAttribute("data-base-ui-portal"):!0}return!1},escapeKey:h});$(l&&u===!0,i);const{getReferenceProps:m,getFloatingProps:I,getTriggerProps:x}=W([y,c]);e.useContextCallback("onNestedDialogOpen",E=>{v(E+1)}),e.useContextCallback("onNestedDialogClose",()=>{v(0)}),s.useEffect(()=>(o?.onNestedDialogOpen&&l&&o.onNestedDialogOpen(R),o?.onNestedDialogClose&&!l&&o.onNestedDialogClose(),()=>{o?.onNestedDialogClose&&l&&o.onNestedDialogClose()}),[l,o,R]);const D=s.useMemo(()=>m(g),[m,g]),P=s.useMemo(()=>x(g),[x,g]),N=s.useMemo(()=>I(),[I]);e.useSyncedValues({openMethod:n,activeTriggerProps:D,inactiveTriggerProps:P,popupProps:N,floatingRootContext:d,nestedOpenDialogCount:R})}const L=s.createContext(void 0);function T(t){const e=s.useContext(L);if(t===!1&&e===void 0)throw new Error(V(27));return e}const Pe={...me,modal:O(t=>t.modal),nested:O(t=>t.nested),nestedOpenDialogCount:O(t=>t.nestedOpenDialogCount),disablePointerDismissal:O(t=>t.disablePointerDismissal),openMethod:O(t=>t.openMethod),descriptionElementId:O(t=>t.descriptionElementId),titleElementId:O(t=>t.titleElementId),viewportElement:O(t=>t.viewportElement),role:O(t=>t.role)};class Ie extends oe{constructor(e){super(be(e),{popupRef:s.createRef(),backdropRef:s.createRef(),internalBackdropRef:s.createRef(),triggerElements:new se,onOpenChange:void 0,onOpenChangeComplete:void 0},Pe)}setOpen=(e,o)=>{if(o.preventUnmountOnClose=()=>{this.set("preventUnmountingOnClose",!0)},!e&&o.trigger==null&&this.state.activeTriggerId!=null&&(o.trigger=this.state.activeTriggerElement??void 0),this.context.onOpenChange?.(e,o),o.isCanceled)return;const C={open:e,nativeEvent:o.event,reason:o.reason,nested:this.state.nested};this.state.floatingRootContext.context.events?.emit("openchange",C);const l={open:e},r=o.trigger?.id??null;(r||e)&&(l.activeTriggerId=r,l.activeTriggerElement=o.trigger??null),this.update(l)}}function be(t={}){return{...Ce(),modal:!0,disablePointerDismissal:!1,popupElement:null,viewportElement:null,descriptionElementId:void 0,titleElementId:void 0,openMethod:null,nested:!1,nestedOpenDialogCount:0,role:"dialog",...t}}function Ue(t){const{children:e,open:o,defaultOpen:C=!1,onOpenChange:l,onOpenChangeComplete:r,actionsRef:u,handle:i,triggerId:n,defaultTriggerId:g=null}=t,p=T(),f=!!p,a=H(()=>i?.store??new Ie({open:o??C,activeTriggerId:n!==void 0?n:g,modal:!0,disablePointerDismissal:!0,nested:f,role:"alertdialog"})).current;a.useControlledProp("open",o,C),a.useControlledProp("activeTriggerId",n,g),a.useSyncedValue("nested",f),a.useContextCallback("onOpenChange",l),a.useContextCallback("onOpenChangeComplete",r);const S=a.useState("payload");ve({store:a,actionsRef:u,parentContext:p?.store.context});const d=s.useMemo(()=>({store:a}),[a]);return k.jsx(L.Provider,{value:d,children:typeof e=="function"?e({payload:S}):e})}const Oe={..._,...G},Ae=s.forwardRef(function(e,o){const{render:C,className:l,forceRender:r=!1,...u}=e,{store:i}=T(),n=i.useState("open"),g=i.useState("nested"),p=i.useState("mounted"),f=i.useState("transitionStatus"),a=s.useMemo(()=>({open:n,transitionStatus:f}),[n,f]);return M("div",e,{state:a,ref:[i.context.backdropRef,o],stateAttributesMapping:Oe,props:[{role:"presentation",hidden:!p,style:{userSelect:"none",WebkitUserSelect:"none"}},u],enabled:r||!g})}),Ke=s.forwardRef(function(e,o){const{render:C,className:l,disabled:r=!1,nativeButton:u=!0,...i}=e,{store:n}=T(),g=n.useState("open");function p(d){g&&n.setOpen(!1,K(re,d.nativeEvent))}const{getButtonProps:f,buttonRef:a}=A({disabled:r,native:u}),S=s.useMemo(()=>({disabled:r}),[r]);return M("button",e,{state:S,ref:[o,a],props:[{onClick:p},i,f]})}),We=s.forwardRef(function(e,o){const{render:C,className:l,id:r,...u}=e,{store:i}=T(),n=j(r);return i.useSyncedValueWithCleanup("descriptionElementId",n),M("p",e,{ref:o,props:[{id:n},u]})});let De=(function(t){return t.nestedDialogs="--nested-dialogs",t})({}),Te=(function(t){return t[t.open=F.open]="open",t[t.closed=F.closed]="closed",t[t.startingStyle=F.startingStyle]="startingStyle",t[t.endingStyle=F.endingStyle]="endingStyle",t.nested="data-nested",t.nestedDialogOpen="data-nested-dialog-open",t})({});const Y=s.createContext(void 0);function ye(){const t=s.useContext(Y);if(t===void 0)throw new Error(V(26));return t}const Me={..._,...G,nestedDialogOpen(t){return t?{[Te.nestedDialogOpen]:""}:null}},_e=s.forwardRef(function(e,o){const{className:C,finalFocus:l,initialFocus:r,render:u,...i}=e,{store:n}=T(),g=n.useState("descriptionElementId"),p=n.useState("disablePointerDismissal"),f=n.useState("floatingRootContext"),a=n.useState("popupProps"),S=n.useState("modal"),d=n.useState("mounted"),R=n.useState("nested"),v=n.useState("nestedOpenDialogCount"),h=n.useState("open"),y=n.useState("openMethod"),c=n.useState("titleElementId"),m=n.useState("transitionStatus"),I=n.useState("role");ye(),ae({open:h,ref:n.context.popupRef,onComplete(){h&&n.context.onOpenChangeComplete?.(!0)}});function x(b){return b==="touch"?n.context.popupRef.current:!0}const D=r===void 0?x:r,P=v>0,N=s.useMemo(()=>({open:h,nested:R,transitionStatus:m,nestedDialogOpen:P}),[h,R,m,P]),E=M("div",e,{state:N,props:[a,{"aria-labelledby":c??void 0,"aria-describedby":g??void 0,role:I,tabIndex:-1,hidden:!d,onKeyDown(b){he.has(b.key)&&b.stopPropagation()},style:{[De.nestedDialogs]:v}},i],ref:[o,n.context.popupRef,n.useStateSetter("popupElement")],stateAttributesMapping:Me});return k.jsx(q,{context:f,openInteractionType:y,disabled:!d,closeOnFocusOut:!p,initialFocus:D,returnFocus:l,modal:S!==!1,restoreFocus:"popup",children:E})}),Ge=s.forwardRef(function(e,o){const{keepMounted:C=!1,...l}=e,{store:r}=T(),u=r.useState("mounted"),i=r.useState("modal");return u||C?k.jsx(Y.Provider,{value:C,children:k.jsxs(ie,{ref:o,...l,children:[u&&i===!0&&k.jsx(z,{ref:r.context.internalBackdropRef,inert:Q(!open)}),e.children]})}):null}),Le=s.forwardRef(function(e,o){const{render:C,className:l,id:r,...u}=e,{store:i}=T(),n=j(r);return i.useSyncedValueWithCleanup("titleElementId",n),M("h2",e,{ref:o,props:[{id:n},u]})}),Ye=s.forwardRef(function(e,o){const{render:C,className:l,disabled:r=!1,nativeButton:u=!0,id:i,payload:n,handle:g,...p}=e,f=T(!0),a=g?.store??f?.store;if(!a)throw new Error(V(79));const S=j(i),d=a.useState("floatingRootContext"),R=a.useState("isOpenedByTrigger",S),v=s.useRef(null),{registerTrigger:h,isMountedByThisTrigger:y}=Se(S,v,a,{payload:n}),{getButtonProps:c,buttonRef:m}=A({disabled:r,native:u}),I=X(d,{enabled:d!=null}),x=W([I]),D=s.useMemo(()=>({disabled:r,open:R}),[r,R]),P=a.useState("triggerProps",y);return M("button",e,{state:D,ref:[m,o,h,v],props:[x.getReferenceProps(),P,{[le]:"",id:S},p,c],stateAttributesMapping:ue})}),He=s.forwardRef(function(e,o){const{render:C,className:l,validationMode:r="onSubmit",errors:u,onSubmit:i,onFormSubmit:n,...g}=e,p=s.useRef({fields:new Map}),f=s.useRef(!1),a=s.useRef(!1),S=B(c=>{c&&(c.focus(),c.tagName==="INPUT"&&c.select())}),[d,R]=s.useState(u);xe(u,()=>{R(u)}),s.useEffect(()=>{if(!f.current)return;f.current=!1;const c=Array.from(p.current.fields.values()).filter(m=>m.validityData.state.valid===!1);c.length&&S(c[0].controlRef.current)},[d,S]);const v=M("form",e,{ref:o,props:[{noValidate:!0,onSubmit(c){a.current=!0;let m=Array.from(p.current.fields.values());m.forEach(x=>{x.validate()}),m=Array.from(p.current.fields.values());const I=m.filter(x=>!x.validityData.state.valid);if(I.length)c.preventDefault(),S(I[0].controlRef.current);else if(f.current=!0,i?.(c),n){c.preventDefault();const x=m.reduce((D,P)=>(P.name&&(D[P.name]=P.getValue()),D),{});n(x,ce(de,c.nativeEvent))}}},g]}),h=B(c=>{if(c&&d&&U.hasOwnProperty.call(d,c)){const m={...d};delete m[c],R(m)}}),y=s.useMemo(()=>({formRef:p,validationMode:r,errors:d??U,clearErrors:h,submitAttemptedRef:a}),[p,r,d,h]);return k.jsx(Ee.Provider,{value:y,children:v})});export{Ue as A,Ye as D,He as F,Ge as a,Ae as b,_e as c,Le as d,We as e,Ke as f};
@@ -1,12 +0,0 @@
1
- import{u as J,g as ae,N as ct,z as Ue,y as Je,a as Q,j as _,e as Me,o as at,E as ut,B as lt}from"./useButton-CsZ8hBM8.js";import{T as Pe,Q as ue,aA as ft,aB as dt,aC as pt,ac as G,ap as De,a0 as ne,S as bt,aD as mt,u as ve,M as Qe,ah as Ne,aE as Ze,aF as ye,a9 as Be,aG as We,aH as j,a1 as U,a as L,a7 as ht,ag as Ve,t as gt,A as vt,aq as yt,ar as Et,_ as Ge,W as Ye,Y as kt,aI as Tt,al as wt,g as re,c as ie,K as Rt,aJ as et,x as xt,aK as Ct,i as qe,aL as St,f as be,aa as Ot}from"./popupStateMapping-DolkyTT3.js";import{r as h,j as ce}from"./index-FrTQ7TcS.js";let He={},$e={},je="";function Ft(e){if(typeof document>"u")return!1;const r=ue(e);return ae(r).innerWidth-r.documentElement.clientWidth>0}function Lt(e){const r=ue(e),t=r.documentElement,n=r.body,o=Ue(t)?t:n,c=o.style.overflow;return o.style.overflow="hidden",()=>{o.style.overflow=c}}function It(e){const r=ue(e),t=r.documentElement,n=r.body,o=ae(t);let c=0,d=0;const x=pt.create(),E=typeof CSS<"u"&&CSS.supports?.("scrollbar-gutter","stable");if(dt&&(o.visualViewport?.scale??1)!==1)return()=>{};function R(){const S=o.getComputedStyle(t),a=o.getComputedStyle(n),g=(S.scrollbarGutter||"").includes("both-edges")?"stable both-edges":"stable";c=t.scrollTop,d=t.scrollLeft,He={scrollbarGutter:t.style.scrollbarGutter,overflowY:t.style.overflowY,overflowX:t.style.overflowX},je=t.style.scrollBehavior,$e={position:n.style.position,height:n.style.height,width:n.style.width,boxSizing:n.style.boxSizing,overflowY:n.style.overflowY,overflowX:n.style.overflowX,scrollBehavior:n.style.scrollBehavior};const y=t.scrollHeight>t.clientHeight,f=t.scrollWidth>t.clientWidth,u=S.overflowY==="scroll"||a.overflowY==="scroll",N=S.overflowX==="scroll"||a.overflowX==="scroll",O=Math.max(0,o.innerWidth-t.clientWidth),A=Math.max(0,o.innerHeight-t.clientHeight),M=parseFloat(a.marginTop)+parseFloat(a.marginBottom),K=parseFloat(a.marginLeft)+parseFloat(a.marginRight),I=Ue(t)?t:n;if(E){t.style.scrollbarGutter=g,I.style.overflowY="hidden",I.style.overflowX="hidden";return}Object.assign(t.style,{scrollbarGutter:g,overflowY:"hidden",overflowX:"hidden"}),(y||u)&&(t.style.overflowY="scroll"),(f||N)&&(t.style.overflowX="scroll"),Object.assign(n.style,{position:"relative",height:M||A?`calc(100dvh - ${M+A}px)`:"100dvh",width:K||O?`calc(100vw - ${K+O}px)`:"100vw",boxSizing:"border-box",overflow:"hidden",scrollBehavior:"unset"}),n.scrollTop=c,n.scrollLeft=d,t.setAttribute("data-base-ui-scroll-locked",""),t.style.scrollBehavior="unset"}function C(){Object.assign(t.style,He),Object.assign(n.style,$e),E||(t.scrollTop=c,t.scrollLeft=d,t.removeAttribute("data-base-ui-scroll-locked"),t.style.scrollBehavior=je)}function D(){C(),x.request(R)}return R(),o.addEventListener("resize",D),()=>{x.cancel(),C(),typeof o.removeEventListener=="function"&&o.removeEventListener("resize",D)}}class At{lockCount=0;restore=null;timeoutLock=Pe.create();timeoutUnlock=Pe.create();acquire(r){return this.lockCount+=1,this.lockCount===1&&this.restore===null&&this.timeoutLock.start(0,()=>this.lock(r)),this.release}release=()=>{this.lockCount-=1,this.lockCount===0&&this.restore&&this.timeoutUnlock.start(0,this.unlock)};unlock=()=>{this.lockCount===0&&this.restore&&(this.restore?.(),this.restore=null)};lock(r){if(this.lockCount===0||this.restore!==null)return;const n=ue(r).documentElement,o=ae(n).getComputedStyle(n).overflowY;if(o==="hidden"||o==="clip"){this.restore=ct;return}const c=ft||!Ft(r);this.restore=c?Lt(r):It(r)}}const Mt=new At;function jt(e=!0,r=null){J(()=>{if(e)return Mt.acquire(r)},[e,r])}let Xe=0;function me(e,r={}){const{preventScroll:t=!1,cancelPrevious:n=!0,sync:o=!1}=r;n&&cancelAnimationFrame(Xe);const c=()=>e?.focus({preventScroll:t});o?c():Xe=requestAnimationFrame(c)}const X={inert:new WeakMap,"aria-hidden":new WeakMap,none:new WeakMap};function Ke(e){return e==="inert"?X.inert:e==="aria-hidden"?X["aria-hidden"]:X.none}let oe=new WeakSet,se={},he=0;const tt=e=>e&&(e.host||tt(e.parentNode)),Pt=(e,r)=>r.map(t=>{if(e.contains(t))return t;const n=tt(t);return e.contains(n)?n:null}).filter(t=>t!=null);function Dt(e,r,t,n){const o="data-base-ui-inert",c=n?"inert":t?"aria-hidden":null,d=Pt(r,e),x=new Set,E=new Set(d),R=[];se[o]||(se[o]=new WeakMap);const C=se[o];d.forEach(D),S(r),x.clear();function D(a){!a||x.has(a)||(x.add(a),a.parentNode&&D(a.parentNode))}function S(a){!a||E.has(a)||[].forEach.call(a.children,p=>{if(Je(p)!=="script")if(x.has(p))S(p);else{const F=c?p.getAttribute(c):null,g=F!==null&&F!=="false",y=Ke(c),f=(y.get(p)||0)+1,u=(C.get(p)||0)+1;y.set(p,f),C.set(p,u),R.push(p),f===1&&g&&oe.add(p),u===1&&p.setAttribute(o,""),!g&&c&&p.setAttribute(c,c==="inert"?"":"true")}})}return he+=1,()=>{R.forEach(a=>{const p=Ke(c),g=(p.get(a)||0)-1,y=(C.get(a)||0)-1;p.set(a,g),C.set(a,y),g||(!oe.has(a)&&c&&a.removeAttribute(c),oe.delete(a)),y||a.removeAttribute(o)}),he-=1,he||(X.inert=new WeakMap,X["aria-hidden"]=new WeakMap,X.none=new WeakMap,oe=new WeakSet,se={})}}function Nt(e,r=!1,t=!1){const n=G(e[0]).body;return Dt(e.concat(Array.from(n.querySelectorAll("[aria-live]"))),n,r,t)}function Bt(e,r){const t=ae(e.target);return e instanceof t.KeyboardEvent?"keyboard":e instanceof t.FocusEvent?r||"keyboard":"pointerType"in e?e.pointerType||"keyboard":"touches"in e?"touch":e instanceof t.MouseEvent?r||(e.detail===0?"keyboard":"mouse"):""}const ze=20;let Y=[];function Ee(){Y=Y.filter(e=>e.isConnected)}function Wt(e){Ee(),e&&Je(e)!=="body"&&(Y.push(e),Y.length>ze&&(Y=Y.slice(-ze)))}function ge(){return Ee(),Y[Y.length-1]}function Vt(e){if(!e)return null;const r=ye();return et(e,r)?e:Ze(e,r)[0]||e}function Gt(e){return!e||!e.isConnected?!1:typeof e.checkVisibility=="function"?e.checkVisibility():at(e).display!=="none"}function _e(e,r){if(!r.current.includes("floating")&&!e.getAttribute("role")?.includes("dialog"))return;const t=ye(),o=Ct(e,t).filter(d=>{const x=d.getAttribute("data-tabindex")||"";return et(d,t)||d.hasAttribute("data-tabindex")&&!x.startsWith("-")}),c=e.getAttribute("tabindex");r.current.includes("floating")||o.length===0?c!=="0"&&e.setAttribute("tabindex","0"):(c!=="-1"||e.hasAttribute("data-tabindex")&&e.getAttribute("data-tabindex")!=="-1")&&(e.setAttribute("tabindex","-1"),e.setAttribute("data-tabindex","-1"))}function Xt(e){const{context:r,children:t,disabled:n=!1,order:o=["content"],initialFocus:c=!0,returnFocus:d=!0,restoreFocus:x=!1,modal:E=!0,closeOnFocusOut:R=!0,openInteractionType:C="",getInsideElements:D=()=>[],nextFocusableElement:S,previousFocusableElement:a,beforeContentFocusGuardRef:p,externalTree:F}=e,g="rootStore"in r?r.rootStore:r,y=g.useState("open"),f=g.useState("domReferenceElement"),u=g.useState("floatingElement"),{events:N,dataRef:O}=g.context,A=Q(()=>O.current.floatingContext?.nodeId),M=Q(D),K=c===!1,I=De(f)&&K,q=ne(o),ke=ne(c),Z=ne(d),Te=ne(C),B=bt(F),k=mt(),nt=h.useRef(null),rt=h.useRef(null),W=h.useRef(!1),ee=h.useRef(!1),le=h.useRef(!1),we=h.useRef(-1),Re=h.useRef(""),fe=h.useRef(""),xe=ve(),Ce=ve(),Se=Qe(),de=k!=null,l=Ne(u),H=Q((i=l)=>i?Ze(i,ye()):[]),z=Q(i=>{const b=H(i);return q.current.map(()=>b).filter(Boolean).flat()});h.useEffect(()=>{if(n||!E)return;function i(T){T.key==="Tab"&&L(l,U(G(l)))&&H().length===0&&!I&&wt(T)}const b=G(l);return b.addEventListener("keydown",i),()=>{b.removeEventListener("keydown",i)}},[n,f,l,E,q,I,H,z]),h.useEffect(()=>{if(n||!u)return;function i(b){const T=re(b),w=H().indexOf(T);w!==-1&&(we.current=w)}return u.addEventListener("focusin",i),()=>{u.removeEventListener("focusin",i)}},[n,u,H]),h.useEffect(()=>{if(n||!y)return;const i=G(l);function b(){le.current=!1}function T(w){const s=re(w),m=L(u,s)||L(f,s)||L(k?.portalNode,s);le.current=!m,fe.current=w.pointerType||"keyboard"}function v(){fe.current="keyboard"}return i.addEventListener("pointerdown",T,!0),i.addEventListener("pointerup",b,!0),i.addEventListener("pointercancel",b,!0),i.addEventListener("keydown",v,!0),()=>{i.removeEventListener("pointerdown",T,!0),i.removeEventListener("pointerup",b,!0),i.removeEventListener("pointercancel",b,!0),i.removeEventListener("keydown",v,!0)}},[n,u,f,l,y,k]),h.useEffect(()=>{if(n||!R)return;function i(){ee.current=!0,Ce.start(0,()=>{ee.current=!1})}function b(s){const m=s.relatedTarget,$=s.currentTarget,P=re(s);queueMicrotask(()=>{const te=A(),Ie=g.context.triggerElements,it=!(L(f,m)||L(u,m)||L(m,u)||L(k?.portalNode,m)||m!=null&&Ie.hasElement(m)||Ie.hasMatchingElement(V=>L(V,m))||m?.hasAttribute(Be("focus-guard"))||B&&(Ve(B.nodesRef.current,te).find(V=>L(V.context?.elements.floating,m)||L(V.context?.elements.domReference,m))||We(B.nodesRef.current,te).find(V=>[V.context?.elements.floating,Ne(V.context?.elements.floating)].includes(m)||V.context?.elements.domReference===m)));if($===f&&l&&_e(l,q),x&&$!==f&&!Gt(P)&&U(G(l))===G(l).body){if(_(l)&&(l.focus(),x==="popup")){Se.request(()=>{l.focus()});return}const V=we.current,pe=H(),Ae=pe[V]||pe[pe.length-1]||l;_(Ae)&&Ae.focus()}if(O.current.insideReactTree){O.current.insideReactTree=!1;return}(I||!E)&&m&&it&&!ee.current&&(I||m!==ge())&&(W.current=!0,g.setOpen(!1,ie(Rt,s)))})}function T(){le.current||(O.current.insideReactTree=!0,xe.start(0,()=>{O.current.insideReactTree=!1}))}const v=_(f)?f:null,w=[];if(!(!u&&!v))return v&&(v.addEventListener("focusout",b),v.addEventListener("pointerdown",i),w.push(()=>{v.removeEventListener("focusout",b),v.removeEventListener("pointerdown",i)})),u&&(u.addEventListener("focusout",b),k&&(u.addEventListener("focusout",T,!0),w.push(()=>{u.removeEventListener("focusout",T,!0)})),w.push(()=>{u.removeEventListener("focusout",b)})),()=>{w.forEach(s=>{s()})}},[n,f,u,l,E,B,k,g,R,x,H,I,A,q,O,xe,Ce,Se]);const Oe=h.useRef(null),Fe=h.useRef(null),ot=Me(Oe,p,k?.beforeInsideRef),st=Me(Fe,k?.afterInsideRef);h.useEffect(()=>{if(n||!u||!y)return;const i=Array.from(k?.portalNode?.querySelectorAll(`[${Be("portal")}]`)||[]),T=(B?We(B.nodesRef.current,A()):[]).find(s=>De(s.context?.elements.domReference||null))?.context?.elements.domReference,v=[u,T,...i,...M(),nt.current,rt.current,Oe.current,Fe.current,k?.beforeOutsideRef.current,k?.afterOutsideRef.current,j(a),j(S),I?f:null].filter(s=>s!=null),w=Nt(v,E||I);return()=>{w()}},[y,n,f,u,E,q,k,I,B,A,M,S,a]),J(()=>{if(!y||n||!_(l))return;const i=G(l),b=U(i);queueMicrotask(()=>{const T=z(l),v=ke.current,w=typeof v=="function"?v(Te.current||""):v;if(w===void 0||w===!1)return;let s;w===!0||w===null?s=T[0]||l:s=j(w),s=s||T[0]||l,!L(l,b)&&me(s,{preventScroll:s===l})})},[n,y,l,K,z,ke,Te]),J(()=>{if(n||!l)return;const i=G(l),b=U(i);Wt(b);function T(s){if(s.open||(Re.current=Bt(s.nativeEvent,fe.current)),s.reason===gt&&s.nativeEvent.type==="mouseleave"&&(W.current=!0),s.reason===vt)if(s.nested)W.current=!1;else if(yt(s.nativeEvent)||Et(s.nativeEvent))W.current=!1;else{let m=!1;document.createElement("div").focus({get preventScroll(){return m=!0,!1}}),m?W.current=!1:W.current=!0}}N.on("openchange",T);const v=i.createElement("span");v.setAttribute("tabindex","-1"),v.setAttribute("aria-hidden","true"),Object.assign(v.style,ht),de&&f&&f.insertAdjacentElement("afterend",v);function w(){const s=Z.current;let m=typeof s=="function"?s(Re.current):s;if(m===void 0||m===!1)return null;if(m===null&&(m=!0),typeof m=="boolean"){const P=f||ge();return P&&P.isConnected?P:v}const $=f||ge()||v;return j(m)||$}return()=>{N.off("openchange",T);const s=U(i),m=L(u,s)||B&&Ve(B.nodesRef.current,A(),!1).some(P=>L(P.context?.elements.floating,s)),$=w();queueMicrotask(()=>{const P=Vt($),te=typeof Z.current!="boolean";Z.current&&!W.current&&_(P)&&(!(!te&&P!==s&&s!==i.body)||m)&&P.focus({preventScroll:!0}),v.remove()})}},[n,u,l,Z,O,N,B,de,f,A]),h.useEffect(()=>{queueMicrotask(()=>{W.current=!1})},[n]),h.useEffect(()=>{if(n||!y)return;function i(T){re(T)?.closest(`[${xt}]`)&&(ee.current=!0)}const b=G(l);return b.addEventListener("pointerdown",i,!0),()=>{b.removeEventListener("pointerdown",i,!0)}},[n,y,l]),J(()=>{if(!n&&k)return k.setFocusManagerState({modal:E,closeOnFocusOut:R,open:y,onOpenChange:g.setOpen,domReference:f}),()=>{k.setFocusManagerState(null)}},[n,k,E,y,g,R,f]),J(()=>{if(!(n||!l))return _e(l,q),()=>{queueMicrotask(Ee)}},[n,l,q]);const Le=!n&&(E?!I:!0)&&(de||E);return ce.jsxs(h.Fragment,{children:[Le&&ce.jsx(Ge,{"data-type":"inside",ref:ot,onFocus:i=>{if(E){const b=z();me(b[b.length-1])}else k?.portalNode&&(W.current=!1,Ye(i,k.portalNode)?kt(f)?.focus():j(a??k.beforeOutsideRef)?.focus())}}),t,Le&&ce.jsx(Ge,{"data-type":"inside",ref:st,onFocus:i=>{E?me(z()[0]):k?.portalNode&&(R&&(W.current=!0),Ye(i,k.portalNode)?Tt(f)?.focus():j(S??k.afterOutsideRef)?.focus())}})]})}function Kt(e,r={}){const t="rootStore"in e?e.rootStore:e,n=t.context.dataRef,{enabled:o=!0,event:c="click",toggle:d=!0,ignoreMouse:x=!1,stickIfOpen:E=!0,touchOpenDelay:R=0}=r,C=h.useRef(void 0),D=Qe(),S=ve(),a=h.useMemo(()=>({onPointerDown(p){C.current=p.pointerType},onMouseDown(p){const F=C.current,g=p.nativeEvent,y=t.select("open");if(p.button!==0||c==="click"||qe(F,!0)&&x)return;const f=n.current.openEvent,u=f?.type,N=t.select("domReferenceElement")!==p.currentTarget,O=y&&N||!(y&&d&&(!(f&&E)||u==="click"||u==="mousedown"));if(Ot(g.target)){const M=ie(be,g,g.target);O&&F==="touch"&&R>0?S.start(R,()=>{t.setOpen(!0,M)}):t.setOpen(O,M);return}const A=p.currentTarget;D.request(()=>{const M=ie(be,g,A);O&&F==="touch"&&R>0?S.start(R,()=>{t.setOpen(!0,M)}):t.setOpen(O,M)})},onClick(p){if(c==="mousedown-only")return;const F=C.current;if(c==="mousedown"&&F){C.current=void 0;return}if(qe(F,!0)&&x)return;const g=t.select("open"),y=n.current.openEvent,f=t.select("domReferenceElement")!==p.currentTarget,u=g&&f||!(g&&d&&(!(y&&E)||St(y))),N=ie(be,p.nativeEvent,p.currentTarget);u&&F==="touch"&&R>0?S.start(R,()=>{t.setOpen(!0,N)}):t.setOpen(u,N)},onKeyDown(){C.current=void 0}}),[n,c,x,t,E,d,D,S,R]);return h.useMemo(()=>o?{reference:a}:ut,[o,a])}function Yt(e){const r=h.useRef(""),t=h.useCallback(o=>{o.defaultPrevented||(r.current=o.pointerType,e(o,o.pointerType))},[e]);return{onClick:h.useCallback(o=>{if(o.detail===0){e(o,"keyboard");return}"pointerType"in o&&e(o,o.pointerType),e(o,r.current),r.current=""},[e]),onPointerDown:t}}function zt(e){const[r,t]=h.useState(null),n=Q((x,E)=>{e||t(E)}),o=h.useCallback(()=>{t(null)},[]),{onClick:c,onPointerDown:d}=Yt(n);return h.useMemo(()=>({openMethod:r,reset:o,triggerProps:{onClick:c,onPointerDown:d}}),[r,o,c,d])}function _t(e){return lt(19)?e:e?"true":void 0}const Ut=h.forwardRef(function(r,t){const{cutout:n,...o}=r;let c;if(n){const d=n?.getBoundingClientRect();c=`polygon(
2
- 0% 0%,
3
- 100% 0%,
4
- 100% 100%,
5
- 0% 100%,
6
- 0% 0%,
7
- ${d.left}px ${d.top}px,
8
- ${d.left}px ${d.bottom}px,
9
- ${d.right}px ${d.bottom}px,
10
- ${d.right}px ${d.top}px,
11
- ${d.left}px ${d.top}px
12
- )`}return ce.jsx("div",{ref:t,role:"presentation","data-base-ui-inert":"",...o,style:{position:"fixed",inset:0,userSelect:"none",WebkitUserSelect:"none",clipPath:c}})});export{Xt as F,Ut as I,jt as a,Kt as b,me as e,_t as i,zt as u};
@@ -1 +0,0 @@
1
- import{a as Q,a5 as X,j as i,d as Y,r as D,I as Z}from"./index-FrTQ7TcS.js";import{B as ee}from"./button-CMZqhyXB.js";import{j as G}from"./combobox-iSbUYz0A.js";import{u as te}from"./useEnvironments-Bu_0SIUj.js";import{u as ne}from"./useConfigVariants-CLc_hPw1.js";import{u as ie}from"./useTargetingRules-BrgaEdxR.js";import{u as se,e as ae,a as J,v as K,b as M,S as re,f as oe,i as le}from"./useSetTargeting-bk0Ixhqq.js";import{i as ce,a as de}from"./info-box.css-DuVI9M9-.js";/* empty css */import"./useButton-CsZ8hBM8.js";import"./popupStateMapping-DolkyTT3.js";import"./reselect-DVmmTZGf.js";import"./getDisabledMountTransitionStyles-TZFYxPIU.js";import"./InternalBackdrop-Za9lpJi7.js";import"./useValueChanged-CTjBqaGs.js";import"./useMutation-D4JglXWk.js";function Ee(){const t=Q.c(17),{id:e,environment:a}=X.useParams(),{data:c,isLoading:j}=te(),{data:o,isLoading:y}=ne(e),{data:L,isLoading:I}=ie(e);if(j||y||I){let s;return t[0]===Symbol.for("react.memo_cache_sentinel")?(s=i.jsx("div",{children:"Loading..."}),t[0]=s):s=t[0],s}let n;t[1]!==a||t[2]!==c?(n=c?.find(s=>s.id===a),t[1]=a,t[2]=c,t[3]=n):n=t[3];const S=n;if(!S){let s;return t[4]===Symbol.for("react.memo_cache_sentinel")?(s=i.jsx("div",{children:"Environment not found"}),t[4]=s):s=t[4],s}let r;t[5]!==a||t[6]!==L?(r=L?.find(s=>s.environmentId===a),t[5]=a,t[6]=L,t[7]=r):r=t[7];const R=r;let l;t[8]!==o?(l=o??[],t[8]=o,t[9]=l):l=t[9];const B=R?.configVariantId??null,E=R?.variantVersionId??null;let g;return t[10]!==e||t[11]!==S||t[12]!==a||t[13]!==l||t[14]!==B||t[15]!==E?(g=i.jsx(me,{configId:e,environmentId:a,environment:S,variants:l,initialVariantId:B,initialVariantVersionId:E}),t[10]=e,t[11]=S,t[12]=a,t[13]=l,t[14]=B,t[15]=E,t[16]=g):g=t[16],g}function me(t){const e=Q.c(67),{configId:a,environmentId:c,environment:j,variants:o,initialVariantId:y,initialVariantVersionId:L}=t,I=Y(),v=se(),[n,S]=D.useState(y),[r,R]=D.useState(L??null);let l;if(e[0]!==n||e[1]!==o){let m;e[3]!==n?(m=P=>P.id===n,e[3]=n,e[4]=m):m=e[4],l=o.find(m),e[0]=n,e[1]=o,e[2]=l}else l=e[2];const E=l?.variantId??"",{data:g,isLoading:s}=ae(E);let $,w;e[5]!==y||e[6]!==n?($=()=>{n!==y&&R(null)},w=[n,y],e[5]=y,e[6]=n,e[7]=$,e[8]=w):($=e[7],w=e[8]),D.useEffect($,w);let z;e[9]!==o?(z=o.map(ge),e[9]=o,e[10]=z):z=e[10];const u=z;let p,b,h,x,V,N,d;if(e[11]!==a||e[12]!==j.name||e[13]!==c||e[14]!==s||e[15]!==I||e[16]!==n||e[17]!==r||e[18]!==v||e[19]!==u||e[20]!==o||e[21]!==g){d=g?.map(ve)??[];let m;e[29]!==a||e[30]!==c||e[31]!==I||e[32]!==n||e[33]!==r||e[34]!==v?(m=async()=>{if(!(!n||!r))try{await v.mutateAsync({environmentId:c,configId:a,configVariantId:n,variantVersionId:r}),I({to:"/configs/$id/targeting",params:{id:a}})}catch(f){console.error("Error setting targeting:",f)}},e[29]=a,e[30]=c,e[31]=I,e[32]=n,e[33]=r,e[34]=v,e[35]=m):m=e[35];const P=m;let H;e[36]===Symbol.for("react.memo_cache_sentinel")?(H={justifyContent:"flex-end"},e[36]=H):H=e[36];const q=!n||!r||v.isPending;let W;e[37]===Symbol.for("react.memo_cache_sentinel")?(W=i.jsx(Z,{icon:re,size:"sm"}),e[37]=W):W=e[37];const A=v.isPending?"Saving...":"Save";e[38]!==P||e[39]!==q||e[40]!==A?(p=i.jsx("div",{className:oe,style:H,children:i.jsxs(ee,{variant:"primary",onClick:P,disabled:q,children:[W,A]})}),e[38]=P,e[39]=q,e[40]=A,e[41]=p):p=e[41],b=le,e[42]!==j.name?(h=i.jsxs("div",{className:ce,children:["The selected variant will be served to all requests in the"," ",i.jsx("span",{className:de,children:j.name})," ","environment"]}),e[42]=j.name,e[43]=h):h=e[43];let k;e[44]===Symbol.for("react.memo_cache_sentinel")?(k=i.jsx("div",{className:K,style:{minWidth:"120px"},children:"Variant"}),e[44]=k):k=e[44];let T;e[45]!==o?(T=f=>{if(!f)return"";const O=o.find(U=>U.id===f);return O?O.name:f},e[45]=o,e[46]=T):T=e[46],e[47]!==n||e[48]!==T||e[49]!==u?(x=i.jsxs("div",{className:J,children:[k,i.jsx("div",{className:M,children:i.jsx(G,{items:u,value:n,onValueChange:S,placeholder:"Select a variant...",itemToString:T})})]}),e[47]=n,e[48]=T,e[49]=u,e[50]=x):x=e[50],e[51]!==u.length?(V=u.length===0&&i.jsx("div",{style:{marginTop:"1rem",opacity:.6},children:"No variants available. Create a variant first to configure targeting."}),e[51]=u.length,e[52]=V):V=e[52],N=n&&i.jsxs("div",{className:J,children:[i.jsx("div",{className:K,style:{minWidth:"120px"},children:"Version"}),i.jsx("div",{className:M,children:s?i.jsx("span",{style:{opacity:.6},children:"Loading versions..."}):d.length===0?i.jsx("span",{style:{opacity:.6},children:"No versions available"}):i.jsx(G,{items:d,value:d.find(f=>f.id===r)??null,onValueChange:f=>R(f?.id??null),placeholder:"Select version...",itemToString:fe})})]}),e[11]=a,e[12]=j.name,e[13]=c,e[14]=s,e[15]=I,e[16]=n,e[17]=r,e[18]=v,e[19]=u,e[20]=o,e[21]=g,e[22]=p,e[23]=b,e[24]=h,e[25]=x,e[26]=V,e[27]=N,e[28]=d}else p=e[22],b=e[23],h=e[24],x=e[25],V=e[26],N=e[27],d=e[28];let C;e[53]!==n||e[54]!==r||e[55]!==d?(C=n&&!r&&d.length>0&&i.jsx("div",{style:{marginTop:"0.5rem",fontSize:"0.75rem",color:"var(--gray9)"},children:"Select a version to deploy to this environment."}),e[53]=n,e[54]=r,e[55]=d,e[56]=C):C=e[56];let _;e[57]!==C||e[58]!==b||e[59]!==h||e[60]!==x||e[61]!==V||e[62]!==N?(_=i.jsxs("div",{className:b,children:[h,x,V,N,C]}),e[57]=C,e[58]=b,e[59]=h,e[60]=x,e[61]=V,e[62]=N,e[63]=_):_=e[63];let F;return e[64]!==p||e[65]!==_?(F=i.jsxs("div",{children:[p,_]}),e[64]=p,e[65]=_,e[66]=F):F=e[66],F}function fe(t){return t?.label??""}function ve(t){return{id:t.id,label:`Version ${t.version}`,version:t.version}}function ge(t){return t.id}export{Ee as component};
@@ -1 +0,0 @@
1
- import{l as ke,a as fe,p as ue,j as s,I as me,C as Ee,L as ge,D as Ae,q as Fe,d as ye,r as de,u as Me,b as ze,e as He,O as qe}from"./index-FrTQ7TcS.js";import{w as Ve,b as Ue,C as Je,c as We,B as Ge,h as je,H as Ye,a as Ke,g as Qe}from"./area.css-CSjofvHM.js";import{B as Xe}from"./button-CMZqhyXB.js";import{P as Le,a as Oe,b as Pe}from"./popover-DXj4s-ni.js";import{C as Re}from"./chevron-down-BJFxhYkh.js";import{C as Ze}from"./combobox-iSbUYz0A.js";import{u as et}from"./useEnvironments-Bu_0SIUj.js";import{u as tt}from"./useConfigList-CAf01_dV.js";import{u as st}from"./useConfigVariants-CLc_hPw1.js";import{u as at}from"./useAnalytics-DTf81POS.js";import{C as lt}from"./chevron-right-fMWRsRLZ.js";/* empty css */import"./useButton-CsZ8hBM8.js";import"./InternalBackdrop-Za9lpJi7.js";import"./popupStateMapping-DolkyTT3.js";import"./reselect-DVmmTZGf.js";import"./useSyncedFloatingRootContext-BKbVh8Gq.js";import"./useRole-CiSaVva3.js";import"./usePopupAutoResize-D6RSlB-m.js";import"./getDisabledMountTransitionStyles-TZFYxPIU.js";import"./useValueChanged-CTjBqaGs.js";const nt=[["path",{d:"M8 2v4",key:"1cmpym"}],["path",{d:"M16 2v4",key:"4m81vk"}],["rect",{width:"18",height:"18",x:"3",y:"4",rx:"2",key:"1hopcy"}],["path",{d:"M3 10h18",key:"8toen8"}]],it=ke("calendar",nt);const rt=[["path",{d:"M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z",key:"sc7q7i"}]],ot=ke("funnel",rt);const ct=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],mt=ke("refresh-cw",ct);var dt="_5mtmrw0",ft="_5mtmrw2 _5mtmrw1 _1lg22bks0 _1lg22bksi _1lg22bktr _1lg22bk6 _1lg22bkpr",Se="_5mtmrw4 _5mtmrw3 _1lg22bks0 _1lg22bksi _1lg22bkto",Ne="_5mtmrw6 _5mtmrw5 _1lg22bkux _1lg22bkw0 _1lg22bkj3 _1lg22bk3",_e="_5mtmrw8 _5mtmrw7 _1lg22bks0 _1lg22bk3 _1lg22bkv0 _1lg22bkj9 _1lg22bkw0",bt="_5mtmrwa _5mtmrw9 _1lg22bk9";function gt(){const e=fe.c(18);let a;e[0]===Symbol.for("react.memo_cache_sentinel")?(a={from:"/(app)/observability"},e[0]=a):a=e[0];const t=ue(a);let l;e[1]===Symbol.for("react.memo_cache_sentinel")?(l=s.jsx("span",{className:Ne,children:"Analytics"}),e[1]=l):l=e[1];let u;e[2]===Symbol.for("react.memo_cache_sentinel")?(u=s.jsx(me,{icon:Ee}),e[2]=u):u=e[2];let h;e[3]!==t?(h=s.jsxs(ge,{to:"/observability/overview",search:t,className:_e,children:[u,"Overview"]}),e[3]=t,e[4]=h):h=e[4];let o;e[5]===Symbol.for("react.memo_cache_sentinel")?(o=s.jsx(me,{icon:Ae}),e[5]=o):o=e[5];let i;e[6]!==t?(i=s.jsxs(ge,{to:"/observability/costs",search:t,className:_e,children:[o,"Costs"]}),e[6]=t,e[7]=i):i=e[7];let d;e[8]!==h||e[9]!==i?(d=s.jsxs("div",{className:Se,children:[l,h,i]}),e[8]=h,e[9]=i,e[10]=d):d=e[10];let c;e[11]===Symbol.for("react.memo_cache_sentinel")?(c=s.jsx("span",{className:Ne,children:"Logs"}),e[11]=c):c=e[11];let r;e[12]===Symbol.for("react.memo_cache_sentinel")?(r=s.jsx(me,{icon:Fe}),e[12]=r):r=e[12];let b;e[13]!==t?(b=s.jsxs("div",{className:Se,children:[c,s.jsxs(ge,{to:"/observability/requests",search:t,className:_e,children:[r,"Requests"]})]}),e[13]=t,e[14]=b):b=e[14];let f;return e[15]!==d||e[16]!==b?(f=s.jsxs("nav",{className:ft,children:[d,b]}),e[15]=d,e[16]=b,e[17]=f):f=e[17],f}var ut="_1ey9mxp0",ht="_1ey9mxp2 _1ey9mxp1 _1lg22bks0 _1lg22bkto _1lg22bkv0 _1lg22bkw0 _1lg22bk3 _1lg22bkuc",Ie="_1ey9mxp3",_t="_1ey9mxp4",vt="_1ey9mxp6 _1ey9mxp5 _1lg22bkuf",pt="_1ey9mxp8 _1ey9mxp7 _1lg22bk6 _1lg22bkux _1lg22bkw0",xt="_1ey9mxp9",kt="_1ey9mxpb _1ey9mxpa _1lg22bkv0 _1lg22bkw0 _1lg22bk3 _1lg22bkuc",yt="_1ey9mxpd",jt="_1ey9mxpf _1ey9mxpe _1lg22bkux _1lg22bkw0 _1lg22bkj3",St="_1ey9mxpg",we="_1ey9mxpi _1ey9mxph _1lg22bkv0 _1lg22bkw0 _1lg22bk3 _1lg22bkuc",Nt="_1ey9mxpk _1ey9mxpj _1lg22bkv0 _1lg22bkw0 _1lg22bkj3",It="_1ey9mxpm _1ey9mxpl _1lg22bkv0 _1lg22bkw0 _1lg22bk3 _1lg22bkuc",wt="_1ey9mxpo _1ey9mxpn _1lg22bk3 _1lg22bkuc",Ct="_1ey9mxpq";const Ce=[{label:"Last 15 minutes",value:"15m"},{label:"Last 1 hour",value:"1h"},{label:"Last 3 hours",value:"3h"},{label:"Last 6 hours",value:"6h"},{label:"Last 12 hours",value:"12h"},{label:"Last 24 hours",value:"24h"},{label:"Last 2 days",value:"2d"},{label:"Last 7 days",value:"7d"},{label:"Last 30 days",value:"30d"},{label:"Last 90 days",value:"90d"}],Be=e=>{const a=new Date;let t=new Date;switch(e){case"15m":t=new Date(a.getTime()-900*1e3);break;case"1h":t=new Date(a.getTime()-3600*1e3);break;case"3h":t=new Date(a.getTime()-10800*1e3);break;case"6h":t=new Date(a.getTime()-360*60*1e3);break;case"12h":t=new Date(a.getTime()-720*60*1e3);break;case"24h":t=new Date(a.getTime()-1440*60*1e3);break;case"2d":t=new Date(a.getTime()-2880*60*1e3);break;case"7d":t=new Date(a.getTime()-10080*60*1e3);break;case"30d":t=new Date(a.getTime()-720*60*60*1e3);break;case"90d":t=new Date(a.getTime()-2160*60*60*1e3);break;default:t=new Date(a.getTime()-10080*60*1e3)}return{from:t.toISOString(),to:a.toISOString()}},Te=e=>e?new Date(e).toISOString().split("T")[0]:"",Tt=e=>new Date(e+"T00:00:00").toISOString(),Dt=e=>new Date(e+"T23:59:59.999").toISOString();function Lt(){const e=fe.c(83);let a;e[0]===Symbol.for("react.memo_cache_sentinel")?(a={from:"/(app)/observability"},e[0]=a):a=e[0];const t=ue(a),l=ye(),[u,h]=de.useState(!1);let o;e[1]!==t.from?(o=Te(t.from),e[1]=t.from,e[2]=o):o=e[2];const[i,d]=de.useState(o);let c;e[3]!==t.to?(c=Te(t.to),e[3]=t.to,e[4]=c):c=e[4];const[r,b]=de.useState(c),f=t.range??"7d";let g,x,k,L,v,O,V,P,U,R,J,B,T,$;if(e[5]!==r||e[6]!==i||e[7]!==u||e[8]!==l||e[9]!==t.from||e[10]!==t.to||e[11]!==f){const p=Ce.find(C=>C.value===f)?.label??"Custom";let H;e[26]!==l?(H=C=>{const ae=Be(C);l({to:".",search:D=>({...D,range:C,from:ae.from,to:ae.to}),replace:!0}),h(!1)},e[26]=l,e[27]=H):H=e[27],L=H;let se;e[28]!==r||e[29]!==i||e[30]!==l?(se=()=>{i&&r&&(l({to:".",search:C=>({...C,range:"custom",from:Tt(i),to:Dt(r)}),replace:!0}),h(!1))},e[28]=r,e[29]=i,e[30]=l,e[31]=se):se=e[31],k=se;const ce=()=>{if(f!=="custom")return p;const C=t.from,ae=t.to;if(!C||!ae)return"Custom";const D=new Date(C),K=new Date(ae),q={month:"short",day:"numeric"};return D.getFullYear()!==K.getFullYear()?`${D.toLocaleDateString("en-US",{...q,year:"numeric"})} - ${K.toLocaleDateString("en-US",{...q,year:"numeric"})}`:`${D.toLocaleDateString("en-US",q)} - ${K.toLocaleDateString("en-US",q)}`};V=ut,x=Le,v=u,O=h,g=Oe,$=!0,R="button",J=ht,B=u?"open":"closed",e[32]===Symbol.for("react.memo_cache_sentinel")?(T=s.jsx(it,{size:14,className:Ie}),e[32]=T):T=e[32],P=_t,U=ce(),e[5]=r,e[6]=i,e[7]=u,e[8]=l,e[9]=t.from,e[10]=t.to,e[11]=f,e[12]=g,e[13]=x,e[14]=k,e[15]=L,e[16]=v,e[17]=O,e[18]=V,e[19]=P,e[20]=U,e[21]=R,e[22]=J,e[23]=B,e[24]=T,e[25]=$}else g=e[12],x=e[13],k=e[14],L=e[15],v=e[16],O=e[17],V=e[18],P=e[19],U=e[20],R=e[21],J=e[22],B=e[23],T=e[24],$=e[25];let W;e[33]!==P||e[34]!==U?(W=s.jsx("span",{className:P,children:U}),e[33]=P,e[34]=U,e[35]=W):W=e[35];let Q;e[36]===Symbol.for("react.memo_cache_sentinel")?(Q=s.jsx(Re,{size:14,className:Ie}),e[36]=Q):Q=e[36];let G;e[37]!==W||e[38]!==R||e[39]!==J||e[40]!==B||e[41]!==T?(G=s.jsxs("button",{type:R,className:J,"data-state":B,children:[T,W,Q]}),e[37]=W,e[38]=R,e[39]=J,e[40]=B,e[41]=T,e[42]=G):G=e[42];let Y;e[43]!==g||e[44]!==G||e[45]!==$?(Y=s.jsx(g,{asChild:$,children:G}),e[43]=g,e[44]=G,e[45]=$,e[46]=Y):Y=e[46];let X;e[47]===Symbol.for("react.memo_cache_sentinel")?(X=s.jsx("div",{className:pt,children:"Time range"}),e[47]=X):X=e[47];let y;e[48]!==L||e[49]!==f?(y=Ce.map(p=>s.jsx("button",{type:"button",className:kt,"data-selected":f===p.value,onClick:()=>L(p.value),children:p.label},p.value)),e[48]=L,e[49]=f,e[50]=y):y=e[50];let j;e[51]!==y?(j=s.jsx("div",{className:xt,children:y}),e[51]=y,e[52]=j):j=e[52];let E;e[53]===Symbol.for("react.memo_cache_sentinel")?(E=s.jsx("span",{className:jt,children:"Custom range"}),e[53]=E):E=e[53];let Z;e[54]===Symbol.for("react.memo_cache_sentinel")?(Z=p=>d(p.target.value),e[54]=Z):Z=e[54];let S;e[55]!==i?(S=s.jsx("input",{type:"date",className:we,value:i,onChange:Z}),e[55]=i,e[56]=S):S=e[56];let ee;e[57]===Symbol.for("react.memo_cache_sentinel")?(ee=s.jsx("span",{className:Nt,children:"to"}),e[57]=ee):ee=e[57];let A;e[58]===Symbol.for("react.memo_cache_sentinel")?(A=p=>b(p.target.value),e[58]=A):A=e[58];let N;e[59]!==r?(N=s.jsx("input",{type:"date",className:we,value:r,onChange:A}),e[59]=r,e[60]=N):N=e[60];let F;e[61]!==S||e[62]!==N?(F=s.jsxs("div",{className:St,children:[S,ee,N]}),e[61]=S,e[62]=N,e[63]=F):F=e[63];const ne=!i||!r;let M;e[64]!==k||e[65]!==ne?(M=s.jsx("button",{type:"button",className:It,onClick:k,disabled:ne,children:"Apply"}),e[64]=k,e[65]=ne,e[66]=M):M=e[66];let I;e[67]!==F||e[68]!==M?(I=s.jsxs("div",{className:yt,children:[E,F,M]}),e[67]=F,e[68]=M,e[69]=I):I=e[69];let w;e[70]!==j||e[71]!==I?(w=s.jsxs(Pe,{align:"end",sideOffset:4,className:vt,children:[X,j,I]}),e[70]=j,e[71]=I,e[72]=w):w=e[72];let z;e[73]!==x||e[74]!==v||e[75]!==O||e[76]!==Y||e[77]!==w?(z=s.jsxs(x,{open:v,onOpenChange:O,children:[Y,w]}),e[73]=x,e[74]=v,e[75]=O,e[76]=Y,e[77]=w,e[78]=z):z=e[78];let le;e[79]===Symbol.for("react.memo_cache_sentinel")?(le=s.jsx(Ot,{}),e[79]=le):le=e[79];let te;return e[80]!==V||e[81]!==z?(te=s.jsxs("div",{className:V,children:[z,le]}),e[80]=V,e[81]=z,e[82]=te):te=e[82],te}function Ot(){const e=fe.c(9);let a;e[0]===Symbol.for("react.memo_cache_sentinel")?(a={from:"/(app)/observability"},e[0]=a):a=e[0];const t=ue(a),l=ye(),[u,h]=de.useState(!1);let o;e[1]!==l||e[2]!==t.range?(o=()=>{h(!0);const b=t.range??"7d";if(b!=="custom"){const f=Be(b);l({to:".",search:g=>({...g,from:f.from,to:f.to}),replace:!0})}setTimeout(()=>h(!1),500)},e[1]=l,e[2]=t.range,e[3]=o):o=e[3];const i=o,d=u?Ct:void 0;let c;e[4]!==d?(c=s.jsx(mt,{size:14,className:d}),e[4]=d,e[5]=c):c=e[5];let r;return e[6]!==i||e[7]!==c?(r=s.jsx("button",{type:"button",className:wt,onClick:i,title:"Refresh data",children:c}),e[6]=i,e[7]=c,e[8]=r):r=e[8],r}var Pt="nieb1c1 nieb1c0 _1lg22bks0 _1lg22bkto _1lg22bkv0 _1lg22bkw0 _1lg22bk3 _1lg22bkuc",De="nieb1c2",Rt="nieb1c3",Bt="nieb1c5 nieb1c4 _1lg22bkux _1lg22bkw0 _1lg22bkuc",$t="nieb1c7 nieb1c6 _1lg22bkuf",Et="nieb1c9 nieb1c8 _1lg22bk6 _1lg22bkux _1lg22bkw0",At="nieb1cb nieb1ca _1lg22bkux _1lg22bkw0",Ft="nieb1cc",ve="nieb1cd",pe="nieb1cf nieb1ce _1lg22bkux _1lg22bkw0",xe="nieb1ch nieb1cg _1lg22bkv0 _1lg22bkw0 _1lg22bk3 _1lg22bkuc",Mt="nieb1ci",zt="nieb1ck nieb1cj _1lg22bkux _1lg22bkw0",Ht="nieb1cl";function qt(){const e=fe.c(94);let a;e[0]===Symbol.for("react.memo_cache_sentinel")?(a={from:"/(app)/observability"},e[0]=a):a=e[0];const t=ue(a),l=ye(),[u,h]=de.useState(!1),{data:o}=et(),{data:i}=tt(),{data:d}=st(t.configId||""),{data:c}=at();let r;e:{if(!c){let m;e[1]===Symbol.for("react.memo_cache_sentinel")?(m={},e[1]=m):m=e[1],r=m;break e}let n;e[2]!==c?(n=c.reduce(Kt,{}),e[2]=c,e[3]=n):n=e[3],r=n}const b=r;let f;e:{if(!t.tags){let n;e[4]===Symbol.for("react.memo_cache_sentinel")?(n={},e[4]=n):n=e[4],f=n;break e}try{let n;e[5]!==t.tags?(n=JSON.parse(t.tags),e[5]=t.tags,e[6]=n):n=e[6],f=n}catch{let n;e[7]===Symbol.for("react.memo_cache_sentinel")?(n={},e[7]=n):n=e[7],f=n}}const g=f;let x;e[8]!==g?(x=Object.values(g).reduce(Yt,0),e[8]=g,e[9]=x):x=e[9];const k=x;let L;e[10]!==t.configId||e[11]!==t.environmentId||e[12]!==t.variantId?(L=[t.environmentId,t.configId,t.variantId].filter(Boolean),e[10]=t.configId,e[11]=t.environmentId,e[12]=t.variantId,e[13]=L):L=e[13];const v=L.length+k;let O;e[14]!==l?(O=n=>{const m=n.target.value||void 0;l({to:".",search:_=>({..._,environmentId:m}),replace:!0})},e[14]=l,e[15]=O):O=e[15];const V=O;let P;e[16]!==l?(P=n=>{const m=n.target.value||void 0;l({to:".",search:_=>({..._,configId:m,variantId:void 0}),replace:!0})},e[16]=l,e[17]=P):P=e[17];const U=P;let R;e[18]!==l?(R=n=>{const m=n.target.value||void 0;l({to:".",search:_=>({..._,variantId:m}),replace:!0})},e[18]=l,e[19]=R):R=e[19];const J=R;let B;e[20]!==l||e[21]!==g?(B=(n,m)=>{const _={...g};m.length===0?delete _[n]:_[n]=m;const he=Object.keys(_).length>0?JSON.stringify(_):void 0;l({to:".",search:$e=>({...$e,tags:he}),replace:!0})},e[20]=l,e[21]=g,e[22]=B):B=e[22];const T=B;let $;e[23]!==l?($=()=>{l({to:".",search:Gt,replace:!0})},e[23]=l,e[24]=$):$=e[24];const W=$;let Q;e[25]!==v||e[26]!==d||e[27]!==i||e[28]!==o||e[29]!==t.configId||e[30]!==t.environmentId||e[31]!==t.variantId?(Q=()=>{if(v===0)return"Filters";const n=[];if(t.environmentId){const m=o?.find(_=>_.id===t.environmentId);m&&n.push(m.name)}if(t.configId){const m=i?.find(_=>_.id===t.configId);m&&n.push(m.name)}if(t.variantId&&d){const m=d.find(_=>_.variantId===t.variantId);m&&n.push(m.name)}return n.length===1?n[0]:n.length>1?`${n.length} filters`:"Filters"},e[25]=v,e[26]=d,e[27]=i,e[28]=o,e[29]=t.configId,e[30]=t.environmentId,e[31]=t.variantId,e[32]=Q):Q=e[32];const G=Q,Y=u?"open":"closed";let X;e[33]===Symbol.for("react.memo_cache_sentinel")?(X=s.jsx(ot,{size:14,className:De}),e[33]=X):X=e[33];let y;e[34]!==G?(y=G(),e[34]=G,e[35]=y):y=e[35];let j;e[36]!==y?(j=s.jsx("span",{className:Rt,children:y}),e[36]=y,e[37]=j):j=e[37];let E;e[38]!==v?(E=v>0&&s.jsx("span",{className:Bt,children:v}),e[38]=v,e[39]=E):E=e[39];let Z;e[40]===Symbol.for("react.memo_cache_sentinel")?(Z=s.jsx(Re,{size:14,className:De}),e[40]=Z):Z=e[40];let S;e[41]!==Y||e[42]!==j||e[43]!==E?(S=s.jsx(Oe,{asChild:!0,children:s.jsxs("button",{type:"button",className:Pt,"data-state":Y,children:[X,j,E,Z]})}),e[41]=Y,e[42]=j,e[43]=E,e[44]=S):S=e[44];let ee;e[45]===Symbol.for("react.memo_cache_sentinel")?(ee=s.jsx("span",{children:"Filters"}),e[45]=ee):ee=e[45];let A;e[46]!==v||e[47]!==W?(A=v>0&&s.jsx("button",{type:"button",className:At,onClick:W,children:"Clear all"}),e[46]=v,e[47]=W,e[48]=A):A=e[48];let N;e[49]!==A?(N=s.jsxs("div",{className:Et,children:[ee,A]}),e[49]=A,e[50]=N):N=e[50];let F;e[51]===Symbol.for("react.memo_cache_sentinel")?(F=s.jsx("label",{className:pe,children:"Environment"}),e[51]=F):F=e[51];const ne=t.environmentId||"";let M;e[52]===Symbol.for("react.memo_cache_sentinel")?(M=s.jsx("option",{value:"",children:"All environments"}),e[52]=M):M=e[52];let I;e[53]!==o?(I=o?.map(Wt),e[53]=o,e[54]=I):I=e[54];let w;e[55]!==V||e[56]!==ne||e[57]!==I?(w=s.jsxs("div",{className:ve,children:[F,s.jsxs("select",{className:xe,value:ne,onChange:V,children:[M,I]})]}),e[55]=V,e[56]=ne,e[57]=I,e[58]=w):w=e[58];let z;e[59]===Symbol.for("react.memo_cache_sentinel")?(z=s.jsx("label",{className:pe,children:"Config"}),e[59]=z):z=e[59];const le=t.configId||"";let te;e[60]===Symbol.for("react.memo_cache_sentinel")?(te=s.jsx("option",{value:"",children:"All configs"}),e[60]=te):te=e[60];let p;e[61]!==i?(p=i?.map(Jt),e[61]=i,e[62]=p):p=e[62];let H;e[63]!==U||e[64]!==le||e[65]!==p?(H=s.jsxs("div",{className:ve,children:[z,s.jsxs("select",{className:xe,value:le,onChange:U,children:[te,p]})]}),e[63]=U,e[64]=le,e[65]=p,e[66]=H):H=e[66];let se;e[67]===Symbol.for("react.memo_cache_sentinel")?(se=s.jsx("label",{className:pe,children:"Variant"}),e[67]=se):se=e[67];const ce=t.variantId||"",C=!t.configId,ae=t.configId?"All variants":"Select a config first";let D;e[68]!==ae?(D=s.jsx("option",{value:"",children:ae}),e[68]=ae,e[69]=D):D=e[69];let K;e[70]!==d?(K=d?.map(Ut),e[70]=d,e[71]=K):K=e[71];let q;e[72]!==J||e[73]!==ce||e[74]!==C||e[75]!==D||e[76]!==K?(q=s.jsxs("div",{className:ve,children:[se,s.jsxs("select",{className:xe,value:ce,onChange:J,disabled:C,children:[D,K]})]}),e[72]=J,e[73]=ce,e[74]=C,e[75]=D,e[76]=K,e[77]=q):q=e[77];let ie;e[78]!==T||e[79]!==g||e[80]!==b?(ie=Object.keys(b).length>0&&s.jsxs("div",{className:Mt,children:[s.jsx("div",{className:zt,children:"Tags"}),Object.entries(b).map(n=>{const[m,_]=n;return s.jsx("div",{className:Ht,children:s.jsx(Ze,{items:_,label:m,placeholder:`Select ${m}...`,value:g[m]||[],onValueChange:he=>T(m,he),itemToString:Vt,multiple:!0})},m)})]}),e[78]=T,e[79]=g,e[80]=b,e[81]=ie):ie=e[81];let re;e[82]!==w||e[83]!==H||e[84]!==q||e[85]!==ie?(re=s.jsxs("div",{className:Ft,children:[w,H,q,ie]}),e[82]=w,e[83]=H,e[84]=q,e[85]=ie,e[86]=re):re=e[86];let oe;e[87]!==N||e[88]!==re?(oe=s.jsxs(Pe,{align:"end",sideOffset:4,className:$t,children:[N,re]}),e[87]=N,e[88]=re,e[89]=oe):oe=e[89];let be;return e[90]!==u||e[91]!==S||e[92]!==oe?(be=s.jsxs(Le,{open:u,onOpenChange:h,children:[S,oe]}),e[90]=u,e[91]=S,e[92]=oe,e[93]=be):be=e[93],be}function Vt(e){return e||""}function Ut(e){return s.jsx("option",{value:e.variantId,children:e.name},e.variantId)}function Jt(e){return s.jsx("option",{value:e.id,children:e.name},e.id)}function Wt(e){return s.jsxs("option",{value:e.id,children:[e.name,e.isProd?" (prod)":""]},e.id)}function Gt(e){return{...e,environmentId:void 0,configId:void 0,variantId:void 0,tags:void 0}}function Yt(e,a){return e+a.length}function Kt(e,a){const{key:t,value:l}=a;return e[t]||(e[t]=[]),e[t].push(l),e}function xs(){const e=fe.c(19),{toggleSidebar:a}=Me(),t=ze();let l;e[0]!==t?(l=t.filter(Xt).map(Qt),e[0]=t,e[1]=l):l=e[1];const u=l;let h;e[2]===Symbol.for("react.memo_cache_sentinel")?(h=s.jsx(me,{icon:Je}),e[2]=h):h=e[2];let o;e[3]!==a?(o=s.jsx(Xe,{onClick:a,size:"icon",variant:"ghost",scheme:"gray",children:h}),e[3]=a,e[4]=o):o=e[4];let i;e[5]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsx(me,{icon:lt,className:We}),e[5]=i):i=e[5];let d;e[6]!==u?(d=s.jsx(Ge,{items:u}),e[6]=u,e[7]=d):d=e[7];let c;e[8]!==o||e[9]!==d?(c=s.jsxs("div",{className:je,children:[o,i,d]}),e[8]=o,e[9]=d,e[10]=c):c=e[10];let r;e[11]===Symbol.for("react.memo_cache_sentinel")?(r=s.jsxs("div",{className:je,children:[s.jsx(qt,{}),s.jsx(Lt,{})]}),e[11]=r):r=e[11];let b;e[12]!==c?(b=s.jsxs(Ye,{className:Ke,children:[c,r]}),e[12]=c,e[13]=b):b=e[13];let f,g;e[14]===Symbol.for("react.memo_cache_sentinel")?(f=He(Ve,dt),g=s.jsx(gt,{}),e[14]=f,e[15]=g):(f=e[14],g=e[15]);let x;e[16]===Symbol.for("react.memo_cache_sentinel")?(x=s.jsx("div",{className:Qe,children:s.jsxs("div",{className:f,children:[g,s.jsx("div",{className:bt,children:s.jsx(qe,{})})]})}),e[16]=x):x=e[16];let k;return e[17]!==b?(k=s.jsxs(s.Fragment,{children:[b,x]}),e[17]=b,e[18]=k):k=e[18],k}function Qt(e){const a=e.loaderData?.title,t=e.staticData.customData?.title,l=a??t;return{key:e.id,label:s.jsx(ge,{to:e.pathname,className:Ue,children:l}),prefix:e.staticData.customData?.icon}}function Xt(e){return!!e.staticData.customData?.title||!!e.loaderData?.title}export{xs as component};
@@ -1 +0,0 @@
1
- import{a as u,j as s,L as f,I as p,U as j,B as S,u as v,b as N,e as y,O as B}from"./index-FrTQ7TcS.js";import{w as D,b as C,C as w,c as I,B as L,H as R,a as E,h as T,g as U}from"./area.css-CSjofvHM.js";import{B as G}from"./button-CMZqhyXB.js";import{C as H}from"./chevron-right-fMWRsRLZ.js";/* empty css */import"./useButton-CsZ8hBM8.js";var O="iks4pd0",W="iks4pd2 iks4pd1 _1lg22bks0 _1lg22bksi _1lg22bktr _1lg22bk6 _1lg22bkpr",_="iks4pd4 iks4pd3 _1lg22bks0 _1lg22bksi _1lg22bkto",h="iks4pd6 iks4pd5 _1lg22bkux _1lg22bkw0 _1lg22bkj3 _1lg22bk3",x="iks4pd8 iks4pd7 _1lg22bks0 _1lg22bk3 _1lg22bkv0 _1lg22bkj9 _1lg22bkw0",$="iks4pda iks4pd9 _1lg22bk9";function z(){const e=u.c(4);let a;e[0]===Symbol.for("react.memo_cache_sentinel")?(a=s.jsx("span",{className:h,children:"User"}),e[0]=a):a=e[0];let i;e[1]===Symbol.for("react.memo_cache_sentinel")?(i=s.jsxs("div",{className:_,children:[a,s.jsxs(f,{to:"/settings/user-profile",className:x,children:[s.jsx(p,{icon:j}),"Profile"]})]}),e[1]=i):i=e[1];let t;e[2]===Symbol.for("react.memo_cache_sentinel")?(t=s.jsx("span",{className:h,children:"Workspace"}),e[2]=t):t=e[2];let l;return e[3]===Symbol.for("react.memo_cache_sentinel")?(l=s.jsxs("nav",{className:W,children:[i,s.jsxs("div",{className:_,children:[t,s.jsxs(f,{to:"/settings/workspace-general",className:x,children:[s.jsx(p,{icon:S}),"General"]})]})]}),e[3]=l):l=e[3],l}function V(){const e=u.c(16),{toggleSidebar:a}=v(),i=N();let t;e[0]!==i?(t=i.filter(F).map(A),e[0]=i,e[1]=t):t=e[1];const l=t;let c;e[2]===Symbol.for("react.memo_cache_sentinel")?(c=s.jsx(p,{icon:w}),e[2]=c):c=e[2];let r;e[3]!==a?(r=s.jsx(G,{onClick:a,size:"icon",variant:"ghost",scheme:"gray",children:c}),e[3]=a,e[4]=r):r=e[4];let m;e[5]===Symbol.for("react.memo_cache_sentinel")?(m=s.jsx(p,{icon:H,className:I}),e[5]=m):m=e[5];let n;e[6]!==l?(n=s.jsx(L,{items:l}),e[6]=l,e[7]=n):n=e[7];let o;e[8]!==r||e[9]!==n?(o=s.jsx(R,{className:E,children:s.jsxs("div",{className:T,children:[r,m,n]})}),e[8]=r,e[9]=n,e[10]=o):o=e[10];let d,b;e[11]===Symbol.for("react.memo_cache_sentinel")?(d=y(D,O),b=s.jsx(z,{}),e[11]=d,e[12]=b):(d=e[11],b=e[12]);let g;e[13]===Symbol.for("react.memo_cache_sentinel")?(g=s.jsx("div",{className:U,children:s.jsxs("div",{className:d,children:[b,s.jsx("div",{className:$,children:s.jsx(B,{})})]})}),e[13]=g):g=e[13];let k;return e[14]!==o?(k=s.jsxs(s.Fragment,{children:[o,g]}),e[14]=o,e[15]=k):k=e[15],k}function A(e){const a=e.loaderData?.title,i=e.staticData.customData?.title,t=a??i;return{key:e.id,label:s.jsx(f,{to:e.pathname,className:C,children:t}),prefix:e.staticData.customData?.icon}}function F(e){return!!e.staticData.customData?.title||!!e.loaderData?.title}export{V as component};