@datatechsolutions/ui 3.2.1 → 3.4.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.
- package/dist/astrlabe/contracts.d.mts +31 -3
- package/dist/astrlabe/contracts.d.ts +31 -3
- package/dist/astrlabe/index.d.mts +22 -30
- package/dist/astrlabe/index.d.ts +22 -30
- package/dist/astrlabe/index.js +121 -121
- package/dist/astrlabe/index.mjs +7 -7
- package/dist/astrlabe/utils.js +9 -9
- package/dist/astrlabe/utils.mjs +2 -2
- package/dist/astrlabe/workflow-canvas.d.mts +6 -69
- package/dist/astrlabe/workflow-canvas.d.ts +6 -69
- package/dist/astrlabe/workflow-canvas.js +6 -6
- package/dist/astrlabe/workflow-canvas.mjs +5 -5
- package/dist/brand/index.d.mts +1 -15
- package/dist/brand/index.d.ts +1 -15
- package/dist/brand/index.js +0 -14
- package/dist/brand/index.js.map +1 -1
- package/dist/brand/index.mjs +0 -14
- package/dist/brand/index.mjs.map +1 -1
- package/dist/{chunk-FAGDZEKM.js → chunk-2OZZH2IO.js} +2 -2
- package/dist/chunk-2OZZH2IO.js.map +1 -0
- package/dist/{chunk-SYNVNTLJ.mjs → chunk-3AY5HIQ6.mjs} +2 -2
- package/dist/chunk-3AY5HIQ6.mjs.map +1 -0
- package/dist/{chunk-JSNRCYSO.js → chunk-45QAUEYT.js} +4 -4
- package/dist/{chunk-JSNRCYSO.js.map → chunk-45QAUEYT.js.map} +1 -1
- package/dist/{chunk-B67DP7MI.mjs → chunk-4GDWGWHY.mjs} +4 -4
- package/dist/{chunk-B67DP7MI.mjs.map → chunk-4GDWGWHY.mjs.map} +1 -1
- package/dist/{chunk-KR2X2WHJ.js → chunk-4ICEQJH4.js} +53 -53
- package/dist/{chunk-KR2X2WHJ.js.map → chunk-4ICEQJH4.js.map} +1 -1
- package/dist/{chunk-RXZNACMI.js → chunk-6MBWKOPF.js} +33 -33
- package/dist/{chunk-RXZNACMI.js.map → chunk-6MBWKOPF.js.map} +1 -1
- package/dist/{chunk-C3H4FM4A.js → chunk-72SWXOD5.js} +15 -2
- package/dist/chunk-72SWXOD5.js.map +1 -0
- package/dist/{chunk-JN6IL6OH.mjs → chunk-AGGOHPMZ.mjs} +1054 -5229
- package/dist/chunk-AGGOHPMZ.mjs.map +1 -0
- package/dist/{chunk-5GDKCFM5.mjs → chunk-AL73YAV4.mjs} +3 -3
- package/dist/{chunk-5GDKCFM5.mjs.map → chunk-AL73YAV4.mjs.map} +1 -1
- package/dist/{chunk-ZJPNP2YW.mjs → chunk-BUDZNAKL.mjs} +2 -2
- package/dist/chunk-BUDZNAKL.mjs.map +1 -0
- package/dist/{chunk-OL73LBX5.mjs → chunk-BW67WFHT.mjs} +3 -4
- package/dist/chunk-BW67WFHT.mjs.map +1 -0
- package/dist/{chunk-W5OEBO6E.js → chunk-CF7GOUBQ.js} +13 -14
- package/dist/chunk-CF7GOUBQ.js.map +1 -0
- package/dist/{chunk-IRPS5UCS.mjs → chunk-CUWPLPVY.mjs} +3 -3
- package/dist/{chunk-IRPS5UCS.mjs.map → chunk-CUWPLPVY.mjs.map} +1 -1
- package/dist/{chunk-NJS2YC3J.js → chunk-DJDZIRM6.js} +12 -2
- package/dist/chunk-DJDZIRM6.js.map +1 -0
- package/dist/{chunk-RL35XATZ.js → chunk-ERCDMBRT.js} +702 -647
- package/dist/chunk-ERCDMBRT.js.map +1 -0
- package/dist/{chunk-I2NZGVBG.js → chunk-FSBR4RCK.js} +1101 -5313
- package/dist/chunk-FSBR4RCK.js.map +1 -0
- package/dist/{chunk-5W7L7BT7.mjs → chunk-G7JQ4OCE.mjs} +15 -2
- package/dist/chunk-G7JQ4OCE.mjs.map +1 -0
- package/dist/{chunk-5RM6NGZ6.mjs → chunk-IDEM3DYF.mjs} +3 -3
- package/dist/{chunk-5RM6NGZ6.mjs.map → chunk-IDEM3DYF.mjs.map} +1 -1
- package/dist/{chunk-U7XM3N7F.mjs → chunk-LEXBTVGM.mjs} +12 -2
- package/dist/chunk-LEXBTVGM.mjs.map +1 -0
- package/dist/{chunk-EFOXN3LC.js → chunk-M7KSEUZR.js} +490 -389
- package/dist/chunk-M7KSEUZR.js.map +1 -0
- package/dist/{chunk-AOUUZ52N.js → chunk-MO5FBVV3.js} +85 -86
- package/dist/chunk-MO5FBVV3.js.map +1 -0
- package/dist/{chunk-H2D2CRTD.mjs → chunk-NAFWHJCM.mjs} +8 -8
- package/dist/{chunk-H2D2CRTD.mjs.map → chunk-NAFWHJCM.mjs.map} +1 -1
- package/dist/{chunk-3JJWPOK6.js → chunk-NCLZKVJK.js} +9 -10
- package/dist/chunk-NCLZKVJK.js.map +1 -0
- package/dist/{chunk-R4TQWXNG.mjs → chunk-NVQWHJQH.mjs} +6 -5
- package/dist/chunk-NVQWHJQH.mjs.map +1 -0
- package/dist/{chunk-Y6AEE56Q.js → chunk-PGVZKMOA.js} +69 -69
- package/dist/{chunk-Y6AEE56Q.js.map → chunk-PGVZKMOA.js.map} +1 -1
- package/dist/{chunk-UDDZTTLO.mjs → chunk-QBFE7ABE.mjs} +6 -7
- package/dist/chunk-QBFE7ABE.mjs.map +1 -0
- package/dist/{chunk-3ZUMJTDT.mjs → chunk-RFRXS4PC.mjs} +3 -4
- package/dist/{chunk-3JJWPOK6.js.map → chunk-RFRXS4PC.mjs.map} +1 -1
- package/dist/{chunk-ZV5EZXXO.mjs → chunk-RHRJXK5R.mjs} +3 -3
- package/dist/{chunk-ZV5EZXXO.mjs.map → chunk-RHRJXK5R.mjs.map} +1 -1
- package/dist/{chunk-SU3YPWFW.js → chunk-RLLP7VQJ.js} +26 -26
- package/dist/{chunk-SU3YPWFW.js.map → chunk-RLLP7VQJ.js.map} +1 -1
- package/dist/{chunk-YIB2YAM5.mjs → chunk-RLVOG5OQ.mjs} +3 -3
- package/dist/{chunk-YIB2YAM5.mjs.map → chunk-RLVOG5OQ.mjs.map} +1 -1
- package/dist/{chunk-QYA53LUF.mjs → chunk-SEYUYGER.mjs} +571 -517
- package/dist/chunk-SEYUYGER.mjs.map +1 -0
- package/dist/{chunk-YV72JM4B.mjs → chunk-SQ4KGLBZ.mjs} +4 -4
- package/dist/{chunk-YV72JM4B.mjs.map → chunk-SQ4KGLBZ.mjs.map} +1 -1
- package/dist/{chunk-F54Q2YJY.js → chunk-SY4MUT5V.js} +7 -7
- package/dist/{chunk-F54Q2YJY.js.map → chunk-SY4MUT5V.js.map} +1 -1
- package/dist/{chunk-ZM5MVWIT.js → chunk-TUQLZ4QD.js} +5 -6
- package/dist/chunk-TUQLZ4QD.js.map +1 -0
- package/dist/{chunk-TVMLV675.js → chunk-UE2RDQIK.js} +98 -95
- package/dist/chunk-UE2RDQIK.js.map +1 -0
- package/dist/{chunk-HDCUWUNH.js → chunk-UJVDI66K.js} +28 -27
- package/dist/chunk-UJVDI66K.js.map +1 -0
- package/dist/{chunk-IRT4T3CU.mjs → chunk-VV6SYMPM.mjs} +423 -321
- package/dist/chunk-VV6SYMPM.mjs.map +1 -0
- package/dist/{chunk-HZ4LOVHM.js → chunk-VY52Y5GC.js} +2 -2
- package/dist/chunk-VY52Y5GC.js.map +1 -0
- package/dist/{chunk-LEKZUS6N.mjs → chunk-X3GW7UPN.mjs} +4 -5
- package/dist/chunk-X3GW7UPN.mjs.map +1 -0
- package/dist/{chunk-RGI74SQH.js → chunk-Y2AYFG4E.js} +4 -4
- package/dist/{chunk-RGI74SQH.js.map → chunk-Y2AYFG4E.js.map} +1 -1
- package/dist/{chunk-TIJJHW2Z.js → chunk-YV7F7IXG.js} +36 -36
- package/dist/{chunk-TIJJHW2Z.js.map → chunk-YV7F7IXG.js.map} +1 -1
- package/dist/{chunk-MVBIAXVN.mjs → chunk-ZKSDDFHG.mjs} +14 -11
- package/dist/chunk-ZKSDDFHG.mjs.map +1 -0
- package/dist/{index-VI9gyJXl.d.mts → index-BNRGVAS5.d.mts} +9 -2
- package/dist/index-BoebbJ44.d.mts +49 -0
- package/dist/index-BoebbJ44.d.ts +49 -0
- package/dist/{index-CoB18TbG.d.ts → index-CnCY-b5V.d.ts} +9 -2
- package/dist/index.d.mts +399 -548
- package/dist/index.d.ts +399 -548
- package/dist/index.js +727 -887
- package/dist/index.mjs +3 -3
- package/dist/platform/admin/index.js +12 -12
- package/dist/platform/admin/index.mjs +6 -6
- package/dist/platform/agents-workspace.js +10 -10
- package/dist/platform/agents-workspace.mjs +9 -9
- package/dist/platform/app-shell.js +5 -5
- package/dist/platform/app-shell.mjs +4 -4
- package/dist/platform/auth/index.js +29 -29
- package/dist/platform/auth/index.mjs +6 -6
- package/dist/platform/billing/index.js +5 -5
- package/dist/platform/billing/index.mjs +4 -4
- package/dist/platform/impersonation/index.js +5 -5
- package/dist/platform/impersonation/index.mjs +4 -4
- package/dist/platform/index.d.mts +3 -39
- package/dist/platform/index.d.ts +3 -39
- package/dist/platform/index.js +102 -4812
- package/dist/platform/index.js.map +1 -1
- package/dist/platform/index.mjs +25 -4730
- package/dist/platform/index.mjs.map +1 -1
- package/dist/platform/pages/index.d.mts +4 -4
- package/dist/platform/pages/index.d.ts +4 -4
- package/dist/platform/pages/index.js +199 -199
- package/dist/platform/pages/index.mjs +11 -11
- package/dist/platform/rbac.d.mts +2 -1
- package/dist/platform/rbac.d.ts +2 -1
- package/dist/platform/rbac.js +2 -2
- package/dist/platform/rbac.mjs +1 -1
- package/dist/platform/settings/index.js +9 -9
- package/dist/platform/settings/index.mjs +8 -8
- package/dist/platform/utils/index.js +3 -3
- package/dist/platform/utils/index.js.map +1 -1
- package/dist/platform/utils/index.mjs +1 -1
- package/dist/platform/utils/index.mjs.map +1 -1
- package/dist/platform/workflow-api-client.d.mts +2 -2
- package/dist/platform/workflow-api-client.d.ts +2 -2
- package/dist/platform/workflow-api-client.js +62 -62
- package/dist/platform/workflow-api-client.mjs +2 -2
- package/dist/platform/workflow-canvas-shell.js +7 -7
- package/dist/platform/workflow-canvas-shell.mjs +6 -6
- package/dist/{workflow-api-client-DoYj7nHz.d.mts → workflow-api-client-CpFl3WcG.d.mts} +1 -1
- package/dist/{workflow-api-client-BKD8OfP_.d.ts → workflow-api-client-uLICOanv.d.ts} +1 -1
- package/dist/workflow-canvas--qaYKuMm.d.ts +113 -0
- package/dist/workflow-canvas-B80fmD_n.d.mts +113 -0
- package/package.json +15 -5
- package/src/styles/liquid-glass.css +283 -2
- package/dist/chunk-3ZUMJTDT.mjs.map +0 -1
- package/dist/chunk-5W7L7BT7.mjs.map +0 -1
- package/dist/chunk-AOUUZ52N.js.map +0 -1
- package/dist/chunk-C3H4FM4A.js.map +0 -1
- package/dist/chunk-EFOXN3LC.js.map +0 -1
- package/dist/chunk-FAGDZEKM.js.map +0 -1
- package/dist/chunk-HDCUWUNH.js.map +0 -1
- package/dist/chunk-HZ4LOVHM.js.map +0 -1
- package/dist/chunk-I2NZGVBG.js.map +0 -1
- package/dist/chunk-IRT4T3CU.mjs.map +0 -1
- package/dist/chunk-JN6IL6OH.mjs.map +0 -1
- package/dist/chunk-LEKZUS6N.mjs.map +0 -1
- package/dist/chunk-MVBIAXVN.mjs.map +0 -1
- package/dist/chunk-NJS2YC3J.js.map +0 -1
- package/dist/chunk-OL73LBX5.mjs.map +0 -1
- package/dist/chunk-QYA53LUF.mjs.map +0 -1
- package/dist/chunk-R4TQWXNG.mjs.map +0 -1
- package/dist/chunk-RL35XATZ.js.map +0 -1
- package/dist/chunk-SYNVNTLJ.mjs.map +0 -1
- package/dist/chunk-TVMLV675.js.map +0 -1
- package/dist/chunk-U7XM3N7F.mjs.map +0 -1
- package/dist/chunk-UDDZTTLO.mjs.map +0 -1
- package/dist/chunk-W5OEBO6E.js.map +0 -1
- package/dist/chunk-ZJPNP2YW.mjs.map +0 -1
- package/dist/chunk-ZM5MVWIT.js.map +0 -1
- package/src/brand/logos/kori-icon.svg +0 -45
- package/src/brand/logos/kori-logo-dark.svg +0 -40
- package/src/brand/logos/kori-logo.svg +0 -43
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { Workspace } from './chunk-
|
|
3
|
-
import { HeroSection, CreateActionButton, EntityCard, InlineForm, FormSelect, Button, GlassModal, FormGrid, FormInput } from './chunk-
|
|
2
|
+
import { Workspace } from './chunk-VV6SYMPM.mjs';
|
|
3
|
+
import { HeroSection, CreateActionButton, EntityCard, InlineForm, FormSelect, Button, GlassModal, FormGrid, FormInput } from './chunk-AGGOHPMZ.mjs';
|
|
4
4
|
import { useLocale } from './chunk-7VJ7CMMT.mjs';
|
|
5
5
|
import { useState } from 'react';
|
|
6
6
|
import { UserGroupIcon, ShieldCheckIcon } from '@heroicons/react/24/outline';
|
|
@@ -206,5 +206,5 @@ function WorkflowWorkspace({ graph }) {
|
|
|
206
206
|
}
|
|
207
207
|
|
|
208
208
|
export { RolesPageView, UsersPageView, WorkflowWorkspace };
|
|
209
|
-
//# sourceMappingURL=chunk-
|
|
210
|
-
//# sourceMappingURL=chunk-
|
|
209
|
+
//# sourceMappingURL=chunk-SQ4KGLBZ.mjs.map
|
|
210
|
+
//# sourceMappingURL=chunk-SQ4KGLBZ.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/platform/pages/users-page-view.tsx","../src/platform/pages/roles-page-view.tsx","../src/platform/workflow-workspace.tsx"],"names":["useState","jsxs","jsx"],"mappings":"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","file":"chunk-YV72JM4B.mjs","sourcesContent":["import { useState, type FormEvent } from 'react'\nimport { UserGroupIcon } from '@heroicons/react/24/outline'\nimport {\n Button,\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n GlassModal,\n FormSelect,\n HeroSection,\n InlineForm,\n} from '@ui/index'\nimport type { UserRole, ManagedUser, UsersPageViewProps } from '@datatechsolutions/shared-domain/common'\n\nconst ROLE_OPTIONS: Array<{ value: UserRole; label: string }> = [\n { value: 'admin', label: 'Admin' },\n { value: 'manager', label: 'Manager' },\n { value: 'analyst', label: 'Analyst' },\n { value: 'viewer', label: 'Viewer' },\n]\n\nexport function UsersPageView({ labels, users, onCreateUser, onUpdateRole }: UsersPageViewProps) {\n const [createOpen, setCreateOpen] = useState(false)\n\n return (\n <div className=\"space-y-4\">\n <HeroSection\n icon={<UserGroupIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-violet-500 to-indigo-600\"\n toolbar={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.create}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n )}\n />\n\n <CreateActionButton\n mode=\"mobile\"\n label={labels.create}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.list}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {users.map((user: ManagedUser) => (\n <EntityCard\n key={user.email}\n accentGradient=\"from-violet-500 to-indigo-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-violet-500/10 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400\">\n <UserGroupIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={user.name}\n subtitle={user.email}\n status={(\n <span\n className={`shrink-0 rounded-full px-2 py-0.5 text-[10px] font-semibold ${\n user.active\n ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300'\n : 'bg-slate-100 text-slate-700 dark:bg-slate-800 dark:text-slate-300'\n }`}\n >\n {user.active ? labels.statusActive : labels.statusInactive}\n </span>\n )}\n footer={(\n <form\n onSubmit={(event) => {\n event.preventDefault()\n const formData = new FormData(event.currentTarget)\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n onUpdateRole({ email: user.email, role })\n }}\n >\n <InlineForm>\n <FormSelect name=\"role\" options={ROLE_OPTIONS} defaultValue={user.role} />\n <Button type=\"submit\" outline size=\"sm\">{labels.save}</Button>\n </InlineForm>\n </form>\n )}\n />\n ))}\n </div>\n </section>\n\n <GlassModal\n open={createOpen}\n onClose={() => setCreateOpen(false)}\n title={labels.create}\n maxWidth=\"lg\"\n showFormFooter\n cancelLabel={labels.list}\n submitLabel={labels.add}\n onSubmit={(event: FormEvent) => {\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const name = String(formData.get('name') ?? '').trim()\n const email = String(formData.get('email') ?? '').trim().toLowerCase()\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n if (!name || !email) return\n onCreateUser({ name, email, role })\n setCreateOpen(false)\n }}\n >\n <FormGrid>\n <FormInput name=\"name\" label={labels.name} placeholder={labels.userNamePlaceholder} required />\n <FormInput name=\"email\" label={labels.email} placeholder={labels.userEmailPlaceholder} required type=\"email\" />\n <FormSelect name=\"role\" label={labels.role} options={ROLE_OPTIONS} />\n </FormGrid>\n </GlassModal>\n </div>\n )\n}\n","import { useState, type FormEvent } from 'react'\nimport { ShieldCheckIcon } from '@heroicons/react/24/outline'\nimport {\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n GlassModal,\n FormSelect,\n HeroSection,\n} from '@ui/index'\nimport type { UserRole, RolesPageViewProps } from '@datatechsolutions/shared-domain/common'\nimport type { PlatformRoleDefinition } from '../rbac'\n\nexport type RolesPageViewExtraProps = {\n /**\n * App-defined role definitions, e.g. `{ admin: { id, label, description }, ... }`.\n * Each app passes the output of its own `createPlatformRbac()` call.\n */\n roleDefinitions: Record<string, PlatformRoleDefinition<string>>\n /**\n * Display options surfaced in the role-assignment modal select. Each\n * entry is `{ value: roleId, label: localizedLabel }`.\n */\n roleOptions: Array<{ value: string; label: string }>\n}\n\nexport function RolesPageView({\n labels,\n users,\n onAssignRole,\n roleDefinitions,\n roleOptions,\n}: RolesPageViewProps & RolesPageViewExtraProps) {\n const [assignOpen, setAssignOpen] = useState(false)\n\n return (\n <div className=\"space-y-4\">\n <HeroSection\n icon={<ShieldCheckIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-emerald-500 to-teal-600\"\n toolbar={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.assign}\n onClick={() => setAssignOpen(true)}\n accent=\"emerald\"\n />\n )}\n />\n\n <CreateActionButton\n mode=\"mobile\"\n label={labels.assign}\n onClick={() => setAssignOpen(true)}\n accent=\"emerald\"\n />\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.definitions}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {Object.values(roleDefinitions).map((role) => (\n <EntityCard\n key={role.id}\n accentGradient=\"from-emerald-500 to-teal-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400\">\n <ShieldCheckIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={role.label}\n subtitle={role.id}\n >\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">{role.description}</p>\n <p className=\"mt-2 text-xs font-medium text-slate-600 dark:text-slate-300\">\n {labels.permissionsEnabled}\n </p>\n </EntityCard>\n ))}\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.current}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {users.map((user) => (\n <EntityCard\n key={user.email}\n accentGradient=\"from-violet-500 to-indigo-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-violet-500/10 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400\">\n <ShieldCheckIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={user.name}\n subtitle={user.email}\n status={(\n <span className=\"shrink-0 rounded-full bg-violet-100 px-2 py-0.5 text-[10px] font-semibold text-violet-700 dark:bg-violet-900/30 dark:text-violet-300\">\n {user.role}\n </span>\n )}\n />\n ))}\n </div>\n </section>\n\n <GlassModal\n open={assignOpen}\n onClose={() => setAssignOpen(false)}\n title={labels.assign}\n maxWidth=\"lg\"\n showFormFooter\n cancelLabel={labels.current}\n submitLabel={labels.apply}\n onSubmit={(event: FormEvent) => {\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const email = String(formData.get('email') ?? '').trim().toLowerCase()\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n if (!email) return\n onAssignRole({ email, role })\n setAssignOpen(false)\n }}\n >\n <FormGrid>\n <FormInput name=\"email\" label={labels.userEmail} placeholder=\"user@company.com\" required />\n <FormSelect name=\"role\" label={labels.role} options={roleOptions} />\n </FormGrid>\n </GlassModal>\n </div>\n )\n}\n","import { Workspace } from '@ui/astrlabe/workflow-canvas'\nimport type { WorkflowGraph as UiWorkflowGraph } from '@ui/astrlabe/contracts'\nimport type { WorkflowWorkspaceProps } from '@datatechsolutions/shared-domain/common'\nimport { useLocale } from '@ui/lib/i18n-context'\n\n/**\n * Thin wrapper that forwards a workflow graph into the visual canvas while\n * threading the active locale from the i18n context. The graph type from\n * `shared-domain` is structurally identical to ui's contract type — the\n * cast keeps callers from having to import both.\n */\nexport function WorkflowWorkspace({ graph }: WorkflowWorkspaceProps) {\n const locale = useLocale()\n return <Workspace initialGraph={graph as unknown as UiWorkflowGraph} locale={locale} />\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/platform/pages/users-page-view.tsx","../src/platform/pages/roles-page-view.tsx","../src/platform/workflow-workspace.tsx"],"names":["useState","jsxs","jsx"],"mappings":"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","file":"chunk-SQ4KGLBZ.mjs","sourcesContent":["import { useState, type FormEvent } from 'react'\nimport { UserGroupIcon } from '@heroicons/react/24/outline'\nimport {\n Button,\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n GlassModal,\n FormSelect,\n HeroSection,\n InlineForm,\n} from '@ui/index'\nimport type { UserRole, ManagedUser, UsersPageViewProps } from '@datatechsolutions/shared-domain/common'\n\nconst ROLE_OPTIONS: Array<{ value: UserRole; label: string }> = [\n { value: 'admin', label: 'Admin' },\n { value: 'manager', label: 'Manager' },\n { value: 'analyst', label: 'Analyst' },\n { value: 'viewer', label: 'Viewer' },\n]\n\nexport function UsersPageView({ labels, users, onCreateUser, onUpdateRole }: UsersPageViewProps) {\n const [createOpen, setCreateOpen] = useState(false)\n\n return (\n <div className=\"space-y-4\">\n <HeroSection\n icon={<UserGroupIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-violet-500 to-indigo-600\"\n toolbar={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.create}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n )}\n />\n\n <CreateActionButton\n mode=\"mobile\"\n label={labels.create}\n onClick={() => setCreateOpen(true)}\n accent=\"violet\"\n />\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.list}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {users.map((user: ManagedUser) => (\n <EntityCard\n key={user.email}\n accentGradient=\"from-violet-500 to-indigo-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-violet-500/10 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400\">\n <UserGroupIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={user.name}\n subtitle={user.email}\n status={(\n <span\n className={`shrink-0 rounded-full px-2 py-0.5 text-[10px] font-semibold ${\n user.active\n ? 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-300'\n : 'bg-slate-100 text-slate-700 dark:bg-slate-800 dark:text-slate-300'\n }`}\n >\n {user.active ? labels.statusActive : labels.statusInactive}\n </span>\n )}\n footer={(\n <form\n onSubmit={(event) => {\n event.preventDefault()\n const formData = new FormData(event.currentTarget)\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n onUpdateRole({ email: user.email, role })\n }}\n >\n <InlineForm>\n <FormSelect name=\"role\" options={ROLE_OPTIONS} defaultValue={user.role} />\n <Button type=\"submit\" outline size=\"sm\">{labels.save}</Button>\n </InlineForm>\n </form>\n )}\n />\n ))}\n </div>\n </section>\n\n <GlassModal\n open={createOpen}\n onClose={() => setCreateOpen(false)}\n title={labels.create}\n maxWidth=\"lg\"\n showFormFooter\n cancelLabel={labels.list}\n submitLabel={labels.add}\n onSubmit={(event: FormEvent) => {\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const name = String(formData.get('name') ?? '').trim()\n const email = String(formData.get('email') ?? '').trim().toLowerCase()\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n if (!name || !email) return\n onCreateUser({ name, email, role })\n setCreateOpen(false)\n }}\n >\n <FormGrid>\n <FormInput name=\"name\" label={labels.name} placeholder={labels.userNamePlaceholder} required />\n <FormInput name=\"email\" label={labels.email} placeholder={labels.userEmailPlaceholder} required type=\"email\" />\n <FormSelect name=\"role\" label={labels.role} options={ROLE_OPTIONS} />\n </FormGrid>\n </GlassModal>\n </div>\n )\n}\n","import { useState, type FormEvent } from 'react'\nimport { ShieldCheckIcon } from '@heroicons/react/24/outline'\nimport {\n CreateActionButton,\n EntityCard,\n FormGrid,\n FormInput,\n GlassModal,\n FormSelect,\n HeroSection,\n} from '@ui/index'\nimport type { UserRole, RolesPageViewProps } from '@datatechsolutions/shared-domain/common'\nimport type { PlatformRoleDefinition } from '../rbac'\n\nexport type RolesPageViewExtraProps = {\n /**\n * App-defined role definitions, e.g. `{ admin: { id, label, description }, ... }`.\n * Each app passes the output of its own `createPlatformRbac()` call.\n */\n roleDefinitions: Record<string, PlatformRoleDefinition<string>>\n /**\n * Display options surfaced in the role-assignment modal select. Each\n * entry is `{ value: roleId, label: localizedLabel }`.\n */\n roleOptions: Array<{ value: string; label: string }>\n}\n\nexport function RolesPageView({\n labels,\n users,\n onAssignRole,\n roleDefinitions,\n roleOptions,\n}: RolesPageViewProps & RolesPageViewExtraProps) {\n const [assignOpen, setAssignOpen] = useState(false)\n\n return (\n <div className=\"space-y-4\">\n <HeroSection\n icon={<ShieldCheckIcon className=\"h-5 w-5\" />}\n label={labels.title}\n title={labels.title}\n subtitle={labels.subtitle}\n gradient=\"from-emerald-500 to-teal-600\"\n toolbar={(\n <CreateActionButton\n mode=\"desktop\"\n label={labels.assign}\n onClick={() => setAssignOpen(true)}\n accent=\"emerald\"\n />\n )}\n />\n\n <CreateActionButton\n mode=\"mobile\"\n label={labels.assign}\n onClick={() => setAssignOpen(true)}\n accent=\"emerald\"\n />\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.definitions}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n {Object.values(roleDefinitions).map((role) => (\n <EntityCard\n key={role.id}\n accentGradient=\"from-emerald-500 to-teal-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-emerald-500/10 text-emerald-600 dark:bg-emerald-500/20 dark:text-emerald-400\">\n <ShieldCheckIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={role.label}\n subtitle={role.id}\n >\n <p className=\"text-xs text-slate-500 dark:text-slate-400\">{role.description}</p>\n <p className=\"mt-2 text-xs font-medium text-slate-600 dark:text-slate-300\">\n {labels.permissionsEnabled}\n </p>\n </EntityCard>\n ))}\n </div>\n </section>\n\n <section className=\"space-y-3\">\n <h3 className=\"text-sm font-semibold text-slate-900 dark:text-slate-100\">{labels.current}</h3>\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {users.map((user) => (\n <EntityCard\n key={user.email}\n accentGradient=\"from-violet-500 to-indigo-700\"\n icon={(\n <div className=\"flex h-11 w-11 items-center justify-center rounded-lg bg-violet-500/10 text-violet-600 dark:bg-violet-500/20 dark:text-violet-400\">\n <ShieldCheckIcon className=\"h-6 w-6\" />\n </div>\n )}\n title={user.name}\n subtitle={user.email}\n status={(\n <span className=\"shrink-0 rounded-full bg-violet-100 px-2 py-0.5 text-[10px] font-semibold text-violet-700 dark:bg-violet-900/30 dark:text-violet-300\">\n {user.role}\n </span>\n )}\n />\n ))}\n </div>\n </section>\n\n <GlassModal\n open={assignOpen}\n onClose={() => setAssignOpen(false)}\n title={labels.assign}\n maxWidth=\"lg\"\n showFormFooter\n cancelLabel={labels.current}\n submitLabel={labels.apply}\n onSubmit={(event: FormEvent) => {\n const formData = new FormData(event.currentTarget as HTMLFormElement)\n const email = String(formData.get('email') ?? '').trim().toLowerCase()\n const role = String(formData.get('role') ?? 'viewer') as UserRole\n if (!email) return\n onAssignRole({ email, role })\n setAssignOpen(false)\n }}\n >\n <FormGrid>\n <FormInput name=\"email\" label={labels.userEmail} placeholder=\"user@company.com\" required />\n <FormSelect name=\"role\" label={labels.role} options={roleOptions} />\n </FormGrid>\n </GlassModal>\n </div>\n )\n}\n","import { Workspace } from '@ui/astrlabe/workflow-canvas'\nimport type { WorkflowGraph as UiWorkflowGraph } from '@ui/astrlabe/contracts'\nimport type { WorkflowWorkspaceProps } from '@datatechsolutions/shared-domain/common'\nimport { useLocale } from '@ui/lib/i18n-context'\n\n/**\n * Thin wrapper that forwards a workflow graph into the visual canvas while\n * threading the active locale from the i18n context. The graph type from\n * `shared-domain` is structurally identical to ui's contract type — the\n * cast keeps callers from having to import both.\n */\nexport function WorkflowWorkspace({ graph }: WorkflowWorkspaceProps) {\n const locale = useLocale()\n return <Workspace initialGraph={graph as unknown as UiWorkflowGraph} locale={locale} />\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunk2OZZH2IO_js = require('./chunk-2OZZH2IO.js');
|
|
5
5
|
var common = require('@datatechsolutions/shared-domain/common');
|
|
6
6
|
|
|
7
7
|
var _authFetch = fetch;
|
|
@@ -20,7 +20,7 @@ async function getCurrentAccessToken() {
|
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
async function buildAuthenticatedApiUrl(path, options = {}) {
|
|
23
|
-
const baseUrl = useExternalWorkflowApi() ? resolveWorkflowApiBaseUrl() :
|
|
23
|
+
const baseUrl = useExternalWorkflowApi() ? resolveWorkflowApiBaseUrl() : chunk2OZZH2IO_js.buildLambdaApiUrl("").replace(/\/$/, "");
|
|
24
24
|
const url = new URL(`${baseUrl}${path}`);
|
|
25
25
|
if (options.includeAccessToken) {
|
|
26
26
|
const token = await getCurrentAccessToken();
|
|
@@ -49,7 +49,7 @@ function getPublishableKey() {
|
|
|
49
49
|
}
|
|
50
50
|
async function request(path, init) {
|
|
51
51
|
const publishableKey = useExternalWorkflowApi() ? getPublishableKey() : null;
|
|
52
|
-
const baseUrl = publishableKey ? resolveWorkflowApiBaseUrl() :
|
|
52
|
+
const baseUrl = publishableKey ? resolveWorkflowApiBaseUrl() : chunk2OZZH2IO_js.buildLambdaApiUrl("").replace(/\/$/, "");
|
|
53
53
|
const headers = {
|
|
54
54
|
"Content-Type": "application/json"
|
|
55
55
|
};
|
|
@@ -75,7 +75,7 @@ async function request(path, init) {
|
|
|
75
75
|
}
|
|
76
76
|
async function requestPublic(path, init) {
|
|
77
77
|
const externalBaseUrl = undefined.VITE_WORKFLOW_API_BASE_URL?.trim();
|
|
78
|
-
const baseUrl = externalBaseUrl && externalBaseUrl.length > 0 ? externalBaseUrl.replace(/\/$/, "") :
|
|
78
|
+
const baseUrl = externalBaseUrl && externalBaseUrl.length > 0 ? externalBaseUrl.replace(/\/$/, "") : chunk2OZZH2IO_js.buildLambdaApiUrl("").replace(/\/$/, "");
|
|
79
79
|
const response = await fetch(`${baseUrl}${path}`, {
|
|
80
80
|
...init,
|
|
81
81
|
credentials: "include",
|
|
@@ -431,7 +431,7 @@ function subscribeToRunEvents(runId, onEvent, onError, onState) {
|
|
|
431
431
|
};
|
|
432
432
|
const connect = () => {
|
|
433
433
|
if (cancelled) return;
|
|
434
|
-
const baseUrl =
|
|
434
|
+
const baseUrl = chunk2OZZH2IO_js.buildLambdaApiUrl("").replace(/\/$/, "");
|
|
435
435
|
const url = `${baseUrl}/workflow-runs/${encodeURIComponent(runId)}/events`;
|
|
436
436
|
const source = new EventSource(url, { withCredentials: true });
|
|
437
437
|
currentSource = source;
|
|
@@ -632,5 +632,5 @@ exports.updateAgentTool = updateAgentTool;
|
|
|
632
632
|
exports.updateAgentToolDefinition = updateAgentToolDefinition;
|
|
633
633
|
exports.updateModelProviderConnection = updateModelProviderConnection;
|
|
634
634
|
exports.updateWorkflowSettings = updateWorkflowSettings;
|
|
635
|
-
//# sourceMappingURL=chunk-
|
|
636
|
-
//# sourceMappingURL=chunk-
|
|
635
|
+
//# sourceMappingURL=chunk-SY4MUT5V.js.map
|
|
636
|
+
//# sourceMappingURL=chunk-SY4MUT5V.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/platform/workflow-api-client.ts"],"names":["buildLambdaApiUrl","HttpResponseError"],"mappings":"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","file":"chunk-F54Q2YJY.js","sourcesContent":["import type {\n AgentModel,\n AgentRule,\n AgentTool,\n WorkflowTool,\n VariableValue,\n Workflow,\n WorkflowGraph,\n WorkflowRun,\n} from '@ui/astrlabe/contracts'\nimport type { AgentWithPrompts } from '@ui/astrlabe'\nimport type { AgentPrompt } from '@datatechsolutions/shared-domain/ports/workflow'\nimport type { AgentConfigLike, DataSource } from '@datatechsolutions/shared-domain/common'\nimport { HttpResponseError } from '@datatechsolutions/shared-domain/common'\nimport { buildLambdaApiUrl } from './utils/lambda-endpoint'\nimport type { DatasourceFormData } from './pages/datasource-modal'\n\n// ---------------------------------------------------------------------------\n// Module-level authenticated fetch — set by setAuthenticatedFetch() during\n// provider initialization. This lets plain async functions (non-hooks) make\n// authenticated API calls without needing React context.\n// ---------------------------------------------------------------------------\nlet _authFetch: typeof fetch = fetch\n\n/**\n * Register an authenticated fetch function (call once from a provider/layout).\n * After this, all workflow API calls automatically include the JWT token.\n */\nexport function setAuthenticatedFetch(authFetch: typeof fetch): void {\n _authFetch = authFetch\n}\n\n// ---------------------------------------------------------------------------\n// Access token provider — used by SSE (EventSource cannot set headers, so\n// we pass the token as `?accessToken=<token>` on the event stream URL).\n// ---------------------------------------------------------------------------\n\nlet _tokenProvider: () => Promise<string | null> = async () => null\n\nexport function setAccessTokenProvider(provider: () => Promise<string | null>): void {\n _tokenProvider = provider\n}\n\nexport async function getCurrentAccessToken(): Promise<string | null> {\n try {\n return await _tokenProvider()\n } catch {\n return null\n }\n}\n\n/**\n * Build a full URL for a workflow API path, optionally appending the current\n * access token as a query parameter. Useful for APIs that require auth but\n * cannot set custom headers (EventSource, direct links).\n */\nexport async function buildAuthenticatedApiUrl(\n path: string,\n options: { includeAccessToken?: boolean } = {},\n): Promise<string> {\n const baseUrl = useExternalWorkflowApi()\n ? resolveWorkflowApiBaseUrl()\n : buildLambdaApiUrl('').replace(/\\/$/, '')\n const url = new URL(`${baseUrl}${path}`)\n if (options.includeAccessToken) {\n const token = await getCurrentAccessToken()\n if (token && token.length > 0) {\n url.searchParams.set('accessToken', token)\n }\n }\n return url.toString()\n}\n\n// ---------------------------------------------------------------------------\n// Config helpers\n// ---------------------------------------------------------------------------\n\nfunction useExternalWorkflowApi(): boolean {\n return import.meta.env.VITE_WORKFLOW_API_MODE === 'external'\n}\n\nfunction resolveWorkflowApiBaseUrl(): string {\n const baseUrl = import.meta.env.VITE_WORKFLOW_API_BASE_URL\n if (!baseUrl || baseUrl.trim().length === 0) {\n throw new Error('Missing VITE_WORKFLOW_API_BASE_URL for external workflow API mode')\n }\n return baseUrl.replace(/\\/$/, '')\n}\n\nfunction getPublishableKey(): string {\n const key = import.meta.env.VITE_WORKFLOW_BUILDER_PUBLISHABLE_KEY\n if (!key || key.trim().length === 0) {\n throw new Error('Missing VITE_WORKFLOW_BUILDER_PUBLISHABLE_KEY')\n }\n return key\n}\n\n// ---------------------------------------------------------------------------\n// Core request function — uses the registered authenticated fetch\n// ---------------------------------------------------------------------------\n\nasync function request<T>(path: string, init?: RequestInit): Promise<T> {\n const publishableKey = useExternalWorkflowApi() ? getPublishableKey() : null\n\n const baseUrl = publishableKey\n ? resolveWorkflowApiBaseUrl()\n : buildLambdaApiUrl('').replace(/\\/$/, '')\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n if (publishableKey) {\n headers.Authorization = `Bearer ${publishableKey}`\n headers['X-Workflow-Key'] = publishableKey\n }\n\n const response = await _authFetch(`${baseUrl}${path}`, {\n ...init,\n credentials: init?.credentials ?? 'include',\n headers: { ...headers, ...(init?.headers as Record<string, string> | undefined) },\n })\n\n if (response.status === 204) return undefined as T\n\n const payload = await response.json().catch(() => null)\n\n if (!response.ok) {\n const message = (payload as { error?: string; message?: string })?.message\n ?? (payload as { error?: string })?.error\n ?? `HTTP ${response.status}: ${response.statusText}`\n throw new HttpResponseError(message, response.status)\n }\n\n // Unwrap any `{ data: T }` envelope the Rust API returns. Some handlers\n // emit `{ success: true, data: T }`; others (list endpoints like\n // `/rules`, `/workflows`) emit just `{ data: T }`. Treating the presence\n // of a top-level `data` key as the signal is what shields pages from\n // the mismatch — without this, callers like `getAgentRules` fall through\n // to `payload.data` manually, and any null/empty body crashes the\n // `rules.map(...)` render with \"Cannot read properties of undefined\".\n if (\n payload &&\n typeof payload === 'object'\n && 'data' in payload\n && (!('success' in payload) || (payload as { success: boolean }).success !== false)\n ) {\n return (payload as { data: T }).data\n }\n\n return payload as T\n}\n\nasync function requestPublic<T>(path: string, init?: RequestInit): Promise<T> {\n const externalBaseUrl = import.meta.env.VITE_WORKFLOW_API_BASE_URL?.trim()\n const baseUrl = externalBaseUrl && externalBaseUrl.length > 0\n ? externalBaseUrl.replace(/\\/$/, '')\n : buildLambdaApiUrl('').replace(/\\/$/, '')\n\n const response = await fetch(`${baseUrl}${path}`, {\n ...init,\n credentials: init?.credentials ?? 'include',\n headers: {\n 'Content-Type': 'application/json',\n ...(init?.headers as Record<string, string> | undefined),\n },\n })\n\n if (response.status === 204) return undefined as T\n\n const payload = await response.json().catch(() => null)\n\n if (!response.ok) {\n const message = (payload as { error?: string; message?: string })?.message\n ?? (payload as { error?: string })?.error\n ?? `HTTP ${response.status}: ${response.statusText}`\n throw new HttpResponseError(message, response.status)\n }\n\n if (payload && typeof payload === 'object' && 'success' in payload && (payload as { success: boolean }).success && 'data' in payload) {\n return (payload as { data: T }).data\n }\n\n return payload as T\n}\n\n// ---------------------------------------------------------------------------\n// AI workflow assistants\n// ---------------------------------------------------------------------------\n\nexport type NodeValidationIssue = {\n nodeId: string\n nodeType: string\n field?: string\n code: string\n message: string\n}\n\nexport type AiValidateResponse = {\n ok: boolean\n structuralIssues: string[]\n nodeIssues: NodeValidationIssue[]\n rationale?: string | null\n}\n\nexport async function aiValidateWorkflow(body: {\n graph: WorkflowGraph\n connectionId?: string\n}): Promise<AiValidateResponse> {\n return request('/workflows/validate/ai', {\n method: 'POST',\n body: JSON.stringify(body),\n })\n}\n\nexport type AiGenerateResponse = {\n graph: WorkflowGraph\n ok: boolean\n structuralIssues: string[]\n nodeIssues: NodeValidationIssue[]\n rationale?: string | null\n}\n\nexport async function aiGenerateWorkflow(body: {\n prompt: string\n connectionId: string\n context?: string\n}): Promise<AiGenerateResponse> {\n return request('/workflows/generate/ai', {\n method: 'POST',\n body: JSON.stringify(body),\n })\n}\n\n// ---------------------------------------------------------------------------\n// Workflow CRUD\n// ---------------------------------------------------------------------------\n\nexport async function getWorkflows(): Promise<Workflow[]> {\n return request('/workflows')\n}\n\nexport async function getWorkflowById(workflowId: string): Promise<Workflow> {\n return request(`/workflows/${encodeURIComponent(workflowId)}`)\n}\n\nexport async function createWorkflow(data: { name: string; description?: string }): Promise<Workflow> {\n return request('/workflows', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n}\n\nexport async function deleteWorkflow(workflowId: string): Promise<{ deleted: boolean }> {\n return request(`/workflows/${encodeURIComponent(workflowId)}`, {\n method: 'DELETE',\n })\n}\n\nexport async function saveWorkflowDraft(\n workflowId: string,\n graph: WorkflowGraph,\n metadata?: {\n name?: string\n description?: string\n slug?: string | null\n isDraft?: boolean\n isActive?: boolean\n },\n): Promise<Workflow> {\n return request(`/workflows/${encodeURIComponent(workflowId)}`, {\n method: 'PATCH',\n body: JSON.stringify({ graph, ...metadata }),\n })\n}\n\n/**\n * Settings modal PATCH — updates the workflow's identity + lifecycle\n * fields in one call. Pass `isDraft: true` to move a published workflow\n * back to draft, `isActive: false` to archive, etc. Anything omitted is\n * left untouched.\n */\nexport async function updateWorkflowSettings(\n workflowId: string,\n changes: {\n name?: string\n description?: string\n slug?: string | null\n isDraft?: boolean\n isActive?: boolean\n },\n): Promise<Workflow> {\n return request(`/workflows/${encodeURIComponent(workflowId)}`, {\n method: 'PATCH',\n body: JSON.stringify(changes),\n })\n}\n\nexport async function publishWorkflow(workflowId: string): Promise<Workflow> {\n return request(`/workflows/${encodeURIComponent(workflowId)}/publish`, {\n method: 'POST',\n })\n}\n\nexport async function executeWorkflow(\n workflowId: string,\n inputVariables?: Record<string, VariableValue>\n): Promise<WorkflowRun> {\n return request(`/workflows/${encodeURIComponent(workflowId)}/execute`, {\n method: 'POST',\n body: JSON.stringify({ inputVariables: inputVariables ?? {} }),\n })\n}\n\nexport async function getWorkflowRuns(workflowId: string): Promise<WorkflowRun[]> {\n return request(`/workflows/${encodeURIComponent(workflowId)}/execute`)\n}\n\n// ---------------------------------------------------------------------------\n// Workflow templates\n// ---------------------------------------------------------------------------\n\nexport interface WorkflowTemplateSummary {\n id: string\n name: string\n description: string\n tags: string[]\n}\n\nexport async function listWorkflowTemplates(): Promise<WorkflowTemplateSummary[]> {\n return request('/workflows/templates')\n}\n\n/**\n * Instantiate a workflow from a template. `connectionId` is required when\n * the template references a `{{connectionId}}` placeholder (all LLM-backed\n * templates do).\n */\nexport async function createWorkflowFromTemplate(\n templateId: string,\n body: { connectionId?: string; name?: string }\n): Promise<Workflow> {\n return request(`/workflows/templates/${encodeURIComponent(templateId)}`, {\n method: 'POST',\n body: JSON.stringify(body),\n })\n}\n\n// ---------------------------------------------------------------------------\n// Model provider connections (org-scoped LLM providers)\n// ---------------------------------------------------------------------------\n\nexport interface ModelProviderConnection {\n id: string\n organizationId: string\n providerId: string\n providerSlug?: string\n name: string\n region?: string\n endpoint?: string\n credentialRef?: string\n apiKeyRef?: string\n modelFilter?: string[]\n config?: Record<string, unknown>\n enabled: boolean\n createdAt?: string\n updatedAt?: string\n}\n\nexport async function listModelProviderConnections(): Promise<ModelProviderConnection[]> {\n return request('/agents/connections')\n}\n\n/**\n * One model family record joined onto a provider in the catalog.\n * Mirrors the `FamilyView` shape returned by `agents_providers.rs`.\n */\nexport type ModelFamilyCatalogEntry = {\n id: string\n slug: string\n name: string\n modelIds: string[]\n maxTokens?: number | null\n contextWindow?: string | null\n supportsTools?: boolean | null\n supportsVision?: boolean | null\n costTier?: string | null\n}\n\n/**\n * Catalog of supported LLM providers. Previously hard-coded in the\n * connections modal; now backed by `astrlabe.model_providers` +\n * `astrlabe.model_families` so new providers can be added server-side\n * without a frontend release.\n */\nexport type ModelProviderCatalogEntry = {\n id: string\n slug: string\n /** Slug normalized into the `ModelProviderType` enum the runtime uses. */\n normalizedSlug: string\n name: string\n category?: string | null\n logoUrl?: string | null\n docsUrl?: string | null\n authType?: string | null\n /**\n * Full family records joined from `model_families`. Empty array if no\n * families are seeded for this provider (`custom`, where the operator\n * supplies the model id at node-config time).\n */\n families: ModelFamilyCatalogEntry[]\n /** @deprecated — array of family slugs only. New callers read `families`. */\n supportedModelFamilies?: unknown\n regions?: string[] | null\n enabled: boolean\n}\n\nexport async function listModelProviderCatalog(): Promise<ModelProviderCatalogEntry[]> {\n const response = await request<ModelProviderCatalogEntry[] | { data: ModelProviderCatalogEntry[] }>(\n '/agents/providers',\n )\n if (Array.isArray(response)) return response\n if (response && typeof response === 'object' && Array.isArray((response as { data?: unknown }).data)) {\n return (response as { data: ModelProviderCatalogEntry[] }).data\n }\n return []\n}\n\nexport async function createModelProviderConnection(body: {\n providerSlug?: string\n providerId?: string\n name: string\n region?: string\n endpoint?: string\n credentialRef?: string\n apiKeyRef?: string\n modelFilter?: string[]\n config?: Record<string, unknown>\n}): Promise<ModelProviderConnection> {\n return request('/agents/connections', {\n method: 'POST',\n body: JSON.stringify(body),\n })\n}\n\nexport async function updateModelProviderConnection(\n id: string,\n body: {\n name?: string\n region?: string\n endpoint?: string\n credentialRef?: string\n apiKeyRef?: string\n modelFilter?: string[]\n config?: Record<string, unknown>\n enabled?: boolean\n },\n): Promise<ModelProviderConnection> {\n return request(`/agents/connections/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n })\n}\n\nexport async function deleteModelProviderConnection(id: string): Promise<{ deleted: boolean }> {\n return request(`/agents/connections/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n })\n}\n\n// ---------------------------------------------------------------------------\n// Agent config & prompts\n// ---------------------------------------------------------------------------\n\nexport async function getAgentPrompts(agentId: string): Promise<AgentPrompt[]> {\n return request(`/agents/prompts?agentId=${encodeURIComponent(agentId)}`)\n}\n\nexport async function getAgentModels(): Promise<AgentModel[]> {\n return request('/agents/models')\n}\n\nexport async function getAgentTools(agentId: string): Promise<WorkflowTool[]> {\n return request(`/agents/tools?agentId=${encodeURIComponent(agentId)}`)\n}\n\nexport async function updateAgentTool(toolId: string, updates: Partial<WorkflowTool>): Promise<WorkflowTool> {\n // Backend PATCH lives at `/agents/tools` (collection) and takes `id`\n // in the body rather than as a path parameter. The `enabled` field the\n // legacy client passed maps to `isEnabled`; `configOverrides` lets\n // callers tweak a workflow-tool binding's overrides without touching\n // the underlying definition.\n const wire: Record<string, unknown> = { id: toolId }\n if (typeof updates.enabled === 'boolean') wire.isEnabled = updates.enabled\n const overrides = (updates as { configOverrides?: unknown }).configOverrides\n if (overrides !== undefined) wire.configOverrides = overrides\n return request('/agents/tools', {\n method: 'PATCH',\n body: JSON.stringify(wire),\n })\n}\n\nexport async function createAgentTool(\n tool: Omit<WorkflowTool, 'organizationId' | 'createdAt' | 'updatedAt'>\n): Promise<WorkflowTool> {\n return request('/agents/tools', {\n method: 'POST',\n body: JSON.stringify(tool),\n })\n}\n\nexport async function deleteAgentTool(toolId: string): Promise<{ deleted: boolean }> {\n return request(`/agents/tools/${encodeURIComponent(toolId)}`, {\n method: 'DELETE',\n })\n}\n\n// ---------------------------------------------------------------------------\n// Agent Tool Definitions (tools available to agents, e.g. web search, code interpreter)\n// ---------------------------------------------------------------------------\n\nexport async function getAgentToolDefinitions(): Promise<AgentTool[]> {\n return request('/agents/tool-definitions')\n}\n\n/**\n * Create a custom agent tool definition. The backend (`POST\n * /agents/tool-definitions`) requires:\n * { name, description, toolType, inputSchema, handlerConfig }\n * where `inputSchema` is a JSON-Schema object with `type` + `properties`.\n */\nexport async function createAgentToolDefinition(\n toolDef: {\n name: string\n description?: string\n toolType: string\n inputSchema: Record<string, unknown>\n handlerConfig: Record<string, unknown>\n },\n): Promise<AgentTool> {\n return request('/agents/tool-definitions', {\n method: 'POST',\n body: JSON.stringify(toolDef),\n })\n}\n\n// ---------------------------------------------------------------------------\n// Rules\n// ---------------------------------------------------------------------------\n\nexport async function getAgentRules(): Promise<AgentRule[]> {\n const response = await request<AgentRule[] | { data: AgentRule[] } | null | undefined>('/rules')\n if (Array.isArray(response)) return response\n if (response && typeof response === 'object' && Array.isArray((response as { data?: unknown }).data)) {\n return (response as { data: AgentRule[] }).data\n }\n return []\n}\n\nexport async function updateAgentRule(\n ruleId: string,\n updates: Partial<AgentRule> & Record<string, unknown>,\n): Promise<AgentRule> {\n return request(`/rules/${encodeURIComponent(ruleId)}`, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n })\n}\n\nexport async function createAgentRule(\n rule: Partial<AgentRule> & Record<string, unknown>,\n): Promise<AgentRule> {\n return request('/rules', {\n method: 'POST',\n body: JSON.stringify(rule),\n })\n}\n\nexport async function deleteAgentRule(ruleId: string): Promise<{ deleted: boolean }> {\n return request(`/rules/${encodeURIComponent(ruleId)}`, {\n method: 'DELETE',\n })\n}\n\nexport async function executeAgentRule(ruleId: string, input: Record<string, unknown>): Promise<unknown> {\n return request(`/rules/${encodeURIComponent(ruleId)}/execute`, {\n method: 'POST',\n body: JSON.stringify(input),\n })\n}\n\n// ---------------------------------------------------------------------------\n// Agent Configs (CRUD — agents_config handler)\n// ---------------------------------------------------------------------------\n\nexport async function createAgentConfig(input: Partial<AgentConfigLike>): Promise<AgentConfigLike> {\n return request('/agents/configs', {\n method: 'POST',\n body: JSON.stringify(input),\n })\n}\n\nexport async function updateAgentConfig(agentId: string, updates: Partial<AgentConfigLike>): Promise<AgentConfigLike> {\n return request(`/agents/configs/${encodeURIComponent(agentId)}`, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n })\n}\n\nexport async function deleteAgentConfig(agentId: string): Promise<{ deleted: boolean }> {\n return request(`/agents/configs/${encodeURIComponent(agentId)}`, {\n method: 'DELETE',\n })\n}\n\n// ---------------------------------------------------------------------------\n// Agent Prompts (versioned prompt library)\n// ---------------------------------------------------------------------------\n\nexport async function createAgentPrompt(input: Omit<AgentPrompt, 'promptId' | 'version' | 'createdAt'>): Promise<AgentPrompt> {\n return request('/agents/prompts', {\n method: 'POST',\n body: JSON.stringify(input),\n })\n}\n\nexport async function updateAgentPrompt(promptId: string, updates: Partial<AgentPrompt>): Promise<AgentPrompt> {\n // Backend route is the collection PATCH `/agents/prompts` — id rides\n // in the body as `promptId`. The handler also requires `promptText`\n // (it overwrites the active version's text), so coerce the legacy\n // partial-AgentPrompt payload into that shape.\n const promptText = (updates as { promptText?: unknown }).promptText\n ?? (updates as { systemPrompt?: unknown }).systemPrompt\n ?? (updates as { content?: unknown }).content\n if (typeof promptText !== 'string' || promptText.length === 0) {\n throw new Error('updateAgentPrompt: `promptText` (or `systemPrompt`/`content`) is required')\n }\n return request('/agents/prompts', {\n method: 'PATCH',\n body: JSON.stringify({ promptId, promptText }),\n })\n}\n\nexport async function deleteAgentPrompt(promptId: string): Promise<{ deleted: boolean }> {\n // The collection route does not expose DELETE today. Surface a clear\n // error rather than silently 404 — callers are using soft-delete via\n // an enabled toggle on the prompt instead.\n void promptId\n throw new Error('deleteAgentPrompt is not supported by the backend yet — disable the prompt via PATCH instead')\n}\n\n// ---------------------------------------------------------------------------\n// Agent Tool Definitions — update / delete\n// ---------------------------------------------------------------------------\n\n/**\n * Patch an existing tool definition. The Rust handler takes the id in\n * the BODY (`toolId`) rather than the URL, and accepts a narrower set\n * of fields than create: `{toolId, name?, description?, parameters?,\n * implementationKey?}`. `implementationKey` is a JSON string that wraps\n * `handlerConfig` — the page wrapper produces that shape before calling.\n */\nexport async function updateAgentToolDefinition(\n agentToolId: string,\n updates: {\n name?: string\n description?: string\n parameters?: Record<string, unknown>\n implementationKey?: string\n },\n): Promise<AgentTool> {\n return request('/agents/tool-definitions', {\n method: 'PATCH',\n body: JSON.stringify({ toolId: agentToolId, ...updates }),\n })\n}\n\nexport async function deleteAgentToolDefinition(agentToolId: string): Promise<{ deleted: boolean }> {\n return request('/agents/tool-definitions', {\n method: 'DELETE',\n body: JSON.stringify({ toolId: agentToolId }),\n })\n}\n\n// ---------------------------------------------------------------------------\n// Workflow Runs — detail, cancel, replay\n// ---------------------------------------------------------------------------\n\nexport type WorkflowRunListParams = {\n workflowId?: string\n status?: string\n limit?: number\n offset?: number\n}\n\nexport async function listWorkflowRuns(params?: WorkflowRunListParams): Promise<{ items: WorkflowRun[]; total: number }> {\n const query = new URLSearchParams()\n if (params?.workflowId) query.set('workflowId', params.workflowId)\n if (params?.status) query.set('status', params.status)\n if (params?.limit) query.set('limit', String(params.limit))\n if (params?.offset) query.set('offset', String(params.offset))\n const path = query.toString().length > 0 ? `/workflow-runs?${query}` : '/workflow-runs'\n return request(path)\n}\n\nexport async function getWorkflowRunById(runId: string): Promise<WorkflowRun> {\n return request(`/workflow-runs/${encodeURIComponent(runId)}`)\n}\n\nexport async function cancelWorkflowRun(runId: string): Promise<WorkflowRun> {\n return request(`/workflow-runs/${encodeURIComponent(runId)}/cancel`, {\n method: 'POST',\n })\n}\n\nexport async function replayWorkflowRun(\n workflowId: string,\n runId: string,\n overrides?: Record<string, VariableValue>,\n): Promise<WorkflowRun> {\n // Empty body → exact rerun (legacy behaviour). With `overrides`, the\n // backend shallow-merges over the original `input_variables`.\n const body = overrides && Object.keys(overrides).length > 0\n ? JSON.stringify({ inputVariables: overrides })\n : undefined\n return request(\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/replay`,\n { method: 'POST', body },\n )\n}\n\nexport type NodeMetrics = {\n tokensIn?: number\n tokensOut?: number\n costUsd?: number\n provider?: string\n model?: string\n}\n\nexport type RunTimelineEntry = {\n nodeId: string\n nodeType: string\n status: 'pending' | 'running' | 'completed' | 'failed' | 'skipped'\n startedAt: string | null\n completedAt: string | null\n durationMs: number | null\n inputs?: Record<string, unknown>\n outputs?: Record<string, unknown>\n error?: string\n metrics?: NodeMetrics\n}\n\nexport async function getRunTimeline(workflowId: string, runId: string): Promise<RunTimelineEntry[]> {\n return request(\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/timeline`,\n )\n}\n\n// ---------------------------------------------------------------------------\n// Analytics (analytics_runs handler)\n// ---------------------------------------------------------------------------\n\nexport type AnalyticsSummary = {\n totalRuns: number\n runsByStatus: Record<string, number>\n avgDurationMs: number\n successRate: number\n perWorkflow: Array<{ workflowId: string; name: string; runs: number; successRate: number }>\n series?: Array<{ date: string; runs: number; successes: number; failures: number }>\n}\n\nexport async function getAnalyticsSummary(params?: { from?: string; to?: string }): Promise<AnalyticsSummary> {\n const query = new URLSearchParams()\n if (params?.from) query.set('from', params.from)\n if (params?.to) query.set('to', params.to)\n const path = query.toString().length > 0 ? `/analytics/runs?${query}` : '/analytics/runs'\n return request(path)\n}\n\n// ---------------------------------------------------------------------------\n// Uploads — presigned S3 upload/download\n// ---------------------------------------------------------------------------\n\nexport type PresignUploadInput = {\n fileName: string\n contentType: string\n fileSize?: number\n folder?: string\n}\n\nexport type PresignedUpload = {\n uploadUrl: string\n downloadUrl: string\n objectKey: string\n expiresAt: string\n}\n\nexport async function presignUpload(input: PresignUploadInput): Promise<PresignedUpload> {\n return request('/uploads', {\n method: 'POST',\n body: JSON.stringify(input),\n })\n}\n\nexport async function getUploadDownloadUrl(objectKey: string): Promise<{ downloadUrl: string }> {\n return request(`/uploads/${encodeURIComponent(objectKey)}`)\n}\n\nexport async function deleteUpload(objectKey: string): Promise<{ deleted: boolean }> {\n return request(`/uploads/${encodeURIComponent(objectKey)}`, {\n method: 'DELETE',\n })\n}\n\n// ---------------------------------------------------------------------------\n// Run Events — SSE subscription helper\n// ---------------------------------------------------------------------------\n\nexport type RunEvent = {\n /**\n * Discriminator for the event payload. The set is open-ended on purpose\n * — Phase 2/3 of the generative-UI work adds `ui-render` (per-section\n * progressive rendering) and `run-paused` (operator-input pause) without\n * a breaking change.\n */\n type:\n | 'run-started'\n | 'node-started'\n | 'node-completed'\n | 'node-failed'\n | 'run-completed'\n | 'run-failed'\n | 'run-paused'\n | 'ui-render'\n | 'log'\n runId: string\n nodeId?: string\n data?: Record<string, unknown>\n timestamp: string\n}\n\n// ---------------------------------------------------------------------------\n// Public sample workflows\n// ---------------------------------------------------------------------------\n\nexport type PublicSampleWorkflow = {\n slug: string\n name: string | null\n description: string | null\n graph: WorkflowGraph\n version: number | null\n publishedAt: string | null\n}\n\nexport async function getPublicSampleWorkflow(slug: string): Promise<PublicSampleWorkflow> {\n return requestPublic(`/samples/workflows/${encodeURIComponent(slug)}`)\n}\n\n// ---------------------------------------------------------------------------\n// Approvals (resolves a paused human_approval node)\n// ---------------------------------------------------------------------------\n\nexport type ApprovalDecision = {\n /** True approves and resumes the run; false fails it with `reason`. */\n approved: boolean\n /** Operator-supplied rationale, surfaced on the audit row. */\n reason?: string\n /**\n * Captured payload — for `input_request` sections this carries the\n * form field values. The downstream workflow nodes read it from\n * `inputs.approvals.<nodeId>.payload`.\n */\n payload?: Record<string, unknown>\n}\n\nexport type ApprovalResponse = {\n approvalId: string\n sourceRunId: string\n resumedRunId: string\n nodeId: string\n approved: boolean\n status: string\n}\n\n/**\n * Resolve a paused workflow run by recording an operator decision.\n * The backend writes an audit row, merges the decision into the run's\n * inputs, and re-executes — see #457.\n */\nexport async function submitApproval(\n runId: string,\n nodeId: string,\n decision: ApprovalDecision,\n): Promise<ApprovalResponse> {\n return request<ApprovalResponse>(\n `/workflow-runs/${encodeURIComponent(runId)}/approvals/${encodeURIComponent(nodeId)}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(decision),\n },\n )\n}\n\n/**\n * Connection state for {@link subscribeToRunEvents}. UI consumers can\n * surface this — e.g. show \"reconnecting…\" badge — by passing an\n * `onState` callback.\n */\nexport type RunSubscriptionState = 'live' | 'reconnecting' | 'polling' | 'closed'\n\nconst SSE_MAX_RECONNECT_ATTEMPTS = 5\nconst SSE_RECONNECT_BASE_MS = 1_000\nconst SSE_RECONNECT_CAP_MS = 16_000\nconst POLLING_INTERVAL_MS = 5_000\n\nconst TERMINAL_EVENT_TYPES: ReadonlySet<RunEvent['type']> = new Set([\n 'run-completed',\n 'run-failed',\n])\n\nconst TERMINAL_RUN_STATUSES: ReadonlySet<string> = new Set([\n 'completed',\n 'failed',\n 'cancelled',\n])\n\n/**\n * Subscribe to a run's event stream with auto-reconnect + polling fallback.\n *\n * The default `EventSource` drops silently on idle proxies / cold-restarts\n * (CloudFront + Lambda Function URL combo at customer scale will close\n * an idle connection after ~30–60s). When that happens the run viewer\n * looks frozen with no signal to the user.\n *\n * Lifecycle:\n * 1. Open SSE. On `open`, state = `live`.\n * 2. On `error`, close the source and exponential-backoff (1s → 2s → 4s\n * → 8s → 16s, with jitter). State = `reconnecting`.\n * 3. After {@link SSE_MAX_RECONNECT_ATTEMPTS} failures, fall back to\n * polling `GET /workflow-runs/{runId}` every 5s. State = `polling`.\n * 4. On terminal event (`run-completed` / `run-failed`) or terminal\n * polled status (completed/failed/cancelled), close + state = `closed`.\n * 5. Returned disposer also flips to `closed`; idempotent.\n *\n * Backwards-compatible with the previous 3-arg signature; pass `onState`\n * as a 4th arg if you want to render connection-state UI.\n */\nexport function subscribeToRunEvents(\n runId: string,\n onEvent: (event: RunEvent) => void,\n onError?: (error: Event) => void,\n onState?: (state: RunSubscriptionState) => void,\n): () => void {\n let cancelled = false\n let attempt = 0\n let currentSource: EventSource | null = null\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null\n let pollingTimer: ReturnType<typeof setInterval> | null = null\n\n const setState = (state: RunSubscriptionState) => {\n if (!cancelled) onState?.(state)\n }\n\n const cleanup = () => {\n if (cancelled) return\n cancelled = true\n if (currentSource) {\n currentSource.close()\n currentSource = null\n }\n if (reconnectTimer) {\n clearTimeout(reconnectTimer)\n reconnectTimer = null\n }\n if (pollingTimer) {\n clearInterval(pollingTimer)\n pollingTimer = null\n }\n setState('closed')\n }\n\n const startPolling = () => {\n if (cancelled) return\n setState('polling')\n pollingTimer = setInterval(() => {\n if (cancelled) return\n void getWorkflowRunById(runId)\n .then((run) => {\n if (cancelled) return\n // Surface a synthetic event so the consumer's onEvent path is\n // the single sink for both SSE + polling. Reuses the `log`\n // type with a marker payload — no schema change needed.\n onEvent({\n type: 'log',\n runId,\n data: { source: 'polling-fallback', run: run as unknown as Record<string, unknown> },\n timestamp: new Date().toISOString(),\n } as RunEvent)\n if (run.status && TERMINAL_RUN_STATUSES.has(run.status)) {\n cleanup()\n }\n })\n .catch(() => {\n // Swallow transient polling errors — the next tick will retry.\n })\n }, POLLING_INTERVAL_MS)\n }\n\n const connect = () => {\n if (cancelled) return\n\n const baseUrl = buildLambdaApiUrl('').replace(/\\/$/, '')\n const url = `${baseUrl}/workflow-runs/${encodeURIComponent(runId)}/events`\n const source = new EventSource(url, { withCredentials: true })\n currentSource = source\n\n source.addEventListener('open', () => {\n attempt = 0\n setState('live')\n })\n\n source.addEventListener('message', (event) => {\n try {\n const parsed = JSON.parse(event.data) as RunEvent\n onEvent(parsed)\n if (TERMINAL_EVENT_TYPES.has(parsed.type)) {\n cleanup()\n }\n } catch {\n // ignore malformed messages\n }\n })\n\n source.addEventListener('error', (errorEvent) => {\n if (cancelled) return\n onError?.(errorEvent)\n source.close()\n currentSource = null\n\n attempt += 1\n if (attempt > SSE_MAX_RECONNECT_ATTEMPTS) {\n startPolling()\n return\n }\n\n // Exponential backoff with jitter to avoid synchronous thundering\n // herd if many viewers reconnect at the same moment.\n const exponentialMs = Math.min(SSE_RECONNECT_BASE_MS * 2 ** (attempt - 1), SSE_RECONNECT_CAP_MS)\n const jitterMs = Math.random() * 500\n setState('reconnecting')\n reconnectTimer = setTimeout(connect, exponentialMs + jitterMs)\n })\n }\n\n connect()\n return cleanup\n}\n\nconst AGENT_AVATARS: Record<string, string> = {\n 'Sales Assistant': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Rafael&hair=variant01&beardProbability=0&mouth=happy01',\n 'Sales Specialist': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Marcos&hair=variant15&beardProbability=50&mouth=happy02',\n 'Support Agent': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Ana&hair=variant43&beardProbability=0&mouth=happy01',\n 'Financial Analyst': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Lucas&hair=variant08&beardProbability=50&mouth=happy02',\n 'Security Analyst': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Pedro&hair=variant22&beardProbability=50&mouth=happy01',\n 'Data Analyst': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Julia&hair=variant29&beardProbability=0&mouth=happy01',\n 'Market Analyst': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Diego&hair=variant12&beardProbability=0&mouth=happy02',\n 'Pricing Manager': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Beatriz&hair=variant38&beardProbability=0&mouth=happy01',\n 'Onboarding Agent': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Camila&hair=variant35&beardProbability=0&mouth=happy01',\n}\n\nfunction defaultAvatar(name: string): string {\n return AGENT_AVATARS[name] ?? `https://api.dicebear.com/9.x/lorelei/svg?seed=${encodeURIComponent(name)}`\n}\n\nexport async function getAgentConfigsWithPrompts(): Promise<AgentWithPrompts[]> {\n const configs = await request<AgentConfigLike[]>('/agents/configs')\n\n return Promise.all(configs.map(async (agent) => {\n const raw = agent as Record<string, unknown>\n // Normalize snake_case from Rust API to camelCase\n const agentId = String(raw.agent_id ?? raw.agentId ?? agent.id ?? '')\n const id = agentId\n const avatar: string = typeof raw.avatar === 'string' && raw.avatar.length > 0\n ? raw.avatar\n : defaultAvatar(String(agent.name ?? ''))\n const modelId = String(raw.model_id ?? raw.modelId ?? '')\n const displayOrder = Number(raw.display_order ?? raw.displayOrder ?? raw.order ?? 0)\n const maxTokens = Number(raw.max_tokens ?? raw.maxTokens ?? 2048)\n const normalized = { ...raw, agentId, modelId, displayOrder, maxTokens, order: displayOrder }\n if (!id) return { ...(normalized as unknown as AgentWithPrompts), avatar, promptCount: 0, activePromptVersion: 0 }\n try {\n const prompts = await getAgentPrompts(id)\n const activePrompt = prompts.find((prompt) => prompt.isActive)\n return {\n ...(normalized as unknown as AgentWithPrompts),\n avatar,\n promptCount: prompts.length,\n activePromptVersion: activePrompt?.version ?? 0,\n }\n } catch {\n return {\n ...(normalized as unknown as AgentWithPrompts),\n avatar,\n promptCount: 0,\n activePromptVersion: 0,\n }\n }\n }))\n}\n\n// ---------------------------------------------------------------------------\n// Datasources\n// ---------------------------------------------------------------------------\n\nexport async function getDatasources(): Promise<DataSource[]> {\n return request('/datasources')\n}\n\nexport async function createDatasource(data: DatasourceFormData): Promise<DataSource> {\n const body = toDatasourceWireBody(data)\n return request('/datasources', {\n method: 'POST',\n body: JSON.stringify(body),\n })\n}\n\n/**\n * Group the flat `DatasourceFormData` shape (that the modal captures off\n * form state) into the nested body the backend expects:\n *\n * { name, dialect,\n * credentials: { host, port, database, username, password, ... },\n * allowedTables, blockedColumns, maxPoolSize, timeoutMs, readOnly }\n *\n * The handler's `ingest_credentials` pulls secret-shaped keys out of\n * `credentials` into the vault, so the plaintext password never lands\n * on the row. Governance fields stay top-level.\n */\nfunction toDatasourceWireBody(data: DatasourceFormData): Record<string, unknown> {\n const CREDENTIAL_KEYS: Array<keyof DatasourceFormData> = [\n 'host', 'port', 'database', 'username', 'password', 'schema',\n 'connectionString', 'projectId', 'dataset', 'keyFile', 'account',\n 'warehouse', 'region', 'bucket', 'token', 'apiKey', 'environment',\n 'index', 'url', 'ssl',\n ]\n const credentials: Record<string, unknown> = {}\n for (const key of CREDENTIAL_KEYS) {\n const value = data[key]\n if (value !== undefined && value !== '' && value !== null) {\n credentials[key as string] = value\n }\n }\n const body: Record<string, unknown> = {\n name: data.name,\n dialect: data.dialect,\n }\n if (Object.keys(credentials).length > 0) body.credentials = credentials\n if (data.allowedTables && data.allowedTables.length > 0) body.allowedTables = data.allowedTables\n if (data.blockedColumns && data.blockedColumns.length > 0) body.blockedColumns = data.blockedColumns\n if (typeof data.maxPoolSize === 'number') body.maxPoolSize = data.maxPoolSize\n if (typeof data.timeoutMs === 'number') body.timeoutMs = data.timeoutMs\n if (typeof data.readOnly === 'boolean') body.readOnly = data.readOnly\n return body\n}\n\nexport async function getDatasourceTables(datasourceId: string): Promise<string[]> {\n return request(`/datasources/${encodeURIComponent(datasourceId)}/tables`)\n}\n\nexport async function getDatasourceSchema(\n datasourceId: string,\n table: string\n): Promise<Array<{ name: string; type: string; nullable?: boolean }>> {\n return request(`/datasources/${encodeURIComponent(datasourceId)}/schema/${encodeURIComponent(table)}`)\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/platform/workflow-api-client.ts"],"names":["buildLambdaApiUrl","HttpResponseError"],"mappings":";;;;;AAsBA,IAAI,UAAA,GAA2B,KAAA;AAMxB,SAAS,sBAAsB,SAAA,EAA+B;AACnE,EAAA,UAAA,GAAa,SAAA;AACf;AAOA,IAAI,iBAA+C,YAAY,IAAA;AAExD,SAAS,uBAAuB,QAAA,EAA8C;AACnF,EAAA,cAAA,GAAiB,QAAA;AACnB;AAEA,eAAsB,qBAAA,GAAgD;AACpE,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,cAAA,EAAe;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAOA,eAAsB,wBAAA,CACpB,IAAA,EACA,OAAA,GAA4C,EAAC,EAC5B;AACjB,EAAA,MAAM,OAAA,GAAU,sBAAA,EAAuB,GACnC,yBAAA,EAA0B,GAC1BA,mCAAkB,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAC3C,EAAA,MAAM,MAAM,IAAI,GAAA,CAAI,GAAG,OAAO,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AACvC,EAAA,IAAI,QAAQ,kBAAA,EAAoB;AAC9B,IAAA,MAAM,KAAA,GAAQ,MAAM,qBAAA,EAAsB;AAC1C,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,aAAA,EAAe,KAAK,CAAA;AAAA,IAC3C;AAAA,EACF;AACA,EAAA,OAAO,IAAI,QAAA,EAAS;AACtB;AAMA,SAAS,sBAAA,GAAkC;AACzC,EAAA,OAAO,UAAgB,sBAAA,KAA2B,UAAA;AACpD;AAEA,SAAS,yBAAA,GAAoC;AAC3C,EAAA,MAAM,OAAA,GAAU,SAAY,CAAI,0BAAA;AAChC,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AAC3C,IAAA,MAAM,IAAI,MAAM,mEAAmE,CAAA;AAAA,EACrF;AACA,EAAA,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAClC;AAEA,SAAS,iBAAA,GAA4B;AACnC,EAAA,MAAM,GAAA,GAAM,SAAY,CAAI,qCAAA;AAC5B,EAAA,IAAI,CAAC,GAAA,IAAO,GAAA,CAAI,IAAA,EAAK,CAAE,WAAW,CAAA,EAAG;AACnC,IAAA,MAAM,IAAI,MAAM,+CAA+C,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,GAAA;AACT;AAMA,eAAe,OAAA,CAAW,MAAc,IAAA,EAAgC;AACtE,EAAA,MAAM,cAAA,GAAiB,sBAAA,EAAuB,GAAI,iBAAA,EAAkB,GAAI,IAAA;AAExE,EAAA,MAAM,OAAA,GAAU,iBACZ,yBAAA,EAA0B,GAC1BA,mCAAkB,EAAE,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,cAAA,EAAgB;AAAA,GAClB;AAEA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,OAAA,CAAQ,aAAA,GAAgB,UAAU,cAAc,CAAA,CAAA;AAChD,IAAA,OAAA,CAAQ,gBAAgB,CAAA,GAAI,cAAA;AAAA,EAC9B;AAEA,EAAA,MAAM,WAAW,MAAM,UAAA,CAAW,GAAG,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,IACrD,GAAG,IAAA;AAAA,IACH,WAAA,EAAa,MAAM,WAAA,IAAe,SAAA;AAAA,IAClC,SAAS,EAAE,GAAG,OAAA,EAAS,GAAI,MAAM,OAAA;AAA+C,GACjF,CAAA;AAED,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,EAAK,OAAO,MAAA;AAEpC,EAAA,MAAM,UAAU,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAEtD,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,OAAA,GAAW,OAAA,EAAkD,OAAA,IAC7D,OAAA,EAAgC,KAAA,IACjC,QAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAA;AACpD,IAAA,MAAM,IAAIC,wBAAA,CAAkB,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA;AAAA,EACtD;AASA,EAAA,IACE,OAAA,IACA,OAAO,OAAA,KAAY,QAAA,IAChB,MAAA,IAAU,OAAA,KACT,EAAE,SAAA,IAAa,OAAA,CAAA,IAAa,OAAA,CAAiC,OAAA,KAAY,KAAA,CAAA,EAC7E;AACA,IAAA,OAAQ,OAAA,CAAwB,IAAA;AAAA,EAClC;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,eAAe,aAAA,CAAiB,MAAc,IAAA,EAAgC;AAC5E,EAAA,MAAM,eAAA,GAAkB,SAAY,CAAI,0BAAA,EAA4B,IAAA,EAAK;AACzE,EAAA,MAAM,OAAA,GAAU,eAAA,IAAmB,eAAA,CAAgB,MAAA,GAAS,IACxD,eAAA,CAAgB,OAAA,CAAQ,KAAA,EAAO,EAAE,IACjCD,kCAAA,CAAkB,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AAE3C,EAAA,MAAM,WAAW,MAAM,KAAA,CAAM,GAAG,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,IAChD,GAAG,IAAA;AAAA,IACH,WAAA,EAAkC,SAAA;AAAA,IAClC,OAAA,EAAS;AAAA,MACP,cAAA,EAAgB,kBAAA;AAAA,MAChB,GAAI,IAAA,EAAM;AAAA;AACZ,GACD,CAAA;AAED,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,GAAA,EAAK,OAAO,MAAA;AAEpC,EAAA,MAAM,UAAU,MAAM,QAAA,CAAS,MAAK,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAEtD,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,OAAA,GAAW,OAAA,EAAkD,OAAA,IAC7D,OAAA,EAAgC,KAAA,IACjC,QAAQ,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAA;AACpD,IAAA,MAAM,IAAIC,wBAAA,CAAkB,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA;AAAA,EACtD;AAEA,EAAA,IAAI,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,IAAY,aAAa,OAAA,IAAY,OAAA,CAAiC,OAAA,IAAW,MAAA,IAAU,OAAA,EAAS;AACpI,IAAA,OAAQ,OAAA,CAAwB,IAAA;AAAA,EAClC;AAEA,EAAA,OAAO,OAAA;AACT;AAqBA,eAAsB,mBAAmB,IAAA,EAGT;AAC9B,EAAA,OAAO,QAAQ,wBAAA,EAA0B;AAAA,IACvC,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,GAC1B,CAAA;AACH;AAUA,eAAsB,mBAAmB,IAAA,EAIT;AAC9B,EAAA,OAAO,QAAQ,wBAAA,EAA0B;AAAA,IACvC,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,GAC1B,CAAA;AACH;AAMA,eAAsB,YAAA,GAAoC;AACxD,EAAA,OAAO,QAAQ,YAAY,CAAA;AAC7B;AAEA,eAAsB,gBAAgB,UAAA,EAAuC;AAC3E,EAAA,OAAO,OAAA,CAAQ,CAAA,WAAA,EAAc,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAE,CAAA;AAC/D;AAEA,eAAsB,eAAe,IAAA,EAAiE;AACpG,EAAA,OAAO,QAAQ,YAAA,EAAc;AAAA,IAC3B,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,GAC1B,CAAA;AACH;AAEA,eAAsB,eAAe,UAAA,EAAmD;AACtF,EAAA,OAAO,OAAA,CAAQ,CAAA,WAAA,EAAc,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA,EAAI;AAAA,IAC7D,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAEA,eAAsB,iBAAA,CACpB,UAAA,EACA,KAAA,EACA,QAAA,EAOmB;AACnB,EAAA,OAAO,OAAA,CAAQ,CAAA,WAAA,EAAc,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA,EAAI;AAAA,IAC7D,MAAA,EAAQ,OAAA;AAAA,IACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,GAAG,UAAU;AAAA,GAC5C,CAAA;AACH;AAQA,eAAsB,sBAAA,CACpB,YACA,OAAA,EAOmB;AACnB,EAAA,OAAO,OAAA,CAAQ,CAAA,WAAA,EAAc,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA,EAAI;AAAA,IAC7D,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,GAC7B,CAAA;AACH;AAEA,eAAsB,gBAAgB,UAAA,EAAuC;AAC3E,EAAA,OAAO,OAAA,CAAQ,CAAA,WAAA,EAAc,kBAAA,CAAmB,UAAU,CAAC,CAAA,QAAA,CAAA,EAAY;AAAA,IACrE,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAEA,eAAsB,eAAA,CACpB,YACA,cAAA,EACsB;AACtB,EAAA,OAAO,OAAA,CAAQ,CAAA,WAAA,EAAc,kBAAA,CAAmB,UAAU,CAAC,CAAA,QAAA,CAAA,EAAY;AAAA,IACrE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,gBAAgB,cAAA,IAAkB,IAAI;AAAA,GAC9D,CAAA;AACH;AAEA,eAAsB,gBAAgB,UAAA,EAA4C;AAChF,EAAA,OAAO,OAAA,CAAQ,CAAA,WAAA,EAAc,kBAAA,CAAmB,UAAU,CAAC,CAAA,QAAA,CAAU,CAAA;AACvE;AAaA,eAAsB,qBAAA,GAA4D;AAChF,EAAA,OAAO,QAAQ,sBAAsB,CAAA;AACvC;AAOA,eAAsB,0BAAA,CACpB,YACA,IAAA,EACmB;AACnB,EAAA,OAAO,OAAA,CAAQ,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA,EAAI;AAAA,IACvE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,GAC1B,CAAA;AACH;AAuBA,eAAsB,4BAAA,GAAmE;AACvF,EAAA,OAAO,QAAQ,qBAAqB,CAAA;AACtC;AA8CA,eAAsB,wBAAA,GAAiE;AACrF,EAAA,MAAM,WAAW,MAAM,OAAA;AAAA,IACrB;AAAA,GACF;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG,OAAO,QAAA;AACpC,EAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,IAAY,MAAM,OAAA,CAAS,QAAA,CAAgC,IAAI,CAAA,EAAG;AACpG,IAAA,OAAQ,QAAA,CAAmD,IAAA;AAAA,EAC7D;AACA,EAAA,OAAO,EAAC;AACV;AAEA,eAAsB,8BAA8B,IAAA,EAUf;AACnC,EAAA,OAAO,QAAQ,qBAAA,EAAuB;AAAA,IACpC,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,GAC1B,CAAA;AACH;AAEA,eAAsB,6BAAA,CACpB,IACA,IAAA,EAUkC;AAClC,EAAA,OAAO,OAAA,CAAQ,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,IAC9D,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,GAC1B,CAAA;AACH;AAEA,eAAsB,8BAA8B,EAAA,EAA2C;AAC7F,EAAA,OAAO,OAAA,CAAQ,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,IAC9D,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAMA,eAAsB,gBAAgB,OAAA,EAAyC;AAC7E,EAAA,OAAO,OAAA,CAAQ,CAAA,wBAAA,EAA2B,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAE,CAAA;AACzE;AAEA,eAAsB,cAAA,GAAwC;AAC5D,EAAA,OAAO,QAAQ,gBAAgB,CAAA;AACjC;AAEA,eAAsB,cAAc,OAAA,EAA0C;AAC5E,EAAA,OAAO,OAAA,CAAQ,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAE,CAAA;AACvE;AAEA,eAAsB,eAAA,CAAgB,QAAgB,OAAA,EAAuD;AAM3G,EAAA,MAAM,IAAA,GAAgC,EAAE,EAAA,EAAI,MAAA,EAAO;AACnD,EAAA,IAAI,OAAO,OAAA,CAAQ,OAAA,KAAY,SAAA,EAAW,IAAA,CAAK,YAAY,OAAA,CAAQ,OAAA;AACnE,EAAA,MAAM,YAAa,OAAA,CAA0C,eAAA;AAC7D,EAAA,IAAI,SAAA,KAAc,MAAA,EAAW,IAAA,CAAK,eAAA,GAAkB,SAAA;AACpD,EAAA,OAAO,QAAQ,eAAA,EAAiB;AAAA,IAC9B,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,GAC1B,CAAA;AACH;AAEA,eAAsB,gBACpB,IAAA,EACuB;AACvB,EAAA,OAAO,QAAQ,eAAA,EAAiB;AAAA,IAC9B,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,GAC1B,CAAA;AACH;AAEA,eAAsB,gBAAgB,MAAA,EAA+C;AACnF,EAAA,OAAO,OAAA,CAAQ,CAAA,cAAA,EAAiB,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA,EAAI;AAAA,IAC5D,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAMA,eAAsB,uBAAA,GAAgD;AACpE,EAAA,OAAO,QAAQ,0BAA0B,CAAA;AAC3C;AAQA,eAAsB,0BACpB,OAAA,EAOoB;AACpB,EAAA,OAAO,QAAQ,0BAAA,EAA4B;AAAA,IACzC,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,GAC7B,CAAA;AACH;AAMA,eAAsB,aAAA,GAAsC;AAC1D,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAgE,QAAQ,CAAA;AAC/F,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG,OAAO,QAAA;AACpC,EAAA,IAAI,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,IAAY,MAAM,OAAA,CAAS,QAAA,CAAgC,IAAI,CAAA,EAAG;AACpG,IAAA,OAAQ,QAAA,CAAmC,IAAA;AAAA,EAC7C;AACA,EAAA,OAAO,EAAC;AACV;AAEA,eAAsB,eAAA,CACpB,QACA,OAAA,EACoB;AACpB,EAAA,OAAO,OAAA,CAAQ,CAAA,OAAA,EAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA,EAAI;AAAA,IACrD,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,GAC7B,CAAA;AACH;AAEA,eAAsB,gBACpB,IAAA,EACoB;AACpB,EAAA,OAAO,QAAQ,QAAA,EAAU;AAAA,IACvB,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,GAC1B,CAAA;AACH;AAEA,eAAsB,gBAAgB,MAAA,EAA+C;AACnF,EAAA,OAAO,OAAA,CAAQ,CAAA,OAAA,EAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA,EAAI;AAAA,IACrD,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAEA,eAAsB,gBAAA,CAAiB,QAAgB,KAAA,EAAkD;AACvG,EAAA,OAAO,OAAA,CAAQ,CAAA,OAAA,EAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,QAAA,CAAA,EAAY;AAAA,IAC7D,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,GAC3B,CAAA;AACH;AAMA,eAAsB,kBAAkB,KAAA,EAA2D;AACjG,EAAA,OAAO,QAAQ,iBAAA,EAAmB;AAAA,IAChC,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,GAC3B,CAAA;AACH;AAEA,eAAsB,iBAAA,CAAkB,SAAiB,OAAA,EAA6D;AACpH,EAAA,OAAO,OAAA,CAAQ,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA,EAAI;AAAA,IAC/D,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,GAC7B,CAAA;AACH;AAEA,eAAsB,kBAAkB,OAAA,EAAgD;AACtF,EAAA,OAAO,OAAA,CAAQ,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA,EAAI;AAAA,IAC/D,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAMA,eAAsB,kBAAkB,KAAA,EAAsF;AAC5H,EAAA,OAAO,QAAQ,iBAAA,EAAmB;AAAA,IAChC,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,GAC3B,CAAA;AACH;AAEA,eAAsB,iBAAA,CAAkB,UAAkB,OAAA,EAAqD;AAK7G,EAAA,MAAM,UAAA,GAAc,OAAA,CAAqC,UAAA,IACnD,OAAA,CAAuC,gBACvC,OAAA,CAAkC,OAAA;AACxC,EAAA,IAAI,OAAO,UAAA,KAAe,QAAA,IAAY,UAAA,CAAW,WAAW,CAAA,EAAG;AAC7D,IAAA,MAAM,IAAI,MAAM,2EAA2E,CAAA;AAAA,EAC7F;AACA,EAAA,OAAO,QAAQ,iBAAA,EAAmB;AAAA,IAChC,MAAA,EAAQ,OAAA;AAAA,IACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,QAAA,EAAU,YAAY;AAAA,GAC9C,CAAA;AACH;AAEA,eAAsB,kBAAkB,QAAA,EAAiD;AAKvF,EAAA,MAAM,IAAI,MAAM,mGAA8F,CAAA;AAChH;AAaA,eAAsB,yBAAA,CACpB,aACA,OAAA,EAMoB;AACpB,EAAA,OAAO,QAAQ,0BAAA,EAA4B;AAAA,IACzC,MAAA,EAAQ,OAAA;AAAA,IACR,IAAA,EAAM,KAAK,SAAA,CAAU,EAAE,QAAQ,WAAA,EAAa,GAAG,SAAS;AAAA,GACzD,CAAA;AACH;AAEA,eAAsB,0BAA0B,WAAA,EAAoD;AAClG,EAAA,OAAO,QAAQ,0BAAA,EAA4B;AAAA,IACzC,MAAA,EAAQ,QAAA;AAAA,IACR,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,MAAA,EAAQ,aAAa;AAAA,GAC7C,CAAA;AACH;AAaA,eAAsB,iBAAiB,MAAA,EAAkF;AACvH,EAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,EAAA,IAAI,QAAQ,UAAA,EAAY,KAAA,CAAM,GAAA,CAAI,YAAA,EAAc,OAAO,UAAU,CAAA;AACjE,EAAA,IAAI,QAAQ,MAAA,EAAQ,KAAA,CAAM,GAAA,CAAI,QAAA,EAAU,OAAO,MAAM,CAAA;AACrD,EAAA,IAAI,MAAA,EAAQ,OAAO,KAAA,CAAM,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAC1D,EAAA,IAAI,MAAA,EAAQ,QAAQ,KAAA,CAAM,GAAA,CAAI,UAAU,MAAA,CAAO,MAAA,CAAO,MAAM,CAAC,CAAA;AAC7D,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,EAAS,CAAE,SAAS,CAAA,GAAI,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAA,GAAK,gBAAA;AACvE,EAAA,OAAO,QAAQ,IAAI,CAAA;AACrB;AAEA,eAAsB,mBAAmB,KAAA,EAAqC;AAC5E,EAAA,OAAO,OAAA,CAAQ,CAAA,eAAA,EAAkB,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAE,CAAA;AAC9D;AAEA,eAAsB,kBAAkB,KAAA,EAAqC;AAC3E,EAAA,OAAO,OAAA,CAAQ,CAAA,eAAA,EAAkB,kBAAA,CAAmB,KAAK,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,IACnE,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AAEA,eAAsB,iBAAA,CACpB,UAAA,EACA,KAAA,EACA,SAAA,EACsB;AAGtB,EAAA,MAAM,IAAA,GAAO,SAAA,IAAa,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA,GAAS,CAAA,GACtD,IAAA,CAAK,SAAA,CAAU,EAAE,cAAA,EAAgB,SAAA,EAAW,CAAA,GAC5C,MAAA;AACJ,EAAA,OAAO,OAAA;AAAA,IACL,cAAc,kBAAA,CAAmB,UAAU,CAAC,CAAA,MAAA,EAAS,kBAAA,CAAmB,KAAK,CAAC,CAAA,OAAA,CAAA;AAAA,IAC9E,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA;AAAK,GACzB;AACF;AAuBA,eAAsB,cAAA,CAAe,YAAoB,KAAA,EAA4C;AACnG,EAAA,OAAO,OAAA;AAAA,IACL,cAAc,kBAAA,CAAmB,UAAU,CAAC,CAAA,MAAA,EAAS,kBAAA,CAAmB,KAAK,CAAC,CAAA,SAAA;AAAA,GAChF;AACF;AAeA,eAAsB,oBAAoB,MAAA,EAAoE;AAC5G,EAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAgB;AAClC,EAAA,IAAI,QAAQ,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAI,CAAA;AAC/C,EAAA,IAAI,QAAQ,EAAA,EAAI,KAAA,CAAM,GAAA,CAAI,IAAA,EAAM,OAAO,EAAE,CAAA;AACzC,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,EAAS,CAAE,SAAS,CAAA,GAAI,CAAA,gBAAA,EAAmB,KAAK,CAAA,CAAA,GAAK,iBAAA;AACxE,EAAA,OAAO,QAAQ,IAAI,CAAA;AACrB;AAoBA,eAAsB,cAAc,KAAA,EAAqD;AACvF,EAAA,OAAO,QAAQ,UAAA,EAAY;AAAA,IACzB,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,KAAK;AAAA,GAC3B,CAAA;AACH;AAEA,eAAsB,qBAAqB,SAAA,EAAqD;AAC9F,EAAA,OAAO,OAAA,CAAQ,CAAA,SAAA,EAAY,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAE,CAAA;AAC5D;AAEA,eAAsB,aAAa,SAAA,EAAkD;AACnF,EAAA,OAAO,OAAA,CAAQ,CAAA,SAAA,EAAY,kBAAA,CAAmB,SAAS,CAAC,CAAA,CAAA,EAAI;AAAA,IAC1D,MAAA,EAAQ;AAAA,GACT,CAAA;AACH;AA0CA,eAAsB,wBAAwB,IAAA,EAA6C;AACzF,EAAA,OAAO,aAAA,CAAc,CAAA,mBAAA,EAAsB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAE,CAAA;AACvE;AAiCA,eAAsB,cAAA,CACpB,KAAA,EACA,MAAA,EACA,QAAA,EAC2B;AAC3B,EAAA,OAAO,OAAA;AAAA,IACL,kBAAkB,kBAAA,CAAmB,KAAK,CAAC,CAAA,WAAA,EAAc,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA;AAAA,IACnF;AAAA,MACE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,QAAQ;AAAA;AAC/B,GACF;AACF;AASA,IAAM,0BAAA,GAA6B,CAAA;AACnC,IAAM,qBAAA,GAAwB,GAAA;AAC9B,IAAM,oBAAA,GAAuB,IAAA;AAC7B,IAAM,mBAAA,GAAsB,GAAA;AAE5B,IAAM,oBAAA,uBAA0D,GAAA,CAAI;AAAA,EAClE,eAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,qBAAA,uBAAiD,GAAA,CAAI;AAAA,EACzD,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC,CAAA;AAuBM,SAAS,oBAAA,CACd,KAAA,EACA,OAAA,EACA,OAAA,EACA,OAAA,EACY;AACZ,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,aAAA,GAAoC,IAAA;AACxC,EAAA,IAAI,cAAA,GAAuD,IAAA;AAC3D,EAAA,IAAI,YAAA,GAAsD,IAAA;AAE1D,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,KAAgC;AAChD,IAAA,IAAI,CAAC,SAAA,EAAW,OAAA,GAAU,KAAK,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,SAAA,GAAY,IAAA;AACZ,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,aAAA,CAAc,KAAA,EAAM;AACpB,MAAA,aAAA,GAAgB,IAAA;AAAA,IAClB;AACA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,YAAA,CAAa,cAAc,CAAA;AAC3B,MAAA,cAAA,GAAiB,IAAA;AAAA,IACnB;AACA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,aAAA,CAAc,YAAY,CAAA;AAC1B,MAAA,YAAA,GAAe,IAAA;AAAA,IACjB;AACA,IAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,QAAA,CAAS,SAAS,CAAA;AAClB,IAAA,YAAA,GAAe,YAAY,MAAM;AAC/B,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,KAAK,kBAAA,CAAmB,KAAK,CAAA,CAC1B,IAAA,CAAK,CAAC,GAAA,KAAQ;AACb,QAAA,IAAI,SAAA,EAAW;AAIf,QAAA,OAAA,CAAQ;AAAA,UACN,IAAA,EAAM,KAAA;AAAA,UACN,KAAA;AAAA,UACA,IAAA,EAAM,EAAE,MAAA,EAAQ,kBAAA,EAAoB,GAAA,EAA+C;AAAA,UACnF,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,SACvB,CAAA;AACb,QAAA,IAAI,IAAI,MAAA,IAAU,qBAAA,CAAsB,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,EAAG;AACvD,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,MAEb,CAAC,CAAA;AAAA,IACL,GAAG,mBAAmB,CAAA;AAAA,EACxB,CAAA;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,SAAA,EAAW;AAEf,IAAA,MAAM,UAAUD,kCAAA,CAAkB,EAAE,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACvD,IAAA,MAAM,MAAM,CAAA,EAAG,OAAO,CAAA,eAAA,EAAkB,kBAAA,CAAmB,KAAK,CAAC,CAAA,OAAA,CAAA;AACjE,IAAA,MAAM,SAAS,IAAI,WAAA,CAAY,KAAK,EAAE,eAAA,EAAiB,MAAM,CAAA;AAC7D,IAAA,aAAA,GAAgB,MAAA;AAEhB,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,MAAM;AACpC,MAAA,OAAA,GAAU,CAAA;AACV,MAAA,QAAA,CAAS,MAAM,CAAA;AAAA,IACjB,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,gBAAA,CAAiB,SAAA,EAAW,CAAC,KAAA,KAAU;AAC5C,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AACpC,QAAA,OAAA,CAAQ,MAAM,CAAA;AACd,QAAA,IAAI,oBAAA,CAAqB,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AACzC,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,gBAAA,CAAiB,OAAA,EAAS,CAAC,UAAA,KAAe;AAC/C,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,OAAA,GAAU,UAAU,CAAA;AACpB,MAAA,MAAA,CAAO,KAAA,EAAM;AACb,MAAA,aAAA,GAAgB,IAAA;AAEhB,MAAA,OAAA,IAAW,CAAA;AACX,MAAA,IAAI,UAAU,0BAAA,EAA4B;AACxC,QAAA,YAAA,EAAa;AACb,QAAA;AAAA,MACF;AAIA,MAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA,CAAI,wBAAwB,CAAA,KAAM,OAAA,GAAU,IAAI,oBAAoB,CAAA;AAC/F,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,EAAO,GAAI,GAAA;AACjC,MAAA,QAAA,CAAS,cAAc,CAAA;AACvB,MAAA,cAAA,GAAiB,UAAA,CAAW,OAAA,EAAS,aAAA,GAAgB,QAAQ,CAAA;AAAA,IAC/D,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAA,EAAQ;AACR,EAAA,OAAO,OAAA;AACT;AAEA,IAAM,aAAA,GAAwC;AAAA,EAC5C,iBAAA,EAAqB,sGAAA;AAAA,EACrB,kBAAA,EAAqB,uGAAA;AAAA,EACrB,eAAA,EAAqB,mGAAA;AAAA,EACrB,mBAAA,EAAqB,sGAAA;AAAA,EACrB,kBAAA,EAAqB,sGAAA;AAAA,EACrB,cAAA,EAAqB,qGAAA;AAAA,EACrB,gBAAA,EAAqB,qGAAA;AAAA,EACrB,iBAAA,EAAqB,uGAAA;AAAA,EACrB,kBAAA,EAAqB;AACvB,CAAA;AAEA,SAAS,cAAc,IAAA,EAAsB;AAC3C,EAAA,OAAO,cAAc,IAAI,CAAA,IAAK,CAAA,8CAAA,EAAiD,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA;AACzG;AAEA,eAAsB,0BAAA,GAA0D;AAC9E,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAA2B,iBAAiB,CAAA;AAElE,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,OAAO,KAAA,KAAU;AAC9C,IAAA,MAAM,GAAA,GAAM,KAAA;AAEZ,IAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,QAAA,IAAY,IAAI,OAAA,IAAW,KAAA,CAAM,MAAM,EAAE,CAAA;AACpE,IAAA,MAAM,EAAA,GAAK,OAAA;AACX,IAAA,MAAM,SAAiB,OAAO,GAAA,CAAI,MAAA,KAAW,QAAA,IAAY,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,GACzE,GAAA,CAAI,SACJ,aAAA,CAAc,MAAA,CAAO,KAAA,CAAM,IAAA,IAAQ,EAAE,CAAC,CAAA;AAC1C,IAAA,MAAM,UAAU,MAAA,CAAO,GAAA,CAAI,QAAA,IAAY,GAAA,CAAI,WAAW,EAAE,CAAA;AACxD,IAAA,MAAM,YAAA,GAAe,OAAO,GAAA,CAAI,aAAA,IAAiB,IAAI,YAAA,IAAgB,GAAA,CAAI,SAAS,CAAC,CAAA;AACnF,IAAA,MAAM,YAAY,MAAA,CAAO,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,aAAa,IAAI,CAAA;AAChE,IAAA,MAAM,UAAA,GAAa,EAAE,GAAG,GAAA,EAAK,SAAS,OAAA,EAAS,YAAA,EAAc,SAAA,EAAW,KAAA,EAAO,YAAA,EAAa;AAC5F,IAAA,IAAI,CAAC,EAAA,EAAI,OAAO,EAAE,GAAI,YAA4C,MAAA,EAAQ,WAAA,EAAa,CAAA,EAAG,mBAAA,EAAqB,CAAA,EAAE;AACjH,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,EAAE,CAAA;AACxC,MAAA,MAAM,eAAe,OAAA,CAAQ,IAAA,CAAK,CAAC,MAAA,KAAW,OAAO,QAAQ,CAAA;AAC7D,MAAA,OAAO;AAAA,QACL,GAAI,UAAA;AAAA,QACJ,MAAA;AAAA,QACA,aAAa,OAAA,CAAQ,MAAA;AAAA,QACrB,mBAAA,EAAqB,cAAc,OAAA,IAAW;AAAA,OAChD;AAAA,IACF,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO;AAAA,QACL,GAAI,UAAA;AAAA,QACJ,MAAA;AAAA,QACA,WAAA,EAAa,CAAA;AAAA,QACb,mBAAA,EAAqB;AAAA,OACvB;AAAA,IACF;AAAA,EACF,CAAC,CAAC,CAAA;AACJ;AAMA,eAAsB,cAAA,GAAwC;AAC5D,EAAA,OAAO,QAAQ,cAAc,CAAA;AAC/B;AAEA,eAAsB,iBAAiB,IAAA,EAA+C;AACpF,EAAA,MAAM,IAAA,GAAO,qBAAqB,IAAI,CAAA;AACtC,EAAA,OAAO,QAAQ,cAAA,EAAgB;AAAA,IAC7B,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,GAC1B,CAAA;AACH;AAcA,SAAS,qBAAqB,IAAA,EAAmD;AAC/E,EAAA,MAAM,eAAA,GAAmD;AAAA,IACvD,MAAA;AAAA,IAAQ,MAAA;AAAA,IAAQ,UAAA;AAAA,IAAY,UAAA;AAAA,IAAY,UAAA;AAAA,IAAY,QAAA;AAAA,IACpD,kBAAA;AAAA,IAAoB,WAAA;AAAA,IAAa,SAAA;AAAA,IAAW,SAAA;AAAA,IAAW,SAAA;AAAA,IACvD,WAAA;AAAA,IAAa,QAAA;AAAA,IAAU,QAAA;AAAA,IAAU,OAAA;AAAA,IAAS,QAAA;AAAA,IAAU,aAAA;AAAA,IACpD,OAAA;AAAA,IAAS,KAAA;AAAA,IAAO;AAAA,GAClB;AACA,EAAA,MAAM,cAAuC,EAAC;AAC9C,EAAA,KAAA,MAAW,OAAO,eAAA,EAAiB;AACjC,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAG,CAAA;AACtB,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,EAAA,IAAM,UAAU,IAAA,EAAM;AACzD,MAAA,WAAA,CAAY,GAAa,CAAA,GAAI,KAAA;AAAA,IAC/B;AAAA,EACF;AACA,EAAA,MAAM,IAAA,GAAgC;AAAA,IACpC,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,SAAS,IAAA,CAAK;AAAA,GAChB;AACA,EAAA,IAAI,OAAO,IAAA,CAAK,WAAW,EAAE,MAAA,GAAS,CAAA,OAAQ,WAAA,GAAc,WAAA;AAC5D,EAAA,IAAI,IAAA,CAAK,iBAAiB,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA,EAAG,IAAA,CAAK,gBAAgB,IAAA,CAAK,aAAA;AACnF,EAAA,IAAI,IAAA,CAAK,kBAAkB,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA,EAAG,IAAA,CAAK,iBAAiB,IAAA,CAAK,cAAA;AACtF,EAAA,IAAI,OAAO,IAAA,CAAK,WAAA,KAAgB,QAAA,EAAU,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AAClE,EAAA,IAAI,OAAO,IAAA,CAAK,SAAA,KAAc,QAAA,EAAU,IAAA,CAAK,YAAY,IAAA,CAAK,SAAA;AAC9D,EAAA,IAAI,OAAO,IAAA,CAAK,QAAA,KAAa,SAAA,EAAW,IAAA,CAAK,WAAW,IAAA,CAAK,QAAA;AAC7D,EAAA,OAAO,IAAA;AACT;AAEA,eAAsB,oBAAoB,YAAA,EAAyC;AACjF,EAAA,OAAO,OAAA,CAAQ,CAAA,aAAA,EAAgB,kBAAA,CAAmB,YAAY,CAAC,CAAA,OAAA,CAAS,CAAA;AAC1E;AAEA,eAAsB,mBAAA,CACpB,cACA,KAAA,EACoE;AACpE,EAAA,OAAO,OAAA,CAAQ,gBAAgB,kBAAA,CAAmB,YAAY,CAAC,CAAA,QAAA,EAAW,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAE,CAAA;AACvG","file":"chunk-SY4MUT5V.js","sourcesContent":["import type {\n AgentModel,\n AgentRule,\n AgentTool,\n WorkflowTool,\n VariableValue,\n Workflow,\n WorkflowGraph,\n WorkflowRun,\n} from '@ui/astrlabe/contracts'\nimport type { AgentWithPrompts } from '@ui/astrlabe'\nimport type { AgentPrompt } from '@datatechsolutions/shared-domain/ports/workflow'\nimport type { AgentConfigLike, DataSource } from '@datatechsolutions/shared-domain/common'\nimport { HttpResponseError } from '@datatechsolutions/shared-domain/common'\nimport { buildLambdaApiUrl } from './utils/lambda-endpoint'\nimport type { DatasourceFormData } from './pages/datasource-modal'\n\n// ---------------------------------------------------------------------------\n// Module-level authenticated fetch — set by setAuthenticatedFetch() during\n// provider initialization. This lets plain async functions (non-hooks) make\n// authenticated API calls without needing React context.\n// ---------------------------------------------------------------------------\nlet _authFetch: typeof fetch = fetch\n\n/**\n * Register an authenticated fetch function (call once from a provider/layout).\n * After this, all workflow API calls automatically include the JWT token.\n */\nexport function setAuthenticatedFetch(authFetch: typeof fetch): void {\n _authFetch = authFetch\n}\n\n// ---------------------------------------------------------------------------\n// Access token provider — used by SSE (EventSource cannot set headers, so\n// we pass the token as `?accessToken=<token>` on the event stream URL).\n// ---------------------------------------------------------------------------\n\nlet _tokenProvider: () => Promise<string | null> = async () => null\n\nexport function setAccessTokenProvider(provider: () => Promise<string | null>): void {\n _tokenProvider = provider\n}\n\nexport async function getCurrentAccessToken(): Promise<string | null> {\n try {\n return await _tokenProvider()\n } catch {\n return null\n }\n}\n\n/**\n * Build a full URL for a workflow API path, optionally appending the current\n * access token as a query parameter. Useful for APIs that require auth but\n * cannot set custom headers (EventSource, direct links).\n */\nexport async function buildAuthenticatedApiUrl(\n path: string,\n options: { includeAccessToken?: boolean } = {},\n): Promise<string> {\n const baseUrl = useExternalWorkflowApi()\n ? resolveWorkflowApiBaseUrl()\n : buildLambdaApiUrl('').replace(/\\/$/, '')\n const url = new URL(`${baseUrl}${path}`)\n if (options.includeAccessToken) {\n const token = await getCurrentAccessToken()\n if (token && token.length > 0) {\n url.searchParams.set('accessToken', token)\n }\n }\n return url.toString()\n}\n\n// ---------------------------------------------------------------------------\n// Config helpers\n// ---------------------------------------------------------------------------\n\nfunction useExternalWorkflowApi(): boolean {\n return import.meta.env.VITE_WORKFLOW_API_MODE === 'external'\n}\n\nfunction resolveWorkflowApiBaseUrl(): string {\n const baseUrl = import.meta.env.VITE_WORKFLOW_API_BASE_URL\n if (!baseUrl || baseUrl.trim().length === 0) {\n throw new Error('Missing VITE_WORKFLOW_API_BASE_URL for external workflow API mode')\n }\n return baseUrl.replace(/\\/$/, '')\n}\n\nfunction getPublishableKey(): string {\n const key = import.meta.env.VITE_WORKFLOW_BUILDER_PUBLISHABLE_KEY\n if (!key || key.trim().length === 0) {\n throw new Error('Missing VITE_WORKFLOW_BUILDER_PUBLISHABLE_KEY')\n }\n return key\n}\n\n// ---------------------------------------------------------------------------\n// Core request function — uses the registered authenticated fetch\n// ---------------------------------------------------------------------------\n\nasync function request<T>(path: string, init?: RequestInit): Promise<T> {\n const publishableKey = useExternalWorkflowApi() ? getPublishableKey() : null\n\n const baseUrl = publishableKey\n ? resolveWorkflowApiBaseUrl()\n : buildLambdaApiUrl('').replace(/\\/$/, '')\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n if (publishableKey) {\n headers.Authorization = `Bearer ${publishableKey}`\n headers['X-Workflow-Key'] = publishableKey\n }\n\n const response = await _authFetch(`${baseUrl}${path}`, {\n ...init,\n credentials: init?.credentials ?? 'include',\n headers: { ...headers, ...(init?.headers as Record<string, string> | undefined) },\n })\n\n if (response.status === 204) return undefined as T\n\n const payload = await response.json().catch(() => null)\n\n if (!response.ok) {\n const message = (payload as { error?: string; message?: string })?.message\n ?? (payload as { error?: string })?.error\n ?? `HTTP ${response.status}: ${response.statusText}`\n throw new HttpResponseError(message, response.status)\n }\n\n // Unwrap any `{ data: T }` envelope the Rust API returns. Some handlers\n // emit `{ success: true, data: T }`; others (list endpoints like\n // `/rules`, `/workflows`) emit just `{ data: T }`. Treating the presence\n // of a top-level `data` key as the signal is what shields pages from\n // the mismatch — without this, callers like `getAgentRules` fall through\n // to `payload.data` manually, and any null/empty body crashes the\n // `rules.map(...)` render with \"Cannot read properties of undefined\".\n if (\n payload &&\n typeof payload === 'object'\n && 'data' in payload\n && (!('success' in payload) || (payload as { success: boolean }).success !== false)\n ) {\n return (payload as { data: T }).data\n }\n\n return payload as T\n}\n\nasync function requestPublic<T>(path: string, init?: RequestInit): Promise<T> {\n const externalBaseUrl = import.meta.env.VITE_WORKFLOW_API_BASE_URL?.trim()\n const baseUrl = externalBaseUrl && externalBaseUrl.length > 0\n ? externalBaseUrl.replace(/\\/$/, '')\n : buildLambdaApiUrl('').replace(/\\/$/, '')\n\n const response = await fetch(`${baseUrl}${path}`, {\n ...init,\n credentials: init?.credentials ?? 'include',\n headers: {\n 'Content-Type': 'application/json',\n ...(init?.headers as Record<string, string> | undefined),\n },\n })\n\n if (response.status === 204) return undefined as T\n\n const payload = await response.json().catch(() => null)\n\n if (!response.ok) {\n const message = (payload as { error?: string; message?: string })?.message\n ?? (payload as { error?: string })?.error\n ?? `HTTP ${response.status}: ${response.statusText}`\n throw new HttpResponseError(message, response.status)\n }\n\n if (payload && typeof payload === 'object' && 'success' in payload && (payload as { success: boolean }).success && 'data' in payload) {\n return (payload as { data: T }).data\n }\n\n return payload as T\n}\n\n// ---------------------------------------------------------------------------\n// AI workflow assistants\n// ---------------------------------------------------------------------------\n\nexport type NodeValidationIssue = {\n nodeId: string\n nodeType: string\n field?: string\n code: string\n message: string\n}\n\nexport type AiValidateResponse = {\n ok: boolean\n structuralIssues: string[]\n nodeIssues: NodeValidationIssue[]\n rationale?: string | null\n}\n\nexport async function aiValidateWorkflow(body: {\n graph: WorkflowGraph\n connectionId?: string\n}): Promise<AiValidateResponse> {\n return request('/workflows/validate/ai', {\n method: 'POST',\n body: JSON.stringify(body),\n })\n}\n\nexport type AiGenerateResponse = {\n graph: WorkflowGraph\n ok: boolean\n structuralIssues: string[]\n nodeIssues: NodeValidationIssue[]\n rationale?: string | null\n}\n\nexport async function aiGenerateWorkflow(body: {\n prompt: string\n connectionId: string\n context?: string\n}): Promise<AiGenerateResponse> {\n return request('/workflows/generate/ai', {\n method: 'POST',\n body: JSON.stringify(body),\n })\n}\n\n// ---------------------------------------------------------------------------\n// Workflow CRUD\n// ---------------------------------------------------------------------------\n\nexport async function getWorkflows(): Promise<Workflow[]> {\n return request('/workflows')\n}\n\nexport async function getWorkflowById(workflowId: string): Promise<Workflow> {\n return request(`/workflows/${encodeURIComponent(workflowId)}`)\n}\n\nexport async function createWorkflow(data: { name: string; description?: string }): Promise<Workflow> {\n return request('/workflows', {\n method: 'POST',\n body: JSON.stringify(data),\n })\n}\n\nexport async function deleteWorkflow(workflowId: string): Promise<{ deleted: boolean }> {\n return request(`/workflows/${encodeURIComponent(workflowId)}`, {\n method: 'DELETE',\n })\n}\n\nexport async function saveWorkflowDraft(\n workflowId: string,\n graph: WorkflowGraph,\n metadata?: {\n name?: string\n description?: string\n slug?: string | null\n isDraft?: boolean\n isActive?: boolean\n },\n): Promise<Workflow> {\n return request(`/workflows/${encodeURIComponent(workflowId)}`, {\n method: 'PATCH',\n body: JSON.stringify({ graph, ...metadata }),\n })\n}\n\n/**\n * Settings modal PATCH — updates the workflow's identity + lifecycle\n * fields in one call. Pass `isDraft: true` to move a published workflow\n * back to draft, `isActive: false` to archive, etc. Anything omitted is\n * left untouched.\n */\nexport async function updateWorkflowSettings(\n workflowId: string,\n changes: {\n name?: string\n description?: string\n slug?: string | null\n isDraft?: boolean\n isActive?: boolean\n },\n): Promise<Workflow> {\n return request(`/workflows/${encodeURIComponent(workflowId)}`, {\n method: 'PATCH',\n body: JSON.stringify(changes),\n })\n}\n\nexport async function publishWorkflow(workflowId: string): Promise<Workflow> {\n return request(`/workflows/${encodeURIComponent(workflowId)}/publish`, {\n method: 'POST',\n })\n}\n\nexport async function executeWorkflow(\n workflowId: string,\n inputVariables?: Record<string, VariableValue>\n): Promise<WorkflowRun> {\n return request(`/workflows/${encodeURIComponent(workflowId)}/execute`, {\n method: 'POST',\n body: JSON.stringify({ inputVariables: inputVariables ?? {} }),\n })\n}\n\nexport async function getWorkflowRuns(workflowId: string): Promise<WorkflowRun[]> {\n return request(`/workflows/${encodeURIComponent(workflowId)}/execute`)\n}\n\n// ---------------------------------------------------------------------------\n// Workflow templates\n// ---------------------------------------------------------------------------\n\nexport interface WorkflowTemplateSummary {\n id: string\n name: string\n description: string\n tags: string[]\n}\n\nexport async function listWorkflowTemplates(): Promise<WorkflowTemplateSummary[]> {\n return request('/workflows/templates')\n}\n\n/**\n * Instantiate a workflow from a template. `connectionId` is required when\n * the template references a `{{connectionId}}` placeholder (all LLM-backed\n * templates do).\n */\nexport async function createWorkflowFromTemplate(\n templateId: string,\n body: { connectionId?: string; name?: string }\n): Promise<Workflow> {\n return request(`/workflows/templates/${encodeURIComponent(templateId)}`, {\n method: 'POST',\n body: JSON.stringify(body),\n })\n}\n\n// ---------------------------------------------------------------------------\n// Model provider connections (org-scoped LLM providers)\n// ---------------------------------------------------------------------------\n\nexport interface ModelProviderConnection {\n id: string\n organizationId: string\n providerId: string\n providerSlug?: string\n name: string\n region?: string\n endpoint?: string\n credentialRef?: string\n apiKeyRef?: string\n modelFilter?: string[]\n config?: Record<string, unknown>\n enabled: boolean\n createdAt?: string\n updatedAt?: string\n}\n\nexport async function listModelProviderConnections(): Promise<ModelProviderConnection[]> {\n return request('/agents/connections')\n}\n\n/**\n * One model family record joined onto a provider in the catalog.\n * Mirrors the `FamilyView` shape returned by `agents_providers.rs`.\n */\nexport type ModelFamilyCatalogEntry = {\n id: string\n slug: string\n name: string\n modelIds: string[]\n maxTokens?: number | null\n contextWindow?: string | null\n supportsTools?: boolean | null\n supportsVision?: boolean | null\n costTier?: string | null\n}\n\n/**\n * Catalog of supported LLM providers. Previously hard-coded in the\n * connections modal; now backed by `astrlabe.model_providers` +\n * `astrlabe.model_families` so new providers can be added server-side\n * without a frontend release.\n */\nexport type ModelProviderCatalogEntry = {\n id: string\n slug: string\n /** Slug normalized into the `ModelProviderType` enum the runtime uses. */\n normalizedSlug: string\n name: string\n category?: string | null\n logoUrl?: string | null\n docsUrl?: string | null\n authType?: string | null\n /**\n * Full family records joined from `model_families`. Empty array if no\n * families are seeded for this provider (`custom`, where the operator\n * supplies the model id at node-config time).\n */\n families: ModelFamilyCatalogEntry[]\n /** @deprecated — array of family slugs only. New callers read `families`. */\n supportedModelFamilies?: unknown\n regions?: string[] | null\n enabled: boolean\n}\n\nexport async function listModelProviderCatalog(): Promise<ModelProviderCatalogEntry[]> {\n const response = await request<ModelProviderCatalogEntry[] | { data: ModelProviderCatalogEntry[] }>(\n '/agents/providers',\n )\n if (Array.isArray(response)) return response\n if (response && typeof response === 'object' && Array.isArray((response as { data?: unknown }).data)) {\n return (response as { data: ModelProviderCatalogEntry[] }).data\n }\n return []\n}\n\nexport async function createModelProviderConnection(body: {\n providerSlug?: string\n providerId?: string\n name: string\n region?: string\n endpoint?: string\n credentialRef?: string\n apiKeyRef?: string\n modelFilter?: string[]\n config?: Record<string, unknown>\n}): Promise<ModelProviderConnection> {\n return request('/agents/connections', {\n method: 'POST',\n body: JSON.stringify(body),\n })\n}\n\nexport async function updateModelProviderConnection(\n id: string,\n body: {\n name?: string\n region?: string\n endpoint?: string\n credentialRef?: string\n apiKeyRef?: string\n modelFilter?: string[]\n config?: Record<string, unknown>\n enabled?: boolean\n },\n): Promise<ModelProviderConnection> {\n return request(`/agents/connections/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n })\n}\n\nexport async function deleteModelProviderConnection(id: string): Promise<{ deleted: boolean }> {\n return request(`/agents/connections/${encodeURIComponent(id)}`, {\n method: 'DELETE',\n })\n}\n\n// ---------------------------------------------------------------------------\n// Agent config & prompts\n// ---------------------------------------------------------------------------\n\nexport async function getAgentPrompts(agentId: string): Promise<AgentPrompt[]> {\n return request(`/agents/prompts?agentId=${encodeURIComponent(agentId)}`)\n}\n\nexport async function getAgentModels(): Promise<AgentModel[]> {\n return request('/agents/models')\n}\n\nexport async function getAgentTools(agentId: string): Promise<WorkflowTool[]> {\n return request(`/agents/tools?agentId=${encodeURIComponent(agentId)}`)\n}\n\nexport async function updateAgentTool(toolId: string, updates: Partial<WorkflowTool>): Promise<WorkflowTool> {\n // Backend PATCH lives at `/agents/tools` (collection) and takes `id`\n // in the body rather than as a path parameter. The `enabled` field the\n // legacy client passed maps to `isEnabled`; `configOverrides` lets\n // callers tweak a workflow-tool binding's overrides without touching\n // the underlying definition.\n const wire: Record<string, unknown> = { id: toolId }\n if (typeof updates.enabled === 'boolean') wire.isEnabled = updates.enabled\n const overrides = (updates as { configOverrides?: unknown }).configOverrides\n if (overrides !== undefined) wire.configOverrides = overrides\n return request('/agents/tools', {\n method: 'PATCH',\n body: JSON.stringify(wire),\n })\n}\n\nexport async function createAgentTool(\n tool: Omit<WorkflowTool, 'organizationId' | 'createdAt' | 'updatedAt'>\n): Promise<WorkflowTool> {\n return request('/agents/tools', {\n method: 'POST',\n body: JSON.stringify(tool),\n })\n}\n\nexport async function deleteAgentTool(toolId: string): Promise<{ deleted: boolean }> {\n return request(`/agents/tools/${encodeURIComponent(toolId)}`, {\n method: 'DELETE',\n })\n}\n\n// ---------------------------------------------------------------------------\n// Agent Tool Definitions (tools available to agents, e.g. web search, code interpreter)\n// ---------------------------------------------------------------------------\n\nexport async function getAgentToolDefinitions(): Promise<AgentTool[]> {\n return request('/agents/tool-definitions')\n}\n\n/**\n * Create a custom agent tool definition. The backend (`POST\n * /agents/tool-definitions`) requires:\n * { name, description, toolType, inputSchema, handlerConfig }\n * where `inputSchema` is a JSON-Schema object with `type` + `properties`.\n */\nexport async function createAgentToolDefinition(\n toolDef: {\n name: string\n description?: string\n toolType: string\n inputSchema: Record<string, unknown>\n handlerConfig: Record<string, unknown>\n },\n): Promise<AgentTool> {\n return request('/agents/tool-definitions', {\n method: 'POST',\n body: JSON.stringify(toolDef),\n })\n}\n\n// ---------------------------------------------------------------------------\n// Rules\n// ---------------------------------------------------------------------------\n\nexport async function getAgentRules(): Promise<AgentRule[]> {\n const response = await request<AgentRule[] | { data: AgentRule[] } | null | undefined>('/rules')\n if (Array.isArray(response)) return response\n if (response && typeof response === 'object' && Array.isArray((response as { data?: unknown }).data)) {\n return (response as { data: AgentRule[] }).data\n }\n return []\n}\n\nexport async function updateAgentRule(\n ruleId: string,\n updates: Partial<AgentRule> & Record<string, unknown>,\n): Promise<AgentRule> {\n return request(`/rules/${encodeURIComponent(ruleId)}`, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n })\n}\n\nexport async function createAgentRule(\n rule: Partial<AgentRule> & Record<string, unknown>,\n): Promise<AgentRule> {\n return request('/rules', {\n method: 'POST',\n body: JSON.stringify(rule),\n })\n}\n\nexport async function deleteAgentRule(ruleId: string): Promise<{ deleted: boolean }> {\n return request(`/rules/${encodeURIComponent(ruleId)}`, {\n method: 'DELETE',\n })\n}\n\nexport async function executeAgentRule(ruleId: string, input: Record<string, unknown>): Promise<unknown> {\n return request(`/rules/${encodeURIComponent(ruleId)}/execute`, {\n method: 'POST',\n body: JSON.stringify(input),\n })\n}\n\n// ---------------------------------------------------------------------------\n// Agent Configs (CRUD — agents_config handler)\n// ---------------------------------------------------------------------------\n\nexport async function createAgentConfig(input: Partial<AgentConfigLike>): Promise<AgentConfigLike> {\n return request('/agents/configs', {\n method: 'POST',\n body: JSON.stringify(input),\n })\n}\n\nexport async function updateAgentConfig(agentId: string, updates: Partial<AgentConfigLike>): Promise<AgentConfigLike> {\n return request(`/agents/configs/${encodeURIComponent(agentId)}`, {\n method: 'PATCH',\n body: JSON.stringify(updates),\n })\n}\n\nexport async function deleteAgentConfig(agentId: string): Promise<{ deleted: boolean }> {\n return request(`/agents/configs/${encodeURIComponent(agentId)}`, {\n method: 'DELETE',\n })\n}\n\n// ---------------------------------------------------------------------------\n// Agent Prompts (versioned prompt library)\n// ---------------------------------------------------------------------------\n\nexport async function createAgentPrompt(input: Omit<AgentPrompt, 'promptId' | 'version' | 'createdAt'>): Promise<AgentPrompt> {\n return request('/agents/prompts', {\n method: 'POST',\n body: JSON.stringify(input),\n })\n}\n\nexport async function updateAgentPrompt(promptId: string, updates: Partial<AgentPrompt>): Promise<AgentPrompt> {\n // Backend route is the collection PATCH `/agents/prompts` — id rides\n // in the body as `promptId`. The handler also requires `promptText`\n // (it overwrites the active version's text), so coerce the legacy\n // partial-AgentPrompt payload into that shape.\n const promptText = (updates as { promptText?: unknown }).promptText\n ?? (updates as { systemPrompt?: unknown }).systemPrompt\n ?? (updates as { content?: unknown }).content\n if (typeof promptText !== 'string' || promptText.length === 0) {\n throw new Error('updateAgentPrompt: `promptText` (or `systemPrompt`/`content`) is required')\n }\n return request('/agents/prompts', {\n method: 'PATCH',\n body: JSON.stringify({ promptId, promptText }),\n })\n}\n\nexport async function deleteAgentPrompt(promptId: string): Promise<{ deleted: boolean }> {\n // The collection route does not expose DELETE today. Surface a clear\n // error rather than silently 404 — callers are using soft-delete via\n // an enabled toggle on the prompt instead.\n void promptId\n throw new Error('deleteAgentPrompt is not supported by the backend yet — disable the prompt via PATCH instead')\n}\n\n// ---------------------------------------------------------------------------\n// Agent Tool Definitions — update / delete\n// ---------------------------------------------------------------------------\n\n/**\n * Patch an existing tool definition. The Rust handler takes the id in\n * the BODY (`toolId`) rather than the URL, and accepts a narrower set\n * of fields than create: `{toolId, name?, description?, parameters?,\n * implementationKey?}`. `implementationKey` is a JSON string that wraps\n * `handlerConfig` — the page wrapper produces that shape before calling.\n */\nexport async function updateAgentToolDefinition(\n agentToolId: string,\n updates: {\n name?: string\n description?: string\n parameters?: Record<string, unknown>\n implementationKey?: string\n },\n): Promise<AgentTool> {\n return request('/agents/tool-definitions', {\n method: 'PATCH',\n body: JSON.stringify({ toolId: agentToolId, ...updates }),\n })\n}\n\nexport async function deleteAgentToolDefinition(agentToolId: string): Promise<{ deleted: boolean }> {\n return request('/agents/tool-definitions', {\n method: 'DELETE',\n body: JSON.stringify({ toolId: agentToolId }),\n })\n}\n\n// ---------------------------------------------------------------------------\n// Workflow Runs — detail, cancel, replay\n// ---------------------------------------------------------------------------\n\nexport type WorkflowRunListParams = {\n workflowId?: string\n status?: string\n limit?: number\n offset?: number\n}\n\nexport async function listWorkflowRuns(params?: WorkflowRunListParams): Promise<{ items: WorkflowRun[]; total: number }> {\n const query = new URLSearchParams()\n if (params?.workflowId) query.set('workflowId', params.workflowId)\n if (params?.status) query.set('status', params.status)\n if (params?.limit) query.set('limit', String(params.limit))\n if (params?.offset) query.set('offset', String(params.offset))\n const path = query.toString().length > 0 ? `/workflow-runs?${query}` : '/workflow-runs'\n return request(path)\n}\n\nexport async function getWorkflowRunById(runId: string): Promise<WorkflowRun> {\n return request(`/workflow-runs/${encodeURIComponent(runId)}`)\n}\n\nexport async function cancelWorkflowRun(runId: string): Promise<WorkflowRun> {\n return request(`/workflow-runs/${encodeURIComponent(runId)}/cancel`, {\n method: 'POST',\n })\n}\n\nexport async function replayWorkflowRun(\n workflowId: string,\n runId: string,\n overrides?: Record<string, VariableValue>,\n): Promise<WorkflowRun> {\n // Empty body → exact rerun (legacy behaviour). With `overrides`, the\n // backend shallow-merges over the original `input_variables`.\n const body = overrides && Object.keys(overrides).length > 0\n ? JSON.stringify({ inputVariables: overrides })\n : undefined\n return request(\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/replay`,\n { method: 'POST', body },\n )\n}\n\nexport type NodeMetrics = {\n tokensIn?: number\n tokensOut?: number\n costUsd?: number\n provider?: string\n model?: string\n}\n\nexport type RunTimelineEntry = {\n nodeId: string\n nodeType: string\n status: 'pending' | 'running' | 'completed' | 'failed' | 'skipped'\n startedAt: string | null\n completedAt: string | null\n durationMs: number | null\n inputs?: Record<string, unknown>\n outputs?: Record<string, unknown>\n error?: string\n metrics?: NodeMetrics\n}\n\nexport async function getRunTimeline(workflowId: string, runId: string): Promise<RunTimelineEntry[]> {\n return request(\n `/workflows/${encodeURIComponent(workflowId)}/runs/${encodeURIComponent(runId)}/timeline`,\n )\n}\n\n// ---------------------------------------------------------------------------\n// Analytics (analytics_runs handler)\n// ---------------------------------------------------------------------------\n\nexport type AnalyticsSummary = {\n totalRuns: number\n runsByStatus: Record<string, number>\n avgDurationMs: number\n successRate: number\n perWorkflow: Array<{ workflowId: string; name: string; runs: number; successRate: number }>\n series?: Array<{ date: string; runs: number; successes: number; failures: number }>\n}\n\nexport async function getAnalyticsSummary(params?: { from?: string; to?: string }): Promise<AnalyticsSummary> {\n const query = new URLSearchParams()\n if (params?.from) query.set('from', params.from)\n if (params?.to) query.set('to', params.to)\n const path = query.toString().length > 0 ? `/analytics/runs?${query}` : '/analytics/runs'\n return request(path)\n}\n\n// ---------------------------------------------------------------------------\n// Uploads — presigned S3 upload/download\n// ---------------------------------------------------------------------------\n\nexport type PresignUploadInput = {\n fileName: string\n contentType: string\n fileSize?: number\n folder?: string\n}\n\nexport type PresignedUpload = {\n uploadUrl: string\n downloadUrl: string\n objectKey: string\n expiresAt: string\n}\n\nexport async function presignUpload(input: PresignUploadInput): Promise<PresignedUpload> {\n return request('/uploads', {\n method: 'POST',\n body: JSON.stringify(input),\n })\n}\n\nexport async function getUploadDownloadUrl(objectKey: string): Promise<{ downloadUrl: string }> {\n return request(`/uploads/${encodeURIComponent(objectKey)}`)\n}\n\nexport async function deleteUpload(objectKey: string): Promise<{ deleted: boolean }> {\n return request(`/uploads/${encodeURIComponent(objectKey)}`, {\n method: 'DELETE',\n })\n}\n\n// ---------------------------------------------------------------------------\n// Run Events — SSE subscription helper\n// ---------------------------------------------------------------------------\n\nexport type RunEvent = {\n /**\n * Discriminator for the event payload. The set is open-ended on purpose\n * — Phase 2/3 of the generative-UI work adds `ui-render` (per-section\n * progressive rendering) and `run-paused` (operator-input pause) without\n * a breaking change.\n */\n type:\n | 'run-started'\n | 'node-started'\n | 'node-completed'\n | 'node-failed'\n | 'run-completed'\n | 'run-failed'\n | 'run-paused'\n | 'ui-render'\n | 'log'\n runId: string\n nodeId?: string\n data?: Record<string, unknown>\n timestamp: string\n}\n\n// ---------------------------------------------------------------------------\n// Public sample workflows\n// ---------------------------------------------------------------------------\n\nexport type PublicSampleWorkflow = {\n slug: string\n name: string | null\n description: string | null\n graph: WorkflowGraph\n version: number | null\n publishedAt: string | null\n}\n\nexport async function getPublicSampleWorkflow(slug: string): Promise<PublicSampleWorkflow> {\n return requestPublic(`/samples/workflows/${encodeURIComponent(slug)}`)\n}\n\n// ---------------------------------------------------------------------------\n// Approvals (resolves a paused human_approval node)\n// ---------------------------------------------------------------------------\n\nexport type ApprovalDecision = {\n /** True approves and resumes the run; false fails it with `reason`. */\n approved: boolean\n /** Operator-supplied rationale, surfaced on the audit row. */\n reason?: string\n /**\n * Captured payload — for `input_request` sections this carries the\n * form field values. The downstream workflow nodes read it from\n * `inputs.approvals.<nodeId>.payload`.\n */\n payload?: Record<string, unknown>\n}\n\nexport type ApprovalResponse = {\n approvalId: string\n sourceRunId: string\n resumedRunId: string\n nodeId: string\n approved: boolean\n status: string\n}\n\n/**\n * Resolve a paused workflow run by recording an operator decision.\n * The backend writes an audit row, merges the decision into the run's\n * inputs, and re-executes — see #457.\n */\nexport async function submitApproval(\n runId: string,\n nodeId: string,\n decision: ApprovalDecision,\n): Promise<ApprovalResponse> {\n return request<ApprovalResponse>(\n `/workflow-runs/${encodeURIComponent(runId)}/approvals/${encodeURIComponent(nodeId)}`,\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(decision),\n },\n )\n}\n\n/**\n * Connection state for {@link subscribeToRunEvents}. UI consumers can\n * surface this — e.g. show \"reconnecting…\" badge — by passing an\n * `onState` callback.\n */\nexport type RunSubscriptionState = 'live' | 'reconnecting' | 'polling' | 'closed'\n\nconst SSE_MAX_RECONNECT_ATTEMPTS = 5\nconst SSE_RECONNECT_BASE_MS = 1_000\nconst SSE_RECONNECT_CAP_MS = 16_000\nconst POLLING_INTERVAL_MS = 5_000\n\nconst TERMINAL_EVENT_TYPES: ReadonlySet<RunEvent['type']> = new Set([\n 'run-completed',\n 'run-failed',\n])\n\nconst TERMINAL_RUN_STATUSES: ReadonlySet<string> = new Set([\n 'completed',\n 'failed',\n 'cancelled',\n])\n\n/**\n * Subscribe to a run's event stream with auto-reconnect + polling fallback.\n *\n * The default `EventSource` drops silently on idle proxies / cold-restarts\n * (CloudFront + Lambda Function URL combo at customer scale will close\n * an idle connection after ~30–60s). When that happens the run viewer\n * looks frozen with no signal to the user.\n *\n * Lifecycle:\n * 1. Open SSE. On `open`, state = `live`.\n * 2. On `error`, close the source and exponential-backoff (1s → 2s → 4s\n * → 8s → 16s, with jitter). State = `reconnecting`.\n * 3. After {@link SSE_MAX_RECONNECT_ATTEMPTS} failures, fall back to\n * polling `GET /workflow-runs/{runId}` every 5s. State = `polling`.\n * 4. On terminal event (`run-completed` / `run-failed`) or terminal\n * polled status (completed/failed/cancelled), close + state = `closed`.\n * 5. Returned disposer also flips to `closed`; idempotent.\n *\n * Backwards-compatible with the previous 3-arg signature; pass `onState`\n * as a 4th arg if you want to render connection-state UI.\n */\nexport function subscribeToRunEvents(\n runId: string,\n onEvent: (event: RunEvent) => void,\n onError?: (error: Event) => void,\n onState?: (state: RunSubscriptionState) => void,\n): () => void {\n let cancelled = false\n let attempt = 0\n let currentSource: EventSource | null = null\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null\n let pollingTimer: ReturnType<typeof setInterval> | null = null\n\n const setState = (state: RunSubscriptionState) => {\n if (!cancelled) onState?.(state)\n }\n\n const cleanup = () => {\n if (cancelled) return\n cancelled = true\n if (currentSource) {\n currentSource.close()\n currentSource = null\n }\n if (reconnectTimer) {\n clearTimeout(reconnectTimer)\n reconnectTimer = null\n }\n if (pollingTimer) {\n clearInterval(pollingTimer)\n pollingTimer = null\n }\n setState('closed')\n }\n\n const startPolling = () => {\n if (cancelled) return\n setState('polling')\n pollingTimer = setInterval(() => {\n if (cancelled) return\n void getWorkflowRunById(runId)\n .then((run) => {\n if (cancelled) return\n // Surface a synthetic event so the consumer's onEvent path is\n // the single sink for both SSE + polling. Reuses the `log`\n // type with a marker payload — no schema change needed.\n onEvent({\n type: 'log',\n runId,\n data: { source: 'polling-fallback', run: run as unknown as Record<string, unknown> },\n timestamp: new Date().toISOString(),\n } as RunEvent)\n if (run.status && TERMINAL_RUN_STATUSES.has(run.status)) {\n cleanup()\n }\n })\n .catch(() => {\n // Swallow transient polling errors — the next tick will retry.\n })\n }, POLLING_INTERVAL_MS)\n }\n\n const connect = () => {\n if (cancelled) return\n\n const baseUrl = buildLambdaApiUrl('').replace(/\\/$/, '')\n const url = `${baseUrl}/workflow-runs/${encodeURIComponent(runId)}/events`\n const source = new EventSource(url, { withCredentials: true })\n currentSource = source\n\n source.addEventListener('open', () => {\n attempt = 0\n setState('live')\n })\n\n source.addEventListener('message', (event) => {\n try {\n const parsed = JSON.parse(event.data) as RunEvent\n onEvent(parsed)\n if (TERMINAL_EVENT_TYPES.has(parsed.type)) {\n cleanup()\n }\n } catch {\n // ignore malformed messages\n }\n })\n\n source.addEventListener('error', (errorEvent) => {\n if (cancelled) return\n onError?.(errorEvent)\n source.close()\n currentSource = null\n\n attempt += 1\n if (attempt > SSE_MAX_RECONNECT_ATTEMPTS) {\n startPolling()\n return\n }\n\n // Exponential backoff with jitter to avoid synchronous thundering\n // herd if many viewers reconnect at the same moment.\n const exponentialMs = Math.min(SSE_RECONNECT_BASE_MS * 2 ** (attempt - 1), SSE_RECONNECT_CAP_MS)\n const jitterMs = Math.random() * 500\n setState('reconnecting')\n reconnectTimer = setTimeout(connect, exponentialMs + jitterMs)\n })\n }\n\n connect()\n return cleanup\n}\n\nconst AGENT_AVATARS: Record<string, string> = {\n 'Sales Assistant': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Rafael&hair=variant01&beardProbability=0&mouth=happy01',\n 'Sales Specialist': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Marcos&hair=variant15&beardProbability=50&mouth=happy02',\n 'Support Agent': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Ana&hair=variant43&beardProbability=0&mouth=happy01',\n 'Financial Analyst': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Lucas&hair=variant08&beardProbability=50&mouth=happy02',\n 'Security Analyst': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Pedro&hair=variant22&beardProbability=50&mouth=happy01',\n 'Data Analyst': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Julia&hair=variant29&beardProbability=0&mouth=happy01',\n 'Market Analyst': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Diego&hair=variant12&beardProbability=0&mouth=happy02',\n 'Pricing Manager': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Beatriz&hair=variant38&beardProbability=0&mouth=happy01',\n 'Onboarding Agent': 'https://api.dicebear.com/9.x/lorelei/svg?seed=Camila&hair=variant35&beardProbability=0&mouth=happy01',\n}\n\nfunction defaultAvatar(name: string): string {\n return AGENT_AVATARS[name] ?? `https://api.dicebear.com/9.x/lorelei/svg?seed=${encodeURIComponent(name)}`\n}\n\nexport async function getAgentConfigsWithPrompts(): Promise<AgentWithPrompts[]> {\n const configs = await request<AgentConfigLike[]>('/agents/configs')\n\n return Promise.all(configs.map(async (agent) => {\n const raw = agent as Record<string, unknown>\n // Normalize snake_case from Rust API to camelCase\n const agentId = String(raw.agent_id ?? raw.agentId ?? agent.id ?? '')\n const id = agentId\n const avatar: string = typeof raw.avatar === 'string' && raw.avatar.length > 0\n ? raw.avatar\n : defaultAvatar(String(agent.name ?? ''))\n const modelId = String(raw.model_id ?? raw.modelId ?? '')\n const displayOrder = Number(raw.display_order ?? raw.displayOrder ?? raw.order ?? 0)\n const maxTokens = Number(raw.max_tokens ?? raw.maxTokens ?? 2048)\n const normalized = { ...raw, agentId, modelId, displayOrder, maxTokens, order: displayOrder }\n if (!id) return { ...(normalized as unknown as AgentWithPrompts), avatar, promptCount: 0, activePromptVersion: 0 }\n try {\n const prompts = await getAgentPrompts(id)\n const activePrompt = prompts.find((prompt) => prompt.isActive)\n return {\n ...(normalized as unknown as AgentWithPrompts),\n avatar,\n promptCount: prompts.length,\n activePromptVersion: activePrompt?.version ?? 0,\n }\n } catch {\n return {\n ...(normalized as unknown as AgentWithPrompts),\n avatar,\n promptCount: 0,\n activePromptVersion: 0,\n }\n }\n }))\n}\n\n// ---------------------------------------------------------------------------\n// Datasources\n// ---------------------------------------------------------------------------\n\nexport async function getDatasources(): Promise<DataSource[]> {\n return request('/datasources')\n}\n\nexport async function createDatasource(data: DatasourceFormData): Promise<DataSource> {\n const body = toDatasourceWireBody(data)\n return request('/datasources', {\n method: 'POST',\n body: JSON.stringify(body),\n })\n}\n\n/**\n * Group the flat `DatasourceFormData` shape (that the modal captures off\n * form state) into the nested body the backend expects:\n *\n * { name, dialect,\n * credentials: { host, port, database, username, password, ... },\n * allowedTables, blockedColumns, maxPoolSize, timeoutMs, readOnly }\n *\n * The handler's `ingest_credentials` pulls secret-shaped keys out of\n * `credentials` into the vault, so the plaintext password never lands\n * on the row. Governance fields stay top-level.\n */\nfunction toDatasourceWireBody(data: DatasourceFormData): Record<string, unknown> {\n const CREDENTIAL_KEYS: Array<keyof DatasourceFormData> = [\n 'host', 'port', 'database', 'username', 'password', 'schema',\n 'connectionString', 'projectId', 'dataset', 'keyFile', 'account',\n 'warehouse', 'region', 'bucket', 'token', 'apiKey', 'environment',\n 'index', 'url', 'ssl',\n ]\n const credentials: Record<string, unknown> = {}\n for (const key of CREDENTIAL_KEYS) {\n const value = data[key]\n if (value !== undefined && value !== '' && value !== null) {\n credentials[key as string] = value\n }\n }\n const body: Record<string, unknown> = {\n name: data.name,\n dialect: data.dialect,\n }\n if (Object.keys(credentials).length > 0) body.credentials = credentials\n if (data.allowedTables && data.allowedTables.length > 0) body.allowedTables = data.allowedTables\n if (data.blockedColumns && data.blockedColumns.length > 0) body.blockedColumns = data.blockedColumns\n if (typeof data.maxPoolSize === 'number') body.maxPoolSize = data.maxPoolSize\n if (typeof data.timeoutMs === 'number') body.timeoutMs = data.timeoutMs\n if (typeof data.readOnly === 'boolean') body.readOnly = data.readOnly\n return body\n}\n\nexport async function getDatasourceTables(datasourceId: string): Promise<string[]> {\n return request(`/datasources/${encodeURIComponent(datasourceId)}/tables`)\n}\n\nexport async function getDatasourceSchema(\n datasourceId: string,\n table: string\n): Promise<Array<{ name: string; type: string; nullable?: boolean }>> {\n return request(`/datasources/${encodeURIComponent(datasourceId)}/schema/${encodeURIComponent(table)}`)\n}\n"]}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkFSBR4RCK_js = require('./chunk-FSBR4RCK.js');
|
|
5
5
|
var react = require('react');
|
|
6
|
-
var client = require('@datatechsolutions/windsock/client');
|
|
7
6
|
var outline = require('@heroicons/react/24/outline');
|
|
8
7
|
var jsxRuntime = require('react/jsx-runtime');
|
|
9
8
|
|
|
10
9
|
function ImpersonationBanner({ onExit, className }) {
|
|
11
|
-
const { isImpersonating, claim, exit } =
|
|
10
|
+
const { isImpersonating, claim, exit } = chunkFSBR4RCK_js.useImpersonation();
|
|
12
11
|
const [isExiting, setIsExiting] = react.useState(false);
|
|
13
12
|
if (!isImpersonating || !claim) return null;
|
|
14
13
|
const handleExit = async () => {
|
|
@@ -40,7 +39,7 @@ function ImpersonationBanner({ onExit, className }) {
|
|
|
40
39
|
] })
|
|
41
40
|
] }),
|
|
42
41
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
43
|
-
|
|
42
|
+
chunkFSBR4RCK_js.Button,
|
|
44
43
|
{
|
|
45
44
|
size: "sm",
|
|
46
45
|
color: "ios-glass-red",
|
|
@@ -59,5 +58,5 @@ function ImpersonationBanner({ onExit, className }) {
|
|
|
59
58
|
}
|
|
60
59
|
|
|
61
60
|
exports.ImpersonationBanner = ImpersonationBanner;
|
|
62
|
-
//# sourceMappingURL=chunk-
|
|
63
|
-
//# sourceMappingURL=chunk-
|
|
61
|
+
//# sourceMappingURL=chunk-TUQLZ4QD.js.map
|
|
62
|
+
//# sourceMappingURL=chunk-TUQLZ4QD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/platform/impersonation/impersonation-banner.tsx"],"names":["useImpersonation","useState","jsxs","jsx","EyeIcon","Fragment","Button","XMarkIcon"],"mappings":";;;;;;;AAoBO,SAAS,mBAAA,CAAoB,EAAE,MAAA,EAAQ,SAAA,EAAU,EAA6B;AACnF,EAAA,MAAM,EAAE,eAAA,EAAiB,KAAA,EAAO,IAAA,KAASA,iCAAA,EAAiB;AAC1D,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,eAAS,KAAK,CAAA;AAEhD,EAAA,IAAI,CAAC,eAAA,IAAmB,CAAC,KAAA,EAAO,OAAO,IAAA;AAEvC,EAAA,MAAM,aAAa,YAAY;AAC7B,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,EAAK;AACX,MAAA,MAAA,IAAS;AAAA,IACX,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EACE,kJAEC,SAAA,IAAa,EAAA,CAAA;AAAA,MAGhB,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAACC,eAAA,EAAA,EAAQ,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,kBAAA,EAAmB,CAAA;AAAA,0CACxD,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,YAAA,8DAAA;AAAA,YACoD,GAAA;AAAA,4BACxDD,cAAA,CAAC,QAAA,EAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,KAAA,IAAS,MAAM,GAAA,EAAI,CAAA;AAAA,YACjC,KAAA,CAAM,yBACLD,eAAA,CAAAG,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,cAAA,QAAA;AAAA,8BACDF,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAU,gBAAM,MAAA,EAAO;AAAA,aAAA,EACzC,CAAA,GACE;AAAA,WAAA,EACN;AAAA,SAAA,EACF,CAAA;AAAA,wBACAD,eAAA;AAAA,UAACI,uBAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,IAAA;AAAA,YACL,KAAA,EAAM,eAAA;AAAA,YACN,OAAA,EAAS,UAAA;AAAA,YACT,QAAA,EAAU,SAAA;AAAA,YACV,YAAA,EAAW,oBAAA;AAAA,YAEX,QAAA,EAAA;AAAA,8BAAAH,cAAA,CAACI,iBAAA,EAAA,EAAU,aAAA,EAAY,MAAA,EAAO,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,cACjD,YAAY,eAAA,GAAa;AAAA;AAAA;AAAA;AAC5B;AAAA;AAAA,GACF;AAEJ","file":"chunk-TUQLZ4QD.js","sourcesContent":["import { useState } from 'react'\nimport { useImpersonation } from '../../_auth'\nimport { Button } from '@ui/index'\nimport { EyeIcon, XMarkIcon } from '@heroicons/react/24/outline'\n\nexport interface ImpersonationBannerProps {\n /**\n * Callback fired after the impersonation session ends (after the admin\n * token is restored). Useful for refreshing the UI or navigating home.\n */\n onExit?: () => void\n /** Optional extra classes on the outer bar. */\n className?: string\n}\n\n/**\n * Persistent banner shown while the current session is an impersonation\n * session. Shows the admin's identity + target, and an Exit button that\n * terminates the session. Invisible when not impersonating.\n */\nexport function ImpersonationBanner({ onExit, className }: ImpersonationBannerProps) {\n const { isImpersonating, claim, exit } = useImpersonation()\n const [isExiting, setIsExiting] = useState(false)\n\n if (!isImpersonating || !claim) return null\n\n const handleExit = async () => {\n setIsExiting(true)\n try {\n await exit()\n onExit?.()\n } finally {\n setIsExiting(false)\n }\n }\n\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={\n 'sticky top-0 z-50 flex items-center justify-between gap-3 border-b border-amber-300 ' +\n 'bg-amber-100 px-4 py-2 text-sm text-amber-900 shadow-sm ' +\n (className ?? '')\n }\n >\n <div className=\"flex items-center gap-2\">\n <EyeIcon aria-hidden=\"true\" className=\"h-5 w-5 shrink-0\" />\n <span>\n Impersonating session — signed in as the target user by{' '}\n <strong>{claim.email ?? claim.sub}</strong>\n {claim.reason ? (\n <>\n {' · '}\n <span className=\"italic\">{claim.reason}</span>\n </>\n ) : null}\n </span>\n </div>\n <Button\n size=\"sm\"\n color=\"ios-glass-red\"\n onClick={handleExit}\n disabled={isExiting}\n aria-label=\"Exit impersonation\"\n >\n <XMarkIcon aria-hidden=\"true\" className=\"h-4 w-4\" />\n {isExiting ? 'Exiting…' : 'Exit impersonation'}\n </Button>\n </div>\n )\n}\n"]}
|