@tleblancureta/proto 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/core-web/src/ProtoApp.tsx +163 -0
  2. package/core-web/src/components/Shell.tsx +276 -0
  3. package/core-web/src/components/shell/EmptyState.tsx +33 -0
  4. package/core-web/src/components/shell/FocusView.tsx +55 -0
  5. package/core-web/src/components/shell/Toolbar.tsx +233 -0
  6. package/core-web/src/components/shell/persistence.ts +20 -0
  7. package/core-web/src/components/shell/types.ts +14 -0
  8. package/core-web/src/components/ui/avatar.tsx +18 -0
  9. package/core-web/src/components/ui/badge.tsx +28 -0
  10. package/core-web/src/components/ui/button.tsx +40 -0
  11. package/core-web/src/components/ui/card.tsx +32 -0
  12. package/core-web/src/components/ui/inline-edit.tsx +120 -0
  13. package/core-web/src/components/ui/input.tsx +18 -0
  14. package/core-web/src/components/ui/scroll-area.tsx +12 -0
  15. package/core-web/src/components/ui/separator.tsx +23 -0
  16. package/core-web/src/components/ui/shell-dialog.tsx +79 -0
  17. package/core-web/src/components/ui/skeleton.tsx +9 -0
  18. package/core-web/src/components/ui/textarea.tsx +17 -0
  19. package/core-web/src/components/widgets/agent/Generative.tsx +74 -0
  20. package/core-web/src/components/widgets/agent/Primitives.tsx +225 -0
  21. package/core-web/src/components/widgets/agent/actions.ts +52 -0
  22. package/core-web/src/hooks/useAuth.ts +80 -0
  23. package/core-web/src/hooks/useData.ts +44 -0
  24. package/core-web/src/hooks/useMountEffect.ts +10 -0
  25. package/core-web/src/hooks/useTheme.ts +37 -0
  26. package/core-web/src/index.ts +52 -0
  27. package/core-web/src/lib/api.ts +231 -0
  28. package/core-web/src/lib/config.ts +14 -0
  29. package/core-web/src/lib/define-widget.ts +71 -0
  30. package/core-web/src/lib/drag.ts +45 -0
  31. package/core-web/src/lib/supabase.ts +6 -0
  32. package/core-web/src/lib/utils.ts +6 -0
  33. package/core-web/src/lib/widgetCache.ts +29 -0
  34. package/core-web/src/vite-env.d.ts +1 -0
  35. package/dist/core-mcp/src/app.d.ts +40 -0
  36. package/dist/core-mcp/src/app.d.ts.map +1 -0
  37. package/dist/core-mcp/src/app.js +141 -0
  38. package/dist/core-mcp/src/app.js.map +1 -0
  39. package/dist/core-mcp/src/define-tool.d.ts +70 -0
  40. package/dist/core-mcp/src/define-tool.d.ts.map +1 -0
  41. package/dist/core-mcp/src/define-tool.js +38 -0
  42. package/dist/core-mcp/src/define-tool.js.map +1 -0
  43. package/dist/core-mcp/src/entity-tools.d.ts +27 -0
  44. package/dist/core-mcp/src/entity-tools.d.ts.map +1 -0
  45. package/dist/core-mcp/src/entity-tools.js +99 -0
  46. package/dist/core-mcp/src/entity-tools.js.map +1 -0
  47. package/dist/core-mcp/src/index.d.ts +36 -0
  48. package/dist/core-mcp/src/index.d.ts.map +1 -0
  49. package/dist/core-mcp/src/index.js +116 -0
  50. package/dist/core-mcp/src/index.js.map +1 -0
  51. package/dist/core-mcp/src/supabase.d.ts +7 -0
  52. package/dist/core-mcp/src/supabase.d.ts.map +1 -0
  53. package/dist/core-mcp/src/supabase.js +18 -0
  54. package/dist/core-mcp/src/supabase.js.map +1 -0
  55. package/dist/core-mcp/src/tools/_helpers.d.ts +44 -0
  56. package/dist/core-mcp/src/tools/_helpers.d.ts.map +1 -0
  57. package/dist/core-mcp/src/tools/_helpers.js +23 -0
  58. package/dist/core-mcp/src/tools/_helpers.js.map +1 -0
  59. package/dist/core-mcp/src/tools/ui.d.ts +9 -0
  60. package/dist/core-mcp/src/tools/ui.d.ts.map +1 -0
  61. package/dist/core-mcp/src/tools/ui.js +100 -0
  62. package/dist/core-mcp/src/tools/ui.js.map +1 -0
  63. package/dist/core-mcp/src/workflow-tools.d.ts +41 -0
  64. package/dist/core-mcp/src/workflow-tools.d.ts.map +1 -0
  65. package/dist/core-mcp/src/workflow-tools.js +382 -0
  66. package/dist/core-mcp/src/workflow-tools.js.map +1 -0
  67. package/dist/core-shared/src/define-entity.d.ts +73 -0
  68. package/dist/core-shared/src/define-entity.d.ts.map +1 -0
  69. package/dist/core-shared/src/define-entity.js +47 -0
  70. package/dist/core-shared/src/define-entity.js.map +1 -0
  71. package/dist/core-shared/src/define-workflow.d.ts +111 -0
  72. package/dist/core-shared/src/define-workflow.d.ts.map +1 -0
  73. package/dist/core-shared/src/define-workflow.js +92 -0
  74. package/dist/core-shared/src/define-workflow.js.map +1 -0
  75. package/dist/core-shared/src/index.d.ts +5 -0
  76. package/dist/core-shared/src/index.d.ts.map +1 -0
  77. package/dist/core-shared/src/index.js +7 -0
  78. package/dist/core-shared/src/index.js.map +1 -0
  79. package/dist/core-shared/src/scheduling.d.ts +69 -0
  80. package/dist/core-shared/src/scheduling.d.ts.map +1 -0
  81. package/dist/core-shared/src/scheduling.js +39 -0
  82. package/dist/core-shared/src/scheduling.js.map +1 -0
  83. package/dist/core-shared/src/schemas.d.ts +51 -0
  84. package/dist/core-shared/src/schemas.d.ts.map +1 -0
  85. package/dist/core-shared/src/schemas.js +18 -0
  86. package/dist/core-shared/src/schemas.js.map +1 -0
  87. package/dist/core-web/src/ProtoApp.d.ts +19 -0
  88. package/dist/core-web/src/ProtoApp.d.ts.map +1 -0
  89. package/dist/core-web/src/ProtoApp.js +92 -0
  90. package/dist/core-web/src/ProtoApp.js.map +1 -0
  91. package/dist/core-web/src/components/Shell.d.ts +46 -0
  92. package/dist/core-web/src/components/Shell.d.ts.map +1 -0
  93. package/dist/core-web/src/components/Shell.js +104 -0
  94. package/dist/core-web/src/components/Shell.js.map +1 -0
  95. package/dist/core-web/src/components/shell/EmptyState.d.ts +13 -0
  96. package/dist/core-web/src/components/shell/EmptyState.d.ts.map +1 -0
  97. package/dist/core-web/src/components/shell/EmptyState.js +7 -0
  98. package/dist/core-web/src/components/shell/EmptyState.js.map +1 -0
  99. package/dist/core-web/src/components/shell/FocusView.d.ts +16 -0
  100. package/dist/core-web/src/components/shell/FocusView.d.ts.map +1 -0
  101. package/dist/core-web/src/components/shell/FocusView.js +12 -0
  102. package/dist/core-web/src/components/shell/FocusView.js.map +1 -0
  103. package/dist/core-web/src/components/shell/Toolbar.d.ts +35 -0
  104. package/dist/core-web/src/components/shell/Toolbar.d.ts.map +1 -0
  105. package/dist/core-web/src/components/shell/Toolbar.js +42 -0
  106. package/dist/core-web/src/components/shell/Toolbar.js.map +1 -0
  107. package/dist/core-web/src/components/shell/persistence.d.ts +8 -0
  108. package/dist/core-web/src/components/shell/persistence.d.ts.map +1 -0
  109. package/dist/core-web/src/components/shell/persistence.js +20 -0
  110. package/dist/core-web/src/components/shell/persistence.js.map +1 -0
  111. package/dist/core-web/src/components/shell/types.d.ts +13 -0
  112. package/dist/core-web/src/components/shell/types.d.ts.map +1 -0
  113. package/dist/core-web/src/components/shell/types.js +2 -0
  114. package/dist/core-web/src/components/shell/types.js.map +1 -0
  115. package/dist/core-web/src/components/ui/avatar.d.ts +5 -0
  116. package/dist/core-web/src/components/ui/avatar.d.ts.map +1 -0
  117. package/dist/core-web/src/components/ui/avatar.js +9 -0
  118. package/dist/core-web/src/components/ui/avatar.js.map +1 -0
  119. package/dist/core-web/src/components/ui/badge.d.ts +13 -0
  120. package/dist/core-web/src/components/ui/badge.d.ts.map +1 -0
  121. package/dist/core-web/src/components/ui/badge.js +13 -0
  122. package/dist/core-web/src/components/ui/badge.js.map +1 -0
  123. package/dist/core-web/src/components/ui/button.d.ts +22 -0
  124. package/dist/core-web/src/components/ui/button.d.ts.map +1 -0
  125. package/dist/core-web/src/components/ui/button.js +21 -0
  126. package/dist/core-web/src/components/ui/button.js.map +1 -0
  127. package/dist/core-web/src/components/ui/card.d.ts +7 -0
  128. package/dist/core-web/src/components/ui/card.d.ts.map +1 -0
  129. package/dist/core-web/src/components/ui/card.js +13 -0
  130. package/dist/core-web/src/components/ui/card.js.map +1 -0
  131. package/dist/core-web/src/components/ui/inline-edit.d.ts +20 -0
  132. package/dist/core-web/src/components/ui/inline-edit.d.ts.map +1 -0
  133. package/dist/core-web/src/components/ui/inline-edit.js +63 -0
  134. package/dist/core-web/src/components/ui/inline-edit.js.map +1 -0
  135. package/dist/core-web/src/components/ui/input.d.ts +4 -0
  136. package/dist/core-web/src/components/ui/input.d.ts.map +1 -0
  137. package/dist/core-web/src/components/ui/input.js +7 -0
  138. package/dist/core-web/src/components/ui/input.js.map +1 -0
  139. package/dist/core-web/src/components/ui/scroll-area.d.ts +4 -0
  140. package/dist/core-web/src/components/ui/scroll-area.d.ts.map +1 -0
  141. package/dist/core-web/src/components/ui/scroll-area.js +7 -0
  142. package/dist/core-web/src/components/ui/scroll-area.js.map +1 -0
  143. package/dist/core-web/src/components/ui/separator.d.ts +7 -0
  144. package/dist/core-web/src/components/ui/separator.d.ts.map +1 -0
  145. package/dist/core-web/src/components/ui/separator.js +7 -0
  146. package/dist/core-web/src/components/ui/separator.js.map +1 -0
  147. package/dist/core-web/src/components/ui/shell-dialog.d.ts +16 -0
  148. package/dist/core-web/src/components/ui/shell-dialog.d.ts.map +1 -0
  149. package/dist/core-web/src/components/ui/shell-dialog.js +36 -0
  150. package/dist/core-web/src/components/ui/shell-dialog.js.map +1 -0
  151. package/dist/core-web/src/components/ui/skeleton.d.ts +3 -0
  152. package/dist/core-web/src/components/ui/skeleton.d.ts.map +1 -0
  153. package/dist/core-web/src/components/ui/skeleton.js +7 -0
  154. package/dist/core-web/src/components/ui/skeleton.js.map +1 -0
  155. package/dist/core-web/src/components/ui/textarea.d.ts +4 -0
  156. package/dist/core-web/src/components/ui/textarea.d.ts.map +1 -0
  157. package/dist/core-web/src/components/ui/textarea.js +7 -0
  158. package/dist/core-web/src/components/ui/textarea.js.map +1 -0
  159. package/dist/core-web/src/components/widgets/agent/Generative.d.ts +13 -0
  160. package/dist/core-web/src/components/widgets/agent/Generative.d.ts.map +1 -0
  161. package/dist/core-web/src/components/widgets/agent/Generative.js +42 -0
  162. package/dist/core-web/src/components/widgets/agent/Generative.js.map +1 -0
  163. package/dist/core-web/src/components/widgets/agent/Primitives.d.ts +79 -0
  164. package/dist/core-web/src/components/widgets/agent/Primitives.d.ts.map +1 -0
  165. package/dist/core-web/src/components/widgets/agent/Primitives.js +116 -0
  166. package/dist/core-web/src/components/widgets/agent/Primitives.js.map +1 -0
  167. package/dist/core-web/src/components/widgets/agent/actions.d.ts +3 -0
  168. package/dist/core-web/src/components/widgets/agent/actions.d.ts.map +1 -0
  169. package/dist/core-web/src/components/widgets/agent/actions.js +33 -0
  170. package/dist/core-web/src/components/widgets/agent/actions.js.map +1 -0
  171. package/dist/core-web/src/hooks/useAuth.d.ts +25 -0
  172. package/dist/core-web/src/hooks/useAuth.d.ts.map +1 -0
  173. package/dist/core-web/src/hooks/useAuth.js +53 -0
  174. package/dist/core-web/src/hooks/useAuth.js.map +1 -0
  175. package/dist/core-web/src/hooks/useData.d.ts +10 -0
  176. package/dist/core-web/src/hooks/useData.d.ts.map +1 -0
  177. package/dist/core-web/src/hooks/useData.js +37 -0
  178. package/dist/core-web/src/hooks/useData.js.map +1 -0
  179. package/dist/core-web/src/hooks/useMountEffect.d.ts +6 -0
  180. package/dist/core-web/src/hooks/useMountEffect.d.ts.map +1 -0
  181. package/dist/core-web/src/hooks/useMountEffect.js +10 -0
  182. package/dist/core-web/src/hooks/useMountEffect.js.map +1 -0
  183. package/dist/core-web/src/hooks/useTheme.d.ts +6 -0
  184. package/dist/core-web/src/hooks/useTheme.d.ts.map +1 -0
  185. package/dist/core-web/src/hooks/useTheme.js +31 -0
  186. package/dist/core-web/src/hooks/useTheme.js.map +1 -0
  187. package/dist/core-web/src/index.d.ts +33 -0
  188. package/dist/core-web/src/index.d.ts.map +1 -0
  189. package/dist/core-web/src/index.js +38 -0
  190. package/dist/core-web/src/index.js.map +1 -0
  191. package/dist/core-web/src/lib/api.d.ts +60 -0
  192. package/dist/core-web/src/lib/api.d.ts.map +1 -0
  193. package/dist/core-web/src/lib/api.js +204 -0
  194. package/dist/core-web/src/lib/api.js.map +1 -0
  195. package/dist/core-web/src/lib/config.d.ts +10 -0
  196. package/dist/core-web/src/lib/config.d.ts.map +1 -0
  197. package/dist/core-web/src/lib/config.js +10 -0
  198. package/dist/core-web/src/lib/config.js.map +1 -0
  199. package/dist/core-web/src/lib/define-widget.d.ts +52 -0
  200. package/dist/core-web/src/lib/define-widget.d.ts.map +1 -0
  201. package/dist/core-web/src/lib/define-widget.js +14 -0
  202. package/dist/core-web/src/lib/define-widget.js.map +1 -0
  203. package/dist/core-web/src/lib/drag.d.ts +20 -0
  204. package/dist/core-web/src/lib/drag.d.ts.map +1 -0
  205. package/dist/core-web/src/lib/drag.js +33 -0
  206. package/dist/core-web/src/lib/drag.js.map +1 -0
  207. package/dist/core-web/src/lib/supabase.d.ts +2 -0
  208. package/dist/core-web/src/lib/supabase.d.ts.map +1 -0
  209. package/dist/core-web/src/lib/supabase.js +5 -0
  210. package/dist/core-web/src/lib/supabase.js.map +1 -0
  211. package/dist/core-web/src/lib/utils.d.ts +3 -0
  212. package/dist/core-web/src/lib/utils.d.ts.map +1 -0
  213. package/dist/core-web/src/lib/utils.js +6 -0
  214. package/dist/core-web/src/lib/utils.js.map +1 -0
  215. package/dist/core-web/src/lib/widgetCache.d.ts +18 -0
  216. package/dist/core-web/src/lib/widgetCache.d.ts.map +1 -0
  217. package/dist/core-web/src/lib/widgetCache.js +28 -0
  218. package/dist/core-web/src/lib/widgetCache.js.map +1 -0
  219. package/dist/mcp.d.ts +2 -0
  220. package/dist/mcp.d.ts.map +1 -0
  221. package/dist/mcp.js +2 -0
  222. package/dist/mcp.js.map +1 -0
  223. package/dist/shared.d.ts +2 -0
  224. package/dist/shared.d.ts.map +1 -0
  225. package/dist/shared.js +2 -0
  226. package/dist/shared.js.map +1 -0
  227. package/dist/web.d.ts +2 -0
  228. package/dist/web.d.ts.map +1 -0
  229. package/dist/web.js +2 -0
  230. package/dist/web.js.map +1 -0
  231. package/package.json +62 -0
@@ -0,0 +1,16 @@
1
+ import { type ReactNode } from 'react';
2
+ interface ShellDialogProps {
3
+ open: boolean;
4
+ onClose: () => void;
5
+ title?: ReactNode;
6
+ description?: ReactNode;
7
+ children: ReactNode;
8
+ className?: string;
9
+ }
10
+ /**
11
+ * Dialog scoped to the shell (#shell-root) instead of the full viewport,
12
+ * so the chat panel stays visible. Backdrop-blur + fade-in, shadcn vibes.
13
+ */
14
+ export declare function ShellDialog({ open, onClose, title, description, children, className }: ShellDialogProps): import("react").ReactPortal | null;
15
+ export {};
16
+ //# sourceMappingURL=shell-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-dialog.d.ts","sourceRoot":"","sources":["../../../../../core-web/src/components/ui/shell-dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAK3D,UAAU,gBAAgB;IACxB,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,gBAAgB,sCA4DvG"}
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { createPortal } from 'react-dom';
4
+ import { XIcon } from 'lucide-react';
5
+ import { cn } from '../../lib/utils';
6
+ /**
7
+ * Dialog scoped to the shell (#shell-root) instead of the full viewport,
8
+ * so the chat panel stays visible. Backdrop-blur + fade-in, shadcn vibes.
9
+ */
10
+ export function ShellDialog({ open, onClose, title, description, children, className }) {
11
+ const [mounted, setMounted] = useState(false);
12
+ const [target, setTarget] = useState(null);
13
+ useEffect(() => {
14
+ setTarget(document.getElementById('shell-root'));
15
+ }, [open]);
16
+ useEffect(() => {
17
+ if (!open) {
18
+ setMounted(false);
19
+ return;
20
+ }
21
+ const id = requestAnimationFrame(() => setMounted(true));
22
+ return () => cancelAnimationFrame(id);
23
+ }, [open]);
24
+ useEffect(() => {
25
+ if (!open)
26
+ return;
27
+ const onKey = (e) => { if (e.key === 'Escape')
28
+ onClose(); };
29
+ window.addEventListener('keydown', onKey);
30
+ return () => window.removeEventListener('keydown', onKey);
31
+ }, [open, onClose]);
32
+ if (!open || !target)
33
+ return null;
34
+ return createPortal(_jsx("div", { className: cn('absolute inset-0 z-50 flex items-center justify-center p-6', 'bg-background/60 backdrop-blur-sm transition-opacity duration-150', mounted ? 'opacity-100' : 'opacity-0'), onClick: onClose, children: _jsxs("div", { onClick: (e) => e.stopPropagation(), className: cn('relative bg-card border border-border rounded-lg shadow-lg', 'w-full max-w-lg max-h-[90%] flex flex-col', 'transition-all duration-150', mounted ? 'translate-y-0 opacity-100' : 'translate-y-2 opacity-0', className), children: [_jsx("button", { onClick: onClose, className: "absolute right-3 top-3 text-muted-foreground/60 hover:text-foreground", "aria-label": "Cerrar", children: _jsx(XIcon, { className: "w-4 h-4" }) }), (title || description) && (_jsxs("div", { className: "px-5 pt-5 pb-3 border-b border-border/50 shrink-0", children: [title && _jsx("h2", { className: "text-base font-semibold", children: title }), description && _jsx("p", { className: "text-xs text-muted-foreground mt-1", children: description })] })), _jsx("div", { className: "p-5 flex-1 min-h-0 overflow-y-auto scrollbar-thin", children: children })] }) }), target);
35
+ }
36
+ //# sourceMappingURL=shell-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-dialog.js","sourceRoot":"","sources":["../../../../../core-web/src/components/ui/shell-dialog.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAWpC;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAoB;IACtG,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAqB,IAAI,CAAC,CAAA;IAE9D,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAA;IAClD,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEV,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QACxC,MAAM,EAAE,GAAG,qBAAqB,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;QACxD,OAAO,GAAG,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAA;IACvC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAA;IAEV,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAM;QACjB,MAAM,KAAK,GAAG,CAAC,CAAgB,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAA,CAAC,CAAC,CAAA;QACzE,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QACzC,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC3D,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;IAEnB,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IAEjC,OAAO,YAAY,CACjB,cACE,SAAS,EAAE,EAAE,CACX,4DAA4D,EAC5D,mEAAmE,EACnE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CACtC,EACD,OAAO,EAAE,OAAO,YAEhB,eACE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE,EACnC,SAAS,EAAE,EAAE,CACX,4DAA4D,EAC5D,2CAA2C,EAC3C,6BAA6B,EAC7B,OAAO,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,yBAAyB,EACjE,SAAS,CACV,aAED,iBACE,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,uEAAuE,gBACtE,QAAQ,YAEnB,KAAC,KAAK,IAAC,SAAS,EAAC,SAAS,GAAG,GACtB,EACR,CAAC,KAAK,IAAI,WAAW,CAAC,IAAI,CACzB,eAAK,SAAS,EAAC,mDAAmD,aAC/D,KAAK,IAAI,aAAI,SAAS,EAAC,yBAAyB,YAAE,KAAK,GAAM,EAC7D,WAAW,IAAI,YAAG,SAAS,EAAC,oCAAoC,YAAE,WAAW,GAAK,IAC/E,CACP,EACD,cAAK,SAAS,EAAC,mDAAmD,YAAE,QAAQ,GAAO,IAC/E,GACF,EACN,MAAM,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare function Skeleton({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react/jsx-runtime").JSX.Element;
2
+ export { Skeleton };
3
+ //# sourceMappingURL=skeleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.d.ts","sourceRoot":"","sources":["../../../../../core-web/src/components/ui/skeleton.tsx"],"names":[],"mappings":"AAEA,iBAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,2CAI9E;AAED,OAAO,EAAE,QAAQ,EAAE,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cn } from '../../lib/utils';
3
+ function Skeleton({ className, ...props }) {
4
+ return (_jsx("div", { className: cn('animate-pulse rounded-md bg-muted', className), ...props }));
5
+ }
6
+ export { Skeleton };
7
+ //# sourceMappingURL=skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.js","sourceRoot":"","sources":["../../../../../core-web/src/components/ui/skeleton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAEpC,SAAS,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAwC;IAC7E,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,mCAAmC,EAAE,SAAS,CAAC,KAAM,KAAK,GAAI,CAClF,CAAA;AACH,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,CAAA"}
@@ -0,0 +1,4 @@
1
+ import * as React from 'react';
2
+ declare const Textarea: React.ForwardRefExoticComponent<React.TextareaHTMLAttributes<HTMLTextAreaElement> & React.RefAttributes<HTMLTextAreaElement>>;
3
+ export { Textarea };
4
+ //# sourceMappingURL=textarea.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.d.ts","sourceRoot":"","sources":["../../../../../core-web/src/components/ui/textarea.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAG9B,QAAA,MAAM,QAAQ,+HAWb,CAAA;AAED,OAAO,EAAE,QAAQ,EAAE,CAAA"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ import { cn } from '../../lib/utils';
4
+ const Textarea = React.forwardRef(({ className, ...props }, ref) => (_jsx("textarea", { className: cn('flex w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50', className), ref: ref, ...props })));
5
+ Textarea.displayName = 'Textarea';
6
+ export { Textarea };
7
+ //# sourceMappingURL=textarea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.js","sourceRoot":"","sources":["../../../../../core-web/src/components/ui/textarea.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAEpC,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAC/B,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAChC,mBACE,SAAS,EAAE,EAAE,CACX,uOAAuO,EACvO,SAAS,CACV,EACD,GAAG,EAAE,GAAG,KACJ,KAAK,GACT,CACH,CACF,CAAA;AACD,QAAQ,CAAC,WAAW,GAAG,UAAU,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,CAAA"}
@@ -0,0 +1,13 @@
1
+ export interface UINode {
2
+ type: string;
3
+ children?: UINode[];
4
+ [prop: string]: any;
5
+ }
6
+ export declare const KNOWN_PRIMITIVES: string[];
7
+ interface Props {
8
+ spec: UINode | UINode[] | null | undefined;
9
+ onSendToChat?: (message: string) => void;
10
+ }
11
+ export declare function Generative({ spec, onSendToChat }: Props): import("react/jsx-runtime").JSX.Element | null;
12
+ export {};
13
+ //# sourceMappingURL=Generative.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Generative.d.ts","sourceRoot":"","sources":["../../../../../../core-web/src/components/widgets/agent/Generative.tsx"],"names":[],"mappings":"AAUA,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAA;CACpB;AAoBD,eAAO,MAAM,gBAAgB,UAA0B,CAAA;AAEvD,UAAU,KAAK;IACb,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,CAAA;IAC1C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACzC;AAED,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,KAAK,kDAIvD"}
@@ -0,0 +1,42 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as P from './Primitives';
3
+ const PRIMITIVES = {
4
+ Stack: P.Stack,
5
+ Row: P.Row,
6
+ Grid: P.Grid,
7
+ Heading: P.Heading,
8
+ Text: P.Text,
9
+ Image: P.Image,
10
+ Badge: P.Badge,
11
+ Stat: P.Stat,
12
+ Rating: P.Rating,
13
+ GoldSupplier: P.GoldSupplier,
14
+ Card: P.Card,
15
+ CardBody: P.CardBody,
16
+ LinkOut: P.LinkOut,
17
+ Button: P.Button,
18
+ Table: P.Table,
19
+ };
20
+ export const KNOWN_PRIMITIVES = Object.keys(PRIMITIVES);
21
+ export function Generative({ spec, onSendToChat }) {
22
+ if (!spec)
23
+ return null;
24
+ const nodes = Array.isArray(spec) ? spec : [spec];
25
+ return _jsx(_Fragment, { children: nodes.map((n, i) => renderNode(n, i, onSendToChat)) });
26
+ }
27
+ function renderNode(node, key, onSendToChat) {
28
+ if (!node || typeof node !== 'object')
29
+ return null;
30
+ const { type, children, ...props } = node;
31
+ const Cmp = PRIMITIVES[type];
32
+ if (!Cmp) {
33
+ return (_jsxs("div", { className: "text-[10px] text-muted-foreground/60 italic", children: ["[unknown primitive: ", String(type), "]"] }, key));
34
+ }
35
+ // Inject onSendToChat into any primitive that accepts it (Button)
36
+ const injectedProps = type === 'Button' ? { ...props, onSendToChat } : props;
37
+ const renderedChildren = Array.isArray(children) && children.length > 0
38
+ ? children.map((c, i) => renderNode(c, `${key}-${i}`, onSendToChat))
39
+ : undefined;
40
+ return (_jsx(Cmp, { ...injectedProps, children: renderedChildren }, key));
41
+ }
42
+ //# sourceMappingURL=Generative.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Generative.js","sourceRoot":"","sources":["../../../../../../core-web/src/components/widgets/agent/Generative.tsx"],"names":[],"mappings":";AAQA,OAAO,KAAK,CAAC,MAAM,cAAc,CAAA;AAQjC,MAAM,UAAU,GAAuC;IACrD,KAAK,EAAE,CAAC,CAAC,KAAK;IACd,GAAG,EAAE,CAAC,CAAC,GAAG;IACV,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,OAAO,EAAE,CAAC,CAAC,OAAO;IAClB,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,KAAK,EAAE,CAAC,CAAC,KAAK;IACd,KAAK,EAAE,CAAC,CAAC,KAAK;IACd,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,MAAM,EAAE,CAAC,CAAC,MAAM;IAChB,YAAY,EAAE,CAAC,CAAC,YAAY;IAC5B,IAAI,EAAE,CAAC,CAAC,IAAI;IACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;IACpB,OAAO,EAAE,CAAC,CAAC,OAAO;IAClB,MAAM,EAAE,CAAC,CAAC,MAAM;IAChB,KAAK,EAAE,CAAC,CAAC,KAAK;CACf,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;AAOvD,MAAM,UAAU,UAAU,CAAC,EAAE,IAAI,EAAE,YAAY,EAAS;IACtD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACtB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IACjD,OAAO,4BAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC,GAAI,CAAA;AACnE,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,GAAoB,EAAE,YAAkC;IACxF,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IAClD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,GAAG,IAAI,CAAA;IACzC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAE5B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CACL,eAAe,SAAS,EAAC,6CAA6C,qCAC/C,MAAM,CAAC,IAAI,CAAC,UADzB,GAAG,CAEP,CACP,CAAA;IACH,CAAC;IAED,kEAAkE;IAClE,MAAM,aAAa,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;IAE5E,MAAM,gBAAgB,GACpB,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC5C,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;QACpE,CAAC,CAAC,SAAS,CAAA;IAEf,OAAO,CACL,KAAC,GAAG,OAAe,aAAa,YAC7B,gBAAgB,IADT,GAAG,CAEP,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Primitive building blocks for agent-generated UIs.
3
+ *
4
+ * Each primitive is a simple React component that accepts typed props and
5
+ * optional `children` (already rendered by Generative). Primitives have no
6
+ * side effects beyond `onSendToChat` for interactive ones.
7
+ */
8
+ import { type ReactNode } from 'react';
9
+ type OnChat = (message: string) => void;
10
+ export declare function Stack({ gap, children }: {
11
+ gap?: number;
12
+ children?: ReactNode;
13
+ }): import("react/jsx-runtime").JSX.Element;
14
+ export declare function Row({ gap, align, children }: {
15
+ gap?: number;
16
+ align?: 'start' | 'center' | 'end' | 'baseline';
17
+ children?: ReactNode;
18
+ }): import("react/jsx-runtime").JSX.Element;
19
+ export declare function Grid({ cols, gap, children }: {
20
+ cols?: 1 | 2 | 3 | 4;
21
+ gap?: number;
22
+ children?: ReactNode;
23
+ }): import("react/jsx-runtime").JSX.Element;
24
+ export declare function Heading({ text, level }: {
25
+ text: string;
26
+ level?: 1 | 2 | 3;
27
+ }): import("react/jsx-runtime").JSX.Element;
28
+ export declare function Text({ text, muted, size }: {
29
+ text: string;
30
+ muted?: boolean;
31
+ size?: 'xs' | 'sm';
32
+ }): import("react/jsx-runtime").JSX.Element;
33
+ export declare function Image({ src, alt, aspect, fit }: {
34
+ src: string;
35
+ alt?: string;
36
+ aspect?: 'square' | 'video' | 'auto';
37
+ fit?: 'cover' | 'contain';
38
+ }): import("react/jsx-runtime").JSX.Element;
39
+ export declare function Badge({ text, variant }: {
40
+ text: string;
41
+ variant?: 'default' | 'secondary' | 'outline' | 'success' | 'warning';
42
+ }): import("react/jsx-runtime").JSX.Element;
43
+ export declare function Stat({ label, value, hint, tone }: {
44
+ label: string;
45
+ value: string;
46
+ hint?: string;
47
+ tone?: 'default' | 'success' | 'warning' | 'danger';
48
+ }): import("react/jsx-runtime").JSX.Element;
49
+ export declare function Rating({ score, count }: {
50
+ score: number;
51
+ count?: number;
52
+ }): import("react/jsx-runtime").JSX.Element;
53
+ export declare function GoldSupplier({ years }: {
54
+ years: number;
55
+ }): import("react/jsx-runtime").JSX.Element | null;
56
+ export declare function Card({ children }: {
57
+ children?: ReactNode;
58
+ }): import("react/jsx-runtime").JSX.Element;
59
+ export declare function CardBody({ children }: {
60
+ children?: ReactNode;
61
+ }): import("react/jsx-runtime").JSX.Element;
62
+ export declare function LinkOut({ href, label }: {
63
+ href: string;
64
+ label?: string;
65
+ }): import("react/jsx-runtime").JSX.Element;
66
+ export declare function Button({ label, send, action, actionPayload, variant, onSendToChat, }: {
67
+ label: string;
68
+ send?: string;
69
+ action?: string;
70
+ actionPayload?: Record<string, any>;
71
+ variant?: 'default' | 'primary' | 'ghost';
72
+ onSendToChat?: OnChat;
73
+ }): import("react/jsx-runtime").JSX.Element;
74
+ export declare function Table({ columns, rows, }: {
75
+ columns: string[];
76
+ rows: (string | number)[][];
77
+ }): import("react/jsx-runtime").JSX.Element;
78
+ export {};
79
+ //# sourceMappingURL=Primitives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Primitives.d.ts","sourceRoot":"","sources":["../../../../../../core-web/src/components/widgets/agent/Primitives.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAKhD,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;AAIvC,wBAAgB,KAAK,CAAC,EAAE,GAAO,EAAE,QAAQ,EAAE,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,2CAElF;AAED,wBAAgB,GAAG,CAAC,EAAE,GAAO,EAAE,KAAgB,EAAE,QAAQ,EAAE,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,2CAGnJ;AAED,wBAAgB,IAAI,CAAC,EAAE,IAAQ,EAAE,GAAO,EAAE,QAAQ,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,2CASjH;AAID,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,KAAS,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;CAAE,2CAG/E;AAED,wBAAgB,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAW,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAA;CAAE,2CAEvG;AAID,wBAAgB,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAiB,EAAE,GAAe,EAAE,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CAAE,2CAQrK;AAED,wBAAgB,KAAK,CAAC,EAAE,IAAI,EAAE,OAAmB,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAA;CAAE,2CAS3I;AAED,wBAAgB,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAgB,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;CAAE,2CASlK;AAED,wBAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,2CAQzE;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,kDAOxD;AAID,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,2CAM1D;AAED,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,2CAE9D;AAID,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,2CAWxE;AAED,wBAAgB,MAAM,CAAC,EACrB,KAAK,EACL,IAAI,EACJ,MAAM,EACN,aAAa,EACb,OAAmB,EACnB,YAAY,GACb,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACnC,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAA;IACzC,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,2CA4CA;AAID,wBAAgB,KAAK,CAAC,EACpB,OAAO,EACP,IAAI,GACL,EAAE;IACD,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,CAAA;CAC5B,2CA2BA"}
@@ -0,0 +1,116 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Primitive building blocks for agent-generated UIs.
4
+ *
5
+ * Each primitive is a simple React component that accepts typed props and
6
+ * optional `children` (already rendered by Generative). Primitives have no
7
+ * side effects beyond `onSendToChat` for interactive ones.
8
+ */
9
+ import { useState } from 'react';
10
+ import { ExternalLinkIcon, StarIcon, ShieldCheckIcon, Loader2Icon, CheckIcon } from 'lucide-react';
11
+ import { Badge as UIBadge } from '../../ui/badge';
12
+ import { ACTIONS } from './actions';
13
+ // ---------- Layout ----------
14
+ export function Stack({ gap = 2, children }) {
15
+ return _jsx("div", { className: `flex flex-col gap-${Math.min(gap, 6)}`, children: children });
16
+ }
17
+ export function Row({ gap = 2, align = 'center', children }) {
18
+ const a = { start: 'items-start', center: 'items-center', end: 'items-end', baseline: 'items-baseline' }[align];
19
+ return _jsx("div", { className: `flex flex-row gap-${Math.min(gap, 6)} ${a}`, children: children });
20
+ }
21
+ export function Grid({ cols = 3, gap = 2, children }) {
22
+ // Default to 3 columns. Tight breakpoints so it actually shows 3 at normal shell widths.
23
+ const c = {
24
+ 1: 'grid-cols-1',
25
+ 2: 'grid-cols-2',
26
+ 3: 'grid-cols-3',
27
+ 4: 'grid-cols-4',
28
+ }[cols] || 'grid-cols-4';
29
+ return _jsx("div", { className: `grid ${c} gap-${Math.min(gap, 6)}`, children: children });
30
+ }
31
+ // ---------- Typography ----------
32
+ export function Heading({ text, level = 2 }) {
33
+ const size = level === 1 ? 'text-lg font-semibold' : level === 2 ? 'text-sm font-semibold' : 'text-xs font-medium text-muted-foreground';
34
+ return _jsx("p", { className: size, children: text });
35
+ }
36
+ export function Text({ text, muted, size = 'sm' }) {
37
+ return _jsx("p", { className: `${size === 'xs' ? 'text-[11px]' : 'text-xs'} ${muted ? 'text-muted-foreground' : ''}`, children: text });
38
+ }
39
+ // ---------- Content ----------
40
+ export function Image({ src, alt, aspect = 'square', fit = 'contain' }) {
41
+ const a = aspect === 'square' ? 'aspect-square max-h-32' : aspect === 'video' ? 'aspect-video' : '';
42
+ const f = fit === 'contain' ? 'object-contain' : 'object-cover';
43
+ return (_jsx("div", { className: `${a} bg-muted/20 overflow-hidden rounded-md flex items-center justify-center`, children: _jsx("img", { src: src, alt: alt || '', loading: "lazy", className: `w-full h-full ${f}` }) }));
44
+ }
45
+ export function Badge({ text, variant = 'default' }) {
46
+ const colors = {
47
+ success: 'bg-emerald-600/15 text-emerald-500 border-emerald-600/30',
48
+ warning: 'bg-amber-500/15 text-amber-500 border-amber-500/30',
49
+ };
50
+ if (colors[variant]) {
51
+ return _jsx("span", { className: `text-[10px] px-1.5 py-0.5 rounded border ${colors[variant]}`, children: text });
52
+ }
53
+ return _jsx(UIBadge, { variant: variant, className: "text-[10px]", children: text });
54
+ }
55
+ export function Stat({ label, value, hint, tone = 'default' }) {
56
+ const color = { default: '', success: 'text-emerald-500', warning: 'text-amber-500', danger: 'text-red-500' }[tone];
57
+ return (_jsxs("div", { className: "bg-accent/40 border border-border/60 rounded-lg p-2.5", children: [_jsx("p", { className: "text-[10px] text-muted-foreground uppercase tracking-wide", children: label }), _jsx("p", { className: `text-base font-semibold ${color}`, children: value }), hint && _jsx("p", { className: "text-[10px] text-muted-foreground/60 mt-0.5", children: hint })] }));
58
+ }
59
+ export function Rating({ score, count }) {
60
+ return (_jsxs("span", { className: "inline-flex items-center gap-0.5 text-[11px]", children: [_jsx(StarIcon, { className: "w-3 h-3 text-yellow-500 fill-yellow-500" }), score.toFixed(1), count ? _jsxs("span", { className: "text-muted-foreground/60", children: [" (", count, ")"] }) : null] }));
61
+ }
62
+ export function GoldSupplier({ years }) {
63
+ if (!years)
64
+ return null;
65
+ return (_jsxs("span", { className: "inline-flex items-center gap-0.5 text-[11px] text-amber-500", children: [_jsx(ShieldCheckIcon, { className: "w-3 h-3" }), " ", years, "y Gold"] }));
66
+ }
67
+ // ---------- Containers ----------
68
+ export function Card({ children }) {
69
+ return (_jsx("div", { className: "bg-accent/40 border border-border/60 rounded-lg overflow-hidden flex flex-col hover:border-primary/40 transition-colors", children: children }));
70
+ }
71
+ export function CardBody({ children }) {
72
+ return _jsx("div", { className: "p-2.5 flex flex-col gap-1.5 flex-1", children: children });
73
+ }
74
+ // ---------- Interactive ----------
75
+ export function LinkOut({ href, label }) {
76
+ return (_jsxs("a", { href: href, target: "_blank", rel: "noreferrer", className: "inline-flex items-center gap-1 text-[11px] py-1 px-2 rounded border border-border hover:bg-accent transition-colors", children: [label || 'Ver', " ", _jsx(ExternalLinkIcon, { className: "w-2.5 h-2.5" })] }));
77
+ }
78
+ export function Button({ label, send, action, actionPayload, variant = 'default', onSendToChat, }) {
79
+ const [state, setState] = useState('idle');
80
+ const [result, setResult] = useState(null);
81
+ const cls = state === 'done'
82
+ ? 'bg-emerald-600/20 text-emerald-500 border border-emerald-600/30 cursor-default'
83
+ : variant === 'primary'
84
+ ? 'bg-emerald-600 hover:bg-emerald-500 text-white'
85
+ : variant === 'ghost'
86
+ ? 'hover:bg-accent'
87
+ : 'border border-border hover:bg-accent';
88
+ async function handle() {
89
+ if (state === 'running' || state === 'done')
90
+ return;
91
+ // Direct action takes priority
92
+ if (action && ACTIONS[action]) {
93
+ setState('running');
94
+ try {
95
+ const msg = await ACTIONS[action](actionPayload || {});
96
+ setResult(msg);
97
+ setState('done');
98
+ }
99
+ catch (e) {
100
+ setResult(`Error: ${e?.message || String(e)}`);
101
+ setState('error');
102
+ setTimeout(() => setState('idle'), 2500);
103
+ }
104
+ return;
105
+ }
106
+ // Fallback: send chat message
107
+ if (send)
108
+ onSendToChat?.(send);
109
+ }
110
+ return (_jsxs("button", { onClick: handle, disabled: state === 'running' || state === 'done', className: `text-[11px] py-1 px-2 rounded transition-colors inline-flex items-center gap-1 ${cls}`, children: [state === 'running' && _jsx(Loader2Icon, { className: "w-2.5 h-2.5 animate-spin" }), state === 'done' && _jsx(CheckIcon, { className: "w-2.5 h-2.5" }), _jsx("span", { children: state === 'done' ? result || 'Guardado' : state === 'error' ? result || 'Error' : label })] }));
111
+ }
112
+ // ---------- Tabular ----------
113
+ export function Table({ columns, rows, }) {
114
+ return (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-[11px]", children: [_jsx("thead", { children: _jsx("tr", { className: "border-b border-border", children: columns.map((c, i) => (_jsx("th", { className: "text-left py-1 px-2 font-medium text-muted-foreground", children: c }, i))) }) }), _jsx("tbody", { children: rows.map((row, i) => (_jsx("tr", { className: "border-b border-border/40 hover:bg-accent/30", children: row.map((cell, j) => (_jsx("td", { className: "py-1 px-2", children: cell }, j))) }, i))) })] }) }));
115
+ }
116
+ //# sourceMappingURL=Primitives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Primitives.js","sourceRoot":"","sources":["../../../../../../core-web/src/components/widgets/agent/Primitives.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type ActionHandler = (payload: any) => Promise<string>;
2
+ export declare const ACTIONS: Record<string, ActionHandler>;
3
+ //# sourceMappingURL=actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../../../../core-web/src/components/widgets/agent/actions.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AA0C7D,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAEjD,CAAA"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Registry of direct frontend actions that agent-rendered Buttons can trigger.
3
+ * Each action is an async handler that runs in the browser (usually a Supabase
4
+ * write) and returns a short confirmation label for the button's success state.
5
+ */
6
+ import { supabase } from '../../../lib/supabase';
7
+ async function saveAlternative(payload) {
8
+ const { product_id, company_id, supplier, title, url, thumbnail, price, moq, review_score, review_count, gold_supplier_years, country, } = payload || {};
9
+ if (!company_id || !supplier)
10
+ throw new Error('company_id y supplier requeridos');
11
+ const { error } = await supabase.from('product_alternatives').upsert({
12
+ product_id: product_id || null,
13
+ company_id,
14
+ supplier,
15
+ title: title || null,
16
+ url: url || null,
17
+ thumbnail: thumbnail || null,
18
+ price: price || null,
19
+ moq: moq || null,
20
+ review_score: review_score ?? null,
21
+ review_count: review_count ?? null,
22
+ gold_supplier_years: gold_supplier_years ?? null,
23
+ country: country || null,
24
+ source: 'alibaba',
25
+ }, { onConflict: 'product_id,supplier,url' });
26
+ if (error)
27
+ throw error;
28
+ return `✓ ${supplier} guardado como alternativa`;
29
+ }
30
+ export const ACTIONS = {
31
+ save_alternative: saveAlternative,
32
+ };
33
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../../../../../core-web/src/components/widgets/agent/actions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAIhD,KAAK,UAAU,eAAe,CAAC,OAAY;IACzC,MAAM,EACJ,UAAU,EACV,UAAU,EACV,QAAQ,EACR,KAAK,EACL,GAAG,EACH,SAAS,EACT,KAAK,EACL,GAAG,EACH,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,OAAO,GACR,GAAG,OAAO,IAAI,EAAE,CAAA;IAEjB,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAA;IAEjF,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAClE;QACE,UAAU,EAAE,UAAU,IAAI,IAAI;QAC9B,UAAU;QACV,QAAQ;QACR,KAAK,EAAE,KAAK,IAAI,IAAI;QACpB,GAAG,EAAE,GAAG,IAAI,IAAI;QAChB,SAAS,EAAE,SAAS,IAAI,IAAI;QAC5B,KAAK,EAAE,KAAK,IAAI,IAAI;QACpB,GAAG,EAAE,GAAG,IAAI,IAAI;QAChB,YAAY,EAAE,YAAY,IAAI,IAAI;QAClC,YAAY,EAAE,YAAY,IAAI,IAAI;QAClC,mBAAmB,EAAE,mBAAmB,IAAI,IAAI;QAChD,OAAO,EAAE,OAAO,IAAI,IAAI;QACxB,MAAM,EAAE,SAAS;KAClB,EACD,EAAE,UAAU,EAAE,yBAAyB,EAAE,CAC1C,CAAA;IACD,IAAI,KAAK;QAAE,MAAM,KAAK,CAAA;IACtB,OAAO,KAAK,QAAQ,4BAA4B,CAAA;AAClD,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAkC;IACpD,gBAAgB,EAAE,eAAe;CAClC,CAAA"}
@@ -0,0 +1,25 @@
1
+ import type { User } from '@supabase/supabase-js';
2
+ interface Company {
3
+ id: string;
4
+ name: string;
5
+ }
6
+ interface Profile {
7
+ full_name: string | null;
8
+ role_title: string | null;
9
+ onboarding_completed: boolean;
10
+ }
11
+ interface AuthState {
12
+ user: User | null;
13
+ role: 'admin' | 'client' | null;
14
+ companyId: string | null;
15
+ companies: Company[];
16
+ profile: Profile | null;
17
+ loading: boolean;
18
+ }
19
+ export declare function useAuth(): AuthState & {
20
+ signOut: () => void;
21
+ setCompanyId: (id: string) => void;
22
+ reload: () => Promise<void>;
23
+ };
24
+ export {};
25
+ //# sourceMappingURL=useAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../../../core-web/src/hooks/useAuth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAEjD,UAAU,OAAO;IACf,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACb;AAED,UAAU,OAAO;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,oBAAoB,EAAE,OAAO,CAAA;CAC9B;AAED,UAAU,SAAS;IACjB,IAAI,EAAE,IAAI,GAAG,IAAI,CAAA;IACjB,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,IAAI,CAAA;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,OAAO,EAAE,CAAA;IACpB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;CACjB;AAED,wBAAgB,OAAO,IAAI,SAAS,GAAG;IAAE,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAuD9H"}
@@ -0,0 +1,53 @@
1
+ import { useState, useEffect, useCallback } from 'react';
2
+ import { supabase } from '../lib/supabase';
3
+ export function useAuth() {
4
+ const [state, setState] = useState({
5
+ user: null, role: null, companyId: null, companies: [], profile: null, loading: true,
6
+ });
7
+ const loadUser = useCallback(async (user) => {
8
+ if (!user) {
9
+ setState({ user: null, role: null, companyId: null, companies: [], profile: null, loading: false });
10
+ return;
11
+ }
12
+ const [{ data: owned }, { data: profile }] = await Promise.all([
13
+ supabase.from('companies').select('id, name').eq('owner_id', user.id),
14
+ supabase.from('profiles').select('full_name, role_title, onboarding_completed').eq('id', user.id).maybeSingle(),
15
+ ]);
16
+ if (owned && owned.length > 0) {
17
+ setState({ user, role: 'admin', companyId: owned[0].id, companies: owned, profile: profile || null, loading: false });
18
+ return;
19
+ }
20
+ const { data: memberships } = await supabase
21
+ .from('company_users')
22
+ .select('company_id, companies(id, name)')
23
+ .eq('user_id', user.id);
24
+ const clientCompanies = (memberships || []).map((m) => m.companies).filter(Boolean);
25
+ setState({
26
+ user, role: clientCompanies.length > 0 ? 'client' : null,
27
+ companyId: clientCompanies[0]?.id || null, companies: clientCompanies,
28
+ profile: profile || null, loading: false,
29
+ });
30
+ }, []);
31
+ useEffect(() => {
32
+ let active = true;
33
+ supabase.auth.getUser().then(({ data: { user } }) => {
34
+ if (active)
35
+ loadUser(user);
36
+ }).catch(() => { });
37
+ const { data: { subscription } } = supabase.auth.onAuthStateChange((_ev, session) => {
38
+ if (active)
39
+ loadUser(session?.user || null);
40
+ });
41
+ return () => { active = false; subscription.unsubscribe(); };
42
+ }, [loadUser]);
43
+ return {
44
+ ...state,
45
+ signOut: () => supabase.auth.signOut(),
46
+ setCompanyId: (id) => setState(s => ({ ...s, companyId: id })),
47
+ reload: async () => {
48
+ const { data: { user } } = await supabase.auth.getUser();
49
+ await loadUser(user);
50
+ },
51
+ };
52
+ }
53
+ //# sourceMappingURL=useAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuth.js","sourceRoot":"","sources":["../../../../core-web/src/hooks/useAuth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Minimal data-fetching hook. Replaces the `useEffect(() => fetch().then(setState), [deps])` pattern.
3
+ * Handles stale closures via an abort flag. Components should never useEffect for fetching.
4
+ */
5
+ export declare function useData<T>(fetcher: (signal: AbortSignal) => Promise<T>, deps: readonly unknown[], initial: T): {
6
+ data: T;
7
+ loading: boolean;
8
+ error: Error | null;
9
+ };
10
+ //# sourceMappingURL=useData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useData.d.ts","sourceRoot":"","sources":["../../../../core-web/src/hooks/useData.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,OAAO,CAAC,CAAC,EACvB,OAAO,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,EAC5C,IAAI,EAAE,SAAS,OAAO,EAAE,EACxB,OAAO,EAAE,CAAC,GACT;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;CAAE,CAiCpD"}
@@ -0,0 +1,37 @@
1
+ import { useEffect, useRef, useState } from 'react';
2
+ /**
3
+ * Minimal data-fetching hook. Replaces the `useEffect(() => fetch().then(setState), [deps])` pattern.
4
+ * Handles stale closures via an abort flag. Components should never useEffect for fetching.
5
+ */
6
+ export function useData(fetcher, deps, initial) {
7
+ const [data, setData] = useState(initial);
8
+ const [loading, setLoading] = useState(true);
9
+ const [error, setError] = useState(null);
10
+ const mountedRef = useRef(true);
11
+ // eslint-disable-next-line react-hooks/exhaustive-deps
12
+ useEffect(() => {
13
+ const controller = new AbortController();
14
+ setLoading(true);
15
+ setError(null);
16
+ fetcher(controller.signal)
17
+ .then(result => {
18
+ if (!controller.signal.aborted) {
19
+ setData(result);
20
+ setLoading(false);
21
+ }
22
+ })
23
+ .catch(err => {
24
+ if (!controller.signal.aborted) {
25
+ setError(err);
26
+ setLoading(false);
27
+ }
28
+ });
29
+ return () => controller.abort();
30
+ }, deps);
31
+ useEffect(() => {
32
+ mountedRef.current = true;
33
+ return () => { mountedRef.current = false; };
34
+ }, []);
35
+ return { data, loading, error };
36
+ }
37
+ //# sourceMappingURL=useData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useData.js","sourceRoot":"","sources":["../../../../core-web/src/hooks/useData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEnD;;;GAGG;AACH,MAAM,UAAU,OAAO,CACrB,OAA4C,EAC5C,IAAwB,EACxB,OAAU;IAEV,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAI,OAAO,CAAC,CAAA;IAC5C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC5C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAA;IACtD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;IAE/B,uDAAuD;IACvD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,UAAU,CAAC,IAAI,CAAC,CAAA;QAChB,QAAQ,CAAC,IAAI,CAAC,CAAA;QACd,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;aACvB,IAAI,CAAC,MAAM,CAAC,EAAE;YACb,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,OAAO,CAAC,MAAM,CAAC,CAAA;gBACf,UAAU,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,CAAC,EAAE;YACX,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,QAAQ,CAAC,GAAG,CAAC,CAAA;gBACb,UAAU,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC;QACH,CAAC,CAAC,CAAA;QACJ,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;IACjC,CAAC,EAAE,IAAI,CAAC,CAAA;IAER,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,CAAC,OAAO,GAAG,IAAI,CAAA;QACzB,OAAO,GAAG,EAAE,GAAG,UAAU,CAAC,OAAO,GAAG,KAAK,CAAA,CAAC,CAAC,CAAA;IAC7C,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;AACjC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Run an effect exactly once on mount. The only sanctioned direct useEffect wrapper.
3
+ * Components must never import useEffect directly — use this or another custom hook.
4
+ */
5
+ export declare function useMountEffect(effect: () => void | (() => void)): void;
6
+ //# sourceMappingURL=useMountEffect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMountEffect.d.ts","sourceRoot":"","sources":["../../../../core-web/src/hooks/useMountEffect.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,QAG/D"}
@@ -0,0 +1,10 @@
1
+ import { useEffect } from 'react';
2
+ /**
3
+ * Run an effect exactly once on mount. The only sanctioned direct useEffect wrapper.
4
+ * Components must never import useEffect directly — use this or another custom hook.
5
+ */
6
+ export function useMountEffect(effect) {
7
+ // eslint-disable-next-line react-hooks/exhaustive-deps
8
+ useEffect(effect, []);
9
+ }
10
+ //# sourceMappingURL=useMountEffect.js.map