Skip to content

Commit 480d49d

Browse files
authored
Merge pull request #3777 from liam-hq/devin/1760446739-add-deep-modeling-toggle-to-design-session-chat
Add DeepModeling toggle to Design Session chat
2 parents 8033818 + 624a01b commit 480d49d

File tree

7 files changed

+63
-9
lines changed

7 files changed

+63
-9
lines changed

frontend/apps/app/components/SessionDetailPage/SessionDetailPageClient.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ export const SessionDetailPageClient: FC<Props> = ({
153153
const hasTriggeredInitialWorkflow = useRef(false)
154154

155155
const handleSendMessage = useCallback(
156-
async (content: string) => {
156+
async (content: string, isDeepModelingEnabled: boolean) => {
157157
const tempId = `optimistic-${crypto.randomUUID()}`
158158
const optimisticMessage = new HumanMessage({
159159
content,
@@ -174,7 +174,7 @@ export const SessionDetailPageClient: FC<Props> = ({
174174
setMessages((prev) => prev.filter((msg) => msg.id !== tempId))
175175
}
176176
},
177-
[setMessages, start, senderName, designSessionId, isDeepModelingEnabled],
177+
[setMessages, start, senderName, designSessionId],
178178
)
179179

180180
// Auto-trigger workflow on page load if there's an unanswered user message
@@ -235,6 +235,7 @@ export const SessionDetailPageClient: FC<Props> = ({
235235
onSendMessage={handleSendMessage}
236236
onNavigate={setActiveTab}
237237
error={combinedError}
238+
initialIsDeepModelingEnabled={isDeepModelingEnabled}
238239
/>
239240
</div>
240241
</div>

frontend/apps/app/components/SessionDetailPage/components/Chat/Chat.stories.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ export const Default: Story = {
8484
messages: MESSAGES,
8585
onSendMessage: () => {},
8686
onNavigate: () => {},
87+
initialIsDeepModelingEnabled: true,
8788
},
8889
}
8990

@@ -93,6 +94,7 @@ export const AnimatedDemo: Story = {
9394
messages: MESSAGES,
9495
onSendMessage: () => {},
9596
onNavigate: () => {},
97+
initialIsDeepModelingEnabled: true,
9698
},
9799
render: (props) => <AnimatedChatDemo {...props} />,
98100
}
@@ -122,5 +124,6 @@ export const WithComplexMessages: Story = {
122124
],
123125
onSendMessage: () => {},
124126
onNavigate: () => {},
127+
initialIsDeepModelingEnabled: true,
125128
},
126129
}

frontend/apps/app/components/SessionDetailPage/components/Chat/Chat.tsx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import type { BaseMessage } from '@langchain/core/messages'
44
import type { Schema } from '@liam-hq/schema'
5+
import { useRouter, useSearchParams } from 'next/navigation'
56
import type { FC } from 'react'
67
import { useCallback, useEffect, useState } from 'react'
78
import type { OutputTabValue } from '../Output/constants'
@@ -16,10 +17,11 @@ import { useScrollToBottom } from './useScrollToBottom'
1617
type Props = {
1718
schemaData: Schema
1819
messages: BaseMessage[]
19-
onSendMessage: (content: string) => void
20+
onSendMessage: (content: string, isDeepModelingEnabled: boolean) => void
2021
isWorkflowRunning?: boolean
2122
error?: string | null
2223
onNavigate: (tab: OutputTabValue) => void
24+
initialIsDeepModelingEnabled?: boolean
2325
}
2426

2527
export const Chat: FC<Props> = ({
@@ -29,12 +31,20 @@ export const Chat: FC<Props> = ({
2931
isWorkflowRunning = false,
3032
onNavigate,
3133
error,
34+
initialIsDeepModelingEnabled = true,
3235
}) => {
36+
const router = useRouter()
37+
const searchParams = useSearchParams()
3338
const { containerRef, scrollToBottom } = useScrollToBottom<HTMLDivElement>(
3439
messages.length,
3540
)
3641
const [showScrollButton, setShowScrollButton] = useState(false)
3742

43+
const deepModelingParam = searchParams.get('deepModeling')
44+
const isDeepModelingEnabled =
45+
deepModelingParam === 'true' ||
46+
(deepModelingParam === null && initialIsDeepModelingEnabled)
47+
3848
const recomputeScrollButton = useCallback(() => {
3949
const el = containerRef.current
4050
if (!el) return
@@ -56,8 +66,17 @@ export const Chat: FC<Props> = ({
5666
recomputeScrollButton()
5767
}, [messages, recomputeScrollButton])
5868

69+
const handleDeepModelingToggle = useCallback(
70+
(enabled: boolean) => {
71+
const params = new URLSearchParams(searchParams.toString())
72+
params.set('deepModeling', enabled.toString())
73+
router.replace(`?${params.toString()}`, { scroll: false })
74+
},
75+
[router, searchParams],
76+
)
77+
5978
const handleSendMessage = (content: string) => {
60-
onSendMessage(content)
79+
onSendMessage(content, isDeepModelingEnabled)
6180
}
6281

6382
return (
@@ -82,6 +101,8 @@ export const Chat: FC<Props> = ({
82101
onSendMessage={handleSendMessage}
83102
isWorkflowRunning={isWorkflowRunning}
84103
schema={schemaData}
104+
isDeepModelingEnabled={isDeepModelingEnabled}
105+
onDeepModelingToggle={handleDeepModelingToggle}
85106
/>
86107
</div>
87108
)

frontend/apps/app/components/SessionDetailPage/components/Chat/components/ChatInput/ChatInput.module.css

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,3 +104,10 @@
104104
border: none !important;
105105
box-shadow: none !important;
106106
}
107+
108+
.toolsContainer {
109+
display: flex;
110+
align-items: center;
111+
gap: var(--spacing-2);
112+
padding: var(--spacing-1) var(--spacing-2);
113+
}

frontend/apps/app/components/SessionDetailPage/components/Chat/components/ChatInput/ChatInput.stories.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ export const Default: Story = {
102102
isWorkflowRunning: false,
103103
error: false,
104104
schema: dummySchema,
105+
isDeepModelingEnabled: true,
106+
onDeepModelingToggle: () => {},
105107
},
106108
parameters: {
107109
docs: {
@@ -119,6 +121,8 @@ export const WorkflowRunning: Story = {
119121
isWorkflowRunning: true,
120122
error: false,
121123
schema: dummySchema,
124+
isDeepModelingEnabled: true,
125+
onDeepModelingToggle: () => {},
122126
},
123127
parameters: {
124128
docs: {
@@ -137,6 +141,8 @@ export const WorkflowRunningWithContent: Story = {
137141
error: false,
138142
initialMessage: 'This message is being processed...',
139143
schema: dummySchema,
144+
isDeepModelingEnabled: true,
145+
onDeepModelingToggle: () => {},
140146
},
141147
parameters: {
142148
docs: {
@@ -156,6 +162,8 @@ export const WithError: Story = {
156162
error: true,
157163
initialMessage: 'This message has an error that needs to be fixed.',
158164
schema: dummySchema,
165+
isDeepModelingEnabled: true,
166+
onDeepModelingToggle: () => {},
159167
},
160168
parameters: {
161169
docs: {
@@ -174,6 +182,8 @@ export const Filled: Story = {
174182
error: false,
175183
initialMessage: 'Proposed schema changes for adding a chat function.',
176184
schema: dummySchema,
185+
isDeepModelingEnabled: true,
186+
onDeepModelingToggle: () => {},
177187
},
178188
parameters: {
179189
docs: {
@@ -194,6 +204,8 @@ export const Interactive: Story = {
194204
error: false,
195205
initialMessage: '',
196206
schema: dummySchema,
207+
isDeepModelingEnabled: true,
208+
onDeepModelingToggle: () => {},
197209
},
198210
parameters: {
199211
docs: {

frontend/apps/app/components/SessionDetailPage/components/Chat/components/ChatInput/ChatInput.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
useRef,
2020
useState,
2121
} from 'react'
22+
import { DeepModelingToggle } from '../../../../../../features/sessions/components/shared/DeepModelingToggle'
2223
import { useAuthModal } from '../../../../../../hooks/useAuthModal'
2324
import { AuthModals } from '../../../../../AuthModals'
2425
import { useViewMode } from '../../../../hooks/viewMode'
@@ -40,6 +41,8 @@ type Props = {
4041
initialMessage?: string
4142
schema: Schema
4243
onSendMessage: (message: string) => void
44+
isDeepModelingEnabled: boolean
45+
onDeepModelingToggle: (enabled: boolean) => void
4346
}
4447

4548
export const ChatInput: FC<Props> = ({
@@ -48,6 +51,8 @@ export const ChatInput: FC<Props> = ({
4851
initialMessage = '',
4952
schema,
5053
onSendMessage,
54+
isDeepModelingEnabled,
55+
onDeepModelingToggle,
5156
}) => {
5257
const { isPublic } = useViewMode()
5358
const mentionSuggestorRef = useRef<MentionSuggestorHandle>(null)
@@ -238,6 +243,16 @@ export const ChatInput: FC<Props> = ({
238243
onClick={handleSubmit}
239244
/>
240245
</form>
246+
<div className={styles.toolsContainer}>
247+
<DeepModelingToggle
248+
name="isDeepModelingEnabled"
249+
defaultChecked={isDeepModelingEnabled}
250+
disabled={isWorkflowRunning || isPublic}
251+
onClick={() => onDeepModelingToggle(!isDeepModelingEnabled)}
252+
>
253+
Deep Modeling
254+
</DeepModelingToggle>
255+
</div>
241256

242257
<AuthModals
243258
authModalType={authModalType}

frontend/apps/app/eslint-suppressions.json

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,6 @@
4444
"count": 1
4545
}
4646
},
47-
"components/SessionDetailPage/SessionDetailPage.module.css": {
48-
"css-modules-kit/no-unused-class-names": {
49-
"count": 6
50-
}
51-
},
5247
"components/SessionDetailPage/components/Chat/components/ChatInput/ChatInput.tsx": {
5348
"@typescript-eslint/consistent-type-assertions": {
5449
"count": 2

0 commit comments

Comments
 (0)