opencode-qwen-cli-auth 1.0.3 → 2.0.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.
- package/README.md +6 -6
- package/dist/index.d.ts +20 -20
- package/dist/index.js +198 -166
- package/dist/lib/constants.d.ts +2 -2
- package/dist/lib/constants.js +3 -3
- package/dist/lib/prompts/fallback/opencode-qwen-prompt.txt +109 -0
- package/dist/lib/prompts/opencode-qwen.d.ts +14 -0
- package/dist/lib/prompts/opencode-qwen.d.ts.map +1 -0
- package/dist/lib/prompts/opencode-qwen.js +121 -0
- package/dist/lib/prompts/opencode-qwen.js.map +1 -0
- package/dist/lib/prompts/qwen-code.d.ts +25 -0
- package/dist/lib/prompts/qwen-code.d.ts.map +1 -0
- package/dist/lib/prompts/qwen-code.js +307 -0
- package/dist/lib/prompts/qwen-code.js.map +1 -0
- package/dist/lib/prompts/qwen-opencode-bridge.d.ts +15 -0
- package/dist/lib/prompts/qwen-opencode-bridge.d.ts.map +1 -0
- package/dist/lib/prompts/qwen-opencode-bridge.js +81 -0
- package/dist/lib/prompts/qwen-opencode-bridge.js.map +1 -0
- package/dist/lib/request/fetch-helpers.d.ts +19 -0
- package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
- package/dist/lib/request/fetch-helpers.js +50 -0
- package/dist/lib/request/fetch-helpers.js.map +1 -0
- package/dist/lib/request/header-utils.d.ts +38 -0
- package/dist/lib/request/header-utils.d.ts.map +1 -0
- package/dist/lib/request/header-utils.js +75 -0
- package/dist/lib/request/header-utils.js.map +1 -0
- package/dist/lib/request/openai-chunk-builder.d.ts +68 -0
- package/dist/lib/request/openai-chunk-builder.d.ts.map +1 -0
- package/dist/lib/request/openai-chunk-builder.js +110 -0
- package/dist/lib/request/openai-chunk-builder.js.map +1 -0
- package/dist/lib/request/payload-analyzer.d.ts +34 -0
- package/dist/lib/request/payload-analyzer.d.ts.map +1 -0
- package/dist/lib/request/payload-analyzer.js +114 -0
- package/dist/lib/request/payload-analyzer.js.map +1 -0
- package/dist/lib/request/request-transformer.d.ts +39 -0
- package/dist/lib/request/request-transformer.d.ts.map +1 -0
- package/dist/lib/request/request-transformer.js +108 -0
- package/dist/lib/request/request-transformer.js.map +1 -0
- package/dist/lib/request/response-handler.d.ts +15 -0
- package/dist/lib/request/response-handler.d.ts.map +1 -0
- package/dist/lib/request/response-handler.js +90 -0
- package/dist/lib/request/response-handler.js.map +1 -0
- package/dist/lib/request/sse-parser.d.ts +36 -0
- package/dist/lib/request/sse-parser.d.ts.map +1 -0
- package/dist/lib/request/sse-parser.js +85 -0
- package/dist/lib/request/sse-parser.js.map +1 -0
- package/dist/lib/request/stream-normalizer.d.ts +18 -0
- package/dist/lib/request/stream-normalizer.d.ts.map +1 -0
- package/dist/lib/request/stream-normalizer.js +140 -0
- package/dist/lib/request/stream-normalizer.js.map +1 -0
- package/package.json +66 -66
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper functions for the custom fetch implementation
|
|
3
|
+
* These functions break down the complex fetch logic into manageable, testable units
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Build headers for Qwen API request (OAuth)
|
|
7
|
+
* @param accessToken - OAuth access token
|
|
8
|
+
* @param resourceUrl - Resource URL to determine if DashScope headers are needed
|
|
9
|
+
* @returns Request headers
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildHeaders(accessToken: string, resourceUrl?: string): Record<string, string>;
|
|
12
|
+
/**
|
|
13
|
+
* Construct Qwen Portal API URL from base URL and request path
|
|
14
|
+
* @param url - Original request URL
|
|
15
|
+
* @param baseUrl - Portal API base URL from token
|
|
16
|
+
* @returns Constructed URL with correct base
|
|
17
|
+
*/
|
|
18
|
+
export declare function rewriteUrl(url: string, baseUrl: string): string;
|
|
19
|
+
//# sourceMappingURL=fetch-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-helpers.d.ts","sourceRoot":"","sources":["../../../lib/request/fetch-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAS9F;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAc/D"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Helper functions for the custom fetch implementation
|
|
3
|
+
* These functions break down the complex fetch logic into manageable, testable units
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Build headers for Qwen API request (OAuth)
|
|
7
|
+
* @param accessToken - OAuth access token
|
|
8
|
+
* @param resourceUrl - Resource URL to determine if DashScope headers are needed
|
|
9
|
+
* @returns Request headers
|
|
10
|
+
*/
|
|
11
|
+
export function buildHeaders(accessToken, resourceUrl) {
|
|
12
|
+
// For Qwen OAuth requests, include the DashScope auth type header unconditionally.
|
|
13
|
+
// This header is required by Portal routing for OpenAI-compatible endpoints.
|
|
14
|
+
const headers = {
|
|
15
|
+
"Authorization": `Bearer ${accessToken}`,
|
|
16
|
+
"Content-Type": "application/json",
|
|
17
|
+
"X-DashScope-AuthType": "qwen_oauth",
|
|
18
|
+
};
|
|
19
|
+
return headers;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Construct Qwen Portal API URL from base URL and request path
|
|
23
|
+
* @param url - Original request URL
|
|
24
|
+
* @param baseUrl - Portal API base URL from token
|
|
25
|
+
* @returns Constructed URL with correct base
|
|
26
|
+
*/
|
|
27
|
+
export function rewriteUrl(url, baseUrl) {
|
|
28
|
+
// Parse URL, ho tro ca URL tuong doi bang cach dung base gia
|
|
29
|
+
let parsed;
|
|
30
|
+
try {
|
|
31
|
+
parsed = new URL(url);
|
|
32
|
+
}
|
|
33
|
+
catch (_) {
|
|
34
|
+
// URL tuong doi (vd: /v1/chat/completions?stream=true)
|
|
35
|
+
parsed = new URL(url, 'http://placeholder');
|
|
36
|
+
}
|
|
37
|
+
const base = baseUrl.replace(/\/+$/, ''); // trim trailing '/'
|
|
38
|
+
let normalizedPath = parsed.pathname;
|
|
39
|
+
// Tranh trung /v1 khi base da co /v1
|
|
40
|
+
if (base.endsWith('/v1') && normalizedPath.startsWith('/v1')) {
|
|
41
|
+
normalizedPath = normalizedPath.replace(/^\/v1/, '');
|
|
42
|
+
}
|
|
43
|
+
if (!normalizedPath.startsWith('/')) {
|
|
44
|
+
normalizedPath = `/${normalizedPath}`;
|
|
45
|
+
}
|
|
46
|
+
// Giu nguyen query params (vd: ?stream=true&foo=1)
|
|
47
|
+
const query = parsed.search || '';
|
|
48
|
+
return `${base}${normalizedPath}${query}`;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=fetch-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-helpers.js","sourceRoot":"","sources":["../../../lib/request/fetch-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB,EAAE,WAAoB;IACrE,mFAAmF;IACnF,6EAA6E;IAC7E,MAAM,OAAO,GAA2B;QACvC,eAAe,EAAE,UAAU,WAAW,EAAE;QACxC,cAAc,EAAE,kBAAkB;QAClC,sBAAsB,EAAE,YAAY;KACpC,CAAC;IACF,OAAO,OAAO,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,OAAe;IACtD,gFAAgF;IAChF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,+BAA+B;IACnE,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,oBAAoB;IAC9D,IAAI,cAAc,GAAG,IAAI,CAAC;IAC1B,2FAA2F;IAC3F,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9D,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,2CAA2C;IAC3C,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,cAAc,GAAG,IAAI,cAAc,EAAE,CAAC;IACvC,CAAC;IACD,OAAO,GAAG,IAAI,GAAG,cAAc,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Header manipulation utilities
|
|
3
|
+
* Provides functions for normalizing, merging, and cleaning HTTP headers
|
|
4
|
+
*/
|
|
5
|
+
import type { HeadersInput } from "../types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Normalize various header types to a plain object
|
|
8
|
+
* @param headers - Headers in any valid format (Headers object, array, or plain object)
|
|
9
|
+
* @returns Plain object with header key-value pairs
|
|
10
|
+
*/
|
|
11
|
+
export declare function normalizeHeaders(headers: HeadersInput | undefined): Record<string, string>;
|
|
12
|
+
/**
|
|
13
|
+
* Remove specific headers from a header object (case-insensitive)
|
|
14
|
+
* @param headers - Header object
|
|
15
|
+
* @param toRemove - Array of header names to remove (case-insensitive)
|
|
16
|
+
* @returns New header object with specified headers removed
|
|
17
|
+
*/
|
|
18
|
+
export declare function removeHeaders(headers: Record<string, string>, toRemove: string[]): Record<string, string>;
|
|
19
|
+
/**
|
|
20
|
+
* Merge headers, optionally removing conflicting headers first
|
|
21
|
+
* This ensures clean header merging without duplicates or stale values
|
|
22
|
+
*
|
|
23
|
+
* @param existing - Existing headers in any format
|
|
24
|
+
* @param additional - Additional headers to merge in
|
|
25
|
+
* @param overwrite - Header names to remove from existing before merging (case-insensitive)
|
|
26
|
+
* @returns Merged header object
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const merged = mergeHeaders(
|
|
31
|
+
* existingHeaders,
|
|
32
|
+
* { 'Authorization': 'Bearer new-token' },
|
|
33
|
+
* ['authorization', 'content-type'] // Remove old auth/content-type first
|
|
34
|
+
* );
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function mergeHeaders(existing: HeadersInput | undefined, additional: Record<string, string>, overwrite?: string[]): Record<string, string>;
|
|
38
|
+
//# sourceMappingURL=header-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-utils.d.ts","sourceRoot":"","sources":["../../../lib/request/header-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC/B,OAAO,EAAE,YAAY,GAAG,SAAS,GAC/B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA2BxB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC5B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,QAAQ,EAAE,MAAM,EAAE,GAChB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWxB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAC3B,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,SAAS,GAAE,MAAM,EAAO,GACtB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIxB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Header manipulation utilities
|
|
3
|
+
* Provides functions for normalizing, merging, and cleaning HTTP headers
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Normalize various header types to a plain object
|
|
7
|
+
* @param headers - Headers in any valid format (Headers object, array, or plain object)
|
|
8
|
+
* @returns Plain object with header key-value pairs
|
|
9
|
+
*/
|
|
10
|
+
export function normalizeHeaders(headers) {
|
|
11
|
+
if (!headers)
|
|
12
|
+
return {};
|
|
13
|
+
if (headers instanceof Headers) {
|
|
14
|
+
const result = {};
|
|
15
|
+
headers.forEach((value, key) => {
|
|
16
|
+
result[key] = value;
|
|
17
|
+
});
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
if (Array.isArray(headers)) {
|
|
21
|
+
const result = {};
|
|
22
|
+
for (const [key, value] of headers) {
|
|
23
|
+
result[key] = value;
|
|
24
|
+
}
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
// headers is now a plain object - filter out undefined values
|
|
28
|
+
const result = {};
|
|
29
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
30
|
+
if (value !== undefined) {
|
|
31
|
+
result[key] = value;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Remove specific headers from a header object (case-insensitive)
|
|
38
|
+
* @param headers - Header object
|
|
39
|
+
* @param toRemove - Array of header names to remove (case-insensitive)
|
|
40
|
+
* @returns New header object with specified headers removed
|
|
41
|
+
*/
|
|
42
|
+
export function removeHeaders(headers, toRemove) {
|
|
43
|
+
const result = { ...headers };
|
|
44
|
+
const lowerToRemove = toRemove.map(h => h.toLowerCase());
|
|
45
|
+
for (const key of Object.keys(result)) {
|
|
46
|
+
if (lowerToRemove.includes(key.toLowerCase())) {
|
|
47
|
+
delete result[key];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Merge headers, optionally removing conflicting headers first
|
|
54
|
+
* This ensures clean header merging without duplicates or stale values
|
|
55
|
+
*
|
|
56
|
+
* @param existing - Existing headers in any format
|
|
57
|
+
* @param additional - Additional headers to merge in
|
|
58
|
+
* @param overwrite - Header names to remove from existing before merging (case-insensitive)
|
|
59
|
+
* @returns Merged header object
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* ```typescript
|
|
63
|
+
* const merged = mergeHeaders(
|
|
64
|
+
* existingHeaders,
|
|
65
|
+
* { 'Authorization': 'Bearer new-token' },
|
|
66
|
+
* ['authorization', 'content-type'] // Remove old auth/content-type first
|
|
67
|
+
* );
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export function mergeHeaders(existing, additional, overwrite = []) {
|
|
71
|
+
const normalized = normalizeHeaders(existing);
|
|
72
|
+
const cleaned = removeHeaders(normalized, overwrite);
|
|
73
|
+
return { ...cleaned, ...additional };
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=header-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header-utils.js","sourceRoot":"","sources":["../../../lib/request/header-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC/B,OAAiC;IAEjC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,IAAI,OAAO,YAAY,OAAO,EAAE,CAAC;QAChC,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,OAAO,MAAM,CAAC;IACf,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAe,CAAC;QAC/B,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAED,8DAA8D;IAC9D,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAC5B,OAA+B,EAC/B,QAAkB;IAElB,MAAM,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;IAC9B,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAEzD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,IAAI,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC/C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACpB,CAAC;IACF,CAAC;IAED,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,YAAY,CAC3B,QAAkC,EAClC,UAAkC,EAClC,YAAsB,EAAE;IAExB,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACrD,OAAO,EAAE,GAAG,OAAO,EAAE,GAAG,UAAU,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Chat Completions chunk builder
|
|
3
|
+
* Creates properly formatted OpenAI-style streaming chunks
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* OpenAI chat completion chunk structure
|
|
7
|
+
*/
|
|
8
|
+
export interface OpenAIChunk {
|
|
9
|
+
id: string;
|
|
10
|
+
object: 'chat.completion.chunk';
|
|
11
|
+
created: number;
|
|
12
|
+
model: string;
|
|
13
|
+
choices: Array<{
|
|
14
|
+
index: number;
|
|
15
|
+
delta: {
|
|
16
|
+
role?: 'assistant';
|
|
17
|
+
content?: string;
|
|
18
|
+
};
|
|
19
|
+
finish_reason: string | null;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Builder class for creating OpenAI-compatible streaming chunks
|
|
24
|
+
*/
|
|
25
|
+
export declare class OpenAIChunkBuilder {
|
|
26
|
+
private chunkId;
|
|
27
|
+
private model;
|
|
28
|
+
private sentInitialRole;
|
|
29
|
+
/**
|
|
30
|
+
* Create a new chunk builder
|
|
31
|
+
* @param model - Model name to include in chunks
|
|
32
|
+
*/
|
|
33
|
+
constructor(model?: string);
|
|
34
|
+
/**
|
|
35
|
+
* Create a chunk with role information (first chunk only)
|
|
36
|
+
* @returns OpenAI chunk with role
|
|
37
|
+
*/
|
|
38
|
+
createRoleChunk(): OpenAIChunk;
|
|
39
|
+
/**
|
|
40
|
+
* Create a chunk with content delta
|
|
41
|
+
* @param content - Text content to include
|
|
42
|
+
* @returns OpenAI chunk with content
|
|
43
|
+
*/
|
|
44
|
+
createContentChunk(content: string): OpenAIChunk;
|
|
45
|
+
/**
|
|
46
|
+
* Create a finish chunk with completion reason
|
|
47
|
+
* @param reason - Finish reason (e.g., 'stop', 'length')
|
|
48
|
+
* @returns OpenAI chunk with finish reason
|
|
49
|
+
*/
|
|
50
|
+
createFinishChunk(reason?: string): OpenAIChunk;
|
|
51
|
+
/**
|
|
52
|
+
* Format a chunk as SSE data line
|
|
53
|
+
* @param chunk - OpenAI chunk to format
|
|
54
|
+
* @returns Formatted SSE line
|
|
55
|
+
*/
|
|
56
|
+
formatAsSSE(chunk: OpenAIChunk): string;
|
|
57
|
+
/**
|
|
58
|
+
* Create the [DONE] marker
|
|
59
|
+
* @returns Formatted [DONE] SSE line
|
|
60
|
+
*/
|
|
61
|
+
createDoneMarker(): string;
|
|
62
|
+
/**
|
|
63
|
+
* Check if initial role has been sent
|
|
64
|
+
* @returns True if role chunk was already created
|
|
65
|
+
*/
|
|
66
|
+
hasRole(): boolean;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=openai-chunk-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-chunk-builder.d.ts","sourceRoot":"","sources":["../../../lib/request/openai-chunk-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,uBAAuB,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,KAAK,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE;YACN,IAAI,CAAC,EAAE,WAAW,CAAC;YACnB,OAAO,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;KAC7B,CAAC,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,eAAe,CAAkB;IAEzC;;;OAGG;gBACS,KAAK,GAAE,MAAsB;IAKzC;;;OAGG;IACH,eAAe,IAAI,WAAW;IAiB9B;;;;OAIG;IACH,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;IAyBhD;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,GAAE,MAAe,GAAG,WAAW;IAgBvD;;;;OAIG;IACH,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM;IAIvC;;;OAGG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;;OAGG;IACH,OAAO,IAAI,OAAO;CAGlB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Chat Completions chunk builder
|
|
3
|
+
* Creates properly formatted OpenAI-style streaming chunks
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Builder class for creating OpenAI-compatible streaming chunks
|
|
7
|
+
*/
|
|
8
|
+
export class OpenAIChunkBuilder {
|
|
9
|
+
chunkId;
|
|
10
|
+
model;
|
|
11
|
+
sentInitialRole = false;
|
|
12
|
+
/**
|
|
13
|
+
* Create a new chunk builder
|
|
14
|
+
* @param model - Model name to include in chunks
|
|
15
|
+
*/
|
|
16
|
+
constructor(model = 'coder-model') {
|
|
17
|
+
this.chunkId = `chatcmpl_${Math.random().toString(36).slice(2, 12)}`;
|
|
18
|
+
this.model = model;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create a chunk with role information (first chunk only)
|
|
22
|
+
* @returns OpenAI chunk with role
|
|
23
|
+
*/
|
|
24
|
+
createRoleChunk() {
|
|
25
|
+
this.sentInitialRole = true;
|
|
26
|
+
return {
|
|
27
|
+
id: this.chunkId,
|
|
28
|
+
object: 'chat.completion.chunk',
|
|
29
|
+
created: Math.floor(Date.now() / 1000),
|
|
30
|
+
model: this.model,
|
|
31
|
+
choices: [
|
|
32
|
+
{
|
|
33
|
+
index: 0,
|
|
34
|
+
delta: { role: 'assistant' },
|
|
35
|
+
finish_reason: null,
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Create a chunk with content delta
|
|
42
|
+
* @param content - Text content to include
|
|
43
|
+
* @returns OpenAI chunk with content
|
|
44
|
+
*/
|
|
45
|
+
createContentChunk(content) {
|
|
46
|
+
const chunk = {
|
|
47
|
+
id: this.chunkId,
|
|
48
|
+
object: 'chat.completion.chunk',
|
|
49
|
+
created: Math.floor(Date.now() / 1000),
|
|
50
|
+
model: this.model,
|
|
51
|
+
choices: [
|
|
52
|
+
{
|
|
53
|
+
index: 0,
|
|
54
|
+
delta: {},
|
|
55
|
+
finish_reason: null,
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
};
|
|
59
|
+
// Include role in first content chunk if not sent separately
|
|
60
|
+
if (!this.sentInitialRole) {
|
|
61
|
+
chunk.choices[0].delta.role = 'assistant';
|
|
62
|
+
this.sentInitialRole = true;
|
|
63
|
+
}
|
|
64
|
+
chunk.choices[0].delta.content = content;
|
|
65
|
+
return chunk;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Create a finish chunk with completion reason
|
|
69
|
+
* @param reason - Finish reason (e.g., 'stop', 'length')
|
|
70
|
+
* @returns OpenAI chunk with finish reason
|
|
71
|
+
*/
|
|
72
|
+
createFinishChunk(reason = 'stop') {
|
|
73
|
+
return {
|
|
74
|
+
id: this.chunkId,
|
|
75
|
+
object: 'chat.completion.chunk',
|
|
76
|
+
created: Math.floor(Date.now() / 1000),
|
|
77
|
+
model: this.model,
|
|
78
|
+
choices: [
|
|
79
|
+
{
|
|
80
|
+
index: 0,
|
|
81
|
+
delta: {},
|
|
82
|
+
finish_reason: reason,
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Format a chunk as SSE data line
|
|
89
|
+
* @param chunk - OpenAI chunk to format
|
|
90
|
+
* @returns Formatted SSE line
|
|
91
|
+
*/
|
|
92
|
+
formatAsSSE(chunk) {
|
|
93
|
+
return `data: ${JSON.stringify(chunk)}\n\n`;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Create the [DONE] marker
|
|
97
|
+
* @returns Formatted [DONE] SSE line
|
|
98
|
+
*/
|
|
99
|
+
createDoneMarker() {
|
|
100
|
+
return 'data: [DONE]\n\n';
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if initial role has been sent
|
|
104
|
+
* @returns True if role chunk was already created
|
|
105
|
+
*/
|
|
106
|
+
hasRole() {
|
|
107
|
+
return this.sentInitialRole;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=openai-chunk-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-chunk-builder.js","sourceRoot":"","sources":["../../../lib/request/openai-chunk-builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoBH;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACtB,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,eAAe,GAAY,KAAK,CAAC;IAEzC;;;OAGG;IACH,YAAY,QAAgB,aAAa;QACxC,IAAI,CAAC,OAAO,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACrE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,eAAe;QACd,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,OAAO;YACN,EAAE,EAAE,IAAI,CAAC,OAAO;YAChB,MAAM,EAAE,uBAAuB;YAC/B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACtC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE;gBACR;oBACC,KAAK,EAAE,CAAC;oBACR,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;oBAC5B,aAAa,EAAE,IAAI;iBACnB;aACD;SACD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,OAAe;QACjC,MAAM,KAAK,GAAgB;YAC1B,EAAE,EAAE,IAAI,CAAC,OAAO;YAChB,MAAM,EAAE,uBAAuB;YAC/B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACtC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE;gBACR;oBACC,KAAK,EAAE,CAAC;oBACR,KAAK,EAAE,EAAE;oBACT,aAAa,EAAE,IAAI;iBACnB;aACD;SACD,CAAC;QAEF,6DAA6D;QAC7D,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3B,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,WAAW,CAAC;YAC1C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;QACzC,OAAO,KAAK,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,SAAiB,MAAM;QACxC,OAAO;YACN,EAAE,EAAE,IAAI,CAAC,OAAO;YAChB,MAAM,EAAE,uBAAuB;YAC/B,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACtC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE;gBACR;oBACC,KAAK,EAAE,CAAC;oBACR,KAAK,EAAE,EAAE;oBACT,aAAa,EAAE,MAAM;iBACrB;aACD;SACD,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,KAAkB;QAC7B,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACH,gBAAgB;QACf,OAAO,kBAAkB,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,OAAO;QACN,OAAO,IAAI,CAAC,eAAe,CAAC;IAC7B,CAAC;CACD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payload analysis utilities
|
|
3
|
+
* Extracts and analyzes content from various API response formats
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Extract text content from a payload with various possible structures
|
|
7
|
+
* Handles multiple API response formats (OpenAI, Qwen, etc.)
|
|
8
|
+
*
|
|
9
|
+
* @param payload - Response payload to analyze
|
|
10
|
+
* @returns Extracted text content, or undefined if not found
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractText(payload: unknown): string | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Determine if the current text is cumulative (contains all previous text)
|
|
15
|
+
* or incremental (only new text)
|
|
16
|
+
*
|
|
17
|
+
* @param current - Current text from payload
|
|
18
|
+
* @param previous - Previously accumulated text
|
|
19
|
+
* @returns True if current text is cumulative (starts with previous text)
|
|
20
|
+
*/
|
|
21
|
+
export declare function isCumulative(current: string, previous: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Calculate the delta (new text) from current and previous text
|
|
24
|
+
* Handles both cumulative and incremental formats
|
|
25
|
+
*
|
|
26
|
+
* @param current - Current text from payload
|
|
27
|
+
* @param previous - Previously accumulated text
|
|
28
|
+
* @returns Object with new text delta and updated cumulative text
|
|
29
|
+
*/
|
|
30
|
+
export declare function calculateDelta(current: string, previous: string): {
|
|
31
|
+
delta: string;
|
|
32
|
+
cumulative: string;
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=payload-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload-analyzer.d.ts","sourceRoot":"","sources":["../../../lib/request/payload-analyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CA6DhE;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAGvE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC7B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACd;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAcvC"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payload analysis utilities
|
|
3
|
+
* Extracts and analyzes content from various API response formats
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Extract text content from a payload with various possible structures
|
|
7
|
+
* Handles multiple API response formats (OpenAI, Qwen, etc.)
|
|
8
|
+
*
|
|
9
|
+
* @param payload - Response payload to analyze
|
|
10
|
+
* @returns Extracted text content, or undefined if not found
|
|
11
|
+
*/
|
|
12
|
+
export function extractText(payload) {
|
|
13
|
+
if (!payload || typeof payload !== 'object')
|
|
14
|
+
return undefined;
|
|
15
|
+
// Type guard to ensure payload is an object
|
|
16
|
+
const obj = payload;
|
|
17
|
+
// Common direct string fields
|
|
18
|
+
if (typeof obj.delta === 'string')
|
|
19
|
+
return obj.delta;
|
|
20
|
+
if (typeof obj.text === 'string')
|
|
21
|
+
return obj.text;
|
|
22
|
+
if (typeof obj.output_text === 'string')
|
|
23
|
+
return obj.output_text;
|
|
24
|
+
// Nested checks with proper type guards
|
|
25
|
+
if (obj.response && typeof obj.response === 'object') {
|
|
26
|
+
const response = obj.response;
|
|
27
|
+
if (typeof response.output_text === 'string')
|
|
28
|
+
return response.output_text;
|
|
29
|
+
}
|
|
30
|
+
if (obj.message && typeof obj.message === 'object') {
|
|
31
|
+
const message = obj.message;
|
|
32
|
+
if (typeof message.content === 'string')
|
|
33
|
+
return message.content;
|
|
34
|
+
}
|
|
35
|
+
if (Array.isArray(obj.choices) && obj.choices.length > 0) {
|
|
36
|
+
const choice = obj.choices[0];
|
|
37
|
+
if (choice.delta && typeof choice.delta === 'object') {
|
|
38
|
+
const delta = choice.delta;
|
|
39
|
+
if (typeof delta.content === 'string')
|
|
40
|
+
return delta.content;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Nested under delta
|
|
44
|
+
if (obj.delta && typeof obj.delta === 'object') {
|
|
45
|
+
const delta = obj.delta;
|
|
46
|
+
if (typeof delta.text === 'string')
|
|
47
|
+
return delta.text;
|
|
48
|
+
if (typeof delta.content === 'string')
|
|
49
|
+
return delta.content;
|
|
50
|
+
}
|
|
51
|
+
// Array-shaped content collectors
|
|
52
|
+
const candidates = [
|
|
53
|
+
obj.message && typeof obj.message === 'object' ? obj.message.content : undefined,
|
|
54
|
+
obj.delta && typeof obj.delta === 'object' ? obj.delta.content : undefined,
|
|
55
|
+
obj.content
|
|
56
|
+
];
|
|
57
|
+
for (const c of candidates) {
|
|
58
|
+
if (Array.isArray(c)) {
|
|
59
|
+
let combined = '';
|
|
60
|
+
for (const item of c) {
|
|
61
|
+
if (typeof item === 'string') {
|
|
62
|
+
combined += item;
|
|
63
|
+
}
|
|
64
|
+
else if (item && typeof item === 'object') {
|
|
65
|
+
const itemObj = item;
|
|
66
|
+
if (typeof itemObj.text === 'string')
|
|
67
|
+
combined += itemObj.text;
|
|
68
|
+
else if (typeof itemObj.content === 'string')
|
|
69
|
+
combined += itemObj.content;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (combined)
|
|
73
|
+
return combined;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Determine if the current text is cumulative (contains all previous text)
|
|
80
|
+
* or incremental (only new text)
|
|
81
|
+
*
|
|
82
|
+
* @param current - Current text from payload
|
|
83
|
+
* @param previous - Previously accumulated text
|
|
84
|
+
* @returns True if current text is cumulative (starts with previous text)
|
|
85
|
+
*/
|
|
86
|
+
export function isCumulative(current, previous) {
|
|
87
|
+
if (!previous)
|
|
88
|
+
return false;
|
|
89
|
+
return current.startsWith(previous);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Calculate the delta (new text) from current and previous text
|
|
93
|
+
* Handles both cumulative and incremental formats
|
|
94
|
+
*
|
|
95
|
+
* @param current - Current text from payload
|
|
96
|
+
* @param previous - Previously accumulated text
|
|
97
|
+
* @returns Object with new text delta and updated cumulative text
|
|
98
|
+
*/
|
|
99
|
+
export function calculateDelta(current, previous) {
|
|
100
|
+
if (!previous) {
|
|
101
|
+
// First chunk
|
|
102
|
+
return { delta: current, cumulative: current };
|
|
103
|
+
}
|
|
104
|
+
if (isCumulative(current, previous)) {
|
|
105
|
+
// Cumulative style: extract only the new part
|
|
106
|
+
const delta = current.slice(previous.length);
|
|
107
|
+
return { delta, cumulative: current };
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
// Incremental style: current is already just the delta
|
|
111
|
+
return { delta: current, cumulative: previous + current };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=payload-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payload-analyzer.js","sourceRoot":"","sources":["../../../lib/request/payload-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { RequestBody, ChatMessage } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Normalize Qwen model names for Portal API (OAuth)
|
|
4
|
+
*
|
|
5
|
+
* Portal API uses a single 'coder-model' for all coding tasks.
|
|
6
|
+
* This function provides backward compatibility for legacy model names.
|
|
7
|
+
*
|
|
8
|
+
* @param model - Model name from config (e.g., "alibaba/coder-model" or legacy names)
|
|
9
|
+
* @returns Normalized model name for Portal API ("coder-model")
|
|
10
|
+
*/
|
|
11
|
+
export declare function normalizeModel(model: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Filter OpenCode qwen.txt system prompts from messages
|
|
14
|
+
* @param messages - Input messages
|
|
15
|
+
* @param openCodeQwenPrompt - OpenCode qwen.txt content for verification
|
|
16
|
+
* @returns Filtered messages
|
|
17
|
+
*/
|
|
18
|
+
export declare function filterOpenCodeQwenPrompts(messages: ChatMessage[], openCodeQwenPrompt: string): ChatMessage[];
|
|
19
|
+
/**
|
|
20
|
+
* Add Qwen-OpenCode bridge message
|
|
21
|
+
* @param messages - Input messages
|
|
22
|
+
* @returns Messages with bridge prompt added
|
|
23
|
+
*/
|
|
24
|
+
export declare function addQwenBridgeMessage(messages: ChatMessage[]): ChatMessage[];
|
|
25
|
+
/**
|
|
26
|
+
* Add tool remap message for QWEN_MODE=false
|
|
27
|
+
* @param messages - Input messages
|
|
28
|
+
* @returns Messages with remap message added
|
|
29
|
+
*/
|
|
30
|
+
export declare function addQwenToolRemapMessage(messages: ChatMessage[]): ChatMessage[];
|
|
31
|
+
/**
|
|
32
|
+
* Transform request body for Qwen Portal API (OAuth)
|
|
33
|
+
* @param body - Original request body
|
|
34
|
+
* @param qwenMode - QWEN_MODE setting
|
|
35
|
+
* @param openCodeQwenPrompt - OpenCode qwen.txt content (for filtering)
|
|
36
|
+
* @returns Transformed request body
|
|
37
|
+
*/
|
|
38
|
+
export declare function transformRequestBody(body: RequestBody, qwenMode: boolean, openCodeQwenPrompt: string): RequestBody;
|
|
39
|
+
//# sourceMappingURL=request-transformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-transformer.d.ts","sourceRoot":"","sources":["../../../lib/request/request-transformer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5D;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAsBpD;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACxC,QAAQ,EAAE,WAAW,EAAE,EACvB,kBAAkB,EAAE,MAAM,GACxB,WAAW,EAAE,CAOf;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CACnC,QAAQ,EAAE,WAAW,EAAE,GACrB,WAAW,EAAE,CAKf;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACtC,QAAQ,EAAE,WAAW,EAAE,GACrB,WAAW,EAAE,CAKf;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,OAAO,EACjB,kBAAkB,EAAE,MAAM,GACxB,WAAW,CA2Cb"}
|