@flamingo-stack/openframe-frontend-core 0.0.699 → 0.0.700

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 (75) hide show
  1. package/dist/{chunk-HVY6MU33.cjs → chunk-2CSYUMNM.cjs} +2 -2
  2. package/dist/{chunk-Q2QS562J.cjs → chunk-4H5Q6MQG.cjs} +44 -44
  3. package/dist/{chunk-ERC2PVUG.cjs → chunk-65YVUYWJ.cjs} +32 -32
  4. package/dist/{chunk-SUXB6YSP.js → chunk-6JG75WVO.js} +4 -4
  5. package/dist/{chunk-Z6R7GE5L.js → chunk-6JPQDYYY.js} +261 -232
  6. package/dist/{chunk-SCUPTMLG.cjs → chunk-7ZDTAABP.cjs} +7 -7
  7. package/dist/{chunk-UDJPRMLP.js → chunk-A5ZGKBN2.js} +1 -1
  8. package/dist/{chunk-U473T27Y.js → chunk-B7M6QEEM.js} +1 -1
  9. package/dist/{chunk-GRTLCRZA.cjs → chunk-BPS7JQCI.cjs} +2 -2
  10. package/dist/{chunk-YJNJINXN.cjs → chunk-BQ34PIFC.cjs} +3 -3
  11. package/dist/{chunk-GZLE67PF.cjs → chunk-BRQY2HKD.cjs} +24 -24
  12. package/dist/{chunk-4CZC5NFR.js → chunk-BZYMGI4L.js} +1 -1
  13. package/dist/{chunk-SNFL3B73.js → chunk-CUPJCGLB.js} +2 -2
  14. package/dist/{chunk-5RYXQ4TX.cjs → chunk-DG2I57UM.cjs} +21 -21
  15. package/dist/{chunk-WYLVP5OC.js → chunk-DJLZXJYB.js} +1 -1
  16. package/dist/{chunk-WTR2GHID.js → chunk-EONNPRAW.js} +2 -2
  17. package/dist/{chunk-36S7W4AD.js → chunk-GD4JALTR.js} +2 -2
  18. package/dist/{chunk-UM44DDPC.cjs → chunk-GFXZMFDX.cjs} +9 -9
  19. package/dist/{chunk-6THYLHRF.js → chunk-JPVDJB27.js} +4 -4
  20. package/dist/{chunk-6ARCZ2VH.js → chunk-MFORWVGD.js} +5 -5
  21. package/dist/{chunk-Z4W4XDDZ.js → chunk-N7DPIH57.js} +1 -1
  22. package/dist/{chunk-SWXXLZLZ.js → chunk-N7HMUQRV.js} +1 -1
  23. package/dist/{chunk-JN7IKMMJ.cjs → chunk-NIT257DV.cjs} +4 -4
  24. package/dist/{chunk-KXRUQCHZ.js → chunk-PNWIVND4.js} +3 -3
  25. package/dist/{chunk-EKPOIGYI.cjs → chunk-QDIX2ZRL.cjs} +313 -313
  26. package/dist/{chunk-ANOZ7Z4A.cjs → chunk-QPNR4N7N.cjs} +20 -20
  27. package/dist/{chunk-QTLRRPDO.cjs → chunk-QZGFJBG5.cjs} +70 -70
  28. package/dist/{chunk-2MVAILI4.cjs → chunk-RTGPIHVO.cjs} +334 -305
  29. package/dist/{chunk-LGEGOCU7.js → chunk-S4ADN25W.js} +2 -2
  30. package/dist/{chunk-IAMMZHYE.js → chunk-V5QNDOEL.js} +4 -4
  31. package/dist/{chunk-K7SNFTIX.cjs → chunk-YBC346FY.cjs} +12 -12
  32. package/dist/{chunk-RD3WWENS.cjs → chunk-ZSPHOHOW.cjs} +9 -9
  33. package/dist/components/case-studies/index.cjs +14 -14
  34. package/dist/components/case-studies/index.js +3 -3
  35. package/dist/components/chat/entity-cards/dispatch.d.ts +50 -1
  36. package/dist/components/chat/entity-cards/dispatch.d.ts.map +1 -1
  37. package/dist/components/chat/index.cjs +6 -2
  38. package/dist/components/chat/index.js +5 -1
  39. package/dist/components/chat/utils/card-destination.d.ts +48 -0
  40. package/dist/components/chat/utils/card-destination.d.ts.map +1 -0
  41. package/dist/components/chat/utils/index.d.ts +2 -1
  42. package/dist/components/chat/utils/index.d.ts.map +1 -1
  43. package/dist/components/chat/utils/resolve-fetched-card-href.d.ts +10 -0
  44. package/dist/components/chat/utils/resolve-fetched-card-href.d.ts.map +1 -1
  45. package/dist/components/contact/index.cjs +4 -4
  46. package/dist/components/contact/index.js +3 -3
  47. package/dist/components/docs/index.cjs +7 -7
  48. package/dist/components/docs/index.js +6 -6
  49. package/dist/components/embeds/index.cjs +4 -4
  50. package/dist/components/embeds/index.js +3 -3
  51. package/dist/components/faq/index.cjs +4 -4
  52. package/dist/components/faq/index.js +3 -3
  53. package/dist/components/features/index.cjs +3 -3
  54. package/dist/components/features/index.js +2 -2
  55. package/dist/components/help-center-pages/index.cjs +71 -71
  56. package/dist/components/help-center-pages/index.js +14 -14
  57. package/dist/components/index.cjs +45 -41
  58. package/dist/components/index.js +17 -13
  59. package/dist/components/meeting-scheduler/index.cjs +25 -25
  60. package/dist/components/meeting-scheduler/index.js +2 -2
  61. package/dist/components/navigation/index.cjs +6 -6
  62. package/dist/components/navigation/index.js +5 -5
  63. package/dist/components/onboarding-guides/index.cjs +6 -6
  64. package/dist/components/onboarding-guides/index.js +5 -5
  65. package/dist/components/tickets/index.cjs +7 -7
  66. package/dist/components/tickets/index.js +6 -6
  67. package/dist/components/ui/index.cjs +7 -3
  68. package/dist/components/ui/index.js +6 -2
  69. package/dist/index.cjs +11 -7
  70. package/dist/index.js +10 -6
  71. package/package.json +1 -1
  72. package/src/components/chat/entity-cards/dispatch.tsx +29 -73
  73. package/src/components/chat/utils/card-destination.ts +103 -0
  74. package/src/components/chat/utils/index.ts +13 -1
  75. package/src/components/chat/utils/resolve-fetched-card-href.ts +17 -0
@@ -15159,9 +15159,6 @@ function GenericEntityCardSkeleton({ className }) {
15159
15159
  ] });
15160
15160
  }
15161
15161
 
15162
- // src/components/chat/entity-cards/dispatch.tsx
15163
- import React9 from "react";
15164
-
15165
15162
  // src/utils/faq-anchor.ts
15166
15163
  function faqSectionSlug(section) {
15167
15164
  return "faq-" + section.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
@@ -15333,13 +15330,6 @@ function MingoInfoCard({
15333
15330
  );
15334
15331
  }
15335
15332
 
15336
- // src/components/chat/utils/external-app-urls.ts
15337
- var CLICKUP_APP_BASE = "https://app.clickup.com";
15338
- function clickupTaskUrl(externalId) {
15339
- if (!externalId) return null;
15340
- return `${CLICKUP_APP_BASE}/t/${externalId}`;
15341
- }
15342
-
15343
15333
  // src/components/chat/utils/resolve-fetched-card-href.ts
15344
15334
  function readSlug(item) {
15345
15335
  if (!item || typeof item !== "object") return null;
@@ -15354,6 +15344,13 @@ function readFetchedCardTitle(item) {
15354
15344
  }
15355
15345
  return null;
15356
15346
  }
15347
+ function readFetchedCardPath(item) {
15348
+ if (!item || typeof item !== "object") return null;
15349
+ const metadata = item.metadata;
15350
+ if (!metadata || typeof metadata !== "object") return null;
15351
+ const path = metadata.path;
15352
+ return typeof path === "string" && path.trim() ? path.trim() : null;
15353
+ }
15357
15354
  function readPlatforms(item, canonicalType) {
15358
15355
  if (!item || typeof item !== "object") return void 0;
15359
15356
  const obj = item;
@@ -15398,6 +15395,180 @@ function resolveFetchedCardHref({
15398
15395
  });
15399
15396
  }
15400
15397
 
15398
+ // src/components/chat/utils/source-row-cta.ts
15399
+ import { FileText as FileText3 } from "lucide-react";
15400
+
15401
+ // src/platform-domains.ts
15402
+ var PLATFORM_DOMAINS = [
15403
+ { key: "marketing-hub", defaultUrl: "https://marketing-hub.flamingo.so", envVar: "NEXT_PUBLIC_MARKETING_HUB_URL" },
15404
+ { key: "company-hub", defaultUrl: "https://company-hub.flamingo.so", envVar: "NEXT_PUBLIC_COMPANY_HUB_URL" },
15405
+ { key: "product-hub", defaultUrl: "https://product-hub.flamingo.so", envVar: "NEXT_PUBLIC_PRODUCT_HUB_URL" },
15406
+ { key: "revenue-hub", defaultUrl: "https://revenue-hub.flamingo.so", envVar: "NEXT_PUBLIC_REVENUE_HUB_URL" },
15407
+ { key: "people-hub", defaultUrl: "https://people-hub.flamingo.so", envVar: "NEXT_PUBLIC_PEOPLE_HUB_URL" },
15408
+ { key: "openmsp", defaultUrl: "https://www.openmsp.ai", envVar: "NEXT_PUBLIC_OPENMSP_URL" },
15409
+ // ORDERING INVARIANT (first-wins, load-bearing): `flamingo` MUST precede `flamingo-teaser` + `universal`.
15410
+ // All three resolve to www.flamingo.run; the reverse index is first-wins → flamingo claims the shared host,
15411
+ // teaser keeps only its unique flamingo.cx aliases, universal contributes no unique host.
15412
+ // ⚠️ DO NOT REORDER — enforced by the module-load self-check at the bottom of this file.
15413
+ { key: "flamingo", defaultUrl: "https://www.flamingo.run", envVar: "NEXT_PUBLIC_FLAMINGO_URL" },
15414
+ { key: "tmcg", defaultUrl: "https://www.tmcg.miami", envVar: "NEXT_PUBLIC_TMCG_URL" },
15415
+ { key: "mlg", defaultUrl: "https://www.mlg.soccer", envVar: "NEXT_PUBLIC_MLG_URL" },
15416
+ {
15417
+ key: "flamingo-teaser",
15418
+ defaultUrl: "https://www.flamingo.run",
15419
+ envVar: "NEXT_PUBLIC_FLAMINGO_URL",
15420
+ aliasHostnames: ["flamingo.cx", "www.flamingo.cx"]
15421
+ },
15422
+ {
15423
+ key: "openframe",
15424
+ defaultUrl: "https://openframe.ai",
15425
+ envVar: "NEXT_PUBLIC_OPENFRAME_URL",
15426
+ aliasHostnames: ["openframe.ai", "www.openframe.ai", "hub.openframe.ai"]
15427
+ },
15428
+ {
15429
+ key: "openframe-dashboard",
15430
+ defaultUrl: "https://openframe.ai",
15431
+ envVar: "NEXT_PUBLIC_OPENFRAME_DASHBOARD_URL",
15432
+ pseudo: true
15433
+ },
15434
+ { key: "universal", defaultUrl: "https://www.flamingo.run", envVar: "NEXT_PUBLIC_FLAMINGO_URL" }
15435
+ ];
15436
+ var ENV_OVERRIDES = {
15437
+ NEXT_PUBLIC_MARKETING_HUB_URL: process.env.NEXT_PUBLIC_MARKETING_HUB_URL,
15438
+ NEXT_PUBLIC_COMPANY_HUB_URL: process.env.NEXT_PUBLIC_COMPANY_HUB_URL,
15439
+ NEXT_PUBLIC_PRODUCT_HUB_URL: process.env.NEXT_PUBLIC_PRODUCT_HUB_URL,
15440
+ NEXT_PUBLIC_REVENUE_HUB_URL: process.env.NEXT_PUBLIC_REVENUE_HUB_URL,
15441
+ NEXT_PUBLIC_PEOPLE_HUB_URL: process.env.NEXT_PUBLIC_PEOPLE_HUB_URL,
15442
+ NEXT_PUBLIC_OPENMSP_URL: process.env.NEXT_PUBLIC_OPENMSP_URL,
15443
+ NEXT_PUBLIC_FLAMINGO_URL: process.env.NEXT_PUBLIC_FLAMINGO_URL,
15444
+ NEXT_PUBLIC_TMCG_URL: process.env.NEXT_PUBLIC_TMCG_URL,
15445
+ NEXT_PUBLIC_MLG_URL: process.env.NEXT_PUBLIC_MLG_URL,
15446
+ NEXT_PUBLIC_OPENFRAME_URL: process.env.NEXT_PUBLIC_OPENFRAME_URL,
15447
+ NEXT_PUBLIC_OPENFRAME_DASHBOARD_URL: process.env.NEXT_PUBLIC_OPENFRAME_DASHBOARD_URL
15448
+ };
15449
+ function byKey(key) {
15450
+ return PLATFORM_DOMAINS.find((e) => e.key === key);
15451
+ }
15452
+ function envOverrideFor(key) {
15453
+ const envVar = byKey(key)?.envVar;
15454
+ if (!envVar) return null;
15455
+ return ENV_OVERRIDES[envVar] || null;
15456
+ }
15457
+ function ensureScheme(url) {
15458
+ const trimmed = url.trim();
15459
+ if (/^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed)) return trimmed;
15460
+ return `https://${trimmed.replace(/^\/+/, "")}`;
15461
+ }
15462
+ function getPlatformProductionUrl(platform) {
15463
+ const resolved = envOverrideFor(platform) ?? byKey(platform)?.defaultUrl ?? envOverrideFor("flamingo") ?? "https://www.flamingo.run";
15464
+ return ensureScheme(resolved);
15465
+ }
15466
+ function getPlatformUrl(platform, options = {}) {
15467
+ const url = options.environment !== "production" && process.env.NODE_ENV !== "production" ? process.env.NEXT_PUBLIC_DEV_URL || "http://localhost:3000" : getPlatformProductionUrl(platform);
15468
+ return url.replace(/\/+$/, "");
15469
+ }
15470
+ function getDeploymentUrl(options) {
15471
+ if (typeof window !== "undefined") return window.location.origin;
15472
+ const configured = options.configuredUrl?.trim();
15473
+ if (configured) return ensureScheme(configured).replace(/\/+$/, "");
15474
+ if (process.env.VERCEL_ENV === "preview" && process.env.VERCEL_URL) {
15475
+ return ensureScheme(process.env.VERCEL_URL).replace(/\/+$/, "");
15476
+ }
15477
+ if (process.env.VERCEL_ENV === "production" || process.env.NODE_ENV === "production") {
15478
+ return getPlatformUrl(options.platform, { environment: "production" });
15479
+ }
15480
+ return (process.env.NEXT_PUBLIC_DEV_URL || `http://localhost:${process.env.PORT ?? 3e3}`).replace(/\/+$/, "");
15481
+ }
15482
+ var LOCAL_HOSTNAME = /^(localhost|127(?:\.\d{1,3}){3}|0\.0\.0\.0|\[::1\])$/i;
15483
+ function isLocalUrl(url) {
15484
+ try {
15485
+ return LOCAL_HOSTNAME.test(new URL(url).hostname);
15486
+ } catch {
15487
+ return false;
15488
+ }
15489
+ }
15490
+ function getRequestOrigin(headers, options) {
15491
+ const host = headers.get("host");
15492
+ if (!host) return getDeploymentUrl(options);
15493
+ const local = LOCAL_HOSTNAME.test(host.replace(/:\d+$/, ""));
15494
+ const proto = headers.get("x-forwarded-proto")?.split(",")[0].trim() || (local ? "http" : "https");
15495
+ return `${proto}://${host}`;
15496
+ }
15497
+ function resolveRedirectTarget(origin, target) {
15498
+ const url = new URL(target, origin);
15499
+ if (!/^https?:\/\//i.test(target) && url.origin !== new URL(origin).origin) {
15500
+ throw new Error(`resolveRedirectTarget: "${target}" is not a same-origin path`);
15501
+ }
15502
+ return url;
15503
+ }
15504
+ function hostOf(value) {
15505
+ if (!value) return null;
15506
+ try {
15507
+ return new URL(value).hostname.toLowerCase();
15508
+ } catch {
15509
+ return null;
15510
+ }
15511
+ }
15512
+ function expandWwwApex(host) {
15513
+ if (host.startsWith("www.")) return [host, host.slice(4)];
15514
+ if (host.split(".").length === 2) return [host, `www.${host}`];
15515
+ return [host];
15516
+ }
15517
+ function toRegistrableBaseDomain(host) {
15518
+ const parts = host.split(".");
15519
+ if (parts.length >= 2) return parts.slice(-2).join(".");
15520
+ return void 0;
15521
+ }
15522
+ function aliasHostsOf(key) {
15523
+ return byKey(key)?.aliasHostnames ?? [];
15524
+ }
15525
+ function hostsForEntry(entry, opts) {
15526
+ const resolved = hostOf(getPlatformProductionUrl(entry.key));
15527
+ const hosts = resolved ? expandWwwApex(resolved) : [];
15528
+ if (opts.includeAliases) hosts.push(...aliasHostsOf(entry.key));
15529
+ return hosts;
15530
+ }
15531
+ function getPlatformByHostname(hostname) {
15532
+ const host = hostname.toLowerCase();
15533
+ for (const entry of PLATFORM_DOMAINS) {
15534
+ if (entry.pseudo) continue;
15535
+ if (hostsForEntry(entry, { includeAliases: true }).includes(host)) return entry.key;
15536
+ }
15537
+ return null;
15538
+ }
15539
+ function isPreviewHost(hostname) {
15540
+ return hostname.endsWith(".vercel.app");
15541
+ }
15542
+ function getAllPlatformBaseDomains() {
15543
+ if (typeof window === "undefined") return [];
15544
+ const hostname = window.location.hostname;
15545
+ if (hostname === "localhost" || hostname === "127.0.0.1" || hostname.startsWith("127.")) {
15546
+ return [];
15547
+ }
15548
+ const previewEnv = process.env.VERCEL_ENV === "preview" || process.env.NEXT_PUBLIC_VERCEL_ENV === "preview" || isPreviewHost(hostname);
15549
+ if (previewEnv) {
15550
+ return [".vercel.app", "vercel.app"];
15551
+ }
15552
+ const baseDomains = /* @__PURE__ */ new Set();
15553
+ for (const entry of PLATFORM_DOMAINS) {
15554
+ if (entry.pseudo) continue;
15555
+ const host = hostOf(getPlatformProductionUrl(entry.key));
15556
+ if (!host) continue;
15557
+ const base = toRegistrableBaseDomain(host);
15558
+ if (base) {
15559
+ baseDomains.add(`.${base}`);
15560
+ baseDomains.add(base);
15561
+ }
15562
+ }
15563
+ return Array.from(baseDomains);
15564
+ }
15565
+ var _orderIdx = (k) => PLATFORM_DOMAINS.findIndex((e) => e.key === k);
15566
+ if (_orderIdx("flamingo") > _orderIdx("flamingo-teaser") || _orderIdx("flamingo") > _orderIdx("universal") || getPlatformByHostname("flamingo.cx") !== "flamingo-teaser" || getPlatformByHostname("hub.openframe.ai") !== "openframe") {
15567
+ console.error(
15568
+ "[platform-domains] \u26A0\uFE0F PLATFORM_DOMAINS ordering invariant violated \u2014 `flamingo` must precede `flamingo-teaser`/`universal`, and the openframe/teaser aliases must be intact. Do not reorder the table."
15569
+ );
15570
+ }
15571
+
15401
15572
  // src/utils/source-icons.ts
15402
15573
  var SOURCE_ICON_NAMES = {
15403
15574
  // Doc tables
@@ -15596,180 +15767,6 @@ function defaultDocumentTypeForTableId(tableId) {
15596
15767
  return null;
15597
15768
  }
15598
15769
 
15599
- // src/components/chat/utils/source-row-cta.ts
15600
- import { FileText as FileText3 } from "lucide-react";
15601
-
15602
- // src/platform-domains.ts
15603
- var PLATFORM_DOMAINS = [
15604
- { key: "marketing-hub", defaultUrl: "https://marketing-hub.flamingo.so", envVar: "NEXT_PUBLIC_MARKETING_HUB_URL" },
15605
- { key: "company-hub", defaultUrl: "https://company-hub.flamingo.so", envVar: "NEXT_PUBLIC_COMPANY_HUB_URL" },
15606
- { key: "product-hub", defaultUrl: "https://product-hub.flamingo.so", envVar: "NEXT_PUBLIC_PRODUCT_HUB_URL" },
15607
- { key: "revenue-hub", defaultUrl: "https://revenue-hub.flamingo.so", envVar: "NEXT_PUBLIC_REVENUE_HUB_URL" },
15608
- { key: "people-hub", defaultUrl: "https://people-hub.flamingo.so", envVar: "NEXT_PUBLIC_PEOPLE_HUB_URL" },
15609
- { key: "openmsp", defaultUrl: "https://www.openmsp.ai", envVar: "NEXT_PUBLIC_OPENMSP_URL" },
15610
- // ORDERING INVARIANT (first-wins, load-bearing): `flamingo` MUST precede `flamingo-teaser` + `universal`.
15611
- // All three resolve to www.flamingo.run; the reverse index is first-wins → flamingo claims the shared host,
15612
- // teaser keeps only its unique flamingo.cx aliases, universal contributes no unique host.
15613
- // ⚠️ DO NOT REORDER — enforced by the module-load self-check at the bottom of this file.
15614
- { key: "flamingo", defaultUrl: "https://www.flamingo.run", envVar: "NEXT_PUBLIC_FLAMINGO_URL" },
15615
- { key: "tmcg", defaultUrl: "https://www.tmcg.miami", envVar: "NEXT_PUBLIC_TMCG_URL" },
15616
- { key: "mlg", defaultUrl: "https://www.mlg.soccer", envVar: "NEXT_PUBLIC_MLG_URL" },
15617
- {
15618
- key: "flamingo-teaser",
15619
- defaultUrl: "https://www.flamingo.run",
15620
- envVar: "NEXT_PUBLIC_FLAMINGO_URL",
15621
- aliasHostnames: ["flamingo.cx", "www.flamingo.cx"]
15622
- },
15623
- {
15624
- key: "openframe",
15625
- defaultUrl: "https://openframe.ai",
15626
- envVar: "NEXT_PUBLIC_OPENFRAME_URL",
15627
- aliasHostnames: ["openframe.ai", "www.openframe.ai", "hub.openframe.ai"]
15628
- },
15629
- {
15630
- key: "openframe-dashboard",
15631
- defaultUrl: "https://openframe.ai",
15632
- envVar: "NEXT_PUBLIC_OPENFRAME_DASHBOARD_URL",
15633
- pseudo: true
15634
- },
15635
- { key: "universal", defaultUrl: "https://www.flamingo.run", envVar: "NEXT_PUBLIC_FLAMINGO_URL" }
15636
- ];
15637
- var ENV_OVERRIDES = {
15638
- NEXT_PUBLIC_MARKETING_HUB_URL: process.env.NEXT_PUBLIC_MARKETING_HUB_URL,
15639
- NEXT_PUBLIC_COMPANY_HUB_URL: process.env.NEXT_PUBLIC_COMPANY_HUB_URL,
15640
- NEXT_PUBLIC_PRODUCT_HUB_URL: process.env.NEXT_PUBLIC_PRODUCT_HUB_URL,
15641
- NEXT_PUBLIC_REVENUE_HUB_URL: process.env.NEXT_PUBLIC_REVENUE_HUB_URL,
15642
- NEXT_PUBLIC_PEOPLE_HUB_URL: process.env.NEXT_PUBLIC_PEOPLE_HUB_URL,
15643
- NEXT_PUBLIC_OPENMSP_URL: process.env.NEXT_PUBLIC_OPENMSP_URL,
15644
- NEXT_PUBLIC_FLAMINGO_URL: process.env.NEXT_PUBLIC_FLAMINGO_URL,
15645
- NEXT_PUBLIC_TMCG_URL: process.env.NEXT_PUBLIC_TMCG_URL,
15646
- NEXT_PUBLIC_MLG_URL: process.env.NEXT_PUBLIC_MLG_URL,
15647
- NEXT_PUBLIC_OPENFRAME_URL: process.env.NEXT_PUBLIC_OPENFRAME_URL,
15648
- NEXT_PUBLIC_OPENFRAME_DASHBOARD_URL: process.env.NEXT_PUBLIC_OPENFRAME_DASHBOARD_URL
15649
- };
15650
- function byKey(key) {
15651
- return PLATFORM_DOMAINS.find((e) => e.key === key);
15652
- }
15653
- function envOverrideFor(key) {
15654
- const envVar = byKey(key)?.envVar;
15655
- if (!envVar) return null;
15656
- return ENV_OVERRIDES[envVar] || null;
15657
- }
15658
- function ensureScheme(url) {
15659
- const trimmed = url.trim();
15660
- if (/^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed)) return trimmed;
15661
- return `https://${trimmed.replace(/^\/+/, "")}`;
15662
- }
15663
- function getPlatformProductionUrl(platform) {
15664
- const resolved = envOverrideFor(platform) ?? byKey(platform)?.defaultUrl ?? envOverrideFor("flamingo") ?? "https://www.flamingo.run";
15665
- return ensureScheme(resolved);
15666
- }
15667
- function getPlatformUrl(platform, options = {}) {
15668
- const url = options.environment !== "production" && process.env.NODE_ENV !== "production" ? process.env.NEXT_PUBLIC_DEV_URL || "http://localhost:3000" : getPlatformProductionUrl(platform);
15669
- return url.replace(/\/+$/, "");
15670
- }
15671
- function getDeploymentUrl(options) {
15672
- if (typeof window !== "undefined") return window.location.origin;
15673
- const configured = options.configuredUrl?.trim();
15674
- if (configured) return ensureScheme(configured).replace(/\/+$/, "");
15675
- if (process.env.VERCEL_ENV === "preview" && process.env.VERCEL_URL) {
15676
- return ensureScheme(process.env.VERCEL_URL).replace(/\/+$/, "");
15677
- }
15678
- if (process.env.VERCEL_ENV === "production" || process.env.NODE_ENV === "production") {
15679
- return getPlatformUrl(options.platform, { environment: "production" });
15680
- }
15681
- return (process.env.NEXT_PUBLIC_DEV_URL || `http://localhost:${process.env.PORT ?? 3e3}`).replace(/\/+$/, "");
15682
- }
15683
- var LOCAL_HOSTNAME = /^(localhost|127(?:\.\d{1,3}){3}|0\.0\.0\.0|\[::1\])$/i;
15684
- function isLocalUrl(url) {
15685
- try {
15686
- return LOCAL_HOSTNAME.test(new URL(url).hostname);
15687
- } catch {
15688
- return false;
15689
- }
15690
- }
15691
- function getRequestOrigin(headers, options) {
15692
- const host = headers.get("host");
15693
- if (!host) return getDeploymentUrl(options);
15694
- const local = LOCAL_HOSTNAME.test(host.replace(/:\d+$/, ""));
15695
- const proto = headers.get("x-forwarded-proto")?.split(",")[0].trim() || (local ? "http" : "https");
15696
- return `${proto}://${host}`;
15697
- }
15698
- function resolveRedirectTarget(origin, target) {
15699
- const url = new URL(target, origin);
15700
- if (!/^https?:\/\//i.test(target) && url.origin !== new URL(origin).origin) {
15701
- throw new Error(`resolveRedirectTarget: "${target}" is not a same-origin path`);
15702
- }
15703
- return url;
15704
- }
15705
- function hostOf(value) {
15706
- if (!value) return null;
15707
- try {
15708
- return new URL(value).hostname.toLowerCase();
15709
- } catch {
15710
- return null;
15711
- }
15712
- }
15713
- function expandWwwApex(host) {
15714
- if (host.startsWith("www.")) return [host, host.slice(4)];
15715
- if (host.split(".").length === 2) return [host, `www.${host}`];
15716
- return [host];
15717
- }
15718
- function toRegistrableBaseDomain(host) {
15719
- const parts = host.split(".");
15720
- if (parts.length >= 2) return parts.slice(-2).join(".");
15721
- return void 0;
15722
- }
15723
- function aliasHostsOf(key) {
15724
- return byKey(key)?.aliasHostnames ?? [];
15725
- }
15726
- function hostsForEntry(entry, opts) {
15727
- const resolved = hostOf(getPlatformProductionUrl(entry.key));
15728
- const hosts = resolved ? expandWwwApex(resolved) : [];
15729
- if (opts.includeAliases) hosts.push(...aliasHostsOf(entry.key));
15730
- return hosts;
15731
- }
15732
- function getPlatformByHostname(hostname) {
15733
- const host = hostname.toLowerCase();
15734
- for (const entry of PLATFORM_DOMAINS) {
15735
- if (entry.pseudo) continue;
15736
- if (hostsForEntry(entry, { includeAliases: true }).includes(host)) return entry.key;
15737
- }
15738
- return null;
15739
- }
15740
- function isPreviewHost(hostname) {
15741
- return hostname.endsWith(".vercel.app");
15742
- }
15743
- function getAllPlatformBaseDomains() {
15744
- if (typeof window === "undefined") return [];
15745
- const hostname = window.location.hostname;
15746
- if (hostname === "localhost" || hostname === "127.0.0.1" || hostname.startsWith("127.")) {
15747
- return [];
15748
- }
15749
- const previewEnv = process.env.VERCEL_ENV === "preview" || process.env.NEXT_PUBLIC_VERCEL_ENV === "preview" || isPreviewHost(hostname);
15750
- if (previewEnv) {
15751
- return [".vercel.app", "vercel.app"];
15752
- }
15753
- const baseDomains = /* @__PURE__ */ new Set();
15754
- for (const entry of PLATFORM_DOMAINS) {
15755
- if (entry.pseudo) continue;
15756
- const host = hostOf(getPlatformProductionUrl(entry.key));
15757
- if (!host) continue;
15758
- const base = toRegistrableBaseDomain(host);
15759
- if (base) {
15760
- baseDomains.add(`.${base}`);
15761
- baseDomains.add(base);
15762
- }
15763
- }
15764
- return Array.from(baseDomains);
15765
- }
15766
- var _orderIdx = (k) => PLATFORM_DOMAINS.findIndex((e) => e.key === k);
15767
- if (_orderIdx("flamingo") > _orderIdx("flamingo-teaser") || _orderIdx("flamingo") > _orderIdx("universal") || getPlatformByHostname("flamingo.cx") !== "flamingo-teaser" || getPlatformByHostname("hub.openframe.ai") !== "openframe") {
15768
- console.error(
15769
- "[platform-domains] \u26A0\uFE0F PLATFORM_DOMAINS ordering invariant violated \u2014 `flamingo` must precede `flamingo-teaser`/`universal`, and the openframe/teaser aliases must be intact. Do not reorder the table."
15770
- );
15771
- }
15772
-
15773
15770
  // src/utils/source-grouping.ts
15774
15771
  var DOC_TABLE_TYPES = ["markdown", "data_room_doc"];
15775
15772
  function groupsByTable(documentType) {
@@ -15965,6 +15962,58 @@ function resolveSourceIcon(input, ctx = {}) {
15965
15962
  return { Icon: icon, label: iconLabel };
15966
15963
  }
15967
15964
 
15965
+ // src/components/chat/utils/card-destination.ts
15966
+ function resolveCardDestination({
15967
+ chatRef,
15968
+ item,
15969
+ entry,
15970
+ ctx,
15971
+ composeContentUrl,
15972
+ resolveHref = (href) => href
15973
+ }) {
15974
+ const refPath = typeof chatRef.metadata?.path === "string" && chatRef.metadata.path ? chatRef.metadata.path : null;
15975
+ const path = refPath ?? (item ? readFetchedCardPath(item) : null);
15976
+ const cta = resolveSourceRowCTA(
15977
+ {
15978
+ sourceRepo: chatRef.sourceRepo,
15979
+ documentType: chatRef.type,
15980
+ id: chatRef.id,
15981
+ title: chatRef.title,
15982
+ externalUrl: chatRef.url,
15983
+ targetPlatform: chatRef.targetPlatform,
15984
+ path
15985
+ },
15986
+ ctx
15987
+ );
15988
+ const rowUrl = cta.href ? resolveHref(cta.href) : chatRef.url ?? null;
15989
+ const rowPlatform = cta.targetPlatform ?? chatRef.targetPlatform ?? null;
15990
+ if (rowUrl) return { url: rowUrl, targetPlatform: rowPlatform, path, source: "row" };
15991
+ if (entry?.contentRefType && item) {
15992
+ const choice = pickFetchedCardHref({
15993
+ composed: resolveFetchedCardHref({
15994
+ contentRefType: entry.contentRefType,
15995
+ id: chatRef.id,
15996
+ item,
15997
+ composeContentUrl
15998
+ }),
15999
+ itemHref: entry.fallbackHref?.(item) ?? null,
16000
+ allowComposed: !entry.noComposedHref
16001
+ });
16002
+ const url = choice ? safeHref(choice.href) ?? null : null;
16003
+ if (choice && url) {
16004
+ return { url, targetPlatform: choice.targetPlatform ?? rowPlatform, path, source: choice.source };
16005
+ }
16006
+ }
16007
+ return { url: null, targetPlatform: rowPlatform, path, source: "none" };
16008
+ }
16009
+
16010
+ // src/components/chat/utils/external-app-urls.ts
16011
+ var CLICKUP_APP_BASE = "https://app.clickup.com";
16012
+ function clickupTaskUrl(externalId) {
16013
+ if (!externalId) return null;
16014
+ return `${CLICKUP_APP_BASE}/t/${externalId}`;
16015
+ }
16016
+
15968
16017
  // src/components/chat/entity-cards/deleted-data-card.tsx
15969
16018
  import { Trash2 } from "lucide-react";
15970
16019
  import { jsx as jsx96, jsxs as jsxs73 } from "react/jsx-runtime";
@@ -17075,50 +17124,28 @@ function ChatCardLoader({
17075
17124
  extras
17076
17125
  }) {
17077
17126
  const runtime = useRequiredChatRuntime();
17078
- const resolvedChatRef = React9.useMemo(() => {
17079
- const cta = resolveSourceRowCTA(
17080
- {
17081
- sourceRepo: chatRef.sourceRepo,
17082
- documentType: chatRef.type,
17083
- id: chatRef.id,
17084
- title: chatRef.title,
17085
- externalUrl: chatRef.url,
17086
- targetPlatform: chatRef.targetPlatform,
17087
- path: typeof chatRef.metadata?.path === "string" ? chatRef.metadata.path : null
17088
- },
17089
- sourceRowCtxFromRuntime(runtime, { baseRoute, chipBasePlatform })
17090
- );
17091
- const finalHref = cta.href ? resolveHrefForRuntime(cta.href, runtime) : null;
17092
- return {
17093
- ...chatRef,
17094
- url: finalHref ?? chatRef.url,
17095
- targetPlatform: cta.targetPlatform ?? chatRef.targetPlatform ?? null
17096
- };
17097
- }, [chatRef, runtime, baseRoute, chipBasePlatform]);
17098
- const entry = CHAT_CARD_REGISTRY[resolvedChatRef.type];
17127
+ const entry = CHAT_CARD_REGISTRY[chatRef.type];
17099
17128
  const fetchEntry = entry && entry.contentRefType ? entry : null;
17100
17129
  const { item, isLoading, isError, isFetched } = useChatCardItem(
17101
17130
  fetchEntry?.contentRefType ?? "",
17102
- fetchEntry ? resolvedChatRef.id : ""
17131
+ fetchEntry ? chatRef.id : ""
17103
17132
  );
17104
17133
  if (!entry) return null;
17105
- const composedHref = fetchEntry?.contentRefType && !resolvedChatRef.url && item ? resolveFetchedCardHref({
17106
- contentRefType: fetchEntry.contentRefType,
17107
- id: resolvedChatRef.id,
17108
- item,
17109
- composeContentUrl: runtime.composeContentUrl
17110
- }) : null;
17111
- const hrefChoice = fetchEntry && !resolvedChatRef.url && item ? pickFetchedCardHref({
17112
- composed: composedHref,
17113
- itemHref: fetchEntry.fallbackHref?.(item) ?? null,
17114
- allowComposed: !fetchEntry.noComposedHref
17115
- }) : null;
17116
- const hrefResolvedChatRef = hrefChoice ? {
17117
- ...resolvedChatRef,
17118
- url: safeHref(hrefChoice.href),
17119
- // The `item` branch carries no platform of its own — keep the ref's.
17120
- targetPlatform: hrefChoice.targetPlatform ?? resolvedChatRef.targetPlatform ?? null
17121
- } : resolvedChatRef;
17134
+ const destination = resolveCardDestination({
17135
+ chatRef,
17136
+ item: fetchEntry ? item : void 0,
17137
+ entry: fetchEntry,
17138
+ ctx: sourceRowCtxFromRuntime(runtime, { baseRoute, chipBasePlatform }),
17139
+ composeContentUrl: runtime.composeContentUrl,
17140
+ resolveHref: (href) => resolveHrefForRuntime(href, runtime)
17141
+ });
17142
+ const hrefResolvedChatRef = {
17143
+ ...chatRef,
17144
+ url: destination.url,
17145
+ targetPlatform: destination.targetPlatform,
17146
+ // The nav wrapper reads the path off the ref for in-app doc navigation.
17147
+ ...destination.path ? { metadata: { ...chatRef.metadata ?? {}, path: destination.path } } : {}
17148
+ };
17122
17149
  const fetchedTitle = fetchEntry && item ? readFetchedCardTitle(item) : null;
17123
17150
  const finalChatRef = fetchedTitle && (!hrefResolvedChatRef.title || hrefResolvedChatRef.title === hrefResolvedChatRef.id) ? { ...hrefResolvedChatRef, title: fetchedTitle } : hrefResolvedChatRef;
17124
17151
  const isNewTab = computeIsNewTab(runtime, finalChatRef.url, finalChatRef.targetPlatform ?? null);
@@ -24589,7 +24616,7 @@ import { VisuallyHidden } from "@radix-ui/react-visually-hidden";
24589
24616
  import { usePreventScroll } from "@react-aria/overlays";
24590
24617
  import { isIOS } from "@react-aria/utils";
24591
24618
  import { MessageSquare as MessageSquare3 } from "lucide-react";
24592
- import React10, { useCallback as useCallback28, useEffect as useEffect38, useImperativeHandle as useImperativeHandle4, useMemo as useMemo30, useRef as useRef36, useState as useState48 } from "react";
24619
+ import React9, { useCallback as useCallback28, useEffect as useEffect38, useImperativeHandle as useImperativeHandle4, useMemo as useMemo30, useRef as useRef36, useState as useState48 } from "react";
24593
24620
 
24594
24621
  // src/components/ui/drawer.tsx
24595
24622
  import * as DialogPrimitive from "@radix-ui/react-dialog";
@@ -25602,7 +25629,7 @@ function SourceChips({
25602
25629
  ] })
25603
25630
  ] });
25604
25631
  }
25605
- var EmbeddableChat = React10.forwardRef(
25632
+ var EmbeddableChat = React9.forwardRef(
25606
25633
  function EmbeddableChatImpl(props, ref) {
25607
25634
  return /* @__PURE__ */ jsx101(EmbeddableChatInner, { ...props, handleRef: ref });
25608
25635
  }
@@ -27322,15 +27349,9 @@ export {
27322
27349
  faqItemAnchor,
27323
27350
  parseFaqHash,
27324
27351
  useChatCardItem,
27325
- clickupTaskUrl,
27326
27352
  readFetchedCardTitle,
27353
+ readFetchedCardPath,
27327
27354
  resolveFetchedCardHref,
27328
- SOURCE_ICON_NAMES,
27329
- getSourceIconName,
27330
- SOURCE_LABELS_BY_TABLE,
27331
- getSourceLabel,
27332
- DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID,
27333
- defaultTableIdForDocumentType,
27334
27355
  byKey,
27335
27356
  getPlatformProductionUrl,
27336
27357
  getPlatformUrl,
@@ -27339,6 +27360,12 @@ export {
27339
27360
  getRequestOrigin,
27340
27361
  resolveRedirectTarget,
27341
27362
  getAllPlatformBaseDomains,
27363
+ SOURCE_ICON_NAMES,
27364
+ getSourceIconName,
27365
+ SOURCE_LABELS_BY_TABLE,
27366
+ getSourceLabel,
27367
+ DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID,
27368
+ defaultTableIdForDocumentType,
27342
27369
  DOC_TABLE_TYPES,
27343
27370
  groupsByTable,
27344
27371
  recordCountLabel,
@@ -27347,6 +27374,8 @@ export {
27347
27374
  formatCitationIndices,
27348
27375
  resolveSourceRowCTA,
27349
27376
  resolveSourceIcon,
27377
+ resolveCardDestination,
27378
+ clickupTaskUrl,
27350
27379
  chatCardLabel,
27351
27380
  ChatCardLoader,
27352
27381
  renderChatInlineEntityCard,
@@ -5,7 +5,7 @@ var _chunkXCIFHW4Ecjs = require('./chunk-XCIFHW4E.cjs');
5
5
 
6
6
 
7
7
 
8
- var _chunkEKPOIGYIcjs = require('./chunk-EKPOIGYI.cjs');
8
+ var _chunkQDIX2ZRLcjs = require('./chunk-QDIX2ZRL.cjs');
9
9
 
10
10
 
11
11
  var _chunk3L7KCOGOcjs = require('./chunk-3L7KCOGO.cjs');
@@ -16,7 +16,7 @@ var _chunkBRXOGCH3cjs = require('./chunk-BRXOGCH3.cjs');
16
16
 
17
17
 
18
18
 
19
- var _chunk2MVAILI4cjs = require('./chunk-2MVAILI4.cjs');
19
+ var _chunkRTGPIHVOcjs = require('./chunk-RTGPIHVO.cjs');
20
20
 
21
21
 
22
22
 
@@ -56,7 +56,7 @@ function FaqAccordion({ items, defaultOpenIds = [] }) {
56
56
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
57
57
  "div",
58
58
  {
59
- id: _chunk2MVAILI4cjs.faqItemAnchor.call(void 0, item.id),
59
+ id: _chunkRTGPIHVOcjs.faqItemAnchor.call(void 0, item.id),
60
60
  className: "scroll-mt-24 transition-colors hover:bg-ods-bg-hover",
61
61
  children: [
62
62
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
@@ -149,7 +149,7 @@ function groupFaqsBySection(faqs) {
149
149
  }
150
150
  let group = byName.get(name);
151
151
  if (!group) {
152
- group = { section: name, slug: _chunk2MVAILI4cjs.faqSectionSlug.call(void 0, name), items: [] };
152
+ group = { section: name, slug: _chunkRTGPIHVOcjs.faqSectionSlug.call(void 0, name), items: [] };
153
153
  byName.set(name, group);
154
154
  }
155
155
  group.items.push(item);
@@ -202,7 +202,7 @@ function GroupedFaqList({
202
202
  }, [slugKey]);
203
203
  const [hashTarget, setHashTarget] = _react.useState.call(void 0, null);
204
204
  _react.useEffect.call(void 0, () => {
205
- const refresh = () => setHashTarget(_chunk2MVAILI4cjs.parseFaqHash.call(void 0, window.location.hash));
205
+ const refresh = () => setHashTarget(_chunkRTGPIHVOcjs.parseFaqHash.call(void 0, window.location.hash));
206
206
  refresh();
207
207
  window.addEventListener("hashchange", refresh);
208
208
  return () => window.removeEventListener("hashchange", refresh);
@@ -336,7 +336,7 @@ function FaqDocumentPage({
336
336
  label: _nullishCoalesce(_optionalChain([backButton, 'optionalAccess', _16 => _16.label]), () => ( "Back to home")),
337
337
  onClick: () => router.push(_nullishCoalesce(_optionalChain([backButton, 'optionalAccess', _17 => _17.href]), () => ( "/")))
338
338
  };
339
- const inner = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkEKPOIGYIcjs.PageLayout, { title, subtitle, backButton: backCfg, titleSize: "h1", titleWrap: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
339
+ const inner = /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkQDIX2ZRLcjs.PageLayout, { title, subtitle, backButton: backCfg, titleSize: "h1", titleWrap: true, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
340
340
  FaqSection,
341
341
  {
342
342
  initialFaqs,
@@ -349,7 +349,7 @@ function FaqDocumentPage({
349
349
  minResults
350
350
  }
351
351
  ) });
352
- return shell ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkEKPOIGYIcjs.PageShell, { children: inner }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "page-shell-content", children: inner });
352
+ return shell ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkQDIX2ZRLcjs.PageShell, { children: inner }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "page-shell-content", children: inner });
353
353
  }
354
354
 
355
355
 
@@ -10,7 +10,7 @@ import {
10
10
  StatusFilterComponent,
11
11
  TASK_TYPE_LABELS,
12
12
  TASK_TYPE_TEXT_COLORS
13
- } from "./chunk-U473T27Y.js";
13
+ } from "./chunk-B7M6QEEM.js";
14
14
  import {
15
15
  usePathname,
16
16
  useRouter,
@@ -95,7 +95,7 @@ import {
95
95
  useCollapsible,
96
96
  useIsHydrated,
97
97
  useScrollFade
98
- } from "./chunk-Z6R7GE5L.js";
98
+ } from "./chunk-6JPQDYYY.js";
99
99
  import {
100
100
  NEAR_VIEWPORT_ROOT_MARGIN,
101
101
  ToolIcon,