@agent-native/dispatch 0.24.0 → 0.24.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/dist/actions/provider-api-register.d.ts +12 -12
  2. package/dist/components/admin-navigation.d.ts.map +1 -1
  3. package/dist/components/admin-navigation.js +21 -5
  4. package/dist/components/admin-navigation.js.map +1 -1
  5. package/dist/components/app-list-row.d.ts +1 -1
  6. package/dist/components/app-list-row.d.ts.map +1 -1
  7. package/dist/components/app-list-row.js +1 -1
  8. package/dist/components/app-list-row.js.map +1 -1
  9. package/dist/components/app-open-actions.d.ts +1 -17
  10. package/dist/components/app-open-actions.d.ts.map +1 -1
  11. package/dist/components/app-open-actions.js +1 -20
  12. package/dist/components/app-open-actions.js.map +1 -1
  13. package/dist/components/app-row-settings.d.ts +6 -0
  14. package/dist/components/app-row-settings.d.ts.map +1 -0
  15. package/dist/components/app-row-settings.js +11 -0
  16. package/dist/components/app-row-settings.js.map +1 -0
  17. package/dist/components/automation-run-history-dialog.d.ts.map +1 -1
  18. package/dist/components/automation-run-history-dialog.js +3 -2
  19. package/dist/components/automation-run-history-dialog.js.map +1 -1
  20. package/dist/components/connected-app-card.d.ts.map +1 -1
  21. package/dist/components/connected-app-card.js +1 -1
  22. package/dist/components/connected-app-card.js.map +1 -1
  23. package/dist/components/create-app-popover.js +2 -2
  24. package/dist/components/create-app-popover.js.map +1 -1
  25. package/dist/components/dispatch-control-plane.d.ts.map +1 -1
  26. package/dist/components/dispatch-control-plane.js +23 -7
  27. package/dist/components/dispatch-control-plane.js.map +1 -1
  28. package/dist/components/dispatch-shell.d.ts.map +1 -1
  29. package/dist/components/dispatch-shell.js +5 -1
  30. package/dist/components/dispatch-shell.js.map +1 -1
  31. package/dist/components/docs-link.d.ts +16 -0
  32. package/dist/components/docs-link.d.ts.map +1 -0
  33. package/dist/components/docs-link.js +34 -0
  34. package/dist/components/docs-link.js.map +1 -0
  35. package/dist/components/layout/Layout.d.ts +1 -0
  36. package/dist/components/layout/Layout.d.ts.map +1 -1
  37. package/dist/components/layout/Layout.js +37 -28
  38. package/dist/components/layout/Layout.js.map +1 -1
  39. package/dist/components/messaging-setup-panel.d.ts.map +1 -1
  40. package/dist/components/messaging-setup-panel.js +3 -2
  41. package/dist/components/messaging-setup-panel.js.map +1 -1
  42. package/dist/components/usage-alerts-panel.d.ts +11 -0
  43. package/dist/components/usage-alerts-panel.d.ts.map +1 -0
  44. package/dist/components/usage-alerts-panel.js +125 -0
  45. package/dist/components/usage-alerts-panel.js.map +1 -0
  46. package/dist/components/workspace-app-card.d.ts +3 -1
  47. package/dist/components/workspace-app-card.d.ts.map +1 -1
  48. package/dist/components/workspace-app-card.js +70 -29
  49. package/dist/components/workspace-app-card.js.map +1 -1
  50. package/dist/components/workspace-app-search.d.ts +10 -0
  51. package/dist/components/workspace-app-search.d.ts.map +1 -0
  52. package/dist/components/workspace-app-search.js +27 -0
  53. package/dist/components/workspace-app-search.js.map +1 -0
  54. package/dist/components/workspace-resource-effective-stack.d.ts.map +1 -1
  55. package/dist/components/workspace-resource-effective-stack.js +3 -2
  56. package/dist/components/workspace-resource-effective-stack.js.map +1 -1
  57. package/dist/components/workspace-template-card.d.ts.map +1 -1
  58. package/dist/components/workspace-template-card.js +2 -1
  59. package/dist/components/workspace-template-card.js.map +1 -1
  60. package/dist/lib/workspace-app-layout.d.ts +19 -0
  61. package/dist/lib/workspace-app-layout.d.ts.map +1 -0
  62. package/dist/lib/workspace-app-layout.js +75 -0
  63. package/dist/lib/workspace-app-layout.js.map +1 -0
  64. package/dist/lib/workspace-apps.d.ts +10 -0
  65. package/dist/lib/workspace-apps.d.ts.map +1 -1
  66. package/dist/lib/workspace-apps.js +59 -0
  67. package/dist/lib/workspace-apps.js.map +1 -1
  68. package/dist/lib/workspace-apps.test.js +18 -1
  69. package/dist/lib/workspace-apps.test.js.map +1 -1
  70. package/dist/routes/pages/$appId.d.ts.map +1 -1
  71. package/dist/routes/pages/$appId.js +4 -2
  72. package/dist/routes/pages/$appId.js.map +1 -1
  73. package/dist/routes/pages/agents.d.ts.map +1 -1
  74. package/dist/routes/pages/agents.js +2 -3
  75. package/dist/routes/pages/agents.js.map +1 -1
  76. package/dist/routes/pages/apps.$appId.d.ts.map +1 -1
  77. package/dist/routes/pages/apps.$appId.js +8 -3
  78. package/dist/routes/pages/apps.$appId.js.map +1 -1
  79. package/dist/routes/pages/apps.d.ts.map +1 -1
  80. package/dist/routes/pages/apps.js +31 -16
  81. package/dist/routes/pages/apps.js.map +1 -1
  82. package/dist/routes/pages/audit.d.ts.map +1 -1
  83. package/dist/routes/pages/audit.js +2 -1
  84. package/dist/routes/pages/audit.js.map +1 -1
  85. package/dist/routes/pages/dreams.d.ts.map +1 -1
  86. package/dist/routes/pages/dreams.js +14 -18
  87. package/dist/routes/pages/dreams.js.map +1 -1
  88. package/dist/routes/pages/integrations.d.ts.map +1 -1
  89. package/dist/routes/pages/integrations.js +51 -14
  90. package/dist/routes/pages/integrations.js.map +1 -1
  91. package/dist/routes/pages/metrics.d.ts.map +1 -1
  92. package/dist/routes/pages/metrics.js +4 -1
  93. package/dist/routes/pages/metrics.js.map +1 -1
  94. package/dist/routes/pages/operations.js +1 -1
  95. package/dist/routes/pages/operations.js.map +1 -1
  96. package/dist/routes/pages/settings.d.ts.map +1 -1
  97. package/dist/routes/pages/settings.js +7 -2
  98. package/dist/routes/pages/settings.js.map +1 -1
  99. package/dist/routes/pages/thread-debug.d.ts.map +1 -1
  100. package/dist/routes/pages/thread-debug.js +5 -8
  101. package/dist/routes/pages/thread-debug.js.map +1 -1
  102. package/dist/routes/pages/vault.d.ts.map +1 -1
  103. package/dist/routes/pages/vault.js +1 -1
  104. package/dist/routes/pages/vault.js.map +1 -1
  105. package/dist/routes/pages/workspace.d.ts.map +1 -1
  106. package/dist/routes/pages/workspace.js +13 -10
  107. package/dist/routes/pages/workspace.js.map +1 -1
  108. package/dist/server/index.d.ts.map +1 -1
  109. package/dist/server/index.js +3 -0
  110. package/dist/server/index.js.map +1 -1
  111. package/dist/server/lib/app-creation-store.d.ts.map +1 -1
  112. package/dist/server/lib/app-creation-store.js +12 -52
  113. package/dist/server/lib/app-creation-store.js.map +1 -1
  114. package/dist/shared/app-roles.d.ts +9 -0
  115. package/dist/shared/app-roles.d.ts.map +1 -0
  116. package/dist/shared/app-roles.js +7 -0
  117. package/dist/shared/app-roles.js.map +1 -0
  118. package/package.json +4 -3
  119. package/src/components/admin-navigation.tsx +57 -11
  120. package/src/components/app-list-row.tsx +1 -2
  121. package/src/components/app-open-actions.tsx +5 -114
  122. package/src/components/app-row-settings.tsx +54 -0
  123. package/src/components/automation-run-history-dialog.tsx +8 -4
  124. package/src/components/connected-app-card.tsx +0 -1
  125. package/src/components/create-app-popover.spec.tsx +1 -1
  126. package/src/components/create-app-popover.tsx +2 -2
  127. package/src/components/dispatch-control-plane.spec.tsx +36 -2
  128. package/src/components/dispatch-control-plane.tsx +83 -27
  129. package/src/components/dispatch-shell.tsx +7 -1
  130. package/src/components/docs-link.tsx +52 -0
  131. package/src/components/layout/Layout.spec.tsx +10 -0
  132. package/src/components/layout/Layout.tsx +50 -23
  133. package/src/components/messaging-setup-panel.tsx +10 -3
  134. package/src/components/usage-alerts-panel.tsx +445 -0
  135. package/src/components/workspace-app-card.spec.tsx +130 -9
  136. package/src/components/workspace-app-card.tsx +128 -71
  137. package/src/components/workspace-app-search.tsx +96 -0
  138. package/src/components/workspace-resource-effective-stack.tsx +10 -5
  139. package/src/components/workspace-template-card.spec.tsx +52 -23
  140. package/src/components/workspace-template-card.tsx +7 -10
  141. package/src/lib/workspace-app-layout.spec.ts +47 -0
  142. package/src/lib/workspace-app-layout.ts +121 -0
  143. package/src/lib/workspace-apps.test.ts +45 -1
  144. package/src/lib/workspace-apps.ts +72 -0
  145. package/src/routes/pages/$appId.tsx +3 -6
  146. package/src/routes/pages/agents.tsx +6 -3
  147. package/src/routes/pages/apps.$appId.tsx +6 -6
  148. package/src/routes/pages/apps.tsx +116 -62
  149. package/src/routes/pages/audit.tsx +28 -8
  150. package/src/routes/pages/dreams.tsx +92 -142
  151. package/src/routes/pages/integrations.tsx +147 -68
  152. package/src/routes/pages/metrics.tsx +8 -0
  153. package/src/routes/pages/operations.tsx +2 -2
  154. package/src/routes/pages/settings.tsx +14 -9
  155. package/src/routes/pages/thread-debug.tsx +18 -36
  156. package/src/routes/pages/vault.tsx +7 -2
  157. package/src/routes/pages/workspace.tsx +92 -56
  158. package/src/server/index.ts +4 -0
  159. package/src/server/lib/app-creation-store.spec.ts +90 -43
  160. package/src/server/lib/app-creation-store.ts +15 -61
  161. package/src/shared/app-roles.ts +8 -0
@@ -1 +1 @@
1
- {"version":3,"file":"messaging-setup-panel.d.ts","sourceRoot":"","sources":["../../src/components/messaging-setup-panel.tsx"],"names":[],"mappings":"AAyMA,wBAAgB,mBAAmB,oDA05BlC"}
1
+ {"version":3,"file":"messaging-setup-panel.d.ts","sourceRoot":"","sources":["../../src/components/messaging-setup-panel.tsx"],"names":[],"mappings":"AA0MA,wBAAgB,mBAAmB,oDAg6BlC"}
@@ -9,6 +9,7 @@ import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from ".
9
9
  import { Button } from "./ui/button.js";
10
10
  import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "./ui/collapsible.js";
11
11
  import { Input } from "./ui/input.js";
12
+ import { Skeleton } from "./ui/skeleton.js";
12
13
  import { Switch } from "./ui/switch.js";
13
14
  import { Tooltip, TooltipContent, TooltipTrigger } from "./ui/tooltip.js";
14
15
  const CHANNELS = listBuiltInChannelIntegrations();
@@ -330,7 +331,7 @@ export function MessagingSetupPanel() {
330
331
  ? "Messages are flowing"
331
332
  : configured
332
333
  ? "Ready to connect"
333
- : "Finish setup to connect" }), _jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: credentialSummary })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [platform.id === "telegram" && configured ? (_jsx(Button, { variant: "outline", size: "sm", onClick: () => runSetup(platform), disabled: setupPlatform === platform.id, children: setupPlatform === platform.id ? (_jsxs(_Fragment, { children: [_jsx(IconLoader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Setting up..."] })) : ("Set up webhook") })) : null, !configured && !enabled ? (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { tabIndex: 0, children: _jsx(Button, { size: "sm", disabled: true, children: "Enable" }) }) }), _jsx(TooltipContent, { children: "Save the required credentials first." })] })) : (_jsx(Button, { size: "sm", onClick: () => togglePlatform(platform, enabled), disabled: togglingPlatform === platform.id, children: togglingPlatform === platform.id ? (_jsxs(_Fragment, { children: [_jsx(IconLoader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Saving..."] })) : enabled ? ("Disable") : ("Enable") }))] })] }), platform.id === "slack" ? (_jsx(DisclosureSection, { title: t("messaging.managed.title"), summary: installations.length
334
+ : "Finish setup to connect" }), _jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: envLoading ? (_jsx(Skeleton, { className: "h-3 w-32" })) : (credentialSummary) })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [platform.id === "telegram" && configured ? (_jsx(Button, { variant: "outline", size: "sm", onClick: () => runSetup(platform), disabled: setupPlatform === platform.id, children: setupPlatform === platform.id ? (_jsxs(_Fragment, { children: [_jsx(IconLoader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Setting up..."] })) : ("Set up webhook") })) : null, !configured && !enabled ? (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { tabIndex: 0, children: _jsx(Button, { size: "sm", disabled: true, children: "Enable" }) }) }), _jsx(TooltipContent, { children: "Save the required credentials first." })] })) : (_jsx(Button, { size: "sm", onClick: () => togglePlatform(platform, enabled), disabled: togglingPlatform === platform.id, children: togglingPlatform === platform.id ? (_jsxs(_Fragment, { children: [_jsx(IconLoader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Saving..."] })) : enabled ? ("Disable") : ("Enable") }))] })] }), platform.id === "slack" ? (_jsx(DisclosureSection, { title: t("messaging.managed.title"), summary: installations.length
334
335
  ? `${installations.length} connected`
335
336
  : "No workspaces connected yet", children: _jsxs("div", { className: "space-y-3", children: [_jsxs("p", { className: "text-xs text-muted-foreground", children: [t("messaging.managed.description"), " ", t("messaging.managed.agentManifestDescription")] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Button, { asChild: true, variant: "outline", size: "sm", children: _jsxs("a", { href: managedSlackAgentManifestUrl(), children: [_jsx(IconFileDescription, { className: "mr-2 h-4 w-4" }), t("messaging.managed.agentManifest")] }) }), missingRequiredCredentials ? (_jsxs(Button, { size: "sm", disabled: true, children: [_jsx(IconBrandSlack, { className: "mr-2 h-4 w-4" }), t("messaging.managed.addToSlack")] })) : (_jsx(Button, { asChild: true, size: "sm", children: _jsxs("a", { href: managedIntegrationOAuthUrl("slack"), children: [_jsx(IconBrandSlack, { className: "mr-2 h-4 w-4" }), t("messaging.managed.addToSlack")] }) }))] }), missingRequiredCredentials ? (_jsx("p", { className: "text-xs text-amber-700 dark:text-amber-300", children: t("messaging.managed.requiredCredentials") })) : null, installations.length ? (_jsx("div", { className: "divide-y rounded-lg bg-muted/20 px-3", children: installations.map((installation) => (_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3 py-3", children: [_jsxs("div", { children: [_jsx("div", { className: "text-sm font-medium text-foreground", children: installation.teamName ||
336
337
  installation.enterpriseName ||
@@ -408,6 +409,6 @@ export function MessagingSetupPanel() {
408
409
  }), legacyEnvKeys.some((envKey) => !envStatusByKey.get(envKey.key)?.configured) ? (_jsx(Button, { variant: "outline", onClick: () => saveEnvKeys(platform, legacyEnvKeys.map((envKey) => envKey.key)), disabled: savingKeysFor === platform.id, children: savingKeysFor === platform.id
409
410
  ? "Saving..."
410
411
  : "Save credentials" })) : null] }) })] })) : null, missingRequiredCredentials ? (_jsx(Button, { variant: "outline", onClick: () => saveEnvKeys(platform, envKeys.map((k) => k.key)), disabled: savingKeysFor === platform.id, children: savingKeysFor === platform.id ? (_jsxs(_Fragment, { children: [_jsx(IconLoader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Saving..."] })) : ("Save credentials") })) : null] }), status?.webhookUrl ? (_jsx(DisclosureSection, { title: "Webhook URL", summary: "Copy the endpoint for this channel", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("code", { className: "flex-1 truncate rounded-md bg-muted/30 px-3 py-2 text-xs text-foreground", children: status.webhookUrl }), _jsx(Button, { variant: "outline", size: "icon", onClick: () => copyWebhook(status.webhookUrl), "aria-label": `Copy ${platform.name} webhook URL`, children: copiedWebhook === status.webhookUrl ? (_jsx(IconCheck, { className: "h-4 w-4" })) : (_jsx(IconCopy, { className: "h-4 w-4" })) })] }) })) : null, _jsx(DisclosureSection, { title: "Resources", summary: "Documentation and external links", children: _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { asChild: true, variant: "ghost", size: "sm", className: "px-0 text-xs text-muted-foreground hover:bg-transparent hover:text-foreground", children: _jsxs("a", { href: platform.documentation.href, target: "_blank", rel: "noreferrer", children: ["Docs", _jsx(IconExternalLink, { className: "ml-1 h-3 w-3" })] }) }), platform.documentation.externalHref ? (_jsx(Button, { asChild: true, variant: "ghost", size: "sm", className: "px-0 text-xs text-muted-foreground hover:bg-transparent hover:text-foreground", children: _jsxs("a", { href: platform.documentation.externalHref, target: "_blank", rel: "noreferrer", children: [platform.documentation.externalLabel ?? "Open", _jsx(IconExternalLink, { className: "ml-1 h-3 w-3" })] }) })) : null] }) })] }) })] }, platform.id));
411
- }) }), loading ? (_jsx("div", { className: "rounded-2xl border border-dashed px-4 py-6 text-sm text-muted-foreground", children: "Loading messaging status..." })) : null] }));
412
+ }) }), loading ? (_jsxs("div", { className: "space-y-3 rounded-2xl border border-dashed px-4 py-6", children: [_jsx(Skeleton, { className: "h-4 w-40" }), _jsx(Skeleton, { className: "h-3 w-2/3 max-w-md" }), _jsx(Skeleton, { className: "h-9 w-full max-w-sm" })] })) : null] }));
412
413
  }
413
414
  //# sourceMappingURL=messaging-setup-panel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messaging-setup-panel.js","sourceRoot":"","sources":["../../src/components/messaging-setup-panel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EACL,wCAAwC,EACxC,6BAA6B,EAC7B,mCAAmC,EACnC,4BAA4B,EAC5B,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,4BAA4B,EAC5B,sBAAsB,EACtB,4BAA4B,EAC5B,2BAA2B,EAC3B,qBAAqB,EACrB,gBAAgB,EAChB,kCAAkC,GAMnC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,8BAA8B,GAG/B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,QAAQ,EACR,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAkB,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE/B,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEvE,MAAM,QAAQ,GAAG,8BAA8B,EAAE,CAAC;AAElD,MAAM,cAAc,GAAmD;IACrE,KAAK,EAAE,cAAc;IACrB,iBAAiB,EAAE,cAAc;IACjC,OAAO,EAAE,gBAAgB;IACzB,QAAQ,EAAE,iBAAiB;IAC3B,QAAQ,EAAE,iBAAiB;IAC3B,KAAK,EAAE,QAAQ;CAChB,CAAC;AAEF,SAAS,6BAA6B,CACpC,WAAwD,EACxD,cAAiD;IAEjD,MAAM,YAAY,GAAG,IAAI,GAAG,EAGzB,CAAC;IAEJ,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,UAAU,CAAC,QAAQ;YAAE,SAAS;QACnC,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;YACjC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,UAAU;gBAAE,OAAO,IAAI,CAAC;YACjE,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAClE,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,GAAG,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAC/C,KAAK,CAAC,KAAK,CACT,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,UAAU,CAChE,CACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,OAAO,EAAuB;IACnD,OAAO,CACL,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,+DAA+D,YAEzE,KAAC,cAAc,IAAC,SAAS,EAAC,aAAa,GAAG,GACnC,GACM,EACjB,KAAC,cAAc,IAAC,IAAI,EAAC,KAAK,EAAC,SAAS,EAAC,kCAAkC,YACpE,OAAO,GACO,IACT,CACX,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,EAClB,IAAI,EACJ,KAAK,GAIN;IACC,MAAM,SAAS,GACb,IAAI,KAAK,SAAS;QAChB,CAAC,CAAC,0DAA0D;QAC5D,CAAC,CAAC,IAAI,KAAK,SAAS;YAClB,CAAC,CAAC,oDAAoD;YACtD,CAAC,CAAC,gCAAgC,CAAC;IAEzC,OAAO,CACL,eACE,SAAS,EAAE,2EAA2E,SAAS,EAAE,YAEhG,KAAK,GACD,CACR,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,EACzB,KAAK,EACL,OAAO,EACP,QAAQ,EACR,WAAW,GAAG,KAAK,GAMpB;IACC,OAAO,CACL,MAAC,WAAW,IAAC,WAAW,EAAE,WAAW,EAAE,SAAS,EAAC,UAAU,aACzD,MAAC,kBAAkB,IAAC,SAAS,EAAC,oFAAoF,aAChH,gBAAM,SAAS,EAAC,SAAS,aACvB,eAAM,SAAS,EAAC,2CAA2C,YACxD,KAAK,GACD,EACN,OAAO,CAAC,CAAC,CAAC,CACT,eAAM,SAAS,EAAC,qDAAqD,YAClE,OAAO,GACH,CACR,CAAC,CAAC,CAAC,IAAI,IACH,EACP,KAAC,gBAAgB,IAAC,SAAS,EAAC,+FAA+F,GAAG,IAC3G,EACrB,KAAC,kBAAkB,IAAC,SAAS,EAAC,MAAM,YAAE,QAAQ,GAAsB,IACxD,CACf,CAAC;AACJ,CAAC;AAED;;;;;kEAKkE;AAClE,SAAS,iBAAiB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAsB;IAChE,OAAO,CACL,cAAK,SAAS,EAAC,uEAAuE,iDAEhF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,EACxB,UAAU,EACV,OAAO,GAIR;IACC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,KAAC,UAAU,IAAC,IAAI,EAAC,SAAS,EAAC,KAAK,EAAC,WAAW,GAAG,CAAC;IACzD,CAAC;IACD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,KAAC,UAAU,IAAC,IAAI,EAAC,SAAS,EAAC,KAAK,EAAC,yBAAyB,GAAG,CAAC;IACvE,CAAC;IACD,OAAO,KAAC,UAAU,IAAC,IAAI,EAAC,SAAS,EAAC,KAAK,EAAC,gBAAgB,GAAG,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IACjB,MAAM,EAAE,UAAU,EAAE,GAAG,aAAa,EAAE,CAAC;IACvC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAA4B,EAAE,CAAC,CAAC;IACxE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAyB,EAAE,CAAC,CAAC;IAC3E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAyB,EAAE,CAAC,CAAC;IACvE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC9E,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAEhD,EAAE,CAAC,CAAC;IACN,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAC1D,IAAI,CACL,CAAC;IACF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAA2B,EAAE,CAAC,CAAC;IACnE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAiC,EAAE,CAAC,CAAC;IAC3E,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAyB,EAAE,CAAC,CAAC;IAC3E,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAEpE,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE;QACjC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,WAAW,CAAC,MAAM,uBAAuB,EAAE,CAAC,CAAC;QAC/C,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,uBAAuB,EAAE;aACtB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,MAAM,EAAE,CAAC;gBACX,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClB,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,MAAM;gBAAE,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACL,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,mCAAmC,CAAC,OAAO,CAAC;aACzC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,MAAM;gBAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACrC,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnB,4BAA4B,CAAC,OAAO,CAAC;aAClC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,MAAM;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnB,6BAA6B,EAAE;aAC5B,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,MAAM;gBAAE,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnB,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,0BAA0B,EAAE;aACzB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;YACb,IAAI,MAAM,EAAE,CAAC;gBACX,cAAc,CAAC,IAAI,CAAC,CAAC;gBACrB,aAAa,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,MAAM;gBAAE,aAAa,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QACL,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,KAAK,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAChE,CAAC,WAAW,CAAC,CACd,CAAC;IACF,MAAM,gBAAgB,GAAG,OAAO,CAC9B,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAClE,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;QAClC,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,cAAc,CAAC,MAAM,0BAA0B,EAAE,CAAC,CAAC;QACrD,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EACvB,QAAiC,EACjC,IAAc,EACd,EAAE;QACF,MAAM,IAAI,GAAG,IAAI;aACd,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;aAC5D,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEhC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,sBAAsB,CAAC,IAAI,CAAC,CAAC;YAEnC,KAAK,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,oBAAoB,CAAC,CAAC;YACpD,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE;gBACvB,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;gBAC5B,KAAK,MAAM,GAAG,IAAI,IAAI;oBAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzC,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;YACH,MAAM,gBAAgB,EAAE,CAAC;YACzB,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,KAAK,CACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B,CACtE,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,cAAc,GAAG,KAAK,EAC1B,QAAiC,EACjC,OAAgB,EAChB,EAAE;QACF,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,qBAAqB,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;YACnD,KAAK,CAAC,OAAO,CACX,OAAO;gBACL,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,eAAe;gBACjC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,YAAY,CACjC,CAAC;YACF,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,KAAK,CACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CACxE,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAiC,EAAE,EAAE;QAC3D,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACpC,KAAK,CAAC,OAAO,CACX,QAAQ,CAAC,EAAE,KAAK,UAAU;gBACxB,CAAC,CAAC,6BAA6B;gBAC/B,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,iBAAiB,CACtC,CAAC;YACF,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,KAAK,CACT,KAAK,YAAY,KAAK;gBACpB,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,oBAAoB,QAAQ,CAAC,IAAI,EAAE,CACxC,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EAAE,UAAkB,EAAE,EAAE;QAC/C,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAChD,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC7B,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACpC,UAAU,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,KAAK,EACjC,YAA2C,EAC3C,MAA6B,EAC7B,EAAE;QACF,qBAAqB,CAAC,GAAG,MAAM,IAAI,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC;YACH,MAAM,CAAC,MAAM,KAAK,MAAM;gBACtB,CAAC,CAAC,kCAAkC,CAAC,YAAY,CAAC,EAAE,CAAC;gBACrD,CAAC,CAAC,wCAAwC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/D,gBAAgB,CAAC,MAAM,mCAAmC,CAAC,OAAO,CAAC,CAAC,CAAC;YACrE,KAAK,CAAC,OAAO,CACX,MAAM,KAAK,MAAM;gBACf,CAAC,CAAC,CAAC,CAAC,qCAAqC,CAAC;gBAC1C,CAAC,CAAC,CAAC,CAAC,yCAAyC,CAAC,CACjD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,KAAK,CACT,KAAK,YAAY,KAAK;gBACpB,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,CAAC,CAAC,gCAAgC,CAAC,CACxC,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,iBAAiB,GAAG,KAAK,EAC7B,KAA6B,EAC7B,MAAiD,EACjD,EAAE;QACF,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,2BAA2B,CAAC;gBAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;gBACxC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;gBAC1C,YAAY,EAAE,KAAK,CAAC,YAAY;gBAChC,MAAM,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE;aACvC,CAAC,CAAC;YACH,SAAS,CAAC,MAAM,4BAA4B,CAAC,OAAO,CAAC,CAAC,CAAC;YACvD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,KAAK,CACT,KAAK,YAAY,KAAK;gBACpB,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAC9C,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,eAAe,GAAG,KAAK,EAAE,KAA6B,EAAE,EAAE;QAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YAC9C,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QACD,cAAc,CAAC,UAAU,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,4BAA4B,CAAC;gBACjC,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,cAAc,EAAE,KAAK,CAAC,cAAc;qBACrC;iBACF;gBACD,MAAM,EAAE,OAAO;gBACf,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;aAC7C,CAAC,CAAC;YACH,UAAU,CAAC,MAAM,6BAA6B,EAAE,CAAC,CAAC;YAClD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,KAAK,CACT,KAAK,YAAY,KAAK;gBACpB,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAC5C,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,cAAc,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aACxB,KAAC,SAAS,IACR,IAAI,EAAC,QAAQ,EACb,WAAW,QACX,SAAS,EAAC,qCAAqC,YAE9C,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACzB,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;oBACjD,MAAM,UAAU,GACd,CAAC,CAAC,MAAM,EAAE,UAAU;wBACpB,CAAC,QAAQ,CAAC,EAAE,KAAK,OAAO;4BACtB,aAAa,CAAC,IAAI,CAChB,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,KAAK,WAAW,CACtD,CAAC,CAAC;oBACP,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC;oBAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,sBAAsB,CAAC;oBAChD,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CACnC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,iBAAiB,CAC7C,CAAC;oBACF,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAClC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,iBAAiB,CAC7C,CAAC;oBACF,MAAM,0BAA0B,GAAG,6BAA6B,CAC9D,OAAO,EACP,cAAc,CACf,CAAC;oBACF,MAAM,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAC9C,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,UAAU,CACvD,CAAC,MAAM,CAAC;oBACT,MAAM,iBAAiB,GAAG,UAAU;wBAClC,CAAC,CAAC,4BAA4B;wBAC9B,CAAC,CAAC,0BAA0B;4BAC1B,CAAC,CAAC,kCAAkC;4BACpC,CAAC,CAAC,GAAG,yBAAyB,QAAQ,CAAC;oBAC3C,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC;oBAE1D,OAAO,CACL,MAAC,aAAa,IAEZ,KAAK,EAAE,QAAQ,CAAC,EAAE,EAClB,SAAS,EAAC,0BAA0B,aAEpC,KAAC,gBAAgB,IAAC,SAAS,EAAC,yCAAyC,YACnE,eAAK,SAAS,EAAC,wCAAwC,aACrD,KAAC,IAAI,IAAC,SAAS,EAAC,wCAAwC,GAAG,EAC3D,eAAK,SAAS,EAAC,SAAS,aACtB,eAAK,SAAS,EAAC,mCAAmC,aAChD,aAAI,SAAS,EAAC,yCAAyC,YACpD,QAAQ,CAAC,IAAI,GACX,EACL,KAAC,gBAAgB,IACf,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,OAAO,GAChB,IACE,EACN,YAAG,SAAS,EAAC,6CAA6C,YACvD,QAAQ,CAAC,WAAW,GACnB,IACA,IACF,GACW,EAEnB,KAAC,gBAAgB,IAAC,SAAS,EAAC,MAAM,YAChC,eAAK,SAAS,EAAC,UAAU,aACvB,eAAK,SAAS,EAAC,wDAAwD,aACrE,0BACE,YAAG,SAAS,EAAC,qCAAqC,YAC/C,OAAO;gEACN,CAAC,CAAC,sBAAsB;gEACxB,CAAC,CAAC,UAAU;oEACV,CAAC,CAAC,kBAAkB;oEACpB,CAAC,CAAC,yBAAyB,GAC7B,EACJ,YAAG,SAAS,EAAC,sCAAsC,YAChD,iBAAiB,GAChB,IACA,EACN,eAAK,SAAS,EAAC,mCAAmC,aAC/C,QAAQ,CAAC,EAAE,KAAK,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,CAC1C,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACjC,QAAQ,EAAE,aAAa,KAAK,QAAQ,CAAC,EAAE,YAEtC,aAAa,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAC/B,8BACE,KAAC,WAAW,IAAC,SAAS,EAAC,2BAA2B,GAAG,qBAEpD,CACJ,CAAC,CAAC,CAAC,CACF,gBAAgB,CACjB,GACM,CACV,CAAC,CAAC,CAAC,IAAI,EACP,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CACzB,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,eAAM,QAAQ,EAAE,CAAC,YACf,KAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,QAAQ,6BAEjB,GACJ,GACQ,EACjB,KAAC,cAAc,uDAEE,IACT,CACX,CAAC,CAAC,CAAC,CACF,KAAC,MAAM,IACL,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,EAChD,QAAQ,EAAE,gBAAgB,KAAK,QAAQ,CAAC,EAAE,YAEzC,gBAAgB,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAClC,8BACE,KAAC,WAAW,IAAC,SAAS,EAAC,2BAA2B,GAAG,iBAEpD,CACJ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CACZ,SAAS,CACV,CAAC,CAAC,CAAC,CACF,QAAQ,CACT,GACM,CACV,IACG,IACF,EAEL,QAAQ,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CACzB,KAAC,iBAAiB,IAChB,KAAK,EAAE,CAAC,CAAC,yBAAyB,CAAC,EACnC,OAAO,EACL,aAAa,CAAC,MAAM;gDAClB,CAAC,CAAC,GAAG,aAAa,CAAC,MAAM,YAAY;gDACrC,CAAC,CAAC,6BAA6B,YAGnC,eAAK,SAAS,EAAC,WAAW,aACxB,aAAG,SAAS,EAAC,+BAA+B,aACzC,CAAC,CAAC,+BAA+B,CAAC,EAAE,GAAG,EACvC,CAAC,CAAC,4CAA4C,CAAC,IAC9C,EACJ,eAAK,SAAS,EAAC,mCAAmC,aAChD,KAAC,MAAM,IAAC,OAAO,QAAC,OAAO,EAAC,SAAS,EAAC,IAAI,EAAC,IAAI,YACzC,aAAG,IAAI,EAAE,4BAA4B,EAAE,aACrC,KAAC,mBAAmB,IAAC,SAAS,EAAC,cAAc,GAAG,EAC/C,CAAC,CAAC,iCAAiC,CAAC,IACnC,GACG,EACR,0BAA0B,CAAC,CAAC,CAAC,CAC5B,MAAC,MAAM,IAAC,IAAI,EAAC,IAAI,EAAC,QAAQ,mBACxB,KAAC,cAAc,IAAC,SAAS,EAAC,cAAc,GAAG,EAC1C,CAAC,CAAC,8BAA8B,CAAC,IAC3B,CACV,CAAC,CAAC,CAAC,CACF,KAAC,MAAM,IAAC,OAAO,QAAC,IAAI,EAAC,IAAI,YACvB,aAAG,IAAI,EAAE,0BAA0B,CAAC,OAAO,CAAC,aAC1C,KAAC,cAAc,IAAC,SAAS,EAAC,cAAc,GAAG,EAC1C,CAAC,CAAC,8BAA8B,CAAC,IAChC,GACG,CACV,IACG,EACL,0BAA0B,CAAC,CAAC,CAAC,CAC5B,YAAG,SAAS,EAAC,4CAA4C,YACtD,CAAC,CAAC,uCAAuC,CAAC,GACzC,CACL,CAAC,CAAC,CAAC,IAAI,EACP,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CACtB,cAAK,SAAS,EAAC,sCAAsC,YAClD,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CACnC,eAEE,SAAS,EAAC,wDAAwD,aAElE,0BACE,cAAK,SAAS,EAAC,qCAAqC,YACjD,YAAY,CAAC,QAAQ;gFACpB,YAAY,CAAC,cAAc;gFAC3B,YAAY,CAAC,MAAM;gFACnB,CAAC,CAAC,qCAAqC,CAAC,GACtC,EACN,cAAK,SAAS,EAAC,sCAAsC,YAClD,CAAC,CAAC,iCAAiC,EAAE;gFACpC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM;gFACjC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,SAAS,EAAE;oFACvC,SAAS,EAAE,QAAQ;iFACpB,CAAC;6EACH,CAAC,GACE,IACF,EACN,eAAK,SAAS,EAAC,yBAAyB,aACtC,KAAC,UAAU,IACT,IAAI,EACF,YAAY,CAAC,MAAM,KAAK,SAAS;gFAC/B,CAAC,CAAC,SAAS;gFACX,CAAC,CAAC,YAAY,CAAC,MAAM,KAAK,UAAU;oFAChC,YAAY,CAAC,MAAM,KAAK,SAAS;oFACnC,CAAC,CAAC,SAAS;oFACX,CAAC,CAAC,SAAS,EAEjB,KAAK,EAAE,CAAC,CACN,4BAA4B,YAAY,CAAC,MAAM,EAAE,CAClD,GACD,EACF,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,GAAG,EAAE,CACZ,qBAAqB,CACnB,YAAY,EACZ,MAAM,CACP,EAEH,QAAQ,EACN,kBAAkB;gFAClB,QAAQ,YAAY,CAAC,EAAE,EAAE,YAG1B,CAAC,CAAC,wBAAwB,CAAC,GACrB,EACT,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,GAAG,EAAE,CACZ,qBAAqB,CACnB,YAAY,EACZ,YAAY,CACb,EAEH,QAAQ,EACN,kBAAkB;gFAClB,cAAc,YAAY,CAAC,EAAE,EAAE,YAGhC,CAAC,CAAC,8BAA8B,CAAC,GAC3B,IACL,KAjED,YAAY,CAAC,EAAE,CAkEhB,CACP,CAAC,GACE,CACP,CAAC,CAAC,CAAC,CACF,YAAG,SAAS,EAAC,+BAA+B,YACzC,CAAC,CAAC,yBAAyB,CAAC,GAC3B,CACL,IACG,GACY,CACrB,CAAC,CAAC,CAAC,IAAI,EAEP,QAAQ,CAAC,EAAE,KAAK,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAC1C,KAAC,iBAAiB,IAChB,KAAK,EAAE,CAAC,CAAC,sCAAsC,CAAC,EAChD,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,WAAW,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,YAEpE,eAAK,SAAS,EAAC,WAAW,aACxB,YAAG,SAAS,EAAC,+BAA+B,YACzC,CAAC,CAAC,4CAA4C,CAAC,GAC9C,EACH,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;wDACpB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;4DAC/B,KAAK,CAAC,QAAQ;4DACd,KAAK,CAAC,QAAQ;4DACd,KAAK,CAAC,cAAc;yDACrB,CAAC,CAAC;wDACH,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CACzB,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,WAAW,KAAK,OAAO;4DAC5B,IAAI,CAAC,SAAS,KAAK,SAAS;4DAC5B,IAAI,CAAC,MAAM,KAAK,OAAO,CAC1B,CAAC;wDACF,OAAO,CACL,MAAC,WAAW,IAEV,SAAS,EAAC,0BAA0B,aAEpC,MAAC,kBAAkB,IAAC,SAAS,EAAC,oFAAoF,aAChH,gBAAM,SAAS,EAAC,SAAS,aACvB,eAAM,SAAS,EAAC,kDAAkD,YAC/D,KAAK,CAAC,cAAc,GAChB,EACP,eAAM,SAAS,EAAC,4CAA4C,YACzD,CAAC,CAAC,oCAAoC,EAAE;wFACvC,KAAK,EAAE,CAAC,CACN,2BAA2B,KAAK,CAAC,KAAK,EAAE,CACzC;qFACF,CAAC,GACG,IACF,EACP,gBAAM,SAAS,EAAC,kCAAkC,aAChD,KAAC,UAAU,IACT,IAAI,EACF,KAAK,CAAC,KAAK,KAAK,SAAS;wFACvB,CAAC,CAAC,SAAS;wFACX,CAAC,CAAC,SAAS,EAEf,KAAK,EAAE,CAAC,CACN,2BAA2B,KAAK,CAAC,KAAK,EAAE,CACzC,GACD,EACF,KAAC,gBAAgB,IAAC,SAAS,EAAC,sFAAsF,GAAG,IAChH,IACY,EACrB,MAAC,kBAAkB,IAAC,SAAS,EAAC,MAAM,aAClC,cAAK,SAAS,EAAC,2BAA2B,YACvC;gFACC;oFACE,gBAAgB;oFAChB,CAAC,CAAC,kCAAkC,CAAC;iFACtC;gFACD;oFACE,aAAa;oFACb,CAAC,CAAC,+BAA+B,CAAC;iFACnC;gFACD;oFACE,qBAAqB;oFACrB,CAAC,CAAC,qCAAqC,CAAC;iFACzC;6EACF,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CACtB,iBAEE,SAAS,EAAC,+EAA+E,aAExF,KAAK,EACN,KAAC,MAAM,IACL,OAAO,EACL,KAAK,CAAC,MAAM,CACV,GAA6C,CAC9C,EAEH,QAAQ,EAAE,WAAW,KAAK,KAAK,CAAC,EAAE,EAClC,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE,CAC3B,iBAAiB,CAAC,KAAK,EAAE;4FACvB,CAAC,GAAG,CAAC,EAAE,OAAO;yFACf,CAAC,GAEJ,KAhBG,GAAG,CAiBF,CACT,CAAC,GACE,EACN,eAAK,SAAS,EAAC,gCAAgC,aAC7C,eAAK,SAAS,EAAC,2BAA2B,aACxC,gBAAO,SAAS,EAAC,qCAAqC,YACnD,CAAC,CAAC,oCAAoC,CAAC,GAClC,EACR,KAAC,KAAK,IACJ,SAAS,EAAC,SAAS,EACnB,KAAK,EACH,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gGACrB,CAAC,MAAM;oGACL,CAAC,CAAC,MAAM,CACJ,MAAM,CAAC,WAAW,GAAG,SAAS,CAC/B;oGACH,CAAC,CAAC,EAAE,CAAC,EAET,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,cAAc,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gGAC3B,GAAG,OAAO;gGACV,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;6FAC/B,CAAC,CAAC,EAEL,WAAW,EAAC,IAAI,GAChB,IACE,EACN,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,EACrC,QAAQ,EACN,WAAW,KAAK,UAAU,KAAK,CAAC,EAAE,EAAE,YAGrC,CAAC,CAAC,8BAA8B,CAAC,GAC3B,IACL,IACa,KArGhB,KAAK,CAAC,EAAE,CAsGD,CACf,CAAC;oDACJ,CAAC,CAAC,IACE,GACY,CACrB,CAAC,CAAC,CAAC,IAAI,EAER,KAAC,iBAAiB,IAChB,KAAK,EAAC,aAAa,EACnB,OAAO,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,QAAQ,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,YAE7F,aAAI,SAAS,EAAC,0EAA0E,YACrF,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CACzC,cAAe,SAAS,EAAC,YAAY,aACnC,gBAAM,SAAS,EAAC,0BAA0B,aACvC,KAAK,GAAG,CAAC,SACL,EACP,yBAAO,IAAI,GAAQ,KAJZ,IAAI,CAKR,CACN,CAAC,GACC,GACa,EAEpB,MAAC,iBAAiB,IAChB,KAAK,EAAC,aAAa,EACnB,OAAO,EAAE,iBAAiB,aAE1B,cAAK,SAAS,EAAC,WAAW,YACvB,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;wDAC7B,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wDACjD,MAAM,YAAY,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC;wDAC7C,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,SAAS,EAAE,QAAQ,CAAC;wDACxD,MAAM,KAAK,GACT,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC;wDACjD,wDAAwD;wDACxD,kCAAkC;wDAClC,MAAM,aAAa,GACjB,MAAM,CAAC,GAAG,KAAK,qBAAqB,CAAC;wDACvC,OAAO,CACL,eAAsB,SAAS,EAAC,aAAa,aAC3C,eAAK,SAAS,EAAC,yCAAyC,aACtD,eAAK,SAAS,EAAC,2BAA2B,aACxC,iBAAO,SAAS,EAAC,qCAAqC,aACnD,KAAK,EACL,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAClB,eAAM,SAAS,EAAC,4BAA4B,2BAErC,CACR,CAAC,CAAC,CAAC,IAAI,IACF,EACP,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,WAAW,IAAC,OAAO,EAAE,QAAQ,GAAI,CACnC,CAAC,CAAC,CAAC,IAAI,IACJ,EACL,YAAY,CAAC,CAAC,CAAC,CACd,KAAC,UAAU,IAAC,IAAI,EAAC,SAAS,EAAC,KAAK,EAAC,OAAO,GAAG,CAC5C,CAAC,CAAC,CAAC,CACF,KAAC,UAAU,IACT,IAAI,EAAC,SAAS,EACd,KAAK,EACH,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,GAEzC,CACH,IACG,EACL,YAAY,IAAI,aAAa,CAAC,CAAC,CAAC,CAC/B,KAAC,iBAAiB,IAAC,MAAM,EAAE,MAAM,CAAC,GAAG,GAAI,CAC1C,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAClB,KAAC,KAAK,IACJ,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,EACzC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;wEACzB,GAAG,OAAO;wEACV,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;qEACjC,CAAC,CAAC,EAEL,WAAW,EACT,aAAa;wEACX,CAAC,CAAC,uBAAuB;wEACzB,CAAC,CAAC,SAAS,KAAK,EAAE,EAEtB,YAAY,EAAC,KAAK,GAClB,CACH,CAAC,CAAC,CAAC,IAAI,KA7CA,MAAM,CAAC,GAAG,CA8Cd,CACP,CAAC;oDACJ,CAAC,CAAC,GACE,EACL,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CACtB,MAAC,WAAW,eACV,MAAC,kBAAkB,IAAC,SAAS,EAAC,uHAAuH,aACnJ,KAAC,gBAAgB,IAAC,SAAS,EAAC,oEAAoE,GAAG,EACnG,yBAAO,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,GAAQ,IACnB,EACrB,KAAC,kBAAkB,cACjB,eAAK,SAAS,EAAC,yEAAyE,aACtF,YAAG,SAAS,EAAC,+BAA+B,YACzC,aAAa,CAAC,CAAC,CAAC,EAAE,QAAQ,GACzB,EACH,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;wEAC5B,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wEACjD,MAAM,YAAY,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC;wEAC7C,MAAM,QAAQ,GACZ,MAAM,CAAC,QAAQ,IAAI,SAAS,EAAE,QAAQ,CAAC;wEACzC,MAAM,KAAK,GACT,MAAM,CAAC,KAAK,IAAI,SAAS,EAAE,KAAK,IAAI,MAAM,CAAC,GAAG,CAAC;wEACjD,OAAO,CACL,eAAsB,SAAS,EAAC,aAAa,aAC3C,eAAK,SAAS,EAAC,yCAAyC,aACtD,eAAK,SAAS,EAAC,2BAA2B,aACxC,gBAAO,SAAS,EAAC,qCAAqC,YACnD,KAAK,GACA,EACP,QAAQ,CAAC,CAAC,CAAC,CACV,KAAC,WAAW,IAAC,OAAO,EAAE,QAAQ,GAAI,CACnC,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,KAAC,UAAU,IACT,IAAI,EACF,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAEtC,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,GACzC,IACE,EACL,CAAC,YAAY,CAAC,CAAC,CAAC,CACf,KAAC,KAAK,IACJ,IAAI,EAAC,UAAU,EACf,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,EAClC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAClB,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;wFACzB,GAAG,OAAO;wFACV,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK;qFACjC,CAAC,CAAC,EAEL,WAAW,EAAE,SAAS,KAAK,EAAE,EAC7B,YAAY,EAAC,KAAK,GAClB,CACH,CAAC,CAAC,CAAC,IAAI,KA9BA,MAAM,CAAC,GAAG,CA+Bd,CACP,CAAC;oEACJ,CAAC,CAAC,EACD,aAAa,CAAC,IAAI,CACjB,CAAC,MAAM,EAAE,EAAE,CACT,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,UAAU,CAC9C,CAAC,CAAC,CAAC,CACF,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,GAAG,EAAE,CACZ,WAAW,CACT,QAAQ,EACR,aAAa,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAC1C,EAEH,QAAQ,EAAE,aAAa,KAAK,QAAQ,CAAC,EAAE,YAEtC,aAAa,KAAK,QAAQ,CAAC,EAAE;4EAC5B,CAAC,CAAC,WAAW;4EACb,CAAC,CAAC,kBAAkB,GACf,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,GACa,IACT,CACf,CAAC,CAAC,CAAC,IAAI,EACP,0BAA0B,CAAC,CAAC,CAAC,CAC5B,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,OAAO,EAAE,GAAG,EAAE,CACZ,WAAW,CACT,QAAQ,EACR,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAC1B,EAEH,QAAQ,EAAE,aAAa,KAAK,QAAQ,CAAC,EAAE,YAEtC,aAAa,KAAK,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAC/B,8BACE,KAAC,WAAW,IAAC,SAAS,EAAC,2BAA2B,GAAG,iBAEpD,CACJ,CAAC,CAAC,CAAC,CACF,kBAAkB,CACnB,GACM,CACV,CAAC,CAAC,CAAC,IAAI,IACU,EAEnB,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CACpB,KAAC,iBAAiB,IAChB,KAAK,EAAC,aAAa,EACnB,OAAO,EAAC,oCAAoC,YAE5C,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAM,SAAS,EAAC,0EAA0E,YACvF,MAAM,CAAC,UAAU,GACb,EACP,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,UAAW,CAAC,gBAClC,QAAQ,QAAQ,CAAC,IAAI,cAAc,YAE9C,aAAa,KAAK,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CACrC,KAAC,SAAS,IAAC,SAAS,EAAC,SAAS,GAAG,CAClC,CAAC,CAAC,CAAC,CACF,KAAC,QAAQ,IAAC,SAAS,EAAC,SAAS,GAAG,CACjC,GACM,IACL,GACY,CACrB,CAAC,CAAC,CAAC,IAAI,EAER,KAAC,iBAAiB,IAChB,KAAK,EAAC,WAAW,EACjB,OAAO,EAAC,kCAAkC,YAE1C,eAAK,SAAS,EAAC,sBAAsB,aACnC,KAAC,MAAM,IACL,OAAO,QACP,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,IAAI,EACT,SAAS,EAAC,+EAA+E,YAEzF,aACE,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,EACjC,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,YAAY,qBAGhB,KAAC,gBAAgB,IAAC,SAAS,EAAC,cAAc,GAAG,IAC3C,GACG,EACR,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,CACrC,KAAC,MAAM,IACL,OAAO,QACP,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,IAAI,EACT,SAAS,EAAC,+EAA+E,YAEzF,aACE,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,YAAY,EACzC,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,YAAY,aAEf,QAAQ,CAAC,aAAa,CAAC,aAAa,IAAI,MAAM,EAC/C,KAAC,gBAAgB,IAAC,SAAS,EAAC,cAAc,GAAG,IAC3C,GACG,CACV,CAAC,CAAC,CAAC,IAAI,IACJ,GACY,IAChB,GACW,KA/kBd,QAAQ,CAAC,EAAE,CAglBF,CACjB,CAAC;gBACJ,CAAC,CAAC,GACQ,EAEX,OAAO,CAAC,CAAC,CAAC,CACT,cAAK,SAAS,EAAC,0EAA0E,4CAEnF,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { useFormatters, useT } from \"@agent-native/core/client/i18n\";\nimport {\n disconnectManagedIntegrationInstallation,\n listManagedIntegrationBudgets,\n listManagedIntegrationInstallations,\n listManagedIntegrationScopes,\n listIntegrationEnvStatuses,\n listIntegrationStatuses,\n managedIntegrationOAuthUrl,\n managedSlackAgentManifestUrl,\n saveIntegrationEnvVars,\n saveManagedIntegrationBudget,\n saveManagedIntegrationScope,\n setIntegrationEnabled,\n setupIntegration,\n testManagedIntegrationInstallation,\n type ClientIntegrationInstallation,\n type ClientIntegrationScope,\n type ClientIntegrationUsageBudget,\n type ClientIntegrationStatus,\n type IntegrationEnvStatus,\n} from \"@agent-native/core/client/integrations\";\nimport {\n listBuiltInChannelIntegrations,\n type IntegrationCatalogEntry,\n type IntegrationCredentialRequirement,\n} from \"@agent-native/core/integrations\";\nimport {\n IconBrandDiscord,\n IconBrandSlack,\n IconBrandTelegram,\n IconBrandTeams,\n IconBrandWhatsapp,\n IconCheck,\n IconChevronRight,\n IconCopy,\n IconExternalLink,\n IconFileDescription,\n IconInfoCircle,\n IconLoader2,\n IconMail,\n IconPlug,\n} from \"@tabler/icons-react\";\nimport { type ReactNode, useEffect, useMemo, useState } from \"react\";\nimport { toast } from \"sonner\";\n\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"./ui/accordion\";\nimport { Button } from \"./ui/button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"./ui/collapsible\";\nimport { Input } from \"./ui/input\";\nimport { Switch } from \"./ui/switch\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./ui/tooltip\";\n\nconst CHANNELS = listBuiltInChannelIntegrations();\n\nconst PLATFORM_ICONS: Partial<Record<string, typeof IconBrandSlack>> = {\n slack: IconBrandSlack,\n \"microsoft-teams\": IconBrandTeams,\n discord: IconBrandDiscord,\n telegram: IconBrandTelegram,\n whatsapp: IconBrandWhatsapp,\n email: IconMail,\n};\n\nfunction hasMissingRequiredCredentials(\n credentials: readonly IntegrationCredentialRequirement[],\n envStatusByKey: Map<string, IntegrationEnvStatus>,\n) {\n const alternatives = new Map<\n string,\n readonly IntegrationCredentialRequirement[]\n >();\n\n for (const credential of credentials) {\n if (!credential.required) continue;\n if (!credential.alternativeGroup) {\n if (!envStatusByKey.get(credential.key)?.configured) return true;\n continue;\n }\n const group = alternatives.get(credential.alternativeGroup) ?? [];\n alternatives.set(credential.alternativeGroup, [...group, credential]);\n }\n\n return [...alternatives.values()].some((group) =>\n group.every(\n (credential) => !envStatusByKey.get(credential.key)?.configured,\n ),\n );\n}\n\nfunction HelpTooltip({ content }: { content: string }) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className=\"text-muted-foreground/60 hover:text-foreground cursor-pointer\"\n >\n <IconInfoCircle className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-64 text-xs leading-relaxed\">\n {content}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nfunction StatusPill({\n tone,\n label,\n}: {\n tone: \"neutral\" | \"success\" | \"warning\";\n label: string;\n}) {\n const toneClass =\n tone === \"success\"\n ? \"bg-emerald-500/10 text-emerald-700 dark:text-emerald-300\"\n : tone === \"warning\"\n ? \"bg-amber-500/10 text-amber-700 dark:text-amber-300\"\n : \"bg-muted text-muted-foreground\";\n\n return (\n <span\n className={`inline-flex items-center rounded-full px-2 py-1 text-[11px] font-medium ${toneClass}`}\n >\n {label}\n </span>\n );\n}\n\nfunction DisclosureSection({\n title,\n summary,\n children,\n defaultOpen = false,\n}: {\n title: string;\n summary?: string;\n children: ReactNode;\n defaultOpen?: boolean;\n}) {\n return (\n <Collapsible defaultOpen={defaultOpen} className=\"border-t\">\n <CollapsibleTrigger className=\"group flex w-full cursor-pointer items-center justify-between gap-3 py-3 text-left\">\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-medium text-foreground\">\n {title}\n </span>\n {summary ? (\n <span className=\"mt-0.5 block truncate text-xs text-muted-foreground\">\n {summary}\n </span>\n ) : null}\n </span>\n <IconChevronRight className=\"h-4 w-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pb-3\">{children}</CollapsibleContent>\n </Collapsible>\n );\n}\n\n/** Render a non-secret env value (e.g. EMAIL_AGENT_ADDRESS) as a copyable\n * text block. We can't read the actual value from the backend (env-status\n * only reports `configured: true|false`), so we offer a one-click reveal\n * that hits a server endpoint, falling back to \"saved\" if the value is\n * not exposed. For now we just render a \"Saved — re-enter to change\"\n * placeholder; a future endpoint can return the actual value. */\nfunction PublicValueReveal({ envKey: _envKey }: { envKey: string }) {\n return (\n <div className=\"rounded-md border bg-muted/20 px-3 py-2 text-xs text-muted-foreground\">\n Saved. Re-enter below to change.\n </div>\n );\n}\n\nfunction ConnectionStatus({\n configured,\n enabled,\n}: {\n configured: boolean;\n enabled: boolean;\n}) {\n if (enabled) {\n return <StatusPill tone=\"success\" label=\"Connected\" />;\n }\n if (configured) {\n return <StatusPill tone=\"warning\" label=\"Configured, not enabled\" />;\n }\n return <StatusPill tone=\"neutral\" label=\"Not configured\" />;\n}\n\nexport function MessagingSetupPanel() {\n const t = useT();\n const { formatDate } = useFormatters();\n const [statuses, setStatuses] = useState<ClientIntegrationStatus[]>([]);\n const [loading, setLoading] = useState(true);\n const [envStatuses, setEnvStatuses] = useState<IntegrationEnvStatus[]>([]);\n const [envLoading, setEnvLoading] = useState(true);\n const [envValues, setEnvValues] = useState<Record<string, string>>({});\n const [savingKeysFor, setSavingKeysFor] = useState<string | null>(null);\n const [togglingPlatform, setTogglingPlatform] = useState<string | null>(null);\n const [setupPlatform, setSetupPlatform] = useState<string | null>(null);\n const [copiedWebhook, setCopiedWebhook] = useState<string | null>(null);\n const [installations, setInstallations] = useState<\n ClientIntegrationInstallation[]\n >([]);\n const [installationAction, setInstallationAction] = useState<string | null>(\n null,\n );\n const [scopes, setScopes] = useState<ClientIntegrationScope[]>([]);\n const [budgets, setBudgets] = useState<ClientIntegrationUsageBudget[]>([]);\n const [scopeBudget, setScopeBudget] = useState<Record<string, string>>({});\n const [savingScope, setSavingScope] = useState<string | null>(null);\n\n const refreshStatuses = async () => {\n setLoading(true);\n try {\n setStatuses(await listIntegrationStatuses());\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n let active = true;\n listIntegrationStatuses()\n .then((rows) => {\n if (active) {\n setStatuses(rows);\n setLoading(false);\n }\n })\n .catch(() => {\n if (active) setLoading(false);\n });\n return () => {\n active = false;\n };\n }, []);\n\n useEffect(() => {\n let active = true;\n listManagedIntegrationInstallations(\"slack\")\n .then((rows) => {\n if (active) setInstallations(rows);\n })\n .catch(() => {});\n listManagedIntegrationScopes(\"slack\")\n .then((rows) => {\n if (active) setScopes(rows);\n })\n .catch(() => {});\n listManagedIntegrationBudgets()\n .then((rows) => {\n if (active) setBudgets(rows);\n })\n .catch(() => {});\n return () => {\n active = false;\n };\n }, []);\n\n useEffect(() => {\n let active = true;\n listIntegrationEnvStatuses()\n .then((rows) => {\n if (active) {\n setEnvStatuses(rows);\n setEnvLoading(false);\n }\n })\n .catch(() => {\n if (active) setEnvLoading(false);\n });\n return () => {\n active = false;\n };\n }, []);\n\n const envStatusByKey = useMemo(\n () => new Map(envStatuses.map((status) => [status.key, status])),\n [envStatuses],\n );\n const statusByPlatform = useMemo(\n () => new Map(statuses.map((status) => [status.platform, status])),\n [statuses],\n );\n\n const refreshEnvStatus = async () => {\n setEnvLoading(true);\n try {\n setEnvStatuses(await listIntegrationEnvStatuses());\n } finally {\n setEnvLoading(false);\n }\n };\n\n const saveEnvKeys = async (\n platform: IntegrationCatalogEntry,\n keys: string[],\n ) => {\n const vars = keys\n .map((key) => ({ key, value: envValues[key]?.trim() || \"\" }))\n .filter((item) => item.value);\n\n if (vars.length === 0) {\n toast.error(\"Add the required credentials first.\");\n return;\n }\n\n setSavingKeysFor(platform.id);\n try {\n await saveIntegrationEnvVars(vars);\n\n toast.success(`${platform.name} credentials saved`);\n setEnvValues((current) => {\n const next = { ...current };\n for (const key of keys) delete next[key];\n return next;\n });\n await refreshEnvStatus();\n await refreshStatuses();\n } catch (error) {\n toast.error(\n error instanceof Error ? error.message : \"Failed to save credentials\",\n );\n } finally {\n setSavingKeysFor(null);\n }\n };\n\n const togglePlatform = async (\n platform: IntegrationCatalogEntry,\n enabled: boolean,\n ) => {\n setTogglingPlatform(platform.id);\n try {\n await setIntegrationEnabled(platform.id, !enabled);\n toast.success(\n enabled\n ? `${platform.name} disconnected`\n : `${platform.name} connected`,\n );\n await refreshStatuses();\n } catch (error) {\n toast.error(\n error instanceof Error ? error.message : \"Failed to update integration\",\n );\n } finally {\n setTogglingPlatform(null);\n }\n };\n\n const runSetup = async (platform: IntegrationCatalogEntry) => {\n setSetupPlatform(platform.id);\n try {\n await setupIntegration(platform.id);\n toast.success(\n platform.id === \"telegram\"\n ? \"Telegram webhook registered\"\n : `${platform.name} setup complete`,\n );\n await refreshStatuses();\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : `Failed to set up ${platform.name}`,\n );\n } finally {\n setSetupPlatform(null);\n }\n };\n\n const copyWebhook = async (webhookUrl: string) => {\n await navigator.clipboard.writeText(webhookUrl);\n setCopiedWebhook(webhookUrl);\n toast.success(\"Webhook URL copied\");\n setTimeout(() => setCopiedWebhook(null), 1500);\n };\n\n const runInstallationAction = async (\n installation: ClientIntegrationInstallation,\n action: \"test\" | \"disconnect\",\n ) => {\n setInstallationAction(`${action}:${installation.id}`);\n try {\n await (action === \"test\"\n ? testManagedIntegrationInstallation(installation.id)\n : disconnectManagedIntegrationInstallation(installation.id));\n setInstallations(await listManagedIntegrationInstallations(\"slack\"));\n toast.success(\n action === \"test\"\n ? t(\"messaging.managed.connectionChecked\")\n : t(\"messaging.managed.workspaceDisconnected\"),\n );\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : t(\"messaging.managed.actionFailed\"),\n );\n } finally {\n setInstallationAction(null);\n }\n };\n\n const updateScopePolicy = async (\n scope: ClientIntegrationScope,\n policy: Partial<ClientIntegrationScope[\"policy\"]>,\n ) => {\n setSavingScope(scope.id);\n try {\n await saveManagedIntegrationScope({\n platform: scope.platform,\n tenantId: scope.tenantId,\n conversationId: scope.conversationId,\n conversationType: scope.conversationType,\n trust: scope.trust,\n orgId: scope.orgId,\n serviceOwnerEmail: scope.serviceOwnerEmail,\n defaultModel: scope.defaultModel,\n policy: { ...scope.policy, ...policy },\n });\n setScopes(await listManagedIntegrationScopes(\"slack\"));\n toast.success(t(\"messaging.managed.channelPolicyUpdated\"));\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : t(\"messaging.managed.policyUpdateFailed\"),\n );\n } finally {\n setSavingScope(null);\n }\n };\n\n const saveScopeBudget = async (scope: ClientIntegrationScope) => {\n const dollars = Number(scopeBudget[scope.id]);\n if (!Number.isFinite(dollars) || dollars <= 0) {\n toast.error(t(\"messaging.managed.positiveMonthlyBudget\"));\n return;\n }\n setSavingScope(`budget:${scope.id}`);\n try {\n await saveManagedIntegrationBudget({\n subject: {\n type: \"scope\",\n scope: {\n platform: scope.platform,\n tenantId: scope.tenantId,\n conversationId: scope.conversationId,\n },\n },\n period: \"month\",\n limitMicros: Math.round(dollars * 1_000_000),\n });\n setBudgets(await listManagedIntegrationBudgets());\n toast.success(t(\"messaging.managed.channelBudgetSaved\"));\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : t(\"messaging.managed.budgetSaveFailed\"),\n );\n } finally {\n setSavingScope(null);\n }\n };\n\n return (\n <div className=\"space-y-4\">\n <Accordion\n type=\"single\"\n collapsible\n className=\"overflow-hidden rounded-2xl bg-card\"\n >\n {CHANNELS.map((platform) => {\n const status = statusByPlatform.get(platform.id);\n const configured =\n !!status?.configured ||\n (platform.id === \"slack\" &&\n installations.some(\n (installation) => installation.status === \"connected\",\n ));\n const enabled = !!status?.enabled;\n const envKeys = platform.credentialRequirements;\n const primaryEnvKeys = envKeys.filter(\n (envKey) => envKey.key !== \"SLACK_BOT_TOKEN\",\n );\n const legacyEnvKeys = envKeys.filter(\n (envKey) => envKey.key === \"SLACK_BOT_TOKEN\",\n );\n const missingRequiredCredentials = hasMissingRequiredCredentials(\n envKeys,\n envStatusByKey,\n );\n const configuredCredentialCount = envKeys.filter(\n (envKey) => envStatusByKey.get(envKey.key)?.configured,\n ).length;\n const credentialSummary = envLoading\n ? \"Checking saved credentials\"\n : missingRequiredCredentials\n ? \"Required credentials are missing\"\n : `${configuredCredentialCount} saved`;\n const Icon = PLATFORM_ICONS[platform.iconKey] ?? IconPlug;\n\n return (\n <AccordionItem\n key={platform.id}\n value={platform.id}\n className=\"border-b last:border-b-0\"\n >\n <AccordionTrigger className=\"gap-3 px-4 text-left hover:no-underline\">\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <Icon className=\"h-5 w-5 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h3 className=\"text-base font-semibold text-foreground\">\n {platform.name}\n </h3>\n <ConnectionStatus\n configured={configured}\n enabled={enabled}\n />\n </div>\n <p className=\"mt-1 truncate text-sm text-muted-foreground\">\n {platform.description}\n </p>\n </div>\n </div>\n </AccordionTrigger>\n\n <AccordionContent className=\"px-4\">\n <div className=\"border-t\">\n <div className=\"flex flex-wrap items-center justify-between gap-3 py-3\">\n <div>\n <p className=\"text-sm font-medium text-foreground\">\n {enabled\n ? \"Messages are flowing\"\n : configured\n ? \"Ready to connect\"\n : \"Finish setup to connect\"}\n </p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {credentialSummary}\n </p>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n {platform.id === \"telegram\" && configured ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => runSetup(platform)}\n disabled={setupPlatform === platform.id}\n >\n {setupPlatform === platform.id ? (\n <>\n <IconLoader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Setting up...\n </>\n ) : (\n \"Set up webhook\"\n )}\n </Button>\n ) : null}\n {!configured && !enabled ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span tabIndex={0}>\n <Button size=\"sm\" disabled>\n Enable\n </Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>\n Save the required credentials first.\n </TooltipContent>\n </Tooltip>\n ) : (\n <Button\n size=\"sm\"\n onClick={() => togglePlatform(platform, enabled)}\n disabled={togglingPlatform === platform.id}\n >\n {togglingPlatform === platform.id ? (\n <>\n <IconLoader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Saving...\n </>\n ) : enabled ? (\n \"Disable\"\n ) : (\n \"Enable\"\n )}\n </Button>\n )}\n </div>\n </div>\n\n {platform.id === \"slack\" ? (\n <DisclosureSection\n title={t(\"messaging.managed.title\")}\n summary={\n installations.length\n ? `${installations.length} connected`\n : \"No workspaces connected yet\"\n }\n >\n <div className=\"space-y-3\">\n <p className=\"text-xs text-muted-foreground\">\n {t(\"messaging.managed.description\")}{\" \"}\n {t(\"messaging.managed.agentManifestDescription\")}\n </p>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button asChild variant=\"outline\" size=\"sm\">\n <a href={managedSlackAgentManifestUrl()}>\n <IconFileDescription className=\"mr-2 h-4 w-4\" />\n {t(\"messaging.managed.agentManifest\")}\n </a>\n </Button>\n {missingRequiredCredentials ? (\n <Button size=\"sm\" disabled>\n <IconBrandSlack className=\"mr-2 h-4 w-4\" />\n {t(\"messaging.managed.addToSlack\")}\n </Button>\n ) : (\n <Button asChild size=\"sm\">\n <a href={managedIntegrationOAuthUrl(\"slack\")}>\n <IconBrandSlack className=\"mr-2 h-4 w-4\" />\n {t(\"messaging.managed.addToSlack\")}\n </a>\n </Button>\n )}\n </div>\n {missingRequiredCredentials ? (\n <p className=\"text-xs text-amber-700 dark:text-amber-300\">\n {t(\"messaging.managed.requiredCredentials\")}\n </p>\n ) : null}\n {installations.length ? (\n <div className=\"divide-y rounded-lg bg-muted/20 px-3\">\n {installations.map((installation) => (\n <div\n key={installation.id}\n className=\"flex flex-wrap items-center justify-between gap-3 py-3\"\n >\n <div>\n <div className=\"text-sm font-medium text-foreground\">\n {installation.teamName ||\n installation.enterpriseName ||\n installation.teamId ||\n t(\"messaging.managed.workspaceFallback\")}\n </div>\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {t(\"messaging.managed.scopesUpdated\", {\n count: installation.scopes.length,\n date: formatDate(installation.updatedAt, {\n dateStyle: \"medium\",\n }),\n })}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <StatusPill\n tone={\n installation.health === \"healthy\"\n ? \"success\"\n : installation.health === \"degraded\" ||\n installation.health === \"revoked\"\n ? \"warning\"\n : \"neutral\"\n }\n label={t(\n `messaging.managed.health.${installation.health}`,\n )}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() =>\n runInstallationAction(\n installation,\n \"test\",\n )\n }\n disabled={\n installationAction ===\n `test:${installation.id}`\n }\n >\n {t(\"messaging.managed.test\")}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() =>\n runInstallationAction(\n installation,\n \"disconnect\",\n )\n }\n disabled={\n installationAction ===\n `disconnect:${installation.id}`\n }\n >\n {t(\"messaging.managed.disconnect\")}\n </Button>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {t(\"messaging.managed.empty\")}\n </p>\n )}\n </div>\n </DisclosureSection>\n ) : null}\n\n {platform.id === \"slack\" && scopes.length ? (\n <DisclosureSection\n title={t(\"messaging.managed.channelAccessTitle\")}\n summary={`${scopes.length} channel${scopes.length === 1 ? \"\" : \"s\"}`}\n >\n <div className=\"space-y-3\">\n <p className=\"text-xs text-muted-foreground\">\n {t(\"messaging.managed.channelAccessDescription\")}\n </p>\n {scopes.map((scope) => {\n const subjectId = JSON.stringify([\n scope.platform,\n scope.tenantId,\n scope.conversationId,\n ]);\n const budget = budgets.find(\n (item) =>\n item.subjectType === \"scope\" &&\n item.subjectId === subjectId &&\n item.period === \"month\",\n );\n return (\n <Collapsible\n key={scope.id}\n className=\"border-b last:border-b-0\"\n >\n <CollapsibleTrigger className=\"group flex w-full cursor-pointer items-center justify-between gap-3 py-3 text-left\">\n <span className=\"min-w-0\">\n <span className=\"block truncate font-mono text-xs text-foreground\">\n {scope.conversationId}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {t(\"messaging.managed.isolatedIdentity\", {\n trust: t(\n `messaging.managed.trust.${scope.trust}`,\n ),\n })}\n </span>\n </span>\n <span className=\"flex shrink-0 items-center gap-2\">\n <StatusPill\n tone={\n scope.trust === \"trusted\"\n ? \"success\"\n : \"warning\"\n }\n label={t(\n `messaging.managed.trust.${scope.trust}`,\n )}\n />\n <IconChevronRight className=\"h-4 w-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n </span>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pb-3\">\n <div className=\"grid gap-2 sm:grid-cols-3\">\n {[\n [\n \"requireMention\",\n t(\"messaging.managed.requireMention\"),\n ],\n [\n \"allowGuests\",\n t(\"messaging.managed.allowGuests\"),\n ],\n [\n \"allowExternalShared\",\n t(\"messaging.managed.allowSlackConnect\"),\n ],\n ].map(([key, label]) => (\n <label\n key={key}\n className=\"flex items-center justify-between gap-2 rounded-md border px-2.5 py-2 text-xs\"\n >\n {label}\n <Switch\n checked={\n scope.policy[\n key as keyof ClientIntegrationScope[\"policy\"]\n ]\n }\n disabled={savingScope === scope.id}\n onCheckedChange={(checked) =>\n updateScopePolicy(scope, {\n [key]: checked,\n })\n }\n />\n </label>\n ))}\n </div>\n <div className=\"flex flex-wrap items-end gap-2\">\n <div className=\"min-w-40 flex-1 space-y-1\">\n <label className=\"text-xs font-medium text-foreground\">\n {t(\"messaging.managed.monthlyBudgetUsd\")}\n </label>\n <Input\n inputMode=\"decimal\"\n value={\n scopeBudget[scope.id] ??\n (budget\n ? String(\n budget.limitMicros / 1_000_000,\n )\n : \"\")\n }\n onChange={(event) =>\n setScopeBudget((current) => ({\n ...current,\n [scope.id]: event.target.value,\n }))\n }\n placeholder=\"25\"\n />\n </div>\n <Button\n variant=\"outline\"\n onClick={() => saveScopeBudget(scope)}\n disabled={\n savingScope === `budget:${scope.id}`\n }\n >\n {t(\"messaging.managed.saveBudget\")}\n </Button>\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n })}\n </div>\n </DisclosureSection>\n ) : null}\n\n <DisclosureSection\n title=\"Setup steps\"\n summary={`${platform.setup.steps.length} step${platform.setup.steps.length === 1 ? \"\" : \"s\"}`}\n >\n <ol className=\"space-y-2 rounded-lg bg-muted/20 px-3 py-3 text-sm text-muted-foreground\">\n {platform.setup.steps.map((step, index) => (\n <li key={step} className=\"flex gap-2\">\n <span className=\"text-muted-foreground/60\">\n {index + 1}.\n </span>\n <span>{step}</span>\n </li>\n ))}\n </ol>\n </DisclosureSection>\n\n <DisclosureSection\n title=\"Credentials\"\n summary={credentialSummary}\n >\n <div className=\"space-y-3\">\n {primaryEnvKeys.map((envKey) => {\n const envStatus = envStatusByKey.get(envKey.key);\n const isConfigured = !!envStatus?.configured;\n const helpText = envKey.helpText ?? envStatus?.helpText;\n const label =\n envKey.label || envStatus?.label || envKey.key;\n // Email agent address is not a secret — show it plainly\n // so users can copy and share it.\n const isPublicValue =\n envKey.key === \"EMAIL_AGENT_ADDRESS\";\n return (\n <div key={envKey.key} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-xs font-medium text-foreground\">\n {label}\n {!envKey.required ? (\n <span className=\"ml-1 text-muted-foreground\">\n (optional)\n </span>\n ) : null}\n </label>\n {helpText ? (\n <HelpTooltip content={helpText} />\n ) : null}\n </div>\n {isConfigured ? (\n <StatusPill tone=\"success\" label=\"Saved\" />\n ) : (\n <StatusPill\n tone=\"neutral\"\n label={\n envKey.required ? \"Missing\" : \"Not set\"\n }\n />\n )}\n </div>\n {isConfigured && isPublicValue ? (\n <PublicValueReveal envKey={envKey.key} />\n ) : !isConfigured ? (\n <Input\n type={isPublicValue ? \"text\" : \"password\"}\n value={envValues[envKey.key] || \"\"}\n onChange={(event) =>\n setEnvValues((current) => ({\n ...current,\n [envKey.key]: event.target.value,\n }))\n }\n placeholder={\n isPublicValue\n ? \"agent@yourcompany.com\"\n : `Enter ${label}`\n }\n autoComplete=\"off\"\n />\n ) : null}\n </div>\n );\n })}\n </div>\n {legacyEnvKeys.length ? (\n <Collapsible>\n <CollapsibleTrigger className=\"group flex w-full cursor-pointer items-center gap-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\">\n <IconChevronRight className=\"h-3.5 w-3.5 transition-transform group-data-[state=open]:rotate-90\" />\n <span>{legacyEnvKeys[0]?.label}</span>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"mt-2 space-y-3 rounded-xl border border-amber-500/30 bg-amber-500/5 p-4\">\n <p className=\"text-xs text-muted-foreground\">\n {legacyEnvKeys[0]?.helpText}\n </p>\n {legacyEnvKeys.map((envKey) => {\n const envStatus = envStatusByKey.get(envKey.key);\n const isConfigured = !!envStatus?.configured;\n const helpText =\n envKey.helpText ?? envStatus?.helpText;\n const label =\n envKey.label || envStatus?.label || envKey.key;\n return (\n <div key={envKey.key} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-xs font-medium text-foreground\">\n {label}\n </label>\n {helpText ? (\n <HelpTooltip content={helpText} />\n ) : null}\n </div>\n <StatusPill\n tone={\n isConfigured ? \"success\" : \"neutral\"\n }\n label={isConfigured ? \"Saved\" : \"Not set\"}\n />\n </div>\n {!isConfigured ? (\n <Input\n type=\"password\"\n value={envValues[envKey.key] || \"\"}\n onChange={(event) =>\n setEnvValues((current) => ({\n ...current,\n [envKey.key]: event.target.value,\n }))\n }\n placeholder={`Enter ${label}`}\n autoComplete=\"off\"\n />\n ) : null}\n </div>\n );\n })}\n {legacyEnvKeys.some(\n (envKey) =>\n !envStatusByKey.get(envKey.key)?.configured,\n ) ? (\n <Button\n variant=\"outline\"\n onClick={() =>\n saveEnvKeys(\n platform,\n legacyEnvKeys.map((envKey) => envKey.key),\n )\n }\n disabled={savingKeysFor === platform.id}\n >\n {savingKeysFor === platform.id\n ? \"Saving...\"\n : \"Save credentials\"}\n </Button>\n ) : null}\n </div>\n </CollapsibleContent>\n </Collapsible>\n ) : null}\n {missingRequiredCredentials ? (\n <Button\n variant=\"outline\"\n onClick={() =>\n saveEnvKeys(\n platform,\n envKeys.map((k) => k.key),\n )\n }\n disabled={savingKeysFor === platform.id}\n >\n {savingKeysFor === platform.id ? (\n <>\n <IconLoader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Saving...\n </>\n ) : (\n \"Save credentials\"\n )}\n </Button>\n ) : null}\n </DisclosureSection>\n\n {status?.webhookUrl ? (\n <DisclosureSection\n title=\"Webhook URL\"\n summary=\"Copy the endpoint for this channel\"\n >\n <div className=\"flex items-center gap-2\">\n <code className=\"flex-1 truncate rounded-md bg-muted/30 px-3 py-2 text-xs text-foreground\">\n {status.webhookUrl}\n </code>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => copyWebhook(status.webhookUrl!)}\n aria-label={`Copy ${platform.name} webhook URL`}\n >\n {copiedWebhook === status.webhookUrl ? (\n <IconCheck className=\"h-4 w-4\" />\n ) : (\n <IconCopy className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n </DisclosureSection>\n ) : null}\n\n <DisclosureSection\n title=\"Resources\"\n summary=\"Documentation and external links\"\n >\n <div className=\"flex flex-wrap gap-2\">\n <Button\n asChild\n variant=\"ghost\"\n size=\"sm\"\n className=\"px-0 text-xs text-muted-foreground hover:bg-transparent hover:text-foreground\"\n >\n <a\n href={platform.documentation.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n Docs\n <IconExternalLink className=\"ml-1 h-3 w-3\" />\n </a>\n </Button>\n {platform.documentation.externalHref ? (\n <Button\n asChild\n variant=\"ghost\"\n size=\"sm\"\n className=\"px-0 text-xs text-muted-foreground hover:bg-transparent hover:text-foreground\"\n >\n <a\n href={platform.documentation.externalHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {platform.documentation.externalLabel ?? \"Open\"}\n <IconExternalLink className=\"ml-1 h-3 w-3\" />\n </a>\n </Button>\n ) : null}\n </div>\n </DisclosureSection>\n </div>\n </AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordion>\n\n {loading ? (\n <div className=\"rounded-2xl border border-dashed px-4 py-6 text-sm text-muted-foreground\">\n Loading messaging status...\n </div>\n ) : null}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"messaging-setup-panel.js","sourceRoot":"","sources":["../../src/components/messaging-setup-panel.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useFormatters, useT } from \"@agent-native/core/client/i18n\";\nimport {\n disconnectManagedIntegrationInstallation,\n listManagedIntegrationBudgets,\n listManagedIntegrationInstallations,\n listManagedIntegrationScopes,\n listIntegrationEnvStatuses,\n listIntegrationStatuses,\n managedIntegrationOAuthUrl,\n managedSlackAgentManifestUrl,\n saveIntegrationEnvVars,\n saveManagedIntegrationBudget,\n saveManagedIntegrationScope,\n setIntegrationEnabled,\n setupIntegration,\n testManagedIntegrationInstallation,\n type ClientIntegrationInstallation,\n type ClientIntegrationScope,\n type ClientIntegrationUsageBudget,\n type ClientIntegrationStatus,\n type IntegrationEnvStatus,\n} from \"@agent-native/core/client/integrations\";\nimport {\n listBuiltInChannelIntegrations,\n type IntegrationCatalogEntry,\n type IntegrationCredentialRequirement,\n} from \"@agent-native/core/integrations\";\nimport {\n IconBrandDiscord,\n IconBrandSlack,\n IconBrandTelegram,\n IconBrandTeams,\n IconBrandWhatsapp,\n IconCheck,\n IconChevronRight,\n IconCopy,\n IconExternalLink,\n IconFileDescription,\n IconInfoCircle,\n IconLoader2,\n IconMail,\n IconPlug,\n} from \"@tabler/icons-react\";\nimport { type ReactNode, useEffect, useMemo, useState } from \"react\";\nimport { toast } from \"sonner\";\n\nimport {\n Accordion,\n AccordionContent,\n AccordionItem,\n AccordionTrigger,\n} from \"./ui/accordion\";\nimport { Button } from \"./ui/button\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"./ui/collapsible\";\nimport { Input } from \"./ui/input\";\nimport { Skeleton } from \"./ui/skeleton\";\nimport { Switch } from \"./ui/switch\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./ui/tooltip\";\n\nconst CHANNELS = listBuiltInChannelIntegrations();\n\nconst PLATFORM_ICONS: Partial<Record<string, typeof IconBrandSlack>> = {\n slack: IconBrandSlack,\n \"microsoft-teams\": IconBrandTeams,\n discord: IconBrandDiscord,\n telegram: IconBrandTelegram,\n whatsapp: IconBrandWhatsapp,\n email: IconMail,\n};\n\nfunction hasMissingRequiredCredentials(\n credentials: readonly IntegrationCredentialRequirement[],\n envStatusByKey: Map<string, IntegrationEnvStatus>,\n) {\n const alternatives = new Map<\n string,\n readonly IntegrationCredentialRequirement[]\n >();\n\n for (const credential of credentials) {\n if (!credential.required) continue;\n if (!credential.alternativeGroup) {\n if (!envStatusByKey.get(credential.key)?.configured) return true;\n continue;\n }\n const group = alternatives.get(credential.alternativeGroup) ?? [];\n alternatives.set(credential.alternativeGroup, [...group, credential]);\n }\n\n return [...alternatives.values()].some((group) =>\n group.every(\n (credential) => !envStatusByKey.get(credential.key)?.configured,\n ),\n );\n}\n\nfunction HelpTooltip({ content }: { content: string }) {\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n className=\"text-muted-foreground/60 hover:text-foreground cursor-pointer\"\n >\n <IconInfoCircle className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-64 text-xs leading-relaxed\">\n {content}\n </TooltipContent>\n </Tooltip>\n );\n}\n\nfunction StatusPill({\n tone,\n label,\n}: {\n tone: \"neutral\" | \"success\" | \"warning\";\n label: string;\n}) {\n const toneClass =\n tone === \"success\"\n ? \"bg-emerald-500/10 text-emerald-700 dark:text-emerald-300\"\n : tone === \"warning\"\n ? \"bg-amber-500/10 text-amber-700 dark:text-amber-300\"\n : \"bg-muted text-muted-foreground\";\n\n return (\n <span\n className={`inline-flex items-center rounded-full px-2 py-1 text-[11px] font-medium ${toneClass}`}\n >\n {label}\n </span>\n );\n}\n\nfunction DisclosureSection({\n title,\n summary,\n children,\n defaultOpen = false,\n}: {\n title: string;\n summary?: string;\n children: ReactNode;\n defaultOpen?: boolean;\n}) {\n return (\n <Collapsible defaultOpen={defaultOpen} className=\"border-t\">\n <CollapsibleTrigger className=\"group flex w-full cursor-pointer items-center justify-between gap-3 py-3 text-left\">\n <span className=\"min-w-0\">\n <span className=\"block text-sm font-medium text-foreground\">\n {title}\n </span>\n {summary ? (\n <span className=\"mt-0.5 block truncate text-xs text-muted-foreground\">\n {summary}\n </span>\n ) : null}\n </span>\n <IconChevronRight className=\"h-4 w-4 shrink-0 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pb-3\">{children}</CollapsibleContent>\n </Collapsible>\n );\n}\n\n/** Render a non-secret env value (e.g. EMAIL_AGENT_ADDRESS) as a copyable\n * text block. We can't read the actual value from the backend (env-status\n * only reports `configured: true|false`), so we offer a one-click reveal\n * that hits a server endpoint, falling back to \"saved\" if the value is\n * not exposed. For now we just render a \"Saved — re-enter to change\"\n * placeholder; a future endpoint can return the actual value. */\nfunction PublicValueReveal({ envKey: _envKey }: { envKey: string }) {\n return (\n <div className=\"rounded-md border bg-muted/20 px-3 py-2 text-xs text-muted-foreground\">\n Saved. Re-enter below to change.\n </div>\n );\n}\n\nfunction ConnectionStatus({\n configured,\n enabled,\n}: {\n configured: boolean;\n enabled: boolean;\n}) {\n if (enabled) {\n return <StatusPill tone=\"success\" label=\"Connected\" />;\n }\n if (configured) {\n return <StatusPill tone=\"warning\" label=\"Configured, not enabled\" />;\n }\n return <StatusPill tone=\"neutral\" label=\"Not configured\" />;\n}\n\nexport function MessagingSetupPanel() {\n const t = useT();\n const { formatDate } = useFormatters();\n const [statuses, setStatuses] = useState<ClientIntegrationStatus[]>([]);\n const [loading, setLoading] = useState(true);\n const [envStatuses, setEnvStatuses] = useState<IntegrationEnvStatus[]>([]);\n const [envLoading, setEnvLoading] = useState(true);\n const [envValues, setEnvValues] = useState<Record<string, string>>({});\n const [savingKeysFor, setSavingKeysFor] = useState<string | null>(null);\n const [togglingPlatform, setTogglingPlatform] = useState<string | null>(null);\n const [setupPlatform, setSetupPlatform] = useState<string | null>(null);\n const [copiedWebhook, setCopiedWebhook] = useState<string | null>(null);\n const [installations, setInstallations] = useState<\n ClientIntegrationInstallation[]\n >([]);\n const [installationAction, setInstallationAction] = useState<string | null>(\n null,\n );\n const [scopes, setScopes] = useState<ClientIntegrationScope[]>([]);\n const [budgets, setBudgets] = useState<ClientIntegrationUsageBudget[]>([]);\n const [scopeBudget, setScopeBudget] = useState<Record<string, string>>({});\n const [savingScope, setSavingScope] = useState<string | null>(null);\n\n const refreshStatuses = async () => {\n setLoading(true);\n try {\n setStatuses(await listIntegrationStatuses());\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n let active = true;\n listIntegrationStatuses()\n .then((rows) => {\n if (active) {\n setStatuses(rows);\n setLoading(false);\n }\n })\n .catch(() => {\n if (active) setLoading(false);\n });\n return () => {\n active = false;\n };\n }, []);\n\n useEffect(() => {\n let active = true;\n listManagedIntegrationInstallations(\"slack\")\n .then((rows) => {\n if (active) setInstallations(rows);\n })\n .catch(() => {});\n listManagedIntegrationScopes(\"slack\")\n .then((rows) => {\n if (active) setScopes(rows);\n })\n .catch(() => {});\n listManagedIntegrationBudgets()\n .then((rows) => {\n if (active) setBudgets(rows);\n })\n .catch(() => {});\n return () => {\n active = false;\n };\n }, []);\n\n useEffect(() => {\n let active = true;\n listIntegrationEnvStatuses()\n .then((rows) => {\n if (active) {\n setEnvStatuses(rows);\n setEnvLoading(false);\n }\n })\n .catch(() => {\n if (active) setEnvLoading(false);\n });\n return () => {\n active = false;\n };\n }, []);\n\n const envStatusByKey = useMemo(\n () => new Map(envStatuses.map((status) => [status.key, status])),\n [envStatuses],\n );\n const statusByPlatform = useMemo(\n () => new Map(statuses.map((status) => [status.platform, status])),\n [statuses],\n );\n\n const refreshEnvStatus = async () => {\n setEnvLoading(true);\n try {\n setEnvStatuses(await listIntegrationEnvStatuses());\n } finally {\n setEnvLoading(false);\n }\n };\n\n const saveEnvKeys = async (\n platform: IntegrationCatalogEntry,\n keys: string[],\n ) => {\n const vars = keys\n .map((key) => ({ key, value: envValues[key]?.trim() || \"\" }))\n .filter((item) => item.value);\n\n if (vars.length === 0) {\n toast.error(\"Add the required credentials first.\");\n return;\n }\n\n setSavingKeysFor(platform.id);\n try {\n await saveIntegrationEnvVars(vars);\n\n toast.success(`${platform.name} credentials saved`);\n setEnvValues((current) => {\n const next = { ...current };\n for (const key of keys) delete next[key];\n return next;\n });\n await refreshEnvStatus();\n await refreshStatuses();\n } catch (error) {\n toast.error(\n error instanceof Error ? error.message : \"Failed to save credentials\",\n );\n } finally {\n setSavingKeysFor(null);\n }\n };\n\n const togglePlatform = async (\n platform: IntegrationCatalogEntry,\n enabled: boolean,\n ) => {\n setTogglingPlatform(platform.id);\n try {\n await setIntegrationEnabled(platform.id, !enabled);\n toast.success(\n enabled\n ? `${platform.name} disconnected`\n : `${platform.name} connected`,\n );\n await refreshStatuses();\n } catch (error) {\n toast.error(\n error instanceof Error ? error.message : \"Failed to update integration\",\n );\n } finally {\n setTogglingPlatform(null);\n }\n };\n\n const runSetup = async (platform: IntegrationCatalogEntry) => {\n setSetupPlatform(platform.id);\n try {\n await setupIntegration(platform.id);\n toast.success(\n platform.id === \"telegram\"\n ? \"Telegram webhook registered\"\n : `${platform.name} setup complete`,\n );\n await refreshStatuses();\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : `Failed to set up ${platform.name}`,\n );\n } finally {\n setSetupPlatform(null);\n }\n };\n\n const copyWebhook = async (webhookUrl: string) => {\n await navigator.clipboard.writeText(webhookUrl);\n setCopiedWebhook(webhookUrl);\n toast.success(\"Webhook URL copied\");\n setTimeout(() => setCopiedWebhook(null), 1500);\n };\n\n const runInstallationAction = async (\n installation: ClientIntegrationInstallation,\n action: \"test\" | \"disconnect\",\n ) => {\n setInstallationAction(`${action}:${installation.id}`);\n try {\n await (action === \"test\"\n ? testManagedIntegrationInstallation(installation.id)\n : disconnectManagedIntegrationInstallation(installation.id));\n setInstallations(await listManagedIntegrationInstallations(\"slack\"));\n toast.success(\n action === \"test\"\n ? t(\"messaging.managed.connectionChecked\")\n : t(\"messaging.managed.workspaceDisconnected\"),\n );\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : t(\"messaging.managed.actionFailed\"),\n );\n } finally {\n setInstallationAction(null);\n }\n };\n\n const updateScopePolicy = async (\n scope: ClientIntegrationScope,\n policy: Partial<ClientIntegrationScope[\"policy\"]>,\n ) => {\n setSavingScope(scope.id);\n try {\n await saveManagedIntegrationScope({\n platform: scope.platform,\n tenantId: scope.tenantId,\n conversationId: scope.conversationId,\n conversationType: scope.conversationType,\n trust: scope.trust,\n orgId: scope.orgId,\n serviceOwnerEmail: scope.serviceOwnerEmail,\n defaultModel: scope.defaultModel,\n policy: { ...scope.policy, ...policy },\n });\n setScopes(await listManagedIntegrationScopes(\"slack\"));\n toast.success(t(\"messaging.managed.channelPolicyUpdated\"));\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : t(\"messaging.managed.policyUpdateFailed\"),\n );\n } finally {\n setSavingScope(null);\n }\n };\n\n const saveScopeBudget = async (scope: ClientIntegrationScope) => {\n const dollars = Number(scopeBudget[scope.id]);\n if (!Number.isFinite(dollars) || dollars <= 0) {\n toast.error(t(\"messaging.managed.positiveMonthlyBudget\"));\n return;\n }\n setSavingScope(`budget:${scope.id}`);\n try {\n await saveManagedIntegrationBudget({\n subject: {\n type: \"scope\",\n scope: {\n platform: scope.platform,\n tenantId: scope.tenantId,\n conversationId: scope.conversationId,\n },\n },\n period: \"month\",\n limitMicros: Math.round(dollars * 1_000_000),\n });\n setBudgets(await listManagedIntegrationBudgets());\n toast.success(t(\"messaging.managed.channelBudgetSaved\"));\n } catch (error) {\n toast.error(\n error instanceof Error\n ? error.message\n : t(\"messaging.managed.budgetSaveFailed\"),\n );\n } finally {\n setSavingScope(null);\n }\n };\n\n return (\n <div className=\"space-y-4\">\n <Accordion\n type=\"single\"\n collapsible\n className=\"overflow-hidden rounded-2xl bg-card\"\n >\n {CHANNELS.map((platform) => {\n const status = statusByPlatform.get(platform.id);\n const configured =\n !!status?.configured ||\n (platform.id === \"slack\" &&\n installations.some(\n (installation) => installation.status === \"connected\",\n ));\n const enabled = !!status?.enabled;\n const envKeys = platform.credentialRequirements;\n const primaryEnvKeys = envKeys.filter(\n (envKey) => envKey.key !== \"SLACK_BOT_TOKEN\",\n );\n const legacyEnvKeys = envKeys.filter(\n (envKey) => envKey.key === \"SLACK_BOT_TOKEN\",\n );\n const missingRequiredCredentials = hasMissingRequiredCredentials(\n envKeys,\n envStatusByKey,\n );\n const configuredCredentialCount = envKeys.filter(\n (envKey) => envStatusByKey.get(envKey.key)?.configured,\n ).length;\n const credentialSummary = envLoading\n ? \"Checking saved credentials\"\n : missingRequiredCredentials\n ? \"Required credentials are missing\"\n : `${configuredCredentialCount} saved`;\n const Icon = PLATFORM_ICONS[platform.iconKey] ?? IconPlug;\n\n return (\n <AccordionItem\n key={platform.id}\n value={platform.id}\n className=\"border-b last:border-b-0\"\n >\n <AccordionTrigger className=\"gap-3 px-4 text-left hover:no-underline\">\n <div className=\"flex min-w-0 flex-1 items-center gap-3\">\n <Icon className=\"h-5 w-5 shrink-0 text-muted-foreground\" />\n <div className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <h3 className=\"text-base font-semibold text-foreground\">\n {platform.name}\n </h3>\n <ConnectionStatus\n configured={configured}\n enabled={enabled}\n />\n </div>\n <p className=\"mt-1 truncate text-sm text-muted-foreground\">\n {platform.description}\n </p>\n </div>\n </div>\n </AccordionTrigger>\n\n <AccordionContent className=\"px-4\">\n <div className=\"border-t\">\n <div className=\"flex flex-wrap items-center justify-between gap-3 py-3\">\n <div>\n <p className=\"text-sm font-medium text-foreground\">\n {enabled\n ? \"Messages are flowing\"\n : configured\n ? \"Ready to connect\"\n : \"Finish setup to connect\"}\n </p>\n <p className=\"mt-0.5 text-xs text-muted-foreground\">\n {envLoading ? (\n <Skeleton className=\"h-3 w-32\" />\n ) : (\n credentialSummary\n )}\n </p>\n </div>\n <div className=\"flex flex-wrap items-center gap-2\">\n {platform.id === \"telegram\" && configured ? (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => runSetup(platform)}\n disabled={setupPlatform === platform.id}\n >\n {setupPlatform === platform.id ? (\n <>\n <IconLoader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Setting up...\n </>\n ) : (\n \"Set up webhook\"\n )}\n </Button>\n ) : null}\n {!configured && !enabled ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <span tabIndex={0}>\n <Button size=\"sm\" disabled>\n Enable\n </Button>\n </span>\n </TooltipTrigger>\n <TooltipContent>\n Save the required credentials first.\n </TooltipContent>\n </Tooltip>\n ) : (\n <Button\n size=\"sm\"\n onClick={() => togglePlatform(platform, enabled)}\n disabled={togglingPlatform === platform.id}\n >\n {togglingPlatform === platform.id ? (\n <>\n <IconLoader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Saving...\n </>\n ) : enabled ? (\n \"Disable\"\n ) : (\n \"Enable\"\n )}\n </Button>\n )}\n </div>\n </div>\n\n {platform.id === \"slack\" ? (\n <DisclosureSection\n title={t(\"messaging.managed.title\")}\n summary={\n installations.length\n ? `${installations.length} connected`\n : \"No workspaces connected yet\"\n }\n >\n <div className=\"space-y-3\">\n <p className=\"text-xs text-muted-foreground\">\n {t(\"messaging.managed.description\")}{\" \"}\n {t(\"messaging.managed.agentManifestDescription\")}\n </p>\n <div className=\"flex flex-wrap items-center gap-2\">\n <Button asChild variant=\"outline\" size=\"sm\">\n <a href={managedSlackAgentManifestUrl()}>\n <IconFileDescription className=\"mr-2 h-4 w-4\" />\n {t(\"messaging.managed.agentManifest\")}\n </a>\n </Button>\n {missingRequiredCredentials ? (\n <Button size=\"sm\" disabled>\n <IconBrandSlack className=\"mr-2 h-4 w-4\" />\n {t(\"messaging.managed.addToSlack\")}\n </Button>\n ) : (\n <Button asChild size=\"sm\">\n <a href={managedIntegrationOAuthUrl(\"slack\")}>\n <IconBrandSlack className=\"mr-2 h-4 w-4\" />\n {t(\"messaging.managed.addToSlack\")}\n </a>\n </Button>\n )}\n </div>\n {missingRequiredCredentials ? (\n <p className=\"text-xs text-amber-700 dark:text-amber-300\">\n {t(\"messaging.managed.requiredCredentials\")}\n </p>\n ) : null}\n {installations.length ? (\n <div className=\"divide-y rounded-lg bg-muted/20 px-3\">\n {installations.map((installation) => (\n <div\n key={installation.id}\n className=\"flex flex-wrap items-center justify-between gap-3 py-3\"\n >\n <div>\n <div className=\"text-sm font-medium text-foreground\">\n {installation.teamName ||\n installation.enterpriseName ||\n installation.teamId ||\n t(\"messaging.managed.workspaceFallback\")}\n </div>\n <div className=\"mt-0.5 text-xs text-muted-foreground\">\n {t(\"messaging.managed.scopesUpdated\", {\n count: installation.scopes.length,\n date: formatDate(installation.updatedAt, {\n dateStyle: \"medium\",\n }),\n })}\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <StatusPill\n tone={\n installation.health === \"healthy\"\n ? \"success\"\n : installation.health === \"degraded\" ||\n installation.health === \"revoked\"\n ? \"warning\"\n : \"neutral\"\n }\n label={t(\n `messaging.managed.health.${installation.health}`,\n )}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() =>\n runInstallationAction(\n installation,\n \"test\",\n )\n }\n disabled={\n installationAction ===\n `test:${installation.id}`\n }\n >\n {t(\"messaging.managed.test\")}\n </Button>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() =>\n runInstallationAction(\n installation,\n \"disconnect\",\n )\n }\n disabled={\n installationAction ===\n `disconnect:${installation.id}`\n }\n >\n {t(\"messaging.managed.disconnect\")}\n </Button>\n </div>\n </div>\n ))}\n </div>\n ) : (\n <p className=\"text-xs text-muted-foreground\">\n {t(\"messaging.managed.empty\")}\n </p>\n )}\n </div>\n </DisclosureSection>\n ) : null}\n\n {platform.id === \"slack\" && scopes.length ? (\n <DisclosureSection\n title={t(\"messaging.managed.channelAccessTitle\")}\n summary={`${scopes.length} channel${scopes.length === 1 ? \"\" : \"s\"}`}\n >\n <div className=\"space-y-3\">\n <p className=\"text-xs text-muted-foreground\">\n {t(\"messaging.managed.channelAccessDescription\")}\n </p>\n {scopes.map((scope) => {\n const subjectId = JSON.stringify([\n scope.platform,\n scope.tenantId,\n scope.conversationId,\n ]);\n const budget = budgets.find(\n (item) =>\n item.subjectType === \"scope\" &&\n item.subjectId === subjectId &&\n item.period === \"month\",\n );\n return (\n <Collapsible\n key={scope.id}\n className=\"border-b last:border-b-0\"\n >\n <CollapsibleTrigger className=\"group flex w-full cursor-pointer items-center justify-between gap-3 py-3 text-left\">\n <span className=\"min-w-0\">\n <span className=\"block truncate font-mono text-xs text-foreground\">\n {scope.conversationId}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {t(\"messaging.managed.isolatedIdentity\", {\n trust: t(\n `messaging.managed.trust.${scope.trust}`,\n ),\n })}\n </span>\n </span>\n <span className=\"flex shrink-0 items-center gap-2\">\n <StatusPill\n tone={\n scope.trust === \"trusted\"\n ? \"success\"\n : \"warning\"\n }\n label={t(\n `messaging.managed.trust.${scope.trust}`,\n )}\n />\n <IconChevronRight className=\"h-4 w-4 text-muted-foreground transition-transform group-data-[state=open]:rotate-90\" />\n </span>\n </CollapsibleTrigger>\n <CollapsibleContent className=\"pb-3\">\n <div className=\"grid gap-2 sm:grid-cols-3\">\n {[\n [\n \"requireMention\",\n t(\"messaging.managed.requireMention\"),\n ],\n [\n \"allowGuests\",\n t(\"messaging.managed.allowGuests\"),\n ],\n [\n \"allowExternalShared\",\n t(\"messaging.managed.allowSlackConnect\"),\n ],\n ].map(([key, label]) => (\n <label\n key={key}\n className=\"flex items-center justify-between gap-2 rounded-md border px-2.5 py-2 text-xs\"\n >\n {label}\n <Switch\n checked={\n scope.policy[\n key as keyof ClientIntegrationScope[\"policy\"]\n ]\n }\n disabled={savingScope === scope.id}\n onCheckedChange={(checked) =>\n updateScopePolicy(scope, {\n [key]: checked,\n })\n }\n />\n </label>\n ))}\n </div>\n <div className=\"flex flex-wrap items-end gap-2\">\n <div className=\"min-w-40 flex-1 space-y-1\">\n <label className=\"text-xs font-medium text-foreground\">\n {t(\"messaging.managed.monthlyBudgetUsd\")}\n </label>\n <Input\n inputMode=\"decimal\"\n value={\n scopeBudget[scope.id] ??\n (budget\n ? String(\n budget.limitMicros / 1_000_000,\n )\n : \"\")\n }\n onChange={(event) =>\n setScopeBudget((current) => ({\n ...current,\n [scope.id]: event.target.value,\n }))\n }\n placeholder=\"25\"\n />\n </div>\n <Button\n variant=\"outline\"\n onClick={() => saveScopeBudget(scope)}\n disabled={\n savingScope === `budget:${scope.id}`\n }\n >\n {t(\"messaging.managed.saveBudget\")}\n </Button>\n </div>\n </CollapsibleContent>\n </Collapsible>\n );\n })}\n </div>\n </DisclosureSection>\n ) : null}\n\n <DisclosureSection\n title=\"Setup steps\"\n summary={`${platform.setup.steps.length} step${platform.setup.steps.length === 1 ? \"\" : \"s\"}`}\n >\n <ol className=\"space-y-2 rounded-lg bg-muted/20 px-3 py-3 text-sm text-muted-foreground\">\n {platform.setup.steps.map((step, index) => (\n <li key={step} className=\"flex gap-2\">\n <span className=\"text-muted-foreground/60\">\n {index + 1}.\n </span>\n <span>{step}</span>\n </li>\n ))}\n </ol>\n </DisclosureSection>\n\n <DisclosureSection\n title=\"Credentials\"\n summary={credentialSummary}\n >\n <div className=\"space-y-3\">\n {primaryEnvKeys.map((envKey) => {\n const envStatus = envStatusByKey.get(envKey.key);\n const isConfigured = !!envStatus?.configured;\n const helpText = envKey.helpText ?? envStatus?.helpText;\n const label =\n envKey.label || envStatus?.label || envKey.key;\n // Email agent address is not a secret — show it plainly\n // so users can copy and share it.\n const isPublicValue =\n envKey.key === \"EMAIL_AGENT_ADDRESS\";\n return (\n <div key={envKey.key} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-xs font-medium text-foreground\">\n {label}\n {!envKey.required ? (\n <span className=\"ml-1 text-muted-foreground\">\n (optional)\n </span>\n ) : null}\n </label>\n {helpText ? (\n <HelpTooltip content={helpText} />\n ) : null}\n </div>\n {isConfigured ? (\n <StatusPill tone=\"success\" label=\"Saved\" />\n ) : (\n <StatusPill\n tone=\"neutral\"\n label={\n envKey.required ? \"Missing\" : \"Not set\"\n }\n />\n )}\n </div>\n {isConfigured && isPublicValue ? (\n <PublicValueReveal envKey={envKey.key} />\n ) : !isConfigured ? (\n <Input\n type={isPublicValue ? \"text\" : \"password\"}\n value={envValues[envKey.key] || \"\"}\n onChange={(event) =>\n setEnvValues((current) => ({\n ...current,\n [envKey.key]: event.target.value,\n }))\n }\n placeholder={\n isPublicValue\n ? \"agent@yourcompany.com\"\n : `Enter ${label}`\n }\n autoComplete=\"off\"\n />\n ) : null}\n </div>\n );\n })}\n </div>\n {legacyEnvKeys.length ? (\n <Collapsible>\n <CollapsibleTrigger className=\"group flex w-full cursor-pointer items-center gap-1.5 text-xs font-medium text-muted-foreground hover:text-foreground\">\n <IconChevronRight className=\"h-3.5 w-3.5 transition-transform group-data-[state=open]:rotate-90\" />\n <span>{legacyEnvKeys[0]?.label}</span>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"mt-2 space-y-3 rounded-xl border border-amber-500/30 bg-amber-500/5 p-4\">\n <p className=\"text-xs text-muted-foreground\">\n {legacyEnvKeys[0]?.helpText}\n </p>\n {legacyEnvKeys.map((envKey) => {\n const envStatus = envStatusByKey.get(envKey.key);\n const isConfigured = !!envStatus?.configured;\n const helpText =\n envKey.helpText ?? envStatus?.helpText;\n const label =\n envKey.label || envStatus?.label || envKey.key;\n return (\n <div key={envKey.key} className=\"space-y-1.5\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-xs font-medium text-foreground\">\n {label}\n </label>\n {helpText ? (\n <HelpTooltip content={helpText} />\n ) : null}\n </div>\n <StatusPill\n tone={\n isConfigured ? \"success\" : \"neutral\"\n }\n label={isConfigured ? \"Saved\" : \"Not set\"}\n />\n </div>\n {!isConfigured ? (\n <Input\n type=\"password\"\n value={envValues[envKey.key] || \"\"}\n onChange={(event) =>\n setEnvValues((current) => ({\n ...current,\n [envKey.key]: event.target.value,\n }))\n }\n placeholder={`Enter ${label}`}\n autoComplete=\"off\"\n />\n ) : null}\n </div>\n );\n })}\n {legacyEnvKeys.some(\n (envKey) =>\n !envStatusByKey.get(envKey.key)?.configured,\n ) ? (\n <Button\n variant=\"outline\"\n onClick={() =>\n saveEnvKeys(\n platform,\n legacyEnvKeys.map((envKey) => envKey.key),\n )\n }\n disabled={savingKeysFor === platform.id}\n >\n {savingKeysFor === platform.id\n ? \"Saving...\"\n : \"Save credentials\"}\n </Button>\n ) : null}\n </div>\n </CollapsibleContent>\n </Collapsible>\n ) : null}\n {missingRequiredCredentials ? (\n <Button\n variant=\"outline\"\n onClick={() =>\n saveEnvKeys(\n platform,\n envKeys.map((k) => k.key),\n )\n }\n disabled={savingKeysFor === platform.id}\n >\n {savingKeysFor === platform.id ? (\n <>\n <IconLoader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Saving...\n </>\n ) : (\n \"Save credentials\"\n )}\n </Button>\n ) : null}\n </DisclosureSection>\n\n {status?.webhookUrl ? (\n <DisclosureSection\n title=\"Webhook URL\"\n summary=\"Copy the endpoint for this channel\"\n >\n <div className=\"flex items-center gap-2\">\n <code className=\"flex-1 truncate rounded-md bg-muted/30 px-3 py-2 text-xs text-foreground\">\n {status.webhookUrl}\n </code>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => copyWebhook(status.webhookUrl!)}\n aria-label={`Copy ${platform.name} webhook URL`}\n >\n {copiedWebhook === status.webhookUrl ? (\n <IconCheck className=\"h-4 w-4\" />\n ) : (\n <IconCopy className=\"h-4 w-4\" />\n )}\n </Button>\n </div>\n </DisclosureSection>\n ) : null}\n\n <DisclosureSection\n title=\"Resources\"\n summary=\"Documentation and external links\"\n >\n <div className=\"flex flex-wrap gap-2\">\n <Button\n asChild\n variant=\"ghost\"\n size=\"sm\"\n className=\"px-0 text-xs text-muted-foreground hover:bg-transparent hover:text-foreground\"\n >\n <a\n href={platform.documentation.href}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n Docs\n <IconExternalLink className=\"ml-1 h-3 w-3\" />\n </a>\n </Button>\n {platform.documentation.externalHref ? (\n <Button\n asChild\n variant=\"ghost\"\n size=\"sm\"\n className=\"px-0 text-xs text-muted-foreground hover:bg-transparent hover:text-foreground\"\n >\n <a\n href={platform.documentation.externalHref}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {platform.documentation.externalLabel ?? \"Open\"}\n <IconExternalLink className=\"ml-1 h-3 w-3\" />\n </a>\n </Button>\n ) : null}\n </div>\n </DisclosureSection>\n </div>\n </AccordionContent>\n </AccordionItem>\n );\n })}\n </Accordion>\n\n {loading ? (\n <div className=\"space-y-3 rounded-2xl border border-dashed px-4 py-6\">\n <Skeleton className=\"h-4 w-40\" />\n <Skeleton className=\"h-3 w-2/3 max-w-md\" />\n <Skeleton className=\"h-9 w-full max-w-sm\" />\n </div>\n ) : null}\n </div>\n );\n}\n"]}
@@ -0,0 +1,11 @@
1
+ export interface UsageAlertAppOption {
2
+ id: string;
3
+ label: string;
4
+ }
5
+ interface UsageAlertsPanelProps {
6
+ scope: "user" | "workspace";
7
+ appOptions?: UsageAlertAppOption[];
8
+ }
9
+ export declare function UsageAlertsPanel({ scope, appOptions, }: UsageAlertsPanelProps): import("node_modules/@types/react").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=usage-alerts-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-alerts-panel.d.ts","sourceRoot":"","sources":["../../src/components/usage-alerts-panel.tsx"],"names":[],"mappings":"AAuBA,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,qBAAqB;IAC7B,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC;IAC5B,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACpC;AA2LD,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,UAAe,GAChB,EAAE,qBAAqB,mDA+NvB"}
@@ -0,0 +1,125 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useActionMutation, useActionQuery, } from "@agent-native/core/client/hooks";
3
+ import { IconBell, IconMail, IconPencil, IconX } from "@tabler/icons-react";
4
+ import { useMemo, useState } from "react";
5
+ import { toast } from "sonner";
6
+ import { Badge } from "./ui/badge.js";
7
+ import { Button } from "./ui/button.js";
8
+ import { Checkbox } from "./ui/checkbox.js";
9
+ import { Input } from "./ui/input.js";
10
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "./ui/select.js";
11
+ import { Skeleton } from "./ui/skeleton.js";
12
+ import { Switch } from "./ui/switch.js";
13
+ function asRules(value) {
14
+ if (Array.isArray(value))
15
+ return value;
16
+ if (value && typeof value === "object") {
17
+ const rules = value.rules;
18
+ if (Array.isArray(rules))
19
+ return rules;
20
+ }
21
+ return [];
22
+ }
23
+ function formatAlertValue(rule, value) {
24
+ if (rule.unit === "usd") {
25
+ return value.toLocaleString(undefined, {
26
+ style: "currency",
27
+ currency: "USD",
28
+ maximumFractionDigits: 2,
29
+ });
30
+ }
31
+ return (value.toLocaleString(undefined, {
32
+ maximumFractionDigits: rule.unit === "builder-credits" ? 2 : 0,
33
+ }) +
34
+ " " +
35
+ (rule.unit === "builder-credits" ? "credits" : "tokens"));
36
+ }
37
+ function draftFromRule(rule) {
38
+ return {
39
+ ruleId: rule.id,
40
+ appId: rule.appId ?? "",
41
+ unit: rule.unit,
42
+ period: rule.period,
43
+ limit: String(rule.limit),
44
+ inApp: rule.channels.includes("in-app"),
45
+ email: rule.channels.includes("email"),
46
+ };
47
+ }
48
+ function defaultDraft() {
49
+ return {
50
+ appId: "",
51
+ unit: "usd",
52
+ period: "day",
53
+ limit: "100",
54
+ inApp: true,
55
+ email: true,
56
+ };
57
+ }
58
+ function AlertEditor({ draft, appOptions, isExisting, onChange, onSave, onCancel, isPending, }) {
59
+ return (_jsxs("div", { className: "grid gap-3 rounded-md border bg-background/60 p-3 sm:grid-cols-2 lg:grid-cols-5", children: [_jsxs("label", { className: "space-y-1.5 text-xs text-muted-foreground", children: [_jsx("span", { children: "App" }), _jsxs(Select, { value: draft.appId || "all", onValueChange: (value) => onChange({ appId: value === "all" ? "" : value }), disabled: isExisting, children: [_jsx(SelectTrigger, { className: "h-9 text-sm", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "all", children: "All apps" }), appOptions.map((app) => (_jsx(SelectItem, { value: app.id, children: app.label }, app.id)))] })] })] }), _jsxs("label", { className: "space-y-1.5 text-xs text-muted-foreground", children: [_jsx("span", { children: "Unit" }), _jsxs(Select, { value: draft.unit, onValueChange: (value) => onChange({ unit: value }), children: [_jsx(SelectTrigger, { className: "h-9 text-sm", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "usd", children: "Dollars" }), _jsx(SelectItem, { value: "builder-credits", children: "Credits" }), _jsx(SelectItem, { value: "tokens", children: "Tokens" })] })] })] }), _jsxs("label", { className: "space-y-1.5 text-xs text-muted-foreground", children: [_jsx("span", { children: "Limit" }), _jsx(Input, { type: "number", min: "0.01", step: draft.unit === "tokens" ? "1" : "0.01", value: draft.limit, onChange: (event) => onChange({ limit: event.target.value }), className: "h-9 text-sm" })] }), _jsxs("label", { className: "space-y-1.5 text-xs text-muted-foreground", children: [_jsx("span", { children: "Period" }), _jsxs(Select, { value: draft.period, onValueChange: (value) => onChange({ period: value }), children: [_jsx(SelectTrigger, { className: "h-9 text-sm", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "day", children: "Per day" }), _jsx(SelectItem, { value: "month", children: "Per month" })] })] })] }), _jsxs("div", { className: "flex flex-wrap items-end gap-3 pb-1 text-xs text-muted-foreground", children: [_jsxs("label", { className: "inline-flex items-center gap-2", children: [_jsx(Checkbox, { checked: draft.inApp, onCheckedChange: (checked) => onChange({ inApp: checked === true }) }), "In app"] }), _jsxs("label", { className: "inline-flex items-center gap-2", children: [_jsx(Checkbox, { checked: draft.email, onCheckedChange: (checked) => onChange({ email: checked === true }) }), "Email"] }), _jsx(Button, { type: "button", size: "sm", className: "ms-auto h-8", onClick: onSave, disabled: isPending, children: "Save" }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", className: "h-8", onClick: onCancel, children: "Cancel" })] })] }));
60
+ }
61
+ export function UsageAlertsPanel({ scope, appOptions = [], }) {
62
+ const query = useActionQuery("get-usage-alerts", { scope });
63
+ const mutation = useActionMutation("manage-usage-alert", {
64
+ onSuccess: () => {
65
+ setEditing(null);
66
+ toast.success("Usage alert updated");
67
+ },
68
+ onError: (error) => toast.error(String(error)),
69
+ });
70
+ const [editing, setEditing] = useState(null);
71
+ const rules = asRules(query.data);
72
+ const appLabels = useMemo(() => new Map(appOptions.map((app) => [app.id, app.label])), [appOptions]);
73
+ function saveDraft() {
74
+ if (!editing)
75
+ return;
76
+ const limit = Number(editing.limit);
77
+ const channels = [];
78
+ if (editing.inApp)
79
+ channels.push("in-app");
80
+ if (editing.email)
81
+ channels.push("email");
82
+ if (!Number.isFinite(limit) || limit <= 0) {
83
+ toast.error("Enter a positive threshold.");
84
+ return;
85
+ }
86
+ if (channels.length === 0) {
87
+ toast.error("Choose at least one delivery channel.");
88
+ return;
89
+ }
90
+ mutation.mutate({
91
+ operation: "save",
92
+ scope,
93
+ ruleId: editing.ruleId,
94
+ appId: editing.appId || null,
95
+ unit: editing.unit,
96
+ period: editing.period,
97
+ limit,
98
+ channels,
99
+ enabled: true,
100
+ });
101
+ }
102
+ return (_jsxs("section", { className: "rounded-lg bg-card", children: [_jsxs("div", { className: "flex items-start justify-between gap-3 border-b px-4 py-3", children: [_jsxs("div", { children: [_jsx("h2", { className: "text-sm font-semibold text-foreground", children: "Usage alerts" }), _jsx("p", { className: "mt-1 max-w-2xl text-xs leading-5 text-muted-foreground", children: "Get a quiet in-app and email notice when usage crosses a daily or monthly limit." })] }), _jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: () => setEditing(defaultDraft()), disabled: mutation.isPending, children: "Add alert" })] }), _jsxs("div", { className: "divide-y", children: [query.isLoading && rules.length === 0 ? (_jsx("div", { className: "space-y-3 px-4 py-5", children: Array.from({ length: 3 }).map((_, index) => (_jsxs("div", { className: "space-y-2", children: [_jsx(Skeleton, { className: "h-4 w-2/3 max-w-sm" }), _jsx(Skeleton, { className: "h-3 w-1/2 max-w-xs" })] }, index))) })) : null, query.isError ? (_jsxs("div", { className: "px-4 py-6 text-sm text-destructive", children: ["Usage alerts are unavailable for this scope.", " ", query.error instanceof Error ? query.error.message : "Try again."] })) : null, !query.isLoading && !query.isError && rules.length === 0 ? (_jsx("div", { className: "px-4 py-6 text-sm text-muted-foreground", children: "No alerts yet. The recommended default is $100 per day across all apps." })) : null, rules.map((rule) => {
103
+ const isEditing = editing?.ruleId === rule.id;
104
+ const target = rule.appId
105
+ ? appLabels.get(rule.appId) || rule.appId
106
+ : "All apps";
107
+ return (_jsxs("div", { className: "px-4 py-4", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "text-sm font-medium text-foreground", children: target }), rule.isDefault ? (_jsx(Badge, { variant: "secondary", children: "Default" })) : null, _jsx(Badge, { variant: rule.status === "triggered" ? "destructive" : "outline", children: rule.status === "triggered"
108
+ ? "Over limit"
109
+ : rule.status === "dismissed"
110
+ ? "Dismissed"
111
+ : "On track" })] }), _jsxs("div", { className: "mt-1 text-xs text-muted-foreground", children: [formatAlertValue(rule, rule.current), " of", " ", formatAlertValue(rule, rule.limit), " \u00B7 per ", rule.period, rule.percent > 0 ? " · " + rule.percent + "%" : ""] })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Switch, { checked: rule.enabled, onCheckedChange: (checked) => mutation.mutate({
112
+ operation: "set-enabled",
113
+ scope,
114
+ ruleId: rule.id,
115
+ enabled: checked,
116
+ }), "aria-label": (rule.enabled ? "Disable " : "Enable ") +
117
+ target +
118
+ " usage alert", disabled: mutation.isPending }), _jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => setEditing(draftFromRule(rule)), "aria-label": "Edit " + target + " usage alert", disabled: mutation.isPending, children: _jsx(IconPencil, { className: "size-4" }) }), rule.status === "triggered" ? (_jsx(Button, { type: "button", variant: "ghost", size: "icon", onClick: () => mutation.mutate({
119
+ operation: "dismiss",
120
+ scope,
121
+ ruleId: rule.id,
122
+ }), "aria-label": "Dismiss " + target + " usage alert", disabled: mutation.isPending, children: _jsx(IconX, { className: "size-4" }) })) : null] })] }), _jsxs("div", { className: "mt-2 flex flex-wrap items-center gap-3 text-xs text-muted-foreground", children: [rule.channels.includes("in-app") ? (_jsxs("span", { className: "inline-flex items-center gap-1", children: [_jsx(IconBell, { className: "size-3.5" }), " In app"] })) : null, rule.channels.includes("email") ? (_jsxs("span", { className: "inline-flex items-center gap-1", children: [_jsx(IconMail, { className: "size-3.5" }), " Email"] })) : null] }), isEditing && editing ? (_jsx("div", { className: "mt-4", children: _jsx(AlertEditor, { draft: editing, appOptions: appOptions, isExisting: true, onChange: (patch) => setEditing((current) => current ? { ...current, ...patch } : current), onSave: saveDraft, onCancel: () => setEditing(null), isPending: mutation.isPending }) })) : null] }, rule.id));
123
+ }), editing && !editing.ruleId ? (_jsx("div", { className: "px-4 py-4", children: _jsx(AlertEditor, { draft: editing, appOptions: appOptions, isExisting: false, onChange: (patch) => setEditing((current) => current ? { ...current, ...patch } : current), onSave: saveDraft, onCancel: () => setEditing(null), isPending: mutation.isPending }) })) : null] })] }));
124
+ }
125
+ //# sourceMappingURL=usage-alerts-panel.js.map