सत्र डैशबोर्ड सुविधा के लिए तकनीकी डिज़ाइन दस्तावेज़, जिसे कार्यान्वयन से पहले और
उसके दौरान लिखा गया। यह निर्माण-विस्तार के लिए प्रामाणिक स्रोत है। सुविधा जारी होने पर,
/web/dashboard उपयोगकर्ता-सामना पृष्ठ बन जाता है और यह पृष्ठ
आर्किटेक्चर संदर्भ के रूप में बना रहता है।परिकल्पना
आज किसी एजेंट के साथ काम करना एक टेक्स्ट स्ट्रीम है। डैशबोर्ड इसे एक कार्यपीठ बनाता है: एजेंट लाइव, इंटरैक्टिव विजेट रेंडर करता है; उपयोगकर्ता उन्हें एक स्थायी सतह पर पिन करता है; चैट किनारे डॉक होती है (या छिप जाती है) और मुख्य सामग्री बोर्ड होती है। आप सत्र छोड़े बिना “एजेंट से बात करने” से “एजेंट द्वारा आपके लिए बनाए गए कंट्रोल पैनल को संचालित करने” तक पहुँच जाते हैं। सिद्धांत:- बोर्ड किसी सत्र का एक रूप है, कोई नई वस्तु नहीं। प्रत्येक सत्र (थ्रेड)
के दो रूप होते हैं: ट्रांसक्रिप्ट और बोर्ड। बिना पिन किए गए विजेट वाला सत्र
सामान्य चैट है। एक विजेट पिन करते ही बोर्ड अस्तित्व में आ जाता है। बोर्ड को
सत्र की पहचान, एजेंट स्वामित्व, नामकरण, पिनिंग और जीवनचक्र विरासत में मिलते हैं। कोई
dashboard_create, कोई बोर्ड रजिस्ट्री और कोई अलग ACL मॉडल नहीं है। - एजेंट समता। उपयोगकर्ता बोर्ड पर जो कुछ कर सकता है, एजेंट वह सब टूल के साथ कर सकता है: विजेट जोड़ना/अपडेट करना/हटाना, उन्हें व्यवस्थित करना, टैब प्रबंधित करना, दृश्यमान टैब बदलना, चैट को डॉक करना या छिपाना।
- मूलभूत, एम्बेडेड नहीं। बोर्ड Control UI शेल में Lit कॉम्पोनेंट हैं (ऐप के शेष भाग जैसी ही डिज़ाइन प्रणाली)। केवल विजेट की सामग्री iframe में सैंडबॉक्स की जाती है। कोई URL बार या ब्राउज़र क्रोम नहीं।
- छोटा एजेंट सरफ़ेस। विजेट को स्थिर नाम से संबोधित और उसी स्थान पर अपडेट किया जाता है। लेआउट एक तरल, स्वतः-संकुचित होने वाली ग्रिड है; एजेंट आकार और एंकर बताता है, कभी पिक्सेल या निर्देशांक नहीं।
- विश्वास के बजाय क्षमताएँ। विजेट कोड कठोर सैंडबॉक्स में एजेंट द्वारा लिखा गया कोई भी HTML/JS हो सकता है। पहुँच (gateway डेटा, कार्रवाइयाँ, नेटवर्क) केवल घोषित, ऑपरेटर-द्वारा-प्रदत्त क्षमता मैनिफ़ेस्ट के माध्यम से उपलब्ध होती है।
अवधारणाएँ
UX प्रवाह
- उन्नयन: एजेंट किसी भी चैट में
show_widgetकॉल करता है → विजेट ट्रांसक्रिप्ट में बिल्कुल आज की तरह इनलाइन रेंडर होता है → होवर करने पर डैशबोर्ड पर पिन करें दिखाई देता है → विजेट सत्र के बोर्ड पर दिखाई देता है। एजेंट यही करने के लिएpin: trueपास कर सकता है। - बोर्ड दृश्य: बोर्ड वाले सत्र को रूप टॉगल मिलता है (चैट / डैशबोर्ड)। बोर्ड दृश्य = टैब पट्टी (केवल जब >1 टैब हों) + तरल ग्रिड + डॉक किया हुआ चैट फलक। चैट डॉक का आकार बदला जा सकता है, उसे स्थानांतरित किया जा सकता है (बाएँ/दाएँ/नीचे), और उसे बिल्कुल साइडबार की तरह संक्षिप्त किया जा सकता है। प्रति-टैब डॉक स्थिति याद रखी जाती है।
- खींचना: उपयोगकर्ता विजेट खींचता है; ग्रिड स्वतः संकुचित होती है (विजेट ऊपर की ओर तैरते हैं, पड़ोसी पुनः प्रवाहित होते हैं)। हैंडल से आकार बदलना आकार चरणों पर स्नैप होता है। किसी के लिए भी पिक्सेल प्लेसमेंट नहीं।
- रीसेट चेतावनी: बोर्ड वाले सत्र पर
/new//resetवेब UI में पुष्टि माँगता है (“कॉन्टेक्स्ट रीसेट होता है, डैशबोर्ड बना रहता है”) और बोर्ड को बनाए रखता है। - साइडबार: पिन किए गए सत्र, बोर्ड होने पर अपना बोर्ड रूप रेंडर करते हैं। Home सत्र का बोर्ड डिफ़ॉल्ट “एजेंट डैशबोर्ड” है।
- इंटरैक्शन (तीन स्तर, नीचे देखें): मौन स्थिति घटनाएँ, दृश्यमान प्रॉम्प्ट प्रेषण और ऑटोमेशन ट्रिगर।
इंटरैक्शन स्तर
- स्थिति घटनाएँ (डिफ़ॉल्ट)। विजेट UI इंटरैक्शन जिनके बारे में मॉडल को पता होना चाहिए,
लेकिन जिनका उसे उत्तर नहीं देना चाहिए।
bridge.emitState({...})एक संरचित सत्र सूचना जोड़ता है (समूह-गतिविधि सूचनाओं जैसा ही तंत्र)। कोई एजेंट टर्न शुरू नहीं होता; मॉडल अपने अगले रन में संचित सूचनाएँ देखता है। - प्रॉम्प्ट (स्पष्ट बातचीत)।
bridge.sendPrompt(text)— उपयोगकर्ता सक्रियण आवश्यक है; सत्र में एक दृश्यमान उपयोगकर्ता संदेश भेजता है (डॉक की गई चैट उसे दिखाती है)। दर-सीमित; प्रत्येक प्रेषण की उपयोगकर्ता से पुष्टि होती है, जब तक विजेट के पासpromptक्षमता अनुदान न हो। - ऑटोमेशन।
bridge.runAction(name, args)— मैनिफ़ेस्ट में घोषित कार्रवाई चलाता है। प्रारंभिक क्रिया समूह:cron.trigger(मौजूदा cron जॉब अभी चलाएँ) औरbinding.refresh। Cron जॉब पहले से ही दृश्यमान, पृथक रन-सत्रों में चलते हैं और सस्ता मॉडल उपयोग कर सकते हैं: यही “छोटा मॉडल विजेट को शक्ति देता है” मार्ग है। कहीं भी कोई छिपा हुआ सत्र नहीं।
विजेट मॉडल और होस्टिंग
विजेट HTML/JS एजेंट द्वारा लिखा जाता है (आमतौर परshow_widget के माध्यम से), मानक
दस्तावेज़ शेल (CSP मेटा, आकार रिपोर्टर, ब्रिज बूटस्ट्रैप) में रैप किया जाता है और
<iframe sandbox="allow-scripts"> में रेंडर किया जाता है (allow-same-origin में कभी नहीं)।
- इनलाइन (ट्रांसक्रिप्ट) विजेट वर्तमान कैनवास-दस्तावेज़ पाइपलाइन बनाए रखते हैं: स्टेट डायरेक्टरी में लिखे जाते हैं, gateway द्वारा सर्व किए जाते हैं, प्रति स्कोप छाँटे जाते हैं, किसी स्वीकृति की आवश्यकता नहीं (वे संरचनात्मक रूप से क्षमताविहीन हैं — प्रॉम्प्ट प्रेषण की उपयोगकर्ता पुष्टि होती है)।
- बोर्ड विजेट सत्र की स्थिति हैं: बाइट स्वामी एजेंट के SQLite
DB (
board_widgets) में रहते हैं, और उन्हें DB पढ़ने वाला एक कोर gateway रूट (/__openclaw__/board/<agentId>/<sessionKey>/<name>/) सर्व करता है। ट्रांसक्रिप्ट विजेट को पिन करने पर बाइट कॉपी होते हैं। सीमाएँ: प्रति विजेट 256 KB, प्रति बोर्ड 48 विजेट। - उसी स्थान पर अपडेट: समान
nameके साथ विजेट को दोबारा उत्सर्जित करने पर बाइट बदल जाते हैं,revisionबढ़ता है,board.changedप्रसारित होता है और लाइव दृश्य केवल उस iframe को पुनः लोड करते हैं। - बाइट फ्रीज़िंग: प्रदान की गई क्षमताएँ विजेट
बाइट के sha256 से बँधती हैं। बाइट बदलने पर
data/net/actionsअनुदान केवल तभी बने रहते हैं, जब नया संशोधन प्रदान किए गए मैनिफ़ेस्ट का उपसमुच्चय घोषित करता है; विस्तारित मैनिफ़ेस्ट ऑपरेटर से दोबारा पुष्टि माँगता है।
विजेट सामग्री होस्ट करते हैं; MCP ऐप एक प्रकार की सामग्री हैं
विजेट OpenClaw की मूल इकाई है: अनुदान रिकॉर्ड वाला नामित, पिन किया हुआ, आकार-निर्धारित, सत्र-स्वामित्व वाला बोर्ड सेल। उसके भीतर जो रेंडर होता है, वह सामग्री का एक प्रकार है:html— एजेंट द्वाराshow_widgetके माध्यम से लिखा गया, बाइट बोर्ड स्टोरेज में।mcp-app— कॉन्फ़िगर किए गए सर्वर से तृतीय-पक्ष MCP ऐप दृश्य (ui://संसाधन), जिसे विजेट सेल के भीतर होस्ट किया जाता है।
show_widget कोड आज जितना छोटा है उतना ही रहता है और उसे
कभी यह जानने की आवश्यकता नहीं होती कि MCP Apps विनिर्देश मौजूद है।
नीचे साझा अवसंरचना (सरलीकरण यहाँ लागू होता है):
- एक सैंडबॉक्स होस्ट।
htmlविजेट उसी कठोर पाइपलाइन के माध्यम से रेंडर होते हैं जिसके साथ MCP ऐप जारी हुए थे (समर्पित सैंडबॉक्स ओरिजिन पर डबल-iframe, प्रति-विजेट CSP घोषित और विफलता पर बंद ढंग से डीकोड किया गया), किसी दूसरे विशेष रूप से बनाए गए iframe होस्ट के बजाय। प्रॉक्सी HTML को मान के रूप में प्राप्त करता है, इसलिए स्थानीय सामग्री स्वाभाविक स्थिति है। - एक प्राधिकरण मॉडल। विजेट की पहुँच एक प्रदान की गई अनुमति-सूची होती है,
चाहे उसका प्रकार कुछ भी हो:
htmlविजेट के लिए होस्ट टूल;mcp-appविजेट के लिए, सर्वर के ऐप-दृश्यमान टूल (मौजूदाallowedAppToolNamesतंत्र के माध्यम से, जिसे प्रति-मिंटिंग-रन के बजाय प्रति-विजेट स्थायी बनाया गया है)। htmlविजेट के लिए होस्ट टूल (विजेट ब्रिज पर उपलब्ध, अनुदान के विरुद्ध जाँचे गए):openclaw.prompt.send— स्तर 2; दृश्यमान कंपोज़र के माध्यम से रूट किया जाता है, अनुदान न होने पर उपयोगकर्ता द्वारा पुष्टि की जाती हैopenclaw.state.emit— स्तर 1 सत्र सूचनाएँ (समेकित, आकार-सीमित)openclaw.data.read— पैरामीटरयुक्त केवल-पठन बाइंडिंग (मौजूदा अनुमति-सूचीबद्ध रीड RPC समूह), gateway की ओर से रिज़ॉल्व किए जाते हैंopenclaw.cron.trigger— स्तर 3 ऑटोमेशन
net= CSP। नेटवर्क पहुँच पहले से जारी प्रति-विजेट CSP घोषणा (connect-srcओरिजिन) का उपयोग करती है — स्वतः अपडेट होने वाला मौसम विजेट अपना API सीधे सैंडबॉक्स से फ़ेच करता है, gateway की कोई भागीदारी नहीं।- अनुदान। कुछ भी घोषित न करने वाला विजेट तुरंत रेंडर होता है (सैंडबॉक्स किया हुआ,
default-src 'none', प्रॉम्प्ट प्रेषण की अलग-अलग पुष्टि होती है) — आज के इनलाइन चैट विजेट जैसा ही विश्वास स्तर। घोषित टूल/ओरिजिन विजेट को बोर्ड परpendingमें रखते हैं: प्लेसहोल्डर कार्ड उन्हें मानव-पठनीय रूप में सूचीबद्ध करता है और एक-टैप अनुमति दें/अस्वीकार करें विकल्प देता है। अनुदान प्रति विजेट नाम होते हैं;htmlविजेट के लिए वे बाइट-फ्रीज़ (sha256) होते हैं, और बदले हुए बाइट अनुदान को केवल तभी बनाए रखते हैं जब घोषणा संकुचित हुई हो। - लेखन शिम। दस्तावेज़ रैपर स्थिर लेखक API के रूप में
window.openclaw.sendPrompt/emitState/read/callइंजेक्ट करता है; नीचे का ट्रांसपोर्ट हमारा चैनल है या AppBridge, यह एक आंतरिक विवरण है जिसे विजेट लेखक कभी नहीं देखता। आकार रिपोर्टिंग और थीम टोकन उसी ब्रिज से गुजरते हैं।
ट्रांसक्रिप्ट प्रदर्शन: एक विजेट कार्ड
जब किसी टूल परिणाम में UI होता है —show_widget आउटपुट या ऐप संसाधन वाला MCP टूल परिणाम —
तो सिस्टम एक क्षणिक, स्वतः-नामित विजेट (सत्र-स्कोप वाला, छाँटा जाने वाला) साकार करता है और
ट्रांसक्रिप्ट एक अकेला विजेट कार्ड रेंडर करता है, जो सामग्री प्रकार के आधार पर प्रेषित करता है।
MCP ऐप का स्वतः-प्रदर्शन बिल्कुल विनिर्देश की अपेक्षा के अनुसार रहता है (मॉडल का कोई अतिरिक्त कार्य नहीं);
नीचे से वह बस एक विजेट ही है। इससे चैट रेंडरिंग में समानांतर mcpApp
विशेष स्थितियाँ (सरफ़ेस गेटिंग, अलग डीडुप) हट जाती हैं, हर
इनलाइन UI को समान पिन सुविधा मिलती है और विजेट रजिस्ट्री प्राथमिक
पुनः खोलने का मार्ग बनती है (कभी पिन न किए गए इतिहास के लिए ट्रांसक्रिप्ट-स्कैन पुनर्निर्माण फ़ॉलबैक बना रहता है)।
केवल-पठन टिकटयुक्त स्टैंडअलोन होस्ट, स्थायी पुनः खोलने की सतह के रूप में बोर्ड के साथ ओवरलैप करता है —
T6 में मूल्यांकन करने योग्य समेकन उम्मीदवार, पूर्वधारणा नहीं।
संयोजन: v1 ग्रिड सान्निध्य है (एक टैब पर ऐप विजेट के बगल में एजेंट क्रोम विजेट)।
v2 होस्ट-प्रबंधित ऐप स्लॉट जोड़ता है — एजेंट विजेट HTML एक
स्लॉट क्षेत्र घोषित करता है और होस्ट वास्तविक ऐप दृश्य को सहोदर सैंडबॉक्स के रूप में संयोजित करता है।
ऐप कभी एजेंट के iframe के भीतर रेंडर नहीं होता: नेस्टिंग ब्रिज
पहचान को तोड़ देगी और प्रदान किए गए ऐप UI पर ओवरले/क्लिकजैक सक्षम करेगी, इसलिए स्लॉट एक
लेआउट अनुबंध है, एम्बेड नहीं।
सर्वर-स्रोतित विजेट (पिन किए गए MCP ऐप)
एकीकृत होस्ट के साथ, किसी तृतीय-पक्ष MCP ऐप को पिन करना बस एक ऐसा विजेट है जिसकी सामग्री संग्रहीत होने के बजाय सर्वर से प्राप्त की जाती है:board_widgets HTML बाइट्स के
बजाय डिस्क्रिप्टर (serverName, toolName, uiResourceUri, मूल
toolCallId + sessionKey) रखता है, और बोर्ड चैट-टर्न की 10-मिनट TTL से आगे
व्यू लीज़ को फिर से जारी करता है (पुराना होने पर ui:// संसाधन को फिर से
प्राप्त करता है)। चैट के इनलाइन MCP ऐप व्यू को एजेंट विजेट की तरह ही डैशबोर्ड पर पिन करें
सुविधा मिलती है। दोबारा खोले गए व्यू आज डिज़ाइन के अनुसार केवल-पढ़ने योग्य हैं;
जिन पिन किए गए ऐप्स को इंटरैक्टिव बने रहना चाहिए, उन्हें सर्वर के ऐप-दृश्य टूल पर एक स्थायी
अनुदान मिलता है (पिन करते समय ऑपरेटर को स्पष्ट अनुमत-सूची दिखाई जाती है), जो
जारी करने वाले रन से अलग होता है। बिना अनुदान वाले पिन केवल-पढ़ने योग्य रहते हैं — फिर भी
डिस्प्ले डैशबोर्ड के लिए उपयोगी हैं। v1 मूल सत्र के बोर्ड पर पिन करता है; क्रॉस-सत्र पिनिंग
के लिए लीज़ ब्रोकर चाहिए और इसे प्रतीक्षा करनी होगी। खुले PR #109807 (ui/message
कंपोज़र रूटिंग, थीम/आकार प्रसार) के साथ समन्वय करें।
लेआउट: लचीला ग्रिड
12 कॉलम, निश्चित पंक्ति ऊँचाई, स्वतः-संकुचित होने वाला (ऊपर की ओर गुरुत्व, ड्रैग करने पर किनारे की ओर धकेलना — gridstack सिमेंटिक्स, नेटिव रूप से कार्यान्वित; ग्रिड गणित शुद्ध और DOM-मुक्त रहता है)। प्रति टैब विजेट लेआउट स्थिति:{ name, w (1-12), h (rows) } और
क्रम। एजेंट शब्दावली:
size:sm(3×3) ·md(6×4) ·lg(8×6) ·xl(12×8) ·full(एकल-विजेट टैब)after: <widgetName>वैकल्पिक क्रम निर्धारण एंकर; अनुपस्थित = अंत में जोड़ें- उपयोगकर्ता स्वतंत्र रूप से ड्रैग/आकार बदलता है; वही क्रम+आकार मॉडल राउंड-ट्रिप होता है।
डेटा मॉडल (प्रति-एजेंट DB)
agents/<agentId>/agent/openclaw-agent.sqlite में नई तालिकाएँ
(इसके लिए एजेंट-DB स्कीमा-संस्करण बढ़ाना आवश्यक है — इसे शामिल करने से
पहले ऑपरेटर की स्वीकृति आवश्यक है):
sessionKey के लिए कोई भी पंक्तियाँ। किसी सत्र को हटाने से उसकी
बोर्ड पंक्तियाँ हट जाती हैं। /new//reset उन्हें प्रभावित नहीं करता।
प्रोटोकॉल सतह
RPCs (कोर विधि तालिका,gateway-protocol में typebox स्कीमा):
board.get { sessionKey }→ टैब + विजेट मेटाडेटा (बाइट्स नहीं) —operator.readboard.update { sessionKey, ops[] }— टैब CRUD/पुनःक्रमण, विजेट स्थानांतरण/आकार परिवर्तन/ हटाना/अनपिन करना, डॉक स्थिति, फ़ोकस-टैब —operator.writeboard.widget.put { sessionKey, name, html, manifest, placement }—operator.write(एजेंट टूल पथ और पिन पथ)board.widget.grant { sessionKey, name, decision }—operator.approvalsboard.event { sessionKey, widget, payload }— टियर-1 स्थिति इवेंट अंतर्ग्रहण —operator.write
EVENT_SCOPE_GUARDS में, पढ़ने का दायरा):
board.changed { sessionKey, revision, widget? }— स्थायी स्थिति बदली; UI फिर से प्राप्त करता है (औरwidgetमौजूद होने पर एक iframe पुनः लोड करता है)।board.command { sessionKey, command }— अस्थायी UI संचालन (एजेंट दृश्यमान टैब बदलता है, चैट डॉक टॉगल करता है) —ui.commandपैटर्न।
एजेंट टूल
कुल तीन टूल (कोर, हमेशा पंजीकृत; रेंडरिंग आज की तरहinline-widgets क्लाइंट क्षमता पर निर्भर):
show_widget { title, widget_code, name?, pin?, size?, tab?, after?, capabilities? }— नाम से बनाएँ/अपडेट करें;pinइसे बोर्ड पर रखता है।name/pinके बिना यह बिल्कुल आज की तरह व्यवहार करता है (इनलाइन, अस्थायी)।dashboard { action, ... }— बोर्ड प्रबंधन क्रियाएँ:read,tab_create,tab_update,tab_delete,tabs_reorder,widget_move,widget_remove,unpin,focus_tab,set_chat_dock।- मौजूदा
cronटूल ऑटोमेशन टियर को कवर करते हैं; किसी नए टूल की आवश्यकता नहीं।
[dashboard] user clicked "Refresh" on widget weather (tab main)।
यह किसे प्रतिस्थापित करता है
extensions/workspacesहटाया जाता है। प्रयोगात्मक,enabledByDefault: false, कभी भी किसी स्थिर रिलीज़ में नहीं था (पहली बार 2026.7.2 बीटा में दिखाई दिया)। कोई माइग्रेशन नहीं; यदि पुराना<stateDir>/workspaces/मौजूद हो तो doctor नियम उसे हटा देता है। अपनाए गए विचार: शुद्ध ग्रिड गणित, ब्रिज सुरक्षा मॉडल (पोर्ट बूटस्ट्रैप, बाइंडिंग गेटिंग, दर सीमाएँ), बाइट-स्थिर अनुमोदन।- विजेट होस्टिंग
extensions/canvasसे कोर में स्थानांतरित होती है। कैनवास दस्तावेज़ स्टोर, दस्तावेज़ रैपर, HTTP सर्विंग औरshow_widgetटूल कोर (src/canvas/) बनते हैं; Plugin नोड-कैनवास नियंत्रण टूल (canvas) और A2UI को रखता है।pluginSurfaceUrls["canvas"]विज्ञापन और/__openclaw__/canvasपथ वितरित नेटिव-क्लाइंट अनुबंध हैं और स्थिर रहते हैं। Discord सत्र Discord-स्वामित्व वालाshow_widgetप्रकार बनाए रखते हैं। - WorkBoard अपरिवर्तित है (एकीकरण एक अनुवर्ती कार्यक्रम है)।
गैर-लक्ष्य (यह कार्यक्रम)
- बहु-उपयोगकर्ता बोर्ड साझाकरण/ACLs (भविष्य; सत्र साझाकरण के माध्यम से आएगा)।
- नेटिव macOS/iOS बोर्ड रेंडरिंग (जहाँ भी वे Control UI एम्बेड करते हैं, उन्हें यह मिलता है; इनलाइन-विजेट पथ अपरिवर्तित है)।
- अंतर्निहित डेटा विजेट (सत्र/उपयोग/cron कार्ड) — क्षमता ब्रिज और एजेंट-निर्मित विजेट v1 को कवर करते हैं; अंतर्निहित प्रकार रजिस्ट्री बाद में आ सकती है।
- डैशबोर्ड पर WorkBoard।
कार्यान्वयन योजना
स्वतंत्र वर्कट्री, Codex-निर्मित, क्रमिक समीक्षा+लैंड। लैंड-फिर-सुधार।
रेपो नियमों के अनुसार सत्यापन: स्थानीय रूप से केंद्रित vitest, Crabbox/Testbox पर
पूर्ण गेट, प्रत्येक लैंड से पहले
$autoreview, T6 के लिए लाइव प्रमाण।