@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 +1 -1
- package/dist/mitbar.es.js +142 -105
- package/dist/mitbar.es.js.map +1 -1
- package/dist/mitbar.umd.cjs +46 -17
- 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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
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
|
|
111
|
+
function k(s) {
|
|
83
112
|
if (typeof document > "u") return;
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
const
|
|
89
|
-
|
|
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-
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
const
|
|
97
|
-
|
|
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-
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
112
|
-
|
|
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
|
|
115
|
-
const y =
|
|
116
|
-
if (
|
|
117
|
-
const
|
|
118
|
-
|
|
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
|
-
|
|
121
|
-
|
|
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
|
|
125
|
-
let
|
|
126
|
-
const
|
|
127
|
-
function
|
|
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
|
|
170
|
+
function i() {
|
|
134
171
|
if (typeof WebSocket > "u") return null;
|
|
135
172
|
try {
|
|
136
|
-
const
|
|
137
|
-
return
|
|
138
|
-
|
|
139
|
-
},
|
|
173
|
+
const e = new WebSocket(s);
|
|
174
|
+
return e.onopen = () => {
|
|
175
|
+
c({ type: "connected" });
|
|
176
|
+
}, e.onmessage = (o) => {
|
|
140
177
|
try {
|
|
141
|
-
const
|
|
142
|
-
|
|
178
|
+
const d = JSON.parse(o.data);
|
|
179
|
+
c(d);
|
|
143
180
|
} catch {
|
|
144
|
-
|
|
181
|
+
c({ type: "output", text: String(o.data) });
|
|
145
182
|
}
|
|
146
|
-
},
|
|
147
|
-
|
|
148
|
-
},
|
|
149
|
-
|
|
150
|
-
},
|
|
151
|
-
} catch (
|
|
152
|
-
return
|
|
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
|
|
156
|
-
|
|
192
|
+
function c(e) {
|
|
193
|
+
a.forEach((o) => {
|
|
157
194
|
try {
|
|
158
|
-
|
|
195
|
+
o(e);
|
|
159
196
|
} catch {
|
|
160
197
|
}
|
|
161
198
|
});
|
|
162
199
|
}
|
|
163
|
-
function
|
|
164
|
-
const { pageUrl:
|
|
165
|
-
text: (
|
|
166
|
-
pageUrl:
|
|
167
|
-
pageTitle:
|
|
168
|
-
action:
|
|
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
|
-
!
|
|
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
|
|
173
|
-
return
|
|
174
|
-
const
|
|
175
|
-
|
|
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
|
|
179
|
-
|
|
215
|
+
function m() {
|
|
216
|
+
r && (clearTimeout(r), r = null), t && (t.close(), t = null);
|
|
180
217
|
}
|
|
181
|
-
return
|
|
182
|
-
}
|
|
183
|
-
const
|
|
184
|
-
function
|
|
185
|
-
const
|
|
186
|
-
if (!
|
|
187
|
-
const
|
|
188
|
-
enabled:
|
|
189
|
-
gatewayWsUrl:
|
|
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:
|
|
193
|
-
gatewayWsUrl:
|
|
229
|
+
enabled: t.enabled ?? a.enabled ?? !1,
|
|
230
|
+
gatewayWsUrl: t.gatewayWsUrl ?? a.gatewayWsUrl ?? void 0
|
|
194
231
|
};
|
|
195
232
|
}
|
|
196
|
-
function
|
|
197
|
-
const
|
|
198
|
-
if (!
|
|
199
|
-
const
|
|
200
|
-
|
|
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", () =>
|
|
239
|
+
typeof document < "u" && document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", () => w()) : typeof document < "u" && w();
|
|
203
240
|
export {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
241
|
+
k as createBar,
|
|
242
|
+
S as createWsClient,
|
|
243
|
+
w as init
|
|
207
244
|
};
|
|
208
245
|
//# sourceMappingURL=mitbar.es.js.map
|
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 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":"AAWA,MAAMA,IAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+GL,SAASC,EAAUC,GAAwB;AAChD,MAAI,OAAO,WAAa,IAAa;AACrC,QAAMC,IAAQ,SAAS,cAAc,OAAO;AAC5C,EAAAA,EAAM,cAAcH,GACpB,SAAS,KAAK,YAAYG,CAAK;AAE/B,QAAMC,IAAO,SAAS,cAAc,KAAK;AACzC,EAAAA,EAAK,YAAY,eACjBA,EAAK,aAAa,cAAc,QAAQ;AAExC,QAAMC,IAAY,SAAS,cAAc,KAAK;AAC9C,EAAAA,EAAU,YAAY;AAEtB,QAAMC,IAAc,SAAS,cAAc,KAAK;AAChD,EAAAA,EAAY,YAAY;AACxB,QAAMC,IAAW,SAAS,cAAc,QAAQ;AAChD,EAAAA,EAAS,YAAY,oBACrBA,EAAS,cAAc,SACvBA,EAAS,OAAO,UAChBA,EAAS,aAAa,cAAc,aAAa,GACjDD,EAAY,YAAYC,CAAQ;AAEhC,QAAMC,IAAW,SAAS,cAAc,KAAK;AAC7C,EAAAA,EAAS,YAAY,gBACrBA,EAAS,aAAa,aAAa,QAAQ,GAE3CH,EAAU,YAAYC,CAAW,GACjCD,EAAU,YAAYG,CAAQ;AAE9B,QAAMC,IAAQ,SAAS,cAAc,KAAK;AAC1C,EAAAA,EAAM,YAAY;AAElB,QAAMC,IAAY,SAAS,cAAc,KAAK;AAC9C,EAAAA,EAAU,YAAY;AACtB,QAAMC,IAAQ,SAAS,cAAc,OAAO;AAC5C,EAAAA,EAAM,YAAY,gBAClBA,EAAM,OAAO,QACbA,EAAM,cAAc,+DACpBA,EAAM,aAAa,cAAc,SAAS,GAC1CD,EAAU,YAAYC,CAAK;AAE3B,QAAMC,IAAS,SAAS,cAAc,MAAM;AAC5C,EAAAA,EAAO,YAAY,iBACnBA,EAAO,cAAc;AAErB,QAAMC,IAAU,SAAS,cAAc,QAAQ;AAC/C,EAAAA,EAAQ,YAAY,kCACpBA,EAAQ,cAAc,QACtBA,EAAQ,OAAO;AAEf,QAAMC,IAAW,SAAS,cAAc,QAAQ;AAChD,EAAAA,EAAS,YAAY,cACrBA,EAAS,cAAc,SACvBA,EAAS,OAAO;AAEhB,QAAMC,IAAY,SAAS,cAAc,QAAQ;AACjD,EAAAA,EAAU,YAAY,iCACtBA,EAAU,cAAc,UACxBA,EAAU,OAAO;AAEjB,QAAMC,IAAO,SAAS,cAAc,KAAK;AACzC,EAAAA,EAAK,YAAY,eACjBA,EAAK,OAAOH,GAASC,GAAUC,CAAS,GAExCN,EAAM,OAAOC,GAAWM,GAAMJ,CAAM,GAEpCR,EAAK,YAAYC,CAAS,GAC1BD,EAAK,YAAYK,CAAK,GACtB,SAAS,KAAK,YAAYL,CAAI;AAE9B,QAAMa,IAAY,CAACC,MAAiB;AAClC,IAAAN,EAAO,cAAcM;AAAA,EACvB,GACMC,IAAW,CAACD,GAAcE,MAAsB;AACpD,IAAAZ,EAAS,cAAcU,GACvBV,EAAS,UAAU,OAAO,uBAAuB,CAAC,CAACY,CAAO,GAC1Df,EAAU,UAAU,OAAO,kCAAkC,CAAC,CAACa,CAAI;AAAA,EACrE,GACMG,IAAa,MAAM;AACvB,IAAAb,EAAS,cAAc,IACvBA,EAAS,UAAU,OAAO,qBAAqB,GAC/CH,EAAU,UAAU,OAAO,gCAAgC;AAAA,EAC7D;AAEA,EAAAE,EAAS,iBAAiB,SAASc,CAAU,GAE7CnB,EAAO,UAAU,CAACoB,MAAQ;AACxB,IAAIA,EAAI,SAAS,cAAaL,EAAU,WAAW,IAC1CK,EAAI,SAAS,iBAAgBL,EAAU,cAAc,IACrDK,EAAI,SAAS,WACpBL,EAAU,OAAO,GACjBE,EAASG,EAAI,SAAS,SAAS,EAAI,KAC1BA,EAAI,SAAS,YAAYA,EAAI,QACtCH,EAASG,EAAI,MAAM,EAAK;AAAA,EAE5B,CAAC;AAED,QAAMC,IAAO,CAACC,MAAwC;AACpD,UAAMN,IAAOP,EAAM,MAAM,KAAA;AACzB,QAAIa,MAAW,UAAU,CAACN,EAAM;AAChC,UAAMO,IAAUD,MAAW,SAASN,IAAQA,KAAQ,UAAUM,CAAM;AACpE,IAAAtB,EAAO,KAAK,EAAE,MAAMuB,GAAS,QAAAD,GAAQ,GACjCA,MAAW,WAAQb,EAAM,QAAQ,KACrCQ,EAAS,uBAAuB;AAAA,EAClC;AAEA,EAAAN,EAAQ,iBAAiB,SAAS,MAAMU,EAAK,MAAM,CAAC,GACpDT,EAAS,iBAAiB,SAAS,MAAMS,EAAK,OAAO,CAAC,GACtDR,EAAU,iBAAiB,SAAS,MAAMQ,EAAK,QAAQ,CAAC,GACxDZ,EAAM,iBAAiB,WAAW,CAACe,MAAM;AACvC,IAAIA,EAAE,QAAQ,WAAW,CAACA,EAAE,aAC1BA,EAAE,eAAA,GACFH,EAAK,MAAM;AAAA,EAEf,CAAC;AACH;ACzNO,SAASI,EAAeC,GAAsB;AACnD,MAAIC,IAAuB,MACvBC,IAAuD;AAC3D,QAAMC,IAA8B,CAAA,GAC9BC,IAAe;AAErB,WAASC,IAAyD;AAChE,WAAI,OAAO,SAAW,MAAoB,EAAE,SAAS,IAAI,WAAW,GAAA,IAC7D;AAAA,MACL,SAAS,OAAO,SAAS;AAAA,MACzB,WAAW,SAAS,SAAS,OAAO,SAAS,YAAY;AAAA,IAAA;AAAA,EAE7D;AAEA,WAASC,IAA4B;AACnC,QAAI,OAAO,YAAc,IAAa,QAAO;AAC7C,QAAI;AACF,YAAMC,IAAS,IAAI,UAAUP,CAAY;AACzC,aAAAO,EAAO,SAAS,MAAM;AACpB,QAAAC,EAAO,EAAE,MAAM,aAAa;AAAA,MAC9B,GACAD,EAAO,YAAY,CAACE,MAAwB;AAC1C,YAAI;AACF,gBAAMC,IAAO,KAAK,MAAMD,EAAM,IAAc;AAC5C,UAAAD,EAAOE,CAAI;AAAA,QACb,QAAQ;AACN,UAAAF,EAAO,EAAE,MAAM,UAAU,MAAM,OAAOC,EAAM,IAAI,GAAG;AAAA,QACrD;AAAA,MACF,GACAF,EAAO,UAAU,MAAM;AACrB,QAAAC,EAAO,EAAE,MAAM,gBAAgB,GAC/BP,IAAK,MACLC,IAAiB,WAAW,MAAMI,EAAA,GAAWF,CAAY;AAAA,MAC3D,GACAG,EAAO,UAAU,MAAM;AACrB,QAAAC,EAAO,EAAE,MAAM,SAAS,OAAO,mBAAmB;AAAA,MACpD,GACAP,IAAKM,GACEA;AAAA,IACT,SAAS,GAAG;AACV,aAAAC,EAAO,EAAE,MAAM,SAAS,OAAO,OAAO,CAAC,GAAG,GACnC;AAAA,IACT;AAAA,EACF;AAEA,WAASA,EAAOd,GAAsB;AACpC,IAAAS,EAAU,QAAQ,CAACQ,MAAM;AACvB,UAAI;AACF,QAAAA,EAAEjB,CAAG;AAAA,MACP,QAAY;AAAA,MAAC;AAAA,IACf,CAAC;AAAA,EACH;AAEA,WAASC,EAAKE,GAA4B;AACxC,UAAM,EAAE,SAAAe,GAAS,WAAAC,EAAA,IAAcR,EAAA,GACzBS,IAAO;AAAA,MACX,OAAOjB,EAAQ,QAAQ,IAAI,KAAA;AAAA,MAC3B,SAASA,EAAQ,WAAWe;AAAA,MAC5B,WAAWf,EAAQ,aAAagB;AAAA,MAChC,QAAQhB,EAAQ,UAAU;AAAA,IAAA;AAE5B,IAAI,CAACiB,EAAK,QAAQA,EAAK,WAAW,YAC9Bb,KAAA,gBAAAA,EAAI,gBAAe,UAAU,OAC/BA,EAAG,KAAK,KAAK,UAAUa,CAAI,CAAC,KAE5BN,EAAO,EAAE,MAAM,SAAS,OAAO,gCAAgC,GAC/DF,EAAA,IACIL,KAAA,gBAAAA,EAAI,gBAAe,UAAU,UAAS,KAAK,KAAK,UAAUa,CAAI,CAAC;AAAA,EAEvE;AAEA,WAASC,EAAUC,GAAqC;AACtD,WAAAb,EAAU,KAAKa,CAAO,GACf,MAAM;AACX,YAAMC,IAAId,EAAU,QAAQa,CAAO;AACnC,MAAIC,KAAK,KAAGd,EAAU,OAAOc,GAAG,CAAC;AAAA,IACnC;AAAA,EACF;AAEA,WAASC,IAAmB;AAC1B,IAAIhB,MACF,aAAaA,CAAc,GAC3BA,IAAiB,OAEfD,MACFA,EAAG,MAAA,GACHA,IAAK;AAAA,EAET;AAEA,SAAAK,EAAA,GACO,EAAE,MAAAX,GAAM,WAAAoB,GAAW,SAAAT,GAAS,YAAAY,GAAY,gBAAAb,EAAA;AACjD;AClFA,MAAMc,IAAkB,OAElBC,IAAyB;AAE/B,SAASC,IAA0B;AACjC,QAAMC,IAAM,OAAO,SAAW,MAAc,SAAS;AACrD,MAAI,CAACA,EAAK,QAAO,CAAA;AACjB,QAAMC,IAAaD,EAAI,qBAAqB,CAAA,GACtCE,IAAS,SAAS,eAClBC,IAAWD,IACb;AAAA,IACE,SAASA,EAAO,aAAa,qBAAqB,MAAM,UAAUA,EAAO,aAAa,qBAAqB,MAAM;AAAA,IACjH,cAAcA,EAAO,aAAa,4BAA4B,KAAK;AAAA,EAAA,IAErE,CAAA;AACJ,SAAO;AAAA,IACL,SAASD,EAAW,WAAWE,EAAS,WAAW;AAAA,IACnD,cAAcF,EAAW,gBAAgBE,EAAS,gBAAgB;AAAA,EAAA;AAEtE;AAKO,SAASC,EAAKC,GAA8C;AACjE,QAAMC,IAAS,EAAE,GAAGP,EAAA,GAAa,GAAGM,EAAA;AACpC,MAAI,CAACC,EAAO,QAAS;AACrB,QAAM5B,KAAgB4B,EAAO,gBAAgB,IAAI,UAAUR,GACrDS,IAAQ7B,EAAa,SAAS,GAAG,KAAK,CAACA,EAAa,SAAS,GAAG,KAAK,CAACA,EAAa,SAAS,GAAG,IACjGA,IACAA,EAAa,QAAQ,QAAQ,EAAE,IAAImB,GACjC7C,IAASyB,EAAe8B,CAAK;AACnC,EAAAxD,EAAUC,CAAM;AAClB;AAEI,OAAO,WAAa,OAAe,SAAS,eAAe,YAC7D,SAAS,iBAAiB,oBAAoB,MAAMoD,EAAA,CAAM,IACjD,OAAO,WAAa,OAC7BA,EAAA;"}
|
package/dist/mitbar.umd.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(
|
|
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
|
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 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