@mitverse/mitbar-web 1.0.1 → 1.0.3

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 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
@@ -1,4 +1,4 @@
1
- const w = `
1
+ const C = `
2
2
  .mitbar-root {
3
3
  position: fixed;
4
4
  bottom: 0;
@@ -11,8 +11,52 @@ const w = `
11
11
  color: #e2e8f0;
12
12
  box-shadow: 0 -2px 10px rgba(0,0,0,0.2);
13
13
  border-top: 1px solid #334155;
14
+ display: flex;
15
+ flex-direction: column;
16
+ max-height: 50vh;
17
+ }
18
+ .mitbar-reply-wrap {
19
+ flex: 0 0 auto;
20
+ max-height: 160px;
21
+ display: flex;
22
+ flex-direction: column;
23
+ overflow: hidden;
24
+ border-bottom: 1px solid #334155;
25
+ }
26
+ .mitbar-reply-wrap:not(.mitbar-reply-wrap--has-content) { display: none; }
27
+ .mitbar-reply-header {
28
+ display: flex;
29
+ align-items: center;
30
+ justify-content: flex-end;
31
+ padding: 4px 8px 2px;
32
+ min-height: 28px;
14
33
  }
34
+ .mitbar-reply {
35
+ flex: 1;
36
+ min-height: 0;
37
+ overflow-y: auto;
38
+ padding: 8px 12px;
39
+ margin: 0 8px 8px;
40
+ background: #0f172a;
41
+ border-radius: 6px;
42
+ border: 1px solid #334155;
43
+ font-size: 13px;
44
+ white-space: pre-wrap;
45
+ word-break: break-word;
46
+ }
47
+ .mitbar-reply--error { border-color: #dc2626; color: #fca5a5; }
48
+ .mitbar-btn-clear {
49
+ padding: 4px 10px;
50
+ border: none;
51
+ border-radius: 4px;
52
+ font-size: 12px;
53
+ cursor: pointer;
54
+ background: #334155;
55
+ color: #94a3b8;
56
+ }
57
+ .mitbar-btn-clear:hover { background: #475569; color: #e2e8f0; }
15
58
  .mitbar-inner {
59
+ flex: 0 0 auto;
16
60
  max-width: 100%;
17
61
  padding: 8px 12px;
18
62
  display: flex;
@@ -63,146 +107,139 @@ const w = `
63
107
  color: #94a3b8;
64
108
  margin-left: auto;
65
109
  }
66
- .mitbar-reply {
67
- width: 100%;
68
- max-height: 120px;
69
- overflow-y: auto;
70
- padding: 8px 12px;
71
- margin-top: 4px;
72
- background: #0f172a;
73
- border-radius: 6px;
74
- border: 1px solid #334155;
75
- font-size: 13px;
76
- white-space: pre-wrap;
77
- word-break: break-word;
78
- }
79
- .mitbar-reply--error { border-color: #dc2626; color: #fca5a5; }
80
- .mitbar-reply:empty { display: none; }
81
110
  `;
82
- function h(d) {
111
+ function k(s) {
83
112
  if (typeof document > "u") return;
84
- const e = document.createElement("style");
85
- e.textContent = w, document.head.appendChild(e);
86
- const n = document.createElement("div");
87
- n.className = "mitbar-root", n.setAttribute("aria-label", "Mitbar");
88
- const o = document.createElement("div");
89
- o.className = "mitbar-inner";
113
+ const t = document.createElement("style");
114
+ t.textContent = C, document.head.appendChild(t);
115
+ const r = document.createElement("div");
116
+ r.className = "mitbar-root", r.setAttribute("aria-label", "Mitbar");
117
+ const a = document.createElement("div");
118
+ a.className = "mitbar-reply-wrap";
90
119
  const u = document.createElement("div");
91
- u.className = "mitbar-input-wrap";
92
- const c = document.createElement("input");
93
- c.className = "mitbar-input", c.type = "text", c.placeholder = "Message for script-writer (page URL is sent automatically)…", c.setAttribute("aria-label", "Message"), u.appendChild(c);
94
- const s = document.createElement("span");
95
- s.className = "mitbar-status", s.textContent = "Connecting…";
96
- const a = document.createElement("button");
97
- a.className = "mitbar-btn mitbar-btn--primary", a.textContent = "Send", a.type = "button";
98
- const b = document.createElement("button");
99
- b.className = "mitbar-btn", b.textContent = "Build", b.type = "button";
100
- const m = document.createElement("button");
101
- m.className = "mitbar-btn mitbar-btn--deploy", m.textContent = "Deploy", m.type = "button";
120
+ u.className = "mitbar-reply-header";
121
+ const p = document.createElement("button");
122
+ p.className = "mitbar-btn-clear", p.textContent = "Clear", p.type = "button", p.setAttribute("aria-label", "Clear reply"), u.appendChild(p);
123
+ const i = document.createElement("div");
124
+ i.className = "mitbar-reply", i.setAttribute("aria-live", "polite"), a.appendChild(u), a.appendChild(i);
125
+ const c = document.createElement("div");
126
+ c.className = "mitbar-inner";
102
127
  const f = document.createElement("div");
103
- f.className = "mitbar-reply", f.setAttribute("aria-live", "polite");
104
- const t = document.createElement("div");
105
- t.className = "mitbar-btns", t.append(a, b, m), o.append(u, t, s), n.appendChild(o), n.appendChild(f), document.body.appendChild(n);
106
- const i = (r) => {
107
- s.textContent = r;
108
- }, p = (r, y) => {
109
- f.textContent = r, f.classList.toggle("mitbar-reply--error", !!y);
128
+ f.className = "mitbar-input-wrap";
129
+ const l = document.createElement("input");
130
+ l.className = "mitbar-input", l.type = "text", l.placeholder = "Message for script-writer (page URL is sent automatically)…", l.setAttribute("aria-label", "Message"), f.appendChild(l);
131
+ const m = document.createElement("span");
132
+ m.className = "mitbar-status", m.textContent = "Connecting…";
133
+ const e = document.createElement("button");
134
+ e.className = "mitbar-btn mitbar-btn--primary", e.textContent = "Send", e.type = "button";
135
+ const o = document.createElement("button");
136
+ o.className = "mitbar-btn", o.textContent = "Build", o.type = "button";
137
+ const d = document.createElement("button");
138
+ d.className = "mitbar-btn mitbar-btn--deploy", d.textContent = "Deploy", d.type = "button";
139
+ const b = document.createElement("div");
140
+ b.className = "mitbar-btns", b.append(e, o, d), c.append(f, b, m), r.appendChild(a), r.appendChild(c), document.body.appendChild(r);
141
+ const g = (n) => {
142
+ m.textContent = n;
143
+ }, h = (n, y) => {
144
+ i.textContent = n, i.classList.toggle("mitbar-reply--error", !!y), a.classList.toggle("mitbar-reply-wrap--has-content", !!n);
145
+ }, v = () => {
146
+ i.textContent = "", i.classList.remove("mitbar-reply--error"), a.classList.remove("mitbar-reply-wrap--has-content");
110
147
  };
111
- d.onMessage((r) => {
112
- r.type === "connected" ? i("Connected") : r.type === "disconnected" ? i("Disconnected") : r.type === "error" ? (i("Error"), p(r.error || "Error", !0)) : r.type === "output" && r.text && p(r.text, !1);
148
+ p.addEventListener("click", v), s.onMessage((n) => {
149
+ n.type === "connected" ? g("Connected") : n.type === "disconnected" ? g("Disconnected") : n.type === "error" ? (g("Error"), h(n.error || "Error", !0)) : n.type === "output" && n.text && h(n.text, !1);
113
150
  });
114
- const l = (r) => {
115
- const y = c.value.trim();
116
- if (r === "chat" && !y) return;
117
- const x = r === "chat" ? y : y || `Please ${r} the current project.`;
118
- d.send({ text: x, action: r }), r === "chat" && (c.value = ""), p("Waiting for response…");
151
+ const x = (n) => {
152
+ const y = l.value.trim();
153
+ if (n === "chat" && !y) return;
154
+ const E = n === "chat" ? y : y || `Please ${n} the current project.`;
155
+ s.send({ text: E, action: n }), n === "chat" && (l.value = ""), h("Waiting for response…");
119
156
  };
120
- a.addEventListener("click", () => l("chat")), b.addEventListener("click", () => l("build")), m.addEventListener("click", () => l("deploy")), c.addEventListener("keydown", (r) => {
121
- r.key === "Enter" && !r.shiftKey && (r.preventDefault(), l("chat"));
157
+ e.addEventListener("click", () => x("chat")), o.addEventListener("click", () => x("build")), d.addEventListener("click", () => x("deploy")), l.addEventListener("keydown", (n) => {
158
+ n.key === "Enter" && !n.shiftKey && (n.preventDefault(), x("chat"));
122
159
  });
123
160
  }
124
- function E(d) {
125
- let e = null, n = null;
126
- const o = [], u = 3e3;
127
- function c() {
161
+ function S(s) {
162
+ let t = null, r = null;
163
+ const a = [], u = 3e3;
164
+ function p() {
128
165
  return typeof window > "u" ? { pageUrl: "", pageTitle: "" } : {
129
166
  pageUrl: window.location.href,
130
167
  pageTitle: document.title || window.location.pathname || ""
131
168
  };
132
169
  }
133
- function s() {
170
+ function i() {
134
171
  if (typeof WebSocket > "u") return null;
135
172
  try {
136
- const t = new WebSocket(d);
137
- return t.onopen = () => {
138
- a({ type: "connected" });
139
- }, t.onmessage = (i) => {
173
+ const e = new WebSocket(s);
174
+ return e.onopen = () => {
175
+ c({ type: "connected" });
176
+ }, e.onmessage = (o) => {
140
177
  try {
141
- const p = JSON.parse(i.data);
142
- a(p);
178
+ const d = JSON.parse(o.data);
179
+ c(d);
143
180
  } catch {
144
- a({ type: "output", text: String(i.data) });
181
+ c({ type: "output", text: String(o.data) });
145
182
  }
146
- }, t.onclose = () => {
147
- a({ type: "disconnected" }), e = null, n = setTimeout(() => s(), u);
148
- }, t.onerror = () => {
149
- a({ type: "error", error: "WebSocket error" });
150
- }, e = t, t;
151
- } catch (t) {
152
- return a({ type: "error", error: String(t) }), null;
183
+ }, e.onclose = () => {
184
+ c({ type: "disconnected" }), t = null, r = setTimeout(() => i(), u);
185
+ }, e.onerror = () => {
186
+ c({ type: "error", error: "WebSocket error" });
187
+ }, t = e, e;
188
+ } catch (e) {
189
+ return c({ type: "error", error: String(e) }), null;
153
190
  }
154
191
  }
155
- function a(t) {
156
- o.forEach((i) => {
192
+ function c(e) {
193
+ a.forEach((o) => {
157
194
  try {
158
- i(t);
195
+ o(e);
159
196
  } catch {
160
197
  }
161
198
  });
162
199
  }
163
- function b(t) {
164
- const { pageUrl: i, pageTitle: p } = c(), l = {
165
- text: (t.text || "").trim(),
166
- pageUrl: t.pageUrl ?? i,
167
- pageTitle: t.pageTitle ?? p,
168
- action: t.action || "chat"
200
+ function f(e) {
201
+ const { pageUrl: o, pageTitle: d } = p(), b = {
202
+ text: (e.text || "").trim(),
203
+ pageUrl: e.pageUrl ?? o,
204
+ pageTitle: e.pageTitle ?? d,
205
+ action: e.action || "chat"
169
206
  };
170
- !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))));
207
+ !b.text && b.action === "chat" || ((t == null ? void 0 : t.readyState) === WebSocket.OPEN ? t.send(JSON.stringify(b)) : (c({ type: "error", error: "Not connected. Reconnecting…" }), i(), (t == null ? void 0 : t.readyState) === WebSocket.OPEN && t.send(JSON.stringify(b))));
171
208
  }
172
- function m(t) {
173
- return o.push(t), () => {
174
- const i = o.indexOf(t);
175
- i >= 0 && o.splice(i, 1);
209
+ function l(e) {
210
+ return a.push(e), () => {
211
+ const o = a.indexOf(e);
212
+ o >= 0 && a.splice(o, 1);
176
213
  };
177
214
  }
178
- function f() {
179
- n && (clearTimeout(n), n = null), e && (e.close(), e = null);
215
+ function m() {
216
+ r && (clearTimeout(r), r = null), t && (t.close(), t = null);
180
217
  }
181
- return s(), { send: b, onMessage: m, connect: s, disconnect: f, getPageContext: c };
182
- }
183
- const S = "/ws", k = "wss://agent.mitverse.com/ws";
184
- function v() {
185
- const d = typeof window < "u" ? window : void 0;
186
- if (!d) return {};
187
- const e = d.__MITBAR_CONFIG__ || {}, n = document.currentScript, o = n ? {
188
- enabled: n.getAttribute("data-mitbar-enabled") === "true" || n.getAttribute("data-mitbar-enabled") === "1",
189
- gatewayWsUrl: n.getAttribute("data-mitbar-gateway-ws-url") || void 0
218
+ return i(), { send: f, onMessage: l, connect: i, disconnect: m, getPageContext: p };
219
+ }
220
+ const N = "/ws", W = "wss://agent.mitverse.com/api/v1/agent/ws";
221
+ function U() {
222
+ const s = typeof window < "u" ? window : void 0;
223
+ if (!s) return {};
224
+ const t = s.__MITBAR_CONFIG__ || {}, r = document.currentScript, a = r ? {
225
+ enabled: r.getAttribute("data-mitbar-enabled") === "true" || r.getAttribute("data-mitbar-enabled") === "1",
226
+ gatewayWsUrl: r.getAttribute("data-mitbar-gateway-ws-url") || void 0
190
227
  } : {};
191
228
  return {
192
- enabled: e.enabled ?? o.enabled ?? !1,
193
- gatewayWsUrl: e.gatewayWsUrl ?? o.gatewayWsUrl ?? void 0
229
+ enabled: t.enabled ?? a.enabled ?? !1,
230
+ gatewayWsUrl: t.gatewayWsUrl ?? a.gatewayWsUrl ?? void 0
194
231
  };
195
232
  }
196
- function g(d) {
197
- const e = { ...v(), ...d };
198
- if (!e.enabled) return;
199
- const n = (e.gatewayWsUrl || "").trim() || k, o = n.includes("/") && !n.includes("?") && !n.endsWith("/") ? n : n.replace(/\/?$/, "") + S, u = E(o);
200
- h(u);
233
+ function w(s) {
234
+ const t = { ...U(), ...s };
235
+ if (!t.enabled) return;
236
+ const r = (t.gatewayWsUrl || "").trim() || W, a = r.includes("/") && !r.includes("?") && !r.endsWith("/") ? r : r.replace(/\/?$/, "") + N, u = S(a);
237
+ k(u);
201
238
  }
202
- typeof document < "u" && document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", () => g()) : typeof document < "u" && g();
239
+ typeof document < "u" && document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", () => w()) : typeof document < "u" && w();
203
240
  export {
204
- h as createBar,
205
- E as createWsClient,
206
- g as init
241
+ k as createBar,
242
+ S as createWsClient,
243
+ w as init
207
244
  };
208
245
  //# sourceMappingURL=mitbar.es.js.map
@@ -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 display: flex;\n flex-direction: column;\n max-height: 50vh;\n}\n.mitbar-reply-wrap {\n flex: 0 0 auto;\n max-height: 160px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border-bottom: 1px solid #334155;\n}\n.mitbar-reply-wrap:not(.mitbar-reply-wrap--has-content) { display: none; }\n.mitbar-reply-header {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 4px 8px 2px;\n min-height: 28px;\n}\n.mitbar-reply {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 8px 12px;\n margin: 0 8px 8px;\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-btn-clear {\n padding: 4px 10px;\n border: none;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n background: #334155;\n color: #94a3b8;\n}\n.mitbar-btn-clear:hover { background: #475569; color: #e2e8f0; }\n.mitbar-inner {\n flex: 0 0 auto;\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`;\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 replyWrap = document.createElement('div');\n replyWrap.className = 'mitbar-reply-wrap';\n\n const replyHeader = document.createElement('div');\n replyHeader.className = 'mitbar-reply-header';\n const btnClear = document.createElement('button');\n btnClear.className = 'mitbar-btn-clear';\n btnClear.textContent = 'Clear';\n btnClear.type = 'button';\n btnClear.setAttribute('aria-label', 'Clear reply');\n replyHeader.appendChild(btnClear);\n\n const replyDiv = document.createElement('div');\n replyDiv.className = 'mitbar-reply';\n replyDiv.setAttribute('aria-live', 'polite');\n\n replyWrap.appendChild(replyHeader);\n replyWrap.appendChild(replyDiv);\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 btns = document.createElement('div');\n btns.className = 'mitbar-btns';\n btns.append(btnSend, btnBuild, btnDeploy);\n\n inner.append(inputWrap, btns, status);\n\n root.appendChild(replyWrap);\n root.appendChild(inner);\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 replyWrap.classList.toggle('mitbar-reply-wrap--has-content', !!text);\n };\n const clearReply = () => {\n replyDiv.textContent = '';\n replyDiv.classList.remove('mitbar-reply--error');\n replyWrap.classList.remove('mitbar-reply-wrap--has-content');\n };\n\n btnClear.addEventListener('click', clearReply);\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","replyWrap","replyHeader","btnClear","replyDiv","inner","inputWrap","input","status","btnSend","btnBuild","btnDeploy","btns","setStatus","text","setReply","isError","clearReply","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,4 +1,4 @@
1
- (function(p,g){typeof exports=="object"&&typeof module<"u"?g(exports):typeof define=="function"&&define.amd?define(["exports"],g):(p=typeof globalThis<"u"?globalThis:p||self,g(p.Mitbar={}))})(this,function(p){"use strict";const g=`
1
+ (function(u,y){typeof exports=="object"&&typeof module<"u"?y(exports):typeof define=="function"&&define.amd?define(["exports"],y):(u=typeof globalThis<"u"?globalThis:u||self,y(u.Mitbar={}))})(this,function(u){"use strict";const y=`
2
2
  .mitbar-root {
3
3
  position: fixed;
4
4
  bottom: 0;
@@ -11,8 +11,52 @@
11
11
  color: #e2e8f0;
12
12
  box-shadow: 0 -2px 10px rgba(0,0,0,0.2);
13
13
  border-top: 1px solid #334155;
14
+ display: flex;
15
+ flex-direction: column;
16
+ max-height: 50vh;
17
+ }
18
+ .mitbar-reply-wrap {
19
+ flex: 0 0 auto;
20
+ max-height: 160px;
21
+ display: flex;
22
+ flex-direction: column;
23
+ overflow: hidden;
24
+ border-bottom: 1px solid #334155;
25
+ }
26
+ .mitbar-reply-wrap:not(.mitbar-reply-wrap--has-content) { display: none; }
27
+ .mitbar-reply-header {
28
+ display: flex;
29
+ align-items: center;
30
+ justify-content: flex-end;
31
+ padding: 4px 8px 2px;
32
+ min-height: 28px;
33
+ }
34
+ .mitbar-reply {
35
+ flex: 1;
36
+ min-height: 0;
37
+ overflow-y: auto;
38
+ padding: 8px 12px;
39
+ margin: 0 8px 8px;
40
+ background: #0f172a;
41
+ border-radius: 6px;
42
+ border: 1px solid #334155;
43
+ font-size: 13px;
44
+ white-space: pre-wrap;
45
+ word-break: break-word;
46
+ }
47
+ .mitbar-reply--error { border-color: #dc2626; color: #fca5a5; }
48
+ .mitbar-btn-clear {
49
+ padding: 4px 10px;
50
+ border: none;
51
+ border-radius: 4px;
52
+ font-size: 12px;
53
+ cursor: pointer;
54
+ background: #334155;
55
+ color: #94a3b8;
14
56
  }
57
+ .mitbar-btn-clear:hover { background: #475569; color: #e2e8f0; }
15
58
  .mitbar-inner {
59
+ flex: 0 0 auto;
16
60
  max-width: 100%;
17
61
  padding: 8px 12px;
18
62
  display: flex;
@@ -63,20 +107,5 @@
63
107
  color: #94a3b8;
64
108
  margin-left: auto;
65
109
  }
66
- .mitbar-reply {
67
- width: 100%;
68
- max-height: 120px;
69
- overflow-y: auto;
70
- padding: 8px 12px;
71
- margin-top: 4px;
72
- background: #0f172a;
73
- border-radius: 6px;
74
- border: 1px solid #334155;
75
- font-size: 13px;
76
- white-space: pre-wrap;
77
- word-break: break-word;
78
- }
79
- .mitbar-reply--error { border-color: #dc2626; color: #fca5a5; }
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 i=document.createElement("button");i.className="mitbar-btn mitbar-btn--primary",i.textContent="Send",i.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(i,f,m),o.append(b,t,s),n.appendChild(o),n.appendChild(y),document.body.appendChild(n);const a=r=>{s.textContent=r},u=(r,x)=>{y.textContent=r,y.classList.toggle("mitbar-reply--error",!!x)};d.onMessage(r=>{r.type==="connected"?a("Connected"):r.type==="disconnected"?a("Disconnected"):r.type==="error"?(a("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…")};i.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=()=>{i({type:"connected"})},t.onmessage=a=>{try{const u=JSON.parse(a.data);i(u)}catch{i({type:"output",text:String(a.data)})}},t.onclose=()=>{i({type:"disconnected"}),e=null,n=setTimeout(()=>s(),b)},t.onerror=()=>{i({type:"error",error:"WebSocket error"})},e=t,t}catch(t){return i({type:"error",error:String(t)}),null}}function i(t){o.forEach(a=>{try{a(t)}catch{}})}function f(t){const{pageUrl:a,pageTitle:u}=c(),l={text:(t.text||"").trim(),pageUrl:t.pageUrl??a,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)):(i({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 a=o.indexOf(t);a>=0&&o.splice(a,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/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"})});
110
+ `;function E(s){if(typeof document>"u")return;const t=document.createElement("style");t.textContent=y,document.head.appendChild(t);const r=document.createElement("div");r.className="mitbar-root",r.setAttribute("aria-label","Mitbar");const o=document.createElement("div");o.className="mitbar-reply-wrap";const m=document.createElement("div");m.className="mitbar-reply-header";const p=document.createElement("button");p.className="mitbar-btn-clear",p.textContent="Clear",p.type="button",p.setAttribute("aria-label","Clear reply"),m.appendChild(p);const i=document.createElement("div");i.className="mitbar-reply",i.setAttribute("aria-live","polite"),o.appendChild(m),o.appendChild(i);const c=document.createElement("div");c.className="mitbar-inner";const x=document.createElement("div");x.className="mitbar-input-wrap";const l=document.createElement("input");l.className="mitbar-input",l.type="text",l.placeholder="Message for script-writer (page URL is sent automatically)…",l.setAttribute("aria-label","Message"),x.appendChild(l);const f=document.createElement("span");f.className="mitbar-status",f.textContent="Connecting…";const e=document.createElement("button");e.className="mitbar-btn mitbar-btn--primary",e.textContent="Send",e.type="button";const a=document.createElement("button");a.className="mitbar-btn",a.textContent="Build",a.type="button";const d=document.createElement("button");d.className="mitbar-btn mitbar-btn--deploy",d.textContent="Deploy",d.type="button";const b=document.createElement("div");b.className="mitbar-btns",b.append(e,a,d),c.append(x,b,f),r.appendChild(o),r.appendChild(c),document.body.appendChild(r);const v=n=>{f.textContent=n},C=(n,g)=>{i.textContent=n,i.classList.toggle("mitbar-reply--error",!!g),o.classList.toggle("mitbar-reply-wrap--has-content",!!n)},T=()=>{i.textContent="",i.classList.remove("mitbar-reply--error"),o.classList.remove("mitbar-reply-wrap--has-content")};p.addEventListener("click",T),s.onMessage(n=>{n.type==="connected"?v("Connected"):n.type==="disconnected"?v("Disconnected"):n.type==="error"?(v("Error"),C(n.error||"Error",!0)):n.type==="output"&&n.text&&C(n.text,!1)});const h=n=>{const g=l.value.trim();if(n==="chat"&&!g)return;const U=n==="chat"?g:g||`Please ${n} the current project.`;s.send({text:U,action:n}),n==="chat"&&(l.value=""),C("Waiting for response…")};e.addEventListener("click",()=>h("chat")),a.addEventListener("click",()=>h("build")),d.addEventListener("click",()=>h("deploy")),l.addEventListener("keydown",n=>{n.key==="Enter"&&!n.shiftKey&&(n.preventDefault(),h("chat"))})}function k(s){let t=null,r=null;const o=[],m=3e3;function p(){return typeof window>"u"?{pageUrl:"",pageTitle:""}:{pageUrl:window.location.href,pageTitle:document.title||window.location.pathname||""}}function i(){if(typeof WebSocket>"u")return null;try{const e=new WebSocket(s);return e.onopen=()=>{c({type:"connected"})},e.onmessage=a=>{try{const d=JSON.parse(a.data);c(d)}catch{c({type:"output",text:String(a.data)})}},e.onclose=()=>{c({type:"disconnected"}),t=null,r=setTimeout(()=>i(),m)},e.onerror=()=>{c({type:"error",error:"WebSocket error"})},t=e,e}catch(e){return c({type:"error",error:String(e)}),null}}function c(e){o.forEach(a=>{try{a(e)}catch{}})}function x(e){const{pageUrl:a,pageTitle:d}=p(),b={text:(e.text||"").trim(),pageUrl:e.pageUrl??a,pageTitle:e.pageTitle??d,action:e.action||"chat"};!b.text&&b.action==="chat"||((t==null?void 0:t.readyState)===WebSocket.OPEN?t.send(JSON.stringify(b)):(c({type:"error",error:"Not connected. Reconnecting…"}),i(),(t==null?void 0:t.readyState)===WebSocket.OPEN&&t.send(JSON.stringify(b))))}function l(e){return o.push(e),()=>{const a=o.indexOf(e);a>=0&&o.splice(a,1)}}function f(){r&&(clearTimeout(r),r=null),t&&(t.close(),t=null)}return i(),{send:x,onMessage:l,connect:i,disconnect:f,getPageContext:p}}const S="/ws",N="wss://agent.mitverse.com/api/v1/agent/ws";function W(){const s=typeof window<"u"?window:void 0;if(!s)return{};const t=s.__MITBAR_CONFIG__||{},r=document.currentScript,o=r?{enabled:r.getAttribute("data-mitbar-enabled")==="true"||r.getAttribute("data-mitbar-enabled")==="1",gatewayWsUrl:r.getAttribute("data-mitbar-gateway-ws-url")||void 0}:{};return{enabled:t.enabled??o.enabled??!1,gatewayWsUrl:t.gatewayWsUrl??o.gatewayWsUrl??void 0}}function w(s){const t={...W(),...s};if(!t.enabled)return;const r=(t.gatewayWsUrl||"").trim()||N,o=r.includes("/")&&!r.includes("?")&&!r.endsWith("/")?r:r.replace(/\/?$/,"")+S,m=k(o);E(m)}typeof document<"u"&&document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>w()):typeof document<"u"&&w(),u.createBar=E,u.createWsClient=k,u.init=w,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});
82
111
  //# sourceMappingURL=mitbar.umd.cjs.map
@@ -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 display: flex;\n flex-direction: column;\n max-height: 50vh;\n}\n.mitbar-reply-wrap {\n flex: 0 0 auto;\n max-height: 160px;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border-bottom: 1px solid #334155;\n}\n.mitbar-reply-wrap:not(.mitbar-reply-wrap--has-content) { display: none; }\n.mitbar-reply-header {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding: 4px 8px 2px;\n min-height: 28px;\n}\n.mitbar-reply {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: 8px 12px;\n margin: 0 8px 8px;\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-btn-clear {\n padding: 4px 10px;\n border: none;\n border-radius: 4px;\n font-size: 12px;\n cursor: pointer;\n background: #334155;\n color: #94a3b8;\n}\n.mitbar-btn-clear:hover { background: #475569; color: #e2e8f0; }\n.mitbar-inner {\n flex: 0 0 auto;\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`;\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 replyWrap = document.createElement('div');\n replyWrap.className = 'mitbar-reply-wrap';\n\n const replyHeader = document.createElement('div');\n replyHeader.className = 'mitbar-reply-header';\n const btnClear = document.createElement('button');\n btnClear.className = 'mitbar-btn-clear';\n btnClear.textContent = 'Clear';\n btnClear.type = 'button';\n btnClear.setAttribute('aria-label', 'Clear reply');\n replyHeader.appendChild(btnClear);\n\n const replyDiv = document.createElement('div');\n replyDiv.className = 'mitbar-reply';\n replyDiv.setAttribute('aria-live', 'polite');\n\n replyWrap.appendChild(replyHeader);\n replyWrap.appendChild(replyDiv);\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 btns = document.createElement('div');\n btns.className = 'mitbar-btns';\n btns.append(btnSend, btnBuild, btnDeploy);\n\n inner.append(inputWrap, btns, status);\n\n root.appendChild(replyWrap);\n root.appendChild(inner);\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 replyWrap.classList.toggle('mitbar-reply-wrap--has-content', !!text);\n };\n const clearReply = () => {\n replyDiv.textContent = '';\n replyDiv.classList.remove('mitbar-reply--error');\n replyWrap.classList.remove('mitbar-reply-wrap--has-content');\n };\n\n btnClear.addEventListener('click', clearReply);\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","replyWrap","replyHeader","btnClear","replyDiv","inner","inputWrap","input","status","btnSend","btnBuild","btnDeploy","btns","setStatus","text","setReply","isError","clearReply","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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mitverse/mitbar-web",
3
- "version": "1.0.1",
3
+ "version": "1.0.3",
4
4
  "description": "Browser bar that communicates with script-writer Docker agent (page context, Build, Deploy)",
5
5
  "type": "module",
6
6
  "main": "dist/mitbar.umd.cjs",