lemon-model 1.1.1 → 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 (55) hide show
  1. package/dist/genai/dump-test.d.ts +82 -0
  2. package/dist/genai/dump-test.js +200 -0
  3. package/dist/genai/dump-test.js.map +1 -0
  4. package/dist/genai/index.d.ts +11 -0
  5. package/dist/genai/index.js +31 -0
  6. package/dist/genai/index.js.map +1 -0
  7. package/dist/genai/mocks.d.ts +44 -0
  8. package/dist/genai/mocks.js +127 -0
  9. package/dist/genai/mocks.js.map +1 -0
  10. package/dist/genai/proxy.d.ts +65 -0
  11. package/dist/genai/proxy.js +165 -0
  12. package/dist/genai/proxy.js.map +1 -0
  13. package/dist/genai/testing.d.ts +11 -0
  14. package/dist/genai/testing.js +28 -0
  15. package/dist/genai/testing.js.map +1 -0
  16. package/dist/genai/transport.d.ts +37 -0
  17. package/dist/genai/transport.js +136 -0
  18. package/dist/genai/transport.js.map +1 -0
  19. package/dist/genai/types.d.ts +71 -0
  20. package/dist/genai/types.js +10 -0
  21. package/dist/genai/types.js.map +1 -0
  22. package/dist/index.d.ts +2 -0
  23. package/dist/index.js +2 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/proxy/index.d.ts +12 -0
  26. package/dist/proxy/index.js +29 -0
  27. package/dist/proxy/index.js.map +1 -0
  28. package/dist/proxy/proxy.d.ts +75 -0
  29. package/dist/proxy/proxy.js +198 -0
  30. package/dist/proxy/proxy.js.map +1 -0
  31. package/dist/proxy/transport.d.ts +123 -0
  32. package/dist/proxy/transport.js +401 -0
  33. package/dist/proxy/transport.js.map +1 -0
  34. package/dist/proxy/types.d.ts +89 -0
  35. package/dist/proxy/types.js +12 -0
  36. package/dist/proxy/types.js.map +1 -0
  37. package/dist/socket/index.d.ts +9 -0
  38. package/dist/socket/index.js +29 -0
  39. package/dist/socket/index.js.map +1 -0
  40. package/dist/socket/socket.d.ts +191 -0
  41. package/dist/socket/socket.js +844 -0
  42. package/dist/socket/socket.js.map +1 -0
  43. package/dist/socket/testing.d.ts +11 -0
  44. package/dist/socket/testing.js +28 -0
  45. package/dist/socket/testing.js.map +1 -0
  46. package/dist/socket/transport.d.ts +200 -0
  47. package/dist/socket/transport.js +612 -0
  48. package/dist/socket/transport.js.map +1 -0
  49. package/dist/socket/types.d.ts +177 -0
  50. package/dist/socket/types.js +9 -0
  51. package/dist/socket/types.js.map +1 -0
  52. package/dist/socket/websocket.d.ts +89 -0
  53. package/dist/socket/websocket.js +273 -0
  54. package/dist/socket/websocket.js.map +1 -0
  55. package/package.json +1 -1
@@ -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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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * `genai/proxy.ts`
3
+ * - HTTP-backed Gemini-compatible `AbstractGenAI` adapter.
4
+ * - works in server and browser runtimes by relying only on the standard `fetch` API.
5
+ *
6
+ * @origin eureka-agents-api / src/lib/proxy/proxy.ts
7
+ * @copyright (C) 2026 LemonCloud Co Ltd. - All Rights Reserved.
8
+ */
9
+ import { ProxyGenAI, ProxyGenAIConfig, ProxyGenAIContents, ProxyGenAIGenerateContentParams, ProxyGenAIGenerateContentResponse, ProxyTransportReceiver } from './types';
10
+ /** options for wiring `HttpAbstractGenAI` to an agents generate endpoint */
11
+ export interface HttpAbstractGenAIOptions {
12
+ /** extra HTTP request headers */
13
+ headers?: Record<string, string>;
14
+ /** fetch override for tests, browsers, or custom runtimes */
15
+ fetch?: typeof fetch;
16
+ /** optional WebSocket/API Gateway transport connection id */
17
+ transportId?: string;
18
+ /** receiver used when the final response is delivered through JSONTransport */
19
+ transport?: ProxyTransportReceiver;
20
+ }
21
+ interface AgentGenerateBody {
22
+ model: string;
23
+ prompt?: string | {
24
+ type?: string;
25
+ content: ProxyGenAIContents;
26
+ };
27
+ system?: string;
28
+ image?: boolean;
29
+ config?: ProxyGenAIConfig;
30
+ }
31
+ export declare const $gemini: {
32
+ /**
33
+ * Convert common agents `GenAIResponse` shapes back into Gemini-like
34
+ * `models.generateContent()` response shape.
35
+ */
36
+ asGenerateContentResponse(data: any): ProxyGenAIGenerateContentResponse;
37
+ };
38
+ /**
39
+ * HTTP-backed Gemini-compatible `AbstractGenAI` adapter.
40
+ *
41
+ * It works in server and browser runtimes by relying only on the standard `fetch` API.
42
+ * When `transportId` is configured, HTTP is used only to trigger generation and the
43
+ * final response is collected from the configured transport receiver.
44
+ */
45
+ export declare class HttpAbstractGenAI implements ProxyGenAI {
46
+ protected readonly endpoint: string;
47
+ /** captured raw generateContent params, useful in specs and diagnostics */
48
+ calls: ProxyGenAIGenerateContentParams[];
49
+ protected readonly fetcher: typeof fetch;
50
+ protected readonly headers: Record<string, string>;
51
+ protected readonly transportId?: string;
52
+ protected readonly transport?: ProxyTransportReceiver;
53
+ constructor(endpoint: string, options?: HttpAbstractGenAIOptions);
54
+ readonly models: {
55
+ generateContent: (params: ProxyGenAIGenerateContentParams) => Promise<ProxyGenAIGenerateContentResponse>;
56
+ };
57
+ protected waitTransport(task: () => Promise<unknown>): Promise<object>;
58
+ protected asEndpoint(): string;
59
+ protected asAgentGenerateBody(params: ProxyGenAIGenerateContentParams): AgentGenerateBody;
60
+ protected withoutSystemInstruction(config?: ProxyGenAIConfig): ProxyGenAIConfig | undefined;
61
+ protected asPrompt(contents: ProxyGenAIContents): AgentGenerateBody['prompt'];
62
+ protected isImageRequest(params: ProxyGenAIGenerateContentParams): boolean | undefined;
63
+ private hasInlineData;
64
+ }
65
+ export {};