codacus commited on
Commit
d473b2b
·
2 Parent(s): bb94180 7158ad6

Merge branch 'main' into system-prompt-variations-local

Browse files
.github/workflows/commit.yaml CHANGED
@@ -29,7 +29,7 @@ jobs:
29
 
30
  - name: Update commit file
31
  run: |
32
- echo CURRENT_VERSION=$(node -p "require('./package.json').version") >> $GITHUB_ENV
33
  echo "{ \"commit\": \"$COMMIT_HASH\" , \"version\": \"$CURRENT_VERSION\" }" > app/commit.json
34
 
35
  - name: Commit and push the update
 
29
 
30
  - name: Update commit file
31
  run: |
32
+ echo "CURRENT_VERSION=$(node -p "require('./package.json').version")" >> $GITHUB_ENV
33
  echo "{ \"commit\": \"$COMMIT_HASH\" , \"version\": \"$CURRENT_VERSION\" }" > app/commit.json
34
 
35
  - name: Commit and push the update
app/commit.json CHANGED
@@ -1 +1 @@
1
- { "commit": "19a3a03d455a5042cd3f8c654b0498c4cde2ea75" }
 
1
+ { "commit": "bb941802094c6186e805f99a6c165431ae86d216" }
app/components/chat/Messages.client.tsx CHANGED
@@ -73,8 +73,8 @@ export const Messages = React.forwardRef<HTMLDivElement, MessagesProps>((props:
73
  </div>
74
  {!isUserMessage && (
75
  <div className="flex gap-2 flex-col lg:flex-row">
76
- <WithTooltip tooltip="Revert to this message">
77
- {messageId && (
78
  <button
79
  onClick={() => handleRewind(messageId)}
80
  key="i-ph:arrow-u-up-left"
@@ -83,8 +83,8 @@ export const Messages = React.forwardRef<HTMLDivElement, MessagesProps>((props:
83
  'text-xl text-bolt-elements-textSecondary hover:text-bolt-elements-textPrimary transition-colors',
84
  )}
85
  />
86
- )}
87
- </WithTooltip>
88
 
89
  <WithTooltip tooltip="Fork chat from this message">
90
  <button
 
73
  </div>
74
  {!isUserMessage && (
75
  <div className="flex gap-2 flex-col lg:flex-row">
76
+ {messageId && (
77
+ <WithTooltip tooltip="Revert to this message">
78
  <button
79
  onClick={() => handleRewind(messageId)}
80
  key="i-ph:arrow-u-up-left"
 
83
  'text-xl text-bolt-elements-textSecondary hover:text-bolt-elements-textPrimary transition-colors',
84
  )}
85
  />
86
+ </WithTooltip>
87
+ )}
88
 
89
  <WithTooltip tooltip="Fork chat from this message">
90
  <button
app/components/settings/debug/DebugTab.tsx CHANGED
@@ -22,6 +22,12 @@ interface SystemInfo {
22
  timezone: string;
23
  memory: string;
24
  cores: number;
 
 
 
 
 
 
25
  }
26
 
27
  interface IProviderConfig {
@@ -62,14 +68,100 @@ function getSystemInfo(): SystemInfo {
62
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
63
  };
64
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  return {
66
- os: navigator.platform,
67
- browser: navigator.userAgent.split(' ').slice(-1)[0],
68
  screen: `${window.screen.width}x${window.screen.height}`,
69
  language: navigator.language,
70
  timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
71
- memory: formatBytes(performance?.memory?.jsHeapSizeLimit || 0),
72
  cores: navigator.hardwareConcurrency || 0,
 
 
 
 
 
 
 
 
73
  };
74
  }
75
 
@@ -384,10 +476,31 @@ export default function DebugTab() {
384
  <p className="text-xs text-bolt-elements-textSecondary">Operating System</p>
385
  <p className="text-sm font-medium text-bolt-elements-textPrimary">{systemInfo.os}</p>
386
  </div>
 
 
 
 
387
  <div>
388
  <p className="text-xs text-bolt-elements-textSecondary">Browser</p>
389
  <p className="text-sm font-medium text-bolt-elements-textPrimary">{systemInfo.browser}</p>
390
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
391
  <div>
392
  <p className="text-xs text-bolt-elements-textSecondary">Screen Resolution</p>
393
  <p className="text-sm font-medium text-bolt-elements-textPrimary">{systemInfo.screen}</p>
 
22
  timezone: string;
23
  memory: string;
24
  cores: number;
25
+ deviceType: string;
26
+ colorDepth: string;
27
+ pixelRatio: number;
28
+ online: boolean;
29
+ cookiesEnabled: boolean;
30
+ doNotTrack: boolean;
31
  }
32
 
33
  interface IProviderConfig {
 
68
  return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
69
  };
70
 
71
+ const getBrowserInfo = (): string => {
72
+ const ua = navigator.userAgent;
73
+ let browser = 'Unknown';
74
+
75
+ if (ua.includes('Firefox/')) {
76
+ browser = 'Firefox';
77
+ } else if (ua.includes('Chrome/')) {
78
+ if (ua.includes('Edg/')) {
79
+ browser = 'Edge';
80
+ } else if (ua.includes('OPR/')) {
81
+ browser = 'Opera';
82
+ } else {
83
+ browser = 'Chrome';
84
+ }
85
+ } else if (ua.includes('Safari/')) {
86
+ if (!ua.includes('Chrome')) {
87
+ browser = 'Safari';
88
+ }
89
+ }
90
+
91
+ // Extract version number
92
+ const match = ua.match(new RegExp(`${browser}\\/([\\d.]+)`));
93
+ const version = match ? ` ${match[1]}` : '';
94
+
95
+ return `${browser}${version}`;
96
+ };
97
+
98
+ const getOperatingSystem = (): string => {
99
+ const ua = navigator.userAgent;
100
+ const platform = navigator.platform;
101
+
102
+ if (ua.includes('Win')) {
103
+ return 'Windows';
104
+ }
105
+
106
+ if (ua.includes('Mac')) {
107
+ if (ua.includes('iPhone') || ua.includes('iPad')) {
108
+ return 'iOS';
109
+ }
110
+
111
+ return 'macOS';
112
+ }
113
+
114
+ if (ua.includes('Linux')) {
115
+ return 'Linux';
116
+ }
117
+
118
+ if (ua.includes('Android')) {
119
+ return 'Android';
120
+ }
121
+
122
+ return platform || 'Unknown';
123
+ };
124
+
125
+ const getDeviceType = (): string => {
126
+ const ua = navigator.userAgent;
127
+
128
+ if (ua.includes('Mobile')) {
129
+ return 'Mobile';
130
+ }
131
+
132
+ if (ua.includes('Tablet')) {
133
+ return 'Tablet';
134
+ }
135
+
136
+ return 'Desktop';
137
+ };
138
+
139
+ // Get more detailed memory info if available
140
+ const getMemoryInfo = (): string => {
141
+ if ('memory' in performance) {
142
+ const memory = (performance as any).memory;
143
+ return `${formatBytes(memory.jsHeapSizeLimit)} (Used: ${formatBytes(memory.usedJSHeapSize)})`;
144
+ }
145
+
146
+ return 'Not available';
147
+ };
148
+
149
  return {
150
+ os: getOperatingSystem(),
151
+ browser: getBrowserInfo(),
152
  screen: `${window.screen.width}x${window.screen.height}`,
153
  language: navigator.language,
154
  timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
155
+ memory: getMemoryInfo(),
156
  cores: navigator.hardwareConcurrency || 0,
157
+ deviceType: getDeviceType(),
158
+
159
+ // Add new fields
160
+ colorDepth: `${window.screen.colorDepth}-bit`,
161
+ pixelRatio: window.devicePixelRatio,
162
+ online: navigator.onLine,
163
+ cookiesEnabled: navigator.cookieEnabled,
164
+ doNotTrack: navigator.doNotTrack === '1',
165
  };
166
  }
167
 
 
476
  <p className="text-xs text-bolt-elements-textSecondary">Operating System</p>
477
  <p className="text-sm font-medium text-bolt-elements-textPrimary">{systemInfo.os}</p>
478
  </div>
479
+ <div>
480
+ <p className="text-xs text-bolt-elements-textSecondary">Device Type</p>
481
+ <p className="text-sm font-medium text-bolt-elements-textPrimary">{systemInfo.deviceType}</p>
482
+ </div>
483
  <div>
484
  <p className="text-xs text-bolt-elements-textSecondary">Browser</p>
485
  <p className="text-sm font-medium text-bolt-elements-textPrimary">{systemInfo.browser}</p>
486
  </div>
487
+ <div>
488
+ <p className="text-xs text-bolt-elements-textSecondary">Display</p>
489
+ <p className="text-sm font-medium text-bolt-elements-textPrimary">
490
+ {systemInfo.screen} ({systemInfo.colorDepth}) @{systemInfo.pixelRatio}x
491
+ </p>
492
+ </div>
493
+ <div>
494
+ <p className="text-xs text-bolt-elements-textSecondary">Connection</p>
495
+ <p className="text-sm font-medium flex items-center gap-2">
496
+ <span
497
+ className={`inline-block w-2 h-2 rounded-full ${systemInfo.online ? 'bg-green-500' : 'bg-red-500'}`}
498
+ />
499
+ <span className={`${systemInfo.online ? 'text-green-600' : 'text-red-600'}`}>
500
+ {systemInfo.online ? 'Online' : 'Offline'}
501
+ </span>
502
+ </p>
503
+ </div>
504
  <div>
505
  <p className="text-xs text-bolt-elements-textSecondary">Screen Resolution</p>
506
  <p className="text-sm font-medium text-bolt-elements-textPrimary">{systemInfo.screen}</p>
app/components/ui/IconButton.tsx CHANGED
@@ -1,4 +1,4 @@
1
- import { memo } from 'react';
2
  import { classNames } from '~/utils/classNames';
3
 
4
  type IconSize = 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
@@ -25,41 +25,48 @@ type IconButtonWithChildrenProps = {
25
 
26
  type IconButtonProps = IconButtonWithoutChildrenProps | IconButtonWithChildrenProps;
27
 
 
28
  export const IconButton = memo(
29
- ({
30
- icon,
31
- size = 'xl',
32
- className,
33
- iconClassName,
34
- disabledClassName,
35
- disabled = false,
36
- title,
37
- onClick,
38
- children,
39
- }: IconButtonProps) => {
40
- return (
41
- <button
42
- className={classNames(
43
- 'flex items-center text-bolt-elements-item-contentDefault bg-transparent enabled:hover:text-bolt-elements-item-contentActive rounded-md p-1 enabled:hover:bg-bolt-elements-item-backgroundActive disabled:cursor-not-allowed',
44
- {
45
- [classNames('opacity-30', disabledClassName)]: disabled,
46
- },
47
- className,
48
- )}
49
- title={title}
50
- disabled={disabled}
51
- onClick={(event) => {
52
- if (disabled) {
53
- return;
54
- }
 
 
 
 
 
55
 
56
- onClick?.(event);
57
- }}
58
- >
59
- {children ? children : <div className={classNames(icon, getIconSize(size), iconClassName)}></div>}
60
- </button>
61
- );
62
- },
 
63
  );
64
 
65
  function getIconSize(size: IconSize) {
 
1
+ import { memo, forwardRef, type ForwardedRef } from 'react';
2
  import { classNames } from '~/utils/classNames';
3
 
4
  type IconSize = 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
 
25
 
26
  type IconButtonProps = IconButtonWithoutChildrenProps | IconButtonWithChildrenProps;
27
 
28
+ // Componente IconButton com suporte a refs
29
  export const IconButton = memo(
30
+ forwardRef(
31
+ (
32
+ {
33
+ icon,
34
+ size = 'xl',
35
+ className,
36
+ iconClassName,
37
+ disabledClassName,
38
+ disabled = false,
39
+ title,
40
+ onClick,
41
+ children,
42
+ }: IconButtonProps,
43
+ ref: ForwardedRef<HTMLButtonElement>,
44
+ ) => {
45
+ return (
46
+ <button
47
+ ref={ref}
48
+ className={classNames(
49
+ 'flex items-center text-bolt-elements-item-contentDefault bg-transparent enabled:hover:text-bolt-elements-item-contentActive rounded-md p-1 enabled:hover:bg-bolt-elements-item-backgroundActive disabled:cursor-not-allowed',
50
+ {
51
+ [classNames('opacity-30', disabledClassName)]: disabled,
52
+ },
53
+ className,
54
+ )}
55
+ title={title}
56
+ disabled={disabled}
57
+ onClick={(event) => {
58
+ if (disabled) {
59
+ return;
60
+ }
61
 
62
+ onClick?.(event);
63
+ }}
64
+ >
65
+ {children ? children : <div className={classNames(icon, getIconSize(size), iconClassName)}></div>}
66
+ </button>
67
+ );
68
+ },
69
+ ),
70
  );
71
 
72
  function getIconSize(size: IconSize) {
app/components/ui/Tooltip.tsx CHANGED
@@ -1,8 +1,9 @@
1
  import * as Tooltip from '@radix-ui/react-tooltip';
 
2
 
3
  interface TooltipProps {
4
  tooltip: React.ReactNode;
5
- children: React.ReactNode;
6
  sideOffset?: number;
7
  className?: string;
8
  arrowClassName?: string;
@@ -12,62 +13,67 @@ interface TooltipProps {
12
  delay?: number;
13
  }
14
 
15
- const WithTooltip = ({
16
- tooltip,
17
- children,
18
- sideOffset = 5,
19
- className = '',
20
- arrowClassName = '',
21
- tooltipStyle = {},
22
- position = 'top',
23
- maxWidth = 250,
24
- delay = 0,
25
- }: TooltipProps) => {
26
- return (
27
- <Tooltip.Root delayDuration={delay}>
28
- <Tooltip.Trigger asChild>{children}</Tooltip.Trigger>
29
- <Tooltip.Portal>
30
- <Tooltip.Content
31
- side={position}
32
- className={`
33
- z-[2000]
34
- px-2.5
35
- py-1.5
36
- max-h-[300px]
37
- select-none
38
- rounded-md
39
- bg-bolt-elements-background-depth-3
40
- text-bolt-elements-textPrimary
41
- text-sm
42
- leading-tight
43
- shadow-lg
44
- animate-in
45
- fade-in-0
46
- zoom-in-95
47
- data-[state=closed]:animate-out
48
- data-[state=closed]:fade-out-0
49
- data-[state=closed]:zoom-out-95
50
- ${className}
51
- `}
52
- sideOffset={sideOffset}
53
- style={{
54
- maxWidth,
55
- ...tooltipStyle,
56
- }}
57
- >
58
- <div className="break-words">{tooltip}</div>
59
- <Tooltip.Arrow
60
  className={`
61
- fill-bolt-elements-background-depth-3
62
- ${arrowClassName}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
  `}
64
- width={12}
65
- height={6}
66
- />
67
- </Tooltip.Content>
68
- </Tooltip.Portal>
69
- </Tooltip.Root>
70
- );
71
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
72
 
73
  export default WithTooltip;
 
1
  import * as Tooltip from '@radix-ui/react-tooltip';
2
+ import { forwardRef, type ForwardedRef, type ReactElement } from 'react';
3
 
4
  interface TooltipProps {
5
  tooltip: React.ReactNode;
6
+ children: ReactElement;
7
  sideOffset?: number;
8
  className?: string;
9
  arrowClassName?: string;
 
13
  delay?: number;
14
  }
15
 
16
+ const WithTooltip = forwardRef(
17
+ (
18
+ {
19
+ tooltip,
20
+ children,
21
+ sideOffset = 5,
22
+ className = '',
23
+ arrowClassName = '',
24
+ tooltipStyle = {},
25
+ position = 'top',
26
+ maxWidth = 250,
27
+ delay = 0,
28
+ }: TooltipProps,
29
+ _ref: ForwardedRef<HTMLElement>,
30
+ ) => {
31
+ return (
32
+ <Tooltip.Root delayDuration={delay}>
33
+ <Tooltip.Trigger asChild>{children}</Tooltip.Trigger>
34
+ <Tooltip.Portal>
35
+ <Tooltip.Content
36
+ side={position}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  className={`
38
+ z-[2000]
39
+ px-2.5
40
+ py-1.5
41
+ max-h-[300px]
42
+ select-none
43
+ rounded-md
44
+ bg-bolt-elements-background-depth-3
45
+ text-bolt-elements-textPrimary
46
+ text-sm
47
+ leading-tight
48
+ shadow-lg
49
+ animate-in
50
+ fade-in-0
51
+ zoom-in-95
52
+ data-[state=closed]:animate-out
53
+ data-[state=closed]:fade-out-0
54
+ data-[state=closed]:zoom-out-95
55
+ ${className}
56
  `}
57
+ sideOffset={sideOffset}
58
+ style={{
59
+ maxWidth,
60
+ ...tooltipStyle,
61
+ }}
62
+ >
63
+ <div className="break-words">{tooltip}</div>
64
+ <Tooltip.Arrow
65
+ className={`
66
+ fill-bolt-elements-background-depth-3
67
+ ${arrowClassName}
68
+ `}
69
+ width={12}
70
+ height={6}
71
+ />
72
+ </Tooltip.Content>
73
+ </Tooltip.Portal>
74
+ </Tooltip.Root>
75
+ );
76
+ },
77
+ );
78
 
79
  export default WithTooltip;
public/apple-touch-icon-precomposed.png ADDED
public/apple-touch-icon.png ADDED