@@ -73,6 +73,17 @@ var deleteProviderUserEnvVar = config.DeleteUserEnvVar
7373var lookupProviderUserEnvVar = config .LookupUserEnvVar
7474var openExternalResource = tuiinfra .OpenExternalResource
7575
76+ type startupWakeSubmitMsg struct {
77+ Input startupWakeSubmitInput
78+ }
79+
80+ // emitStartupWakeSubmitCmd 在启动阶段投递一次性自动提交消息,用于复用普通输入提交流程。
81+ func emitStartupWakeSubmitCmd (input startupWakeSubmitInput ) tea.Cmd {
82+ return func () tea.Msg {
83+ return startupWakeSubmitMsg {Input : input }
84+ }
85+ }
86+
7687func (a App ) Update (msg tea.Msg ) (tea.Model , tea.Cmd ) {
7788 var cmds []tea.Cmd
7889 var spinCmd tea.Cmd
@@ -115,6 +126,11 @@ func (a App) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
115126 cmds = append (cmds , appTickCmd ())
116127 }
117128 return a , batchUpdateCmds ()
129+ case startupWakeSubmitMsg :
130+ if cmd := a .handleStartupWakeSubmitMsg (typed ); cmd != nil {
131+ cmds = append (cmds , cmd )
132+ }
133+ return a , batchUpdateCmds ()
118134 case providerAddResultMsg :
119135 a .handleProviderAddResultMsg (typed )
120136 return a , batchUpdateCmds ()
@@ -612,13 +628,9 @@ func (a App) updateInputPanel(msg tea.Msg, typed tea.KeyMsg, cmds []tea.Cmd) (te
612628
613629 // image capability precheck is intentionally disabled.
614630 // Keep CLI behavior consistent and let runtime own capability validation.
615- a .input .Reset ()
616- a .state .InputText = ""
617- a .applyComponentLayout (true )
618- a .refreshCommandMenu ()
619- a .resetPasteHeuristics ()
620-
621- cmds = append (cmds , a .beginAgentRun (input , images ))
631+ if cmd := a .beginAgentRun (input , images ); cmd != nil {
632+ cmds = append (cmds , cmd )
633+ }
622634 a .clearImageAttachments ()
623635 return a , batchUpdateCmds ()
624636 }
@@ -1169,6 +1181,16 @@ func (a *App) dispatchQueuedInterventionIfIdle() tea.Cmd {
11691181}
11701182
11711183func (a * App ) beginAgentRun (input string , images []tuiservices.UserImageInput ) tea.Cmd {
1184+ normalizedInput := strings .TrimSpace (input )
1185+ if normalizedInput == "" {
1186+ return nil
1187+ }
1188+ a .input .Reset ()
1189+ a .state .InputText = ""
1190+ a .applyComponentLayout (true )
1191+ a .refreshCommandMenu ()
1192+ a .resetPasteHeuristics ()
1193+
11721194 a .clearActivities ()
11731195 a .clearRunProgress ()
11741196 a .startupScreenLocked = false
@@ -1187,7 +1209,7 @@ func (a *App) beginAgentRun(input string, images []tuiservices.UserImageInput) t
11871209 SessionID : a .state .ActiveSessionID ,
11881210 RunID : runID ,
11891211 Workdir : requestedWorkdir ,
1190- Text : input ,
1212+ Text : normalizedInput ,
11911213 Images : clonedImages ,
11921214 })
11931215}
@@ -1760,6 +1782,19 @@ func (a *App) HydrateSession(ctx context.Context, sessionID string) error {
17601782 return nil
17611783}
17621784
1785+ // ConfigureStartupWakeInput 配置启动阶段的一次性自动提交输入,不会直接触发 runtime 调用。
1786+ func (a * App ) ConfigureStartupWakeInput (text string , workdir string ) error {
1787+ normalizedText := strings .TrimSpace (text )
1788+ if normalizedText == "" {
1789+ return fmt .Errorf ("startup wake input is empty" )
1790+ }
1791+ a .startupWakeSubmitInput = & startupWakeSubmitInput {
1792+ Text : normalizedText ,
1793+ Workdir : strings .TrimSpace (workdir ),
1794+ }
1795+ return nil
1796+ }
1797+
17631798// applySessionSnapshot 将会话快照同步到前端状态,统一复用于普通刷新与启动水化路径。
17641799func (a * App ) applySessionSnapshot (session agentsession.Session , warnOnMissingWorkdir bool ) {
17651800 a .activeMessages = session .Messages
@@ -3869,6 +3904,26 @@ func (a *App) requestModelCatalogRefresh(providerID string) tea.Cmd {
38693904 return runModelCatalogRefresh (a .providerSvc , providerID )
38703905}
38713906
3907+ // handleStartupWakeSubmitMsg 处理启动期的一次性唤醒输入,并沿用普通发送链路触发 Submit。
3908+ func (a * App ) handleStartupWakeSubmitMsg (msg startupWakeSubmitMsg ) tea.Cmd {
3909+ a .startupWakeSubmitInput = nil
3910+ text := strings .TrimSpace (msg .Input .Text )
3911+ if text == "" {
3912+ return nil
3913+ }
3914+ if workdir := strings .TrimSpace (msg .Input .Workdir ); workdir != "" {
3915+ a .setCurrentWorkdir (workdir )
3916+ if err := a .refreshFileCandidates (); err != nil {
3917+ a .state .ExecutionError = err .Error ()
3918+ a .state .StatusText = err .Error ()
3919+ return nil
3920+ }
3921+ }
3922+ a .input .SetValue (text )
3923+ a .state .InputText = text
3924+ return a .beginAgentRun (text , nil )
3925+ }
3926+
38723927func ListenForRuntimeEvent (sub <- chan tuiservices.RuntimeEvent ) tea.Cmd {
38733928 return tuiservices .ListenForRuntimeEventCmd (
38743929 sub ,
0 commit comments