@hilbras/omnihilbras 1.11.3 → 1.12.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.
@@ -35,7 +35,7 @@ export const CLINE_OAUTH = {
35
35
  };
36
36
  const defaultRefreshSkewMs = 60_000;
37
37
  /** Reported to Cline as this client's version. */
38
- const omnihilbrasVersion = '1.11.3';
38
+ const omnihilbrasVersion = '1.12.0';
39
39
  /** Cline only accepts WorkOS JWTs with an explicit prefix. */
40
40
  export function toClineAccessToken(token) {
41
41
  const trimmed = token.trim();
@@ -0,0 +1,39 @@
1
+ import type { Model } from '../types.js';
2
+ import type { HttpTransport } from '../transport.js';
3
+ export declare const qwenWebProviderId = "qwen-web";
4
+ /** Reads a pasted cookie header, or a lone `name=value`, into a plain object. */
5
+ export declare function parseQwenCookieHeader(raw: string): Record<string, string>;
6
+ export type QwenProbeResult = {
7
+ /** Whether the credential authorises anything at all. */
8
+ authenticated: boolean;
9
+ /** Whether a turn was served. The TMD gate refuses with HTTP 200, so this is read from the body. */
10
+ turnServed: boolean;
11
+ /** The provider's own words about the turn. Never replaced with a summary. */
12
+ detail: string;
13
+ /** What the auth origin said. A guest is refused here first, and a bad credential shows up here. */
14
+ authDetail: string;
15
+ /** The models Qwen serves, which are readable by guests and so are always available. */
16
+ models: string[];
17
+ };
18
+ /**
19
+ * Asks Qwen three questions and reports all three answers.
20
+ *
21
+ * Deliberately a *probe* rather than a connect. The whole reason this exists is that one question
22
+ * — does the bot-protection gate apply to an authenticated request? — cannot be answered without
23
+ * a signed-in account, and guessing wrong in either direction is bad: claiming it works would
24
+ * ship a card that cannot answer, and refusing to try would be refusing on the strength of a
25
+ * measurement nobody made. So it asks, and it says what came back.
26
+ */
27
+ export declare function probeQwenWeb(cookieHeader: string, transport: HttpTransport, signal?: AbortSignal): Promise<QwenProbeResult>;
28
+ /** The catalog Qwen serves, for the card. Read from the guest-visible endpoint, so it is real. */
29
+ /**
30
+ * The catalog, read from the live `GET /api/v2/models/` rather than written from memory.
31
+ *
32
+ * I first wrote ten plausible ids — `qwen3.7-flash`, `qwen3.7-coder-plus`, `qwen3.7-vl-plus` and
33
+ * so on. The endpoint answers **three**, and running the probe against the live site is what
34
+ * showed it. Guessing a catalog is the same fault as guessing a capability: the card would have
35
+ * advertised models that do not exist and offered turns guaranteed to fail, with nothing on the
36
+ * page to say why. Qwen publishes no context length on this endpoint, so none is claimed.
37
+ */
38
+ export declare const QWEN_WEB_MODELS: Model[];
39
+ //# sourceMappingURL=qwen-web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwen-web.d.ts","sourceRoot":"","sources":["../../src/adapters/qwen-web.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AA+CrD,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAM5C,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA8BzE;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,yDAAyD;IACzD,aAAa,EAAE,OAAO,CAAC;IACvB,oGAAoG;IACpG,UAAU,EAAE,OAAO,CAAC;IACpB,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,oGAAoG;IACpG,UAAU,EAAE,MAAM,CAAC;IACnB,wFAAwF;IACxF,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AA4BF;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAoDjI;AAED,kGAAkG;AAClG;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,EAIlC,CAAC"}
@@ -0,0 +1,181 @@
1
+ import { ProviderError } from '../errors.js';
2
+ /**
3
+ * Qwen Web, through the credential a signed-in chat.qwen.ai session holds.
4
+ *
5
+ * ## What is measured, and what is not
6
+ *
7
+ * Everything here was established against the live site, not assumed. The shape of the blocker
8
+ * is unusual enough to be worth stating plainly:
9
+ *
10
+ * - `GET https://auth.qwen.ai/api/v2/auths/refresh` answers **401 Unauthorized** for a guest, and
11
+ * no auth cookie is set on any host. Qwen's auth is on a *different origin* from its chat app,
12
+ * so there is nothing for an unauthenticated client to present.
13
+ * - `POST https://chat.qwen.ai/api/v2/chat/completions` answers **HTTP 200** with a refusal in
14
+ * the body: `{"ret":["FAIL_SYS_USER_VALIDATE","RGV587_ERROR::SM::…"],"data":{"url":"…/_____tmd_____/punish?…"}}`.
15
+ * The status code says success. A client that checks only the status sees a working provider.
16
+ * - That `_____tmd_____/punish` URL is **not a clearance flow**: requesting it returns 200,
17
+ * renders "Please connect them in order", sets no cookie, and the retry is refused with a
18
+ * freshly minted challenge. It is a human puzzle, so a client cannot satisfy it.
19
+ * - `GET /api/v2/models/` *does* answer for a guest, which is why the model catalog is real while
20
+ * the provider cannot serve a turn.
21
+ *
22
+ * So the open question is one that cannot be answered without a signed-in account: **does the
23
+ * TMD gate apply to an authenticated request?** Everything else about the request is known and
24
+ * written down here, so the moment a credential exists the only thing left to learn is that one
25
+ * answer — and `probeQwenWeb` reports it rather than guessing.
26
+ */
27
+ const QWEN_ORIGIN = 'https://chat.qwen.ai';
28
+ const QWEN_AUTH_ORIGIN = 'https://auth.qwen.ai';
29
+ const TURN_PATH = '/api/v2/chat/completions';
30
+ const AUTH_PATH = '/api/v2/auths/';
31
+ /** The Qwen web client's own fingerprint. Qwen's gateway is picky about being itself. */
32
+ const FINGERPRINT_HEADERS = {
33
+ accept: 'application/json',
34
+ 'accept-language': 'en-US,en;q=0.9',
35
+ origin: QWEN_ORIGIN,
36
+ referer: `${QWEN_ORIGIN}/`,
37
+ 'sec-ch-ua': '"Chromium";v="151", "Not(A:Brand";v="8"',
38
+ 'sec-ch-ua-mobile': '?0',
39
+ 'sec-ch-ua-platform': '"Linux"',
40
+ 'sec-fetch-dest': 'empty',
41
+ 'sec-fetch-mode': 'cors',
42
+ 'sec-fetch-site': 'same-origin',
43
+ };
44
+ export const qwenWebProviderId = 'qwen-web';
45
+ /** The browser's own user agent, sent verbatim so the client cannot be told apart from the app. */
46
+ const BROWSER_USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.7922.34 Safari/537.36';
47
+ /** Reads a pasted cookie header, or a lone `name=value`, into a plain object. */
48
+ export function parseQwenCookieHeader(raw) {
49
+ const trimmed = raw.trim();
50
+ if (!trimmed) {
51
+ throw new ProviderError('INVALID_REQUEST', 'Paste the Cookie header from auth.qwen.ai.', {
52
+ providerId: qwenWebProviderId,
53
+ publicMessage: 'Paste the Cookie header from auth.qwen.ai.',
54
+ });
55
+ }
56
+ // A pasted request line is the commonest mistake and reads as a nonsense credential.
57
+ if (/^(GET|POST|PUT|HEAD|OPTIONS)\s+\//i.test(trimmed)) {
58
+ throw new ProviderError('INVALID_REQUEST', 'That is a request line, not a cookie. Copy the value of the Cookie header only.', {
59
+ providerId: qwenWebProviderId,
60
+ publicMessage: 'That is a request line, not a cookie. Copy the value of the Cookie header only.',
61
+ });
62
+ }
63
+ const out = {};
64
+ for (const part of trimmed.split(';')) {
65
+ const at = part.indexOf('=');
66
+ if (at <= 0)
67
+ continue;
68
+ const name = part.slice(0, at).trim();
69
+ const value = part.slice(at + 1).trim();
70
+ if (name && value)
71
+ out[name] = value;
72
+ }
73
+ if (Object.keys(out).length === 0) {
74
+ throw new ProviderError('INVALID_REQUEST', 'That does not look like a cookie header — it has no name=value pairs in it.', {
75
+ providerId: qwenWebProviderId,
76
+ publicMessage: 'That does not look like a cookie header — it has no name=value pairs in it.',
77
+ });
78
+ }
79
+ return out;
80
+ }
81
+ /**
82
+ * The provider's own refusal, read out of a **200** response.
83
+ *
84
+ * Qwen signals every refusal in the body and never in the status code, on both origins. A check
85
+ * that trusted the status would report a guest cookie as a working credential.
86
+ */
87
+ function readRefusal(payload) {
88
+ if (!payload || typeof payload !== 'object')
89
+ return undefined;
90
+ const record = payload;
91
+ if (record.success !== false)
92
+ return undefined;
93
+ const code = record.data?.code;
94
+ const details = record.data?.details;
95
+ return [typeof code === 'string' ? code : undefined, typeof details === 'string' ? details : undefined]
96
+ .filter(Boolean)
97
+ .join(' — ') || 'refused';
98
+ }
99
+ function readModels(payload) {
100
+ if (!payload || typeof payload !== 'object')
101
+ return [];
102
+ const data = payload.data;
103
+ const rows = Array.isArray(data) ? data : Array.isArray(data?.data) ? (data.data) : [];
104
+ return rows
105
+ .map((row) => (row && typeof row === 'object' ? String(row.id ?? '') : ''))
106
+ .filter(Boolean);
107
+ }
108
+ /**
109
+ * Asks Qwen three questions and reports all three answers.
110
+ *
111
+ * Deliberately a *probe* rather than a connect. The whole reason this exists is that one question
112
+ * — does the bot-protection gate apply to an authenticated request? — cannot be answered without
113
+ * a signed-in account, and guessing wrong in either direction is bad: claiming it works would
114
+ * ship a card that cannot answer, and refusing to try would be refusing on the strength of a
115
+ * measurement nobody made. So it asks, and it says what came back.
116
+ */
117
+ export async function probeQwenWeb(cookieHeader, transport, signal) {
118
+ const cookies = parseQwenCookieHeader(cookieHeader);
119
+ const cookie = Object.entries(cookies).map(([name, value]) => `${name}=${value}`).join('; ');
120
+ const headers = (extra = {}) => ({
121
+ ...FINGERPRINT_HEADERS,
122
+ cookie,
123
+ 'user-agent': BROWSER_USER_AGENT,
124
+ ...extra,
125
+ });
126
+ const ask = async (url, init) => {
127
+ try {
128
+ const response = await transport.request({ method: init.method, url, headers: init.headers, providerId: qwenWebProviderId, ...(init.body ? { body: init.body } : {}), ...(signal ? { signal } : {}) });
129
+ return { status: response.status, data: response.data, error: undefined };
130
+ }
131
+ catch (error) {
132
+ // A refusal is an answer here, not a failure to report around. The transport throws on a
133
+ // non-2xx and the message carries the status, which is exactly the evidence wanted.
134
+ return { status: 0, data: undefined, error: error instanceof Error ? error.message : String(error) };
135
+ }
136
+ };
137
+ // 1. The auth origin. A guest is refused here first, so this separates "no credential" from
138
+ // "the credential is not the problem".
139
+ //
140
+ // Read from the **body**, not the status. `auth.qwen.ai` answers a guest with **HTTP 200**
141
+ // and `{"success":false,"data":{"code":"Unauthorized","details":"401 Unauthorized"}}` — the
142
+ // status code is a lie and the transport, correctly, does not throw. Trusting the status is
143
+ // what made a guest cookie report as `authenticated: true`.
144
+ const auth = await ask(`${QWEN_AUTH_ORIGIN}${AUTH_PATH}`, { method: 'GET', headers: headers() });
145
+ const authRefused = readRefusal(auth.data) ?? (auth.error ? auth.error : undefined);
146
+ const authenticated = auth.error === undefined && !authRefused;
147
+ const authDetail = authRefused ?? `HTTP ${auth.status}`;
148
+ // 2. The model catalog. Readable by guests, so it is reported whatever else happened.
149
+ const catalog = await ask(`${QWEN_ORIGIN}/api/v2/models/`, { method: 'GET', headers: headers() });
150
+ const models = readModels(catalog.data);
151
+ // 3. The turn — the question that actually matters, and the one the refusal answers.
152
+ const turn = await ask(`${QWEN_ORIGIN}${TURN_PATH}`, {
153
+ method: 'POST',
154
+ headers: headers({ 'content-type': 'application/json' }),
155
+ body: JSON.stringify({ model: models[0] ?? 'qwen3.7-plus', messages: [{ role: 'user', content: 'hi' }], stream: false }),
156
+ });
157
+ const ret = Array.isArray(turn.data?.ret) ? (turn.data.ret) : [];
158
+ const turnRefusal = readRefusal(turn.data);
159
+ const served = turn.error === undefined && ret.length === 0 && !turnRefusal;
160
+ const detail = turn.error
161
+ ?? (ret.length > 0 ? `Qwen refused the turn: ${ret.join(', ')}` : undefined)
162
+ ?? turnRefusal
163
+ ?? `Qwen answered HTTP ${turn.status}.`;
164
+ return { authenticated, turnServed: served, detail, authDetail, models };
165
+ }
166
+ /** The catalog Qwen serves, for the card. Read from the guest-visible endpoint, so it is real. */
167
+ /**
168
+ * The catalog, read from the live `GET /api/v2/models/` rather than written from memory.
169
+ *
170
+ * I first wrote ten plausible ids — `qwen3.7-flash`, `qwen3.7-coder-plus`, `qwen3.7-vl-plus` and
171
+ * so on. The endpoint answers **three**, and running the probe against the live site is what
172
+ * showed it. Guessing a catalog is the same fault as guessing a capability: the card would have
173
+ * advertised models that do not exist and offered turns guaranteed to fail, with nothing on the
174
+ * page to say why. Qwen publishes no context length on this endpoint, so none is claimed.
175
+ */
176
+ export const QWEN_WEB_MODELS = [
177
+ { id: 'qwen3.7-plus', providerId: qwenWebProviderId },
178
+ { id: 'qwen3.8-max', providerId: qwenWebProviderId },
179
+ { id: 'qwen3.8-omni-flash', providerId: qwenWebProviderId },
180
+ ];
181
+ //# sourceMappingURL=qwen-web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwen-web.js","sourceRoot":"","sources":["../../src/adapters/qwen-web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAI7C;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,WAAW,GAAG,sBAAsB,CAAC;AAC3C,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAChD,MAAM,SAAS,GAAG,0BAA0B,CAAC;AAC7C,MAAM,SAAS,GAAG,gBAAgB,CAAC;AAEnC,yFAAyF;AACzF,MAAM,mBAAmB,GAAG;IAC1B,MAAM,EAAE,kBAAkB;IAC1B,iBAAiB,EAAE,gBAAgB;IACnC,MAAM,EAAE,WAAW;IACnB,OAAO,EAAE,GAAG,WAAW,GAAG;IAC1B,WAAW,EAAE,yCAAyC;IACtD,kBAAkB,EAAE,IAAI;IACxB,oBAAoB,EAAE,SAAS;IAC/B,gBAAgB,EAAE,OAAO;IACzB,gBAAgB,EAAE,MAAM;IACxB,gBAAgB,EAAE,aAAa;CACvB,CAAC;AAEX,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;AAE5C,mGAAmG;AACnG,MAAM,kBAAkB,GACtB,2GAA2G,CAAC;AAE9G,iFAAiF;AACjF,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,4CAA4C,EAAE;YACvF,UAAU,EAAE,iBAAiB;YAC7B,aAAa,EAAE,4CAA4C;SAC5D,CAAC,CAAC;IACL,CAAC;IACD,qFAAqF;IACrF,IAAI,oCAAoC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,iFAAiF,EAAE;YAC5H,UAAU,EAAE,iBAAiB;YAC7B,aAAa,EAAE,iFAAiF;SACjG,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,IAAI,CAAC;YAAE,SAAS;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,IAAI,IAAI,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACvC,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,aAAa,CAAC,iBAAiB,EAAE,6EAA6E,EAAE;YACxH,UAAU,EAAE,iBAAiB;YAC7B,aAAa,EAAE,6EAA6E;SAC7F,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAeD;;;;;GAKG;AACH,SAAS,WAAW,CAAC,OAAgB;IACnC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,MAAM,GAAG,OAA8E,CAAC;IAC9F,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;IACrC,OAAO,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;SACpG,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,CAAC;AAC9B,CAAC;AAED,SAAS,UAAU,CAAC,OAAgB;IAClC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACvD,MAAM,IAAI,GAAI,OAA8B,CAAC,IAAI,CAAC;IAClD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAE,IAA2B,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,IAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxI,OAAO,IAAI;SACR,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAE,GAAwB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAChG,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,YAAoB,EAAE,SAAwB,EAAE,MAAoB;IACrG,MAAM,OAAO,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7F,MAAM,OAAO,GAAG,CAAC,QAAgC,EAAE,EAAE,EAAE,CAAC,CAAC;QACvD,GAAG,mBAAmB;QACtB,MAAM;QACN,YAAY,EAAE,kBAAkB;QAChC,GAAG,KAAK;KACT,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,KAAK,EAAE,GAAW,EAAE,IAAgF,EAAE,EAAE;QAClH,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAU,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YAChN,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,SAA+B,EAAE,CAAC;QAClG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yFAAyF;YACzF,oFAAoF;YACpF,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACvG,CAAC;IACH,CAAC,CAAC;IAEF,4FAA4F;IAC5F,0CAA0C;IAC1C,EAAE;IACF,8FAA8F;IAC9F,+FAA+F;IAC/F,+FAA+F;IAC/F,+DAA+D;IAC/D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,gBAAgB,GAAG,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IACjG,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpF,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,WAAW,CAAC;IAC/D,MAAM,UAAU,GAAG,WAAW,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;IAExD,sFAAsF;IACtF,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,GAAG,WAAW,iBAAiB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAClG,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAExC,qFAAqF;IACrF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,WAAW,GAAG,SAAS,EAAE,EAAE;QACnD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;QACxD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;KACzH,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAE,IAAI,CAAC,IAA0B,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,IAA2B,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChH,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;IAC5E,MAAM,MAAM,GACV,IAAI,CAAC,KAAK;WACP,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,0BAA0B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;WACzE,WAAW;WACX,sBAAsB,IAAI,CAAC,MAAM,GAAG,CAAC;IAE1C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAC3E,CAAC;AAED,kGAAkG;AAClG;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,eAAe,GAAY;IACtC,EAAE,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE;IACrD,EAAE,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,iBAAiB,EAAE;IACpD,EAAE,EAAE,EAAE,oBAAoB,EAAE,UAAU,EAAE,iBAAiB,EAAE;CAC5D,CAAC"}
package/dist/index.d.ts CHANGED
@@ -18,5 +18,6 @@ export * from './adapters/kiro.js';
18
18
  export * from './adapters/chatgpt-web.js';
19
19
  export * from './adapters/deepseek-pow.js';
20
20
  export * from './adapters/deepseek-web.js';
21
+ export * from './adapters/qwen-web.js';
21
22
  export * from './url.js';
22
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -18,5 +18,6 @@ export * from './adapters/kiro.js';
18
18
  export * from './adapters/chatgpt-web.js';
19
19
  export * from './adapters/deepseek-pow.js';
20
20
  export * from './adapters/deepseek-web.js';
21
+ export * from './adapters/qwen-web.js';
21
22
  export * from './url.js';
22
23
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iCAAiC,CAAC;AAChD,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,UAAU,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hilbras/omnihilbras",
3
- "version": "1.11.3",
3
+ "version": "1.12.0",
4
4
  "description": "Typed provider SDK for the OmniHilbras gateway: normalized chat, streaming, model listing, and capability contracts for OpenAI, Anthropic, Gemini, and OpenAI-compatible providers.",
5
5
  "license": "MIT",
6
6
  "author": "Hilbras",