@zhivex-ai/qwen 0.15.3 → 0.16.2

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 (66) hide show
  1. package/README.md +46 -1
  2. package/dist/browser-realtime.d.ts +58 -0
  3. package/dist/browser-realtime.d.ts.map +1 -0
  4. package/dist/browser-realtime.js +259 -0
  5. package/dist/browser-realtime.js.map +1 -0
  6. package/dist/browser.d.ts +9 -0
  7. package/dist/browser.d.ts.map +1 -0
  8. package/dist/browser.js +7 -0
  9. package/dist/browser.js.map +1 -0
  10. package/dist/cloud-media.d.ts +89 -0
  11. package/dist/cloud-media.d.ts.map +1 -0
  12. package/dist/cloud-media.js +221 -0
  13. package/dist/cloud-media.js.map +1 -0
  14. package/dist/cloud-realtime.d.ts +58 -0
  15. package/dist/cloud-realtime.d.ts.map +1 -0
  16. package/dist/cloud-realtime.js +123 -0
  17. package/dist/cloud-realtime.js.map +1 -0
  18. package/dist/decision.d.ts +69 -0
  19. package/dist/decision.d.ts.map +1 -0
  20. package/dist/decision.js +122 -0
  21. package/dist/decision.js.map +1 -0
  22. package/dist/embeddings.d.ts +30 -0
  23. package/dist/embeddings.d.ts.map +1 -0
  24. package/dist/embeddings.js +94 -0
  25. package/dist/embeddings.js.map +1 -0
  26. package/dist/index.d.ts +40 -2
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +365 -144
  29. package/dist/index.js.map +1 -1
  30. package/dist/inference-audio.d.ts +146 -0
  31. package/dist/inference-audio.d.ts.map +1 -0
  32. package/dist/inference-audio.js +256 -0
  33. package/dist/inference-audio.js.map +1 -0
  34. package/dist/native-asr.d.ts +52 -0
  35. package/dist/native-asr.d.ts.map +1 -0
  36. package/dist/native-asr.js +162 -0
  37. package/dist/native-asr.js.map +1 -0
  38. package/dist/rtc-protocol.d.ts +10 -0
  39. package/dist/rtc-protocol.d.ts.map +1 -0
  40. package/dist/rtc-protocol.js +10 -0
  41. package/dist/rtc-protocol.js.map +1 -0
  42. package/dist/sdp-exchange.d.ts +8 -0
  43. package/dist/sdp-exchange.d.ts.map +1 -0
  44. package/dist/sdp-exchange.js +25 -0
  45. package/dist/sdp-exchange.js.map +1 -0
  46. package/dist/temporary-keys.d.ts +15 -0
  47. package/dist/temporary-keys.d.ts.map +1 -0
  48. package/dist/temporary-keys.js +28 -0
  49. package/dist/temporary-keys.js.map +1 -0
  50. package/dist/text-profiles.d.ts +7 -0
  51. package/dist/text-profiles.d.ts.map +1 -0
  52. package/dist/text-profiles.js +55 -0
  53. package/dist/text-profiles.js.map +1 -0
  54. package/dist/url-path.d.ts +3 -0
  55. package/dist/url-path.d.ts.map +1 -0
  56. package/dist/url-path.js +8 -0
  57. package/dist/url-path.js.map +1 -0
  58. package/dist/world-rtc.d.ts +30 -0
  59. package/dist/world-rtc.d.ts.map +1 -0
  60. package/dist/world-rtc.js +33 -0
  61. package/dist/world-rtc.js.map +1 -0
  62. package/dist/worlds.d.ts +134 -0
  63. package/dist/worlds.d.ts.map +1 -0
  64. package/dist/worlds.js +196 -0
  65. package/dist/worlds.js.map +1 -0
  66. package/package.json +6 -2
@@ -0,0 +1,162 @@
1
+ import { trimTrailingSlashes } from "./url-path.js";
2
+ import { Buffer } from "node:buffer";
3
+ import { ConfigurationError, ValidationError, ProviderHTTPError, assertTrustedEndpoint, readJsonWithLimit, withTimeoutSignal } from "@zhivex-ai/core/provider";
4
+ import { transcriptionCapabilities } from "./capabilities.js";
5
+ const object = (v) => !!v && typeof v === "object" && !Array.isArray(v);
6
+ const nonempty = (v) => typeof v === "string" && v.trim().length > 0;
7
+ const invalid = (message) => { throw new ValidationError(`Qwen ASR: ${message}`); };
8
+ function client(options) {
9
+ if (!nonempty(options.apiKey))
10
+ throw new ConfigurationError("Qwen ASR requires an API key.");
11
+ const base = trimTrailingSlashes(options.taskBaseURL);
12
+ assertTrustedEndpoint(base, { protocols: ["https:"], allowUnsafe: options.allowUnsafeEndpoints, label: "Qwen ASR endpoint" });
13
+ return async (path, body, input, asyncTask = false) => {
14
+ let serialized;
15
+ try {
16
+ serialized = body === undefined ? undefined : JSON.stringify(body);
17
+ }
18
+ catch {
19
+ return invalid("request must be JSON serializable.");
20
+ }
21
+ if (serialized !== undefined && new TextEncoder().encode(serialized).byteLength > 29 * 1024 * 1024)
22
+ return invalid("request exceeds 29 MiB.");
23
+ const { signal, cleanup } = withTimeoutSignal({ abortSignal: input.abortSignal, timeoutMs: input.timeoutMs ?? 30000 });
24
+ try {
25
+ const response = await (options.fetch ?? globalThis.fetch)(`${base}${path}`, { method: body === undefined ? "GET" : "POST", redirect: "error", signal,
26
+ headers: { authorization: `Bearer ${options.apiKey}`, "content-type": "application/json", ...(asyncTask ? { "X-DashScope-Async": "enable" } : { "X-DashScope-SSE": "disable" }) }, ...(body === undefined ? {} : { body: serialized }) });
27
+ if (!response.ok) {
28
+ await response.body?.cancel();
29
+ throw new ProviderHTTPError(`Qwen ASR request failed (${response.status}).`, response.status);
30
+ }
31
+ const json = await readJsonWithLimit(response, { maxBytes: 2 * 1024 * 1024, provider: "qwen", endpoint: "asr" });
32
+ if (!object(json))
33
+ return invalid("invalid response.");
34
+ if (json.code)
35
+ throw new ProviderHTTPError("Qwen ASR provider rejected the request.", response.status);
36
+ return json;
37
+ }
38
+ finally {
39
+ cleanup();
40
+ }
41
+ };
42
+ }
43
+ function publicURL(value) {
44
+ return assertTrustedEndpoint(value, { protocols: ["https:", "http:"], label: "Qwen ASR file URL" });
45
+ }
46
+ function task(json, expectedId) {
47
+ const out = json.output;
48
+ const statuses = ["PENDING", "RUNNING", "SUCCEEDED", "FAILED", "CANCELED", "UNKNOWN"];
49
+ if (!object(out) || !nonempty(out.task_id) || !statuses.includes(out.task_status) || (expectedId !== undefined && out.task_id !== expectedId))
50
+ return invalid("invalid task identity or status.");
51
+ let results;
52
+ if (out.results !== undefined) {
53
+ if (!Array.isArray(out.results))
54
+ return invalid("invalid task results.");
55
+ results = out.results.map((r) => {
56
+ if (!object(r) || !nonempty(r.file_url) || !["SUCCEEDED", "FAILED"].includes(r.subtask_status))
57
+ return invalid("invalid subtask result.");
58
+ if (r.subtask_status === "SUCCEEDED") {
59
+ if (!nonempty(r.transcription_url))
60
+ return invalid("missing transcript URL.");
61
+ publicURL(r.transcription_url);
62
+ }
63
+ return { fileURL: r.file_url, status: r.subtask_status, ...(nonempty(r.transcription_url) ? { transcriptionURL: r.transcription_url } : {}), ...(nonempty(r.code) ? { code: r.code } : {}) };
64
+ });
65
+ }
66
+ if (out.task_status === "SUCCEEDED" && (!results || !results.length))
67
+ return invalid("successful task has no results.");
68
+ if (json.usage?.duration !== undefined && (typeof json.usage.duration !== "number" || !Number.isFinite(json.usage.duration) || json.usage.duration < 0))
69
+ return invalid("invalid duration.");
70
+ return { taskId: out.task_id, status: out.task_status, ...(nonempty(json.request_id) ? { requestId: json.request_id } : {}), ...(nonempty(out.code) ? { code: out.code } : {}), ...(results ? { results } : {}), ...(json.usage?.duration === undefined ? {} : { durationSeconds: json.usage.duration }) };
71
+ }
72
+ export function createQwenFileTranscriptionModel(modelId, options) {
73
+ if (!["qwen-audio-3.0-asr-flash-filetrans", "qwen-audio-3.1-asr-flash-filetrans"].includes(modelId))
74
+ throw new ConfigurationError("Unsupported Qwen file transcription model.");
75
+ const request = client(options);
76
+ return { provider: "qwen", modelId,
77
+ async submit(input) {
78
+ publicURL(input.fileURL);
79
+ if (input.keepDialect !== undefined && (modelId !== "qwen-audio-3.1-asr-flash-filetrans" || typeof input.keepDialect !== "boolean"))
80
+ return invalid("keepDialect requires the 3.1 filetrans model.");
81
+ if (input.channelIds && (!input.channelIds.length || !input.channelIds.every(n => Number.isSafeInteger(n) && n >= 0)))
82
+ return invalid("invalid channel IDs.");
83
+ if (input.languageHints && (!input.languageHints.length || input.languageHints.length > 4 || !input.languageHints.every(nonempty)))
84
+ return invalid("languageHints supports one to four language codes.");
85
+ if (input.diarization !== undefined && typeof input.diarization !== "boolean")
86
+ return invalid("diarization must be boolean.");
87
+ if (input.diarization && input.channelIds && input.channelIds.length > 1)
88
+ return invalid("diarization requires mono audio.");
89
+ if (input.speakerCount !== undefined && (!input.diarization || !Number.isSafeInteger(input.speakerCount) || input.speakerCount < 2 || input.speakerCount > 100))
90
+ return invalid("speakerCount requires diarization and must be 2 to 100.");
91
+ if (input.vocabularyId !== undefined && !nonempty(input.vocabularyId))
92
+ return invalid("invalid vocabulary ID.");
93
+ if (input.vocabulary) {
94
+ if (!object(input.vocabulary) || Object.keys(input.vocabulary).length > 2000 || !Object.entries(input.vocabulary).every(([k, v]) => nonempty(k) && Number.isInteger(v) && (v >= 1 && v <= 5 || v === 50)) || Object.values(input.vocabulary).filter(v => v === 50).length > 50)
95
+ return invalid("invalid vocabulary weights.");
96
+ }
97
+ if (input.context && (!Array.isArray(input.context) || !input.context.every(m => object(m) && ["user", "assistant"].includes(m.role) && Array.isArray(m.content) && m.content.every(c => object(c) && c.type === (m.role === "user" ? "input_text" : "text") && nonempty(c.text)))))
98
+ return invalid("invalid context messages.");
99
+ return task(await request("/services/audio/asr/transcription", { model: modelId, input: { file_urls: [input.fileURL], ...(input.context ? { context: input.context } : {}) }, parameters: {
100
+ ...(input.channelIds ? { channel_id: input.channelIds } : {}), ...(input.languageHints ? { language_hints: input.languageHints } : {}), ...(input.diarization === undefined ? {} : { diarization_enabled: input.diarization }), ...(input.speakerCount === undefined ? {} : { speaker_count: input.speakerCount }), ...(input.keepDialect === undefined ? {} : { keep_dialect: input.keepDialect }), ...(input.vocabularyId ? { vocabulary_id: input.vocabularyId } : {}), ...(input.vocabulary ? { vocabulary: input.vocabulary } : {})
101
+ } }, input, true));
102
+ },
103
+ async get(input) {
104
+ if (!nonempty(input.taskId) || !/^[a-zA-Z0-9_-]+$/.test(input.taskId))
105
+ return invalid("invalid task ID.");
106
+ return task(await request(`/tasks/${encodeURIComponent(input.taskId)}`, undefined, input), input.taskId);
107
+ }
108
+ };
109
+ }
110
+ export function createQwenNativeTranscriptionModel(modelId, options) {
111
+ if (modelId !== "qwen-audio-3.0-asr-flash")
112
+ throw new ConfigurationError("Unsupported Qwen synchronous native ASR model.");
113
+ const request = client(options);
114
+ return { provider: "qwen", modelId, capabilities: transcriptionCapabilities,
115
+ async transcribe(input) {
116
+ const params = { ...(input.providerOptions ?? {}) };
117
+ if (!Object.keys(params).every(k => ["format", "sample_rate", "language", "vocabulary", "context"].includes(k)))
118
+ return invalid("unsupported synchronous ASR option.");
119
+ if (input.maxRetries && input.maxRetries > 0)
120
+ return invalid("native ASR does not automatically retry billable requests.");
121
+ if (params.sample_rate !== undefined && !/^(8000|16000|22050|24000|32000|44100|48000)$/.test(String(params.sample_rate)))
122
+ return invalid("unsupported sample rate.");
123
+ if (params.context !== undefined && !Array.isArray(params.context))
124
+ return invalid("context must be an array.");
125
+ if (!/^audio\/[\w.+-]+$/.test(input.audio.mediaType))
126
+ return invalid("audio mediaType is required.");
127
+ const format = params.format ?? input.audio.mediaType.split("/")[1]?.replace("x-wav", "wav");
128
+ if (!nonempty(format))
129
+ return invalid("audio format is required.");
130
+ let data;
131
+ if (typeof input.audio.data === "string") {
132
+ data = input.audio.data;
133
+ if (/^https?:/.test(data))
134
+ publicURL(data);
135
+ else {
136
+ const payload = data.startsWith("data:") ? /^data:audio\/[\w.+-]+;base64,([A-Za-z0-9+/]+={0,2})$/.exec(data)?.[1] : data;
137
+ if (!payload || payload.length % 4 !== 0 || !/^[A-Za-z0-9+/]+={0,2}$/.test(payload))
138
+ return invalid("audio must be a public URL or valid base64.");
139
+ if (!data.startsWith("data:"))
140
+ data = `data:${input.audio.mediaType};base64,${data}`;
141
+ }
142
+ }
143
+ else {
144
+ const bytes = input.audio.data instanceof Uint8Array ? input.audio.data : new Uint8Array(input.audio.data);
145
+ if (bytes.byteLength > 20 * 1024 * 1024)
146
+ return invalid("audio exceeds 20 MiB.");
147
+ data = `data:${input.audio.mediaType};base64,${Buffer.from(bytes).toString("base64")}`;
148
+ }
149
+ if (data.length > 28 * 1024 * 1024)
150
+ return invalid("audio exceeds request limit.");
151
+ const { context, ...parameters } = params;
152
+ const messages = [...(Array.isArray(context) ? context : []), ...(input.prompt ? [{ role: "user", content: [{ type: "input_text", text: input.prompt }] }] : []), { role: "user", content: [{ type: "input_audio", input_audio: { data } }] }];
153
+ const json = await request("/services/aigc/multimodal-generation/generation", { model: modelId, input: { messages }, parameters: { ...parameters, format, ...(input.language ? { language: input.language } : {}) } }, input);
154
+ const content = json.output?.choices?.[0]?.message?.content;
155
+ const text = typeof content === "string" ? content : Array.isArray(content) ? content.filter((p) => p && typeof p.text === "string").map((p) => p.text).join("") : typeof json.output?.text === "string" ? json.output.text : undefined;
156
+ if (text === undefined)
157
+ return invalid("missing transcription text.");
158
+ return { text, rawResponse: json };
159
+ }
160
+ };
161
+ }
162
+ //# sourceMappingURL=native-asr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-asr.js","sourceRoot":"","sources":["../src/native-asr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface QwenSDPExchangeInput {
2
+ modelId: string;
3
+ offerSdp: string;
4
+ signal?: AbortSignal;
5
+ }
6
+ export type QwenSDPExchange = (input: QwenSDPExchangeInput) => Promise<string>;
7
+ export declare const MAX_BYTES: number;
8
+ export declare const model: (id: string) => void;
9
+ export declare const sdp: (value: string) => string;
10
+ //# sourceMappingURL=rtc-protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtc-protocol.d.ts","sourceRoot":"","sources":["../src/rtc-protocol.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,oBAAoB;IAAG,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE;AACjG,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAC/E,eAAO,MAAM,SAAS,QAAc,CAAC;AACrC,eAAO,MAAM,KAAK,OAAQ,MAAM,SAAuK,CAAC;AACxM,eAAO,MAAM,GAAG,UAAW,MAAM,WAGhC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { ConfigurationError } from "@zhivex-ai/core/runtime";
2
+ export const MAX_BYTES = 1024 * 1024;
3
+ export const model = (id) => { if (!/^qwen3\.(8|5)-omni-(flash|plus)-realtime(?:-|$)/.test(id))
4
+ throw new ConfigurationError("This WebRTC integration requires a Qwen Omni realtime model."); };
5
+ export const sdp = (value) => {
6
+ if (typeof value !== "string" || !value.trim().startsWith("v=0") || new TextEncoder().encode(value).length > MAX_BYTES)
7
+ throw new ConfigurationError("Invalid or oversized SDP.");
8
+ return value.trim().replace(/\r?\n/g, "\r\n") + "\r\n";
9
+ };
10
+ //# sourceMappingURL=rtc-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtc-protocol.js","sourceRoot":"","sources":["../src/rtc-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAI7D,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;AACrC,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,GAAG,IAAI,CAAC,iDAAiD,CAAC,IAAI,CAAC,EAAE,CAAC;IAAE,MAAM,IAAI,kBAAkB,CAAC,8DAA8D,CAAC,CAAC,CAAC,CAAC,CAAC;AACxM,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,EAAE;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,SAAS;QAAE,MAAM,IAAI,kBAAkB,CAAC,2BAA2B,CAAC,CAAC;IAClL,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;AACzD,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type QwenSDPExchange } from "./rtc-protocol.js";
2
+ /** Server-side SDP proxy. Never instantiate this with a long-lived API key in a browser. */
3
+ export declare const createQwenSDPExchange: (options: {
4
+ apiKey: string;
5
+ taskBaseURL?: string;
6
+ fetch?: typeof globalThis.fetch;
7
+ }) => QwenSDPExchange;
8
+ //# sourceMappingURL=sdp-exchange.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdp-exchange.d.ts","sourceRoot":"","sources":["../src/sdp-exchange.ts"],"names":[],"mappings":"AACA,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEhF,4FAA4F;AAC5F,eAAO,MAAM,qBAAqB,YAAa;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;CAAE,KAAG,eAc1H,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { ProviderHTTPError, readBodyWithLimit, assertTrustedEndpoint, withTimeoutSignal } from "@zhivex-ai/core/provider";
2
+ import { MAX_BYTES, model, sdp } from "./rtc-protocol.js";
3
+ /** Server-side SDP proxy. Never instantiate this with a long-lived API key in a browser. */
4
+ export const createQwenSDPExchange = (options) => {
5
+ const base = assertTrustedEndpoint(options.taskBaseURL ?? "https://maas.qwencloudapi.com/api/v1", { label: "Qwen WebRTC base URL", protocols: ["https"] }).toString().replace(/\/$/, "");
6
+ return async (input) => {
7
+ model(input.modelId);
8
+ const body = sdp(input.offerSdp);
9
+ const { signal, cleanup } = withTimeoutSignal({ abortSignal: input.signal, timeoutMs: 30_000 });
10
+ try {
11
+ const response = await (options.fetch ?? globalThis.fetch)(`${base}/webrtc/realtime?model=${encodeURIComponent(input.modelId)}`, {
12
+ method: "POST", redirect: "error", headers: { authorization: `Bearer ${options.apiKey}`, "content-type": "application/sdp" }, body, signal,
13
+ });
14
+ if (!response.ok) {
15
+ await response.body?.cancel();
16
+ throw new ProviderHTTPError("Qwen WebRTC SDP exchange failed.", response.status);
17
+ }
18
+ return sdp(new TextDecoder().decode(await readBodyWithLimit(response, { maxBytes: MAX_BYTES, provider: "qwen", endpoint: "webrtc/realtime" })));
19
+ }
20
+ finally {
21
+ cleanup();
22
+ }
23
+ };
24
+ };
25
+ //# sourceMappingURL=sdp-exchange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdp-exchange.js","sourceRoot":"","sources":["../src/sdp-exchange.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC1H,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAwB,MAAM,mBAAmB,CAAC;AAEhF,4FAA4F;AAC5F,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAkF,EAAmB,EAAE;IAC3I,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,WAAW,IAAI,sCAAsC,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,SAAS,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzL,OAAO,KAAK,EAAC,KAAK,EAAC,EAAE;QACnB,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;QAChG,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,0BAA0B,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE;gBAC/H,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,MAAM;aAC3I,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;gBAAC,MAAM,IAAI,iBAAiB,CAAC,kCAAkC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAAC,CAAC;YACtI,OAAO,GAAG,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,iBAAiB,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC;QAClJ,CAAC;gBAAS,CAAC;YAAC,OAAO,EAAE,CAAC;QAAC,CAAC;IAC1B,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface QwenTemporaryKeyOptions {
2
+ expiresInSeconds?: number;
3
+ abortSignal?: AbortSignal;
4
+ timeoutMs?: number;
5
+ }
6
+ export interface QwenTemporaryKey {
7
+ token: string;
8
+ expiresAt: number;
9
+ }
10
+ export interface QwenTemporaryKeysClient {
11
+ create(options?: QwenTemporaryKeyOptions): Promise<QwenTemporaryKey>;
12
+ }
13
+ /** Server-side exchange. Returned tokens inherit the primary key's permissions. */
14
+ export declare function createQwenTemporaryKeysClient(apiKey: string, taskBaseURL: string, fetcher: typeof globalThis.fetch): QwenTemporaryKeysClient;
15
+ //# sourceMappingURL=temporary-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporary-keys.d.ts","sourceRoot":"","sources":["../src/temporary-keys.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,uBAAuB;IAAG,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE;AACrH,MAAM,WAAW,gBAAgB;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AACtE,MAAM,WAAW,uBAAuB;IAAG,MAAM,CAAC,OAAO,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;CAAE;AAEjH,mFAAmF;AACnF,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,UAAU,CAAC,KAAK,GAAG,uBAAuB,CAiB5I"}
@@ -0,0 +1,28 @@
1
+ import { ConfigurationError, ProviderHTTPError, ValidationError, readJsonWithLimit, withTimeoutSignal } from "@zhivex-ai/core/provider";
2
+ /** Server-side exchange. Returned tokens inherit the primary key's permissions. */
3
+ export function createQwenTemporaryKeysClient(apiKey, taskBaseURL, fetcher) {
4
+ return { async create(options = {}) {
5
+ const ttl = options.expiresInSeconds ?? 60;
6
+ if (!Number.isSafeInteger(ttl) || ttl < 1 || ttl > 1800)
7
+ throw new ConfigurationError("Temporary key lifetime must be 1–1800 seconds.");
8
+ const { signal, cleanup } = withTimeoutSignal({ ...options, timeoutMs: options.timeoutMs ?? 15000 });
9
+ try {
10
+ const response = await fetcher(`${taskBaseURL}/tokens?expire_in_seconds=${ttl}`, {
11
+ method: "POST", redirect: "error", signal, headers: { authorization: `Bearer ${apiKey}` }
12
+ });
13
+ if (!response.ok) {
14
+ await response.body?.cancel();
15
+ throw new ProviderHTTPError("Qwen temporary key request failed.", response.status);
16
+ }
17
+ const data = await readJsonWithLimit(response, { maxBytes: 16384, provider: "qwen", endpoint: "tokens" });
18
+ if (!data || typeof data.token !== "string" || (!data.token.startsWith("st-") || data.token.length <= 3 || data.token.length > 4096 || /[\u0000-\u0020\u007f]/.test(data.token)) || !Number.isSafeInteger(data.expires_at) || data.expires_at <= Date.now() / 1000) {
19
+ throw new ValidationError("Invalid Qwen temporary key response.");
20
+ }
21
+ return { token: data.token, expiresAt: data.expires_at };
22
+ }
23
+ finally {
24
+ cleanup();
25
+ }
26
+ } };
27
+ }
28
+ //# sourceMappingURL=temporary-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporary-keys.js","sourceRoot":"","sources":["../src/temporary-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAMxI,mFAAmF;AACnF,MAAM,UAAU,6BAA6B,CAAC,MAAc,EAAE,WAAmB,EAAE,OAAgC;IACjH,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,EAAE;YAChC,MAAM,GAAG,GAAG,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC;YAC3C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,IAAI;gBAAE,MAAM,IAAI,kBAAkB,CAAC,gDAAgD,CAAC,CAAC;YACxI,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,iBAAiB,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,KAAK,EAAE,CAAC,CAAC;YACrG,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,WAAW,6BAA6B,GAAG,EAAE,EAAE;oBAC/E,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,MAAM,EAAE,EAAE;iBAC1F,CAAC,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;oBAAC,MAAM,IAAI,iBAAiB,CAAC,oCAAoC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAAC,CAAC;gBACxI,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAA4C,QAAQ,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACrJ,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,IAAK,IAAI,CAAC,UAAqB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;oBACjR,MAAM,IAAI,eAAe,CAAC,sCAAsC,CAAC,CAAC;gBACpE,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,UAAoB,EAAE,CAAC;YACrE,CAAC;oBAAS,CAAC;gBAAC,OAAO,EAAE,CAAC;YAAC,CAAC;QAC1B,CAAC,EAAE,CAAC;AACN,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type ModelGenerateInput } from "@zhivex-ai/core/provider";
2
+ export declare const isQwenTranslation: (id: string) => boolean;
3
+ export declare const isQwenCharacter: (id: string) => boolean;
4
+ export declare const isQwen38Open: (id: string) => boolean;
5
+ export declare function assertQwenLanguageModel(id: string): void;
6
+ export declare function validateQwenSpecializedText(id: string, input: ModelGenerateInput): void;
7
+ //# sourceMappingURL=text-profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-profiles.d.ts","sourceRoot":"","sources":["../src/text-profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE3H,eAAO,MAAM,iBAAiB,OAAQ,MAAM,YAAmD,CAAC;AAChG,eAAO,MAAM,eAAe,OAAQ,MAAM,YAAuD,CAAC;AAClG,eAAO,MAAM,YAAY,OAAQ,MAAM,YAAsD,CAAC;AAE9F,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,QAMjD;AAED,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,QAgChF"}
@@ -0,0 +1,55 @@
1
+ import { ConfigurationError, UnsupportedFeatureError, toToolSet } from "@zhivex-ai/core/provider";
2
+ export const isQwenTranslation = (id) => /^qwen-mt-(?:plus|turbo|flash|lite)$/.test(id);
3
+ export const isQwenCharacter = (id) => /^qwen-(?:plus|flash)-character(?:-ja)?$/.test(id);
4
+ export const isQwen38Open = (id) => ["qwen3.8-27b", "qwen3.8-2.4t-a95b"].includes(id);
5
+ export function assertQwenLanguageModel(id) {
6
+ if (id === "decision-model-preview")
7
+ throw new UnsupportedFeatureError("Use decisionModel() for Qwen decisions.");
8
+ if (/realtime$/.test(id))
9
+ throw new UnsupportedFeatureError(`Use realtimeModel() for Qwen ${id}.`);
10
+ if (/^(?:qwen-audio-|qwen-image-|wan\d|happyhorse-|happyoyster-|vidu\/|qwen-mt-image)|(?:embedding|rerank)|realtime$/.test(id)) {
11
+ throw new UnsupportedFeatureError(`Qwen ${id} requires its dedicated audio, image, video, world, embedding or rerank model factory.`);
12
+ }
13
+ }
14
+ export function validateQwenSpecializedText(id, input) {
15
+ const search = input.providerOptions?.search_options;
16
+ if ((isQwen38Open(id) || isQwenCharacter(id)) && search && typeof search === "object" && search.search_strategy === "agent") {
17
+ throw new UnsupportedFeatureError(`${id} does not support search_strategy agent; use a supported Responses web_search tool for agent-style retrieval.`);
18
+ }
19
+ if (isQwen38Open(id)) {
20
+ for (const message of input.messages)
21
+ for (const part of message.parts) {
22
+ if (part.type === "audio" || part.type === "file" && !part.mediaType.startsWith("video/")) {
23
+ throw new UnsupportedFeatureError(`${id} accepts images and video, not audio or document files.`);
24
+ }
25
+ if ((part.type === "image" || part.type === "file") && message.role !== "user")
26
+ throw new UnsupportedFeatureError("Qwen visual inputs require user messages.");
27
+ }
28
+ }
29
+ if (!isQwenTranslation(id) && !isQwenCharacter(id))
30
+ return;
31
+ const options = input.providerOptions ?? {};
32
+ if (Object.keys(toToolSet(input.tools) ?? {}).length || input.toolChoice !== undefined && input.toolChoice !== "none" ||
33
+ options.tools !== undefined || isQwenTranslation(id) && options.enable_search === true)
34
+ throw new UnsupportedFeatureError(`${id} does not support tools.`);
35
+ if (input.reasoning || options.enable_thinking !== undefined || options.reasoning_effort !== undefined || options.thinking_budget !== undefined) {
36
+ throw new UnsupportedFeatureError(`${id} does not support reasoning controls.`);
37
+ }
38
+ if (input.structuredOutput?.mode === "native" || options.response_format !== undefined)
39
+ throw new UnsupportedFeatureError(`${id} does not support native structured output.`);
40
+ if (input.messages.some(m => m.parts.some(p => p.type !== "text")))
41
+ throw new UnsupportedFeatureError(`${id} only accepts text messages.`);
42
+ if (options.apiMode === "responses")
43
+ throw new UnsupportedFeatureError("Qwen translation and character models require Chat Completions.");
44
+ if (isQwenTranslation(id)) {
45
+ if (input.messages.length !== 1 || input.messages[0]?.role !== "user")
46
+ throw new ConfigurationError("Qwen translation requires a single user message.");
47
+ const translation = options.translation_options;
48
+ if (translation !== undefined && (!translation || typeof translation !== "object" ||
49
+ typeof translation.target_lang !== "string" || !translation.target_lang.trim() ||
50
+ typeof translation.source_lang !== "string" || !translation.source_lang.trim())) {
51
+ throw new ConfigurationError("translation_options requires source_lang and target_lang.");
52
+ }
53
+ }
54
+ }
55
+ //# sourceMappingURL=text-profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-profiles.js","sourceRoot":"","sources":["../src/text-profiles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Linear suffix scan; an unanchored slash regex can backtrack quadratically. */
2
+ export declare function trimTrailingSlashes(value: string): string;
3
+ //# sourceMappingURL=url-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-path.d.ts","sourceRoot":"","sources":["../src/url-path.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIzD"}
@@ -0,0 +1,8 @@
1
+ /** Linear suffix scan; an unanchored slash regex can backtrack quadratically. */
2
+ export function trimTrailingSlashes(value) {
3
+ let end = value.length;
4
+ while (end > 0 && value.charCodeAt(end - 1) === 47)
5
+ end--;
6
+ return value.slice(0, end);
7
+ }
8
+ //# sourceMappingURL=url-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-path.js","sourceRoot":"","sources":["../src/url-path.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE;QAAE,GAAG,EAAE,CAAC;IAC1D,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { QwenWorldModelId } from "./worlds.js";
2
+ /** Structural bridge to @happy-oyster/js-sdk; the application owns its optional browser dependency. */
3
+ export interface QwenWorldRTCTravel {
4
+ start(): Promise<unknown>;
5
+ end(): Promise<unknown>;
6
+ }
7
+ export interface QwenWorldRTCEngine<TTravel extends QwenWorldRTCTravel> {
8
+ updateToken(token: string): void;
9
+ createTravel(config: {
10
+ ticket: string;
11
+ videoElement: HTMLVideoElement;
12
+ maxExperienceTimeSec?: 60 | 90 | 120;
13
+ }): TTravel;
14
+ }
15
+ export interface QwenWorldRTCConfig {
16
+ APIHost: string;
17
+ model: QwenWorldModelId;
18
+ token: string;
19
+ logLevel?: "none" | "debug" | "info" | "warn" | "error";
20
+ streamReadyTimeout?: number;
21
+ }
22
+ /** Configure the official engine using a temporary key; preserves its exact native Travel type. */
23
+ export declare function createQwenWorldRTC<TTravel extends QwenWorldRTCTravel>(createEngine: (config: QwenWorldRTCConfig) => QwenWorldRTCEngine<TTravel>, config: QwenWorldRTCConfig): QwenWorldRTCEngine<TTravel> & {
24
+ startTravel(input: {
25
+ ticket: string;
26
+ videoElement: HTMLVideoElement;
27
+ maxExperienceTimeSec?: 60 | 90 | 120;
28
+ }): Promise<TTravel>;
29
+ };
30
+ //# sourceMappingURL=world-rtc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-rtc.d.ts","sourceRoot":"","sources":["../src/world-rtc.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,uGAAuG;AACvG,MAAM,WAAW,kBAAkB;IAAG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAAC,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE;AAC1F,MAAM,WAAW,kBAAkB,CAAC,OAAO,SAAS,kBAAkB;IACpE,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,gBAAgB,CAAC;QAAC,oBAAoB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC;CACzH;AACD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IACxD,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtF;AACD,mGAAmG;AACnG,wBAAgB,kBAAkB,CAAC,OAAO,SAAS,kBAAkB,EACnE,YAAY,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,kBAAkB,GACpG,kBAAkB,CAAC,OAAO,CAAC,GAAG;IAAE,WAAW,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,gBAAgB,CAAC;QAAC,oBAAoB,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAiBlK"}
@@ -0,0 +1,33 @@
1
+ import { ConfigurationError } from "@zhivex-ai/core/runtime";
2
+ /** Configure the official engine using a temporary key; preserves its exact native Travel type. */
3
+ export function createQwenWorldRTC(createEngine, config) {
4
+ if (!config.token?.startsWith("st-"))
5
+ throw new ConfigurationError("World RTC requires a temporary API key (st-); never expose a primary key in a browser.");
6
+ if (!/^[a-zA-Z0-9.-]+(?::\d+)?$/.test(config.APIHost))
7
+ throw new ConfigurationError("APIHost must be a bare host without scheme or path.");
8
+ if (!["happyoyster-1.0-adventure", "happyoyster-1.0-directing", "happyoyster-1.0-acting"].includes(config.model))
9
+ throw new ConfigurationError("Invalid world RTC model.");
10
+ const engine = createEngine({ ...config, logLevel: config.logLevel ?? "none" });
11
+ return {
12
+ updateToken(token) { if (!token.startsWith("st-"))
13
+ throw new ConfigurationError("World RTC requires a temporary API key."); engine.updateToken(token); },
14
+ createTravel(input) { return engine.createTravel(input); },
15
+ async startTravel(input) {
16
+ const travel = engine.createTravel(input);
17
+ try {
18
+ await travel.start();
19
+ return travel;
20
+ }
21
+ catch (error) {
22
+ try {
23
+ await travel.end();
24
+ }
25
+ catch (cleanupError) {
26
+ throw new AggregateError([error, cleanupError], "World RTC start and cleanup failed; verify the travel has ended.");
27
+ }
28
+ throw error;
29
+ }
30
+ }
31
+ };
32
+ }
33
+ //# sourceMappingURL=world-rtc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-rtc.js","sourceRoot":"","sources":["../src/world-rtc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAY7D,mGAAmG;AACnG,MAAM,UAAU,kBAAkB,CAChC,YAAyE,EAAE,MAA0B;IAErG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,wFAAwF,CAAC,CAAC;IAC7J,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,qDAAqD,CAAC,CAAC;IAC3I,IAAI,CAAC,CAAC,2BAA2B,EAAE,2BAA2B,EAAE,wBAAwB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,0BAA0B,CAAC,CAAC;IAC3K,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,EAAE,CAAC,CAAC;IAChF,OAAO;QACL,WAAW,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,kBAAkB,CAAC,yCAAyC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACxJ,YAAY,CAAC,KAAK,IAAI,OAAO,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1D,KAAK,CAAC,WAAW,CAAC,KAAK;YACrB,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC;gBAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;gBAAC,OAAO,MAAM,CAAC;YAAC,CAAC;YAC5C,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,CAAC;oBAAC,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;gBAAC,CAAC;gBAAC,OAAO,YAAY,EAAE,CAAC;oBAAC,MAAM,IAAI,cAAc,CAAC,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,kEAAkE,CAAC,CAAC;gBAAC,CAAC;gBACzK,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}