---
read_when:
    - सत्र डैशबोर्ड (बोर्ड) सुविधा को लागू करना या उसकी समीक्षा करना
    - विजेट होस्टिंग, विजेट ब्रिज या बोर्ड स्टोरेज बदलना
summary: 'सत्र डैशबोर्ड: आर्किटेक्चर और कार्यान्वयन योजना (तकनीकी डिज़ाइन, GA-पूर्व)'
title: डैशबोर्ड आर्किटेक्चर
x-i18n:
    generated_at: "2026-07-19T10:02:38Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 32
    provider: openai
    source_hash: 472b6a9268f552f56b7aaa3ceecaa99e15722188f10d703d3321e9d60166904f
    source_path: web/dashboard-architecture.md
    workflow: 16
---

<Note>
सत्र डैशबोर्ड सुविधा के लिए तकनीकी डिज़ाइन दस्तावेज़, जिसे कार्यान्वयन से पहले और
उसके दौरान लिखा गया। यह निर्माण-विस्तार के लिए प्रामाणिक स्रोत है। सुविधा जारी होने पर,
`/web/dashboard` उपयोगकर्ता-सामना पृष्ठ बन जाता है और यह पृष्ठ
आर्किटेक्चर संदर्भ के रूप में बना रहता है।
</Note>

## परिकल्पना

आज किसी एजेंट के साथ काम करना एक टेक्स्ट स्ट्रीम है। डैशबोर्ड इसे एक
कार्यपीठ बनाता है: एजेंट लाइव, इंटरैक्टिव विजेट रेंडर करता है; उपयोगकर्ता उन्हें
एक स्थायी सतह पर पिन करता है; चैट किनारे डॉक होती है (या छिप जाती है) और मुख्य सामग्री
बोर्ड होती है। आप सत्र छोड़े बिना "एजेंट से बात करने" से "एजेंट द्वारा आपके लिए बनाए गए
कंट्रोल पैनल को संचालित करने" तक पहुँच जाते हैं।

सिद्धांत:

- **बोर्ड किसी सत्र का एक रूप है, कोई नई वस्तु नहीं।** प्रत्येक सत्र (थ्रेड)
  के दो रूप होते हैं: ट्रांसक्रिप्ट और बोर्ड। बिना पिन किए गए विजेट वाला सत्र
  सामान्य चैट है। एक विजेट पिन करते ही बोर्ड अस्तित्व में आ जाता है। बोर्ड को
  सत्र की पहचान, एजेंट स्वामित्व, नामकरण, पिनिंग और जीवनचक्र विरासत में मिलते हैं। कोई
  `dashboard_create`, कोई बोर्ड रजिस्ट्री और कोई अलग ACL मॉडल नहीं है।
- **एजेंट समता।** उपयोगकर्ता बोर्ड पर जो कुछ कर सकता है, एजेंट वह सब
  टूल के साथ कर सकता है: विजेट जोड़ना/अपडेट करना/हटाना, उन्हें व्यवस्थित करना, टैब प्रबंधित करना,
  दृश्यमान टैब बदलना, चैट को डॉक करना या छिपाना।
- **मूलभूत, एम्बेडेड नहीं।** बोर्ड Control UI शेल में Lit कॉम्पोनेंट हैं
  (ऐप के शेष भाग जैसी ही डिज़ाइन प्रणाली)। केवल विजेट की _सामग्री_
  iframe में सैंडबॉक्स की जाती है। कोई URL बार या ब्राउज़र क्रोम नहीं।
- **छोटा एजेंट सरफ़ेस।** विजेट को स्थिर नाम से संबोधित और उसी स्थान पर
  अपडेट किया जाता है। लेआउट एक तरल, स्वतः-संकुचित होने वाली ग्रिड है; एजेंट आकार और
  एंकर बताता है, कभी पिक्सेल या निर्देशांक नहीं।
- **विश्वास के बजाय क्षमताएँ।** विजेट कोड कठोर सैंडबॉक्स में एजेंट द्वारा लिखा गया
  कोई भी HTML/JS हो सकता है। पहुँच (gateway डेटा, कार्रवाइयाँ, नेटवर्क) केवल
  घोषित, ऑपरेटर-द्वारा-प्रदत्त क्षमता मैनिफ़ेस्ट के माध्यम से उपलब्ध होती है।

## अवधारणाएँ

| अवधारणा             | परिभाषा                                                                                                                                                        |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| सत्र (थ्रेड)    | मौजूदा gateway सत्र, स्थिर `sessionKey` द्वारा कुंजीबद्ध। किसी एजेंट के स्वामित्व में।                                                                                        |
| बोर्ड               | एक सत्र का विजेट रूप। सत्र में विजेट/टैब होने पर और केवल तभी मौजूद। `/new`/`/reset` के बाद भी बना रहता है (`sessionKey` से जुड़ा है, ट्रांसक्रिप्ट से नहीं)।                 |
| टैब                 | बोर्ड का एक प्रस्तुति पृष्ठ: कौन-से विजेट, उनकी व्यवस्था और चैट डॉक स्थिति (`left`/`right`/`bottom`/`hidden`)। बोर्ड एक अंतर्निहित टैब से शुरू होते हैं। |
| विजेट              | सत्र के स्वामित्व वाला नामित, सैंडबॉक्स किया हुआ HTML/JS प्रोग्राम। `sessionKey` + `name` के रूप में संबोधित। नाम द्वारा उसी स्थान पर अपडेट किया जाता है।                                              |
| क्षमता मैनिफ़ेस्ट | प्रति-विजेट पहुँच की घोषणा: `data` (रीड बाइंडिंग), `actions` (अनुमति-सूचीबद्ध क्रियाएँ), `prompt` (सत्र को भेजना), `net` (अनुमत ओरिजिन)।                      |
| पिन (विजेट)        | ट्रांसक्रिप्ट विजेट को सत्र के बोर्ड पर ले जाना (उपयोगकर्ता सुविधा या एजेंट टूल तर्क)। अनपिन करने पर वह बोर्ड से हट जाता है।                                         |
| पिन (सत्र)       | सत्रों की मौजूदा साइडबार पिनिंग। बोर्ड वाला पिन किया हुआ सत्र अपने बोर्ड रूप में खुलता है।                                                                      |

## UX प्रवाह

- **उन्नयन:** एजेंट किसी भी चैट में `show_widget` कॉल करता है → विजेट ट्रांसक्रिप्ट में
  बिल्कुल आज की तरह इनलाइन रेंडर होता है → होवर करने पर **डैशबोर्ड पर पिन करें** दिखाई देता है → विजेट
  सत्र के बोर्ड पर दिखाई देता है। एजेंट यही करने के लिए `pin: true` पास कर सकता है।
- **बोर्ड दृश्य:** बोर्ड वाले सत्र को रूप टॉगल मिलता है (चैट / डैशबोर्ड)।
  बोर्ड दृश्य = टैब पट्टी (केवल जब >1 टैब हों) + तरल ग्रिड + डॉक किया हुआ चैट फलक।
  चैट डॉक का आकार बदला जा सकता है, उसे स्थानांतरित किया जा सकता है (बाएँ/दाएँ/नीचे), और उसे बिल्कुल
  साइडबार की तरह संक्षिप्त किया जा सकता है। प्रति-टैब डॉक स्थिति याद रखी जाती है।
- **खींचना:** उपयोगकर्ता विजेट खींचता है; ग्रिड स्वतः संकुचित होती है (विजेट ऊपर की ओर तैरते हैं,
  पड़ोसी पुनः प्रवाहित होते हैं)। हैंडल से आकार बदलना आकार चरणों पर स्नैप होता है। किसी के लिए भी
  पिक्सेल प्लेसमेंट नहीं।
- **रीसेट चेतावनी:** बोर्ड वाले सत्र पर `/new` / `/reset`
  वेब UI में पुष्टि माँगता है ("कॉन्टेक्स्ट रीसेट होता है, डैशबोर्ड बना रहता है") और
  बोर्ड को बनाए रखता है।
- **साइडबार:** पिन किए गए सत्र, बोर्ड होने पर अपना बोर्ड रूप रेंडर करते हैं।
  Home सत्र का बोर्ड डिफ़ॉल्ट "एजेंट डैशबोर्ड" है।
- **इंटरैक्शन** (तीन स्तर, नीचे देखें): मौन स्थिति घटनाएँ, दृश्यमान
  प्रॉम्प्ट प्रेषण और ऑटोमेशन ट्रिगर।

## इंटरैक्शन स्तर

1. **स्थिति घटनाएँ (डिफ़ॉल्ट)।** विजेट UI इंटरैक्शन जिनके बारे में मॉडल को पता होना चाहिए,
   लेकिन जिनका उसे उत्तर नहीं देना चाहिए। `bridge.emitState({...})` एक संरचित
   सत्र सूचना जोड़ता है (समूह-गतिविधि सूचनाओं जैसा ही तंत्र)। कोई एजेंट टर्न
   शुरू नहीं होता; मॉडल अपने अगले रन में संचित सूचनाएँ देखता है।
2. **प्रॉम्प्ट (स्पष्ट बातचीत)।** `bridge.sendPrompt(text)` — उपयोगकर्ता
   सक्रियण आवश्यक है; सत्र में एक दृश्यमान उपयोगकर्ता संदेश भेजता है (डॉक की गई चैट
   उसे दिखाती है)। दर-सीमित; प्रत्येक प्रेषण की उपयोगकर्ता से पुष्टि होती है, जब तक विजेट के पास
   `prompt` क्षमता अनुदान न हो।
3. **ऑटोमेशन।** `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://` संसाधन),
  जिसे विजेट सेल के भीतर होस्ट किया जाता है।

MCP ऐप विजेट मॉडल को परिभाषित नहीं करते; विजेट ने उन्हें होस्ट करने की
क्षमता प्राप्त की है। पहचान, प्लेसमेंट, पिनिंग, अनुदान और लेखक-सामना API
OpenClaw के ही रहते हैं — इसलिए `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 स्कीमा-संस्करण बढ़ाना आवश्यक है — इसे शामिल करने से
पहले ऑपरेटर की स्वीकृति आवश्यक है**):

```sql
CREATE TABLE board_tabs (
  session_key TEXT NOT NULL,
  tab_id      TEXT NOT NULL,           -- स्लग
  title       TEXT NOT NULL,
  position    INTEGER NOT NULL,
  chat_dock   TEXT NOT NULL DEFAULT 'right',  -- left|right|bottom|hidden
  created_by  TEXT NOT NULL,           -- 'user' | 'agent'
  PRIMARY KEY (session_key, tab_id)
) STRICT;

CREATE TABLE board_widgets (
  session_key  TEXT NOT NULL,
  name         TEXT NOT NULL,          -- स्थिर विजेट नाम
  tab_id       TEXT NOT NULL,
  title        TEXT,
  html         BLOB NOT NULL,          -- रैप किया गया दस्तावेज़ स्रोत
  sha256       TEXT NOT NULL,
  revision     INTEGER NOT NULL,
  size_w       INTEGER NOT NULL,
  size_h       INTEGER NOT NULL,
  position     INTEGER NOT NULL,       -- टैब के भीतर क्रम (स्वतः-संकुचन इनपुट)
  manifest     TEXT NOT NULL DEFAULT '{}',  -- क्षमता मेनिफ़ेस्ट JSON
  grant_state  TEXT NOT NULL DEFAULT 'none', -- none|pending|granted|rejected
  granted_sha  TEXT,                   -- बाइट-स्थिर अनुदान
  created_by   TEXT NOT NULL,
  created_at   INTEGER NOT NULL,
  updated_at   INTEGER NOT NULL,
  PRIMARY KEY (session_key, name)
) STRICT;
```

बोर्ड का अस्तित्व = `sessionKey` के लिए कोई भी पंक्तियाँ। किसी सत्र को हटाने से उसकी
बोर्ड पंक्तियाँ हट जाती हैं। `/new`/`/reset` उन्हें प्रभावित नहीं करता।

## प्रोटोकॉल सतह

RPCs (कोर विधि तालिका, `gateway-protocol` में typebox स्कीमा):

- `board.get { sessionKey }` → टैब + विजेट मेटाडेटा (बाइट्स नहीं) — `operator.read`
- `board.update { sessionKey, ops[] }` — टैब CRUD/पुनःक्रमण, विजेट स्थानांतरण/आकार परिवर्तन/
  हटाना/अनपिन करना, डॉक स्थिति, फ़ोकस-टैब — `operator.write`
- `board.widget.put { sessionKey, name, html, manifest, placement }` —
  `operator.write` (एजेंट टूल पथ और पिन पथ)
- `board.widget.grant { sessionKey, name, decision }` — `operator.approvals`
- `board.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` पैटर्न।

विजेट बाइट्स सॉकेट के बजाय प्रमाणित HTTP सतह पर प्रदान की जाती हैं।

## एजेंट टूल

कुल तीन टूल (कोर, हमेशा पंजीकृत; रेंडरिंग आज की तरह
`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` टूल ऑटोमेशन टियर को कवर करते हैं; किसी नए टूल की आवश्यकता नहीं।

टूल विवरण आकार/एंकर शब्दावली और टियर मॉडल सिखाते हैं। एजेंट को सत्र सूचनाओं के माध्यम से
उपयोगकर्ता टियर-1 इवेंट के बारे में बताया जाता है, जैसे
`[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-निर्मित, क्रमिक समीक्षा+लैंड। लैंड-फिर-सुधार।

| #   | ब्रांच                               | दायरा                                                                                                                                                                              | निर्भरता                       |
| --- | ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- |
| T1  | `claude/dashboard-remove-workspaces` | workspaces Plugin + UI + दस्तावेज़ + i18n कुंजियाँ हटाएँ; doctor सफ़ाई नियम                                                                                                              | —                                |
| T2  | `claude/dashboard-canvas-core`       | विजेट होस्टिंग + `show_widget` को कोर में बढ़ावा दें; कैनवास Plugin नोड टूल रखता है; व्यवहार में कोई परिवर्तन नहीं                                                                                | —                                |
| T3  | `claude/dashboard-domain`            | एजेंट-DB तालिकाएँ (स्कीमा वृद्धि), `board.*` RPCs + इवेंट, `dashboard` टूल, `show_widget` पिन/नाम/मेनिफ़ेस्ट तर्क, टियर-1 सूचनाएँ, रीसेट-बोर्ड-बनाए-रखता-है                                  | T2                               |
| T4  | `claude/dashboard-ui`                | बोर्ड फ़ेस + टैब स्ट्रिप + लचीला स्वतः-संकुचित ग्रिड + चैट डॉक (left/right/bottom/hidden) + ट्रांसक्रिप्ट पिन सुविधा + साइडबार बोर्ड फ़ेस + रीसेट पुष्टिकरण                           | T3 (डेव फ़िक्स्चर के माध्यम से पहले मॉक) |
| T5  | `claude/dashboard-capabilities`      | अनुदान स्टोर/UI + बाइट स्थिरीकरण; `html` विजेट को साझा सैंडबॉक्स होस्ट पर ले जाएँ; होस्ट टूल (`openclaw.prompt.send/state.emit/data.read/cron.trigger`); `net` CSP; ऑथरिंग शिम | T3, T4                           |
| T7  | `claude/dashboard-mcp-apps`          | `mcp-app` सामग्री प्रकार: इनलाइन ऐप व्यू पर पिन सुविधा, डिस्क्रिप्टर भंडारण, लीज़ पुनः-जारी/रीफ़्रेश, स्थायी सर्वर-टूल अनुदान (वितरित MCP Apps होस्ट का पुनः उपयोग)                   | T3, T4                           |
| T6  | परिष्करण                               | स्क्रैच Gateway पर लाइव E2E (वास्तविक कुंजियाँ), स्क्रीनशॉट, सुधार, उपयोगकर्ता-केंद्रित `/web/dashboard` पुनर्लेखन, डिफ़ॉल्ट-रूप-से-सक्षम समीक्षा                                                     | सभी                              |

रेपो नियमों के अनुसार सत्यापन: स्थानीय रूप से केंद्रित vitest, Crabbox/Testbox पर
पूर्ण गेट, प्रत्येक लैंड से पहले `$autoreview`, T6 के लिए लाइव प्रमाण।
