@datatechsolutions/ui 3.13.1 → 3.15.0

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 (123) hide show
  1. package/dist/astrlabe/graph-node.js +6 -6
  2. package/dist/astrlabe/graph-node.mjs +2 -2
  3. package/dist/astrlabe/index.js +113 -113
  4. package/dist/astrlabe/index.mjs +5 -5
  5. package/dist/astrlabe/workflow-canvas.js +5 -5
  6. package/dist/astrlabe/workflow-canvas.mjs +4 -4
  7. package/dist/{chunk-Q7QPHZOV.js → chunk-2JPS5OND.js} +67 -67
  8. package/dist/{chunk-Q7QPHZOV.js.map → chunk-2JPS5OND.js.map} +1 -1
  9. package/dist/{chunk-RPNMDGRA.js → chunk-2QZFKQP6.js} +37 -40
  10. package/dist/chunk-2QZFKQP6.js.map +1 -0
  11. package/dist/{chunk-O4RZCDP2.mjs → chunk-2SBVFLPZ.mjs} +19 -2
  12. package/dist/chunk-2SBVFLPZ.mjs.map +1 -0
  13. package/dist/{chunk-4VEQJAXJ.mjs → chunk-3FOLXKVP.mjs} +5 -5
  14. package/dist/{chunk-4VEQJAXJ.mjs.map → chunk-3FOLXKVP.mjs.map} +1 -1
  15. package/dist/{chunk-PM7A5I3X.js → chunk-435TRHC2.js} +118 -118
  16. package/dist/{chunk-PM7A5I3X.js.map → chunk-435TRHC2.js.map} +1 -1
  17. package/dist/{chunk-M4KRQXOT.mjs → chunk-5QRU3KKV.mjs} +3 -3
  18. package/dist/{chunk-M4KRQXOT.mjs.map → chunk-5QRU3KKV.mjs.map} +1 -1
  19. package/dist/{chunk-DTFU3ZTD.js → chunk-6NBQTIXX.js} +9 -9
  20. package/dist/{chunk-DTFU3ZTD.js.map → chunk-6NBQTIXX.js.map} +1 -1
  21. package/dist/{chunk-CVEI4RQP.js → chunk-6NEESZVO.js} +4 -4
  22. package/dist/{chunk-CVEI4RQP.js.map → chunk-6NEESZVO.js.map} +1 -1
  23. package/dist/{chunk-CKY2QIRR.js → chunk-6UUFPSAR.js} +4 -4
  24. package/dist/{chunk-CKY2QIRR.js.map → chunk-6UUFPSAR.js.map} +1 -1
  25. package/dist/{chunk-DJHNSBIR.mjs → chunk-7LIJTAIF.mjs} +31 -31
  26. package/dist/{chunk-DJHNSBIR.mjs.map → chunk-7LIJTAIF.mjs.map} +1 -1
  27. package/dist/{chunk-4MNKVDTJ.mjs → chunk-A5M7SPPG.mjs} +4 -4
  28. package/dist/{chunk-4MNKVDTJ.mjs.map → chunk-A5M7SPPG.mjs.map} +1 -1
  29. package/dist/{chunk-FV42SSLP.js → chunk-A5OMGPMR.js} +4 -4
  30. package/dist/{chunk-FV42SSLP.js.map → chunk-A5OMGPMR.js.map} +1 -1
  31. package/dist/{chunk-VWZ53TE2.js → chunk-BN4BKFE2.js} +9 -9
  32. package/dist/{chunk-VWZ53TE2.js.map → chunk-BN4BKFE2.js.map} +1 -1
  33. package/dist/{chunk-4Z5NZINA.js → chunk-C4UYEHPY.js} +136 -136
  34. package/dist/chunk-C4UYEHPY.js.map +1 -0
  35. package/dist/{chunk-54T5F65C.js → chunk-CPTHSYM2.js} +17 -17
  36. package/dist/{chunk-54T5F65C.js.map → chunk-CPTHSYM2.js.map} +1 -1
  37. package/dist/{chunk-3VCSMSJB.mjs → chunk-EZVBRLQH.mjs} +9 -9
  38. package/dist/{chunk-3VCSMSJB.mjs.map → chunk-EZVBRLQH.mjs.map} +1 -1
  39. package/dist/{chunk-4QCO4CBC.mjs → chunk-F3PQ5EFQ.mjs} +4 -4
  40. package/dist/{chunk-4QCO4CBC.mjs.map → chunk-F3PQ5EFQ.mjs.map} +1 -1
  41. package/dist/{chunk-RUZPOHJW.js → chunk-GD3YV46U.js} +41 -41
  42. package/dist/{chunk-RUZPOHJW.js.map → chunk-GD3YV46U.js.map} +1 -1
  43. package/dist/{chunk-Y65X2NHF.mjs → chunk-I6ULYJR4.mjs} +3 -3
  44. package/dist/{chunk-Y65X2NHF.mjs.map → chunk-I6ULYJR4.mjs.map} +1 -1
  45. package/dist/{chunk-YHD6SJIN.mjs → chunk-JJUWZNJY.mjs} +4 -4
  46. package/dist/{chunk-YHD6SJIN.mjs.map → chunk-JJUWZNJY.mjs.map} +1 -1
  47. package/dist/{chunk-VPRAESA7.mjs → chunk-KDDXDQR2.mjs} +3 -3
  48. package/dist/{chunk-VPRAESA7.mjs.map → chunk-KDDXDQR2.mjs.map} +1 -1
  49. package/dist/{chunk-UPWJRCAD.js → chunk-KRS2CLPR.js} +223 -229
  50. package/dist/chunk-KRS2CLPR.js.map +1 -0
  51. package/dist/{chunk-RWZ2PLMQ.js → chunk-KZDABEML.js} +211 -154
  52. package/dist/chunk-KZDABEML.js.map +1 -0
  53. package/dist/{chunk-TRNDFSM6.mjs → chunk-MSXJFWKD.mjs} +28 -28
  54. package/dist/chunk-MSXJFWKD.mjs.map +1 -0
  55. package/dist/{chunk-EBARYRSA.js → chunk-MXQ2EYG2.js} +19 -2
  56. package/dist/chunk-MXQ2EYG2.js.map +1 -0
  57. package/dist/{chunk-RMPXGEFL.mjs → chunk-NNR44MM5.mjs} +7 -7
  58. package/dist/{chunk-RMPXGEFL.mjs.map → chunk-NNR44MM5.mjs.map} +1 -1
  59. package/dist/{chunk-AC54BNSK.js → chunk-NQCFGIWC.js} +13 -13
  60. package/dist/{chunk-AC54BNSK.js.map → chunk-NQCFGIWC.js.map} +1 -1
  61. package/dist/{chunk-7IAWXG43.js → chunk-OQM252SM.js} +33 -33
  62. package/dist/{chunk-7IAWXG43.js.map → chunk-OQM252SM.js.map} +1 -1
  63. package/dist/{chunk-VCL5LDS5.js → chunk-PADXORD2.js} +38 -38
  64. package/dist/{chunk-VCL5LDS5.js.map → chunk-PADXORD2.js.map} +1 -1
  65. package/dist/{chunk-SCGICCQM.mjs → chunk-PSS3E463.mjs} +7 -10
  66. package/dist/chunk-PSS3E463.mjs.map +1 -0
  67. package/dist/{chunk-QEACOJXX.mjs → chunk-QCGSE24W.mjs} +139 -83
  68. package/dist/chunk-QCGSE24W.mjs.map +1 -0
  69. package/dist/{chunk-ZPV7X4ZE.mjs → chunk-RH6Z425K.mjs} +6 -6
  70. package/dist/{chunk-ZPV7X4ZE.mjs.map → chunk-RH6Z425K.mjs.map} +1 -1
  71. package/dist/{chunk-RSCRIDMW.mjs → chunk-SMUBE3RO.mjs} +46 -52
  72. package/dist/chunk-SMUBE3RO.mjs.map +1 -0
  73. package/dist/{chunk-WX44DAQD.mjs → chunk-TQADF23S.mjs} +3 -3
  74. package/dist/{chunk-WX44DAQD.mjs.map → chunk-TQADF23S.mjs.map} +1 -1
  75. package/dist/{chunk-B3TA74C4.js → chunk-WG26KW6D.js} +57 -60
  76. package/dist/chunk-WG26KW6D.js.map +1 -0
  77. package/dist/{chunk-UUTTS3VV.mjs → chunk-WGS65S7S.mjs} +8 -11
  78. package/dist/chunk-WGS65S7S.mjs.map +1 -0
  79. package/dist/{chunk-ULSG4JLR.js → chunk-XJJZ6DHE.js} +6 -6
  80. package/dist/{chunk-ULSG4JLR.js.map → chunk-XJJZ6DHE.js.map} +1 -1
  81. package/dist/{chunk-XYMHIZ3K.mjs → chunk-ZBX7UCAP.mjs} +7 -7
  82. package/dist/{chunk-XYMHIZ3K.mjs.map → chunk-ZBX7UCAP.mjs.map} +1 -1
  83. package/dist/index.d.mts +77 -7
  84. package/dist/index.d.ts +77 -7
  85. package/dist/index.js +707 -703
  86. package/dist/index.mjs +2 -2
  87. package/dist/platform/admin/index.js +11 -11
  88. package/dist/platform/admin/index.mjs +5 -5
  89. package/dist/platform/agents-workspace.js +8 -8
  90. package/dist/platform/agents-workspace.mjs +7 -7
  91. package/dist/platform/app-shell.js +4 -4
  92. package/dist/platform/app-shell.mjs +3 -3
  93. package/dist/platform/auth/index.js +28 -28
  94. package/dist/platform/auth/index.mjs +5 -5
  95. package/dist/platform/billing/index.js +6 -6
  96. package/dist/platform/billing/index.mjs +4 -4
  97. package/dist/platform/impersonation/index.js +4 -4
  98. package/dist/platform/impersonation/index.mjs +3 -3
  99. package/dist/platform/index.js +93 -93
  100. package/dist/platform/index.mjs +21 -21
  101. package/dist/platform/pages/index.d.mts +103 -1
  102. package/dist/platform/pages/index.d.ts +103 -1
  103. package/dist/platform/pages/index.js +1756 -1429
  104. package/dist/platform/pages/index.js.map +1 -1
  105. package/dist/platform/pages/index.mjs +1458 -1137
  106. package/dist/platform/pages/index.mjs.map +1 -1
  107. package/dist/platform/settings/index.js +8 -8
  108. package/dist/platform/settings/index.mjs +7 -7
  109. package/dist/platform/workflow-canvas-shell.js +6 -6
  110. package/dist/platform/workflow-canvas-shell.mjs +5 -5
  111. package/package.json +1 -1
  112. package/dist/chunk-4Z5NZINA.js.map +0 -1
  113. package/dist/chunk-B3TA74C4.js.map +0 -1
  114. package/dist/chunk-EBARYRSA.js.map +0 -1
  115. package/dist/chunk-O4RZCDP2.mjs.map +0 -1
  116. package/dist/chunk-QEACOJXX.mjs.map +0 -1
  117. package/dist/chunk-RPNMDGRA.js.map +0 -1
  118. package/dist/chunk-RSCRIDMW.mjs.map +0 -1
  119. package/dist/chunk-RWZ2PLMQ.js.map +0 -1
  120. package/dist/chunk-SCGICCQM.mjs.map +0 -1
  121. package/dist/chunk-TRNDFSM6.mjs.map +0 -1
  122. package/dist/chunk-UPWJRCAD.js.map +0 -1
  123. package/dist/chunk-UUTTS3VV.mjs.map +0 -1
@@ -1,8 +1,8 @@
1
1
  "use client";
2
- import { AdminOrganizationDetail } from './chunk-SCGICCQM.mjs';
3
- import { BillingPanel } from './chunk-YHD6SJIN.mjs';
4
- import { UserProfile } from './chunk-3VCSMSJB.mjs';
5
- import { useAuth, InlineSpinner, SegmentedControl } from './chunk-QEACOJXX.mjs';
2
+ import { AdminOrganizationDetail } from './chunk-PSS3E463.mjs';
3
+ import { UserProfile } from './chunk-EZVBRLQH.mjs';
4
+ import { BillingPanel } from './chunk-JJUWZNJY.mjs';
5
+ import { useAuth, InlineSpinner, SegmentedControl } from './chunk-QCGSE24W.mjs';
6
6
  import { useTranslations } from './chunk-ZEFNBGYI.mjs';
7
7
  import { useMemo, useState, useEffect } from 'react';
8
8
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -94,5 +94,5 @@ function PlatformSettings({
94
94
  }
95
95
 
96
96
  export { PlatformSettings };
97
- //# sourceMappingURL=chunk-ZPV7X4ZE.mjs.map
98
- //# sourceMappingURL=chunk-ZPV7X4ZE.mjs.map
97
+ //# sourceMappingURL=chunk-RH6Z425K.mjs.map
98
+ //# sourceMappingURL=chunk-RH6Z425K.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/platform/settings/platform-settings.tsx"],"names":[],"mappings":"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","file":"chunk-ZPV7X4ZE.mjs","sourcesContent":["// =============================================================================\n// @datatechsolutions/windsock/ui — PlatformSettings\n// Unified settings shell consumed by every product (astrlabe, kori).\n// Composes existing building blocks:\n// - `<UserProfile>` — Profile / Security / Sessions / Linked accounts\n// - `<AdminOrganizationDetail>` — Members / Invitations / Domains\n// - `<BillingPanel>` — Current subscription + plan catalogue\n// Apps mount this at their `/settings` route; feature toggles hide sections\n// that a given user's role cannot access.\n// =============================================================================\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { SegmentedControl, InlineSpinner } from '@ui/index'\nimport type { AdminClient, AuthOrganization } from '@datatechsolutions/shared-domain'\n\nimport { useAuth } from '../../_auth'\nimport { UserProfile } from '../auth/user-profile'\nimport { AdminOrganizationDetail } from '../admin/admin-organization-detail'\nimport { BillingPanel, type BillingPanelProps } from '../billing/billing-panel'\n\nexport type PlatformSettingsSection = 'account' | 'organization' | 'billing'\n\nexport interface PlatformSettingsProps {\n /**\n * Sections to surface to the current user. The host app is responsible for\n * picking the right set based on RBAC — e.g. hide `organization` for users\n * without `org:manage` and hide `billing` for users without `billing:read`.\n * Defaults to all three.\n */\n sections?: PlatformSettingsSection[]\n /** Starting section. Defaults to the first item in `sections`. */\n defaultSection?: PlatformSettingsSection\n /**\n * Windsock admin API client. Required when `organization` is in `sections`.\n * Create it once with `createAdminClient({ issuer, authClient })` and reuse.\n */\n adminClient?: AdminClient\n /**\n * Current organization id (usually `ctx.organizationId` from the JWT).\n * Required when `organization` is in `sections`.\n */\n organizationId?: string\n /** Forwarded to `<BillingPanel>` — e.g. redirect handler, billing interval. */\n billing?: BillingPanelProps\n}\n\nconst DEFAULT_SECTIONS: PlatformSettingsSection[] = ['account', 'organization', 'billing']\n\nexport function PlatformSettings({\n sections = DEFAULT_SECTIONS,\n defaultSection,\n adminClient,\n organizationId,\n billing,\n}: PlatformSettingsProps) {\n const t = useTranslations('windsock')\n const { status } = useAuth()\n\n const visibleSections = useMemo(() => {\n // Drop `organization` if the caller didn't pass an admin client + org id.\n return sections.filter((section) => {\n if (section === 'organization') {\n return Boolean(adminClient && organizationId)\n }\n return true\n })\n }, [sections, adminClient, organizationId])\n\n const initialSection: PlatformSettingsSection = (\n defaultSection && visibleSections.includes(defaultSection)\n ? defaultSection\n : visibleSections[0] ?? 'account'\n )\n\n const [activeSection, setActiveSection] = useState<PlatformSettingsSection>(initialSection)\n const [organization, setOrganization] = useState<AuthOrganization | null>(null)\n const [orgLoadError, setOrgLoadError] = useState<string | null>(null)\n\n // Resolve the org detail record (AdminOrganizationDetail needs the full\n // AuthOrganization, not just the id). Fires once the organization tab is\n // first selected so the listOrganizations round-trip is lazy.\n useEffect(() => {\n if (activeSection !== 'organization') return\n if (!adminClient || !organizationId) return\n if (organization?.id === organizationId) return\n\n let cancelled = false\n setOrgLoadError(null)\n void adminClient.listOrganizations()\n .then((orgs) => {\n if (cancelled) return\n const match = orgs.find((org) => org.id === organizationId)\n if (match) {\n setOrganization(match)\n } else {\n setOrgLoadError('Organization not found')\n }\n })\n .catch((loadError: unknown) => {\n if (cancelled) return\n setOrgLoadError(loadError instanceof Error ? loadError.message : String(loadError))\n })\n return () => {\n cancelled = true\n }\n }, [activeSection, adminClient, organizationId, organization?.id])\n\n if (status === 'loading') {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n }\n\n if (status !== 'authenticated') {\n return null\n }\n\n if (visibleSections.length === 0) {\n return null\n }\n\n const segments = visibleSections.map((section) => ({\n value: section,\n label: t(`platformSettings.sections.${section}`),\n }))\n\n return (\n <div className=\"space-y-6\">\n {visibleSections.length > 1 && (\n <SegmentedControl\n segments={segments}\n value={activeSection}\n onChange={(value: string) => setActiveSection(value as PlatformSettingsSection)}\n fullWidth\n />\n )}\n\n {activeSection === 'account' && <UserProfile />}\n\n {activeSection === 'organization' && adminClient && organizationId && (\n organization ? (\n <AdminOrganizationDetail\n client={adminClient}\n organization={organization}\n />\n ) : orgLoadError ? (\n <div\n role=\"alert\"\n className=\"rounded-xl border border-red-300/40 bg-red-50/80 px-4 py-3 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-300\"\n >\n {orgLoadError}\n </div>\n ) : (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n )}\n\n {activeSection === 'billing' && <BillingPanel {...billing} />}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/platform/settings/platform-settings.tsx"],"names":[],"mappings":"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","file":"chunk-RH6Z425K.mjs","sourcesContent":["// =============================================================================\n// @datatechsolutions/windsock/ui — PlatformSettings\n// Unified settings shell consumed by every product (astrlabe, kori).\n// Composes existing building blocks:\n// - `<UserProfile>` — Profile / Security / Sessions / Linked accounts\n// - `<AdminOrganizationDetail>` — Members / Invitations / Domains\n// - `<BillingPanel>` — Current subscription + plan catalogue\n// Apps mount this at their `/settings` route; feature toggles hide sections\n// that a given user's role cannot access.\n// =============================================================================\n\nimport { useEffect, useMemo, useState } from 'react'\nimport { useTranslations } from '@ui/lib/i18n-context'\nimport { SegmentedControl, InlineSpinner } from '@ui/index'\nimport type { AdminClient, AuthOrganization } from '@datatechsolutions/shared-domain'\n\nimport { useAuth } from '../../_auth'\nimport { UserProfile } from '../auth/user-profile'\nimport { AdminOrganizationDetail } from '../admin/admin-organization-detail'\nimport { BillingPanel, type BillingPanelProps } from '../billing/billing-panel'\n\nexport type PlatformSettingsSection = 'account' | 'organization' | 'billing'\n\nexport interface PlatformSettingsProps {\n /**\n * Sections to surface to the current user. The host app is responsible for\n * picking the right set based on RBAC — e.g. hide `organization` for users\n * without `org:manage` and hide `billing` for users without `billing:read`.\n * Defaults to all three.\n */\n sections?: PlatformSettingsSection[]\n /** Starting section. Defaults to the first item in `sections`. */\n defaultSection?: PlatformSettingsSection\n /**\n * Windsock admin API client. Required when `organization` is in `sections`.\n * Create it once with `createAdminClient({ issuer, authClient })` and reuse.\n */\n adminClient?: AdminClient\n /**\n * Current organization id (usually `ctx.organizationId` from the JWT).\n * Required when `organization` is in `sections`.\n */\n organizationId?: string\n /** Forwarded to `<BillingPanel>` — e.g. redirect handler, billing interval. */\n billing?: BillingPanelProps\n}\n\nconst DEFAULT_SECTIONS: PlatformSettingsSection[] = ['account', 'organization', 'billing']\n\nexport function PlatformSettings({\n sections = DEFAULT_SECTIONS,\n defaultSection,\n adminClient,\n organizationId,\n billing,\n}: PlatformSettingsProps) {\n const t = useTranslations('windsock')\n const { status } = useAuth()\n\n const visibleSections = useMemo(() => {\n // Drop `organization` if the caller didn't pass an admin client + org id.\n return sections.filter((section) => {\n if (section === 'organization') {\n return Boolean(adminClient && organizationId)\n }\n return true\n })\n }, [sections, adminClient, organizationId])\n\n const initialSection: PlatformSettingsSection = (\n defaultSection && visibleSections.includes(defaultSection)\n ? defaultSection\n : visibleSections[0] ?? 'account'\n )\n\n const [activeSection, setActiveSection] = useState<PlatformSettingsSection>(initialSection)\n const [organization, setOrganization] = useState<AuthOrganization | null>(null)\n const [orgLoadError, setOrgLoadError] = useState<string | null>(null)\n\n // Resolve the org detail record (AdminOrganizationDetail needs the full\n // AuthOrganization, not just the id). Fires once the organization tab is\n // first selected so the listOrganizations round-trip is lazy.\n useEffect(() => {\n if (activeSection !== 'organization') return\n if (!adminClient || !organizationId) return\n if (organization?.id === organizationId) return\n\n let cancelled = false\n setOrgLoadError(null)\n void adminClient.listOrganizations()\n .then((orgs) => {\n if (cancelled) return\n const match = orgs.find((org) => org.id === organizationId)\n if (match) {\n setOrganization(match)\n } else {\n setOrgLoadError('Organization not found')\n }\n })\n .catch((loadError: unknown) => {\n if (cancelled) return\n setOrgLoadError(loadError instanceof Error ? loadError.message : String(loadError))\n })\n return () => {\n cancelled = true\n }\n }, [activeSection, adminClient, organizationId, organization?.id])\n\n if (status === 'loading') {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n }\n\n if (status !== 'authenticated') {\n return null\n }\n\n if (visibleSections.length === 0) {\n return null\n }\n\n const segments = visibleSections.map((section) => ({\n value: section,\n label: t(`platformSettings.sections.${section}`),\n }))\n\n return (\n <div className=\"space-y-6\">\n {visibleSections.length > 1 && (\n <SegmentedControl\n segments={segments}\n value={activeSection}\n onChange={(value: string) => setActiveSection(value as PlatformSettingsSection)}\n fullWidth\n />\n )}\n\n {activeSection === 'account' && <UserProfile />}\n\n {activeSection === 'organization' && adminClient && organizationId && (\n organization ? (\n <AdminOrganizationDetail\n client={adminClient}\n organization={organization}\n />\n ) : orgLoadError ? (\n <div\n role=\"alert\"\n className=\"rounded-xl border border-red-300/40 bg-red-50/80 px-4 py-3 text-sm text-red-700 dark:border-red-500/30 dark:bg-red-500/10 dark:text-red-300\"\n >\n {orgLoadError}\n </div>\n ) : (\n <div className=\"flex items-center justify-center py-12\">\n <InlineSpinner />\n </div>\n )\n )}\n\n {activeSection === 'billing' && <BillingPanel {...billing} />}\n </div>\n )\n}\n"]}
@@ -1,8 +1,8 @@
1
1
  "use client";
2
- import { NodeRunningIndicator, WorkflowHandle, NodeCard, NodeCardHeader, NodeCardMeta, NodeInteractiveCard, NodeIconBubble, NodeCardBadge, NodeCardDeleteAction, Workspace, useModalStore, CATEGORY_COLORS, CATEGORY_PILL_COLORS, ICON_MAP, WorkflowCanvas, EXPERIMENTAL_NODE_TYPES, getEntityIcon, getEntityGradient, useWorkflowStore, LOGIC_ICON_MAP, LOGIC_NODE_GRADIENTS, getFrameworkMeta, getCompatibleModels, isModelCompatibleWithFramework, FRAMEWORK_META, isFrameworkCompatibleWithProviders } from './chunk-TRNDFSM6.mjs';
3
- import { FormInput, FormSelect, Avatar, ToggleSwitch, HeroBlock, GlassModal, SectionCard, FormTextarea, FormGrid, Input, DynamicIslandConfirm } from './chunk-QEACOJXX.mjs';
2
+ import { NodeRunningIndicator, WorkflowHandle, NodeCard, NodeCardHeader, NodeCardMeta, NodeInteractiveCard, NodeIconBubble, NodeCardBadge, NodeCardDeleteAction, Workspace, useModalStore, CATEGORY_COLORS, CATEGORY_PILL_COLORS, ICON_MAP, WorkflowCanvas, EXPERIMENTAL_NODE_TYPES, getEntityIcon, getEntityGradient, useWorkflowStore, LOGIC_ICON_MAP, LOGIC_NODE_GRADIENTS, getFrameworkMeta, getCompatibleModels, isModelCompatibleWithFramework, FRAMEWORK_META, isFrameworkCompatibleWithProviders } from './chunk-MSXJFWKD.mjs';
3
+ import { FormInput, FormSelect, Avatar, ToggleSwitch, HeroBlock, GlassModal, SectionCard, FormTextarea, FormGrid, Input, DynamicIslandConfirm, SelectionCard } from './chunk-QCGSE24W.mjs';
4
4
  import { useTranslations } from './chunk-ZEFNBGYI.mjs';
5
- import { Badge, Button, IconButton } from './chunk-O4RZCDP2.mjs';
5
+ import { Badge, Button, IconButton } from './chunk-2SBVFLPZ.mjs';
6
6
  import { getAgentTier, createDefaultLogicNodeConfig } from './chunk-G7JQ4OCE.mjs';
7
7
  import { memo, useCallback, useMemo, useState, useEffect, useRef, Children } from 'react';
8
8
  import { Position } from '@xyflow/react';
@@ -40,8 +40,8 @@ var ModelProviderFlowNode = memo(function ModelProviderFlowNode2({ id, data, sel
40
40
  if (!config) {
41
41
  return /* @__PURE__ */ jsxs(Fragment, { children: [
42
42
  /* @__PURE__ */ jsx(NodeRunningIndicator, { nodeId: id }),
43
- /* @__PURE__ */ jsx(WorkflowHandle, { type: "target", position: Position.Left, id: "left-in", colorClass: "!bg-gray-400 dark:!bg-gray-500" }),
44
- /* @__PURE__ */ jsx(WorkflowHandle, { type: "target", position: Position.Top, id: "top-in", colorClass: "!bg-gray-400 dark:!bg-gray-500" }),
43
+ /* @__PURE__ */ jsx(WorkflowHandle, { type: "target", position: Position.Left, id: "left-in", colorClass: "!bg-slate-400 dark:!bg-slate-500" }),
44
+ /* @__PURE__ */ jsx(WorkflowHandle, { type: "target", position: Position.Top, id: "top-in", colorClass: "!bg-slate-400 dark:!bg-slate-500" }),
45
45
  /* @__PURE__ */ jsx(NodeCard, { variant: "error", nodeType: "model_provider", width: "w-[280px]", children: /* @__PURE__ */ jsx(
46
46
  NodeCardHeader,
47
47
  {
@@ -62,8 +62,8 @@ var ModelProviderFlowNode = memo(function ModelProviderFlowNode2({ id, data, sel
62
62
  const logo = PROVIDER_LOGOS[config.providerType];
63
63
  return /* @__PURE__ */ jsxs(Fragment, { children: [
64
64
  /* @__PURE__ */ jsx(NodeRunningIndicator, { nodeId: id }),
65
- /* @__PURE__ */ jsx(WorkflowHandle, { type: "target", position: Position.Left, id: "left-in", colorClass: "!bg-gray-400 dark:!bg-gray-500" }),
66
- /* @__PURE__ */ jsx(WorkflowHandle, { type: "target", position: Position.Top, id: "top-in", colorClass: "!bg-gray-400 dark:!bg-gray-500" }),
65
+ /* @__PURE__ */ jsx(WorkflowHandle, { type: "target", position: Position.Left, id: "left-in", colorClass: "!bg-slate-400 dark:!bg-slate-500" }),
66
+ /* @__PURE__ */ jsx(WorkflowHandle, { type: "target", position: Position.Top, id: "top-in", colorClass: "!bg-slate-400 dark:!bg-slate-500" }),
67
67
  /* @__PURE__ */ jsx(
68
68
  "button",
69
69
  {
@@ -664,23 +664,19 @@ function ConfigTab({ models, t, selectedModelId, setSelectedModelId, selectedFra
664
664
  const isSelected = model.id === selectedModelId;
665
665
  const isCompatible = isModelCompatibleWithFramework(model.id, selectedFramework);
666
666
  const { IconComponent, color, providerLabel } = getModelIcon(model.id);
667
- return /* @__PURE__ */ jsxs(
668
- "button",
667
+ return /* @__PURE__ */ jsx(
668
+ SelectionCard,
669
669
  {
670
- type: "button",
671
- disabled: !isCompatible,
670
+ selected: isSelected,
672
671
  onClick: () => {
673
672
  setSelectedModelId(model.id);
674
673
  markDirty();
675
674
  },
676
- className: `flex items-center gap-2.5 rounded-xl border px-3 py-2.5 text-left transition-all focus:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500/70 focus-visible:ring-offset-1 ${!isCompatible ? "cursor-not-allowed border-slate-200/30 opacity-35 dark:border-white/5" : isSelected ? "border-indigo-500/50 bg-indigo-50/50 ring-1 ring-indigo-500/30 dark:border-indigo-400/40 dark:bg-indigo-500/10" : "border-slate-200/50 bg-white/40 backdrop-blur-sm hover:border-slate-300 dark:border-white/10 dark:bg-white/[0.04] dark:hover:border-white/20"}`,
677
- children: [
678
- /* @__PURE__ */ jsx(IconComponent, { className: `h-5 w-5 flex-shrink-0 ${isSelected && isCompatible ? color : "text-slate-400 dark:text-slate-500"}` }),
679
- /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
680
- /* @__PURE__ */ jsx("p", { className: `truncate text-xs font-semibold ${isSelected && isCompatible ? "text-slate-900 dark:text-white" : "text-slate-600 dark:text-slate-300"}`, children: model.name }),
681
- /* @__PURE__ */ jsx("p", { className: "truncate text-[10px] text-slate-400 dark:text-slate-500", children: providerLabel })
682
- ] })
683
- ]
675
+ layout: "card",
676
+ compatibility: isCompatible ? "compatible" : "incompatible",
677
+ icon: /* @__PURE__ */ jsx(IconComponent, { className: `h-5 w-5 ${isSelected && isCompatible ? color : ""}` }),
678
+ label: model.name,
679
+ description: providerLabel
684
680
  },
685
681
  model.id
686
682
  );
@@ -1575,13 +1571,14 @@ function SubworkflowModal({ onSaved, onMaximize }) {
1575
1571
  ] })
1576
1572
  ] }),
1577
1573
  onMaximize && tool.toolId && /* @__PURE__ */ jsx(
1578
- "button",
1574
+ IconButton,
1579
1575
  {
1580
- type: "button",
1576
+ label: t("subworkflowDrawer.openFullEditor"),
1577
+ variant: "ghost",
1578
+ size: "sm",
1579
+ color: "ios-teal",
1581
1580
  onClick: () => onMaximize(tool.toolId),
1582
- title: t("subworkflowDrawer.openFullEditor"),
1583
- className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-lg text-slate-400 transition-colors hover:bg-white/10 hover:text-teal-500 dark:hover:text-teal-400",
1584
- children: /* @__PURE__ */ jsx(ArrowsPointingOutIcon, { className: "h-4 w-4" })
1581
+ icon: /* @__PURE__ */ jsx(ArrowsPointingOutIcon, { className: "h-4 w-4" })
1585
1582
  }
1586
1583
  )
1587
1584
  ] }) }),
@@ -1891,7 +1888,7 @@ function RunReplayModal({
1891
1888
  }
1892
1889
  };
1893
1890
  const footer = /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2", children: [
1894
- /* @__PURE__ */ jsxs("span", { className: "text-[11px] text-gray-400", children: [
1891
+ /* @__PURE__ */ jsxs("span", { className: "text-[11px] text-slate-400", children: [
1895
1892
  "run ",
1896
1893
  /* @__PURE__ */ jsx("code", { children: runId.slice(0, 8) }),
1897
1894
  " \xB7 wf ",
@@ -1939,7 +1936,7 @@ function RunReplayModal({
1939
1936
  },
1940
1937
  className: "space-y-3",
1941
1938
  children: [
1942
- rows.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: t("replayNoInputs", { _: "This run had no input variables \u2014 replaying will execute the workflow as-is." }) }) : rows.map((row, index) => /* @__PURE__ */ jsx(
1939
+ rows.length === 0 ? /* @__PURE__ */ jsx("p", { className: "text-xs text-slate-500 dark:text-slate-400", children: t("replayNoInputs", { _: "This run had no input variables \u2014 replaying will execute the workflow as-is." }) }) : rows.map((row, index) => /* @__PURE__ */ jsx(
1943
1940
  RowEditor,
1944
1941
  {
1945
1942
  row,
@@ -1961,9 +1958,9 @@ function RowEditor({
1961
1958
  onReset
1962
1959
  }) {
1963
1960
  const isJson = row.kind === "json";
1964
- return /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-gray-200/60 bg-gray-50/60 p-3 dark:border-white/10 dark:bg-white/5", children: [
1961
+ return /* @__PURE__ */ jsxs("div", { className: "rounded-xl border border-slate-200/60 bg-slate-50/60 p-3 dark:border-white/10 dark:bg-white/5", children: [
1965
1962
  /* @__PURE__ */ jsxs("div", { className: "mb-2 flex items-center justify-between gap-2", children: [
1966
- /* @__PURE__ */ jsx("span", { className: "font-mono text-xs text-gray-700 dark:text-gray-200", children: row.key }),
1963
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-xs text-slate-700 dark:text-slate-200", children: row.key }),
1967
1964
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
1968
1965
  /* @__PURE__ */ jsx(Badge, { color: "zinc", size: "xs", className: "uppercase tracking-wider", children: row.kind }),
1969
1966
  row.touched && /* @__PURE__ */ jsx(Button, { type: "button", plain: true, size: "xs", onClick: onReset, children: "reset" })
@@ -1974,7 +1971,7 @@ function RowEditor({
1974
1971
  {
1975
1972
  value: row.value,
1976
1973
  onChange: (event) => onChange({ value: event.target.value }),
1977
- className: "w-full rounded-lg border border-gray-200/50 bg-white/70 px-3 py-2 text-sm text-gray-900 dark:border-white/10 dark:bg-gray-800/70 dark:text-gray-100",
1974
+ className: "w-full rounded-lg border border-slate-200/50 bg-white/70 px-3 py-2 text-sm text-slate-900 dark:border-white/10 dark:bg-slate-800/70 dark:text-slate-100",
1978
1975
  children: [
1979
1976
  /* @__PURE__ */ jsx("option", { value: "true", children: "true" }),
1980
1977
  /* @__PURE__ */ jsx("option", { value: "false", children: "false" })
@@ -3394,30 +3391,27 @@ function WorkflowListBar({
3394
3391
  children: [
3395
3392
  /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
3396
3393
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
3397
- /* @__PURE__ */ jsx("span", { className: `truncate text-sm font-medium ${isActive ? "text-indigo-700 dark:text-indigo-300" : "text-gray-700 dark:text-gray-300"}`, children: workflow.name }),
3394
+ /* @__PURE__ */ jsx("span", { className: `truncate text-sm font-medium ${isActive ? "text-indigo-700 dark:text-indigo-300" : "text-slate-700 dark:text-slate-300"}`, children: workflow.name }),
3398
3395
  /* @__PURE__ */ jsxs("span", { className: "shrink-0 rounded-full bg-slate-500/15 px-1.5 py-0.5 text-[10px] font-medium text-slate-700 dark:bg-slate-500/20 dark:text-slate-300", children: [
3399
3396
  "v",
3400
3397
  workflow.version
3401
3398
  ] }),
3402
3399
  workflow.isDraft ? /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded-full bg-amber-500/15 px-1.5 py-0.5 text-[10px] font-semibold text-amber-700 dark:bg-amber-500/20 dark:text-amber-300", children: tWorkflow("draftBadge") }) : /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded-full bg-emerald-500/15 px-1.5 py-0.5 text-[10px] font-semibold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-300", children: tWorkflow("published") })
3403
3400
  ] }),
3404
- /* @__PURE__ */ jsx("p", { className: "mt-0.5 text-[10px] text-gray-400 dark:text-gray-500", children: workflow.updatedAt ? formatRelativeTime(typeof workflow.updatedAt === "string" ? workflow.updatedAt : workflow.updatedAt.toISOString()) : "" })
3401
+ /* @__PURE__ */ jsx("p", { className: "mt-0.5 text-[10px] text-slate-400 dark:text-slate-500", children: workflow.updatedAt ? formatRelativeTime(typeof workflow.updatedAt === "string" ? workflow.updatedAt : workflow.updatedAt.toISOString()) : "" })
3405
3402
  ] }),
3406
3403
  /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity group-hover:opacity-100", children: [
3407
- onConvertToSubworkflow && /* @__PURE__ */ jsx(
3408
- "button",
3404
+ onConvertToSubworkflow && /* @__PURE__ */ jsx("div", { onClick: (event) => event.stopPropagation(), children: /* @__PURE__ */ jsx(
3405
+ IconButton,
3409
3406
  {
3410
- type: "button",
3411
- onClick: (event) => {
3412
- event.stopPropagation();
3413
- onConvertToSubworkflow(workflow);
3414
- },
3415
- className: "rounded-md p-1 text-gray-400 transition-colors hover:bg-teal-50 hover:text-teal-600 dark:hover:bg-teal-950/30 dark:hover:text-teal-400",
3416
- "aria-label": `${tWorkflow("convertToSubworkflow")} ${workflow.name}`,
3417
- title: tWorkflow("convertToSubworkflow"),
3418
- children: /* @__PURE__ */ jsx(ArrowPathRoundedSquareIcon, { className: "h-3.5 w-3.5" })
3407
+ label: `${tWorkflow("convertToSubworkflow")} ${workflow.name}`,
3408
+ variant: "ghost",
3409
+ size: "sm",
3410
+ color: "ios-teal",
3411
+ onClick: () => onConvertToSubworkflow(workflow),
3412
+ icon: /* @__PURE__ */ jsx(ArrowPathRoundedSquareIcon, { className: "h-3.5 w-3.5" })
3419
3413
  }
3420
- ),
3414
+ ) }),
3421
3415
  workflows.length > 1 && /* @__PURE__ */ jsx("div", { onClick: (event) => event.stopPropagation(), children: /* @__PURE__ */ jsx(
3422
3416
  IconButton,
3423
3417
  {
@@ -3440,7 +3434,7 @@ function WorkflowListBar({
3440
3434
  {
3441
3435
  type: "button",
3442
3436
  onClick: onCreate,
3443
- className: "liquid-surface flex shrink-0 items-center gap-1.5 rounded-xl !border-dashed px-3 py-2 text-xs font-medium text-gray-500 transition-all hover:shadow-md hover:text-indigo-600 dark:text-gray-400 dark:hover:text-indigo-400",
3437
+ className: "liquid-surface flex shrink-0 items-center gap-1.5 rounded-xl !border-dashed px-3 py-2 text-xs font-medium text-slate-500 transition-all hover:shadow-md hover:text-indigo-600 dark:text-slate-400 dark:hover:text-indigo-400",
3444
3438
  children: [
3445
3439
  /* @__PURE__ */ jsx(PlusIcon, { className: "h-3.5 w-3.5" }),
3446
3440
  tWorkflow("newWorkflow")
@@ -4659,15 +4653,15 @@ function DslImportModal({ open, onClose, onImport }) {
4659
4653
  onDragLeave: handleDragLeave,
4660
4654
  onDrop: handleDrop,
4661
4655
  onClick: handleClickUpload,
4662
- className: `cursor-pointer rounded-xl border-2 border-dashed p-8 text-center transition-colors duration-200 ${isDragActive ? "border-blue-400 bg-blue-50 dark:border-blue-500 dark:bg-blue-500/10" : "border-gray-300 hover:border-gray-400 dark:border-gray-600 dark:hover:border-gray-500"}`,
4656
+ className: `cursor-pointer rounded-xl border-2 border-dashed p-8 text-center transition-colors duration-200 ${isDragActive ? "border-blue-400 bg-blue-50 dark:border-blue-500 dark:bg-blue-500/10" : "border-slate-300 hover:border-slate-400 dark:border-slate-600 dark:hover:border-slate-500"}`,
4663
4657
  "data-testid": "import-dropzone",
4664
4658
  role: "button",
4665
4659
  tabIndex: 0,
4666
4660
  "aria-label": translations("dropzone"),
4667
4661
  children: [
4668
- /* @__PURE__ */ jsx(ArrowUpTrayIcon, { className: "mx-auto h-10 w-10 text-gray-400 dark:text-gray-500" }),
4669
- /* @__PURE__ */ jsx("p", { className: "mt-3 text-sm font-medium text-gray-700 dark:text-gray-300", children: translations("dropzone") }),
4670
- /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-gray-500 dark:text-gray-400", children: translations("dropzoneHint") }),
4662
+ /* @__PURE__ */ jsx(ArrowUpTrayIcon, { className: "mx-auto h-10 w-10 text-slate-400 dark:text-slate-500" }),
4663
+ /* @__PURE__ */ jsx("p", { className: "mt-3 text-sm font-medium text-slate-700 dark:text-slate-300", children: translations("dropzone") }),
4664
+ /* @__PURE__ */ jsx("p", { className: "mt-1 text-xs text-slate-500 dark:text-slate-400", children: translations("dropzoneHint") }),
4671
4665
  /* @__PURE__ */ jsx(
4672
4666
  "input",
4673
4667
  {
@@ -4683,7 +4677,7 @@ function DslImportModal({ open, onClose, onImport }) {
4683
4677
  }
4684
4678
  ) : /* @__PURE__ */ jsxs("div", { "data-testid": "import-validation-result", children: [
4685
4679
  /* @__PURE__ */ jsxs("div", { className: "mb-4 flex items-center justify-between", children: [
4686
- /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-gray-700 dark:text-gray-300", children: fileName }),
4680
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300", children: fileName }),
4687
4681
  /* @__PURE__ */ jsx(Button, { type: "button", plain: true, size: "sm", onClick: handleReset, children: translations("chooseAnother") })
4688
4682
  ] }),
4689
4683
  validationResult.isValid ? /* @__PURE__ */ jsxs("div", { className: "rounded-lg border border-green-200 bg-green-50 p-4 dark:border-green-800 dark:bg-green-900/20", children: [
@@ -4711,7 +4705,7 @@ function DslImportModal({ open, onClose, onImport }) {
4711
4705
  /* @__PURE__ */ jsx("ul", { className: "mt-2 space-y-1", children: validationResult.errors.map((validationError, index) => /* @__PURE__ */ jsx("li", { className: "text-xs text-red-600 dark:text-red-400", children: validationError }, index)) })
4712
4706
  ] })
4713
4707
  ] }) }),
4714
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-3 border-t border-gray-200 px-1 py-4 dark:border-gray-700", children: [
4708
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-end gap-3 border-t border-slate-200 px-1 py-4 dark:border-slate-700", children: [
4715
4709
  /* @__PURE__ */ jsx(Button, { type: "button", onClick: onClose, outline: true, size: "sm", "data-testid": "import-cancel-button", children: translations("cancel") }),
4716
4710
  /* @__PURE__ */ jsxs(
4717
4711
  Button,
@@ -5021,5 +5015,5 @@ function useHelpLines() {
5021
5015
  }
5022
5016
 
5023
5017
  export { AgentModal, AmazonNovaIcon, AnthropicModelIcon, AutoSaveWorkspace, DslExportModal, DslImportModal, DynamicIslandConfirm2 as DynamicIslandConfirm, ExecutionTimelinePanel, MetaLlamaIcon, ModelProviderFlowNode, NodePalette, OutputSchemaBuilder, PipelineSettingsModal, PreviewPanel, RULE_STATUS_OPTIONS, RuleActionBuilder, RuleConditionBuilder, RuleForm, RunInputDialog, RunPanel, RunReplayModal, S3WriteFlowNode, SaveStatusBadge, SubworkflowModal, TIMEZONE_OPTIONS, VariableInspector, VersionHistoryPanel, WorkflowListBar, defaultAgentOutputSchema, defaultRuleAction, defaultRuleCondition, defaultRuleForm, getModelIcon, useCanRedo, useCanUndo, useCanvasShortcuts, useClipboard, useContextMenu, useEditingNodeId, useHasCopied, useHelpLines, useIsRunning, useNodeResults, useSelectedNodeCount, useSubworkflowStore, useUndoRedo };
5024
- //# sourceMappingURL=chunk-RSCRIDMW.mjs.map
5025
- //# sourceMappingURL=chunk-RSCRIDMW.mjs.map
5018
+ //# sourceMappingURL=chunk-SMUBE3RO.mjs.map
5019
+ //# sourceMappingURL=chunk-SMUBE3RO.mjs.map