lemon-model 1.1.1 → 1.2.1

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 (95) hide show
  1. package/README.md +79 -0
  2. package/dist/esm/cores/index.js +11 -0
  3. package/dist/esm/cores/index.js.map +1 -0
  4. package/dist/esm/cores/transformer.js +91 -0
  5. package/dist/esm/cores/transformer.js.map +1 -0
  6. package/dist/esm/genai/dump-test.js +196 -0
  7. package/dist/esm/genai/dump-test.js.map +1 -0
  8. package/dist/esm/genai/index.js +15 -0
  9. package/dist/esm/genai/index.js.map +1 -0
  10. package/dist/esm/genai/mocks.js +121 -0
  11. package/dist/esm/genai/mocks.js.map +1 -0
  12. package/dist/esm/genai/proxy.js +161 -0
  13. package/dist/esm/genai/proxy.js.map +1 -0
  14. package/dist/esm/genai/testing.js +12 -0
  15. package/dist/esm/genai/testing.js.map +1 -0
  16. package/dist/esm/genai/transport.js +131 -0
  17. package/dist/esm/genai/transport.js.map +1 -0
  18. package/dist/esm/genai/types.js +9 -0
  19. package/dist/esm/genai/types.js.map +1 -0
  20. package/dist/esm/index.js +15 -0
  21. package/dist/esm/index.js.map +1 -0
  22. package/dist/esm/package.json +3 -0
  23. package/dist/esm/socket/index.js +13 -0
  24. package/dist/esm/socket/index.js.map +1 -0
  25. package/dist/esm/socket/socket.js +833 -0
  26. package/dist/esm/socket/socket.js.map +1 -0
  27. package/dist/esm/socket/testing.js +12 -0
  28. package/dist/esm/socket/testing.js.map +1 -0
  29. package/dist/esm/socket/transport.js +603 -0
  30. package/dist/esm/socket/transport.js.map +1 -0
  31. package/dist/esm/socket/types.js +8 -0
  32. package/dist/esm/socket/types.js.map +1 -0
  33. package/dist/esm/socket/websocket.js +267 -0
  34. package/dist/esm/socket/websocket.js.map +1 -0
  35. package/dist/esm/types/core-storage.js +30 -0
  36. package/dist/esm/types/core-storage.js.map +1 -0
  37. package/dist/esm/types/core-types.js +17 -0
  38. package/dist/esm/types/core-types.js.map +1 -0
  39. package/dist/esm/types/index.js +13 -0
  40. package/dist/esm/types/index.js.map +1 -0
  41. package/dist/genai/dump-test.d.ts +82 -0
  42. package/dist/genai/dump-test.js +200 -0
  43. package/dist/genai/dump-test.js.map +1 -0
  44. package/dist/genai/index.d.ts +11 -0
  45. package/dist/genai/index.js +31 -0
  46. package/dist/genai/index.js.map +1 -0
  47. package/dist/genai/mocks.d.ts +44 -0
  48. package/dist/genai/mocks.js +127 -0
  49. package/dist/genai/mocks.js.map +1 -0
  50. package/dist/genai/proxy.d.ts +65 -0
  51. package/dist/genai/proxy.js +165 -0
  52. package/dist/genai/proxy.js.map +1 -0
  53. package/dist/genai/testing.d.ts +11 -0
  54. package/dist/genai/testing.js +28 -0
  55. package/dist/genai/testing.js.map +1 -0
  56. package/dist/genai/transport.d.ts +37 -0
  57. package/dist/genai/transport.js +136 -0
  58. package/dist/genai/transport.js.map +1 -0
  59. package/dist/genai/types.d.ts +71 -0
  60. package/dist/genai/types.js +10 -0
  61. package/dist/genai/types.js.map +1 -0
  62. package/dist/index.d.ts +2 -0
  63. package/dist/index.js +2 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/proxy/index.d.ts +12 -0
  66. package/dist/proxy/index.js +29 -0
  67. package/dist/proxy/index.js.map +1 -0
  68. package/dist/proxy/proxy.d.ts +75 -0
  69. package/dist/proxy/proxy.js +198 -0
  70. package/dist/proxy/proxy.js.map +1 -0
  71. package/dist/proxy/transport.d.ts +123 -0
  72. package/dist/proxy/transport.js +401 -0
  73. package/dist/proxy/transport.js.map +1 -0
  74. package/dist/proxy/types.d.ts +89 -0
  75. package/dist/proxy/types.js +12 -0
  76. package/dist/proxy/types.js.map +1 -0
  77. package/dist/socket/index.d.ts +9 -0
  78. package/dist/socket/index.js +29 -0
  79. package/dist/socket/index.js.map +1 -0
  80. package/dist/socket/socket.d.ts +191 -0
  81. package/dist/socket/socket.js +844 -0
  82. package/dist/socket/socket.js.map +1 -0
  83. package/dist/socket/testing.d.ts +11 -0
  84. package/dist/socket/testing.js +28 -0
  85. package/dist/socket/testing.js.map +1 -0
  86. package/dist/socket/transport.d.ts +200 -0
  87. package/dist/socket/transport.js +612 -0
  88. package/dist/socket/transport.js.map +1 -0
  89. package/dist/socket/types.d.ts +177 -0
  90. package/dist/socket/types.js +9 -0
  91. package/dist/socket/types.js.map +1 -0
  92. package/dist/socket/websocket.d.ts +89 -0
  93. package/dist/socket/websocket.js +273 -0
  94. package/dist/socket/websocket.js.map +1 -0
  95. package/package.json +26 -2
@@ -0,0 +1,267 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ /** extract a connection id from known API Gateway/WebSocket handshake response shapes */
11
+ export const extractWebSocketConnectionId = (message) => {
12
+ var _a, _b, _c, _d, _e, _f, _g, _h;
13
+ if (!message || typeof message !== 'object')
14
+ return undefined;
15
+ const data = message;
16
+ const candidates = [
17
+ data.connectionId,
18
+ data.connId,
19
+ (_a = data.data) === null || _a === void 0 ? void 0 : _a.connectionId,
20
+ (_b = data.data) === null || _b === void 0 ? void 0 : _b.connId,
21
+ (_d = (_c = data.data) === null || _c === void 0 ? void 0 : _c.connId) === null || _d === void 0 ? void 0 : _d.id,
22
+ (_e = data.data) === null || _e === void 0 ? void 0 : _e.id,
23
+ (_f = data.body) === null || _f === void 0 ? void 0 : _f.connectionId,
24
+ (_g = data.body) === null || _g === void 0 ? void 0 : _g.connId,
25
+ (_h = data.body) === null || _h === void 0 ? void 0 : _h.id,
26
+ data.id,
27
+ ];
28
+ return candidates.find(value => typeof value === 'string' && value.length > 0);
29
+ };
30
+ /**
31
+ * Wait until a WebSocket is open, send the handshake message, and resolve the
32
+ * first connection id found in inbound messages.
33
+ */
34
+ export const waitWebSocketConnectionId = (ws, options = {}) => __awaiter(void 0, void 0, void 0, function* () {
35
+ var _a, _b;
36
+ const timeoutMs = (_a = options.timeoutMs) !== null && _a !== void 0 ? _a : 15000;
37
+ const extract = (_b = options.extract) !== null && _b !== void 0 ? _b : extractWebSocketConnectionId;
38
+ yield waitWebSocketOpen(ws, timeoutMs);
39
+ return new Promise((resolve, reject) => {
40
+ let settled = false;
41
+ const timer = timeoutMs > 0
42
+ ? setTimeout(() => {
43
+ rejectOnce(new Error(`timeout waiting for connectionId from WebSocket: ${timeoutMs}ms`));
44
+ }, timeoutMs)
45
+ : undefined;
46
+ const cleanup = () => {
47
+ if (timer)
48
+ clearTimeout(timer);
49
+ ws.removeEventListener('message', onMessage);
50
+ ws.removeEventListener('error', onError);
51
+ ws.removeEventListener('close', onClose);
52
+ };
53
+ const resolveOnce = (connectionId) => {
54
+ if (settled)
55
+ return;
56
+ settled = true;
57
+ cleanup();
58
+ resolve(connectionId);
59
+ };
60
+ const rejectOnce = (error) => {
61
+ if (settled)
62
+ return;
63
+ settled = true;
64
+ cleanup();
65
+ reject(error);
66
+ };
67
+ const onMessage = (event) => __awaiter(void 0, void 0, void 0, function* () {
68
+ try {
69
+ const raw = yield asWebSocketText(event.data);
70
+ const json = tryParseWebSocketJSON(raw);
71
+ const connectionId = extract(json !== null && json !== void 0 ? json : raw);
72
+ if (connectionId)
73
+ resolveOnce(connectionId);
74
+ }
75
+ catch (e) {
76
+ rejectOnce(e);
77
+ }
78
+ });
79
+ const onError = (event) => rejectOnce(event);
80
+ const onClose = () => rejectOnce(new Error(`WebSocket closed before connectionId was received`));
81
+ ws.addEventListener('message', onMessage);
82
+ ws.addEventListener('error', onError, { once: true });
83
+ ws.addEventListener('close', onClose, { once: true });
84
+ if (options.connectMessage)
85
+ ws.send(options.connectMessage);
86
+ });
87
+ });
88
+ /**
89
+ * Adapter from browser-like WebSocket objects to `NetworkSupportable`.
90
+ *
91
+ * The adapter does not own externally supplied WebSocket instances. `close()` is
92
+ * intentionally equivalent to `detach()`; callers that created the WebSocket should
93
+ * close it themselves when they want the underlying connection closed.
94
+ */
95
+ export class BrowserWebSocketNetwork {
96
+ constructor(ws) {
97
+ this.ws = ws;
98
+ this.messageHandlers = new Set();
99
+ this.errorHandlers = new Set();
100
+ this.detached = false;
101
+ this.handleOpen = () => undefined;
102
+ this.handleMessage = (event) => {
103
+ if (this.detached || typeof event.data !== 'string')
104
+ return;
105
+ for (const handler of [...this.messageHandlers])
106
+ handler(event.data);
107
+ };
108
+ this.handleError = (event) => {
109
+ if (this.detached)
110
+ return;
111
+ for (const handler of [...this.errorHandlers])
112
+ handler(event, { scope: 'browserWebSocket', network: this });
113
+ };
114
+ this.handleClose = (event) => {
115
+ if (this.detached)
116
+ return;
117
+ for (const handler of [...this.errorHandlers])
118
+ handler(event, { scope: 'browserWebSocket.close', network: this });
119
+ };
120
+ this.opened = this.isOpen()
121
+ ? Promise.resolve()
122
+ : new Promise((resolve, reject) => {
123
+ const onOpen = () => {
124
+ this.detachReadyListeners();
125
+ resolve();
126
+ };
127
+ const onError = (event) => {
128
+ this.detachReadyListeners();
129
+ reject(event);
130
+ };
131
+ this.readyOpenHandler = onOpen;
132
+ this.readyErrorHandler = onError;
133
+ ws.addEventListener('open', onOpen, { once: true });
134
+ ws.addEventListener('error', onError, { once: true });
135
+ });
136
+ ws.addEventListener('open', this.handleOpen);
137
+ ws.addEventListener('message', this.handleMessage);
138
+ ws.addEventListener('error', this.handleError);
139
+ ws.addEventListener('close', this.handleClose);
140
+ }
141
+ get readyState() {
142
+ if (this.detached)
143
+ return 'closed';
144
+ if (this.isOpen())
145
+ return 'open';
146
+ if (this.ws.readyState === this.stateValue('CLOSING', 2))
147
+ return 'closing';
148
+ if (this.ws.readyState === this.stateValue('CLOSED', 3))
149
+ return 'closed';
150
+ return 'connecting';
151
+ }
152
+ ready() {
153
+ if (this.detached)
154
+ return Promise.reject(new Error(`@network connection error: closed - browserWebSocket.ready`));
155
+ return this.opened;
156
+ }
157
+ send(data) {
158
+ if (this.detached || !this.isOpen()) {
159
+ throw new Error(`@network connection error: ${this.readyState} - browserWebSocket.send`);
160
+ }
161
+ this.ws.send(data);
162
+ }
163
+ onMessage(handler) {
164
+ if (this.detached)
165
+ throw new Error(`@network connection error: closed - browserWebSocket.onMessage`);
166
+ this.messageHandlers.add(handler);
167
+ return () => this.messageHandlers.delete(handler);
168
+ }
169
+ configure(_options) {
170
+ // Browser WebSocket transport options are controlled by the browser/runtime.
171
+ }
172
+ onError(handler) {
173
+ this.errorHandlers.add(handler);
174
+ return () => this.errorHandlers.delete(handler);
175
+ }
176
+ close() {
177
+ this.detach();
178
+ }
179
+ /** remove all listeners without closing the externally owned WebSocket */
180
+ detach() {
181
+ if (this.detached)
182
+ return;
183
+ this.detached = true;
184
+ this.messageHandlers.clear();
185
+ this.errorHandlers.clear();
186
+ this.ws.removeEventListener('open', this.handleOpen);
187
+ this.ws.removeEventListener('message', this.handleMessage);
188
+ this.ws.removeEventListener('error', this.handleError);
189
+ this.ws.removeEventListener('close', this.handleClose);
190
+ this.detachReadyListeners();
191
+ }
192
+ isOpen() {
193
+ return this.ws.readyState === this.stateValue('OPEN', 1);
194
+ }
195
+ stateValue(key, fallback) {
196
+ return typeof this.ws[key] === 'number' ? this.ws[key] : fallback;
197
+ }
198
+ detachReadyListeners() {
199
+ if (this.readyOpenHandler)
200
+ this.ws.removeEventListener('open', this.readyOpenHandler);
201
+ if (this.readyErrorHandler)
202
+ this.ws.removeEventListener('error', this.readyErrorHandler);
203
+ this.readyOpenHandler = undefined;
204
+ this.readyErrorHandler = undefined;
205
+ }
206
+ }
207
+ const waitWebSocketOpen = (ws, timeoutMs) => {
208
+ if (ws.readyState === stateValue(ws, 'OPEN', 1))
209
+ return Promise.resolve();
210
+ return new Promise((resolve, reject) => {
211
+ let settled = false;
212
+ const timer = timeoutMs > 0
213
+ ? setTimeout(() => rejectOnce(new Error(`timeout waiting for WebSocket open: ${timeoutMs}ms`)), timeoutMs)
214
+ : undefined;
215
+ const cleanup = () => {
216
+ if (timer)
217
+ clearTimeout(timer);
218
+ ws.removeEventListener('open', onOpen);
219
+ ws.removeEventListener('error', onError);
220
+ ws.removeEventListener('close', onClose);
221
+ };
222
+ const resolveOnce = () => {
223
+ if (settled)
224
+ return;
225
+ settled = true;
226
+ cleanup();
227
+ resolve();
228
+ };
229
+ const rejectOnce = (error) => {
230
+ if (settled)
231
+ return;
232
+ settled = true;
233
+ cleanup();
234
+ reject(error);
235
+ };
236
+ const onOpen = () => resolveOnce();
237
+ const onError = (event) => rejectOnce(event);
238
+ const onClose = () => rejectOnce(new Error(`WebSocket closed before open`));
239
+ ws.addEventListener('open', onOpen, { once: true });
240
+ ws.addEventListener('error', onError, { once: true });
241
+ ws.addEventListener('close', onClose, { once: true });
242
+ });
243
+ };
244
+ const stateValue = (ws, key, fallback) => (typeof ws[key] === 'number' ? ws[key] : fallback);
245
+ const asWebSocketText = (data) => __awaiter(void 0, void 0, void 0, function* () {
246
+ if (typeof data === 'string')
247
+ return data;
248
+ if (data instanceof ArrayBuffer)
249
+ return new TextDecoder().decode(data);
250
+ if (ArrayBuffer.isView(data))
251
+ return new TextDecoder().decode(data);
252
+ const readable = data;
253
+ if (typeof (readable === null || readable === void 0 ? void 0 : readable.text) === 'function')
254
+ return readable.text();
255
+ if (typeof (readable === null || readable === void 0 ? void 0 : readable.arrayBuffer) === 'function')
256
+ return new TextDecoder().decode(yield readable.arrayBuffer());
257
+ return String(data);
258
+ });
259
+ const tryParseWebSocketJSON = (text) => {
260
+ try {
261
+ return JSON.parse(text);
262
+ }
263
+ catch (_a) {
264
+ return undefined;
265
+ }
266
+ };
267
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/socket/websocket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * `core-storage.ts`
3
+ * - common types for core storage
4
+ *
5
+ *
6
+ * @author Steve Jung <steve@lemoncloud.io>
7
+ * @date 2019-11-20 initial version
8
+ * @date 2020-01-03 support cognito-identity
9
+ * @date 2021-12-07 support SearchBody
10
+ *
11
+ * @copyright (C) lemoncloud.io 2019 - All Rights Reserved.
12
+ */
13
+ //NOTE! - BE WARE TO USE `ts-transformer-keys` DUE TO MISSING `ttypescript`
14
+ export const CORE_FIELDS = [
15
+ '$',
16
+ 'ns',
17
+ 'type',
18
+ 'stereo',
19
+ 'sid',
20
+ 'uid',
21
+ 'gid',
22
+ 'lock',
23
+ 'next',
24
+ 'meta',
25
+ 'createdAt',
26
+ 'updatedAt',
27
+ 'deletedAt',
28
+ 'error',
29
+ ];
30
+ //# sourceMappingURL=core-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-storage.js","sourceRoot":"","sources":["../../../src/types/core-storage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAwHH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,WAAW,GAAa;IACjC,GAAG;IACH,IAAI;IACJ,MAAM;IACN,QAAQ;IACR,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;IACX,WAAW;IACX,OAAO;CACV,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `core-types.ts`
3
+ * - common types for core service
4
+ *
5
+ *
6
+ * @author Steve Jung <steve@lemoncloud.io>
7
+ * @date 2019-11-20 initial version
8
+ * @date 2020-01-03 support cognito-identity
9
+ * @date 2021-12-07 support SearchBody
10
+ * @date 2024-12-20 optimized `NextIdentityCognito`
11
+ * @date 2025-05-13 optimized `NextContext` with `Authorization` header
12
+ * @date 2025-06-12 optimized `SearchBody` with `knn` support
13
+ *
14
+ * @copyright (C) lemoncloud.io 2019 - All Rights Reserved.
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=core-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-types.js","sourceRoot":"","sources":["../../../src/types/core-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * `index.ts`
3
+ * - main index
4
+ *
5
+ * @author Steve Jung <steve@lemoncloud.io>
6
+ * @date 2019-08-09 initial commit
7
+ * @date 2019-11-26 cleanup and optimized for `lemon-core#v2`
8
+ *
9
+ * @copyright (C) lemoncloud.io 2019 - All Rights Reserved.
10
+ */
11
+ export * from './core-types.js';
12
+ export * from './core-storage.js';
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * `genai/dump-test.ts`
3
+ * - Browser-facing diagnostic loop for WebSocket transport generate dumps.
4
+ * - upstream exposed this as `BrowserWebSocketNetwork.dumpTest()`; here the bridge lives in the
5
+ * shared socket core, so use the standalone `browserWebSocketDumpTest()` instead.
6
+ *
7
+ * @origin eureka-agents-api / src/lib/proxy/dump-test.ts
8
+ * @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
9
+ */
10
+ import { WebSocketCompatible } from '../socket/websocket';
11
+ /** single structured log entry emitted by browser dump tests */
12
+ export interface BrowserWebSocketDumpTestLogEntry {
13
+ time: string;
14
+ level: 'info' | 'error';
15
+ event: string;
16
+ data?: Record<string, unknown>;
17
+ }
18
+ /** options for `browserWebSocketDumpTest()` */
19
+ export interface BrowserWebSocketDumpTestOptions {
20
+ /** externally owned WebSocket-compatible object */
21
+ ws?: WebSocketCompatible;
22
+ /** URL used when `ws` is not supplied */
23
+ wsUrl?: string;
24
+ /** `/agents/!/generate` compatible endpoint */
25
+ endpoint?: string;
26
+ /** fetch override for tests or sandboxed browser runtimes */
27
+ fetch?: typeof fetch;
28
+ /** extra HTTP headers for the generate trigger request */
29
+ headers?: Record<string, string>;
30
+ /** connection-id handshake message */
31
+ connectMessage?: string;
32
+ /** shared timeout for WebSocket and transport waits */
33
+ timeoutMs?: number;
34
+ /** image-capable model used for the dump request */
35
+ model?: string;
36
+ /** prompt text paired with the inline image */
37
+ prompt?: string;
38
+ /** inline image base64 used by the dump test */
39
+ imageBase64?: string;
40
+ /** inline image MIME type */
41
+ imageMimeType?: string;
42
+ /** close the WebSocket after the test; defaults to true only for internally created sockets */
43
+ close?: boolean;
44
+ /** callback for UI-visible progress logs */
45
+ log?: (entry: BrowserWebSocketDumpTestLogEntry) => void;
46
+ }
47
+ /** result returned by `browserWebSocketDumpTest()` for UI diagnostics */
48
+ export interface BrowserWebSocketDumpTestResult {
49
+ ok: boolean;
50
+ startedAt: string;
51
+ finishedAt: string;
52
+ durationMs: number;
53
+ endpoint: string;
54
+ transportId: string;
55
+ request: {
56
+ url: string;
57
+ body: Record<string, unknown>;
58
+ };
59
+ ack?: unknown;
60
+ response?: object;
61
+ dumped?: any;
62
+ checks: {
63
+ ackTransport: boolean;
64
+ hasOutputText: boolean;
65
+ dumpParsed: boolean;
66
+ modelMatches: boolean;
67
+ inlineMimeTypeMatches: boolean;
68
+ inlineDataTruncated: boolean;
69
+ promptTextMatches: boolean;
70
+ imageRequestMarked: boolean;
71
+ responseModalitiesKept: boolean;
72
+ };
73
+ logs: BrowserWebSocketDumpTestLogEntry[];
74
+ }
75
+ /**
76
+ * End-to-end browser diagnostic for generate transport.
77
+ *
78
+ * It discovers the WebSocket connection id, sends an inline-image `/dump`
79
+ * request, waits for the JSONTransport response, and returns checks that a UI
80
+ * can display directly.
81
+ */
82
+ export declare const browserWebSocketDumpTest: (options?: BrowserWebSocketDumpTestOptions) => Promise<BrowserWebSocketDumpTestResult>;
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.browserWebSocketDumpTest = void 0;
13
+ /**
14
+ * `genai/dump-test.ts`
15
+ * - Browser-facing diagnostic loop for WebSocket transport generate dumps.
16
+ * - upstream exposed this as `BrowserWebSocketNetwork.dumpTest()`; here the bridge lives in the
17
+ * shared socket core, so use the standalone `browserWebSocketDumpTest()` instead.
18
+ *
19
+ * @origin eureka-agents-api / src/lib/proxy/dump-test.ts
20
+ * @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
21
+ */
22
+ const websocket_1 = require("../socket/websocket");
23
+ const transport_1 = require("./transport");
24
+ /**
25
+ * End-to-end browser diagnostic for generate transport.
26
+ *
27
+ * It discovers the WebSocket connection id, sends an inline-image `/dump`
28
+ * request, waits for the JSONTransport response, and returns checks that a UI
29
+ * can display directly.
30
+ */
31
+ const browserWebSocketDumpTest = (options = {}) => __awaiter(void 0, void 0, void 0, function* () {
32
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z;
33
+ const started = Date.now();
34
+ const startedAt = new Date(started).toISOString();
35
+ const logs = [];
36
+ const log = (level, event, data) => {
37
+ var _a;
38
+ const entry = {
39
+ time: new Date().toISOString(),
40
+ level,
41
+ event,
42
+ data,
43
+ };
44
+ logs.push(entry);
45
+ (_a = options.log) === null || _a === void 0 ? void 0 : _a.call(options, entry);
46
+ };
47
+ const endpoint = (_a = options.endpoint) !== null && _a !== void 0 ? _a : 'http://localhost:8830/agents/!/generate';
48
+ const timeoutMs = (_b = options.timeoutMs) !== null && _b !== void 0 ? _b : 30000;
49
+ const model = (_c = options.model) !== null && _c !== void 0 ? _c : 'gemini-3.1-flash-image-preview';
50
+ const prompt = (_d = options.prompt) !== null && _d !== void 0 ? _d : 'make a banner from this inline image';
51
+ const imageBase64 = (_e = options.imageBase64) !== null && _e !== void 0 ? _e : 'abcdefghijklmnopqrstuvwxyz0123456789-browser-websocket-dump-test';
52
+ const imageMimeType = (_f = options.imageMimeType) !== null && _f !== void 0 ? _f : 'image/jpeg';
53
+ const ws = (_g = options.ws) !== null && _g !== void 0 ? _g : createDefaultWebSocket((_h = options.wsUrl) !== null && _h !== void 0 ? _h : 'wss://wss.eureka.codes/cht-d1?v2');
54
+ const shouldClose = (_j = options.close) !== null && _j !== void 0 ? _j : !options.ws;
55
+ let network;
56
+ let receiver;
57
+ try {
58
+ log('info', 'dumpTest.connectionId.start', { endpoint });
59
+ const transportId = yield (0, websocket_1.waitWebSocketConnectionId)(ws, {
60
+ connectMessage: (_k = options.connectMessage) !== null && _k !== void 0 ? _k : 'device.save',
61
+ timeoutMs,
62
+ });
63
+ log('info', 'dumpTest.connectionId.ready', { transportId });
64
+ network = new websocket_1.BrowserWebSocketNetwork(ws);
65
+ yield network.ready();
66
+ receiver = (0, transport_1.createProxyTransportReceiver)(network, { timeoutMs });
67
+ const url = withQuery(endpoint, { transportId });
68
+ const body = {
69
+ model,
70
+ prompt: {
71
+ type: 'user',
72
+ content: {
73
+ parts: [
74
+ {
75
+ inlineData: {
76
+ data: imageBase64,
77
+ mimeType: imageMimeType,
78
+ },
79
+ },
80
+ {
81
+ text: prompt,
82
+ },
83
+ ],
84
+ },
85
+ },
86
+ system: '/dump',
87
+ image: true,
88
+ config: {
89
+ responseModalities: ['IMAGE', 'TEXT'],
90
+ },
91
+ };
92
+ let ack;
93
+ log('info', 'dumpTest.fetch.start', { url, model, imageMimeType, imageBase64Length: imageBase64.length });
94
+ const response = yield receiver.wait(transportId, () => __awaiter(void 0, void 0, void 0, function* () {
95
+ var _0, _1, _2;
96
+ const fetcher = (_0 = options.fetch) !== null && _0 !== void 0 ? _0 : globalThis.fetch;
97
+ const http = yield callFetch(fetcher, url, {
98
+ method: 'POST',
99
+ headers: Object.assign({ 'content-type': 'application/json' }, ((_1 = options.headers) !== null && _1 !== void 0 ? _1 : {})),
100
+ body: JSON.stringify(body),
101
+ });
102
+ const text = yield http.text();
103
+ ack = (_2 = tryParseJSON(text)) !== null && _2 !== void 0 ? _2 : text;
104
+ if (!http.ok)
105
+ throw new Error(`HTTP ${http.status} ${http.statusText}`.trim() + (text ? ` - ${text}` : ''));
106
+ log('info', 'dumpTest.fetch.ack', {
107
+ status: http.status,
108
+ transport: !!(ack === null || ack === void 0 ? void 0 : ack.transport),
109
+ transportId: ack === null || ack === void 0 ? void 0 : ack.transportId,
110
+ });
111
+ return ack;
112
+ }));
113
+ const outputText = asGenAIOutputText(response);
114
+ const dumped = outputText ? tryParseJSON(outputText) : undefined;
115
+ const checks = {
116
+ ackTransport: !!(ack === null || ack === void 0 ? void 0 : ack.transport),
117
+ hasOutputText: typeof outputText === 'string' && outputText.length > 0,
118
+ dumpParsed: !!dumped,
119
+ modelMatches: (dumped === null || dumped === void 0 ? void 0 : dumped.model) === model,
120
+ inlineMimeTypeMatches: ((_p = (_o = (_m = (_l = dumped === null || dumped === void 0 ? void 0 : dumped.contents) === null || _l === void 0 ? void 0 : _l.parts) === null || _m === void 0 ? void 0 : _m[0]) === null || _o === void 0 ? void 0 : _o.inlineData) === null || _p === void 0 ? void 0 : _p.mimeType) === imageMimeType,
121
+ inlineDataTruncated: ((_t = (_s = (_r = (_q = dumped === null || dumped === void 0 ? void 0 : dumped.contents) === null || _q === void 0 ? void 0 : _q.parts) === null || _r === void 0 ? void 0 : _r[0]) === null || _s === void 0 ? void 0 : _s.inlineData) === null || _t === void 0 ? void 0 : _t.data) === imageBase64.substring(0, 36),
122
+ promptTextMatches: ((_w = (_v = (_u = dumped === null || dumped === void 0 ? void 0 : dumped.contents) === null || _u === void 0 ? void 0 : _u.parts) === null || _v === void 0 ? void 0 : _v[1]) === null || _w === void 0 ? void 0 : _w.text) === prompt,
123
+ imageRequestMarked: ((_x = dumped === null || dumped === void 0 ? void 0 : dumped.$param) === null || _x === void 0 ? void 0 : _x.isImage) === true,
124
+ responseModalitiesKept: JSON.stringify((_z = (_y = dumped === null || dumped === void 0 ? void 0 : dumped.$param) === null || _y === void 0 ? void 0 : _y.config) === null || _z === void 0 ? void 0 : _z.responseModalities) === JSON.stringify(['IMAGE', 'TEXT']),
125
+ };
126
+ const ok = Object.values(checks).every(Boolean);
127
+ const finished = Date.now();
128
+ const result = {
129
+ ok,
130
+ startedAt,
131
+ finishedAt: new Date(finished).toISOString(),
132
+ durationMs: finished - started,
133
+ endpoint,
134
+ transportId,
135
+ request: { url, body },
136
+ ack,
137
+ response,
138
+ dumped,
139
+ checks,
140
+ logs,
141
+ };
142
+ log(ok ? 'info' : 'error', 'dumpTest.done', { ok, checks });
143
+ return result;
144
+ }
145
+ catch (error) {
146
+ log('error', 'dumpTest.failed', { error: normalizeError(error) });
147
+ throw error;
148
+ }
149
+ finally {
150
+ receiver === null || receiver === void 0 ? void 0 : receiver.detach();
151
+ network === null || network === void 0 ? void 0 : network.detach();
152
+ if (shouldClose && typeof ws.close === 'function')
153
+ ws.close();
154
+ }
155
+ });
156
+ exports.browserWebSocketDumpTest = browserWebSocketDumpTest;
157
+ const createDefaultWebSocket = (url) => {
158
+ const WebSocketCtor = globalThis.WebSocket;
159
+ if (!WebSocketCtor)
160
+ throw new Error(`global WebSocket is not available - browserWebSocketDumpTest`);
161
+ return new WebSocketCtor(url);
162
+ };
163
+ const withQuery = (endpoint, params) => {
164
+ const url = new URL(endpoint, 'http://localhost');
165
+ for (const [key, value] of Object.entries(params))
166
+ url.searchParams.set(key, value);
167
+ if (/^https?:\/\//.test(endpoint))
168
+ return url.toString();
169
+ return `${url.pathname}${url.search}${url.hash}`;
170
+ };
171
+ const callFetch = (fetcher, input, init) => fetcher.call(globalThis, input, init);
172
+ const asGenAIOutputText = (response) => {
173
+ var _a;
174
+ const content = (_a = response === null || response === void 0 ? void 0 : response.output) === null || _a === void 0 ? void 0 : _a.content;
175
+ if (typeof content === 'string')
176
+ return content;
177
+ const data = content && typeof content === 'object' ? content.data : undefined;
178
+ return typeof data === 'string' ? data : undefined;
179
+ };
180
+ const tryParseJSON = (text) => {
181
+ try {
182
+ return JSON.parse(text);
183
+ }
184
+ catch (_a) {
185
+ return undefined;
186
+ }
187
+ };
188
+ const normalizeError = (error) => {
189
+ if (error instanceof Error)
190
+ return error.message;
191
+ if (typeof error === 'string')
192
+ return error;
193
+ try {
194
+ return JSON.stringify(error);
195
+ }
196
+ catch (_a) {
197
+ return String(error);
198
+ }
199
+ };
200
+ //# sourceMappingURL=dump-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dump-test.js","sourceRoot":"","sources":["../../src/genai/dump-test.ts"],"names":[],"mappings":"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"}