libre-webui 0.7.1 → 0.8.0

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.
Files changed (29) hide show
  1. package/backend/dist/index.d.ts.map +1 -1
  2. package/backend/dist/index.js +426 -57
  3. package/backend/dist/index.js.map +1 -1
  4. package/backend/dist/routes/plugins.d.ts.map +1 -1
  5. package/backend/dist/routes/plugins.js +17 -0
  6. package/backend/dist/routes/plugins.js.map +1 -1
  7. package/backend/dist/services/openclawSessionService.d.ts +63 -0
  8. package/backend/dist/services/openclawSessionService.d.ts.map +1 -0
  9. package/backend/dist/services/openclawSessionService.js +307 -0
  10. package/backend/dist/services/openclawSessionService.js.map +1 -0
  11. package/backend/dist/services/pluginService.d.ts +20 -0
  12. package/backend/dist/services/pluginService.d.ts.map +1 -1
  13. package/backend/dist/services/pluginService.js +250 -6
  14. package/backend/dist/services/pluginService.js.map +1 -1
  15. package/frontend/dist/assets/index-BHPEXBOC.js +51 -0
  16. package/frontend/dist/index.html +2 -2
  17. package/frontend/dist/js/{ArtifactContainer-CnO8nWfm.js → ArtifactContainer-CR_N0zJa.js} +2 -2
  18. package/frontend/dist/js/{ArtifactDemoPage-m4dZIjIM.js → ArtifactDemoPage-B4i0y1r8.js} +1 -1
  19. package/frontend/dist/js/{ChatPage-BkvB6a5u.js → ChatPage-CNZjHhUr.js} +12 -12
  20. package/frontend/dist/js/{GalleryPage-C6V5NU58.js → GalleryPage-BwPcUdbX.js} +1 -1
  21. package/frontend/dist/js/ModelsPage-2EzbE4Sf.js +1 -0
  22. package/frontend/dist/js/PersonasPage-CZrFe-EX.js +13 -0
  23. package/frontend/dist/js/{UserManagementPage-DBm-9utt.js → UserManagementPage-doHbL51e.js} +1 -1
  24. package/frontend/dist/js/{ui-vendor-DxZsuKzb.js → ui-vendor-BxYipEVo.js} +1 -1
  25. package/package.json +1 -1
  26. package/plugins/openclaw-agent.json +69 -0
  27. package/frontend/dist/assets/index-B4PmhQ5N.js +0 -51
  28. package/frontend/dist/js/ModelsPage-BGbYUYAI.js +0 -1
  29. package/frontend/dist/js/PersonasPage-567IlJm4.js +0 -13
@@ -0,0 +1,307 @@
1
+ /*
2
+ * Libre WebUI
3
+ * Copyright (C) 2025 Kroonen AI, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at:
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import WebSocket from 'ws';
18
+ import { randomUUID } from 'crypto';
19
+ // ---------------------------------------------------------------------------
20
+ // OpenClawSessionService
21
+ // ---------------------------------------------------------------------------
22
+ class OpenClawSessionService {
23
+ constructor() {
24
+ this.ws = null;
25
+ this.pending = new Map();
26
+ this.gatewayUrl = '';
27
+ this.gatewayToken = '';
28
+ this.sessionKey = 'main';
29
+ this.connected = false;
30
+ this.connectNonce = null;
31
+ this.reconnectTimer = null;
32
+ this.backoffMs = 800;
33
+ this.listeners = new Set();
34
+ this.closing = false;
35
+ }
36
+ // -------------------------------------------------------------------------
37
+ // Public API
38
+ // -------------------------------------------------------------------------
39
+ /** Configure and connect to the OpenClaw gateway WebSocket. */
40
+ connect(opts) {
41
+ // Derive WS URL from HTTP URL
42
+ const httpUrl = opts.gatewayUrl.replace(/\/v1\/chat\/completions$/, '');
43
+ this.gatewayUrl = httpUrl
44
+ .replace(/^http:/, 'ws:')
45
+ .replace(/^https:/, 'wss:');
46
+ this.gatewayToken = opts.token;
47
+ this.sessionKey = opts.sessionKey ?? 'main';
48
+ this.closing = false;
49
+ this.doConnect();
50
+ }
51
+ /** Disconnect from the gateway. */
52
+ disconnect() {
53
+ this.closing = true;
54
+ if (this.reconnectTimer) {
55
+ clearTimeout(this.reconnectTimer);
56
+ this.reconnectTimer = null;
57
+ }
58
+ this.ws?.close();
59
+ this.ws = null;
60
+ this.connected = false;
61
+ this.flushPending(new Error('disconnected'));
62
+ }
63
+ /** Subscribe to session events (chat deltas, tool calls, etc.). */
64
+ subscribe(cb) {
65
+ this.listeners.add(cb);
66
+ return () => this.listeners.delete(cb);
67
+ }
68
+ /** Send a chat message into the agent session. Returns the runId. */
69
+ async sendMessage(message, sessionKey) {
70
+ const key = sessionKey ?? this.sessionKey;
71
+ const idempotencyKey = randomUUID();
72
+ const result = (await this.request('chat.send', {
73
+ sessionKey: key,
74
+ message,
75
+ deliver: false,
76
+ idempotencyKey,
77
+ }));
78
+ return {
79
+ runId: result?.runId ?? idempotencyKey,
80
+ status: result?.status ?? 'started',
81
+ };
82
+ }
83
+ /** Abort the current run. */
84
+ async abort(sessionKey, runId) {
85
+ const params = {
86
+ sessionKey: sessionKey ?? this.sessionKey,
87
+ };
88
+ if (runId)
89
+ params.runId = runId;
90
+ await this.request('chat.abort', params);
91
+ }
92
+ /** Fetch chat history. */
93
+ async history(sessionKey, limit = 200) {
94
+ const result = (await this.request('chat.history', {
95
+ sessionKey: sessionKey ?? this.sessionKey,
96
+ limit,
97
+ }));
98
+ return { messages: result?.messages ?? [] };
99
+ }
100
+ get isConnected() {
101
+ return this.connected;
102
+ }
103
+ // -------------------------------------------------------------------------
104
+ // WebSocket lifecycle
105
+ // -------------------------------------------------------------------------
106
+ doConnect() {
107
+ if (this.closing)
108
+ return;
109
+ console.log(`[OpenClawSession] Connecting to gateway: ${this.gatewayUrl}`);
110
+ try {
111
+ this.ws = new WebSocket(this.gatewayUrl);
112
+ }
113
+ catch (err) {
114
+ console.error('[OpenClawSession] Failed to create WebSocket:', err);
115
+ this.scheduleReconnect();
116
+ return;
117
+ }
118
+ this.ws.on('open', () => {
119
+ console.log('[OpenClawSession] WebSocket open, waiting for challenge…');
120
+ });
121
+ this.ws.on('message', (data) => {
122
+ this.handleMessage(String(data));
123
+ });
124
+ this.ws.on('close', (code, reason) => {
125
+ const reasonStr = reason?.toString() ?? '';
126
+ console.log(`[OpenClawSession] WebSocket closed (${code}): ${reasonStr}`);
127
+ this.ws = null;
128
+ this.connected = false;
129
+ this.flushPending(new Error(`gateway closed (${code}): ${reasonStr}`));
130
+ this.emit('disconnected', { code, reason: reasonStr });
131
+ this.scheduleReconnect();
132
+ });
133
+ this.ws.on('error', (err) => {
134
+ console.error('[OpenClawSession] WebSocket error:', err.message);
135
+ });
136
+ }
137
+ scheduleReconnect() {
138
+ if (this.closing)
139
+ return;
140
+ const delay = this.backoffMs;
141
+ this.backoffMs = Math.min(this.backoffMs * 1.7, 15000);
142
+ this.reconnectTimer = setTimeout(() => this.doConnect(), delay);
143
+ }
144
+ // -------------------------------------------------------------------------
145
+ // Protocol handling
146
+ // -------------------------------------------------------------------------
147
+ handleMessage(raw) {
148
+ let frame;
149
+ try {
150
+ frame = JSON.parse(raw);
151
+ }
152
+ catch {
153
+ return;
154
+ }
155
+ if (frame.type === 'event') {
156
+ this.handleEvent(frame);
157
+ return;
158
+ }
159
+ if (frame.type === 'res') {
160
+ const pending = this.pending.get(frame.id);
161
+ if (!pending)
162
+ return;
163
+ this.pending.delete(frame.id);
164
+ clearTimeout(pending.timer);
165
+ if (frame.ok) {
166
+ pending.resolve(frame.payload);
167
+ }
168
+ else {
169
+ pending.reject(new Error(frame.error?.message ?? 'request failed'));
170
+ }
171
+ }
172
+ }
173
+ handleEvent(frame) {
174
+ // Handle connect challenge
175
+ if (frame.event === 'connect.challenge') {
176
+ const payload = frame.payload;
177
+ if (payload?.nonce) {
178
+ this.connectNonce = payload.nonce;
179
+ this.sendConnect();
180
+ }
181
+ return;
182
+ }
183
+ // Handle chat events — forward to listeners
184
+ if (frame.event === 'chat') {
185
+ this.emit('chat', frame.payload);
186
+ return;
187
+ }
188
+ // Handle agent events (tool streaming)
189
+ if (frame.event === 'agent') {
190
+ const payload = frame.payload;
191
+ if (payload?.stream === 'tool' && payload.data) {
192
+ const toolEvent = {
193
+ toolCallId: payload.data.toolCallId ?? '',
194
+ name: payload.data.name ?? 'tool',
195
+ phase: payload.data.phase ?? '',
196
+ args: payload.data.args,
197
+ result: payload.data.result,
198
+ partialResult: payload.data.partialResult,
199
+ };
200
+ this.emit('tool', toolEvent);
201
+ }
202
+ return;
203
+ }
204
+ }
205
+ async sendConnect() {
206
+ const params = {
207
+ minProtocol: 3,
208
+ maxProtocol: 3,
209
+ client: {
210
+ id: 'libre-webui',
211
+ version: '1.0.0',
212
+ platform: 'node',
213
+ mode: 'webchat',
214
+ },
215
+ role: 'operator',
216
+ scopes: ['operator.read', 'operator.write'],
217
+ caps: [],
218
+ auth: { token: this.gatewayToken },
219
+ userAgent: 'libre-webui/1.0.0',
220
+ locale: 'en-US',
221
+ };
222
+ try {
223
+ const result = (await this.request('connect', params));
224
+ console.log('[OpenClawSession] Connected to gateway, protocol:', result?.protocol);
225
+ this.connected = true;
226
+ this.backoffMs = 800;
227
+ this.emit('connected', {});
228
+ }
229
+ catch (err) {
230
+ console.error('[OpenClawSession] Connect failed:', err);
231
+ this.ws?.close(4008, 'connect failed');
232
+ }
233
+ }
234
+ // -------------------------------------------------------------------------
235
+ // Request/response
236
+ // -------------------------------------------------------------------------
237
+ request(method, params) {
238
+ return new Promise((resolve, reject) => {
239
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
240
+ return reject(new Error('gateway not connected'));
241
+ }
242
+ const id = randomUUID();
243
+ const timer = setTimeout(() => {
244
+ this.pending.delete(id);
245
+ reject(new Error(`request timeout: ${method}`));
246
+ }, 30000);
247
+ this.pending.set(id, { resolve, reject, timer });
248
+ const frame = {
249
+ type: 'req',
250
+ id,
251
+ method,
252
+ params,
253
+ };
254
+ this.ws.send(JSON.stringify(frame));
255
+ });
256
+ }
257
+ flushPending(err) {
258
+ for (const [, p] of this.pending) {
259
+ clearTimeout(p.timer);
260
+ p.reject(err);
261
+ }
262
+ this.pending.clear();
263
+ }
264
+ // -------------------------------------------------------------------------
265
+ // Event emission
266
+ // -------------------------------------------------------------------------
267
+ emit(type, data) {
268
+ for (const cb of this.listeners) {
269
+ try {
270
+ cb(type, data);
271
+ }
272
+ catch (err) {
273
+ console.error('[OpenClawSession] Listener error:', err);
274
+ }
275
+ }
276
+ }
277
+ }
278
+ // ---------------------------------------------------------------------------
279
+ // Helpers to extract text from gateway chat message format
280
+ // ---------------------------------------------------------------------------
281
+ export function extractTextFromMessage(message) {
282
+ if (!message || typeof message !== 'object')
283
+ return null;
284
+ const msg = message;
285
+ // Direct text field
286
+ if (typeof msg.text === 'string')
287
+ return msg.text;
288
+ // content field — string or array
289
+ const content = msg.content;
290
+ if (typeof content === 'string')
291
+ return content;
292
+ if (Array.isArray(content)) {
293
+ const parts = content
294
+ .filter((block) => typeof block === 'object' &&
295
+ block !== null &&
296
+ block.type === 'text' &&
297
+ typeof block.text === 'string')
298
+ .map((block) => block.text);
299
+ if (parts.length > 0)
300
+ return parts.join('\n');
301
+ }
302
+ return null;
303
+ }
304
+ // Singleton
305
+ const openclawSessionService = new OpenClawSessionService();
306
+ export default openclawSessionService;
307
+ //# sourceMappingURL=openclawSessionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclawSessionService.js","sourceRoot":"","sources":["../../src/services/openclawSessionService.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,12 @@ declare class PluginService {
22
22
  * Returns the URL string if valid, or null if invalid.
23
23
  */
24
24
  private validateEndpointUrl;
25
+ /**
26
+ * Attempt to auto-discover available models from a plugin's base endpoint.
27
+ * Hits {baseUrl}/v1/models (OpenAI-compatible) and updates the plugin's model_map.
28
+ * Falls back silently to the existing model_map if the endpoint is unavailable.
29
+ */
30
+ discoverModels(pluginId: string): Promise<string[]>;
25
31
  getAllPlugins(): Plugin[];
26
32
  getPlugin(id: string): Plugin | null;
27
33
  installPlugin(pluginData: Plugin): Plugin;
@@ -33,6 +39,20 @@ declare class PluginService {
33
39
  getActivePlugin(): Plugin | null;
34
40
  getPluginStatus(): PluginStatus[];
35
41
  executePluginRequest(model: string, messages: ChatMessage[], options?: GenerationOptions): Promise<PluginResponse>;
42
+ /**
43
+ * Execute a streaming chat request through the active plugin.
44
+ * Returns an async generator that yields SSE delta content strings.
45
+ * Also collects tool_calls from the stream.
46
+ */
47
+ executePluginStreamRequest(model: string, messages: ChatMessage[], options?: GenerationOptions): AsyncGenerator<{
48
+ type: 'content' | 'tool_call' | 'done';
49
+ content?: string;
50
+ toolCall?: {
51
+ id: string;
52
+ name: string;
53
+ arguments: string;
54
+ };
55
+ }, void, unknown>;
36
56
  private convertAnthropicResponse;
37
57
  private convertGeminiResponse;
38
58
  private validatePlugin;
@@ -1 +1 @@
1
- {"version":3,"file":"pluginService.d.ts","sourceRoot":"","sources":["../../src/services/pluginService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pluginService.d.ts","sourceRoot":"","sources":["../../src/services/pluginService.ts"],"names":[],"mappings":"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"}