@lssm/module.ai-chat 0.0.0-canary-20251217083314 → 0.0.0-canary-20251219202229

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 (100) hide show
  1. package/LICENSE +21 -0
  2. package/dist/ai-chat.feature.d.ts +2 -1
  3. package/dist/ai-chat.feature.d.ts.map +1 -0
  4. package/dist/ai-chat.feature.js +2 -1
  5. package/dist/ai-chat.feature.js.map +1 -0
  6. package/dist/context/context-builder.d.ts +2 -1
  7. package/dist/context/context-builder.d.ts.map +1 -0
  8. package/dist/context/context-builder.js +2 -1
  9. package/dist/context/context-builder.js.map +1 -0
  10. package/dist/context/file-operations.d.ts +2 -1
  11. package/dist/context/file-operations.d.ts.map +1 -0
  12. package/dist/context/file-operations.js +2 -1
  13. package/dist/context/file-operations.js.map +1 -0
  14. package/dist/context/workspace-context.d.ts +2 -1
  15. package/dist/context/workspace-context.d.ts.map +1 -0
  16. package/dist/context/workspace-context.js +2 -1
  17. package/dist/context/workspace-context.js.map +1 -0
  18. package/dist/core/chat-service.d.ts +2 -1
  19. package/dist/core/chat-service.d.ts.map +1 -0
  20. package/dist/core/chat-service.js +2 -1
  21. package/dist/core/chat-service.js.map +1 -0
  22. package/dist/core/conversation-store.d.ts +2 -1
  23. package/dist/core/conversation-store.d.ts.map +1 -0
  24. package/dist/core/conversation-store.js +2 -1
  25. package/dist/core/conversation-store.js.map +1 -0
  26. package/dist/core/message-types.d.ts +2 -1
  27. package/dist/core/message-types.d.ts.map +1 -0
  28. package/dist/libs/ai-providers/dist/factory.js +23 -22
  29. package/dist/libs/ai-providers/dist/factory.js.map +1 -0
  30. package/dist/libs/ai-providers/dist/models.js +2 -1
  31. package/dist/libs/ai-providers/dist/models.js.map +1 -0
  32. package/dist/libs/ai-providers/dist/validation.js +2 -1
  33. package/dist/libs/ai-providers/dist/validation.js.map +1 -0
  34. package/dist/libs/design-system/dist/_virtual/rolldown_runtime.js +2 -1
  35. package/dist/libs/design-system/dist/_virtual/rolldown_runtime.js.map +1 -0
  36. package/dist/libs/design-system/dist/components/atoms/Button.js +5 -4
  37. package/dist/libs/design-system/dist/components/atoms/Button.js.map +1 -0
  38. package/dist/libs/design-system/dist/components/atoms/Textarea.js +5 -4
  39. package/dist/libs/design-system/dist/components/atoms/Textarea.js.map +1 -0
  40. package/dist/libs/design-system/dist/lib/keyboard.js +2 -1
  41. package/dist/libs/design-system/dist/lib/keyboard.js.map +1 -0
  42. package/dist/libs/design-system/dist/ui-kit-web/dist/ui/button.js +2 -1
  43. package/dist/libs/design-system/dist/ui-kit-web/dist/ui/button.js.map +1 -0
  44. package/dist/libs/design-system/dist/ui-kit-web/dist/ui/textarea.js +2 -1
  45. package/dist/libs/design-system/dist/ui-kit-web/dist/ui/textarea.js.map +1 -0
  46. package/dist/libs/design-system/dist/ui-kit-web/dist/ui-kit-core/dist/utils.js +2 -1
  47. package/dist/libs/design-system/dist/ui-kit-web/dist/ui-kit-core/dist/utils.js.map +1 -0
  48. package/dist/libs/ui-kit-web/dist/ui/avatar.js +2 -1
  49. package/dist/libs/ui-kit-web/dist/ui/avatar.js.map +1 -0
  50. package/dist/libs/ui-kit-web/dist/ui/badge.js +2 -1
  51. package/dist/libs/ui-kit-web/dist/ui/badge.js.map +1 -0
  52. package/dist/libs/ui-kit-web/dist/ui/scroll-area.js +2 -1
  53. package/dist/libs/ui-kit-web/dist/ui/scroll-area.js.map +1 -0
  54. package/dist/libs/ui-kit-web/dist/ui/select.js +2 -1
  55. package/dist/libs/ui-kit-web/dist/ui/select.js.map +1 -0
  56. package/dist/libs/ui-kit-web/dist/ui/skeleton.js +2 -1
  57. package/dist/libs/ui-kit-web/dist/ui/skeleton.js.map +1 -0
  58. package/dist/libs/ui-kit-web/dist/ui/tooltip.js +2 -1
  59. package/dist/libs/ui-kit-web/dist/ui/tooltip.js.map +1 -0
  60. package/dist/libs/ui-kit-web/dist/ui/utils.js +2 -1
  61. package/dist/libs/ui-kit-web/dist/ui/utils.js.map +1 -0
  62. package/dist/libs/ui-kit-web/dist/ui-kit-core/dist/utils.js +2 -1
  63. package/dist/libs/ui-kit-web/dist/ui-kit-core/dist/utils.js.map +1 -0
  64. package/dist/presentation/components/ChatContainer.d.ts +2 -1
  65. package/dist/presentation/components/ChatContainer.d.ts.map +1 -0
  66. package/dist/presentation/components/ChatContainer.js +2 -1
  67. package/dist/presentation/components/ChatContainer.js.map +1 -0
  68. package/dist/presentation/components/ChatInput.d.ts +4 -3
  69. package/dist/presentation/components/ChatInput.d.ts.map +1 -0
  70. package/dist/presentation/components/ChatInput.js +8 -7
  71. package/dist/presentation/components/ChatInput.js.map +1 -0
  72. package/dist/presentation/components/ChatMessage.d.ts +7 -6
  73. package/dist/presentation/components/ChatMessage.d.ts.map +1 -0
  74. package/dist/presentation/components/ChatMessage.js +4 -3
  75. package/dist/presentation/components/ChatMessage.js.map +1 -0
  76. package/dist/presentation/components/CodePreview.d.ts +4 -3
  77. package/dist/presentation/components/CodePreview.d.ts.map +1 -0
  78. package/dist/presentation/components/CodePreview.js +8 -7
  79. package/dist/presentation/components/CodePreview.js.map +1 -0
  80. package/dist/presentation/components/ContextIndicator.d.ts +2 -1
  81. package/dist/presentation/components/ContextIndicator.d.ts.map +1 -0
  82. package/dist/presentation/components/ContextIndicator.js +2 -1
  83. package/dist/presentation/components/ContextIndicator.js.map +1 -0
  84. package/dist/presentation/components/ModelPicker.d.ts +6 -5
  85. package/dist/presentation/components/ModelPicker.d.ts.map +1 -0
  86. package/dist/presentation/components/ModelPicker.js +4 -3
  87. package/dist/presentation/components/ModelPicker.js.map +1 -0
  88. package/dist/presentation/hooks/useChat.d.ts +2 -1
  89. package/dist/presentation/hooks/useChat.d.ts.map +1 -0
  90. package/dist/presentation/hooks/useChat.js +2 -1
  91. package/dist/presentation/hooks/useChat.js.map +1 -0
  92. package/dist/presentation/hooks/useProviders.d.ts +2 -1
  93. package/dist/presentation/hooks/useProviders.d.ts.map +1 -0
  94. package/dist/presentation/hooks/useProviders.js +2 -1
  95. package/dist/presentation/hooks/useProviders.js.map +1 -0
  96. package/dist/providers/chat-utilities.d.ts +2 -1
  97. package/dist/providers/chat-utilities.d.ts.map +1 -0
  98. package/dist/providers/chat-utilities.js +2 -1
  99. package/dist/providers/chat-utilities.js.map +1 -0
  100. package/package.json +13 -12
@@ -0,0 +1 @@
1
+ {"version":3,"file":"button.js","names":[],"sources":["../../../../../../../../../libs/design-system/dist/ui-kit-web/dist/ui/button.js"],"sourcesContent":["import { cn, init_utils } from \"../ui-kit-core/dist/utils.js\";\nimport * as React$1 from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { cva } from \"class-variance-authority\";\nimport { Slot } from \"@radix-ui/react-slot\";\n\n//#region ../ui-kit-web/dist/ui/button.js\ninit_utils();\nconst buttonVariants = cva(\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-hidden focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\", {\n\tvariants: {\n\t\tvariant: {\n\t\t\tdefault: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n\t\t\tdestructive: \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n\t\t\toutline: \"border bg-background shadow-2xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n\t\t\tsecondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n\t\t\tghost: \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n\t\t\tlink: \"text-primary underline-offset-4 hover:underline\"\n\t\t},\n\t\tsize: {\n\t\t\tdefault: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n\t\t\tsm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n\t\t\tlg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n\t\t\ticon: \"size-9\"\n\t\t}\n\t},\n\tdefaultVariants: {\n\t\tvariant: \"default\",\n\t\tsize: \"default\"\n\t}\n});\nconst Button = React$1.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => {\n\tif (asChild) return /* @__PURE__ */ jsx(Slot, {\n\t\t\"data-slot\": \"button\",\n\t\tclassName: cn(buttonVariants({\n\t\t\tvariant,\n\t\t\tsize,\n\t\t\tclassName\n\t\t})),\n\t\t...props\n\t});\n\treturn /* @__PURE__ */ jsx(\"button\", {\n\t\tref,\n\t\t\"data-slot\": \"button\",\n\t\tclassName: cn(buttonVariants({\n\t\t\tvariant,\n\t\t\tsize,\n\t\t\tclassName\n\t\t})),\n\t\t...props\n\t});\n});\nButton.displayName = \"Button\";\n\n//#endregion\nexport { Button, buttonVariants };\n//# sourceMappingURL=button.js.map"],"mappings":";;;;;;;AAOA,YAAY;AACZ,MAAM,iBAAiB,IAAI,icAAic;CAC3d,UAAU;EACT,SAAS;GACR,SAAS;GACT,aAAa;GACb,SAAS;GACT,WAAW;GACX,OAAO;GACP,MAAM;GACN;EACD,MAAM;GACL,SAAS;GACT,IAAI;GACJ,IAAI;GACJ,MAAM;GACN;EACD;CACD,iBAAiB;EAChB,SAAS;EACT,MAAM;EACN;CACD,CAAC;AACF,MAAM,SAAS,QAAQ,YAAY,EAAE,WAAW,SAAS,MAAM,UAAU,OAAO,GAAG,SAAS,QAAQ;AACnG,KAAI,QAAS,QAAuB,oBAAI,MAAM;EAC7C,aAAa;EACb,WAAW,GAAG,eAAe;GAC5B;GACA;GACA;GACA,CAAC,CAAC;EACH,GAAG;EACH,CAAC;AACF,QAAuB,oBAAI,UAAU;EACpC;EACA,aAAa;EACb,WAAW,GAAG,eAAe;GAC5B;GACA;GACA;GACA,CAAC,CAAC;EACH,GAAG;EACH,CAAC;EACD;AACF,OAAO,cAAc"}
@@ -13,4 +13,5 @@ function Textarea({ className, ...props }) {
13
13
  }
14
14
 
15
15
  //#endregion
16
- export { Textarea };
16
+ export { Textarea };
17
+ //# sourceMappingURL=textarea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea.js","names":[],"sources":["../../../../../../../../../libs/design-system/dist/ui-kit-web/dist/ui/textarea.js"],"sourcesContent":["import { cn, init_utils } from \"../ui-kit-core/dist/utils.js\";\nimport \"react\";\nimport { jsx } from \"react/jsx-runtime\";\n\n//#region ../ui-kit-web/dist/ui/textarea.js\ninit_utils();\nfunction Textarea({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"textarea\", {\n\t\t\"data-slot\": \"textarea\",\n\t\tclassName: cn(\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-2xs outline-hidden transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\", className),\n\t\t...props\n\t});\n}\n\n//#endregion\nexport { Textarea };\n//# sourceMappingURL=textarea.js.map"],"mappings":";;;;;AAKA,YAAY;AACZ,SAAS,SAAS,EAAE,WAAW,GAAG,SAAS;AAC1C,QAAuB,oBAAI,YAAY;EACtC,aAAa;EACb,WAAW,GAAG,0cAA0c,UAAU;EACle,GAAG;EACH,CAAC"}
@@ -10,4 +10,5 @@ var init_utils = __esmMin((() => {}));
10
10
  init_utils();
11
11
 
12
12
  //#endregion
13
- export { cn, init_utils };
13
+ export { cn, init_utils };
14
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../../../../../../../libs/design-system/dist/ui-kit-web/dist/ui-kit-core/dist/utils.js"],"sourcesContent":["import { __esmMin } from \"../../../../_virtual/rolldown_runtime.js\";\nimport { clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n//#region ../ui-kit-web/dist/ui-kit-core/dist/utils.js\nfunction cn(...inputs) {\n\treturn twMerge(clsx(inputs));\n}\nvar init_utils = __esmMin((() => {}));\n\n//#endregion\ninit_utils();\nexport { cn, init_utils };\n//# sourceMappingURL=utils.js.map"],"mappings":";;;;;AAKA,SAAS,GAAG,GAAG,QAAQ;AACtB,QAAO,QAAQ,KAAK,OAAO,CAAC;;AAE7B,IAAI,aAAa,gBAAgB,IAAI;AAGrC,YAAY"}
@@ -22,4 +22,5 @@ function AvatarFallback({ className, ...props }) {
22
22
  }
23
23
 
24
24
  //#endregion
25
- export { Avatar, AvatarFallback };
25
+ export { Avatar, AvatarFallback };
26
+ //# sourceMappingURL=avatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.js","names":[],"sources":["../../../../../../../libs/ui-kit-web/dist/ui/avatar.js"],"sourcesContent":["'use client';\n\nimport { cn } from \"./utils.js\";\nimport \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\n\n//#region ui/avatar.tsx\nfunction Avatar({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(AvatarPrimitive.Root, {\n\t\t\"data-slot\": \"avatar\",\n\t\tclassName: cn(\"relative flex size-8 shrink-0 overflow-hidden rounded-full\", className),\n\t\t...props\n\t});\n}\nfunction AvatarImage({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(AvatarPrimitive.Image, {\n\t\t\"data-slot\": \"avatar-image\",\n\t\tclassName: cn(\"aspect-square size-full\", className),\n\t\t...props\n\t});\n}\nfunction AvatarFallback({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(AvatarPrimitive.Fallback, {\n\t\t\"data-slot\": \"avatar-fallback\",\n\t\tclassName: cn(\"bg-muted flex size-full items-center justify-center rounded-full\", className),\n\t\t...props\n\t});\n}\n\n//#endregion\nexport { Avatar, AvatarFallback, AvatarImage };\n//# sourceMappingURL=avatar.js.map"],"mappings":";;;;;;;;AAQA,SAAS,OAAO,EAAE,WAAW,GAAG,SAAS;AACxC,QAAuB,oBAAI,gBAAgB,MAAM;EAChD,aAAa;EACb,WAAW,GAAG,8DAA8D,UAAU;EACtF,GAAG;EACH,CAAC;;AASH,SAAS,eAAe,EAAE,WAAW,GAAG,SAAS;AAChD,QAAuB,oBAAI,gBAAgB,UAAU;EACpD,aAAa;EACb,WAAW,GAAG,oEAAoE,UAAU;EAC5F,GAAG;EACH,CAAC"}
@@ -23,4 +23,5 @@ function Badge({ className, variant, asChild = false, ...props }) {
23
23
  }
24
24
 
25
25
  //#endregion
26
- export { Badge };
26
+ export { Badge };
27
+ //# sourceMappingURL=badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"badge.js","names":[],"sources":["../../../../../../../libs/ui-kit-web/dist/ui/badge.js"],"sourcesContent":["import { cn } from \"../ui-kit-core/dist/utils.js\";\nimport \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva } from \"class-variance-authority\";\n\n//#region ui/badge.tsx\nconst badgeVariants = cva(\"inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\", {\n\tvariants: { variant: {\n\t\tdefault: \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n\t\tsecondary: \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n\t\tdestructive: \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n\t\toutline: \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\"\n\t} },\n\tdefaultVariants: { variant: \"default\" }\n});\nfunction Badge({ className, variant, asChild = false, ...props }) {\n\treturn /* @__PURE__ */ jsx(asChild ? Slot : \"span\", {\n\t\t\"data-slot\": \"badge\",\n\t\tclassName: cn(badgeVariants({ variant }), className),\n\t\t...props\n\t});\n}\n\n//#endregion\nexport { Badge, badgeVariants };\n//# sourceMappingURL=badge.js.map"],"mappings":";;;;;;;AAOA,MAAM,gBAAgB,IAAI,kZAAkZ;CAC3a,UAAU,EAAE,SAAS;EACpB,SAAS;EACT,WAAW;EACX,aAAa;EACb,SAAS;EACT,EAAE;CACH,iBAAiB,EAAE,SAAS,WAAW;CACvC,CAAC;AACF,SAAS,MAAM,EAAE,WAAW,SAAS,UAAU,OAAO,GAAG,SAAS;AACjE,QAAuB,oBAAI,UAAU,OAAO,QAAQ;EACnD,aAAa;EACb,WAAW,GAAG,cAAc,EAAE,SAAS,CAAC,EAAE,UAAU;EACpD,GAAG;EACH,CAAC"}
@@ -36,4 +36,5 @@ function ScrollBar({ className, orientation = "vertical", ...props }) {
36
36
  }
37
37
 
38
38
  //#endregion
39
- export { ScrollArea };
39
+ export { ScrollArea };
40
+ //# sourceMappingURL=scroll-area.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-area.js","names":[],"sources":["../../../../../../../libs/ui-kit-web/dist/ui/scroll-area.js"],"sourcesContent":["'use client';\n\nimport { cn } from \"../ui-kit-core/dist/utils.js\";\nimport \"react\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\n\n//#region ui/scroll-area.tsx\nfunction ScrollArea({ className, children, ...props }) {\n\treturn /* @__PURE__ */ jsxs(ScrollAreaPrimitive.Root, {\n\t\t\"data-slot\": \"scroll-area\",\n\t\tclassName: cn(\"relative\", className),\n\t\t...props,\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(ScrollAreaPrimitive.Viewport, {\n\t\t\t\t\"data-slot\": \"scroll-area-viewport\",\n\t\t\t\tclassName: \"focus-visible:ring-ring/50 size-full rounded-[inherit] outline-hidden transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1\",\n\t\t\t\tchildren\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(ScrollBar, {}),\n\t\t\t/* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, {})\n\t\t]\n\t});\n}\nfunction ScrollBar({ className, orientation = \"vertical\", ...props }) {\n\treturn /* @__PURE__ */ jsx(ScrollAreaPrimitive.ScrollAreaScrollbar, {\n\t\t\"data-slot\": \"scroll-area-scrollbar\",\n\t\torientation,\n\t\tclassName: cn(\"flex touch-none p-px transition-colors select-none\", orientation === \"vertical\" && \"h-full w-2.5 border-l border-l-transparent\", orientation === \"horizontal\" && \"h-2.5 flex-col border-t border-t-transparent\", className),\n\t\t...props,\n\t\tchildren: /* @__PURE__ */ jsx(ScrollAreaPrimitive.ScrollAreaThumb, {\n\t\t\t\"data-slot\": \"scroll-area-thumb\",\n\t\t\tclassName: \"bg-border relative flex-1 rounded-full\"\n\t\t})\n\t});\n}\n\n//#endregion\nexport { ScrollArea, ScrollBar };\n//# sourceMappingURL=scroll-area.js.map"],"mappings":";;;;;;;;AAQA,SAAS,WAAW,EAAE,WAAW,UAAU,GAAG,SAAS;AACtD,QAAuB,qBAAK,oBAAoB,MAAM;EACrD,aAAa;EACb,WAAW,GAAG,YAAY,UAAU;EACpC,GAAG;EACH,UAAU;GACO,oBAAI,oBAAoB,UAAU;IACjD,aAAa;IACb,WAAW;IACX;IACA,CAAC;GACc,oBAAI,WAAW,EAAE,CAAC;GAClB,oBAAI,oBAAoB,QAAQ,EAAE,CAAC;GACnD;EACD,CAAC;;AAEH,SAAS,UAAU,EAAE,WAAW,cAAc,YAAY,GAAG,SAAS;AACrE,QAAuB,oBAAI,oBAAoB,qBAAqB;EACnE,aAAa;EACb;EACA,WAAW,GAAG,sDAAsD,gBAAgB,cAAc,8CAA8C,gBAAgB,gBAAgB,gDAAgD,UAAU;EAC1O,GAAG;EACH,UAA0B,oBAAI,oBAAoB,iBAAiB;GAClE,aAAa;GACb,WAAW;GACX,CAAC;EACF,CAAC"}
@@ -76,4 +76,5 @@ function SelectScrollDownButton({ className, ...props }) {
76
76
  }
77
77
 
78
78
  //#endregion
79
- export { Select, SelectContent, SelectItem, SelectTrigger, SelectValue };
79
+ export { Select, SelectContent, SelectItem, SelectTrigger, SelectValue };
80
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","names":[],"sources":["../../../../../../../libs/ui-kit-web/dist/ui/select.js"],"sourcesContent":["'use client';\n\nimport { cn } from \"../ui-kit-core/dist/utils.js\";\nimport \"react\";\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\n\n//#region ui/select.tsx\nfunction Select({ ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.Root, {\n\t\t\"data-slot\": \"select\",\n\t\t...props\n\t});\n}\nfunction SelectGroup({ ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.Group, {\n\t\t\"data-slot\": \"select-group\",\n\t\t...props\n\t});\n}\nfunction SelectValue({ ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.Value, {\n\t\t\"data-slot\": \"select-value\",\n\t\t...props\n\t});\n}\nfunction SelectTrigger({ className, size = \"default\", children, ...props }) {\n\treturn /* @__PURE__ */ jsxs(SelectPrimitive.Trigger, {\n\t\t\"data-slot\": \"select-trigger\",\n\t\t\"data-size\": size,\n\t\tclassName: cn(\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive border-input focus-visible:border-ring focus-visible:ring-ring/50 data-placeholder:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 [&_svg:not([class*='text-'])]:text-muted-foreground flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-2xs outline-hidden transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\", className),\n\t\t...props,\n\t\tchildren: [children, /* @__PURE__ */ jsx(SelectPrimitive.Icon, {\n\t\t\tasChild: true,\n\t\t\tchildren: /* @__PURE__ */ jsx(ChevronDownIcon, { className: \"size-4 opacity-50\" })\n\t\t})]\n\t});\n}\nfunction SelectContent({ className, children, position = \"popper\", ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(SelectPrimitive.Content, {\n\t\t\"data-slot\": \"select-content\",\n\t\tclassName: cn(\"bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-32 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md\", position === \"popper\" && \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\", className),\n\t\tposition,\n\t\t...props,\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(SelectScrollUpButton, {}),\n\t\t\t/* @__PURE__ */ jsx(SelectPrimitive.Viewport, {\n\t\t\t\tclassName: cn(\"p-1\", position === \"popper\" && \"h-(--radix-select-trigger-height) w-full min-w-(--radix-select-trigger-width) scroll-my-1\"),\n\t\t\t\tchildren\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(SelectScrollDownButton, {})\n\t\t]\n\t}) });\n}\nfunction SelectLabel({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.Label, {\n\t\t\"data-slot\": \"select-label\",\n\t\tclassName: cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className),\n\t\t...props\n\t});\n}\nfunction SelectItem({ className, children, ...props }) {\n\treturn /* @__PURE__ */ jsxs(SelectPrimitive.Item, {\n\t\t\"data-slot\": \"select-item\",\n\t\tclassName: cn(\"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-xs py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\", className),\n\t\t...props,\n\t\tchildren: [/* @__PURE__ */ jsx(\"span\", {\n\t\t\tclassName: \"absolute right-2 flex size-3.5 items-center justify-center\",\n\t\t\tchildren: /* @__PURE__ */ jsx(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: \"size-4\" }) })\n\t\t}), /* @__PURE__ */ jsx(SelectPrimitive.ItemText, { children })]\n\t});\n}\nfunction SelectSeparator({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.Separator, {\n\t\t\"data-slot\": \"select-separator\",\n\t\tclassName: cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className),\n\t\t...props\n\t});\n}\nfunction SelectScrollUpButton({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.ScrollUpButton, {\n\t\t\"data-slot\": \"select-scroll-up-button\",\n\t\tclassName: cn(\"flex cursor-default items-center justify-center py-1\", className),\n\t\t...props,\n\t\tchildren: /* @__PURE__ */ jsx(ChevronUpIcon, { className: \"size-4\" })\n\t});\n}\nfunction SelectScrollDownButton({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.ScrollDownButton, {\n\t\t\"data-slot\": \"select-scroll-down-button\",\n\t\tclassName: cn(\"flex cursor-default items-center justify-center py-1\", className),\n\t\t...props,\n\t\tchildren: /* @__PURE__ */ jsx(ChevronDownIcon, { className: \"size-4\" })\n\t});\n}\n\n//#endregion\nexport { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue };\n//# sourceMappingURL=select.js.map"],"mappings":";;;;;;;;;AASA,SAAS,OAAO,EAAE,GAAG,SAAS;AAC7B,QAAuB,oBAAI,gBAAgB,MAAM;EAChD,aAAa;EACb,GAAG;EACH,CAAC;;AAQH,SAAS,YAAY,EAAE,GAAG,SAAS;AAClC,QAAuB,oBAAI,gBAAgB,OAAO;EACjD,aAAa;EACb,GAAG;EACH,CAAC;;AAEH,SAAS,cAAc,EAAE,WAAW,OAAO,WAAW,UAAU,GAAG,SAAS;AAC3E,QAAuB,qBAAK,gBAAgB,SAAS;EACpD,aAAa;EACb,aAAa;EACb,WAAW,GAAG,izBAAizB,UAAU;EACz0B,GAAG;EACH,UAAU,CAAC,UAA0B,oBAAI,gBAAgB,MAAM;GAC9D,SAAS;GACT,UAA0B,oBAAI,iBAAiB,EAAE,WAAW,qBAAqB,CAAC;GAClF,CAAC,CAAC;EACH,CAAC;;AAEH,SAAS,cAAc,EAAE,WAAW,UAAU,WAAW,UAAU,GAAG,SAAS;AAC9E,QAAuB,oBAAI,gBAAgB,QAAQ,EAAE,UAA0B,qBAAK,gBAAgB,SAAS;EAC5G,aAAa;EACb,WAAW,GAAG,6iBAA6iB,aAAa,YAAY,mIAAmI,UAAU;EACjuB;EACA,GAAG;EACH,UAAU;GACO,oBAAI,sBAAsB,EAAE,CAAC;GAC7B,oBAAI,gBAAgB,UAAU;IAC7C,WAAW,GAAG,OAAO,aAAa,YAAY,4FAA4F;IAC1I;IACA,CAAC;GACc,oBAAI,wBAAwB,EAAE,CAAC;GAC/C;EACD,CAAC,EAAE,CAAC;;AASN,SAAS,WAAW,EAAE,WAAW,UAAU,GAAG,SAAS;AACtD,QAAuB,qBAAK,gBAAgB,MAAM;EACjD,aAAa;EACb,WAAW,GAAG,yaAAya,UAAU;EACjc,GAAG;EACH,UAAU,CAAiB,oBAAI,QAAQ;GACtC,WAAW;GACX,UAA0B,oBAAI,gBAAgB,eAAe,EAAE,UAA0B,oBAAI,WAAW,EAAE,WAAW,UAAU,CAAC,EAAE,CAAC;GACnI,CAAC,EAAkB,oBAAI,gBAAgB,UAAU,EAAE,UAAU,CAAC,CAAC;EAChE,CAAC;;AASH,SAAS,qBAAqB,EAAE,WAAW,GAAG,SAAS;AACtD,QAAuB,oBAAI,gBAAgB,gBAAgB;EAC1D,aAAa;EACb,WAAW,GAAG,wDAAwD,UAAU;EAChF,GAAG;EACH,UAA0B,oBAAI,eAAe,EAAE,WAAW,UAAU,CAAC;EACrE,CAAC;;AAEH,SAAS,uBAAuB,EAAE,WAAW,GAAG,SAAS;AACxD,QAAuB,oBAAI,gBAAgB,kBAAkB;EAC5D,aAAa;EACb,WAAW,GAAG,wDAAwD,UAAU;EAChF,GAAG;EACH,UAA0B,oBAAI,iBAAiB,EAAE,WAAW,UAAU,CAAC;EACvE,CAAC"}
@@ -11,4 +11,5 @@ function Skeleton({ className, ...props }) {
11
11
  }
12
12
 
13
13
  //#endregion
14
- export { Skeleton };
14
+ export { Skeleton };
15
+ //# sourceMappingURL=skeleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skeleton.js","names":[],"sources":["../../../../../../../libs/ui-kit-web/dist/ui/skeleton.js"],"sourcesContent":["import { cn } from \"./utils.js\";\nimport { jsx } from \"react/jsx-runtime\";\n\n//#region ui/skeleton.tsx\nfunction Skeleton({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\t\"data-slot\": \"skeleton\",\n\t\tclassName: cn(\"bg-accent animate-pulse rounded-md\", className),\n\t\t...props\n\t});\n}\n\n//#endregion\nexport { Skeleton };\n//# sourceMappingURL=skeleton.js.map"],"mappings":";;;;AAIA,SAAS,SAAS,EAAE,WAAW,GAAG,SAAS;AAC1C,QAAuB,oBAAI,OAAO;EACjC,aAAa;EACb,WAAW,GAAG,sCAAsC,UAAU;EAC9D,GAAG;EACH,CAAC"}
@@ -36,4 +36,5 @@ function TooltipContent({ className, sideOffset = 0, children, ...props }) {
36
36
  }
37
37
 
38
38
  //#endregion
39
- export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
39
+ export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
40
+ //# sourceMappingURL=tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltip.js","names":[],"sources":["../../../../../../../libs/ui-kit-web/dist/ui/tooltip.js"],"sourcesContent":["'use client';\n\nimport { cn } from \"../ui-kit-core/dist/utils.js\";\nimport \"react\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\n\n//#region ui/tooltip.tsx\nfunction TooltipProvider({ delayDuration = 0, ...props }) {\n\treturn /* @__PURE__ */ jsx(TooltipPrimitive.Provider, {\n\t\t\"data-slot\": \"tooltip-provider\",\n\t\tdelayDuration,\n\t\t...props\n\t});\n}\nfunction Tooltip({ ...props }) {\n\treturn /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsx(TooltipPrimitive.Root, {\n\t\t\"data-slot\": \"tooltip\",\n\t\t...props\n\t}) });\n}\nfunction TooltipTrigger({ ...props }) {\n\treturn /* @__PURE__ */ jsx(TooltipPrimitive.Trigger, {\n\t\t\"data-slot\": \"tooltip-trigger\",\n\t\t...props\n\t});\n}\nfunction TooltipContent({ className, sideOffset = 0, children, ...props }) {\n\treturn /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsxs(TooltipPrimitive.Content, {\n\t\t\"data-slot\": \"tooltip-content\",\n\t\tsideOffset,\n\t\tclassName: cn(\"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\", className),\n\t\t...props,\n\t\tchildren: [children, /* @__PURE__ */ jsx(TooltipPrimitive.Arrow, { className: \"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px]\" })]\n\t}) });\n}\n\n//#endregion\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n//# sourceMappingURL=tooltip.js.map"],"mappings":";;;;;;;;AAQA,SAAS,gBAAgB,EAAE,gBAAgB,GAAG,GAAG,SAAS;AACzD,QAAuB,oBAAI,iBAAiB,UAAU;EACrD,aAAa;EACb;EACA,GAAG;EACH,CAAC;;AAEH,SAAS,QAAQ,EAAE,GAAG,SAAS;AAC9B,QAAuB,oBAAI,iBAAiB,EAAE,UAA0B,oBAAI,iBAAiB,MAAM;EAClG,aAAa;EACb,GAAG;EACH,CAAC,EAAE,CAAC;;AAEN,SAAS,eAAe,EAAE,GAAG,SAAS;AACrC,QAAuB,oBAAI,iBAAiB,SAAS;EACpD,aAAa;EACb,GAAG;EACH,CAAC;;AAEH,SAAS,eAAe,EAAE,WAAW,aAAa,GAAG,UAAU,GAAG,SAAS;AAC1E,QAAuB,oBAAI,iBAAiB,QAAQ,EAAE,UAA0B,qBAAK,iBAAiB,SAAS;EAC9G,aAAa;EACb;EACA,WAAW,GAAG,qaAAqa,UAAU;EAC7b,GAAG;EACH,UAAU,CAAC,UAA0B,oBAAI,iBAAiB,OAAO,EAAE,WAAW,oGAAoG,CAAC,CAAC;EACpL,CAAC,EAAE,CAAC"}
@@ -7,4 +7,5 @@ function cn(...inputs) {
7
7
  }
8
8
 
9
9
  //#endregion
10
- export { cn };
10
+ export { cn };
11
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../../../../libs/ui-kit-web/dist/ui/utils.js"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n//#region ui/utils.ts\nfunction cn(...inputs) {\n\treturn twMerge(clsx(inputs));\n}\n\n//#endregion\nexport { cn };\n//# sourceMappingURL=utils.js.map"],"mappings":";;;;AAIA,SAAS,GAAG,GAAG,QAAQ;AACtB,QAAO,QAAQ,KAAK,OAAO,CAAC"}
@@ -7,4 +7,5 @@ function cn(...inputs) {
7
7
  }
8
8
 
9
9
  //#endregion
10
- export { cn };
10
+ export { cn };
11
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../../../../../../../libs/ui-kit-web/dist/ui-kit-core/dist/utils.js"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n//#region ../ui-kit-core/dist/utils.js\nfunction cn(...inputs) {\n\treturn twMerge(clsx(inputs));\n}\n\n//#endregion\nexport { cn };\n//# sourceMappingURL=utils.js.map"],"mappings":";;;;AAIA,SAAS,GAAG,GAAG,QAAQ;AACtB,QAAO,QAAQ,KAAK,OAAO,CAAC"}
@@ -17,4 +17,5 @@ declare function ChatContainer({
17
17
  showScrollButton
18
18
  }: ChatContainerProps): react_jsx_runtime0.JSX.Element;
19
19
  //#endregion
20
- export { ChatContainer };
20
+ export { ChatContainer };
21
+ //# sourceMappingURL=ChatContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatContainer.d.ts","names":[],"sources":["../../../src/presentation/components/ChatContainer.tsx"],"sourcesContent":[],"mappings":";;;;UAMiB,kBAAA;YACL,KAAA,CAAM;;EADD;EAUD,gBAAa,CAAA,EAAA,OAAA;;;;;AAIR,iBAJL,aAAA,CAIK;EAAA,QAAA;EAAA,SAAA;EAAA;AAAA,CAAA,EAAlB,kBAAkB,CAAA,EAAA,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -59,4 +59,5 @@ function ChatContainer({ children, className, showScrollButton = true }) {
59
59
  }
60
60
 
61
61
  //#endregion
62
- export { ChatContainer };
62
+ export { ChatContainer };
63
+ //# sourceMappingURL=ChatContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatContainer.js","names":[],"sources":["../../../src/presentation/components/ChatContainer.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { ScrollArea } from '@lssm/lib.ui-kit-web/ui/scroll-area';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nexport interface ChatContainerProps {\n children: React.ReactNode;\n className?: string;\n /** Show scroll-to-bottom button when scrolled up */\n showScrollButton?: boolean;\n}\n\n/**\n * Container component for chat messages with scrolling\n */\nexport function ChatContainer({\n children,\n className,\n showScrollButton = true,\n}: ChatContainerProps) {\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [showScrollDown, setShowScrollDown] = React.useState(false);\n\n // Auto-scroll to bottom when children change\n React.useEffect(() => {\n const container = scrollRef.current;\n if (!container) return;\n\n // Check if user has scrolled up\n const isAtBottom =\n container.scrollHeight - container.scrollTop <=\n container.clientHeight + 100;\n\n if (isAtBottom) {\n container.scrollTop = container.scrollHeight;\n }\n }, [children]);\n\n // Track scroll position for scroll-to-bottom button\n const handleScroll = React.useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n const container = event.currentTarget;\n const isAtBottom =\n container.scrollHeight - container.scrollTop <=\n container.clientHeight + 100;\n setShowScrollDown(!isAtBottom);\n },\n []\n );\n\n const scrollToBottom = React.useCallback(() => {\n const container = scrollRef.current;\n if (container) {\n container.scrollTo({\n top: container.scrollHeight,\n behavior: 'smooth',\n });\n }\n }, []);\n\n return (\n <div className={cn('relative flex flex-1 flex-col', className)}>\n <ScrollArea ref={scrollRef} className=\"flex-1\" onScroll={handleScroll}>\n <div className=\"flex flex-col gap-4 p-4\">{children}</div>\n </ScrollArea>\n\n {showScrollButton && showScrollDown && (\n <button\n onClick={scrollToBottom}\n className={cn(\n 'absolute bottom-4 left-1/2 -translate-x-1/2',\n 'bg-primary text-primary-foreground',\n 'rounded-full px-3 py-1.5 text-sm font-medium shadow-lg',\n 'hover:bg-primary/90 transition-colors',\n 'flex items-center gap-1.5'\n )}\n aria-label=\"Scroll to bottom\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n New messages\n </button>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AAgBA,SAAgB,cAAc,EAC5B,UACA,WACA,mBAAmB,QACE;CACrB,MAAM,YAAY,MAAM,OAAuB,KAAK;CACpD,MAAM,CAAC,gBAAgB,qBAAqB,MAAM,SAAS,MAAM;AAGjE,OAAM,gBAAgB;EACpB,MAAM,YAAY,UAAU;AAC5B,MAAI,CAAC,UAAW;AAOhB,MAHE,UAAU,eAAe,UAAU,aACnC,UAAU,eAAe,IAGzB,WAAU,YAAY,UAAU;IAEjC,CAAC,SAAS,CAAC;CAGd,MAAM,eAAe,MAAM,aACxB,UAAyC;EACxC,MAAM,YAAY,MAAM;AAIxB,oBAAkB,EAFhB,UAAU,eAAe,UAAU,aACnC,UAAU,eAAe,KACG;IAEhC,EAAE,CACH;CAED,MAAM,iBAAiB,MAAM,kBAAkB;EAC7C,MAAM,YAAY,UAAU;AAC5B,MAAI,UACF,WAAU,SAAS;GACjB,KAAK,UAAU;GACf,UAAU;GACX,CAAC;IAEH,EAAE,CAAC;AAEN,QACE,qBAAC;EAAI,WAAW,GAAG,iCAAiC,UAAU;aAC5D,oBAAC;GAAW,KAAK;GAAW,WAAU;GAAS,UAAU;aACvD,oBAAC;IAAI,WAAU;IAA2B;KAAe;IAC9C,EAEZ,oBAAoB,kBACnB,qBAAC;GACC,SAAS;GACT,WAAW,GACT,+CACA,sCACA,0DACA,yCACA,4BACD;GACD,cAAW;cAEX,oBAAC;IACC,OAAM;IACN,OAAM;IACN,QAAO;IACP,SAAQ;IACR,MAAK;IACL,QAAO;IACP,aAAY;IACZ,eAAc;IACd,gBAAe;cAEf,oBAAC,UAAK,GAAE,iBAAiB;KACrB;IAEC;GAEP"}
@@ -1,5 +1,5 @@
1
1
  import { ChatAttachment } from "../../core/message-types.js";
2
- import * as react_jsx_runtime1 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime2 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/presentation/components/ChatInput.d.ts
5
5
  interface ChatInputProps {
@@ -29,6 +29,7 @@ declare function ChatInput({
29
29
  className,
30
30
  showAttachments,
31
31
  maxAttachments
32
- }: ChatInputProps): react_jsx_runtime1.JSX.Element;
32
+ }: ChatInputProps): react_jsx_runtime2.JSX.Element;
33
33
  //#endregion
34
- export { ChatInput };
34
+ export { ChatInput };
35
+ //# sourceMappingURL=ChatInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatInput.d.ts","names":[],"sources":["../../../src/presentation/components/ChatInput.tsx"],"sourcesContent":[],"mappings":";;;;UASiB,cAAA;;0CAEyB;EAFzB;EAoBD,QAAA,CAAA,EAAA,OAAS;EACvB;EACA,SAAA,CAAA,EAAA,OAAA;EACA;EACA,WAAA,CAAA,EAAA,MAAA;EACA;EACA,SAAA,CAAA,EAAA,MAAA;EACA;EACC,eAAA,CAAA,EAAA,OAAA;EAAc;EAAA,cAAA,CAAA,EAAA,MAAA;;;;;iBARD,SAAA;;;;;;;;GAQb,iBAAc,kBAAA,CAAA,GAAA,CAAA"}
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
 
3
3
  import { cn } from "../../libs/ui-kit-web/dist/ui/utils.js";
4
- import { Button$1 } from "../../libs/design-system/dist/components/atoms/Button.js";
5
- import { Textarea$1 } from "../../libs/design-system/dist/components/atoms/Textarea.js";
4
+ import { Button } from "../../libs/design-system/dist/components/atoms/Button.js";
5
+ import { Textarea } from "../../libs/design-system/dist/components/atoms/Textarea.js";
6
6
  import * as React from "react";
7
7
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
8
  import { Code, FileText, Loader2, Paperclip, Send, X } from "lucide-react";
@@ -106,7 +106,7 @@ function ChatInput({ onSend, disabled = false, isLoading = false, placeholder =
106
106
  onChange: handleFileSelect,
107
107
  className: "hidden",
108
108
  "aria-label": "Attach files"
109
- }), /* @__PURE__ */ jsx(Button$1, {
109
+ }), /* @__PURE__ */ jsx(Button, {
110
110
  type: "button",
111
111
  variant: "ghost",
112
112
  size: "sm",
@@ -117,18 +117,18 @@ function ChatInput({ onSend, disabled = false, isLoading = false, placeholder =
117
117
  })] }),
118
118
  /* @__PURE__ */ jsx("div", {
119
119
  className: "relative flex-1",
120
- children: /* @__PURE__ */ jsx(Textarea$1, {
120
+ children: /* @__PURE__ */ jsx(Textarea, {
121
121
  value: content,
122
122
  onChange: (e) => setContent(e.target.value),
123
123
  onKeyDown: handleKeyDown,
124
124
  placeholder,
125
125
  disabled,
126
- className: cn("min-h-[44px] max-h-[200px] resize-none pr-12", "focus-visible:ring-1"),
126
+ className: cn("max-h-[200px] min-h-[44px] resize-none pr-12", "focus-visible:ring-1"),
127
127
  rows: 1,
128
128
  "aria-label": "Chat message"
129
129
  })
130
130
  }),
131
- /* @__PURE__ */ jsx(Button$1, {
131
+ /* @__PURE__ */ jsx(Button, {
132
132
  type: "submit",
133
133
  disabled: !canSend || disabled || isLoading,
134
134
  size: "sm",
@@ -146,4 +146,5 @@ function ChatInput({ onSend, disabled = false, isLoading = false, placeholder =
146
146
  }
147
147
 
148
148
  //#endregion
149
- export { ChatInput };
149
+ export { ChatInput };
150
+ //# sourceMappingURL=ChatInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatInput.js","names":["newAttachments: ChatAttachment[]","content"],"sources":["../../../src/presentation/components/ChatInput.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport { Textarea } from '@lssm/lib.design-system';\nimport { Button } from '@lssm/lib.design-system';\nimport { Send, Paperclip, X, Loader2, FileText, Code } from 'lucide-react';\nimport type { ChatAttachment } from '../../core/message-types';\n\nexport interface ChatInputProps {\n /** Called when a message is sent */\n onSend: (content: string, attachments?: ChatAttachment[]) => void;\n /** Whether input is disabled (e.g., during streaming) */\n disabled?: boolean;\n /** Whether currently loading/streaming */\n isLoading?: boolean;\n /** Placeholder text */\n placeholder?: string;\n /** Additional class name */\n className?: string;\n /** Show attachment button */\n showAttachments?: boolean;\n /** Max attachments allowed */\n maxAttachments?: number;\n}\n\n/**\n * Chat input component with attachment support\n */\nexport function ChatInput({\n onSend,\n disabled = false,\n isLoading = false,\n placeholder = 'Type a message...',\n className,\n showAttachments = true,\n maxAttachments = 5,\n}: ChatInputProps) {\n const [content, setContent] = React.useState('');\n const [attachments, setAttachments] = React.useState<ChatAttachment[]>([]);\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n\n const canSend = content.trim().length > 0 || attachments.length > 0;\n\n const handleSubmit = React.useCallback(\n (e?: React.FormEvent) => {\n e?.preventDefault();\n if (!canSend || disabled || isLoading) return;\n\n onSend(content.trim(), attachments.length > 0 ? attachments : undefined);\n setContent('');\n setAttachments([]);\n\n // Focus back on textarea\n textareaRef.current?.focus();\n },\n [canSend, content, attachments, disabled, isLoading, onSend]\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n // Submit on Enter (without Shift)\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit]\n );\n\n const handleFileSelect = React.useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files) return;\n\n const newAttachments: ChatAttachment[] = [];\n\n for (const file of Array.from(files)) {\n if (attachments.length + newAttachments.length >= maxAttachments) break;\n\n const content = await file.text();\n const extension = file.name.split('.').pop()?.toLowerCase() ?? '';\n const isCode = [\n 'ts',\n 'tsx',\n 'js',\n 'jsx',\n 'py',\n 'go',\n 'rs',\n 'java',\n ].includes(extension);\n\n newAttachments.push({\n id: `att_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,\n type: isCode ? 'code' : 'file',\n name: file.name,\n content,\n mimeType: file.type,\n size: file.size,\n });\n }\n\n setAttachments((prev) => [...prev, ...newAttachments]);\n\n // Reset file input\n e.target.value = '';\n },\n [attachments.length, maxAttachments]\n );\n\n const removeAttachment = React.useCallback((id: string) => {\n setAttachments((prev) => prev.filter((a) => a.id !== id));\n }, []);\n\n return (\n <div className={cn('flex flex-col gap-2', className)}>\n {/* Attachments preview */}\n {attachments.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {attachments.map((attachment) => (\n <div\n key={attachment.id}\n className={cn(\n 'flex items-center gap-1.5 rounded-md px-2 py-1',\n 'bg-muted text-muted-foreground text-sm'\n )}\n >\n {attachment.type === 'code' ? (\n <Code className=\"h-3.5 w-3.5\" />\n ) : (\n <FileText className=\"h-3.5 w-3.5\" />\n )}\n <span className=\"max-w-[150px] truncate\">{attachment.name}</span>\n <button\n type=\"button\"\n onClick={() => removeAttachment(attachment.id)}\n className=\"hover:text-foreground\"\n aria-label={`Remove ${attachment.name}`}\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Input form */}\n <form onSubmit={handleSubmit} className=\"flex items-end gap-2\">\n {/* Attachment button */}\n {showAttachments && (\n <>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept=\".ts,.tsx,.js,.jsx,.json,.md,.txt,.py,.go,.rs,.java,.yaml,.yml\"\n onChange={handleFileSelect}\n className=\"hidden\"\n aria-label=\"Attach files\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => fileInputRef.current?.click()}\n disabled={disabled || attachments.length >= maxAttachments}\n aria-label=\"Attach files\"\n >\n <Paperclip className=\"h-4 w-4\" />\n </Button>\n </>\n )}\n\n {/* Text input */}\n <div className=\"relative flex-1\">\n <Textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n className={cn(\n 'max-h-[200px] min-h-[44px] resize-none pr-12',\n 'focus-visible:ring-1'\n )}\n rows={1}\n aria-label=\"Chat message\"\n />\n </div>\n\n {/* Send button */}\n <Button\n type=\"submit\"\n disabled={!canSend || disabled || isLoading}\n size=\"sm\"\n aria-label={isLoading ? 'Sending...' : 'Send message'}\n >\n {isLoading ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n </Button>\n </form>\n\n {/* Helper text */}\n <p className=\"text-muted-foreground text-xs\">\n Press Enter to send, Shift+Enter for new line\n </p>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import { ChatMessage } from "../../core/message-types.js";
2
- import * as react_jsx_runtime0 from "react/jsx-runtime";
1
+ import { ChatMessage as ChatMessage$1 } from "../../core/message-types.js";
2
+ import * as react_jsx_runtime1 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/presentation/components/ChatMessage.d.ts
5
5
  interface ChatMessageProps {
6
- message: ChatMessage;
6
+ message: ChatMessage$1;
7
7
  className?: string;
8
8
  /** Show copy button */
9
9
  showCopy?: boolean;
@@ -13,11 +13,12 @@ interface ChatMessageProps {
13
13
  /**
14
14
  * Chat message component
15
15
  */
16
- declare function ChatMessage$1({
16
+ declare function ChatMessage({
17
17
  message,
18
18
  className,
19
19
  showCopy,
20
20
  showAvatar
21
- }: ChatMessageProps): react_jsx_runtime0.JSX.Element;
21
+ }: ChatMessageProps): react_jsx_runtime1.JSX.Element;
22
22
  //#endregion
23
- export { ChatMessage$1 as ChatMessage };
23
+ export { ChatMessage };
24
+ //# sourceMappingURL=ChatMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatMessage.d.ts","names":[],"sources":["../../../src/presentation/components/ChatMessage.tsx"],"sourcesContent":[],"mappings":";;;;UAWiB,gBAAA;WACN;;EADM;EA+ED,QAAA,CAAA,EAAA,OAAW;EACzB;EACA,UAAA,CAAA,EAAA,OAAA;;;;;AAGiB,iBALH,WAAA,CAKG;EAAA,OAAA;EAAA,SAAA;EAAA,QAAA;EAAA;AAAA,CAAA,EAAhB,gBAAgB,CAAA,EAAA,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -3,7 +3,7 @@
3
3
  import { cn } from "../../libs/ui-kit-web/dist/ui/utils.js";
4
4
  import { Avatar, AvatarFallback } from "../../libs/ui-kit-web/dist/ui/avatar.js";
5
5
  import { Skeleton } from "../../libs/ui-kit-web/dist/ui/skeleton.js";
6
- import { Button$1 } from "../../libs/design-system/dist/components/atoms/Button.js";
6
+ import { Button } from "../../libs/design-system/dist/components/atoms/Button.js";
7
7
  import { CodePreview } from "./CodePreview.js";
8
8
  import * as React from "react";
9
9
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -103,7 +103,7 @@ function ChatMessage({ message, className, showCopy = true, showAvatar = true })
103
103
  minute: "2-digit"
104
104
  }) }),
105
105
  message.usage && /* @__PURE__ */ jsxs("span", { children: [message.usage.inputTokens + message.usage.outputTokens, " tokens"] }),
106
- showCopy && !isUser && message.content && /* @__PURE__ */ jsx(Button$1, {
106
+ showCopy && !isUser && message.content && /* @__PURE__ */ jsx(Button, {
107
107
  variant: "ghost",
108
108
  size: "sm",
109
109
  className: "h-6 w-6 p-0",
@@ -132,4 +132,5 @@ function ChatMessage({ message, className, showCopy = true, showAvatar = true })
132
132
  }
133
133
 
134
134
  //#endregion
135
- export { ChatMessage };
135
+ export { ChatMessage };
136
+ //# sourceMappingURL=ChatMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatMessage.js","names":["blocks: { language: string; code: string; raw: string }[]","parts: React.ReactNode[]"],"sources":["../../../src/presentation/components/ChatMessage.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport { Avatar, AvatarFallback } from '@lssm/lib.ui-kit-web/ui/avatar';\nimport { Skeleton } from '@lssm/lib.ui-kit-web/ui/skeleton';\nimport { Bot, User, AlertCircle, Copy, Check } from 'lucide-react';\nimport { Button } from '@lssm/lib.design-system';\nimport type { ChatMessage as ChatMessageType } from '../../core/message-types';\nimport { CodePreview } from './CodePreview';\n\nexport interface ChatMessageProps {\n message: ChatMessageType;\n className?: string;\n /** Show copy button */\n showCopy?: boolean;\n /** Show avatar */\n showAvatar?: boolean;\n}\n\n/**\n * Extract code blocks from message content\n */\nfunction extractCodeBlocks(\n content: string\n): { language: string; code: string; raw: string }[] {\n const codeBlockRegex = /```(\\w+)?\\n([\\s\\S]*?)```/g;\n const blocks: { language: string; code: string; raw: string }[] = [];\n let match;\n\n while ((match = codeBlockRegex.exec(content)) !== null) {\n blocks.push({\n language: match[1] ?? 'text',\n code: match[2] ?? '',\n raw: match[0],\n });\n }\n\n return blocks;\n}\n\n/**\n * Render message content with code blocks\n */\nfunction MessageContent({ content }: { content: string }) {\n const codeBlocks = extractCodeBlocks(content);\n\n if (codeBlocks.length === 0) {\n return <p className=\"whitespace-pre-wrap\">{content}</p>;\n }\n\n // Split content by code blocks and render\n let remaining = content;\n const parts: React.ReactNode[] = [];\n let key = 0;\n\n for (const block of codeBlocks) {\n const [before, after] = remaining.split(block.raw);\n if (before) {\n parts.push(\n <p key={key++} className=\"whitespace-pre-wrap\">\n {before.trim()}\n </p>\n );\n }\n parts.push(\n <CodePreview\n key={key++}\n code={block.code}\n language={block.language}\n className=\"my-2\"\n />\n );\n remaining = after ?? '';\n }\n\n if (remaining.trim()) {\n parts.push(\n <p key={key++} className=\"whitespace-pre-wrap\">\n {remaining.trim()}\n </p>\n );\n }\n\n return <>{parts}</>;\n}\n\n/**\n * Chat message component\n */\nexport function ChatMessage({\n message,\n className,\n showCopy = true,\n showAvatar = true,\n}: ChatMessageProps) {\n const [copied, setCopied] = React.useState(false);\n\n const isUser = message.role === 'user';\n const isError = message.status === 'error';\n const isStreaming = message.status === 'streaming';\n\n const handleCopy = React.useCallback(async () => {\n await navigator.clipboard.writeText(message.content);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [message.content]);\n\n return (\n <div\n className={cn(\n 'group flex gap-3',\n isUser && 'flex-row-reverse',\n className\n )}\n >\n {showAvatar && (\n <Avatar className=\"h-8 w-8 shrink-0\">\n <AvatarFallback\n className={cn(\n isUser ? 'bg-primary text-primary-foreground' : 'bg-muted'\n )}\n >\n {isUser ? (\n <User className=\"h-4 w-4\" />\n ) : (\n <Bot className=\"h-4 w-4\" />\n )}\n </AvatarFallback>\n </Avatar>\n )}\n\n <div\n className={cn('flex max-w-[80%] flex-col gap-1', isUser && 'items-end')}\n >\n <div\n className={cn(\n 'rounded-2xl px-4 py-2',\n isUser\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted text-foreground',\n isError && 'border-destructive bg-destructive/10 border'\n )}\n >\n {isError && message.error ? (\n <div className=\"flex items-start gap-2\">\n <AlertCircle className=\"text-destructive mt-0.5 h-4 w-4 shrink-0\" />\n <div>\n <p className=\"text-destructive font-medium\">\n {message.error.code}\n </p>\n <p className=\"text-muted-foreground text-sm\">\n {message.error.message}\n </p>\n </div>\n </div>\n ) : isStreaming && !message.content ? (\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-4 w-48\" />\n <Skeleton className=\"h-4 w-32\" />\n </div>\n ) : (\n <MessageContent content={message.content} />\n )}\n </div>\n\n {/* Message meta */}\n <div\n className={cn(\n 'flex items-center gap-2 text-xs',\n 'text-muted-foreground opacity-0 transition-opacity',\n 'group-hover:opacity-100'\n )}\n >\n <span>\n {new Date(message.createdAt).toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n })}\n </span>\n\n {message.usage && (\n <span>\n {message.usage.inputTokens + message.usage.outputTokens} tokens\n </span>\n )}\n\n {showCopy && !isUser && message.content && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 p-0\"\n onPress={handleCopy}\n aria-label={copied ? 'Copied' : 'Copy message'}\n >\n {copied ? (\n <Check className=\"h-3 w-3\" />\n ) : (\n <Copy className=\"h-3 w-3\" />\n )}\n </Button>\n )}\n </div>\n\n {/* Reasoning (for models that support it) */}\n {message.reasoning && (\n <details className=\"text-muted-foreground mt-2 text-sm\">\n <summary className=\"cursor-pointer hover:underline\">\n View reasoning\n </summary>\n <div className=\"bg-muted mt-1 rounded-md p-2\">\n <p className=\"whitespace-pre-wrap\">{message.reasoning}</p>\n </div>\n </details>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime3 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
2
2
 
3
3
  //#region src/presentation/components/CodePreview.d.ts
4
4
  interface CodePreviewProps {
@@ -34,6 +34,7 @@ declare function CodePreview({
34
34
  onExecute,
35
35
  showDownload,
36
36
  maxHeight
37
- }: CodePreviewProps): react_jsx_runtime3.JSX.Element;
37
+ }: CodePreviewProps): react_jsx_runtime0.JSX.Element;
38
38
  //#endregion
39
- export { CodePreview };
39
+ export { CodePreview };
40
+ //# sourceMappingURL=CodePreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodePreview.d.ts","names":[],"sources":["../../../src/presentation/components/CodePreview.tsx"],"sourcesContent":[],"mappings":";;;UAOiB,gBAAA;;;EAAA;EAgDD,QAAA,CAAA,EAAA,MAAW;EACzB;EACA,QAAA,CAAA,EAAA,MAAA;EACA;EACA,SAAA,CAAA,EAAA,MAAA;EACA;EACA,QAAA,CAAA,EAAA,OAAA;EACA;EACA,WAAA,CAAA,EAAA,OAAA;EACA;EACC,SAAA,CAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,IAAA;EAAgB;EAAA,YAAA,CAAA,EAAA,OAAA;;;;;;;iBAVH,WAAA;;;;;;;;;;GAUb,mBAAgB,kBAAA,CAAA,GAAA,CAAA"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { cn } from "../../libs/ui-kit-web/dist/ui/utils.js";
4
- import { Button$1 } from "../../libs/design-system/dist/components/atoms/Button.js";
4
+ import { Button } from "../../libs/design-system/dist/components/atoms/Button.js";
5
5
  import * as React from "react";
6
6
  import { jsx, jsxs } from "react/jsx-runtime";
7
7
  import { Check, Copy, Download, Play } from "lucide-react";
@@ -60,7 +60,7 @@ function CodePreview({ code, language = "text", filename, className, showCopy =
60
60
  return /* @__PURE__ */ jsxs("div", {
61
61
  className: cn("overflow-hidden rounded-lg border", "bg-muted/50", className),
62
62
  children: [/* @__PURE__ */ jsxs("div", {
63
- className: cn("flex items-center justify-between px-3 py-1.5", "border-b bg-muted/80"),
63
+ className: cn("flex items-center justify-between px-3 py-1.5", "bg-muted/80 border-b"),
64
64
  children: [/* @__PURE__ */ jsxs("div", {
65
65
  className: "flex items-center gap-2 text-sm",
66
66
  children: [filename && /* @__PURE__ */ jsx("span", {
@@ -73,7 +73,7 @@ function CodePreview({ code, language = "text", filename, className, showCopy =
73
73
  }), /* @__PURE__ */ jsxs("div", {
74
74
  className: "flex items-center gap-1",
75
75
  children: [
76
- showExecute && onExecute && /* @__PURE__ */ jsx(Button$1, {
76
+ showExecute && onExecute && /* @__PURE__ */ jsx(Button, {
77
77
  variant: "ghost",
78
78
  size: "sm",
79
79
  onPress: () => onExecute(code),
@@ -81,7 +81,7 @@ function CodePreview({ code, language = "text", filename, className, showCopy =
81
81
  "aria-label": "Execute code",
82
82
  children: /* @__PURE__ */ jsx(Play, { className: "h-3.5 w-3.5" })
83
83
  }),
84
- showDownload && /* @__PURE__ */ jsx(Button$1, {
84
+ showDownload && /* @__PURE__ */ jsx(Button, {
85
85
  variant: "ghost",
86
86
  size: "sm",
87
87
  onPress: handleDownload,
@@ -89,7 +89,7 @@ function CodePreview({ code, language = "text", filename, className, showCopy =
89
89
  "aria-label": "Download code",
90
90
  children: /* @__PURE__ */ jsx(Download, { className: "h-3.5 w-3.5" })
91
91
  }),
92
- showCopy && /* @__PURE__ */ jsx(Button$1, {
92
+ showCopy && /* @__PURE__ */ jsx(Button, {
93
93
  variant: "ghost",
94
94
  size: "sm",
95
95
  onPress: handleCopy,
@@ -109,7 +109,7 @@ function CodePreview({ code, language = "text", filename, className, showCopy =
109
109
  children: lines.map((line, i) => /* @__PURE__ */ jsxs("div", {
110
110
  className: "flex",
111
111
  children: [/* @__PURE__ */ jsx("span", {
112
- className: "text-muted-foreground mr-4 select-none text-right w-8",
112
+ className: "text-muted-foreground mr-4 w-8 text-right select-none",
113
113
  children: i + 1
114
114
  }), /* @__PURE__ */ jsx("span", {
115
115
  className: "flex-1",
@@ -123,4 +123,5 @@ function CodePreview({ code, language = "text", filename, className, showCopy =
123
123
  }
124
124
 
125
125
  //#endregion
126
- export { CodePreview };
126
+ export { CodePreview };
127
+ //# sourceMappingURL=CodePreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodePreview.js","names":["LANGUAGE_NAMES: Record<string, string>"],"sources":["../../../src/presentation/components/CodePreview.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport { Button } from '@lssm/lib.design-system';\nimport { Copy, Check, Play, Download } from 'lucide-react';\n\nexport interface CodePreviewProps {\n /** Code content */\n code: string;\n /** Programming language */\n language?: string;\n /** File name */\n filename?: string;\n /** Additional class name */\n className?: string;\n /** Show copy button */\n showCopy?: boolean;\n /** Show execute button (for applicable languages) */\n showExecute?: boolean;\n /** Called when execute is clicked */\n onExecute?: (code: string) => void;\n /** Show download button */\n showDownload?: boolean;\n /** Max height before scroll */\n maxHeight?: number;\n}\n\n/**\n * Language display names\n */\nconst LANGUAGE_NAMES: Record<string, string> = {\n ts: 'TypeScript',\n tsx: 'TypeScript (React)',\n typescript: 'TypeScript',\n js: 'JavaScript',\n jsx: 'JavaScript (React)',\n javascript: 'JavaScript',\n json: 'JSON',\n md: 'Markdown',\n yaml: 'YAML',\n yml: 'YAML',\n bash: 'Bash',\n sh: 'Shell',\n sql: 'SQL',\n py: 'Python',\n python: 'Python',\n go: 'Go',\n rust: 'Rust',\n rs: 'Rust',\n};\n\n/**\n * Code preview component with syntax highlighting placeholder\n */\nexport function CodePreview({\n code,\n language = 'text',\n filename,\n className,\n showCopy = true,\n showExecute = false,\n onExecute,\n showDownload = false,\n maxHeight = 400,\n}: CodePreviewProps) {\n const [copied, setCopied] = React.useState(false);\n\n const displayLanguage = LANGUAGE_NAMES[language.toLowerCase()] ?? language;\n const lines = code.split('\\n');\n\n const handleCopy = React.useCallback(async () => {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [code]);\n\n const handleDownload = React.useCallback(() => {\n const blob = new Blob([code], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename ?? `code.${language}`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }, [code, filename, language]);\n\n return (\n <div\n className={cn(\n 'overflow-hidden rounded-lg border',\n 'bg-muted/50',\n className\n )}\n >\n {/* Header */}\n <div\n className={cn(\n 'flex items-center justify-between px-3 py-1.5',\n 'bg-muted/80 border-b'\n )}\n >\n <div className=\"flex items-center gap-2 text-sm\">\n {filename && (\n <span className=\"text-foreground font-mono\">{filename}</span>\n )}\n <span className=\"text-muted-foreground\">{displayLanguage}</span>\n </div>\n\n <div className=\"flex items-center gap-1\">\n {showExecute && onExecute && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => onExecute(code)}\n className=\"h-7 w-7 p-0\"\n aria-label=\"Execute code\"\n >\n <Play className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n\n {showDownload && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={handleDownload}\n className=\"h-7 w-7 p-0\"\n aria-label=\"Download code\"\n >\n <Download className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n\n {showCopy && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={handleCopy}\n className=\"h-7 w-7 p-0\"\n aria-label={copied ? 'Copied' : 'Copy code'}\n >\n {copied ? (\n <Check className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <Copy className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n )}\n </div>\n </div>\n\n {/* Code content */}\n <div className=\"overflow-auto\" style={{ maxHeight }}>\n <pre className=\"p-3\">\n <code className=\"text-sm\">\n {lines.map((line, i) => (\n <div key={i} className=\"flex\">\n <span className=\"text-muted-foreground mr-4 w-8 text-right select-none\">\n {i + 1}\n </span>\n <span className=\"flex-1\">{line || ' '}</span>\n </div>\n ))}\n </code>\n </pre>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AA+BA,MAAMA,iBAAyC;CAC7C,IAAI;CACJ,KAAK;CACL,YAAY;CACZ,IAAI;CACJ,KAAK;CACL,YAAY;CACZ,MAAM;CACN,IAAI;CACJ,MAAM;CACN,KAAK;CACL,MAAM;CACN,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,QAAQ;CACR,IAAI;CACJ,MAAM;CACN,IAAI;CACL;;;;AAKD,SAAgB,YAAY,EAC1B,MACA,WAAW,QACX,UACA,WACA,WAAW,MACX,cAAc,OACd,WACA,eAAe,OACf,YAAY,OACO;CACnB,MAAM,CAAC,QAAQ,aAAa,MAAM,SAAS,MAAM;CAEjD,MAAM,kBAAkB,eAAe,SAAS,aAAa,KAAK;CAClE,MAAM,QAAQ,KAAK,MAAM,KAAK;CAE9B,MAAM,aAAa,MAAM,YAAY,YAAY;AAC/C,QAAM,UAAU,UAAU,UAAU,KAAK;AACzC,YAAU,KAAK;AACf,mBAAiB,UAAU,MAAM,EAAE,IAAK;IACvC,CAAC,KAAK,CAAC;CAEV,MAAM,iBAAiB,MAAM,kBAAkB;EAC7C,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,cAAc,CAAC;EACrD,MAAM,MAAM,IAAI,gBAAgB,KAAK;EACrC,MAAM,IAAI,SAAS,cAAc,IAAI;AACrC,IAAE,OAAO;AACT,IAAE,WAAW,YAAY,QAAQ;AACjC,WAAS,KAAK,YAAY,EAAE;AAC5B,IAAE,OAAO;AACT,WAAS,KAAK,YAAY,EAAE;AAC5B,MAAI,gBAAgB,IAAI;IACvB;EAAC;EAAM;EAAU;EAAS,CAAC;AAE9B,QACE,qBAAC;EACC,WAAW,GACT,qCACA,eACA,UACD;aAGD,qBAAC;GACC,WAAW,GACT,iDACA,uBACD;cAED,qBAAC;IAAI,WAAU;eACZ,YACC,oBAAC;KAAK,WAAU;eAA6B;MAAgB,EAE/D,oBAAC;KAAK,WAAU;eAAyB;MAAuB;KAC5D,EAEN,qBAAC;IAAI,WAAU;;KACZ,eAAe,aACd,oBAAC;MACC,SAAQ;MACR,MAAK;MACL,eAAe,UAAU,KAAK;MAC9B,WAAU;MACV,cAAW;gBAEX,oBAAC,QAAK,WAAU,gBAAgB;OACzB;KAGV,gBACC,oBAAC;MACC,SAAQ;MACR,MAAK;MACL,SAAS;MACT,WAAU;MACV,cAAW;gBAEX,oBAAC,YAAS,WAAU,gBAAgB;OAC7B;KAGV,YACC,oBAAC;MACC,SAAQ;MACR,MAAK;MACL,SAAS;MACT,WAAU;MACV,cAAY,SAAS,WAAW;gBAE/B,SACC,oBAAC,SAAM,WAAU,+BAA+B,GAEhD,oBAAC,QAAK,WAAU,gBAAgB;OAE3B;;KAEP;IACF,EAGN,oBAAC;GAAI,WAAU;GAAgB,OAAO,EAAE,WAAW;aACjD,oBAAC;IAAI,WAAU;cACb,oBAAC;KAAK,WAAU;eACb,MAAM,KAAK,MAAM,MAChB,qBAAC;MAAY,WAAU;iBACrB,oBAAC;OAAK,WAAU;iBACb,IAAI;QACA,EACP,oBAAC;OAAK,WAAU;iBAAU,QAAQ;QAAW;QAJrC,EAKJ,CACN;MACG;KACH;IACF;GACF"}
@@ -22,4 +22,5 @@ declare function ContextIndicator({
22
22
  showDetails
23
23
  }: ContextIndicatorProps): react_jsx_runtime4.JSX.Element;
24
24
  //#endregion
25
- export { ContextIndicator };
25
+ export { ContextIndicator };
26
+ //# sourceMappingURL=ContextIndicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextIndicator.d.ts","names":[],"sources":["../../../src/presentation/components/ContextIndicator.tsx"],"sourcesContent":[],"mappings":";;;;UAciB,qBAAA;;YAEL;EAFK;EAcD,MAAA,CAAA,EAAA,OAAA;EACd;EACA,SAAA,CAAA,EAAA,MAAA;EACA;EACA,WAAA,CAAA,EAAA,OAAA;;;;;iBAJc,gBAAA;;;;;GAKb,wBAAqB,kBAAA,CAAA,GAAA,CAAA"}
@@ -93,4 +93,5 @@ function ContextIndicator({ summary, active = false, className, showDetails = tr
93
93
  }
94
94
 
95
95
  //#endregion
96
- export { ContextIndicator };
96
+ export { ContextIndicator };
97
+ //# sourceMappingURL=ContextIndicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextIndicator.js","names":[],"sources":["../../../src/presentation/components/ContextIndicator.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport { Badge } from '@lssm/lib.ui-kit-web/ui/badge';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@lssm/lib.ui-kit-web/ui/tooltip';\nimport { FolderOpen, FileCode, Zap, Info } from 'lucide-react';\nimport type { WorkspaceSummary } from '../../context/workspace-context';\n\nexport interface ContextIndicatorProps {\n /** Workspace summary */\n summary?: WorkspaceSummary;\n /** Whether context is active */\n active?: boolean;\n /** Additional class name */\n className?: string;\n /** Show details */\n showDetails?: boolean;\n}\n\n/**\n * Indicator showing active workspace context\n */\nexport function ContextIndicator({\n summary,\n active = false,\n className,\n showDetails = true,\n}: ContextIndicatorProps) {\n if (!summary && !active) {\n return (\n <div\n className={cn(\n 'flex items-center gap-1.5 text-sm',\n 'text-muted-foreground',\n className\n )}\n >\n <Info className=\"h-4 w-4\" />\n <span>No workspace context</span>\n </div>\n );\n }\n\n const content = (\n <div\n className={cn(\n 'flex items-center gap-2',\n active ? 'text-foreground' : 'text-muted-foreground',\n className\n )}\n >\n <Badge\n variant={active ? 'default' : 'secondary'}\n className=\"flex items-center gap-1\"\n >\n <Zap className=\"h-3 w-3\" />\n Context\n </Badge>\n\n {summary && showDetails && (\n <>\n <div className=\"flex items-center gap-1 text-xs\">\n <FolderOpen className=\"h-3.5 w-3.5\" />\n <span>{summary.name}</span>\n </div>\n\n <div className=\"flex items-center gap-1 text-xs\">\n <FileCode className=\"h-3.5 w-3.5\" />\n <span>{summary.specs.total} specs</span>\n </div>\n </>\n )}\n </div>\n );\n\n if (!summary) {\n return content;\n }\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent side=\"bottom\" className=\"max-w-[300px]\">\n <div className=\"flex flex-col gap-2 text-sm\">\n <div className=\"font-medium\">{summary.name}</div>\n <div className=\"text-muted-foreground text-xs\">{summary.path}</div>\n\n <div className=\"border-t pt-2\">\n <div className=\"grid grid-cols-2 gap-1 text-xs\">\n <span>Commands:</span>\n <span className=\"text-right\">{summary.specs.commands}</span>\n <span>Queries:</span>\n <span className=\"text-right\">{summary.specs.queries}</span>\n <span>Events:</span>\n <span className=\"text-right\">{summary.specs.events}</span>\n <span>Presentations:</span>\n <span className=\"text-right\">\n {summary.specs.presentations}\n </span>\n </div>\n </div>\n\n <div className=\"border-t pt-2 text-xs\">\n <span>{summary.files.total} files</span>\n <span className=\"mx-1\">•</span>\n <span>{summary.files.specFiles} spec files</span>\n </div>\n </div>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AA4BA,SAAgB,iBAAiB,EAC/B,SACA,SAAS,OACT,WACA,cAAc,QACU;AACxB,KAAI,CAAC,WAAW,CAAC,OACf,QACE,qBAAC;EACC,WAAW,GACT,qCACA,yBACA,UACD;aAED,oBAAC,QAAK,WAAU,YAAY,EAC5B,oBAAC,oBAAK,yBAA2B;GAC7B;CAIV,MAAM,UACJ,qBAAC;EACC,WAAW,GACT,2BACA,SAAS,oBAAoB,yBAC7B,UACD;aAED,qBAAC;GACC,SAAS,SAAS,YAAY;GAC9B,WAAU;cAEV,oBAAC,OAAI,WAAU,YAAY;IAErB,EAEP,WAAW,eACV,4CACE,qBAAC;GAAI,WAAU;cACb,oBAAC,cAAW,WAAU,gBAAgB,EACtC,oBAAC,oBAAM,QAAQ,OAAY;IACvB,EAEN,qBAAC;GAAI,WAAU;cACb,oBAAC,YAAS,WAAU,gBAAgB,EACpC,qBAAC,qBAAM,QAAQ,MAAM,OAAM,YAAa;IACpC,IACL;GAED;AAGR,KAAI,CAAC,QACH,QAAO;AAGT,QACE,oBAAC,6BACC,qBAAC,sBACC,oBAAC;EAAe;YAAS;GAAyB,EAClD,oBAAC;EAAe,MAAK;EAAS,WAAU;YACtC,qBAAC;GAAI,WAAU;;IACb,oBAAC;KAAI,WAAU;eAAe,QAAQ;MAAW;IACjD,oBAAC;KAAI,WAAU;eAAiC,QAAQ;MAAW;IAEnE,oBAAC;KAAI,WAAU;eACb,qBAAC;MAAI,WAAU;;OACb,oBAAC,oBAAK,cAAgB;OACtB,oBAAC;QAAK,WAAU;kBAAc,QAAQ,MAAM;SAAgB;OAC5D,oBAAC,oBAAK,aAAe;OACrB,oBAAC;QAAK,WAAU;kBAAc,QAAQ,MAAM;SAAe;OAC3D,oBAAC,oBAAK,YAAc;OACpB,oBAAC;QAAK,WAAU;kBAAc,QAAQ,MAAM;SAAc;OAC1D,oBAAC,oBAAK,mBAAqB;OAC3B,oBAAC;QAAK,WAAU;kBACb,QAAQ,MAAM;SACV;;OACH;MACF;IAEN,qBAAC;KAAI,WAAU;;MACb,qBAAC,qBAAM,QAAQ,MAAM,OAAM,YAAa;MACxC,oBAAC;OAAK,WAAU;iBAAO;QAAQ;MAC/B,qBAAC,qBAAM,QAAQ,MAAM,WAAU,iBAAkB;;MAC7C;;IACF;GACS,IACT,GACM"}
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime2 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime3 from "react/jsx-runtime";
2
2
  import { ProviderMode, ProviderName } from "@lssm/lib.ai-providers";
3
3
 
4
4
  //#region src/presentation/components/ModelPicker.d.ts
@@ -13,12 +13,12 @@ interface ModelPickerProps {
13
13
  /** Called when selection changes */
14
14
  onChange: (value: ModelSelection) => void;
15
15
  /** Available providers (with availability info) */
16
- availableProviders?: Array<{
16
+ availableProviders?: {
17
17
  provider: ProviderName;
18
18
  available: boolean;
19
19
  mode: ProviderMode;
20
20
  reason?: string;
21
- }>;
21
+ }[];
22
22
  /** Additional class name */
23
23
  className?: string;
24
24
  /** Compact mode (smaller) */
@@ -33,6 +33,7 @@ declare function ModelPicker({
33
33
  availableProviders,
34
34
  className,
35
35
  compact
36
- }: ModelPickerProps): react_jsx_runtime2.JSX.Element;
36
+ }: ModelPickerProps): react_jsx_runtime3.JSX.Element;
37
37
  //#endregion
38
- export { ModelPicker };
38
+ export { ModelPicker };
39
+ //# sourceMappingURL=ModelPicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelPicker.d.ts","names":[],"sources":["../../../src/presentation/components/ModelPicker.tsx"],"sourcesContent":[],"mappings":";;;;UAqBiB,cAAA;YACL;;EADK,IAAA,EAGT,YAHuB;AAM/B;AAES,UAFQ,gBAAA,CAER;EAEW;EAGN,KAAA,EALL,cAKK;EAEJ;EAAY,QAAA,EAAA,CAAA,KAAA,EALF,cAKE,EAAA,GAAA,IAAA;EAqCN;EACd,kBAAA,CAAA,EAAA;IACA,QAAA,EAzCY,YAyCZ;IACA,SAAA,EAAA,OAAA;IACA,IAAA,EAzCQ,YAyCR;IACA,MAAA,CAAA,EAAA,MAAA;EACC,CAAA,EAAA;EAAgB;EAAA,SAAA,CAAA,EAAA,MAAA;;;;;;;iBANH,WAAA;;;;;;GAMb,mBAAgB,kBAAA,CAAA,GAAA,CAAA"}
@@ -3,7 +3,7 @@
3
3
  import { getModelsForProvider } from "../../libs/ai-providers/dist/models.js";
4
4
  import "../../libs/ai-providers/dist/index.js";
5
5
  import { cn } from "../../libs/ui-kit-web/dist/ui/utils.js";
6
- import { Button$1 } from "../../libs/design-system/dist/components/atoms/Button.js";
6
+ import { Button } from "../../libs/design-system/dist/components/atoms/Button.js";
7
7
  import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../../libs/ui-kit-web/dist/ui/select.js";
8
8
  import { Badge } from "../../libs/ui-kit-web/dist/ui/badge.js";
9
9
  import * as React from "react";
@@ -125,7 +125,7 @@ function ModelPicker({ value, onChange, availableProviders, className, compact =
125
125
  children: "Provider"
126
126
  }), /* @__PURE__ */ jsx("div", {
127
127
  className: "flex flex-wrap gap-2",
128
- children: providers.map((p) => /* @__PURE__ */ jsxs(Button$1, {
128
+ children: providers.map((p) => /* @__PURE__ */ jsxs(Button, {
129
129
  variant: value.provider === p.provider ? "default" : "outline",
130
130
  size: "sm",
131
131
  onPress: () => p.available && handleProviderChange(p.provider),
@@ -194,4 +194,5 @@ function ModelPicker({ value, onChange, availableProviders, className, compact =
194
194
  }
195
195
 
196
196
  //#endregion
197
- export { ModelPicker };
197
+ export { ModelPicker };
198
+ //# sourceMappingURL=ModelPicker.js.map