@mitverse/mitbar-web 1.0.1 → 1.0.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/dist/index.d.ts +1 -1
- package/dist/mitbar.es.js +4 -4
- package/dist/mitbar.es.js.map +1 -1
- package/dist/mitbar.umd.cjs +1 -1
- package/dist/mitbar.umd.cjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { createWsClient } from './ws-client';
|
|
|
4
4
|
export interface MitbarConfig {
|
|
5
5
|
/** Show the bar. When false, bar is not rendered. */
|
|
6
6
|
enabled?: boolean;
|
|
7
|
-
/** WebSocket URL (e.g. wss://agent.mitverse.com/ws). Read from env (VITE_MITBAR_GATEWAY_WS_URL) or default. */
|
|
7
|
+
/** WebSocket URL (e.g. wss://agent.mitverse.com/api/v1/agent/ws). Read from env (VITE_MITBAR_GATEWAY_WS_URL) or default. */
|
|
8
8
|
gatewayWsUrl?: string;
|
|
9
9
|
}
|
|
10
10
|
declare global {
|
package/dist/mitbar.es.js
CHANGED
|
@@ -180,8 +180,8 @@ function E(d) {
|
|
|
180
180
|
}
|
|
181
181
|
return s(), { send: b, onMessage: m, connect: s, disconnect: f, getPageContext: c };
|
|
182
182
|
}
|
|
183
|
-
const
|
|
184
|
-
function
|
|
183
|
+
const v = "/ws", S = "wss://agent.mitverse.com/api/v1/agent/ws";
|
|
184
|
+
function k() {
|
|
185
185
|
const d = typeof window < "u" ? window : void 0;
|
|
186
186
|
if (!d) return {};
|
|
187
187
|
const e = d.__MITBAR_CONFIG__ || {}, n = document.currentScript, o = n ? {
|
|
@@ -194,9 +194,9 @@ function v() {
|
|
|
194
194
|
};
|
|
195
195
|
}
|
|
196
196
|
function g(d) {
|
|
197
|
-
const e = { ...
|
|
197
|
+
const e = { ...k(), ...d };
|
|
198
198
|
if (!e.enabled) return;
|
|
199
|
-
const n = (e.gatewayWsUrl || "").trim() ||
|
|
199
|
+
const n = (e.gatewayWsUrl || "").trim() || S, o = n.includes("/") && !n.includes("?") && !n.endsWith("/") ? n : n.replace(/\/?$/, "") + v, u = E(o);
|
|
200
200
|
h(u);
|
|
201
201
|
}
|
|
202
202
|
typeof document < "u" && document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", () => g()) : typeof document < "u" && g();
|
package/dist/mitbar.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mitbar.es.js","sources":["../src/bar.ts","../src/ws-client.ts","../src/index.ts"],"sourcesContent":["/**\n * Mitbar UI: fixed bar at bottom with input, Send, Build, Deploy, and reply area.\n */\n\nimport type { MessageHandler } from './ws-client';\n\ntype WsClient = {\n send: (payload: { text: string; pageUrl?: string; pageTitle?: string; action?: 'chat' | 'build' | 'deploy' }) => void;\n onMessage: (handler: MessageHandler) => () => void;\n};\n\nconst CSS = `\n.mitbar-root {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 2147483647;\n font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;\n font-size: 14px;\n background: #1e293b;\n color: #e2e8f0;\n box-shadow: 0 -2px 10px rgba(0,0,0,0.2);\n border-top: 1px solid #334155;\n}\n.mitbar-inner {\n max-width: 100%;\n padding: 8px 12px;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n}\n.mitbar-input-wrap {\n flex: 1;\n min-width: 120px;\n}\n.mitbar-input {\n width: 100%;\n box-sizing: border-box;\n padding: 6px 10px;\n border: 1px solid #475569;\n border-radius: 6px;\n background: #0f172a;\n color: #e2e8f0;\n font: inherit;\n}\n.mitbar-input::placeholder { color: #94a3b8; }\n.mitbar-input:focus {\n outline: none;\n border-color: #3b82f6;\n}\n.mitbar-btns {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n.mitbar-btn {\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n font: inherit;\n cursor: pointer;\n background: #334155;\n color: #e2e8f0;\n}\n.mitbar-btn:hover { background: #475569; }\n.mitbar-btn--primary { background: #3b82f6; color: #fff; }\n.mitbar-btn--primary:hover { background: #2563eb; }\n.mitbar-btn--deploy { background: #059669; color: #fff; }\n.mitbar-btn--deploy:hover { background: #047857; }\n.mitbar-status {\n font-size: 12px;\n color: #94a3b8;\n margin-left: auto;\n}\n.mitbar-reply {\n width: 100%;\n max-height: 120px;\n overflow-y: auto;\n padding: 8px 12px;\n margin-top: 4px;\n background: #0f172a;\n border-radius: 6px;\n border: 1px solid #334155;\n font-size: 13px;\n white-space: pre-wrap;\n word-break: break-word;\n}\n.mitbar-reply--error { border-color: #dc2626; color: #fca5a5; }\n.mitbar-reply:empty { display: none; }\n`;\n\nexport function createBar(client: WsClient): void {\n if (typeof document === 'undefined') return;\n const style = document.createElement('style');\n style.textContent = CSS;\n document.head.appendChild(style);\n\n const root = document.createElement('div');\n root.className = 'mitbar-root';\n root.setAttribute('aria-label', 'Mitbar');\n\n const inner = document.createElement('div');\n inner.className = 'mitbar-inner';\n\n const inputWrap = document.createElement('div');\n inputWrap.className = 'mitbar-input-wrap';\n const input = document.createElement('input');\n input.className = 'mitbar-input';\n input.type = 'text';\n input.placeholder = 'Message for script-writer (page URL is sent automatically)…';\n input.setAttribute('aria-label', 'Message');\n inputWrap.appendChild(input);\n\n const status = document.createElement('span');\n status.className = 'mitbar-status';\n status.textContent = 'Connecting…';\n\n const btnSend = document.createElement('button');\n btnSend.className = 'mitbar-btn mitbar-btn--primary';\n btnSend.textContent = 'Send';\n btnSend.type = 'button';\n\n const btnBuild = document.createElement('button');\n btnBuild.className = 'mitbar-btn';\n btnBuild.textContent = 'Build';\n btnBuild.type = 'button';\n\n const btnDeploy = document.createElement('button');\n btnDeploy.className = 'mitbar-btn mitbar-btn--deploy';\n btnDeploy.textContent = 'Deploy';\n btnDeploy.type = 'button';\n\n const replyDiv = document.createElement('div');\n replyDiv.className = 'mitbar-reply';\n replyDiv.setAttribute('aria-live', 'polite');\n\n const btns = document.createElement('div');\n btns.className = 'mitbar-btns';\n btns.append(btnSend, btnBuild, btnDeploy);\n\n inner.append(inputWrap, btns, status);\n root.appendChild(inner);\n root.appendChild(replyDiv);\n document.body.appendChild(root);\n\n const setStatus = (text: string) => {\n status.textContent = text;\n };\n const setReply = (text: string, isError?: boolean) => {\n replyDiv.textContent = text;\n replyDiv.classList.toggle('mitbar-reply--error', !!isError);\n };\n\n client.onMessage((msg) => {\n if (msg.type === 'connected') setStatus('Connected');\n else if (msg.type === 'disconnected') setStatus('Disconnected');\n else if (msg.type === 'error') {\n setStatus('Error');\n setReply(msg.error || 'Error', true);\n } else if (msg.type === 'output' && msg.text) {\n setReply(msg.text, false);\n }\n });\n\n const send = (action: 'chat' | 'build' | 'deploy') => {\n const text = input.value.trim();\n if (action === 'chat' && !text) return;\n const payload = action === 'chat' ? text : (text || `Please ${action} the current project.`);\n client.send({ text: payload, action });\n if (action === 'chat') input.value = '';\n setReply('Waiting for response…');\n };\n\n btnSend.addEventListener('click', () => send('chat'));\n btnBuild.addEventListener('click', () => send('build'));\n btnDeploy.addEventListener('click', () => send('deploy'));\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n send('chat');\n }\n });\n}\n","/**\n * WebSocket client: sends { text, pageUrl, pageTitle } and receives { type, text? } from mitbar-gateway.\n */\n\nexport interface SendPayload {\n text: string;\n pageUrl?: string;\n pageTitle?: string;\n /** Optional: /build or /deploy for special actions */\n action?: 'chat' | 'build' | 'deploy';\n}\n\nexport interface IncomingMessage {\n type: string;\n text?: string;\n error?: string;\n}\n\nexport type MessageHandler = (msg: IncomingMessage) => void;\n\nexport function createWsClient(gatewayWsUrl: string) {\n let ws: WebSocket | null = null;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n const listeners: MessageHandler[] = [];\n const RECONNECT_MS = 3000;\n\n function getPageContext(): { pageUrl: string; pageTitle: string } {\n if (typeof window === 'undefined') return { pageUrl: '', pageTitle: '' };\n return {\n pageUrl: window.location.href,\n pageTitle: document.title || window.location.pathname || '',\n };\n }\n\n function connect(): WebSocket | null {\n if (typeof WebSocket === 'undefined') return null;\n try {\n const socket = new WebSocket(gatewayWsUrl);\n socket.onopen = () => {\n notify({ type: 'connected' });\n };\n socket.onmessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data as string) as IncomingMessage;\n notify(data);\n } catch {\n notify({ type: 'output', text: String(event.data) });\n }\n };\n socket.onclose = () => {\n notify({ type: 'disconnected' });\n ws = null;\n reconnectTimer = setTimeout(() => connect(), RECONNECT_MS);\n };\n socket.onerror = () => {\n notify({ type: 'error', error: 'WebSocket error' });\n };\n ws = socket;\n return socket;\n } catch (e) {\n notify({ type: 'error', error: String(e) });\n return null;\n }\n }\n\n function notify(msg: IncomingMessage) {\n listeners.forEach((h) => {\n try {\n h(msg);\n } catch (_) {}\n });\n }\n\n function send(payload: SendPayload): void {\n const { pageUrl, pageTitle } = getPageContext();\n const body = {\n text: (payload.text || '').trim(),\n pageUrl: payload.pageUrl ?? pageUrl,\n pageTitle: payload.pageTitle ?? pageTitle,\n action: payload.action || 'chat',\n };\n if (!body.text && body.action === 'chat') return;\n if (ws?.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(body));\n } else {\n notify({ type: 'error', error: 'Not connected. Reconnecting…' });\n connect();\n if (ws?.readyState === WebSocket.OPEN) ws.send(JSON.stringify(body));\n }\n }\n\n function onMessage(handler: MessageHandler): () => void {\n listeners.push(handler);\n return () => {\n const i = listeners.indexOf(handler);\n if (i >= 0) listeners.splice(i, 1);\n };\n }\n\n function disconnect(): void {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n if (ws) {\n ws.close();\n ws = null;\n }\n }\n\n connect();\n return { send, onMessage, connect, disconnect, getPageContext };\n}\n","/**\n * Mitbar – browser bar that talks to script-writer Docker agent via WebSocket gateway.\n * Add to any website; visibility and gateway URL are set via frontend config or environment.\n * Every message includes the current page address and link.\n *\n * Config (one of):\n * - init({ gatewayWsUrl: 'wss://...' }) or pass from env (e.g. VITE_MITBAR_GATEWAY_WS_URL)\n * - window.__MITBAR_CONFIG__ = { enabled: true, gatewayWsUrl: 'wss://...' }\n * - <script src=\"mitbar.js\" data-mitbar-enabled=\"true\" data-mitbar-gateway-ws-url=\"wss://...\"></script>\n *\n * When gatewayWsUrl is not set, defaults to wss://agent.mitverse.com/ws.\n * The host app should read from env (e.g. VITE_MITBAR_GATEWAY_WS_URL) and pass to init({ gatewayWsUrl }).\n */\n\nimport { createBar } from './bar';\nimport { createWsClient } from './ws-client';\n\nexport interface MitbarConfig {\n /** Show the bar. When false, bar is not rendered. */\n enabled?: boolean;\n /** WebSocket URL (e.g. wss://agent.mitverse.com/ws). Read from env (VITE_MITBAR_GATEWAY_WS_URL) or default. */\n gatewayWsUrl?: string;\n}\n\ndeclare global {\n interface Window {\n __MITBAR_CONFIG__?: MitbarConfig;\n }\n}\n\nconst DEFAULT_WS_PATH = '/ws';\n/** Default gateway when none is configured (agent.mitverse.com). Host app should pass gatewayWsUrl from env (e.g. VITE_MITBAR_GATEWAY_WS_URL). */\nconst DEFAULT_GATEWAY_WS_URL = 'wss://agent.mitverse.com/ws';\n\nfunction getConfig(): MitbarConfig {\n const win = typeof window !== 'undefined' ? window : undefined;\n if (!win) return {};\n const fromWindow = win.__MITBAR_CONFIG__ || {};\n const script = document.currentScript as HTMLScriptElement | null;\n const fromData = script\n ? {\n enabled: script.getAttribute('data-mitbar-enabled') === 'true' || script.getAttribute('data-mitbar-enabled') === '1',\n gatewayWsUrl: script.getAttribute('data-mitbar-gateway-ws-url') || undefined,\n }\n : {};\n return {\n enabled: fromWindow.enabled ?? fromData.enabled ?? false,\n gatewayWsUrl: fromWindow.gatewayWsUrl ?? fromData.gatewayWsUrl ?? undefined,\n };\n}\n\n/**\n * Initialize and mount the bar. Call once after DOM ready (or use auto-init from script tag).\n */\nexport function init(configOverride?: Partial<MitbarConfig>): void {\n const config = { ...getConfig(), ...configOverride };\n if (!config.enabled) return;\n const gatewayWsUrl = (config.gatewayWsUrl || '').trim() || DEFAULT_GATEWAY_WS_URL;\n const wsUrl = gatewayWsUrl.includes('/') && !gatewayWsUrl.includes('?') && !gatewayWsUrl.endsWith('/')\n ? gatewayWsUrl\n : gatewayWsUrl.replace(/\\/?$/, '') + DEFAULT_WS_PATH;\n const client = createWsClient(wsUrl);\n createBar(client);\n}\n\nif (typeof document !== 'undefined' && document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => init());\n} else if (typeof document !== 'undefined') {\n init();\n}\n\nexport { createBar, createWsClient };\n"],"names":["CSS","createBar","client","style","root","inner","inputWrap","input","status","btnSend","btnBuild","btnDeploy","replyDiv","btns","setStatus","text","setReply","isError","msg","send","action","payload","e","createWsClient","gatewayWsUrl","ws","reconnectTimer","listeners","RECONNECT_MS","getPageContext","connect","socket","notify","event","data","h","pageUrl","pageTitle","body","onMessage","handler","disconnect","DEFAULT_WS_PATH","DEFAULT_GATEWAY_WS_URL","getConfig","win","fromWindow","script","fromData","init","configOverride","config","wsUrl"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mitbar.es.js","sources":["../src/bar.ts","../src/ws-client.ts","../src/index.ts"],"sourcesContent":["/**\n * Mitbar UI: fixed bar at bottom with input, Send, Build, Deploy, and reply area.\n */\n\nimport type { MessageHandler } from './ws-client';\n\ntype WsClient = {\n send: (payload: { text: string; pageUrl?: string; pageTitle?: string; action?: 'chat' | 'build' | 'deploy' }) => void;\n onMessage: (handler: MessageHandler) => () => void;\n};\n\nconst CSS = `\n.mitbar-root {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 2147483647;\n font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;\n font-size: 14px;\n background: #1e293b;\n color: #e2e8f0;\n box-shadow: 0 -2px 10px rgba(0,0,0,0.2);\n border-top: 1px solid #334155;\n}\n.mitbar-inner {\n max-width: 100%;\n padding: 8px 12px;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n}\n.mitbar-input-wrap {\n flex: 1;\n min-width: 120px;\n}\n.mitbar-input {\n width: 100%;\n box-sizing: border-box;\n padding: 6px 10px;\n border: 1px solid #475569;\n border-radius: 6px;\n background: #0f172a;\n color: #e2e8f0;\n font: inherit;\n}\n.mitbar-input::placeholder { color: #94a3b8; }\n.mitbar-input:focus {\n outline: none;\n border-color: #3b82f6;\n}\n.mitbar-btns {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n.mitbar-btn {\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n font: inherit;\n cursor: pointer;\n background: #334155;\n color: #e2e8f0;\n}\n.mitbar-btn:hover { background: #475569; }\n.mitbar-btn--primary { background: #3b82f6; color: #fff; }\n.mitbar-btn--primary:hover { background: #2563eb; }\n.mitbar-btn--deploy { background: #059669; color: #fff; }\n.mitbar-btn--deploy:hover { background: #047857; }\n.mitbar-status {\n font-size: 12px;\n color: #94a3b8;\n margin-left: auto;\n}\n.mitbar-reply {\n width: 100%;\n max-height: 120px;\n overflow-y: auto;\n padding: 8px 12px;\n margin-top: 4px;\n background: #0f172a;\n border-radius: 6px;\n border: 1px solid #334155;\n font-size: 13px;\n white-space: pre-wrap;\n word-break: break-word;\n}\n.mitbar-reply--error { border-color: #dc2626; color: #fca5a5; }\n.mitbar-reply:empty { display: none; }\n`;\n\nexport function createBar(client: WsClient): void {\n if (typeof document === 'undefined') return;\n const style = document.createElement('style');\n style.textContent = CSS;\n document.head.appendChild(style);\n\n const root = document.createElement('div');\n root.className = 'mitbar-root';\n root.setAttribute('aria-label', 'Mitbar');\n\n const inner = document.createElement('div');\n inner.className = 'mitbar-inner';\n\n const inputWrap = document.createElement('div');\n inputWrap.className = 'mitbar-input-wrap';\n const input = document.createElement('input');\n input.className = 'mitbar-input';\n input.type = 'text';\n input.placeholder = 'Message for script-writer (page URL is sent automatically)…';\n input.setAttribute('aria-label', 'Message');\n inputWrap.appendChild(input);\n\n const status = document.createElement('span');\n status.className = 'mitbar-status';\n status.textContent = 'Connecting…';\n\n const btnSend = document.createElement('button');\n btnSend.className = 'mitbar-btn mitbar-btn--primary';\n btnSend.textContent = 'Send';\n btnSend.type = 'button';\n\n const btnBuild = document.createElement('button');\n btnBuild.className = 'mitbar-btn';\n btnBuild.textContent = 'Build';\n btnBuild.type = 'button';\n\n const btnDeploy = document.createElement('button');\n btnDeploy.className = 'mitbar-btn mitbar-btn--deploy';\n btnDeploy.textContent = 'Deploy';\n btnDeploy.type = 'button';\n\n const replyDiv = document.createElement('div');\n replyDiv.className = 'mitbar-reply';\n replyDiv.setAttribute('aria-live', 'polite');\n\n const btns = document.createElement('div');\n btns.className = 'mitbar-btns';\n btns.append(btnSend, btnBuild, btnDeploy);\n\n inner.append(inputWrap, btns, status);\n root.appendChild(inner);\n root.appendChild(replyDiv);\n document.body.appendChild(root);\n\n const setStatus = (text: string) => {\n status.textContent = text;\n };\n const setReply = (text: string, isError?: boolean) => {\n replyDiv.textContent = text;\n replyDiv.classList.toggle('mitbar-reply--error', !!isError);\n };\n\n client.onMessage((msg) => {\n if (msg.type === 'connected') setStatus('Connected');\n else if (msg.type === 'disconnected') setStatus('Disconnected');\n else if (msg.type === 'error') {\n setStatus('Error');\n setReply(msg.error || 'Error', true);\n } else if (msg.type === 'output' && msg.text) {\n setReply(msg.text, false);\n }\n });\n\n const send = (action: 'chat' | 'build' | 'deploy') => {\n const text = input.value.trim();\n if (action === 'chat' && !text) return;\n const payload = action === 'chat' ? text : (text || `Please ${action} the current project.`);\n client.send({ text: payload, action });\n if (action === 'chat') input.value = '';\n setReply('Waiting for response…');\n };\n\n btnSend.addEventListener('click', () => send('chat'));\n btnBuild.addEventListener('click', () => send('build'));\n btnDeploy.addEventListener('click', () => send('deploy'));\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n send('chat');\n }\n });\n}\n","/**\n * WebSocket client: sends { text, pageUrl, pageTitle } and receives { type, text? } from mitbar-gateway.\n */\n\nexport interface SendPayload {\n text: string;\n pageUrl?: string;\n pageTitle?: string;\n /** Optional: /build or /deploy for special actions */\n action?: 'chat' | 'build' | 'deploy';\n}\n\nexport interface IncomingMessage {\n type: string;\n text?: string;\n error?: string;\n}\n\nexport type MessageHandler = (msg: IncomingMessage) => void;\n\nexport function createWsClient(gatewayWsUrl: string) {\n let ws: WebSocket | null = null;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n const listeners: MessageHandler[] = [];\n const RECONNECT_MS = 3000;\n\n function getPageContext(): { pageUrl: string; pageTitle: string } {\n if (typeof window === 'undefined') return { pageUrl: '', pageTitle: '' };\n return {\n pageUrl: window.location.href,\n pageTitle: document.title || window.location.pathname || '',\n };\n }\n\n function connect(): WebSocket | null {\n if (typeof WebSocket === 'undefined') return null;\n try {\n const socket = new WebSocket(gatewayWsUrl);\n socket.onopen = () => {\n notify({ type: 'connected' });\n };\n socket.onmessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data as string) as IncomingMessage;\n notify(data);\n } catch {\n notify({ type: 'output', text: String(event.data) });\n }\n };\n socket.onclose = () => {\n notify({ type: 'disconnected' });\n ws = null;\n reconnectTimer = setTimeout(() => connect(), RECONNECT_MS);\n };\n socket.onerror = () => {\n notify({ type: 'error', error: 'WebSocket error' });\n };\n ws = socket;\n return socket;\n } catch (e) {\n notify({ type: 'error', error: String(e) });\n return null;\n }\n }\n\n function notify(msg: IncomingMessage) {\n listeners.forEach((h) => {\n try {\n h(msg);\n } catch (_) {}\n });\n }\n\n function send(payload: SendPayload): void {\n const { pageUrl, pageTitle } = getPageContext();\n const body = {\n text: (payload.text || '').trim(),\n pageUrl: payload.pageUrl ?? pageUrl,\n pageTitle: payload.pageTitle ?? pageTitle,\n action: payload.action || 'chat',\n };\n if (!body.text && body.action === 'chat') return;\n if (ws?.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(body));\n } else {\n notify({ type: 'error', error: 'Not connected. Reconnecting…' });\n connect();\n if (ws?.readyState === WebSocket.OPEN) ws.send(JSON.stringify(body));\n }\n }\n\n function onMessage(handler: MessageHandler): () => void {\n listeners.push(handler);\n return () => {\n const i = listeners.indexOf(handler);\n if (i >= 0) listeners.splice(i, 1);\n };\n }\n\n function disconnect(): void {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n if (ws) {\n ws.close();\n ws = null;\n }\n }\n\n connect();\n return { send, onMessage, connect, disconnect, getPageContext };\n}\n","/**\n * Mitbar – browser bar that talks to script-writer Docker agent via WebSocket gateway.\n * Add to any website; visibility and gateway URL are set via frontend config or environment.\n * Every message includes the current page address and link.\n *\n * Config (one of):\n * - init({ gatewayWsUrl: 'wss://...' }) or pass from env (e.g. VITE_MITBAR_GATEWAY_WS_URL)\n * - window.__MITBAR_CONFIG__ = { enabled: true, gatewayWsUrl: 'wss://...' }\n * - <script src=\"mitbar.js\" data-mitbar-enabled=\"true\" data-mitbar-gateway-ws-url=\"wss://...\"></script>\n *\n * When gatewayWsUrl is not set, defaults to wss://agent.mitverse.com/api/v1/agent/ws (same /api/ path as Scripter console).\n * The host app should read from env (e.g. VITE_MITBAR_GATEWAY_WS_URL) and pass to init({ gatewayWsUrl }).\n */\n\nimport { createBar } from './bar';\nimport { createWsClient } from './ws-client';\n\nexport interface MitbarConfig {\n /** Show the bar. When false, bar is not rendered. */\n enabled?: boolean;\n /** WebSocket URL (e.g. wss://agent.mitverse.com/api/v1/agent/ws). Read from env (VITE_MITBAR_GATEWAY_WS_URL) or default. */\n gatewayWsUrl?: string;\n}\n\ndeclare global {\n interface Window {\n __MITBAR_CONFIG__?: MitbarConfig;\n }\n}\n\nconst DEFAULT_WS_PATH = '/ws';\n/** Default gateway when none is configured. Same /api/ path as Scripter console so nginx location /api/ handles both. */\nconst DEFAULT_GATEWAY_WS_URL = 'wss://agent.mitverse.com/api/v1/agent/ws';\n\nfunction getConfig(): MitbarConfig {\n const win = typeof window !== 'undefined' ? window : undefined;\n if (!win) return {};\n const fromWindow = win.__MITBAR_CONFIG__ || {};\n const script = document.currentScript as HTMLScriptElement | null;\n const fromData = script\n ? {\n enabled: script.getAttribute('data-mitbar-enabled') === 'true' || script.getAttribute('data-mitbar-enabled') === '1',\n gatewayWsUrl: script.getAttribute('data-mitbar-gateway-ws-url') || undefined,\n }\n : {};\n return {\n enabled: fromWindow.enabled ?? fromData.enabled ?? false,\n gatewayWsUrl: fromWindow.gatewayWsUrl ?? fromData.gatewayWsUrl ?? undefined,\n };\n}\n\n/**\n * Initialize and mount the bar. Call once after DOM ready (or use auto-init from script tag).\n */\nexport function init(configOverride?: Partial<MitbarConfig>): void {\n const config = { ...getConfig(), ...configOverride };\n if (!config.enabled) return;\n const gatewayWsUrl = (config.gatewayWsUrl || '').trim() || DEFAULT_GATEWAY_WS_URL;\n const wsUrl = gatewayWsUrl.includes('/') && !gatewayWsUrl.includes('?') && !gatewayWsUrl.endsWith('/')\n ? gatewayWsUrl\n : gatewayWsUrl.replace(/\\/?$/, '') + DEFAULT_WS_PATH;\n const client = createWsClient(wsUrl);\n createBar(client);\n}\n\nif (typeof document !== 'undefined' && document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => init());\n} else if (typeof document !== 'undefined') {\n init();\n}\n\nexport { createBar, createWsClient };\n"],"names":["CSS","createBar","client","style","root","inner","inputWrap","input","status","btnSend","btnBuild","btnDeploy","replyDiv","btns","setStatus","text","setReply","isError","msg","send","action","payload","e","createWsClient","gatewayWsUrl","ws","reconnectTimer","listeners","RECONNECT_MS","getPageContext","connect","socket","notify","event","data","h","pageUrl","pageTitle","body","onMessage","handler","disconnect","DEFAULT_WS_PATH","DEFAULT_GATEWAY_WS_URL","getConfig","win","fromWindow","script","fromData","init","configOverride","config","wsUrl"],"mappings":"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"}
|
package/dist/mitbar.umd.cjs
CHANGED
|
@@ -78,5 +78,5 @@
|
|
|
78
78
|
}
|
|
79
79
|
.mitbar-reply--error { border-color: #dc2626; color: #fca5a5; }
|
|
80
80
|
.mitbar-reply:empty { display: none; }
|
|
81
|
-
`;function w(d){if(typeof document>"u")return;const e=document.createElement("style");e.textContent=g,document.head.appendChild(e);const n=document.createElement("div");n.className="mitbar-root",n.setAttribute("aria-label","Mitbar");const o=document.createElement("div");o.className="mitbar-inner";const b=document.createElement("div");b.className="mitbar-input-wrap";const c=document.createElement("input");c.className="mitbar-input",c.type="text",c.placeholder="Message for script-writer (page URL is sent automatically)…",c.setAttribute("aria-label","Message"),b.appendChild(c);const s=document.createElement("span");s.className="mitbar-status",s.textContent="Connecting…";const
|
|
81
|
+
`;function w(d){if(typeof document>"u")return;const e=document.createElement("style");e.textContent=g,document.head.appendChild(e);const n=document.createElement("div");n.className="mitbar-root",n.setAttribute("aria-label","Mitbar");const o=document.createElement("div");o.className="mitbar-inner";const b=document.createElement("div");b.className="mitbar-input-wrap";const c=document.createElement("input");c.className="mitbar-input",c.type="text",c.placeholder="Message for script-writer (page URL is sent automatically)…",c.setAttribute("aria-label","Message"),b.appendChild(c);const s=document.createElement("span");s.className="mitbar-status",s.textContent="Connecting…";const a=document.createElement("button");a.className="mitbar-btn mitbar-btn--primary",a.textContent="Send",a.type="button";const f=document.createElement("button");f.className="mitbar-btn",f.textContent="Build",f.type="button";const m=document.createElement("button");m.className="mitbar-btn mitbar-btn--deploy",m.textContent="Deploy",m.type="button";const y=document.createElement("div");y.className="mitbar-reply",y.setAttribute("aria-live","polite");const t=document.createElement("div");t.className="mitbar-btns",t.append(a,f,m),o.append(b,t,s),n.appendChild(o),n.appendChild(y),document.body.appendChild(n);const i=r=>{s.textContent=r},u=(r,x)=>{y.textContent=r,y.classList.toggle("mitbar-reply--error",!!x)};d.onMessage(r=>{r.type==="connected"?i("Connected"):r.type==="disconnected"?i("Disconnected"):r.type==="error"?(i("Error"),u(r.error||"Error",!0)):r.type==="output"&&r.text&&u(r.text,!1)});const l=r=>{const x=c.value.trim();if(r==="chat"&&!x)return;const k=r==="chat"?x:x||`Please ${r} the current project.`;d.send({text:k,action:r}),r==="chat"&&(c.value=""),u("Waiting for response…")};a.addEventListener("click",()=>l("chat")),f.addEventListener("click",()=>l("build")),m.addEventListener("click",()=>l("deploy")),c.addEventListener("keydown",r=>{r.key==="Enter"&&!r.shiftKey&&(r.preventDefault(),l("chat"))})}function E(d){let e=null,n=null;const o=[],b=3e3;function c(){return typeof window>"u"?{pageUrl:"",pageTitle:""}:{pageUrl:window.location.href,pageTitle:document.title||window.location.pathname||""}}function s(){if(typeof WebSocket>"u")return null;try{const t=new WebSocket(d);return t.onopen=()=>{a({type:"connected"})},t.onmessage=i=>{try{const u=JSON.parse(i.data);a(u)}catch{a({type:"output",text:String(i.data)})}},t.onclose=()=>{a({type:"disconnected"}),e=null,n=setTimeout(()=>s(),b)},t.onerror=()=>{a({type:"error",error:"WebSocket error"})},e=t,t}catch(t){return a({type:"error",error:String(t)}),null}}function a(t){o.forEach(i=>{try{i(t)}catch{}})}function f(t){const{pageUrl:i,pageTitle:u}=c(),l={text:(t.text||"").trim(),pageUrl:t.pageUrl??i,pageTitle:t.pageTitle??u,action:t.action||"chat"};!l.text&&l.action==="chat"||((e==null?void 0:e.readyState)===WebSocket.OPEN?e.send(JSON.stringify(l)):(a({type:"error",error:"Not connected. Reconnecting…"}),s(),(e==null?void 0:e.readyState)===WebSocket.OPEN&&e.send(JSON.stringify(l))))}function m(t){return o.push(t),()=>{const i=o.indexOf(t);i>=0&&o.splice(i,1)}}function y(){n&&(clearTimeout(n),n=null),e&&(e.close(),e=null)}return s(),{send:f,onMessage:m,connect:s,disconnect:y,getPageContext:c}}const S="/ws",v="wss://agent.mitverse.com/api/v1/agent/ws";function C(){const d=typeof window<"u"?window:void 0;if(!d)return{};const e=d.__MITBAR_CONFIG__||{},n=document.currentScript,o=n?{enabled:n.getAttribute("data-mitbar-enabled")==="true"||n.getAttribute("data-mitbar-enabled")==="1",gatewayWsUrl:n.getAttribute("data-mitbar-gateway-ws-url")||void 0}:{};return{enabled:e.enabled??o.enabled??!1,gatewayWsUrl:e.gatewayWsUrl??o.gatewayWsUrl??void 0}}function h(d){const e={...C(),...d};if(!e.enabled)return;const n=(e.gatewayWsUrl||"").trim()||v,o=n.includes("/")&&!n.includes("?")&&!n.endsWith("/")?n:n.replace(/\/?$/,"")+S,b=E(o);w(b)}typeof document<"u"&&document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>h()):typeof document<"u"&&h(),p.createBar=w,p.createWsClient=E,p.init=h,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})});
|
|
82
82
|
//# sourceMappingURL=mitbar.umd.cjs.map
|
package/dist/mitbar.umd.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mitbar.umd.cjs","sources":["../src/bar.ts","../src/ws-client.ts","../src/index.ts"],"sourcesContent":["/**\n * Mitbar UI: fixed bar at bottom with input, Send, Build, Deploy, and reply area.\n */\n\nimport type { MessageHandler } from './ws-client';\n\ntype WsClient = {\n send: (payload: { text: string; pageUrl?: string; pageTitle?: string; action?: 'chat' | 'build' | 'deploy' }) => void;\n onMessage: (handler: MessageHandler) => () => void;\n};\n\nconst CSS = `\n.mitbar-root {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 2147483647;\n font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;\n font-size: 14px;\n background: #1e293b;\n color: #e2e8f0;\n box-shadow: 0 -2px 10px rgba(0,0,0,0.2);\n border-top: 1px solid #334155;\n}\n.mitbar-inner {\n max-width: 100%;\n padding: 8px 12px;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n}\n.mitbar-input-wrap {\n flex: 1;\n min-width: 120px;\n}\n.mitbar-input {\n width: 100%;\n box-sizing: border-box;\n padding: 6px 10px;\n border: 1px solid #475569;\n border-radius: 6px;\n background: #0f172a;\n color: #e2e8f0;\n font: inherit;\n}\n.mitbar-input::placeholder { color: #94a3b8; }\n.mitbar-input:focus {\n outline: none;\n border-color: #3b82f6;\n}\n.mitbar-btns {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n.mitbar-btn {\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n font: inherit;\n cursor: pointer;\n background: #334155;\n color: #e2e8f0;\n}\n.mitbar-btn:hover { background: #475569; }\n.mitbar-btn--primary { background: #3b82f6; color: #fff; }\n.mitbar-btn--primary:hover { background: #2563eb; }\n.mitbar-btn--deploy { background: #059669; color: #fff; }\n.mitbar-btn--deploy:hover { background: #047857; }\n.mitbar-status {\n font-size: 12px;\n color: #94a3b8;\n margin-left: auto;\n}\n.mitbar-reply {\n width: 100%;\n max-height: 120px;\n overflow-y: auto;\n padding: 8px 12px;\n margin-top: 4px;\n background: #0f172a;\n border-radius: 6px;\n border: 1px solid #334155;\n font-size: 13px;\n white-space: pre-wrap;\n word-break: break-word;\n}\n.mitbar-reply--error { border-color: #dc2626; color: #fca5a5; }\n.mitbar-reply:empty { display: none; }\n`;\n\nexport function createBar(client: WsClient): void {\n if (typeof document === 'undefined') return;\n const style = document.createElement('style');\n style.textContent = CSS;\n document.head.appendChild(style);\n\n const root = document.createElement('div');\n root.className = 'mitbar-root';\n root.setAttribute('aria-label', 'Mitbar');\n\n const inner = document.createElement('div');\n inner.className = 'mitbar-inner';\n\n const inputWrap = document.createElement('div');\n inputWrap.className = 'mitbar-input-wrap';\n const input = document.createElement('input');\n input.className = 'mitbar-input';\n input.type = 'text';\n input.placeholder = 'Message for script-writer (page URL is sent automatically)…';\n input.setAttribute('aria-label', 'Message');\n inputWrap.appendChild(input);\n\n const status = document.createElement('span');\n status.className = 'mitbar-status';\n status.textContent = 'Connecting…';\n\n const btnSend = document.createElement('button');\n btnSend.className = 'mitbar-btn mitbar-btn--primary';\n btnSend.textContent = 'Send';\n btnSend.type = 'button';\n\n const btnBuild = document.createElement('button');\n btnBuild.className = 'mitbar-btn';\n btnBuild.textContent = 'Build';\n btnBuild.type = 'button';\n\n const btnDeploy = document.createElement('button');\n btnDeploy.className = 'mitbar-btn mitbar-btn--deploy';\n btnDeploy.textContent = 'Deploy';\n btnDeploy.type = 'button';\n\n const replyDiv = document.createElement('div');\n replyDiv.className = 'mitbar-reply';\n replyDiv.setAttribute('aria-live', 'polite');\n\n const btns = document.createElement('div');\n btns.className = 'mitbar-btns';\n btns.append(btnSend, btnBuild, btnDeploy);\n\n inner.append(inputWrap, btns, status);\n root.appendChild(inner);\n root.appendChild(replyDiv);\n document.body.appendChild(root);\n\n const setStatus = (text: string) => {\n status.textContent = text;\n };\n const setReply = (text: string, isError?: boolean) => {\n replyDiv.textContent = text;\n replyDiv.classList.toggle('mitbar-reply--error', !!isError);\n };\n\n client.onMessage((msg) => {\n if (msg.type === 'connected') setStatus('Connected');\n else if (msg.type === 'disconnected') setStatus('Disconnected');\n else if (msg.type === 'error') {\n setStatus('Error');\n setReply(msg.error || 'Error', true);\n } else if (msg.type === 'output' && msg.text) {\n setReply(msg.text, false);\n }\n });\n\n const send = (action: 'chat' | 'build' | 'deploy') => {\n const text = input.value.trim();\n if (action === 'chat' && !text) return;\n const payload = action === 'chat' ? text : (text || `Please ${action} the current project.`);\n client.send({ text: payload, action });\n if (action === 'chat') input.value = '';\n setReply('Waiting for response…');\n };\n\n btnSend.addEventListener('click', () => send('chat'));\n btnBuild.addEventListener('click', () => send('build'));\n btnDeploy.addEventListener('click', () => send('deploy'));\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n send('chat');\n }\n });\n}\n","/**\n * WebSocket client: sends { text, pageUrl, pageTitle } and receives { type, text? } from mitbar-gateway.\n */\n\nexport interface SendPayload {\n text: string;\n pageUrl?: string;\n pageTitle?: string;\n /** Optional: /build or /deploy for special actions */\n action?: 'chat' | 'build' | 'deploy';\n}\n\nexport interface IncomingMessage {\n type: string;\n text?: string;\n error?: string;\n}\n\nexport type MessageHandler = (msg: IncomingMessage) => void;\n\nexport function createWsClient(gatewayWsUrl: string) {\n let ws: WebSocket | null = null;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n const listeners: MessageHandler[] = [];\n const RECONNECT_MS = 3000;\n\n function getPageContext(): { pageUrl: string; pageTitle: string } {\n if (typeof window === 'undefined') return { pageUrl: '', pageTitle: '' };\n return {\n pageUrl: window.location.href,\n pageTitle: document.title || window.location.pathname || '',\n };\n }\n\n function connect(): WebSocket | null {\n if (typeof WebSocket === 'undefined') return null;\n try {\n const socket = new WebSocket(gatewayWsUrl);\n socket.onopen = () => {\n notify({ type: 'connected' });\n };\n socket.onmessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data as string) as IncomingMessage;\n notify(data);\n } catch {\n notify({ type: 'output', text: String(event.data) });\n }\n };\n socket.onclose = () => {\n notify({ type: 'disconnected' });\n ws = null;\n reconnectTimer = setTimeout(() => connect(), RECONNECT_MS);\n };\n socket.onerror = () => {\n notify({ type: 'error', error: 'WebSocket error' });\n };\n ws = socket;\n return socket;\n } catch (e) {\n notify({ type: 'error', error: String(e) });\n return null;\n }\n }\n\n function notify(msg: IncomingMessage) {\n listeners.forEach((h) => {\n try {\n h(msg);\n } catch (_) {}\n });\n }\n\n function send(payload: SendPayload): void {\n const { pageUrl, pageTitle } = getPageContext();\n const body = {\n text: (payload.text || '').trim(),\n pageUrl: payload.pageUrl ?? pageUrl,\n pageTitle: payload.pageTitle ?? pageTitle,\n action: payload.action || 'chat',\n };\n if (!body.text && body.action === 'chat') return;\n if (ws?.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(body));\n } else {\n notify({ type: 'error', error: 'Not connected. Reconnecting…' });\n connect();\n if (ws?.readyState === WebSocket.OPEN) ws.send(JSON.stringify(body));\n }\n }\n\n function onMessage(handler: MessageHandler): () => void {\n listeners.push(handler);\n return () => {\n const i = listeners.indexOf(handler);\n if (i >= 0) listeners.splice(i, 1);\n };\n }\n\n function disconnect(): void {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n if (ws) {\n ws.close();\n ws = null;\n }\n }\n\n connect();\n return { send, onMessage, connect, disconnect, getPageContext };\n}\n","/**\n * Mitbar – browser bar that talks to script-writer Docker agent via WebSocket gateway.\n * Add to any website; visibility and gateway URL are set via frontend config or environment.\n * Every message includes the current page address and link.\n *\n * Config (one of):\n * - init({ gatewayWsUrl: 'wss://...' }) or pass from env (e.g. VITE_MITBAR_GATEWAY_WS_URL)\n * - window.__MITBAR_CONFIG__ = { enabled: true, gatewayWsUrl: 'wss://...' }\n * - <script src=\"mitbar.js\" data-mitbar-enabled=\"true\" data-mitbar-gateway-ws-url=\"wss://...\"></script>\n *\n * When gatewayWsUrl is not set, defaults to wss://agent.mitverse.com/ws.\n * The host app should read from env (e.g. VITE_MITBAR_GATEWAY_WS_URL) and pass to init({ gatewayWsUrl }).\n */\n\nimport { createBar } from './bar';\nimport { createWsClient } from './ws-client';\n\nexport interface MitbarConfig {\n /** Show the bar. When false, bar is not rendered. */\n enabled?: boolean;\n /** WebSocket URL (e.g. wss://agent.mitverse.com/ws). Read from env (VITE_MITBAR_GATEWAY_WS_URL) or default. */\n gatewayWsUrl?: string;\n}\n\ndeclare global {\n interface Window {\n __MITBAR_CONFIG__?: MitbarConfig;\n }\n}\n\nconst DEFAULT_WS_PATH = '/ws';\n/** Default gateway when none is configured (agent.mitverse.com). Host app should pass gatewayWsUrl from env (e.g. VITE_MITBAR_GATEWAY_WS_URL). */\nconst DEFAULT_GATEWAY_WS_URL = 'wss://agent.mitverse.com/ws';\n\nfunction getConfig(): MitbarConfig {\n const win = typeof window !== 'undefined' ? window : undefined;\n if (!win) return {};\n const fromWindow = win.__MITBAR_CONFIG__ || {};\n const script = document.currentScript as HTMLScriptElement | null;\n const fromData = script\n ? {\n enabled: script.getAttribute('data-mitbar-enabled') === 'true' || script.getAttribute('data-mitbar-enabled') === '1',\n gatewayWsUrl: script.getAttribute('data-mitbar-gateway-ws-url') || undefined,\n }\n : {};\n return {\n enabled: fromWindow.enabled ?? fromData.enabled ?? false,\n gatewayWsUrl: fromWindow.gatewayWsUrl ?? fromData.gatewayWsUrl ?? undefined,\n };\n}\n\n/**\n * Initialize and mount the bar. Call once after DOM ready (or use auto-init from script tag).\n */\nexport function init(configOverride?: Partial<MitbarConfig>): void {\n const config = { ...getConfig(), ...configOverride };\n if (!config.enabled) return;\n const gatewayWsUrl = (config.gatewayWsUrl || '').trim() || DEFAULT_GATEWAY_WS_URL;\n const wsUrl = gatewayWsUrl.includes('/') && !gatewayWsUrl.includes('?') && !gatewayWsUrl.endsWith('/')\n ? gatewayWsUrl\n : gatewayWsUrl.replace(/\\/?$/, '') + DEFAULT_WS_PATH;\n const client = createWsClient(wsUrl);\n createBar(client);\n}\n\nif (typeof document !== 'undefined' && document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => init());\n} else if (typeof document !== 'undefined') {\n init();\n}\n\nexport { createBar, createWsClient };\n"],"names":["CSS","createBar","client","style","root","inner","inputWrap","input","status","btnSend","btnBuild","btnDeploy","replyDiv","btns","setStatus","text","setReply","isError","msg","send","action","payload","e","createWsClient","gatewayWsUrl","ws","reconnectTimer","listeners","RECONNECT_MS","getPageContext","connect","socket","notify","event","data","h","pageUrl","pageTitle","body","onMessage","handler","i","disconnect","DEFAULT_WS_PATH","DEFAULT_GATEWAY_WS_URL","getConfig","win","fromWindow","script","fromData","init","configOverride","config","wsUrl"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mitbar.umd.cjs","sources":["../src/bar.ts","../src/ws-client.ts","../src/index.ts"],"sourcesContent":["/**\n * Mitbar UI: fixed bar at bottom with input, Send, Build, Deploy, and reply area.\n */\n\nimport type { MessageHandler } from './ws-client';\n\ntype WsClient = {\n send: (payload: { text: string; pageUrl?: string; pageTitle?: string; action?: 'chat' | 'build' | 'deploy' }) => void;\n onMessage: (handler: MessageHandler) => () => void;\n};\n\nconst CSS = `\n.mitbar-root {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 2147483647;\n font-family: system-ui, -apple-system, Segoe UI, Roboto, sans-serif;\n font-size: 14px;\n background: #1e293b;\n color: #e2e8f0;\n box-shadow: 0 -2px 10px rgba(0,0,0,0.2);\n border-top: 1px solid #334155;\n}\n.mitbar-inner {\n max-width: 100%;\n padding: 8px 12px;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n}\n.mitbar-input-wrap {\n flex: 1;\n min-width: 120px;\n}\n.mitbar-input {\n width: 100%;\n box-sizing: border-box;\n padding: 6px 10px;\n border: 1px solid #475569;\n border-radius: 6px;\n background: #0f172a;\n color: #e2e8f0;\n font: inherit;\n}\n.mitbar-input::placeholder { color: #94a3b8; }\n.mitbar-input:focus {\n outline: none;\n border-color: #3b82f6;\n}\n.mitbar-btns {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n.mitbar-btn {\n padding: 6px 12px;\n border: none;\n border-radius: 6px;\n font: inherit;\n cursor: pointer;\n background: #334155;\n color: #e2e8f0;\n}\n.mitbar-btn:hover { background: #475569; }\n.mitbar-btn--primary { background: #3b82f6; color: #fff; }\n.mitbar-btn--primary:hover { background: #2563eb; }\n.mitbar-btn--deploy { background: #059669; color: #fff; }\n.mitbar-btn--deploy:hover { background: #047857; }\n.mitbar-status {\n font-size: 12px;\n color: #94a3b8;\n margin-left: auto;\n}\n.mitbar-reply {\n width: 100%;\n max-height: 120px;\n overflow-y: auto;\n padding: 8px 12px;\n margin-top: 4px;\n background: #0f172a;\n border-radius: 6px;\n border: 1px solid #334155;\n font-size: 13px;\n white-space: pre-wrap;\n word-break: break-word;\n}\n.mitbar-reply--error { border-color: #dc2626; color: #fca5a5; }\n.mitbar-reply:empty { display: none; }\n`;\n\nexport function createBar(client: WsClient): void {\n if (typeof document === 'undefined') return;\n const style = document.createElement('style');\n style.textContent = CSS;\n document.head.appendChild(style);\n\n const root = document.createElement('div');\n root.className = 'mitbar-root';\n root.setAttribute('aria-label', 'Mitbar');\n\n const inner = document.createElement('div');\n inner.className = 'mitbar-inner';\n\n const inputWrap = document.createElement('div');\n inputWrap.className = 'mitbar-input-wrap';\n const input = document.createElement('input');\n input.className = 'mitbar-input';\n input.type = 'text';\n input.placeholder = 'Message for script-writer (page URL is sent automatically)…';\n input.setAttribute('aria-label', 'Message');\n inputWrap.appendChild(input);\n\n const status = document.createElement('span');\n status.className = 'mitbar-status';\n status.textContent = 'Connecting…';\n\n const btnSend = document.createElement('button');\n btnSend.className = 'mitbar-btn mitbar-btn--primary';\n btnSend.textContent = 'Send';\n btnSend.type = 'button';\n\n const btnBuild = document.createElement('button');\n btnBuild.className = 'mitbar-btn';\n btnBuild.textContent = 'Build';\n btnBuild.type = 'button';\n\n const btnDeploy = document.createElement('button');\n btnDeploy.className = 'mitbar-btn mitbar-btn--deploy';\n btnDeploy.textContent = 'Deploy';\n btnDeploy.type = 'button';\n\n const replyDiv = document.createElement('div');\n replyDiv.className = 'mitbar-reply';\n replyDiv.setAttribute('aria-live', 'polite');\n\n const btns = document.createElement('div');\n btns.className = 'mitbar-btns';\n btns.append(btnSend, btnBuild, btnDeploy);\n\n inner.append(inputWrap, btns, status);\n root.appendChild(inner);\n root.appendChild(replyDiv);\n document.body.appendChild(root);\n\n const setStatus = (text: string) => {\n status.textContent = text;\n };\n const setReply = (text: string, isError?: boolean) => {\n replyDiv.textContent = text;\n replyDiv.classList.toggle('mitbar-reply--error', !!isError);\n };\n\n client.onMessage((msg) => {\n if (msg.type === 'connected') setStatus('Connected');\n else if (msg.type === 'disconnected') setStatus('Disconnected');\n else if (msg.type === 'error') {\n setStatus('Error');\n setReply(msg.error || 'Error', true);\n } else if (msg.type === 'output' && msg.text) {\n setReply(msg.text, false);\n }\n });\n\n const send = (action: 'chat' | 'build' | 'deploy') => {\n const text = input.value.trim();\n if (action === 'chat' && !text) return;\n const payload = action === 'chat' ? text : (text || `Please ${action} the current project.`);\n client.send({ text: payload, action });\n if (action === 'chat') input.value = '';\n setReply('Waiting for response…');\n };\n\n btnSend.addEventListener('click', () => send('chat'));\n btnBuild.addEventListener('click', () => send('build'));\n btnDeploy.addEventListener('click', () => send('deploy'));\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n send('chat');\n }\n });\n}\n","/**\n * WebSocket client: sends { text, pageUrl, pageTitle } and receives { type, text? } from mitbar-gateway.\n */\n\nexport interface SendPayload {\n text: string;\n pageUrl?: string;\n pageTitle?: string;\n /** Optional: /build or /deploy for special actions */\n action?: 'chat' | 'build' | 'deploy';\n}\n\nexport interface IncomingMessage {\n type: string;\n text?: string;\n error?: string;\n}\n\nexport type MessageHandler = (msg: IncomingMessage) => void;\n\nexport function createWsClient(gatewayWsUrl: string) {\n let ws: WebSocket | null = null;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n const listeners: MessageHandler[] = [];\n const RECONNECT_MS = 3000;\n\n function getPageContext(): { pageUrl: string; pageTitle: string } {\n if (typeof window === 'undefined') return { pageUrl: '', pageTitle: '' };\n return {\n pageUrl: window.location.href,\n pageTitle: document.title || window.location.pathname || '',\n };\n }\n\n function connect(): WebSocket | null {\n if (typeof WebSocket === 'undefined') return null;\n try {\n const socket = new WebSocket(gatewayWsUrl);\n socket.onopen = () => {\n notify({ type: 'connected' });\n };\n socket.onmessage = (event: MessageEvent) => {\n try {\n const data = JSON.parse(event.data as string) as IncomingMessage;\n notify(data);\n } catch {\n notify({ type: 'output', text: String(event.data) });\n }\n };\n socket.onclose = () => {\n notify({ type: 'disconnected' });\n ws = null;\n reconnectTimer = setTimeout(() => connect(), RECONNECT_MS);\n };\n socket.onerror = () => {\n notify({ type: 'error', error: 'WebSocket error' });\n };\n ws = socket;\n return socket;\n } catch (e) {\n notify({ type: 'error', error: String(e) });\n return null;\n }\n }\n\n function notify(msg: IncomingMessage) {\n listeners.forEach((h) => {\n try {\n h(msg);\n } catch (_) {}\n });\n }\n\n function send(payload: SendPayload): void {\n const { pageUrl, pageTitle } = getPageContext();\n const body = {\n text: (payload.text || '').trim(),\n pageUrl: payload.pageUrl ?? pageUrl,\n pageTitle: payload.pageTitle ?? pageTitle,\n action: payload.action || 'chat',\n };\n if (!body.text && body.action === 'chat') return;\n if (ws?.readyState === WebSocket.OPEN) {\n ws.send(JSON.stringify(body));\n } else {\n notify({ type: 'error', error: 'Not connected. Reconnecting…' });\n connect();\n if (ws?.readyState === WebSocket.OPEN) ws.send(JSON.stringify(body));\n }\n }\n\n function onMessage(handler: MessageHandler): () => void {\n listeners.push(handler);\n return () => {\n const i = listeners.indexOf(handler);\n if (i >= 0) listeners.splice(i, 1);\n };\n }\n\n function disconnect(): void {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n if (ws) {\n ws.close();\n ws = null;\n }\n }\n\n connect();\n return { send, onMessage, connect, disconnect, getPageContext };\n}\n","/**\n * Mitbar – browser bar that talks to script-writer Docker agent via WebSocket gateway.\n * Add to any website; visibility and gateway URL are set via frontend config or environment.\n * Every message includes the current page address and link.\n *\n * Config (one of):\n * - init({ gatewayWsUrl: 'wss://...' }) or pass from env (e.g. VITE_MITBAR_GATEWAY_WS_URL)\n * - window.__MITBAR_CONFIG__ = { enabled: true, gatewayWsUrl: 'wss://...' }\n * - <script src=\"mitbar.js\" data-mitbar-enabled=\"true\" data-mitbar-gateway-ws-url=\"wss://...\"></script>\n *\n * When gatewayWsUrl is not set, defaults to wss://agent.mitverse.com/api/v1/agent/ws (same /api/ path as Scripter console).\n * The host app should read from env (e.g. VITE_MITBAR_GATEWAY_WS_URL) and pass to init({ gatewayWsUrl }).\n */\n\nimport { createBar } from './bar';\nimport { createWsClient } from './ws-client';\n\nexport interface MitbarConfig {\n /** Show the bar. When false, bar is not rendered. */\n enabled?: boolean;\n /** WebSocket URL (e.g. wss://agent.mitverse.com/api/v1/agent/ws). Read from env (VITE_MITBAR_GATEWAY_WS_URL) or default. */\n gatewayWsUrl?: string;\n}\n\ndeclare global {\n interface Window {\n __MITBAR_CONFIG__?: MitbarConfig;\n }\n}\n\nconst DEFAULT_WS_PATH = '/ws';\n/** Default gateway when none is configured. Same /api/ path as Scripter console so nginx location /api/ handles both. */\nconst DEFAULT_GATEWAY_WS_URL = 'wss://agent.mitverse.com/api/v1/agent/ws';\n\nfunction getConfig(): MitbarConfig {\n const win = typeof window !== 'undefined' ? window : undefined;\n if (!win) return {};\n const fromWindow = win.__MITBAR_CONFIG__ || {};\n const script = document.currentScript as HTMLScriptElement | null;\n const fromData = script\n ? {\n enabled: script.getAttribute('data-mitbar-enabled') === 'true' || script.getAttribute('data-mitbar-enabled') === '1',\n gatewayWsUrl: script.getAttribute('data-mitbar-gateway-ws-url') || undefined,\n }\n : {};\n return {\n enabled: fromWindow.enabled ?? fromData.enabled ?? false,\n gatewayWsUrl: fromWindow.gatewayWsUrl ?? fromData.gatewayWsUrl ?? undefined,\n };\n}\n\n/**\n * Initialize and mount the bar. Call once after DOM ready (or use auto-init from script tag).\n */\nexport function init(configOverride?: Partial<MitbarConfig>): void {\n const config = { ...getConfig(), ...configOverride };\n if (!config.enabled) return;\n const gatewayWsUrl = (config.gatewayWsUrl || '').trim() || DEFAULT_GATEWAY_WS_URL;\n const wsUrl = gatewayWsUrl.includes('/') && !gatewayWsUrl.includes('?') && !gatewayWsUrl.endsWith('/')\n ? gatewayWsUrl\n : gatewayWsUrl.replace(/\\/?$/, '') + DEFAULT_WS_PATH;\n const client = createWsClient(wsUrl);\n createBar(client);\n}\n\nif (typeof document !== 'undefined' && document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => init());\n} else if (typeof document !== 'undefined') {\n init();\n}\n\nexport { createBar, createWsClient };\n"],"names":["CSS","createBar","client","style","root","inner","inputWrap","input","status","btnSend","btnBuild","btnDeploy","replyDiv","btns","setStatus","text","setReply","isError","msg","send","action","payload","e","createWsClient","gatewayWsUrl","ws","reconnectTimer","listeners","RECONNECT_MS","getPageContext","connect","socket","notify","event","data","h","pageUrl","pageTitle","body","onMessage","handler","disconnect","DEFAULT_WS_PATH","DEFAULT_GATEWAY_WS_URL","getConfig","win","fromWindow","script","fromData","init","configOverride","config","wsUrl"],"mappings":"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"}
|
package/package.json
CHANGED