From 78c3a926d1c92d1fd0bf43c055de2f03c161a3d9 Mon Sep 17 00:00:00 2001 From: ymq Date: Sat, 8 Aug 2026 22:17:07 +0800 Subject: [PATCH] frontend: replace AgentIO with TextArea+Button+XHR streaming Simple controlled approach: TextArea input, Button click handler does XHR POST with url-encoded body, onprogress splits 0x0a, JSON.parse each line, appends Text widget to chat. No AgentIO interference. --- wwwroot/index_cockpit.ui | 49 +++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/wwwroot/index_cockpit.ui b/wwwroot/index_cockpit.ui index 8f4f595..c58d5b9 100644 --- a/wwwroot/index_cockpit.ui +++ b/wwwroot/index_cockpit.ui @@ -174,25 +174,48 @@ "border": "1px solid #e2e8f0", "borderTop": "none", "borderRadius": "0 0 8px 8px", - "padding": "0" + "padding": "8px 12px", + "gap": "4px" }, "subwidgets": [ { - "widgettype": "AgentIO", - "id": "chat_input", + "widgettype": "HBox", "options": { - "placeholder": "输入你的需求...", - "url": "/pipeline-sdlc/api/cockpit_chat.dspy", - "model_dataurl": "/pipeline-sdlc/api/cockpit_model_options.dspy", - "model_cwidth": 14 + "gap": "8px", + "alignItems": "center" }, - "binds": [ + "subwidgets": [ { - "wid": "self", - "event": "inputed", - "actiontype": "script", - "target": "self", - "script": "var ai=bricks.getWidgetById('chat_input',bricks.app);if(ai&&ai.inputw&&!ai._hooked){ai._hooked=true;ai.inputw.unbind('inputed');ai.inputw.bind('inputed',function(e){console.log('HOOKED inputed');var p=e.params.prompt||'';var mid=e.params.model_id||'';var chat=bricks.getWidgetById('chat_scroll',bricks.app);var at=null;if(chat){var ab=new bricks.HBox({width:'100%'});var am=new bricks.VBox({width:'85%',alignSelf:'flex-start',bgcolor:'#e8f0fe',borderRadius:'12px',padding:'12px 16px',marginBottom:'10px',gap:'4px'});am.add_widget(new bricks.Text({text:'Agent',cfontsize:0.75,color:'#3b82f6',fontWeight:'bold'}));at=new bricks.Text({text:'...',cfontsize:0.85,color:'#64748b'});am.add_widget(at);ab.add_widget(new bricks.Svg({rate:2,url:bricks_resource('imgs/llm.svg')}));ab.add_widget(am);ab.add_widget(new bricks.VBox({css:'filler'}));chat.add_widget(ab)}var xhr=new XMLHttpRequest();xhr.open('POST','/pipeline-sdlc/api/cockpit_chat.dspy');xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');var lastLen=0;xhr.onprogress=function(){var t=xhr.responseText;var d=t.substring(lastLen);lastLen=t.length;var lines=d.split(String.fromCharCode(10));for(var j=0;j