1
1
package cc.unitmesh.ide.javascript.actions
2
2
3
3
import cc.unitmesh.devti.AutoDevBundle
4
- import cc.unitmesh.devti.flow.TaskFlow
5
- import cc.unitmesh.devti.gui.chat.ChatCodingPanel
6
4
import cc.unitmesh.devti.gui.sendToChatPanel
7
5
import cc.unitmesh.devti.intentions.action.base.ChatBaseIntention
8
- import cc.unitmesh.devti.llms.LLMProvider
9
6
import cc.unitmesh.devti.llms.LlmFactory
10
- import cc.unitmesh.devti.template.TemplateRender
11
- import cc.unitmesh.ide.javascript.flow.DsComponent
7
+ import cc.unitmesh.ide.javascript.flow.model.AutoPageContext
8
+ import cc.unitmesh.ide.javascript.flow.AutoPageFlow
9
+ import cc.unitmesh.ide.javascript.flow.AutoPageTask
12
10
import cc.unitmesh.ide.javascript.flow.ReactAutoPage
13
11
import cc.unitmesh.ide.javascript.util.LanguageApplicableUtil
14
12
import com.intellij.openapi.editor.Editor
15
- import com.intellij.openapi.progress.ProgressIndicator
16
13
import com.intellij.openapi.progress.ProgressManager
17
- import com.intellij.openapi.progress.Task
18
14
import com.intellij.openapi.progress.impl.BackgroundableProcessIndicator
19
15
import com.intellij.openapi.project.Project
20
16
import com.intellij.psi.PsiFile
21
- import kotlinx.coroutines.runBlocking
22
17
23
18
class AutoPageAction : ChatBaseIntention () {
24
19
override fun priority (): Int = 1010
@@ -39,111 +34,13 @@ class AutoPageAction : ChatBaseIntention() {
39
34
sendToChatPanel(project) { contentPanel, _ ->
40
35
val llmProvider = LlmFactory ().create(project)
41
36
val context = AutoPageContext .build(reactAutoPage)
42
- val prompter = GenComponentFlow (context, contentPanel, llmProvider)
37
+ val prompter = AutoPageFlow (context, contentPanel, llmProvider)
43
38
44
- val task = GenComponentTask (project, prompter, editor, reactAutoPage)
39
+ val task = AutoPageTask (project, prompter, editor, reactAutoPage)
45
40
ProgressManager .getInstance()
46
41
.runProcessWithProgressAsynchronously(task, BackgroundableProcessIndicator (task))
47
42
}
48
43
49
44
}
50
45
}
51
46
52
- class GenComponentTask (
53
- private val project : Project ,
54
- private val flow : GenComponentFlow ,
55
- private val editor : Editor ,
56
- private val autoPage : ReactAutoPage
57
- ) : Task.Backgroundable(project, " Gen Page" , true ) {
58
- override fun run (indicator : ProgressIndicator ) {
59
- indicator.fraction = 0.2
60
-
61
- indicator.text = AutoDevBundle .message(" autopage.generate.clarify" )
62
- val components = flow.clarify()
63
- // tables will be list in string format, like: `[table1, table2]`, we need to parse to Lists
64
- val componentNames = components.substringAfter(" [" ).substringBefore(" ]" )
65
- .split(" , " ).map { it.trim() }
66
-
67
- val filterComponents = autoPage.filterComponents(componentNames)
68
- flow.context.components = filterComponents.map { it.format() }
69
-
70
- indicator.fraction = 0.6
71
- indicator.text = AutoDevBundle .message(" autopage.generate.design" )
72
- flow.design(filterComponents)
73
-
74
- indicator.fraction = 0.8
75
-
76
- }
77
- }
78
-
79
- data class AutoPageContext (
80
- val requirement : String ,
81
- var pages : List <String >,
82
- val pageNames : List <String >,
83
- var components : List <String >,
84
- val componentNames : List <String >,
85
- val routes : List <String >,
86
- ) {
87
- companion object {
88
- fun build (reactAutoPage : ReactAutoPage ): AutoPageContext {
89
- return AutoPageContext (
90
- requirement = reactAutoPage.userTask,
91
- pages = reactAutoPage.getPages().map { it.format() },
92
- pageNames = reactAutoPage.getPages().map { it.name },
93
- components = reactAutoPage.getComponents().map { it.format() },
94
- componentNames = reactAutoPage.getComponents().map { it.name },
95
- routes = reactAutoPage.getRoutes(),
96
- )
97
- }
98
- }
99
- }
100
-
101
- class GenComponentFlow (val context : AutoPageContext , val panel : ChatCodingPanel , val llm : LLMProvider ) :
102
- TaskFlow <String > {
103
- override fun clarify (): String {
104
- val stepOnePrompt = generateStepOnePrompt(context)
105
-
106
- panel.addMessage(stepOnePrompt, true , stepOnePrompt)
107
- panel.addMessage(AutoDevBundle .message(" autodev.loading" ))
108
-
109
- return runBlocking {
110
- val prompt = llm.stream(stepOnePrompt, " " )
111
- return @runBlocking panel.updateMessage(prompt)
112
- }
113
- }
114
-
115
- private fun generateStepOnePrompt (context : AutoPageContext ): String {
116
- val templateRender = TemplateRender (" genius/page" )
117
- val template = templateRender.getTemplate(" page-gen-clarify.vm" )
118
-
119
- templateRender.context = context
120
-
121
- val prompter = templateRender.renderTemplate(template)
122
- return prompter
123
- }
124
-
125
-
126
- override fun design (context : Any ): List <String > {
127
- val componentList = context as List <DsComponent >
128
- val stepTwoPrompt = generateStepTwoPrompt(componentList)
129
-
130
- panel.addMessage(stepTwoPrompt, true , stepTwoPrompt)
131
- panel.addMessage(AutoDevBundle .message(" autodev.loading" ))
132
-
133
- return runBlocking {
134
- val prompt = llm.stream(stepTwoPrompt, " " )
135
- return @runBlocking panel.updateMessage(prompt)
136
- }.let { listOf (it) }
137
- }
138
-
139
- private fun generateStepTwoPrompt (selectedComponents : List <DsComponent >): String {
140
- val templateRender = TemplateRender (" genius/page" )
141
- val template = templateRender.getTemplate(" page-gen-design.vm" )
142
-
143
- context.pages = selectedComponents.map { it.format() }
144
- templateRender.context = context
145
-
146
- val prompter = templateRender.renderTemplate(template)
147
- return prompter
148
- }
149
- }
0 commit comments