lemon-model 1.1.0 → 1.2.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 (58) hide show
  1. package/dist/cores/transformer.d.ts +9 -1
  2. package/dist/cores/transformer.js +22 -7
  3. package/dist/cores/transformer.js.map +1 -1
  4. package/dist/genai/dump-test.d.ts +82 -0
  5. package/dist/genai/dump-test.js +200 -0
  6. package/dist/genai/dump-test.js.map +1 -0
  7. package/dist/genai/index.d.ts +11 -0
  8. package/dist/genai/index.js +31 -0
  9. package/dist/genai/index.js.map +1 -0
  10. package/dist/genai/mocks.d.ts +44 -0
  11. package/dist/genai/mocks.js +127 -0
  12. package/dist/genai/mocks.js.map +1 -0
  13. package/dist/genai/proxy.d.ts +65 -0
  14. package/dist/genai/proxy.js +165 -0
  15. package/dist/genai/proxy.js.map +1 -0
  16. package/dist/genai/testing.d.ts +11 -0
  17. package/dist/genai/testing.js +28 -0
  18. package/dist/genai/testing.js.map +1 -0
  19. package/dist/genai/transport.d.ts +37 -0
  20. package/dist/genai/transport.js +136 -0
  21. package/dist/genai/transport.js.map +1 -0
  22. package/dist/genai/types.d.ts +71 -0
  23. package/dist/genai/types.js +10 -0
  24. package/dist/genai/types.js.map +1 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.js +2 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/proxy/index.d.ts +12 -0
  29. package/dist/proxy/index.js +29 -0
  30. package/dist/proxy/index.js.map +1 -0
  31. package/dist/proxy/proxy.d.ts +75 -0
  32. package/dist/proxy/proxy.js +198 -0
  33. package/dist/proxy/proxy.js.map +1 -0
  34. package/dist/proxy/transport.d.ts +123 -0
  35. package/dist/proxy/transport.js +401 -0
  36. package/dist/proxy/transport.js.map +1 -0
  37. package/dist/proxy/types.d.ts +89 -0
  38. package/dist/proxy/types.js +12 -0
  39. package/dist/proxy/types.js.map +1 -0
  40. package/dist/socket/index.d.ts +9 -0
  41. package/dist/socket/index.js +29 -0
  42. package/dist/socket/index.js.map +1 -0
  43. package/dist/socket/socket.d.ts +191 -0
  44. package/dist/socket/socket.js +844 -0
  45. package/dist/socket/socket.js.map +1 -0
  46. package/dist/socket/testing.d.ts +11 -0
  47. package/dist/socket/testing.js +28 -0
  48. package/dist/socket/testing.js.map +1 -0
  49. package/dist/socket/transport.d.ts +200 -0
  50. package/dist/socket/transport.js +612 -0
  51. package/dist/socket/transport.js.map +1 -0
  52. package/dist/socket/types.d.ts +177 -0
  53. package/dist/socket/types.js +9 -0
  54. package/dist/socket/types.js.map +1 -0
  55. package/dist/socket/websocket.d.ts +89 -0
  56. package/dist/socket/websocket.js +273 -0
  57. package/dist/socket/websocket.js.map +1 -0
  58. package/package.json +1 -1
@@ -59,7 +59,9 @@ export interface View {
59
59
  */
60
60
  error?: string;
61
61
  /**
62
- * (optional) internal cores data
62
+ * (optional) internal cores modifier info.
63
+ * - present if `hasCores` is true in `modelAsView()`
64
+ * - or can be shown only if model has cores data.
63
65
  */
64
66
  readonly $?: Cores;
65
67
  }
@@ -127,6 +129,12 @@ export declare abstract class AbstractTransformer<MyModel extends Model, MyView
127
129
  * ex) `{ a:1, b: undefined }` -> `{ a:1 }`
128
130
  */
129
131
  onlyDefined: <T extends object>(N?: T) => T;
132
+ /**
133
+ * transform the cores data
134
+ * @param cores the cores data to transform
135
+ * @returns transformed cores data or null
136
+ */
137
+ asCore<T extends Cores>(cores?: T | null): T | null;
130
138
  /**
131
139
  * transform from model to view
132
140
  *
@@ -35,28 +35,43 @@ class AbstractTransformer {
35
35
  }, {})
36
36
  : null;
37
37
  }
38
+ /**
39
+ * transform the cores data
40
+ * @param cores the cores data to transform
41
+ * @returns transformed cores data or null
42
+ */
43
+ asCore(cores) {
44
+ if (!cores || typeof cores !== 'object')
45
+ return null;
46
+ const ret = {};
47
+ if (cores.sid !== undefined)
48
+ ret.sid = String(cores.sid);
49
+ if (cores.gid !== undefined)
50
+ ret.gid = String(cores.gid);
51
+ if (cores.uid !== undefined)
52
+ ret.uid = String(cores.uid);
53
+ return this.onlyDefined(ret);
54
+ }
38
55
  /**
39
56
  * transform from model to view
40
57
  *
41
58
  * @see Transformable.modelAsView
42
59
  */
43
60
  modelAsView(model, hasCores) {
61
+ var _a;
44
62
  if (!model || typeof model !== 'object')
45
63
  return null;
46
- const view = {
64
+ const view = this.onlyDefined({
65
+ $: (_a = model === null || model === void 0 ? void 0 : model.$) !== null && _a !== void 0 ? _a : undefined,
47
66
  id: model.id,
48
67
  createdAt: model.createdAt,
49
68
  updatedAt: model.updatedAt,
50
69
  deletedAt: model.deletedAt,
51
- };
70
+ });
52
71
  if (model.error)
53
72
  view.error = model.error;
54
73
  if (hasCores) {
55
- const $ = this.onlyDefined({
56
- sid: model.sid,
57
- gid: model.gid,
58
- uid: model.uid,
59
- });
74
+ const $ = this.asCore(model);
60
75
  Object.assign(view, { $ });
61
76
  }
62
77
  return this.onlyDefined(view);
@@ -1 +1 @@
1
- {"version":3,"file":"transformer.js","sourceRoot":"","sources":["../../src/cores/transformer.ts"],"names":[],"mappings":";;;AA0HA;;;GAGG;AACH,MAAsB,mBAAmB;IAAzC;QAGI;;;;;WAKG;QACI,WAAM,GAAG,CAAC,GAAW,EAAE,KAAK,GAAG,MAAM,EAAE,EAAE;YAC5C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC;YAC/C,MAAM,EAAE,GAAG,mDAAmD,CAAC;YAC/D,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,GAAG,gCAAgC,CAAC,CAAC;YACrF,OAAO,GAAG,CAAC;QACf,CAAC,CAAC;QAEF;;;WAGG;QACI,gBAAW,GAAG,CAAmB,CAAY,EAAY,EAAE,CAC9D,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;YACzB,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAC5B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;oBACtC,IAAI,CAAC,KAAK,SAAS;wBAAE,CAAC,CAAC,CAAY,CAAC,GAAG,CAAC,CAAC;oBACzC,OAAO,CAAC,CAAC;gBACb,CAAC,EAAE,EAAO,CAAC;gBACb,CAAC,CAAC,IAAI,CAAC;IAwCnB,CAAC;IAtCG;;;;OAIG;IACI,WAAW,CAAC,KAAsB,EAAE,QAAkB;QACzD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACrD,MAAM,IAAI,GAAS;YACf,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;SAC7B,CAAC;QACF,IAAI,KAAK,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1C,IAAI,QAAQ,EAAE;YACV,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,CAAQ;gBAC9B,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,GAAG,EAAE,KAAK,CAAC,GAAG;aACjB,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;SAC9B;QACD,OAAO,IAAI,CAAC,WAAW,CAAS,IAAc,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,IAAkB,EAAE,QAAkB;;QACrD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACnD,MAAM,KAAK,GAAG,EAAa,CAAC;QAE5B,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,EAAE,MAAK,SAAS;YAAE,KAAK,CAAC,EAAE,GAAG,GAAG,MAAA,IAAI,CAAC,EAAE,mCAAI,EAAE,EAAE,CAAC;QAE1D,OAAO,KAAgB,CAAC;IAC5B,CAAC;CACJ;AApED,kDAoEC"}
1
+ {"version":3,"file":"transformer.js","sourceRoot":"","sources":["../../src/cores/transformer.ts"],"names":[],"mappings":"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"}
@@ -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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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * `genai/index.ts`
3
+ * - shared GenAI proxy adapter (Gemini-compatible surface over HTTP + JSONTransport) for F/B usage.
4
+ *
5
+ * @origin eureka-agents-api / src/lib/proxy/index.ts
6
+ * @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
7
+ */
8
+ export * from './types';
9
+ export * from './proxy';
10
+ export * from './transport';
11
+ export * from './dump-test';
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ /**
18
+ * `genai/index.ts`
19
+ * - shared GenAI proxy adapter (Gemini-compatible surface over HTTP + JSONTransport) for F/B usage.
20
+ *
21
+ * @origin eureka-agents-api / src/lib/proxy/index.ts
22
+ * @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
23
+ */
24
+ __exportStar(require("./types"), exports);
25
+ __exportStar(require("./proxy"), exports);
26
+ __exportStar(require("./transport"), exports);
27
+ __exportStar(require("./dump-test"), exports);
28
+ //! NOTE: test helpers (`./mocks`) are intentionally NOT re-exported here.
29
+ //! Import them via the isolated `lemon-model/dist/genai/testing` entry so
30
+ //! production (esp. frontend) bundles do not pull in test-only helpers.
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/genai/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;GAMG;AACH,0CAAwB;AACxB,0CAAwB;AACxB,8CAA4B;AAC5B,8CAA4B;AAE5B,0EAA0E;AAC1E,0EAA0E;AAC1E,wEAAwE"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * `genai/mocks.ts`
3
+ * - Test helpers for exercising `HttpAbstractGenAI` without a live agents API.
4
+ * - `createAgentGenerateFetcher()` routes fetch calls into a controller-like object, and
5
+ * `MockAgentGenerateController` emulates the `/agents/!/generate` `/dump` + transport contract
6
+ * that `eureka-agents-api`'s `AgentAPIController.doPostGenerate()` provides.
7
+ *
8
+ * @origin eureka-agents-api / src/lib/proxy/mocks.ts (+ `/dump` contract distilled from `AgentAPIController` for F/B-neutral tests)
9
+ * @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
10
+ */
11
+ /** minimal controller shape required by `createAgentGenerateFetcher()` */
12
+ export interface AgentGenerateControllerLike {
13
+ doPostGenerate(id: string, param: unknown, body: unknown, ctx: unknown): Promise<unknown>;
14
+ }
15
+ /**
16
+ * Create a `fetch` implementation that routes `/agents/:id/generate` calls
17
+ * directly into a controller instance.
18
+ */
19
+ export declare const createAgentGenerateFetcher: (api: AgentGenerateControllerLike, ctx: unknown) => typeof fetch;
20
+ /** ack subset returned by a transport sender (see `ApiGatewayTransportSendResult` upstream) */
21
+ export interface MockGenerateTransportResult {
22
+ result?: boolean;
23
+ packets?: number;
24
+ [key: string]: unknown;
25
+ }
26
+ /** hook used by `MockAgentGenerateController` to deliver the final payload over a transport */
27
+ export declare type MockGenerateTransportSender = (transportId: string, payload: Record<string, any>) => Promise<MockGenerateTransportResult>;
28
+ /** options for `MockAgentGenerateController` */
29
+ export interface MockAgentGenerateControllerOptions {
30
+ /** sender invoked when the generate request carries a `transportId` query parameter */
31
+ sendTransport?: MockGenerateTransportSender;
32
+ }
33
+ /** build the `/dump` echo payload from an agents generate request body */
34
+ export declare const asDumpedGenerateRequest: (body: any) => Record<string, any>;
35
+ /**
36
+ * In-memory stand-in for `AgentAPIController.doPostGenerate()` covering the `/dump` contract:
37
+ * - without `transportId`, it answers the dumped request as `output.content` JSON.
38
+ * - with `transportId`, it delivers the payload via `sendTransport()` and answers a transport ack.
39
+ */
40
+ export declare class MockAgentGenerateController implements AgentGenerateControllerLike {
41
+ private readonly options;
42
+ constructor(options?: MockAgentGenerateControllerOptions);
43
+ doPostGenerate(id: string, param: any, body: any, _ctx: unknown): Promise<unknown>;
44
+ }
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ /**
3
+ * `genai/mocks.ts`
4
+ * - Test helpers for exercising `HttpAbstractGenAI` without a live agents API.
5
+ * - `createAgentGenerateFetcher()` routes fetch calls into a controller-like object, and
6
+ * `MockAgentGenerateController` emulates the `/agents/!/generate` `/dump` + transport contract
7
+ * that `eureka-agents-api`'s `AgentAPIController.doPostGenerate()` provides.
8
+ *
9
+ * @origin eureka-agents-api / src/lib/proxy/mocks.ts (+ `/dump` contract distilled from `AgentAPIController` for F/B-neutral tests)
10
+ * @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
11
+ */
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.MockAgentGenerateController = exports.asDumpedGenerateRequest = exports.createAgentGenerateFetcher = void 0;
23
+ /**
24
+ * Create a `fetch` implementation that routes `/agents/:id/generate` calls
25
+ * directly into a controller instance.
26
+ */
27
+ const createAgentGenerateFetcher = (api, ctx) => ((url, init) => __awaiter(void 0, void 0, void 0, function* () {
28
+ const href = typeof url === 'string' || url instanceof URL ? `${url}` : url.url;
29
+ const parsed = new URL(href, 'http://localhost');
30
+ const matched = parsed.pathname.match(/^\/agents\/(.+)\/generate$/);
31
+ if (!matched) {
32
+ return {
33
+ ok: false,
34
+ status: 404,
35
+ statusText: 'Not Found',
36
+ text: () => __awaiter(void 0, void 0, void 0, function* () { return `unsupported endpoint: ${parsed.pathname}`; }),
37
+ };
38
+ }
39
+ const body = (init === null || init === void 0 ? void 0 : init.body) ? JSON.parse(`${init.body}`) : {};
40
+ try {
41
+ const data = yield api.doPostGenerate(decodeURIComponent(matched[1]), Object.fromEntries(parsed.searchParams.entries()), body, ctx);
42
+ return {
43
+ ok: true,
44
+ status: 200,
45
+ statusText: 'OK',
46
+ json: () => __awaiter(void 0, void 0, void 0, function* () { return data; }),
47
+ text: () => __awaiter(void 0, void 0, void 0, function* () { return JSON.stringify(data); }),
48
+ };
49
+ }
50
+ catch (e) {
51
+ const text = e instanceof Error ? e.message : `${e}`;
52
+ return {
53
+ ok: false,
54
+ status: 500,
55
+ statusText: 'Internal Server Error',
56
+ text: () => __awaiter(void 0, void 0, void 0, function* () { return text; }),
57
+ };
58
+ }
59
+ }));
60
+ exports.createAgentGenerateFetcher = createAgentGenerateFetcher;
61
+ const onlyDefined = (data) => Object.fromEntries(Object.entries(data).filter(([, value]) => value !== undefined));
62
+ /** truncate inlineData payloads to 36 chars like the upstream `/dump` echo */
63
+ const truncateInlineData = (contents) => {
64
+ if (!contents || typeof contents !== 'object')
65
+ return contents;
66
+ if (Array.isArray(contents))
67
+ return contents.map(truncateInlineData);
68
+ const parts = Array.isArray(contents.parts)
69
+ ? contents.parts.map((part) => {
70
+ var _a;
71
+ return ((_a = part === null || part === void 0 ? void 0 : part.inlineData) === null || _a === void 0 ? void 0 : _a.data)
72
+ ? Object.assign(Object.assign({}, part), { inlineData: Object.assign(Object.assign({}, part.inlineData), { data: `${part.inlineData.data}`.substring(0, 36) }) }) : part;
73
+ })
74
+ : undefined;
75
+ return parts ? Object.assign(Object.assign({}, contents), { parts }) : contents;
76
+ };
77
+ /** build the `/dump` echo payload from an agents generate request body */
78
+ const asDumpedGenerateRequest = (body) => {
79
+ var _a;
80
+ const prompt = body === null || body === void 0 ? void 0 : body.prompt;
81
+ const contents = typeof prompt === 'string' ? prompt : truncateInlineData(prompt === null || prompt === void 0 ? void 0 : prompt.content);
82
+ const config0 = onlyDefined(Object.assign(Object.assign({}, ((_a = body === null || body === void 0 ? void 0 : body.config) !== null && _a !== void 0 ? _a : {})), { systemInstruction: body === null || body === void 0 ? void 0 : body.system }));
83
+ const config = Object.keys(config0).length > 0 ? config0 : undefined;
84
+ const $param = onlyDefined({
85
+ model: body === null || body === void 0 ? void 0 : body.model,
86
+ isImage: (body === null || body === void 0 ? void 0 : body.image) === true ? true : undefined,
87
+ config: body === null || body === void 0 ? void 0 : body.config,
88
+ });
89
+ return onlyDefined({ model: body === null || body === void 0 ? void 0 : body.model, contents, config, $param });
90
+ };
91
+ exports.asDumpedGenerateRequest = asDumpedGenerateRequest;
92
+ /**
93
+ * In-memory stand-in for `AgentAPIController.doPostGenerate()` covering the `/dump` contract:
94
+ * - without `transportId`, it answers the dumped request as `output.content` JSON.
95
+ * - with `transportId`, it delivers the payload via `sendTransport()` and answers a transport ack.
96
+ */
97
+ class MockAgentGenerateController {
98
+ constructor(options = {}) {
99
+ this.options = options;
100
+ }
101
+ doPostGenerate(id, param, body, _ctx) {
102
+ var _a, _b;
103
+ return __awaiter(this, void 0, void 0, function* () {
104
+ if (!id)
105
+ throw new Error(`@id (string) is required - mocks.doPostGenerate`);
106
+ const model = body === null || body === void 0 ? void 0 : body.model;
107
+ const dumped = (0, exports.asDumpedGenerateRequest)(body);
108
+ const $final = { output: { content: JSON.stringify(dumped) }, model };
109
+ const transportId = typeof (param === null || param === void 0 ? void 0 : param.transportId) === 'string' ? param.transportId : '';
110
+ if (!transportId)
111
+ return $final;
112
+ const sender = this.options.sendTransport;
113
+ if (!sender)
114
+ throw new Error(`.sendTransport is required when transportId is set - MockAgentGenerateController`);
115
+ const transport = yield sender(transportId, $final);
116
+ return onlyDefined({
117
+ transport: true,
118
+ transportId,
119
+ sent: (_a = transport.result) !== null && _a !== void 0 ? _a : true,
120
+ packets: (_b = transport.packets) !== null && _b !== void 0 ? _b : 1,
121
+ model,
122
+ });
123
+ });
124
+ }
125
+ }
126
+ exports.MockAgentGenerateController = MockAgentGenerateController;
127
+ //# sourceMappingURL=mocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mocks.js","sourceRoot":"","sources":["../../src/genai/mocks.ts"],"names":[],"mappings":"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"}