@sksharma72000/ai-chat-websdk 1.2.0 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ai-chat-websdk.es.js +22016 -6785
- package/ai-chat-websdk.standalone.js +447 -106
- package/ai-chat-websdk.umd.js +369 -28
- package/package.json +1 -1
- package/style.css +1 -1
- package/types/message.d.ts +97 -1
- package/utils/ensureKatexCss.d.ts +9 -0
- package/utils/printExamPaper.d.ts +5 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sksharma72000/ai-chat-websdk",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"description": "@sksharma72000/ai-chat-websdk is an embeddable, fully themeable AI chat widget for web apps. Supports JWT authentication with auto-refresh, rich content rendering (tables, code blocks, markdown), theming via CSS custom properties, and framework-agnostic mounting.",
|
|
5
5
|
"main": "./ai-chat-websdk.umd.js",
|
|
6
6
|
"module": "./ai-chat-websdk.es.js",
|
package/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.sdk-fab,.sdk-chat-window,.sdk-chat-window *{box-sizing:border-box;-webkit-font-smoothing:antialiased}.sdk-fab,.sdk-chat-window{--sdk-primary: #6366f1;--sdk-secondary: #8b5cf6;--sdk-bg: #f8fafc;--sdk-font: "Inter", "Segoe UI", system-ui, sans-serif;--sdk-radius: 16px;--sdk-user-bubble: #6366f1;--sdk-user-bubble-text: #ffffff;--sdk-header-gradient: linear-gradient(135deg, var(--sdk-primary) 0%, var(--sdk-secondary) 100%);--sdk-shadow: 0 24px 60px rgba(0, 0, 0, .18), 0 4px 16px rgba(0, 0, 0, .12);--sdk-shadow-sm: 0 2px 8px rgba(0, 0, 0, .08);font-family:var(--sdk-font)}.sdk-fab{position:fixed;bottom:24px;right:24px;z-index:9998;display:flex;align-items:center;gap:10px;padding:14px 20px;background:var(--sdk-header-gradient);color:#fff;border:none;border-radius:50px;cursor:pointer;box-shadow:0 8px 28px #6366f173;transition:transform .2s ease,box-shadow .2s ease;font-size:15px;font-weight:600;letter-spacing:.01em}.sdk-fab:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 12px 36px #6366f18c}.sdk-fab:active{transform:translateY(0) scale(.98)}.sdk-fab-logo{width:28px;height:28px;object-fit:contain;border-radius:6px}.sdk-fab-icon{width:24px;height:24px}.sdk-fab-label{white-space:nowrap}.sdk-fab-ping{position:absolute;top:6px;right:8px;width:10px;height:10px;border-radius:50%;background:#34d399;box-shadow:0 0 #34d39999;animation:sdk-ping 2s cubic-bezier(0,0,.2,1) infinite}@keyframes sdk-ping{0%{transform:scale(1);box-shadow:0 0 #34d39999}70%{transform:scale(1);box-shadow:0 0 0 9px #34d39900}to{transform:scale(1);box-shadow:0 0 #34d39900}}.sdk-chat-window{position:fixed;bottom:24px;right:24px;z-index:9999;width:380px;height:580px;display:flex;flex-direction:column;background:#fff;border-radius:var(--sdk-radius);box-shadow:var(--sdk-shadow);overflow:hidden;transition:height .3s cubic-bezier(.4,0,.2,1),width .3s cubic-bezier(.4,0,.2,1),bottom .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);animation:sdk-slide-up .35s cubic-bezier(.4,0,.2,1)}@keyframes sdk-slide-up{0%{opacity:0;transform:translateY(24px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}.sdk-chat-window--minimized{height:64px;bottom:0;right:24px;border-radius:var(--sdk-radius) var(--sdk-radius) 0 0;box-shadow:0 -4px 20px #0000002e,0 2px 8px #0000001a}.sdk-chat-window--fullscreen{bottom:0;right:0;width:100vw;height:100vh;border-radius:0}.sdk-chat-window--embedded{position:relative;bottom:auto;right:auto;width:100%;height:100%;border-radius:0;box-shadow:none;z-index:auto;animation:none}.sdk-sessions-panel{position:absolute;top:0;left:0;right:0;bottom:0;background:#fff;z-index:10;display:flex;flex-direction:column;transform:translate(-100%);transition:transform .25s cubic-bezier(.4,0,.2,1);overflow:hidden}.sdk-sessions-panel--open{transform:translate(0)}.sdk-sessions-header{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;background:var(--sdk-header-gradient);color:#fff;font-size:13px;font-weight:700;flex-shrink:0}.sdk-sessions-new{display:flex;align-items:center;gap:5px;background:#ffffff26;border:1px solid rgba(255,255,255,.25);color:#fff;border-radius:8px;padding:5px 10px;font-size:12px;font-weight:600;cursor:pointer;transition:background .15s;font-family:var(--sdk-font)}.sdk-sessions-new:hover{background:#ffffff40}.sdk-sessions-list{flex:1;overflow-y:auto;padding:8px}.sdk-sessions-empty{text-align:center;color:#94a3b8;font-size:13px;padding:32px 16px}.sdk-session-item{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:10px;cursor:pointer;transition:background .15s;border:1.5px solid transparent;margin-bottom:4px}.sdk-session-item:hover{background:#f1f5f9}.sdk-session-item--active{background:#ede9fe;border-color:var(--sdk-primary)}.sdk-session-item-icon{color:#94a3b8;flex-shrink:0;display:flex;align-items:center}.sdk-session-item--active .sdk-session-item-icon{color:var(--sdk-primary)}.sdk-session-item-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.sdk-session-item-name{font-size:13px;font-weight:500;color:#1e293b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdk-session-item-date{font-size:11px;color:#94a3b8}.sdk-session-item-del{flex-shrink:0;background:none;border:none;color:#cbd5e1;cursor:pointer;padding:6px;margin:-6px;border-radius:6px;display:flex;align-items:center;opacity:.45;transition:opacity .15s,color .15s,background .15s}.sdk-session-item:hover .sdk-session-item-del{opacity:.7}.sdk-session-item-del:hover,.sdk-session-item-del:focus-visible{opacity:1;color:#ef4444;background:#fee2e2;outline:none}.sdk-header{background:var(--sdk-header-gradient);color:#fff;padding:0 16px;height:64px;display:flex;align-items:center;justify-content:space-between;flex-shrink:0;gap:8px}.sdk-header--clickable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdk-header--clickable:hover{filter:brightness(1.08)}.sdk-header-left{display:flex;align-items:center;gap:12px;min-width:0}.sdk-header-logo{width:34px;height:34px;border-radius:8px;object-fit:contain;background:#fff3;padding:2px}.sdk-header-avatar{width:34px;height:34px;border-radius:10px;background:#ffffff40;display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0}.sdk-header-title-group{display:flex;flex-direction:column;min-width:0}.sdk-header-title{font-size:15px;font-weight:700;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdk-header-status{display:flex;align-items:center;gap:5px;font-size:11px;opacity:.85;margin-top:2px}.sdk-status-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.sdk-header-status--online .sdk-status-dot{background:#4ade80;animation:sdk-ping 2.5s infinite}.sdk-header-status--offline .sdk-status-dot{background:#f87171}.sdk-header-right{display:flex;align-items:center;gap:4px;flex-shrink:0}.sdk-ctrl-btn{width:30px;height:30px;border-radius:8px;border:none;background:#ffffff26;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s,transform .15s;flex-shrink:0}.sdk-ctrl-btn:hover{background:#ffffff47;transform:scale(1.08)}.sdk-ctrl-btn:active{transform:scale(.94)}.sdk-ctrl-btn--close:hover{background:#ef444480}.sdk-ctrl-btn--retry{background:#34d39940}.sdk-ctrl-btn--retry:hover{background:#34d39973}.sdk-action-banner{display:flex;align-items:center;gap:8px;padding:7px 16px;background:linear-gradient(90deg,#ede9fe,#e0e7ff);font-size:12px;font-weight:500;color:#4338ca;flex-shrink:0;border-bottom:1px solid #e0e7ff}.sdk-body-wrap{position:relative;flex:1;overflow:hidden;display:flex;flex-direction:column}.sdk-messages{flex:1;padding:20px 16px;overflow-y:auto;background:var(--sdk-bg);display:flex;flex-direction:column;gap:12px;scroll-behavior:smooth;position:relative}.sdk-messages::-webkit-scrollbar{width:5px}.sdk-messages::-webkit-scrollbar-track{background:transparent}.sdk-messages::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.sdk-messages::-webkit-scrollbar-thumb:hover{background:#94a3b8}.sdk-msg{display:flex;gap:10px;align-items:flex-end;animation:sdk-msg-in .25s ease}@keyframes sdk-msg-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.sdk-msg--user{flex-direction:row-reverse}.sdk-msg-avatar{width:30px;height:30px;border-radius:10px;background:var(--sdk-header-gradient);display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;color:#fff;flex-shrink:0;overflow:hidden}.sdk-msg-avatar img{width:100%;height:100%;object-fit:contain}.sdk-msg-body{display:flex;flex-direction:column;max-width:82%;gap:4px}.sdk-msg--user .sdk-msg-body{align-items:flex-end}.sdk-bubble{padding:12px 16px;border-radius:18px;font-size:14px;line-height:1.55;word-break:break-word;box-shadow:var(--sdk-shadow-sm)}.sdk-bubble--ai{background:#fff;color:#1e293b;border-bottom-left-radius:4px}.sdk-bubble--user{background:var(--sdk-user-bubble);color:var(--sdk-user-bubble-text);border-bottom-right-radius:4px}.sdk-bubble--typing{display:flex;align-items:center;gap:5px;padding:14px 18px}.sdk-bubble--typing span{display:block;width:8px;height:8px;background:#94a3b8;border-radius:50%;animation:sdk-bounce 1.4s infinite ease-in-out}.sdk-bubble--typing span:nth-child(1){animation-delay:-.32s}.sdk-bubble--typing span:nth-child(2){animation-delay:-.16s}@keyframes sdk-bounce{0%,80%,to{transform:scale(.7);opacity:.5}40%{transform:scale(1);opacity:1}}.sdk-msg-meta{display:flex;align-items:center;gap:8px;padding:0 4px}.sdk-msg--user .sdk-msg-meta{flex-direction:row-reverse}.sdk-msg-time{font-size:10px;color:#94a3b8;white-space:nowrap}.sdk-icon-btn{background:none;border:none;cursor:pointer;padding:3px 5px;border-radius:6px;color:#94a3b8;font-size:13px;display:flex;align-items:center;transition:color .2s,background .2s,transform .15s;opacity:0}.sdk-msg:hover .sdk-icon-btn{opacity:1}.sdk-icon-btn:hover{color:var(--sdk-primary);background:#6366f114;transform:scale(1.1)}.sdk-icon-btn--active{color:var(--sdk-primary)!important;opacity:1!important}.sdk-feedback{display:flex;gap:4px}.sdk-edit-area{display:flex;flex-direction:column;gap:0;width:100%;background:#fff;border:1.5px solid var(--sdk-primary);border-radius:12px;overflow:hidden;box-shadow:0 4px 16px #6366f121}.sdk-edit-header{display:flex;align-items:center;gap:6px;padding:7px 12px;background:linear-gradient(135deg,#6366f114,#8b5cf614);border-bottom:1px solid rgba(99,102,241,.12);font-size:11px;font-weight:700;color:var(--sdk-primary);text-transform:uppercase;letter-spacing:.05em}.sdk-edit-textarea{width:100%;min-height:76px;padding:10px 12px;border:none;font-family:var(--sdk-font);font-size:14px;resize:none;outline:none;line-height:1.5;color:#1e293b;background:#fff}.sdk-edit-footer{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#f8fafc;border-top:1px solid #f1f5f9}.sdk-edit-btns{display:flex;gap:6px}.sdk-btn-save,.sdk-btn-cancel{display:inline-flex;align-items:center;gap:5px;padding:5px 12px;border-radius:8px;border:none;font-size:12px;font-weight:700;cursor:pointer;transition:all .15s;font-family:var(--sdk-font)}.sdk-btn-save{background:var(--sdk-primary);color:#fff;box-shadow:0 2px 8px #6366f14d}.sdk-btn-save:hover:not(:disabled){opacity:.88;transform:translateY(-1px)}.sdk-btn-save:disabled{opacity:.45;cursor:not-allowed;box-shadow:none}.sdk-btn-cancel{background:#f1f5f9;color:#64748b;border:1px solid #e2e8f0}.sdk-btn-cancel:hover{background:#e2e8f0;color:#334155}.sdk-scroll-btn{position:sticky;bottom:8px;left:50%;transform:translate(-50%);z-index:10;background:var(--sdk-primary);color:#fff;border:none;width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 14px #6366f166;transition:transform .2s,box-shadow .2s;animation:sdk-msg-in .2s ease}.sdk-scroll-btn:hover{transform:translate(-50%) translateY(-2px);box-shadow:0 6px 20px #6366f180}.sdk-input-area{padding:12px 16px 10px;background:#fff;border-top:1px solid #f1f5f9;flex-shrink:0;display:flex;flex-direction:column;gap:8px}.sdk-pending-hint{display:flex;align-items:center;gap:6px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:8px;padding:6px 10px;font-size:12px;color:#1d4ed8}.sdk-input-row{display:flex;gap:8px;align-items:center}.sdk-input{flex:1;padding:12px 16px;border:1.5px solid #e2e8f0;border-radius:14px;font-family:var(--sdk-font);font-size:14px;outline:none;background:#f8fafc;color:#1e293b;transition:border-color .2s,background .2s,box-shadow .2s}.sdk-input:focus{border-color:var(--sdk-primary);background:#fff;box-shadow:0 0 0 3px #6366f11f}.sdk-input:disabled{opacity:.6;cursor:not-allowed}.sdk-input::placeholder{color:#94a3b8}.sdk-send-btn{width:44px;height:44px;border-radius:12px;border:none;background:var(--sdk-header-gradient);color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;transition:opacity .2s,transform .15s,box-shadow .2s;box-shadow:0 3px 10px #6366f159}.sdk-send-btn:hover:not(:disabled){transform:scale(1.06);box-shadow:0 5px 16px #6366f173}.sdk-send-btn:active:not(:disabled){transform:scale(.96)}.sdk-send-btn:disabled{opacity:.45;cursor:not-allowed;box-shadow:none}.sdk-input-footer{text-align:center;font-size:10px;color:#cbd5e1;letter-spacing:.02em}.sdk-input-bar{display:flex;align-items:center;justify-content:space-between}.sdk-char-counter{font-size:10px;color:#94a3b8;transition:color .2s;font-variant-numeric:tabular-nums}.sdk-char-counter--warn{color:#f59e0b}.sdk-char-counter--limit{color:#ef4444;font-weight:700}.sdk-spinner{display:inline-block;width:14px;height:14px;border:2px solid rgba(99,102,241,.3);border-top-color:var(--sdk-primary);border-radius:50%;animation:sdk-spin .8s linear infinite}@keyframes sdk-spin{to{transform:rotate(360deg)}}.sdk-markdown{line-height:1.65}.sdk-markdown h1,.sdk-markdown h2,.sdk-markdown h3,.sdk-markdown h4,.sdk-markdown h5,.sdk-markdown h6{margin:.6em 0 .3em;line-height:1.2;font-weight:700}.sdk-markdown h1{font-size:1.25em}.sdk-markdown h2{font-size:1.1em}.sdk-markdown h3{font-size:1em}.sdk-markdown p{margin:.4em 0}.sdk-markdown ul,.sdk-markdown ol{margin:.4em 0;padding-left:1.4em}.sdk-markdown li{margin:.15em 0}.sdk-markdown blockquote{margin:.5em 0;padding:.4em .8em;background:#6366f10f;border-left:3px solid var(--sdk-primary);border-radius:0 6px 6px 0;color:#475569;font-style:italic}.sdk-inline-code{background:#f1f5f9;color:#7c3aed;padding:.15em .4em;border-radius:5px;font-size:.88em;font-family:Fira Code,Cascadia Code,monospace}.sdk-markdown a{color:var(--sdk-primary);text-decoration:underline}.sdk-markdown strong{font-weight:700}.sdk-markdown em{font-style:italic}.sdk-md-table{width:100%;border-collapse:collapse;font-size:12px;margin:.5em 0}.sdk-md-table th,.sdk-md-table td{border:1px solid #e2e8f0;padding:6px 10px;text-align:left}.sdk-md-table th{background:#f1f5f9;font-weight:600}.sdk-md-table tr:nth-child(2n){background:#f8fafc}.sdk-table-wrapper{margin:4px 0;border-radius:10px;overflow:hidden;border:1px solid #e2e8f0}.sdk-table-title{background:#f1f5f9;padding:8px 12px;font-size:12px;font-weight:600;color:#475569;border-bottom:1px solid #e2e8f0}.sdk-table-scroll{overflow-x:auto;max-height:220px;overflow-y:auto}.sdk-table{width:100%;border-collapse:collapse;font-size:12px}.sdk-table th{background:#f8fafc;padding:8px 12px;text-align:left;font-weight:600;color:#475569;position:sticky;top:0;border-bottom:1px solid #e2e8f0;white-space:nowrap}.sdk-table td{padding:6px 12px;border-bottom:1px solid #f1f5f9;color:#334155;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdk-table tr:hover td{background:#f8fafc}.sdk-table-footer{padding:5px 12px;background:#f8fafc;font-size:11px;color:#94a3b8;border-top:1px solid #e2e8f0}.sdk-code-block{margin:4px 0;border-radius:8px;overflow:hidden;border:1px solid #334155;position:relative}.sdk-code-title{background:#1e293b;color:#94a3b8;padding:6px 12px;font-size:11px;font-weight:600;font-family:monospace}.sdk-copy-btn{position:absolute;top:6px;right:8px;background:#ffffff1a;border:1px solid rgba(255,255,255,.15);color:#94a3b8;font-size:11px;padding:3px 8px;border-radius:5px;cursor:pointer;z-index:1;transition:background .2s}.sdk-copy-btn:hover{background:#ffffff2e;color:#e2e8f0}.sdk-plan{background:linear-gradient(135deg,#f0fdf4,#f0f9ff);border:1px solid #bbf7d0;border-radius:12px;padding:12px 14px;font-size:13px;margin:4px 0}.sdk-plan-header{display:flex;justify-content:space-between;align-items:center;font-weight:700;margin-bottom:6px;font-size:14px}.sdk-plan-status{font-size:11px;font-weight:600;padding:2px 8px;border-radius:20px;text-transform:uppercase}.sdk-plan-status--executing{background:#fef3c7;color:#b45309}.sdk-plan-status--completed{background:#d1fae5;color:#065f46}.sdk-plan-status--failed{background:#fee2e2;color:#991b1b}.sdk-plan-query{font-size:12px;color:#475569;margin-bottom:8px;font-style:italic}.sdk-plan-progress-bar{background:#e2e8f0;height:5px;border-radius:3px;overflow:hidden;margin-bottom:5px}.sdk-plan-progress-fill{height:100%;background:var(--sdk-header-gradient);border-radius:3px;transition:width .5s ease}.sdk-plan-counter{font-size:11px;color:#94a3b8;margin-bottom:8px}.sdk-plan-steps{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:4px}.sdk-plan-step{display:flex;align-items:center;gap:6px;font-size:12px;padding:4px 8px;border-radius:6px}.sdk-plan-step--completed{color:#065f46;background:#10b98114}.sdk-plan-step--executing{color:#b45309;background:#f59e0b14;font-weight:600}.sdk-plan-step--pending{color:#64748b}.sdk-plan-step-icon{font-size:13px;width:16px}.sdk-clarification{padding:4px 0}.sdk-clarification-msg{font-size:14px;color:#334155;margin-bottom:10px}.sdk-clarification-options{display:flex;flex-direction:column;gap:6px}.sdk-clarification-btn{padding:10px 16px;border:1.5px solid #c7d2fe;border-radius:10px;background:#fff;color:#4338ca;font-size:13px;font-weight:500;cursor:pointer;text-align:left;transition:all .2s}.sdk-clarification-btn:hover{background:#ede9fe;border-color:var(--sdk-primary);transform:translate(3px)}.sdk-error-msg{color:#991b1b;background:#fef2f2;border-left:3px solid #ef4444;padding:10px 12px;border-radius:0 8px 8px 0;font-size:13px}.sdk-error-details{margin-top:6px;font-size:11px;font-family:monospace;color:#7f1d1d;white-space:pre-wrap}@media (max-width: 480px){.sdk-chat-window:not(.sdk-chat-window--fullscreen){width:calc(100vw - 24px);right:12px;bottom:12px}.sdk-fab{right:12px;bottom:12px;padding:12px 16px;font-size:14px}}
|
|
1
|
+
.sdk-fab,.sdk-chat-window,.sdk-chat-window *{box-sizing:border-box;-webkit-font-smoothing:antialiased}.sdk-fab,.sdk-chat-window{--sdk-primary: #6366f1;--sdk-secondary: #8b5cf6;--sdk-bg: #f8fafc;--sdk-font: "Inter", "Segoe UI", system-ui, sans-serif;--sdk-radius: 16px;--sdk-user-bubble: #6366f1;--sdk-user-bubble-text: #ffffff;--sdk-header-gradient: linear-gradient(135deg, var(--sdk-primary) 0%, var(--sdk-secondary) 100%);--sdk-shadow: 0 24px 60px rgba(0, 0, 0, .18), 0 4px 16px rgba(0, 0, 0, .12);--sdk-shadow-sm: 0 2px 8px rgba(0, 0, 0, .08);font-family:var(--sdk-font)}.sdk-fab{position:fixed;bottom:24px;right:24px;z-index:9998;display:flex;align-items:center;gap:10px;padding:14px 20px;background:var(--sdk-header-gradient);color:#fff;border:none;border-radius:50px;cursor:pointer;box-shadow:0 8px 28px #6366f173;transition:transform .2s ease,box-shadow .2s ease;font-size:15px;font-weight:600;letter-spacing:.01em}.sdk-fab:hover{transform:translateY(-3px) scale(1.02);box-shadow:0 12px 36px #6366f18c}.sdk-fab:active{transform:translateY(0) scale(.98)}.sdk-fab-logo{width:28px;height:28px;object-fit:contain;border-radius:6px}.sdk-fab-icon{width:24px;height:24px}.sdk-fab-label{white-space:nowrap}.sdk-fab-ping{position:absolute;top:6px;right:8px;width:10px;height:10px;border-radius:50%;background:#34d399;box-shadow:0 0 #34d39999;animation:sdk-ping 2s cubic-bezier(0,0,.2,1) infinite}@keyframes sdk-ping{0%{transform:scale(1);box-shadow:0 0 #34d39999}70%{transform:scale(1);box-shadow:0 0 0 9px #34d39900}to{transform:scale(1);box-shadow:0 0 #34d39900}}.sdk-chat-window{position:fixed;bottom:24px;right:24px;z-index:9999;width:380px;height:580px;display:flex;flex-direction:column;background:#fff;border-radius:var(--sdk-radius);box-shadow:var(--sdk-shadow);overflow:hidden;transition:height .3s cubic-bezier(.4,0,.2,1),width .3s cubic-bezier(.4,0,.2,1),bottom .3s cubic-bezier(.4,0,.2,1),border-radius .3s cubic-bezier(.4,0,.2,1),transform .3s cubic-bezier(.4,0,.2,1);animation:sdk-slide-up .35s cubic-bezier(.4,0,.2,1)}@keyframes sdk-slide-up{0%{opacity:0;transform:translateY(24px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}.sdk-chat-window--minimized{height:64px;bottom:0;right:24px;border-radius:var(--sdk-radius) var(--sdk-radius) 0 0;box-shadow:0 -4px 20px #0000002e,0 2px 8px #0000001a}.sdk-chat-window--fullscreen{bottom:0;right:0;width:100vw;height:100vh;border-radius:0}.sdk-chat-window--embedded{position:relative;bottom:auto;right:auto;width:100%;height:100%;border-radius:0;box-shadow:none;z-index:auto;animation:none}.sdk-sessions-panel{position:absolute;top:0;left:0;right:0;bottom:0;background:#fff;z-index:10;display:flex;flex-direction:column;transform:translate(-100%);transition:transform .25s cubic-bezier(.4,0,.2,1);overflow:hidden}.sdk-sessions-panel--open{transform:translate(0)}.sdk-sessions-header{display:flex;align-items:center;justify-content:space-between;padding:14px 16px;background:var(--sdk-header-gradient);color:#fff;font-size:13px;font-weight:700;flex-shrink:0}.sdk-sessions-new{display:flex;align-items:center;gap:5px;background:#ffffff26;border:1px solid rgba(255,255,255,.25);color:#fff;border-radius:8px;padding:5px 10px;font-size:12px;font-weight:600;cursor:pointer;transition:background .15s;font-family:var(--sdk-font)}.sdk-sessions-new:hover{background:#ffffff40}.sdk-sessions-list{flex:1;overflow-y:auto;padding:8px}.sdk-sessions-empty{text-align:center;color:#94a3b8;font-size:13px;padding:32px 16px}.sdk-session-item{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:10px;cursor:pointer;transition:background .15s;border:1.5px solid transparent;margin-bottom:4px}.sdk-session-item:hover{background:#f1f5f9}.sdk-session-item--active{background:#ede9fe;border-color:var(--sdk-primary)}.sdk-session-item-icon{color:#94a3b8;flex-shrink:0;display:flex;align-items:center}.sdk-session-item--active .sdk-session-item-icon{color:var(--sdk-primary)}.sdk-session-item-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.sdk-session-item-name{font-size:13px;font-weight:500;color:#1e293b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdk-session-item-date{font-size:11px;color:#94a3b8}.sdk-session-item-del{flex-shrink:0;background:none;border:none;color:#cbd5e1;cursor:pointer;padding:6px;margin:-6px;border-radius:6px;display:flex;align-items:center;opacity:.45;transition:opacity .15s,color .15s,background .15s}.sdk-session-item:hover .sdk-session-item-del{opacity:.7}.sdk-session-item-del:hover,.sdk-session-item-del:focus-visible{opacity:1;color:#ef4444;background:#fee2e2;outline:none}.sdk-header{background:var(--sdk-header-gradient);color:#fff;padding:0 16px;height:64px;display:flex;align-items:center;justify-content:space-between;flex-shrink:0;gap:8px}.sdk-header--clickable{cursor:pointer;-webkit-user-select:none;user-select:none}.sdk-header--clickable:hover{filter:brightness(1.08)}.sdk-header-left{display:flex;align-items:center;gap:12px;min-width:0}.sdk-header-logo{width:34px;height:34px;border-radius:8px;object-fit:contain;background:#fff3;padding:2px}.sdk-header-avatar{width:34px;height:34px;border-radius:10px;background:#ffffff40;display:flex;align-items:center;justify-content:center;color:#fff;flex-shrink:0}.sdk-header-title-group{display:flex;flex-direction:column;min-width:0}.sdk-header-title{font-size:15px;font-weight:700;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdk-header-status{display:flex;align-items:center;gap:5px;font-size:11px;opacity:.85;margin-top:2px}.sdk-status-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.sdk-header-status--online .sdk-status-dot{background:#4ade80;animation:sdk-ping 2.5s infinite}.sdk-header-status--offline .sdk-status-dot{background:#f87171}.sdk-header-right{display:flex;align-items:center;gap:4px;flex-shrink:0}.sdk-ctrl-btn{width:30px;height:30px;border-radius:8px;border:none;background:#ffffff26;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s,transform .15s;flex-shrink:0}.sdk-ctrl-btn:hover{background:#ffffff47;transform:scale(1.08)}.sdk-ctrl-btn:active{transform:scale(.94)}.sdk-ctrl-btn--close:hover{background:#ef444480}.sdk-ctrl-btn--retry{background:#34d39940}.sdk-ctrl-btn--retry:hover{background:#34d39973}.sdk-action-banner{display:flex;align-items:center;gap:8px;padding:7px 16px;background:linear-gradient(90deg,#ede9fe,#e0e7ff);font-size:12px;font-weight:500;color:#4338ca;flex-shrink:0;border-bottom:1px solid #e0e7ff}.sdk-body-wrap{position:relative;flex:1;overflow:hidden;display:flex;flex-direction:column}.sdk-messages{flex:1;padding:20px 16px;overflow-y:auto;background:var(--sdk-bg);display:flex;flex-direction:column;gap:12px;scroll-behavior:smooth;position:relative}.sdk-messages::-webkit-scrollbar{width:5px}.sdk-messages::-webkit-scrollbar-track{background:transparent}.sdk-messages::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:3px}.sdk-messages::-webkit-scrollbar-thumb:hover{background:#94a3b8}.sdk-msg{display:flex;gap:10px;align-items:flex-end;animation:sdk-msg-in .25s ease}@keyframes sdk-msg-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.sdk-msg--user{flex-direction:row-reverse}.sdk-msg-avatar{width:30px;height:30px;border-radius:10px;background:var(--sdk-header-gradient);display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:700;color:#fff;flex-shrink:0;overflow:hidden}.sdk-msg-avatar img{width:100%;height:100%;object-fit:contain}.sdk-msg-body{display:flex;flex-direction:column;max-width:82%;gap:4px}.sdk-msg--user .sdk-msg-body{align-items:flex-end}.sdk-msg-body--editing{width:80%;max-width:80%}.sdk-bubble{padding:12px 16px;border-radius:18px;font-size:14px;line-height:1.55;word-break:break-word;box-shadow:var(--sdk-shadow-sm)}.sdk-bubble--ai{background:#fff;color:#1e293b;border-bottom-left-radius:4px}.sdk-bubble--user{background:var(--sdk-user-bubble);color:var(--sdk-user-bubble-text);border-bottom-right-radius:4px}.sdk-bubble--typing{display:flex;align-items:center;gap:5px;padding:14px 18px}.sdk-bubble--typing span{display:block;width:8px;height:8px;background:#94a3b8;border-radius:50%;animation:sdk-bounce 1.4s infinite ease-in-out}.sdk-bubble--typing span:nth-child(1){animation-delay:-.32s}.sdk-bubble--typing span:nth-child(2){animation-delay:-.16s}@keyframes sdk-bounce{0%,80%,to{transform:scale(.7);opacity:.5}40%{transform:scale(1);opacity:1}}.sdk-msg-meta{display:flex;align-items:center;gap:8px;padding:0 4px}.sdk-msg--user .sdk-msg-meta{flex-direction:row-reverse}.sdk-msg-time{font-size:10px;color:#94a3b8;white-space:nowrap}.sdk-icon-btn{background:none;border:none;cursor:pointer;padding:3px 5px;border-radius:6px;color:#94a3b8;font-size:13px;display:flex;align-items:center;transition:color .2s,background .2s,transform .15s;opacity:0}.sdk-msg:hover .sdk-icon-btn{opacity:1}.sdk-icon-btn:hover{color:var(--sdk-primary);background:#6366f114;transform:scale(1.1)}.sdk-icon-btn--active{color:var(--sdk-primary)!important;opacity:1!important}.sdk-feedback{display:flex;gap:4px}.sdk-edit-area{display:flex;flex-direction:column;gap:0;width:100%;background:#fff;border:1.5px solid var(--sdk-primary);border-radius:12px;overflow:hidden;box-shadow:0 4px 16px #6366f121}.sdk-edit-header{display:flex;align-items:center;gap:6px;padding:7px 12px;background:linear-gradient(135deg,#6366f114,#8b5cf614);border-bottom:1px solid rgba(99,102,241,.12);font-size:11px;font-weight:700;color:var(--sdk-primary);text-transform:uppercase;letter-spacing:.05em}.sdk-edit-textarea{width:100%;min-height:76px;padding:10px 12px;border:none;font-family:var(--sdk-font);font-size:14px;resize:none;outline:none;line-height:1.5;color:#1e293b;background:#fff}.sdk-edit-footer{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:#f8fafc;border-top:1px solid #f1f5f9}.sdk-edit-btns{display:flex;gap:6px}.sdk-btn-save,.sdk-btn-cancel{display:inline-flex;align-items:center;gap:5px;padding:5px 12px;border-radius:8px;border:none;font-size:12px;font-weight:700;cursor:pointer;transition:all .15s;font-family:var(--sdk-font)}.sdk-btn-save{background:var(--sdk-primary);color:#fff;box-shadow:0 2px 8px #6366f14d}.sdk-btn-save:hover:not(:disabled){opacity:.88;transform:translateY(-1px)}.sdk-btn-save:disabled{opacity:.45;cursor:not-allowed;box-shadow:none}.sdk-btn-cancel{background:#f1f5f9;color:#64748b;border:1px solid #e2e8f0}.sdk-btn-cancel:hover{background:#e2e8f0;color:#334155}.sdk-scroll-btn{position:sticky;bottom:8px;left:50%;transform:translate(-50%);z-index:10;background:var(--sdk-primary);color:#fff;border:none;width:36px;height:36px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 14px #6366f166;transition:transform .2s,box-shadow .2s;animation:sdk-msg-in .2s ease}.sdk-scroll-btn:hover{transform:translate(-50%) translateY(-2px);box-shadow:0 6px 20px #6366f180}.sdk-input-area{padding:12px 16px 10px;background:#fff;border-top:1px solid #f1f5f9;flex-shrink:0;display:flex;flex-direction:column;gap:8px}.sdk-pending-hint{display:flex;align-items:center;gap:6px;background:#eff6ff;border:1px solid #bfdbfe;border-radius:8px;padding:6px 10px;font-size:12px;color:#1d4ed8}.sdk-input-row{display:flex;gap:8px;align-items:center}.sdk-input{flex:1;padding:12px 16px;border:1.5px solid #e2e8f0;border-radius:14px;font-family:var(--sdk-font);font-size:14px;outline:none;background:#f8fafc;color:#1e293b;transition:border-color .2s,background .2s,box-shadow .2s}.sdk-input:focus{border-color:var(--sdk-primary);background:#fff;box-shadow:0 0 0 3px #6366f11f}.sdk-input:disabled{opacity:.6;cursor:not-allowed}.sdk-input::placeholder{color:#94a3b8}.sdk-send-btn{width:44px;height:44px;border-radius:12px;border:none;background:var(--sdk-header-gradient);color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;transition:opacity .2s,transform .15s,box-shadow .2s;box-shadow:0 3px 10px #6366f159}.sdk-send-btn:hover:not(:disabled){transform:scale(1.06);box-shadow:0 5px 16px #6366f173}.sdk-send-btn:active:not(:disabled){transform:scale(.96)}.sdk-send-btn:disabled{opacity:.45;cursor:not-allowed;box-shadow:none}.sdk-input-footer{text-align:center;font-size:10px;color:#cbd5e1;letter-spacing:.02em}.sdk-input-bar{display:flex;align-items:center;justify-content:space-between}.sdk-char-counter{font-size:10px;color:#94a3b8;transition:color .2s;font-variant-numeric:tabular-nums}.sdk-char-counter--warn{color:#f59e0b}.sdk-char-counter--limit{color:#ef4444;font-weight:700}.sdk-spinner{display:inline-block;width:14px;height:14px;border:2px solid rgba(99,102,241,.3);border-top-color:var(--sdk-primary);border-radius:50%;animation:sdk-spin .8s linear infinite}@keyframes sdk-spin{to{transform:rotate(360deg)}}.sdk-markdown{line-height:1.65}.sdk-markdown h1,.sdk-markdown h2,.sdk-markdown h3,.sdk-markdown h4,.sdk-markdown h5,.sdk-markdown h6{margin:.6em 0 .3em;line-height:1.2;font-weight:700}.sdk-markdown h1{font-size:1.25em}.sdk-markdown h2{font-size:1.1em}.sdk-markdown h3{font-size:1em}.sdk-markdown p{margin:.4em 0}.sdk-markdown ul,.sdk-markdown ol{margin:.4em 0;padding-left:1.4em}.sdk-markdown li{margin:.15em 0}.sdk-markdown blockquote{margin:.5em 0;padding:.4em .8em;background:#6366f10f;border-left:3px solid var(--sdk-primary);border-radius:0 6px 6px 0;color:#475569;font-style:italic}.sdk-inline-code{background:#f1f5f9;color:#7c3aed;padding:.15em .4em;border-radius:5px;font-size:.88em;font-family:Fira Code,Cascadia Code,monospace}.sdk-markdown a{color:var(--sdk-primary);text-decoration:underline}.sdk-markdown strong{font-weight:700}.sdk-markdown em{font-style:italic}.sdk-md-table{width:100%;border-collapse:collapse;font-size:12px;margin:.5em 0}.sdk-md-table th,.sdk-md-table td{border:1px solid #e2e8f0;padding:6px 10px;text-align:left}.sdk-md-table th{background:#f1f5f9;font-weight:600}.sdk-md-table tr:nth-child(2n){background:#f8fafc}.sdk-table-wrapper{margin:4px 0;border-radius:10px;overflow:hidden;border:1px solid #e2e8f0}.sdk-table-title{background:#f1f5f9;padding:8px 12px;font-size:12px;font-weight:600;color:#475569;border-bottom:1px solid #e2e8f0}.sdk-table-scroll{overflow-x:auto;max-height:220px;overflow-y:auto}.sdk-table{width:100%;border-collapse:collapse;font-size:12px}.sdk-table th{background:#f8fafc;padding:8px 12px;text-align:left;font-weight:600;color:#475569;position:sticky;top:0;border-bottom:1px solid #e2e8f0;white-space:nowrap}.sdk-table td{padding:6px 12px;border-bottom:1px solid #f1f5f9;color:#334155;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdk-table tr:hover td{background:#f8fafc}.sdk-table-footer{padding:5px 12px;background:#f8fafc;font-size:11px;color:#94a3b8;border-top:1px solid #e2e8f0}.sdk-code-block{margin:4px 0;border-radius:8px;overflow:hidden;border:1px solid #334155;position:relative}.sdk-code-title{background:#1e293b;color:#94a3b8;padding:6px 12px;font-size:11px;font-weight:600;font-family:monospace}.sdk-copy-btn{position:absolute;top:6px;right:8px;background:#ffffff1a;border:1px solid rgba(255,255,255,.15);color:#94a3b8;font-size:11px;padding:3px 8px;border-radius:5px;cursor:pointer;z-index:1;transition:background .2s}.sdk-copy-btn:hover{background:#ffffff2e;color:#e2e8f0}.sdk-plan{background:linear-gradient(135deg,#f0fdf4,#f0f9ff);border:1px solid #bbf7d0;border-radius:12px;padding:12px 14px;font-size:13px;margin:4px 0}.sdk-plan-header{display:flex;justify-content:space-between;align-items:center;font-weight:700;margin-bottom:6px;font-size:14px}.sdk-plan-status{font-size:11px;font-weight:600;padding:2px 8px;border-radius:20px;text-transform:uppercase}.sdk-plan-status--executing{background:#fef3c7;color:#b45309}.sdk-plan-status--completed{background:#d1fae5;color:#065f46}.sdk-plan-status--failed{background:#fee2e2;color:#991b1b}.sdk-plan-query{font-size:12px;color:#475569;margin-bottom:8px;font-style:italic}.sdk-plan-progress-bar{background:#e2e8f0;height:5px;border-radius:3px;overflow:hidden;margin-bottom:5px}.sdk-plan-progress-fill{height:100%;background:var(--sdk-header-gradient);border-radius:3px;transition:width .5s ease}.sdk-plan-counter{font-size:11px;color:#94a3b8;margin-bottom:8px}.sdk-plan-steps{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:4px}.sdk-plan-step{display:flex;align-items:center;gap:6px;font-size:12px;padding:4px 8px;border-radius:6px}.sdk-plan-step--completed{color:#065f46;background:#10b98114}.sdk-plan-step--executing{color:#b45309;background:#f59e0b14;font-weight:600}.sdk-plan-step--pending{color:#64748b}.sdk-plan-step-icon{font-size:13px;width:16px}.sdk-clarification{padding:4px 0}.sdk-clarification-msg{font-size:14px;color:#334155;margin-bottom:10px}.sdk-clarification-options{display:flex;flex-direction:column;gap:6px}.sdk-clarification-btn{padding:10px 16px;border:1.5px solid #c7d2fe;border-radius:10px;background:#fff;color:#4338ca;font-size:13px;font-weight:500;cursor:pointer;text-align:left;transition:all .2s}.sdk-clarification-btn:hover{background:#ede9fe;border-color:var(--sdk-primary);transform:translate(3px)}.sdk-error-msg{color:#991b1b;background:#fef2f2;border-left:3px solid #ef4444;padding:10px 12px;border-radius:0 8px 8px 0;font-size:13px}.sdk-error-details{margin-top:6px;font-size:11px;font-family:monospace;color:#7f1d1d;white-space:pre-wrap}@media (max-width: 480px){.sdk-chat-window:not(.sdk-chat-window--fullscreen){width:calc(100vw - 24px);right:12px;bottom:12px}.sdk-fab{right:12px;bottom:12px;padding:12px 16px;font-size:14px}}.sdk-exam{border:1px solid #e2e8f0;border-radius:10px;background:#fff;padding:16px 18px 18px;font-size:13.5px;color:#1e293b;line-height:1.55}.sdk-exam-actions{display:flex;justify-content:flex-end;flex-wrap:wrap;gap:6px;margin-bottom:8px}.sdk-exam-action-btn{font-family:var(--sdk-font);font-size:12px;border:1px solid var(--sdk-primary);color:var(--sdk-primary);background:transparent;border-radius:6px;padding:4px 10px;cursor:pointer;white-space:nowrap}.sdk-exam-action-btn:hover{background:var(--sdk-primary);color:#fff}.sdk-exam-head{text-align:center;border-bottom:2px solid #1e293b;padding-bottom:10px;margin-bottom:14px}.sdk-exam-heading{font-size:12.5px;font-weight:700;text-transform:uppercase;letter-spacing:.4px;color:#334155;margin-bottom:2px}.sdk-exam-title{font-size:16px;font-weight:700;margin:0 0 2px;letter-spacing:.3px}.sdk-exam-subtitle{font-size:13px;font-weight:600;color:#475569}.sdk-exam-meta{display:flex;justify-content:space-between;flex-wrap:wrap;gap:4px 20px;margin-top:8px;font-size:12.5px;color:#334155}.sdk-exam-candidate{display:flex;flex-wrap:wrap;gap:4px 24px;margin-top:8px;padding-top:6px;border-top:1px dashed #cbd5e1;font-size:12px;color:#334155;text-align:left}.sdk-exam-candidate-line{display:inline-block;min-width:90px;border-bottom:1px dotted #64748b;vertical-align:baseline}.sdk-exam-instructions{border:1px solid #cbd5e1;border-radius:6px;padding:8px 12px;margin-bottom:14px;font-size:12.5px;background:#f8fafc}.sdk-exam-instructions-title{font-weight:700;margin-bottom:3px}.sdk-exam-instructions ol{margin:0;padding-left:20px}.sdk-exam-section{margin:14px 0}.sdk-exam-section-head{display:flex;justify-content:space-between;align-items:baseline;font-weight:700;background:#f1f5f9;border:1px solid #cbd5e1;border-radius:4px;padding:4px 10px}.sdk-exam-section-name{font-size:12.5px;letter-spacing:.3px}.sdk-exam-section-marks{font-size:12px;font-weight:600;color:#475569}.sdk-exam-section-instruction{font-style:italic;font-size:12.5px;margin:5px 2px;color:#475569}.sdk-exam-qs{list-style:none;margin:6px 0 0;padding:0}.sdk-exam-q{display:flex;gap:8px;margin:10px 0}.sdk-exam-q-num{font-weight:700;min-width:22px}.sdk-exam-q-main{flex:1;min-width:0}.sdk-exam-q-inner{overflow:hidden}.sdk-exam-q-inner+.sdk-exam-q-inner{margin-top:4px}.sdk-exam-q-text>p:first-child{margin-top:0}.sdk-exam-q-text>p:last-child{margin-bottom:0}.sdk-exam-parts{margin:4px 0 0}.sdk-exam-part{display:flex;gap:6px;margin:4px 0}.sdk-exam-part-label{font-weight:600;min-width:20px}.sdk-exam-part-body{flex:1;min-width:0;overflow:hidden}.sdk-exam-figure{font-family:SFMono-Regular,Courier New,monospace;white-space:pre;overflow-x:auto;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;padding:8px 10px;font-size:12px;line-height:1.4;margin:6px 0}.sdk-exam-marks{float:right;margin:0 0 2px 12px;font-weight:700;white-space:nowrap;color:#334155}.sdk-exam-source{clear:both;font-size:11px;color:#94a3b8;font-style:italic;margin-top:2px}.sdk-exam-or{clear:both;text-align:center;font-weight:700;color:#475569;margin:6px 0}.sdk-exam-footer{clear:both;text-align:center;font-weight:700;letter-spacing:.5px;color:#334155;margin:16px 0 4px}.sdk-exam-distribution{margin-top:16px;border-top:1px solid #cbd5e1;padding-top:8px;font-size:12.5px}.sdk-exam-distribution-title{font-weight:700;margin-bottom:3px}.sdk-exam-distribution ul{list-style:none;margin:0;padding:0}.sdk-exam-distribution li{display:flex;justify-content:space-between;max-width:300px;padding:1px 0}.sdk-exam-key{margin-top:14px;font-size:12.5px}.sdk-exam-key summary{font-weight:700;cursor:pointer;color:var(--sdk-primary)}.sdk-exam-key ol{list-style:none;margin:8px 0 0;padding:0}.sdk-exam-key li{display:flex;gap:6px;margin:4px 0}.sdk-exam-key-num{font-weight:600;min-width:20px}.sdk-exam-key-body{flex:1;min-width:0}.sdk-exam-note{margin-top:12px;font-size:11.5px;font-style:italic;color:#64748b;border-left:3px solid #cbd5e1;padding-left:8px}.sdk-exam .katex{font-size:1.02em}.sdk-exam-figure .katex{font-size:1em}.sdk-exam-figure-wrap{margin:6px 0}.sdk-exam-figure-cap,.sdk-exam-block-table .sdk-table-title{font-size:11.5px;color:#64748b;font-style:italic;margin-top:3px}.sdk-exam-block-table{margin:6px 0}.sdk-exam-block-table .sdk-table-wrapper{margin:0}.sdk-exam-passage{margin:6px 0;padding:8px 12px;border-left:3px solid var(--sdk-primary);background:#f8fafc;border-radius:0 6px 6px 0;font-size:13px}.sdk-exam-passage-title{font-weight:700;margin-bottom:4px}.sdk-exam-choices{list-style:none;margin:5px 0;padding:0}.sdk-exam-choices--block{display:block}.sdk-exam-choices--block .sdk-exam-choice{display:flex;gap:6px;margin:3px 0}.sdk-exam-choices--inline{display:flex;flex-wrap:wrap;gap:6px 18px}.sdk-exam-choices--inline .sdk-exam-choice{display:inline-flex;gap:5px}.sdk-exam-choice-label{font-weight:600}.sdk-exam-matching{display:flex;gap:24px;margin:6px 0}.sdk-exam-matching-col{list-style:none;margin:0;padding:0;flex:1}.sdk-exam-matching-col li{display:flex;gap:6px;margin:3px 0}@media print{.sdk-exam-passage{background:none}}
|
package/types/message.d.ts
CHANGED
|
@@ -9,6 +9,101 @@ export interface CodeData {
|
|
|
9
9
|
language?: string;
|
|
10
10
|
title?: string;
|
|
11
11
|
}
|
|
12
|
+
export interface ExamKeyValue {
|
|
13
|
+
label: string;
|
|
14
|
+
value: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ExamChoice {
|
|
17
|
+
label?: string;
|
|
18
|
+
text: string;
|
|
19
|
+
}
|
|
20
|
+
/** One piece of question content. `kind` drives which sub-renderer is used. */
|
|
21
|
+
export type ExamBlock =
|
|
22
|
+
/** Markdown + math paragraph(s). */
|
|
23
|
+
{
|
|
24
|
+
kind: 'prose';
|
|
25
|
+
text: string;
|
|
26
|
+
}
|
|
27
|
+
/** Diagram built from text characters — number line, geometry sketch, circuit,
|
|
28
|
+
* ASCII art, hand-drawn table of values. Rendered verbatim in monospace. */
|
|
29
|
+
| {
|
|
30
|
+
kind: 'figure';
|
|
31
|
+
figure: string;
|
|
32
|
+
caption?: string;
|
|
33
|
+
}
|
|
34
|
+
/** Genuine tabular data (frequency table, dataset, timetable). */
|
|
35
|
+
| {
|
|
36
|
+
kind: 'table';
|
|
37
|
+
table: TableData;
|
|
38
|
+
caption?: string;
|
|
39
|
+
}
|
|
40
|
+
/** A reading / source passage, poem, dialogue or extract to be answered on. */
|
|
41
|
+
| {
|
|
42
|
+
kind: 'passage';
|
|
43
|
+
text: string;
|
|
44
|
+
title?: string;
|
|
45
|
+
}
|
|
46
|
+
/** Objective options for an MCQ / true-false item (NOT "OR" alternatives). */
|
|
47
|
+
| {
|
|
48
|
+
kind: 'choices';
|
|
49
|
+
choices: ExamChoice[];
|
|
50
|
+
layout?: 'inline' | 'block';
|
|
51
|
+
}
|
|
52
|
+
/** Two columns the student pairs up. */
|
|
53
|
+
| {
|
|
54
|
+
kind: 'matching';
|
|
55
|
+
left: ExamChoice[];
|
|
56
|
+
right: ExamChoice[];
|
|
57
|
+
};
|
|
58
|
+
export interface ExamQuestionPart {
|
|
59
|
+
label?: string;
|
|
60
|
+
text?: string;
|
|
61
|
+
blocks?: ExamBlock[];
|
|
62
|
+
figure?: string;
|
|
63
|
+
marks?: number | string;
|
|
64
|
+
}
|
|
65
|
+
export interface ExamQuestion {
|
|
66
|
+
number?: string;
|
|
67
|
+
/** The main prompt. */
|
|
68
|
+
text?: string;
|
|
69
|
+
/** Supporting material rendered after `text`, before `parts`. */
|
|
70
|
+
blocks?: ExamBlock[];
|
|
71
|
+
figure?: string;
|
|
72
|
+
marks?: number | string;
|
|
73
|
+
parts?: ExamQuestionPart[];
|
|
74
|
+
/** Mutually-exclusive alternatives — rendered joined by "OR". */
|
|
75
|
+
options?: ExamQuestion[];
|
|
76
|
+
/** Provenance note, e.g. "Textbook, Lesson 2, Exercise 2.2 (variant)". */
|
|
77
|
+
source?: string;
|
|
78
|
+
}
|
|
79
|
+
export interface ExamSection {
|
|
80
|
+
name?: string;
|
|
81
|
+
heading?: string;
|
|
82
|
+
instruction?: string;
|
|
83
|
+
marksHint?: string;
|
|
84
|
+
questions: ExamQuestion[];
|
|
85
|
+
}
|
|
86
|
+
export interface ExamAnswer {
|
|
87
|
+
number?: string;
|
|
88
|
+
text?: string;
|
|
89
|
+
}
|
|
90
|
+
export interface ExamPaperData {
|
|
91
|
+
/** Top line above the title — school / examination body, if named. */
|
|
92
|
+
heading?: string;
|
|
93
|
+
title: string;
|
|
94
|
+
subtitle?: string;
|
|
95
|
+
meta?: ExamKeyValue[];
|
|
96
|
+
/** Blank fill-in lines under the header, e.g. ["Candidate's Name", "Roll No.", "Date"]. */
|
|
97
|
+
candidateFields?: string[];
|
|
98
|
+
instructions?: string[];
|
|
99
|
+
sections: ExamSection[];
|
|
100
|
+
/** Closing line printed after the last question, e.g. "The End" / "Best of luck!". */
|
|
101
|
+
footer?: string;
|
|
102
|
+
marksDistribution?: ExamKeyValue[];
|
|
103
|
+
answerKey?: ExamAnswer[];
|
|
104
|
+
/** Caveats surfaced by the model (e.g. a section it could not fully source). */
|
|
105
|
+
note?: string;
|
|
106
|
+
}
|
|
12
107
|
export declare const AIMessageTypeEnum: {
|
|
13
108
|
readonly FINAL_ANSWER: "FINAL_ANSWER";
|
|
14
109
|
readonly EXECUTE_SQL: "EXECUTE_SQL";
|
|
@@ -69,7 +164,7 @@ export interface PlanData {
|
|
|
69
164
|
}>;
|
|
70
165
|
}
|
|
71
166
|
export interface MessageContent {
|
|
72
|
-
type: 'text' | 'table' | 'code' | 'markdown' | 'mixed' | 'clarification' | 'plan' | 'error';
|
|
167
|
+
type: 'text' | 'table' | 'code' | 'markdown' | 'mixed' | 'clarification' | 'plan' | 'error' | 'exam_paper';
|
|
73
168
|
text?: string;
|
|
74
169
|
table?: TableData;
|
|
75
170
|
code?: CodeData;
|
|
@@ -81,6 +176,7 @@ export interface MessageContent {
|
|
|
81
176
|
message: string;
|
|
82
177
|
details?: any;
|
|
83
178
|
};
|
|
179
|
+
examPaper?: ExamPaperData;
|
|
84
180
|
}
|
|
85
181
|
export interface Message {
|
|
86
182
|
id: string;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Load KaTeX's stylesheet once, lazily, from the CDN.
|
|
3
|
+
*
|
|
4
|
+
* KaTeX ships ~1.2 MB of font files; bundling its CSS pulls all of them into the
|
|
5
|
+
* SDK's `style.css`. This widget is embedded on third-party pages, so instead we
|
|
6
|
+
* inject a <link> the first time math is actually rendered. Without it, math
|
|
7
|
+
* still renders as plain (un-typeset) text — a graceful degradation.
|
|
8
|
+
*/
|
|
9
|
+
export declare function ensureKatexCss(): void;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ExamPaperData } from '../types/message';
|
|
2
|
+
|
|
3
|
+
export declare function printExamPaper(source: Element | null, paper?: ExamPaperData): void;
|
|
4
|
+
export declare function downloadExamPaperDoc(source: Element | null, paper?: ExamPaperData): void;
|
|
5
|
+
export declare function copyExamPaper(source: Element | null): Promise<boolean>;
|