diff --git a/docs/assets/docs-chat-widget.js b/docs/assets/docs-chat-widget.js
new file mode 100644
index 0000000000..d7be57bcf3
--- /dev/null
+++ b/docs/assets/docs-chat-widget.js
@@ -0,0 +1,667 @@
+(() => {
+ if (document.getElementById("docs-chat-root")) return;
+
+ // Determine if we're on the docs site or embedded elsewhere
+ const hostname = window.location.hostname;
+ const isDocsSite = hostname === "localhost" || hostname === "127.0.0.1" ||
+ hostname.includes("docs.openclaw") || hostname.endsWith(".mintlify.app");
+ const assetsBase = isDocsSite ? "" : "https://docs.openclaw.ai";
+ const apiBase = "https://claw-api.openknot.ai/api";
+
+ // Load marked for markdown rendering (via CDN)
+ let markedReady = false;
+ const loadMarkdownLib = () => {
+ if (window.marked) {
+ markedReady = true;
+ return;
+ }
+ const script = document.createElement("script");
+ script.src = "https://cdn.jsdelivr.net/npm/marked@15.0.6/marked.min.js";
+ script.onload = () => {
+ if (window.marked) {
+ markedReady = true;
+ }
+ };
+ script.onerror = () => console.warn("Failed to load marked library");
+ document.head.appendChild(script);
+ };
+ loadMarkdownLib();
+
+ // Markdown renderer with fallback before module loads
+ const renderMarkdown = (text) => {
+ if (markedReady && window.marked) {
+ // Configure marked for security: disable HTML pass-through
+ const html = window.marked.parse(text, { async: false, gfm: true, breaks: true });
+ // Open links in new tab by rewriting tags
+ return html.replace(//g, ">")
+ .replace(/\n/g, "
");
+ };
+
+ const style = document.createElement("style");
+ style.textContent = `
+#docs-chat-root { position: fixed; right: 20px; bottom: 20px; z-index: 9999; font-family: var(--font-body, system-ui, -apple-system, sans-serif); }
+#docs-chat-root.docs-chat-expanded { right: 0; bottom: 0; top: 0; }
+/* Thin scrollbar styling */
+#docs-chat-root ::-webkit-scrollbar { width: 6px; height: 6px; }
+#docs-chat-root ::-webkit-scrollbar-track { background: transparent; }
+#docs-chat-root ::-webkit-scrollbar-thumb { background: var(--docs-chat-panel-border); border-radius: 3px; }
+#docs-chat-root ::-webkit-scrollbar-thumb:hover { background: var(--docs-chat-muted); }
+#docs-chat-root * { scrollbar-width: thin; scrollbar-color: var(--docs-chat-panel-border) transparent; }
+:root {
+ --docs-chat-accent: var(--accent, #ff7d60);
+ --docs-chat-text: #1a1a1a;
+ --docs-chat-muted: #555;
+ --docs-chat-panel: rgba(255, 255, 255, 0.92);
+ --docs-chat-panel-border: rgba(0, 0, 0, 0.1);
+ --docs-chat-surface: rgba(250, 250, 250, 0.95);
+ --docs-chat-shadow: 0 18px 50px rgba(0,0,0,0.15);
+ --docs-chat-code-bg: rgba(0, 0, 0, 0.05);
+ --docs-chat-assistant-bg: #f5f5f5;
+}
+html[data-theme="dark"] {
+ --docs-chat-text: #e8e8e8;
+ --docs-chat-muted: #aaa;
+ --docs-chat-panel: rgba(28, 28, 30, 0.95);
+ --docs-chat-panel-border: rgba(255, 255, 255, 0.12);
+ --docs-chat-surface: rgba(38, 38, 40, 0.95);
+ --docs-chat-shadow: 0 18px 50px rgba(0,0,0,0.5);
+ --docs-chat-code-bg: rgba(255, 255, 255, 0.08);
+ --docs-chat-assistant-bg: #2a2a2c;
+}
+#docs-chat-button {
+ display: inline-flex;
+ align-items: center;
+ gap: 10px;
+ background: linear-gradient(140deg, rgba(255,90,54,0.25), rgba(255,90,54,0.06));
+ color: var(--docs-chat-text);
+ border: 1px solid rgba(255,90,54,0.4);
+ border-radius: 999px;
+ padding: 10px 14px;
+ cursor: pointer;
+ box-shadow: 0 8px 30px rgba(255,90,54, 0.08);
+ backdrop-filter: blur(12px);
+ -webkit-backdrop-filter: blur(12px);
+ font-family: var(--font-pixel, var(--font-body, system-ui, sans-serif));
+}
+#docs-chat-button span { font-weight: 600; letter-spacing: 0.04em; font-size: 14px; }
+.docs-chat-logo { width: 20px; height: 20px; }
+#docs-chat-panel {
+ width: min(440px, calc(100vw - 40px));
+ height: min(696px, calc(100vh - 80px));
+ background: var(--docs-chat-panel);
+ color: var(--docs-chat-text);
+ border-radius: 16px;
+ border: 1px solid var(--docs-chat-panel-border);
+ box-shadow: var(--docs-chat-shadow);
+ display: none;
+ flex-direction: column;
+ overflow: hidden;
+ backdrop-filter: blur(16px);
+ -webkit-backdrop-filter: blur(16px);
+}
+#docs-chat-root.docs-chat-expanded #docs-chat-panel {
+ width: min(512px, 100vw);
+ height: 100vh;
+ height: 100dvh;
+ border-radius: 18px 0 0 18px;
+ padding-top: env(safe-area-inset-top, 0);
+ padding-bottom: env(safe-area-inset-bottom, 0);
+}
+@media (max-width: 520px) {
+ #docs-chat-root.docs-chat-expanded #docs-chat-panel {
+ width: 100vw;
+ border-radius: 0;
+ }
+ #docs-chat-root.docs-chat-expanded { right: 0; left: 0; bottom: 0; top: 0; }
+}
+#docs-chat-header {
+ padding: 12px 14px;
+ font-weight: 600;
+ font-family: var(--font-pixel, var(--font-body, system-ui, sans-serif));
+ letter-spacing: 0.03em;
+ border-bottom: 1px solid var(--docs-chat-panel-border);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+#docs-chat-header-title { display: inline-flex; align-items: center; gap: 8px; }
+#docs-chat-header-title span { color: var(--docs-chat-text); font-size: 15px; }
+#docs-chat-header-actions { display: inline-flex; align-items: center; gap: 6px; }
+.docs-chat-icon-button {
+ border: 1px solid var(--docs-chat-panel-border);
+ background: transparent;
+ color: inherit;
+ border-radius: 8px;
+ width: 30px;
+ height: 30px;
+ cursor: pointer;
+ font-size: 16px;
+ line-height: 1;
+}
+#docs-chat-messages { flex: 1; padding: 12px 14px; overflow: auto; background: transparent; }
+#docs-chat-input {
+ display: flex;
+ gap: 8px;
+ padding: 12px 14px;
+ border-top: 1px solid var(--docs-chat-panel-border);
+ background: var(--docs-chat-surface);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+}
+#docs-chat-input textarea {
+ flex: 1;
+ resize: none;
+ border: 1px solid var(--docs-chat-panel-border);
+ border-radius: 10px;
+ padding: 9px 10px;
+ font-size: 14px;
+ line-height: 1.5;
+ font-family: inherit;
+ color: var(--docs-chat-text);
+ background: var(--docs-chat-surface);
+ min-height: 42px;
+ max-height: 120px;
+ overflow-y: auto;
+}
+#docs-chat-input textarea::placeholder { color: var(--docs-chat-muted); }
+#docs-chat-send {
+ background: var(--docs-chat-accent);
+ color: #fff;
+ border: none;
+ border-radius: 10px;
+ padding: 8px 14px;
+ cursor: pointer;
+ font-weight: 600;
+ font-family: inherit;
+ font-size: 14px;
+ transition: opacity 0.15s ease;
+}
+#docs-chat-send:hover { opacity: 0.9; }
+#docs-chat-send:active { opacity: 0.8; }
+.docs-chat-bubble {
+ margin-bottom: 10px;
+ padding: 10px 14px;
+ border-radius: 12px;
+ font-size: 14px;
+ line-height: 1.6;
+ max-width: 92%;
+}
+.docs-chat-user {
+ background: rgba(255, 125, 96, 0.15);
+ color: var(--docs-chat-text);
+ border: 1px solid rgba(255, 125, 96, 0.3);
+ align-self: flex-end;
+ white-space: pre-wrap;
+ margin-left: auto;
+}
+html[data-theme="dark"] .docs-chat-user {
+ background: rgba(255, 125, 96, 0.18);
+ border-color: rgba(255, 125, 96, 0.35);
+}
+.docs-chat-assistant {
+ background: var(--docs-chat-assistant-bg);
+ color: var(--docs-chat-text);
+ border: 1px solid var(--docs-chat-panel-border);
+}
+/* Markdown content styling for chat bubbles */
+.docs-chat-assistant p { margin: 0 0 10px 0; }
+.docs-chat-assistant p:last-child { margin-bottom: 0; }
+.docs-chat-assistant code {
+ background: var(--docs-chat-code-bg);
+ padding: 2px 6px;
+ border-radius: 5px;
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
+ font-size: 0.9em;
+}
+.docs-chat-assistant pre {
+ background: var(--docs-chat-code-bg);
+ padding: 10px 12px;
+ border-radius: 8px;
+ overflow-x: auto;
+ margin: 6px 0;
+ font-size: 0.9em;
+ max-width: 100%;
+ white-space: pre;
+ word-wrap: normal;
+}
+.docs-chat-assistant pre::-webkit-scrollbar-thumb { background: transparent; }
+.docs-chat-assistant pre:hover::-webkit-scrollbar-thumb { background: var(--docs-chat-panel-border); }
+@media (hover: none) {
+ .docs-chat-assistant pre { -webkit-overflow-scrolling: touch; }
+ .docs-chat-assistant pre::-webkit-scrollbar-thumb { background: var(--docs-chat-panel-border); }
+}
+.docs-chat-assistant pre code {
+ background: transparent;
+ padding: 0;
+ font-size: inherit;
+ white-space: pre;
+ word-wrap: normal;
+ display: block;
+}
+/* Compact single-line code blocks */
+.docs-chat-assistant pre.compact {
+ margin: 4px 0;
+ padding: 6px 10px;
+}
+/* Longer code blocks with copy button need extra top padding */
+.docs-chat-assistant pre:not(.compact) {
+ padding-top: 28px;
+}
+.docs-chat-assistant a {
+ color: var(--docs-chat-accent);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+}
+.docs-chat-assistant a:hover { opacity: 0.8; }
+.docs-chat-assistant ul, .docs-chat-assistant ol {
+ margin: 8px 0;
+ padding-left: 18px;
+ list-style: none;
+}
+.docs-chat-assistant li {
+ margin: 4px 0;
+ position: relative;
+ padding-left: 14px;
+}
+.docs-chat-assistant li::before {
+ content: "•";
+ position: absolute;
+ left: 0;
+ color: var(--docs-chat-muted);
+}
+.docs-chat-assistant strong { font-weight: 600; }
+.docs-chat-assistant em { font-style: italic; }
+.docs-chat-assistant h1, .docs-chat-assistant h2, .docs-chat-assistant h3 {
+ font-weight: 600;
+ margin: 12px 0 6px 0;
+ line-height: 1.3;
+}
+.docs-chat-assistant h1 { font-size: 1.2em; }
+.docs-chat-assistant h2 { font-size: 1.1em; }
+.docs-chat-assistant h3 { font-size: 1.05em; }
+.docs-chat-assistant blockquote {
+ border-left: 3px solid var(--docs-chat-accent);
+ margin: 10px 0;
+ padding: 4px 12px;
+ color: var(--docs-chat-muted);
+ background: var(--docs-chat-code-bg);
+ border-radius: 0 6px 6px 0;
+}
+.docs-chat-assistant hr {
+ border: none;
+ height: 1px;
+ background: var(--docs-chat-panel-border);
+ margin: 12px 0;
+}
+/* Copy buttons */
+.docs-chat-assistant { position: relative; padding-top: 28px; }
+.docs-chat-copy-response {
+ position: absolute;
+ top: 8px;
+ right: 8px;
+ background: var(--docs-chat-surface);
+ border: 1px solid var(--docs-chat-panel-border);
+ border-radius: 5px;
+ padding: 4px 8px;
+ font-size: 11px;
+ cursor: pointer;
+ color: var(--docs-chat-muted);
+ transition: color 0.15s ease, background 0.15s ease;
+}
+.docs-chat-copy-response:hover {
+ color: var(--docs-chat-text);
+ background: var(--docs-chat-code-bg);
+}
+.docs-chat-assistant pre {
+ position: relative;
+}
+.docs-chat-copy-code {
+ position: absolute;
+ top: 8px;
+ right: 8px;
+ background: var(--docs-chat-surface);
+ border: 1px solid var(--docs-chat-panel-border);
+ border-radius: 4px;
+ padding: 3px 7px;
+ font-size: 10px;
+ cursor: pointer;
+ color: var(--docs-chat-muted);
+ transition: color 0.15s ease, background 0.15s ease;
+ z-index: 1;
+}
+.docs-chat-copy-code:hover {
+ color: var(--docs-chat-text);
+ background: var(--docs-chat-code-bg);
+}
+/* Resize handle - left edge of expanded panel */
+#docs-chat-resize-handle {
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ width: 6px;
+ cursor: ew-resize;
+ z-index: 10;
+ display: none;
+}
+#docs-chat-root.docs-chat-expanded #docs-chat-resize-handle { display: block; }
+#docs-chat-resize-handle::after {
+ content: "";
+ position: absolute;
+ left: 1px;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 4px;
+ height: 40px;
+ border-radius: 2px;
+ background: var(--docs-chat-panel-border);
+ opacity: 0;
+ transition: opacity 0.15s ease, background 0.15s ease;
+}
+#docs-chat-resize-handle:hover::after,
+#docs-chat-resize-handle.docs-chat-dragging::after {
+ opacity: 1;
+ background: var(--docs-chat-accent);
+}
+@media (max-width: 520px) {
+ #docs-chat-resize-handle { display: none !important; }
+}
+`;
+ document.head.appendChild(style);
+
+ const root = document.createElement("div");
+ root.id = "docs-chat-root";
+
+ const button = document.createElement("button");
+ button.id = "docs-chat-button";
+ button.type = "button";
+ button.innerHTML =
+ `` +
+ `Ask Molty`;
+
+ const panel = document.createElement("div");
+ panel.id = "docs-chat-panel";
+ panel.style.display = "none";
+
+ // Resize handle for expandable sidebar width (desktop only)
+ const resizeHandle = document.createElement("div");
+ resizeHandle.id = "docs-chat-resize-handle";
+
+ const header = document.createElement("div");
+ header.id = "docs-chat-header";
+ header.innerHTML =
+ `