@burdenoff/microfe-devportal 2026.626.6 → 2026.629.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.
@@ -1 +1 @@
1
- {"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/devportal/components/PageLayout.tsx"],"sourcesContent":["import type { FC, HTMLAttributes, ReactNode } from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { AuroraBackground, PagePurpose } from \"@burdenoff/fe-libs/ui\";\nimport { cn } from \"../utils/cn\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: string;\n backLink?: string;\n backLabel?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n fullWidth?: boolean;\n /**\n * Plain-language \"story\" for the page — WHAT it is for and the real use-case\n * — rendered as a calm {@link PagePurpose} under the header so every page is\n * self-explanatory for a new user. Keep it to one or two sentences.\n */\n purpose?: ReactNode;\n /** Optional \"Learn more\" link rendered at the end of the purpose line. */\n purposeLearnMoreHref?: string;\n purposeLearnMoreLabel?: string;\n /**\n * When true the page header sits over a subtle living-glass aurora backdrop\n * (Boff UI 2.0). Reserve this for the MFE's primary/overview page — one\n * aurora per MFE. The backdrop is decorative (-z-10) and never moves content.\n */\n heroBackdrop?: boolean;\n}\n\n/**\n * Standard page layout with header, optional back link, and actions\n */\nexport const PageLayout: FC<PageLayoutProps> = ({\n title,\n description,\n backLink,\n backLabel,\n actions,\n children,\n className,\n fullWidth = false,\n purpose,\n purposeLearnMoreHref,\n purposeLearnMoreLabel,\n heroBackdrop = false,\n}) => {\n const { navigate, basePath } = useDevportal();\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const resolvedBackLabel = backLabel ?? tr(\"devportal.back\", \"Back\");\n\n const handleBack = () => {\n if (!navigate || !backLink) return;\n\n const normalizedBasePath = basePath?.endsWith(\"/\")\n ? basePath.slice(0, -1)\n : basePath || \"\";\n const normalizedBackLink = backLink.startsWith(\"/\")\n ? backLink\n : `/${backLink}`;\n const alreadyIncludesBasePath =\n normalizedBasePath.length > 0 &&\n (normalizedBackLink === normalizedBasePath ||\n normalizedBackLink.startsWith(`${normalizedBasePath}/`));\n\n navigate(\n alreadyIncludesBasePath\n ? normalizedBackLink\n : `${normalizedBasePath}${normalizedBackLink}`,\n );\n };\n\n return (\n <div className={cn(\"flex flex-col gap-6 px-4 py-6 sm:px-6 sm:py-8 lg:px-8 lg:py-10 xl:px-12\", className)}>\n {/* Header — optionally over a subtle living-glass aurora backdrop */}\n <div\n className={cn(\n \"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\",\n heroBackdrop &&\n \"relative overflow-hidden rounded-card border border-border-seam/60 px-5 py-5 sm:px-6 sm:py-6\",\n )}\n >\n {heroBackdrop && <AuroraBackground intensity=\"subtle\" />}\n <div className=\"flex flex-col gap-1\">\n {backLink && (\n <button\n onClick={handleBack}\n className=\"mb-2 flex items-center gap-1 text-sm text-text-secondary hover:text-text-primary transition-colors\"\n >\n <ArrowLeft size={16} />\n {resolvedBackLabel}\n </button>\n )}\n <h1 className=\"text-2xl font-bold tracking-tight\">{title}</h1>\n {description && <p className=\"text-text-secondary\">{description}</p>}\n {purpose && (\n <PagePurpose\n className=\"mt-1 max-w-2xl\"\n learnMoreHref={purposeLearnMoreHref}\n learnMoreLabel={purposeLearnMoreLabel}\n >\n {purpose}\n </PagePurpose>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n\n {/* Content */}\n <div className={cn(!fullWidth && \"max-w-7xl\")}>{children}</div>\n </div>\n );\n};\n\n/**\n * Section within a page\n */\nexport const PageSection: FC<\n {\n title?: string;\n description?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n } & HTMLAttributes<HTMLElement>\n> = ({ title, description, actions, children, className, ...rest }) => (\n <section className={cn(\"space-y-4\", className)} {...rest}>\n {(title || actions) && (\n <div className=\"flex items-center justify-between\">\n <div>\n {title && <h2 className=\"text-lg font-semibold\">{title}</h2>}\n {description && (\n <p className=\"text-sm text-text-secondary\">{description}</p>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n )}\n {children}\n </section>\n);\n"],"mappings":";;;;;;;AAoCA,IAAa,KAAmC,EAC9C,UACA,gBACA,aACA,cACA,YACA,aACA,cACA,eAAY,IACZ,YACA,yBACA,0BACA,kBAAe,SACX;CACJ,IAAM,EAAE,aAAU,gBAAa,GAAc,EACvC,EAAE,SAAM,GAAS,EAKjB,IAAoB,OAJd,GAAa,MAA6B;EACpD,IAAM,IAAQ,EAAE,EAAI;AACpB,SAAO,MAAU,IAAM,IAAW;IAEM,kBAAkB,OAAO;AAuBnE,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,2EAA2E,EAAU;YAAxG,CAEE,kBAAC,OAAD;GACE,WAAW,EACT,sEACA,KACE,+FACH;aALH;IAOG,KAAgB,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA;IACxD,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,KACC,kBAAC,UAAD;OACE,eAnCa;AACvB,YAAI,CAAC,KAAY,CAAC,EAAU;QAE5B,IAAM,IAAqB,GAAU,SAAS,IAAI,GAC9C,EAAS,MAAM,GAAG,GAAG,GACrB,KAAY,IACV,IAAqB,EAAS,WAAW,IAAI,GAC/C,IACA,IAAI;AAMR,UAJE,EAAmB,SAAS,MAC3B,MAAuB,KACtB,EAAmB,WAAW,GAAG,EAAmB,GAAG,IAIrD,IACA,GAAG,IAAqB,IAC7B;;OAkBS,WAAU;iBAFZ,CAIE,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA,EACtB,EACM;;MAEX,kBAAC,MAAD;OAAI,WAAU;iBAAqC;OAAW,CAAA;MAC7D,KAAe,kBAAC,KAAD;OAAG,WAAU;iBAAuB;OAAgB,CAAA;MACnE,KACC,kBAAC,GAAD;OACE,WAAU;OACV,eAAe;OACf,gBAAgB;iBAEf;OACW,CAAA;MAEZ;;IACL,KAAW,kBAAC,OAAD;KAAK,WAAU;eAA2B;KAAc,CAAA;IAChE;MAGN,kBAAC,OAAD;GAAK,WAAW,EAAG,CAAC,KAAa,YAAY;GAAG;GAAe,CAAA,CAC3D;;GAOG,KAQR,EAAE,UAAO,gBAAa,YAAS,aAAU,cAAW,GAAG,QAC1D,kBAAC,WAAD;CAAS,WAAW,EAAG,aAAa,EAAU;CAAE,GAAI;WAApD,EACI,KAAS,MACT,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACG,KAAS,kBAAC,MAAD;GAAI,WAAU;aAAyB;GAAW,CAAA,EAC3D,KACC,kBAAC,KAAD;GAAG,WAAU;aAA+B;GAAgB,CAAA,CAE1D,EAAA,CAAA,EACL,KAAW,kBAAC,OAAD;GAAK,WAAU;aAA2B;GAAc,CAAA,CAChE;KAEP,EACO"}
1
+ {"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/devportal/components/PageLayout.tsx"],"sourcesContent":["import type { FC, HTMLAttributes, ReactNode } from \"react\";\nimport { ArrowLeft } from \"lucide-react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport { AuroraBackground, PagePurpose } from \"@burdenoff/fe-libs/ui\";\nimport { cn } from \"../utils/cn\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\n\ninterface PageLayoutProps {\n title: ReactNode;\n description?: string;\n backLink?: string;\n backLabel?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n fullWidth?: boolean;\n /**\n * Plain-language \"story\" for the page — WHAT it is for and the real use-case\n * — rendered as a calm {@link PagePurpose} under the header so every page is\n * self-explanatory for a new user. Keep it to one or two sentences.\n */\n purpose?: ReactNode;\n /** Optional \"Learn more\" link rendered at the end of the purpose line. */\n purposeLearnMoreHref?: string;\n purposeLearnMoreLabel?: string;\n /**\n * When true the page header sits over a subtle living-glass aurora backdrop\n * (Boff UI 2.0). Reserve this for the MFE's primary/overview page — one\n * aurora per MFE. The backdrop is decorative (-z-10) and never moves content.\n */\n heroBackdrop?: boolean;\n}\n\n/**\n * Standard page layout with header, optional back link, and actions\n */\nexport const PageLayout: FC<PageLayoutProps> = ({\n title,\n description,\n backLink,\n backLabel,\n actions,\n children,\n className,\n fullWidth = false,\n purpose,\n purposeLearnMoreHref,\n purposeLearnMoreLabel,\n heroBackdrop = false,\n}) => {\n const { navigate, basePath } = useDevportal();\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const resolvedBackLabel = backLabel ?? tr(\"devportal.back\", \"Back\");\n\n const handleBack = () => {\n if (!navigate || !backLink) return;\n\n const normalizedBasePath = basePath?.endsWith(\"/\")\n ? basePath.slice(0, -1)\n : basePath || \"\";\n const normalizedBackLink = backLink.startsWith(\"/\")\n ? backLink\n : `/${backLink}`;\n const alreadyIncludesBasePath =\n normalizedBasePath.length > 0 &&\n (normalizedBackLink === normalizedBasePath ||\n normalizedBackLink.startsWith(`${normalizedBasePath}/`));\n\n navigate(\n alreadyIncludesBasePath\n ? normalizedBackLink\n : `${normalizedBasePath}${normalizedBackLink}`,\n );\n };\n\n return (\n <div\n className={cn(\n \"flex flex-col gap-6 px-4 py-6 sm:px-6 sm:py-8 lg:px-8 lg:py-10 xl:px-12\",\n className,\n )}\n >\n {/* Header — optionally over a subtle living-glass aurora backdrop */}\n <div\n className={cn(\n \"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\",\n heroBackdrop &&\n \"relative overflow-hidden rounded-card border border-border-seam/60 px-5 py-5 sm:px-6 sm:py-6\",\n )}\n >\n {heroBackdrop && <AuroraBackground intensity=\"subtle\" />}\n <div className=\"flex flex-col gap-1\">\n {backLink && (\n <button\n onClick={handleBack}\n className=\"mb-2 flex items-center gap-1 text-sm text-text-secondary hover:text-text-primary transition-colors\"\n >\n <ArrowLeft size={16} />\n {resolvedBackLabel}\n </button>\n )}\n <h1 className=\"text-2xl font-bold tracking-tight\">{title}</h1>\n {description && <p className=\"text-text-secondary\">{description}</p>}\n {purpose && (\n <PagePurpose\n className=\"mt-1 max-w-2xl\"\n learnMoreHref={purposeLearnMoreHref}\n learnMoreLabel={purposeLearnMoreLabel}\n >\n {purpose}\n </PagePurpose>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n\n {/* Content */}\n <div className={cn(!fullWidth && \"max-w-7xl\")}>{children}</div>\n </div>\n );\n};\n\n/**\n * Section within a page\n */\nexport const PageSection: FC<\n {\n title?: string;\n description?: string;\n actions?: ReactNode;\n children: ReactNode;\n className?: string;\n } & HTMLAttributes<HTMLElement>\n> = ({ title, description, actions, children, className, ...rest }) => (\n <section className={cn(\"space-y-4\", className)} {...rest}>\n {(title || actions) && (\n <div className=\"flex items-center justify-between\">\n <div>\n {title && <h2 className=\"text-lg font-semibold\">{title}</h2>}\n {description && (\n <p className=\"text-sm text-text-secondary\">{description}</p>\n )}\n </div>\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\n </div>\n )}\n {children}\n </section>\n);\n"],"mappings":";;;;;;;AAoCA,IAAa,KAAmC,EAC9C,UACA,gBACA,aACA,cACA,YACA,aACA,cACA,eAAY,IACZ,YACA,yBACA,0BACA,kBAAe,SACX;CACJ,IAAM,EAAE,aAAU,gBAAa,GAAc,EACvC,EAAE,SAAM,GAAS,EAKjB,IAAoB,OAJd,GAAa,MAA6B;EACpD,IAAM,IAAQ,EAAE,EAAI;AACpB,SAAO,MAAU,IAAM,IAAW;IAEM,kBAAkB,OAAO;AAuBnE,QACE,kBAAC,OAAD;EACE,WAAW,EACT,2EACA,EACD;YAJH,CAOE,kBAAC,OAAD;GACE,WAAW,EACT,sEACA,KACE,+FACH;aALH;IAOG,KAAgB,kBAAC,GAAD,EAAkB,WAAU,UAAW,CAAA;IACxD,kBAAC,OAAD;KAAK,WAAU;eAAf;MACG,KACC,kBAAC,UAAD;OACE,eAxCa;AACvB,YAAI,CAAC,KAAY,CAAC,EAAU;QAE5B,IAAM,IAAqB,GAAU,SAAS,IAAI,GAC9C,EAAS,MAAM,GAAG,GAAG,GACrB,KAAY,IACV,IAAqB,EAAS,WAAW,IAAI,GAC/C,IACA,IAAI;AAMR,UAJE,EAAmB,SAAS,MAC3B,MAAuB,KACtB,EAAmB,WAAW,GAAG,EAAmB,GAAG,IAIrD,IACA,GAAG,IAAqB,IAC7B;;OAuBS,WAAU;iBAFZ,CAIE,kBAAC,GAAD,EAAW,MAAM,IAAM,CAAA,EACtB,EACM;;MAEX,kBAAC,MAAD;OAAI,WAAU;iBAAqC;OAAW,CAAA;MAC7D,KAAe,kBAAC,KAAD;OAAG,WAAU;iBAAuB;OAAgB,CAAA;MACnE,KACC,kBAAC,GAAD;OACE,WAAU;OACV,eAAe;OACf,gBAAgB;iBAEf;OACW,CAAA;MAEZ;;IACL,KAAW,kBAAC,OAAD;KAAK,WAAU;eAA2B;KAAc,CAAA;IAChE;MAGN,kBAAC,OAAD;GAAK,WAAW,EAAG,CAAC,KAAa,YAAY;GAAG;GAAe,CAAA,CAC3D;;GAOG,KAQR,EAAE,UAAO,gBAAa,YAAS,aAAU,cAAW,GAAG,QAC1D,kBAAC,WAAD;CAAS,WAAW,EAAG,aAAa,EAAU;CAAE,GAAI;WAApD,EACI,KAAS,MACT,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACG,KAAS,kBAAC,MAAD;GAAI,WAAU;aAAyB;GAAW,CAAA,EAC3D,KACC,kBAAC,KAAD;GAAG,WAAU;aAA+B;GAAgB,CAAA,CAE1D,EAAA,CAAA,EACL,KAAW,kBAAC,OAAD;GAAK,WAAU;aAA2B;GAAc,CAAA,CAChE;KAEP,EACO"}
@@ -48,6 +48,7 @@ function we(e) {
48
48
  githubUrl: e.githubUrl || void 0,
49
49
  pricingType: e.pricingType || void 0,
50
50
  pricingDetails: e.pricingDetails ?? void 0,
51
+ manifest: e.manifest ?? void 0,
51
52
  installCount: e.installCount,
52
53
  activeInstallCount: e.activeInstallCount,
53
54
  averageRating: e.averageRating ?? void 0,
@@ -427,7 +428,7 @@ var De = [
427
428
  tabIndex: 0,
428
429
  children: [
429
430
  w === "overview" && /* @__PURE__ */ K(Pe, { app: X }),
430
- w === "permissions" && /* @__PURE__ */ K(Ye, { app: X }),
431
+ w === "permissions" && /* @__PURE__ */ K(Xe, { app: X }),
431
432
  w === "webhooks" && /* @__PURE__ */ K(je, {
432
433
  appId: X.id,
433
434
  onNavigate: Y
@@ -440,7 +441,7 @@ var De = [
440
441
  }),
441
442
  w === "analytics" && /* @__PURE__ */ K(Ne, { appId: X.id }),
442
443
  w === "playground" && /* @__PURE__ */ K(Re, { app: X }),
443
- w === "store-listing" && /* @__PURE__ */ K(Ke, {
444
+ w === "store-listing" && /* @__PURE__ */ K(qe, {
444
445
  app: X,
445
446
  versionCount: I?.application?.versions?.totalCount ?? 0
446
447
  })
@@ -1472,77 +1473,84 @@ var De = [
1472
1473
  value: "JPY",
1473
1474
  label: "JPY — Japanese Yen"
1474
1475
  }
1475
- ], We = [
1476
- {
1477
- value: "agent",
1478
- label: "Agent"
1479
- },
1480
- {
1481
- value: "node",
1482
- label: "Node"
1483
- },
1484
- {
1485
- value: "widget",
1486
- label: "Widget"
1487
- },
1488
- {
1476
+ ], We = {
1477
+ NODE: [
1478
+ {
1479
+ value: "node",
1480
+ label: "Node"
1481
+ },
1482
+ {
1483
+ value: "agent",
1484
+ label: "Agent"
1485
+ },
1486
+ {
1487
+ value: "parser",
1488
+ label: "Parser"
1489
+ },
1490
+ {
1491
+ value: "datasink",
1492
+ label: "Data Sink"
1493
+ },
1494
+ {
1495
+ value: "component",
1496
+ label: "Component"
1497
+ }
1498
+ ],
1499
+ WORKFLOW: [{
1489
1500
  value: "workflow",
1490
1501
  label: "Workflow"
1491
- },
1492
- {
1493
- value: "botapp",
1494
- label: "Bot App"
1495
- },
1496
- {
1497
- value: "console",
1498
- label: "Console"
1499
- },
1500
- {
1501
- value: "vibemodule",
1502
- label: "Vibe Module"
1503
- },
1504
- {
1505
- value: "dashboard",
1506
- label: "Dashboard"
1507
- },
1508
- {
1509
- value: "parser",
1510
- label: "Parser"
1511
- },
1512
- {
1513
- value: "datasink",
1514
- label: "Data Sink"
1515
- },
1516
- {
1517
- value: "app",
1518
- label: "App"
1519
- },
1520
- {
1502
+ }, {
1521
1503
  value: "template",
1522
1504
  label: "Template"
1523
- },
1524
- {
1525
- value: "integration",
1526
- label: "Integration"
1527
- },
1528
- {
1529
- value: "extension",
1530
- label: "Extension"
1531
- },
1532
- {
1533
- value: "theme",
1534
- label: "Theme"
1535
- },
1536
- {
1537
- value: "plugin",
1538
- label: "Plugin"
1539
- },
1540
- {
1541
- value: "component",
1542
- label: "Component"
1543
- }
1544
- ];
1545
- function Ge(e) {
1505
+ }],
1506
+ APP: [
1507
+ {
1508
+ value: "app",
1509
+ label: "App"
1510
+ },
1511
+ {
1512
+ value: "integration",
1513
+ label: "Integration"
1514
+ },
1515
+ {
1516
+ value: "extension",
1517
+ label: "Extension"
1518
+ },
1519
+ {
1520
+ value: "widget",
1521
+ label: "Widget"
1522
+ },
1523
+ {
1524
+ value: "dashboard",
1525
+ label: "Dashboard"
1526
+ },
1527
+ {
1528
+ value: "console",
1529
+ label: "Console"
1530
+ },
1531
+ {
1532
+ value: "botapp",
1533
+ label: "Bot App"
1534
+ },
1535
+ {
1536
+ value: "vibemodule",
1537
+ label: "Vibe Module"
1538
+ },
1539
+ {
1540
+ value: "theme",
1541
+ label: "Theme"
1542
+ },
1543
+ {
1544
+ value: "plugin",
1545
+ label: "Plugin"
1546
+ }
1547
+ ]
1548
+ }, Ge = {
1549
+ NODE: "node",
1550
+ WORKFLOW: "workflow",
1551
+ APP: "app"
1552
+ };
1553
+ function Ke(e) {
1546
1554
  let t = e.manifest ?? {}, n = t.identity ?? {}, r = (t.digital ?? {}).install ?? {}, i = t.compatibility ?? {}, a = Array.isArray(t.permissions) ? t.permissions : [], o = e.pricingDetails ?? {}, s = Array.isArray(e.screenshots) ? e.screenshots.join("\n") : "";
1547
1555
  return {
1548
1556
  iconUrl: e.iconUrl ?? "",
@@ -1560,7 +1568,7 @@ function Ge(e) {
1560
1568
  pricingType: e.pricingType ?? "",
1561
1569
  price: typeof o.price == "number" ? String(o.price) : "",
1562
1570
  currency: typeof o.currency == "string" ? o.currency : "",
1563
- manifestItemType: typeof t.itemType == "string" ? t.itemType : "",
1571
+ manifestItemType: typeof t.itemType == "string" ? t.itemType : Ge[e.appType] ?? "",
1564
1572
  manifestDisplayName: typeof n.displayName == "string" ? n.displayName : e.name ?? "",
1565
1573
  manifestVersion: typeof n.version == "string" ? n.version : "",
1566
1574
  manifestInstallType: typeof r.type == "string" ? r.type : "zip",
@@ -1571,15 +1579,15 @@ function Ge(e) {
1571
1579
  manifestJsonContent: typeof t.jsonContent == "string" ? t.jsonContent : typeof t.content == "string" ? t.content : ""
1572
1580
  };
1573
1581
  }
1574
- var Ke = ({ app: n, versionCount: r = 0 }) => {
1582
+ var qe = ({ app: n, versionCount: r = 0 }) => {
1575
1583
  let i = ye(), { workspacesGatewayUrl: a, authToken: o, workspaceId: s, getWorkspaceToken: c } = e(), { t: l } = P(), u = (e, t) => {
1576
1584
  let n = l(e);
1577
1585
  return n === e ? t : n;
1578
- }, d = n.appType === "NODE" || n.appType === "WORKFLOW", f = n.status !== "PUBLISHED" && (!d || r > 0), [m, g] = N(() => Ge(n)), [v, y] = N(!1), b = ae(n);
1586
+ }, d = n.appType === "NODE" || n.appType === "WORKFLOW", f = n.status !== "PUBLISHED" && (!d || r > 0), [m, g] = N(() => Ke(n)), [v, y] = N(!1), b = ae(n);
1579
1587
  b.current = n;
1580
1588
  let [x] = h(), [S, { loading: ee }] = p();
1581
1589
  ie(() => {
1582
- g(Ge(b.current));
1590
+ g(Ke(b.current));
1583
1591
  }, [n.id]);
1584
1592
  let w = (e, t) => {
1585
1593
  g((n) => ({
@@ -1722,9 +1730,9 @@ var Ke = ({ app: n, versionCount: r = 0 }) => {
1722
1730
  let t = e.target.value;
1723
1731
  w("manifestItemType", t), Ve.has(t) ? w("manifestInstallType", "json") : m.manifestInstallType === "json" && w("manifestInstallType", "zip");
1724
1732
  },
1725
- options: We,
1733
+ options: We[n.appType] ?? We.APP,
1726
1734
  placeholder: u("devportal.selectItemType", "Select item type…"),
1727
- hint: u("devportal.storeItemTypeHint", "Determines how this item is categorised and how the platform runs it")
1735
+ hint: u("devportal.storeItemTypeHint", "Sub-category shown in the marketplace (e.g. Node vs Agent vs Parser)")
1728
1736
  }),
1729
1737
  /* @__PURE__ */ K(E, {
1730
1738
  label: u("devportal.manifestDisplayName", "Display Name"),
@@ -1732,13 +1740,22 @@ var Ke = ({ app: n, versionCount: r = 0 }) => {
1732
1740
  onChange: (e) => w("manifestDisplayName", e.target.value),
1733
1741
  placeholder: "My Awesome Node"
1734
1742
  }),
1735
- V && /* @__PURE__ */ K(O, {
1736
- label: u("devportal.jsonContent", m.manifestItemType === "workflow" ? "Workflow Definition (JSON)" : "Template Definition (JSON)"),
1743
+ V && n.appType !== "WORKFLOW" && /* @__PURE__ */ K(O, {
1744
+ label: u("devportal.jsonContent", "Template Definition (JSON)"),
1737
1745
  value: m.manifestJsonContent,
1738
1746
  onChange: (e) => w("manifestJsonContent", e.target.value),
1739
1747
  rows: 12,
1740
1748
  placeholder: "{\n \"nodes\": [],\n \"edges\": []\n}",
1741
1749
  hint: u("devportal.jsonContentHint", "Paste the full JSON definition. Stored and applied directly — no zip needed.")
1750
+ }),
1751
+ V && n.appType === "WORKFLOW" && /* @__PURE__ */ q("p", {
1752
+ className: "text-sm text-text-secondary rounded-md bg-bg-sunken px-3 py-2",
1753
+ children: [
1754
+ "The Workflow Definition (JSON) is set per version. Go to the",
1755
+ " ",
1756
+ /* @__PURE__ */ K("strong", { children: "Versions" }),
1757
+ " tab to add or update it."
1758
+ ]
1742
1759
  })
1743
1760
  ]
1744
1761
  })
@@ -1951,7 +1968,7 @@ var Ke = ({ app: n, versionCount: r = 0 }) => {
1951
1968
  rel: "noopener noreferrer",
1952
1969
  className: "flex items-center gap-2 text-sm text-primary hover:underline",
1953
1970
  children: [/* @__PURE__ */ K(R, { size: 14 }), e]
1954
- }), qe = [
1971
+ }), Je = [
1955
1972
  {
1956
1973
  id: "auth",
1957
1974
  label: "Authentication",
@@ -2023,14 +2040,14 @@ var Ke = ({ app: n, versionCount: r = 0 }) => {
2023
2040
  description: "Access control configuration"
2024
2041
  }
2025
2042
  ];
2026
- function Je(e) {
2027
- let t = Object.fromEntries(qe.map((e) => [e.id, "none"]));
2043
+ function Ye(e) {
2044
+ let t = Object.fromEntries(Je.map((e) => [e.id, "none"]));
2028
2045
  if (!e || !Array.isArray(e.permissions)) return t;
2029
2046
  for (let n of e.permissions) n.resource in t && (t[n.resource] = n.level === "write" ? "write" : "read");
2030
2047
  return t;
2031
2048
  }
2032
- var Ye = ({ app: e }) => {
2033
- let t = e.manifest ?? {}, [n, r] = N(() => Je(t)), [i, a] = N(!1), [o, s] = N(!1), [c] = h(), l = (e, t) => {
2049
+ var Xe = ({ app: e }) => {
2050
+ let t = e.manifest ?? {}, [n, r] = N(() => Ye(t)), [i, a] = N(!1), [o, s] = N(!1), [c] = h(), l = (e, t) => {
2034
2051
  s(!1), r((n) => ({
2035
2052
  ...n,
2036
2053
  [e]: t
@@ -2082,7 +2099,7 @@ var Ye = ({ app: e }) => {
2082
2099
  }, e))]
2083
2100
  }) }), /* @__PURE__ */ K("tbody", {
2084
2101
  className: "divide-y divide-border",
2085
- children: qe.map((e) => /* @__PURE__ */ q("tr", {
2102
+ children: Je.map((e) => /* @__PURE__ */ q("tr", {
2086
2103
  className: "hover:bg-bg-sunken/30 transition-colors",
2087
2104
  children: [/* @__PURE__ */ q("td", {
2088
2105
  className: "px-4 py-3",