# ui/workspace.py import gradio as gr from ui.agent import respond from ui.agent.system_prompt import BORDERLESS_SYSTEM_PROMPT from ui.chat.defaults import DEFAULT_MAX_TOKENS, DEFAULT_TEMPERATURE, DEFAULT_TOP_P from ui.chat.panel import SidebarChatInterface from ui.globe import render_globe_panel from ui.globe_commands import empty_globe_state from ui.intake import render_intake_panel def create_main_workspace( history_container: gr.Column | None = None, ) -> gr.ChatInterface: """ Compose the main workspace: globe panel, intake form, and chat. """ globe_state = gr.JSON(value=empty_globe_state(), visible=False, elem_id="globe-state") chat_input = gr.MultimodalTextbox( show_label=False, placeholder="Create a prompt from the form, choose a demo, or type directly...", file_count="multiple", sources=["upload"], lines=3, max_lines=12, elem_classes=["borderless-chat-input"], render=False, ) with gr.Row(elem_classes=["borderless-main-workspace"], equal_height=True): with gr.Column( scale=7, min_width=520, elem_classes=["borderless-center-panel"], ): globe_column = gr.Column(elem_classes=["globe-column"]) with globe_column: render_globe_panel(height="70vh") with gr.Column( scale=4, min_width=360, elem_classes=["borderless-chat-panel"], ): render_intake_panel(chat_input) chat = SidebarChatInterface( respond, multimodal=True, chatbot=gr.Chatbot( show_label=False, container=False, elem_classes=["borderless-chatbot"], ), textbox=chat_input, history_container=history_container, fill_height=True, additional_inputs=[ gr.State(BORDERLESS_SYSTEM_PROMPT), gr.State(DEFAULT_MAX_TOKENS), gr.State(DEFAULT_TEMPERATURE), gr.State(DEFAULT_TOP_P), globe_state, ], additional_outputs=[globe_state], ) globe_state.change( fn=None, inputs=[globe_state], outputs=[], js="(state) => { window.BorderlessGlobe?.applyState(state); return []; }", queue=False, ) return chat