@nonoun/native-chat 0.5.16 → 0.5.17

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 (88) hide show
  1. package/README.md +4 -0
  2. package/dist/adapter-mock-0s0RPkdx.js +795 -0
  3. package/dist/avatar/chat-avatar-element.d.ts +18 -0
  4. package/dist/avatar/chat-avatar-element.d.ts.map +1 -0
  5. package/dist/avatar/index.d.ts +2 -0
  6. package/dist/avatar/index.d.ts.map +1 -0
  7. package/dist/avatar/n-chat-avatar.d.ts +2 -0
  8. package/dist/avatar/n-chat-avatar.d.ts.map +1 -0
  9. package/dist/chat-input-element.d.ts +31 -0
  10. package/dist/chat-input-element.d.ts.map +1 -0
  11. package/dist/{chat-input-structured-element-C_5MDbpb.js → chat-input-structured-element-A3nMG2WR.js} +353 -204
  12. package/dist/chat-panel-element.d.ts +94 -0
  13. package/dist/chat-panel-element.d.ts.map +1 -0
  14. package/dist/feed/chat-feed-element.d.ts +48 -0
  15. package/dist/feed/chat-feed-element.d.ts.map +1 -0
  16. package/dist/feed/index.d.ts +2 -0
  17. package/dist/feed/index.d.ts.map +1 -0
  18. package/dist/feed/n-chat-feed.d.ts +2 -0
  19. package/dist/feed/n-chat-feed.d.ts.map +1 -0
  20. package/dist/gateway/adapter-chatgpt.d.ts +68 -0
  21. package/dist/gateway/adapter-chatgpt.d.ts.map +1 -0
  22. package/dist/gateway/adapter-claude.d.ts +69 -0
  23. package/dist/gateway/adapter-claude.d.ts.map +1 -0
  24. package/dist/gateway/adapter-mock.d.ts +3 -0
  25. package/dist/gateway/adapter-mock.d.ts.map +1 -0
  26. package/dist/gateway/adapter.d.ts +71 -0
  27. package/dist/gateway/adapter.d.ts.map +1 -0
  28. package/dist/gateway/controller.d.ts +50 -0
  29. package/dist/gateway/controller.d.ts.map +1 -0
  30. package/dist/gateway/index.d.ts +9 -0
  31. package/dist/gateway/index.d.ts.map +1 -0
  32. package/dist/gateway/runtime.d.ts +43 -0
  33. package/dist/gateway/runtime.d.ts.map +1 -0
  34. package/dist/gateway/types.d.ts +73 -0
  35. package/dist/gateway/types.d.ts.map +1 -0
  36. package/dist/gateway.d.ts +2 -0
  37. package/dist/gateway.d.ts.map +1 -0
  38. package/dist/gateway.js +35 -0
  39. package/dist/index.d.ts +18 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/message/chat-input-structured-element.d.ts +43 -0
  42. package/dist/message/chat-input-structured-element.d.ts.map +1 -0
  43. package/dist/message/chat-message-activity-element.d.ts +32 -0
  44. package/dist/message/chat-message-activity-element.d.ts.map +1 -0
  45. package/dist/message/chat-message-element.d.ts +44 -0
  46. package/dist/message/chat-message-element.d.ts.map +1 -0
  47. package/dist/message/chat-message-genui-element.d.ts +45 -0
  48. package/dist/message/chat-message-genui-element.d.ts.map +1 -0
  49. package/dist/message/chat-message-seed-element.d.ts +33 -0
  50. package/dist/message/chat-message-seed-element.d.ts.map +1 -0
  51. package/dist/message/chat-message-text-element.d.ts +37 -0
  52. package/dist/message/chat-message-text-element.d.ts.map +1 -0
  53. package/dist/message/chat-messages-element.d.ts +39 -0
  54. package/dist/message/chat-messages-element.d.ts.map +1 -0
  55. package/dist/message/index.d.ts +8 -0
  56. package/dist/message/index.d.ts.map +1 -0
  57. package/dist/message/n-chat-message.d.ts +2 -0
  58. package/dist/message/n-chat-message.d.ts.map +1 -0
  59. package/dist/native-chat.css +51 -29
  60. package/dist/native-chat.js +1 -1
  61. package/dist/register.d.ts +13 -0
  62. package/dist/register.d.ts.map +1 -0
  63. package/dist/register.js +3 -3
  64. package/dist/stream/classify.d.ts +19 -0
  65. package/dist/stream/classify.d.ts.map +1 -0
  66. package/dist/stream/create-transport.d.ts +19 -0
  67. package/dist/stream/create-transport.d.ts.map +1 -0
  68. package/dist/stream/index.d.ts +9 -0
  69. package/dist/stream/index.d.ts.map +1 -0
  70. package/dist/stream/parse-json.d.ts +9 -0
  71. package/dist/stream/parse-json.d.ts.map +1 -0
  72. package/dist/stream/parse-ndjson.d.ts +9 -0
  73. package/dist/stream/parse-ndjson.d.ts.map +1 -0
  74. package/dist/stream/parse-sse.d.ts +9 -0
  75. package/dist/stream/parse-sse.d.ts.map +1 -0
  76. package/dist/stream/types.d.ts +42 -0
  77. package/dist/stream/types.d.ts.map +1 -0
  78. package/dist/telemetry/emitter.d.ts +20 -0
  79. package/dist/telemetry/emitter.d.ts.map +1 -0
  80. package/dist/telemetry/events.d.ts +11 -0
  81. package/dist/telemetry/events.d.ts.map +1 -0
  82. package/dist/telemetry/index.d.ts +5 -0
  83. package/dist/telemetry/index.d.ts.map +1 -0
  84. package/dist/telemetry/redactor.d.ts +17 -0
  85. package/dist/telemetry/redactor.d.ts.map +1 -0
  86. package/dist/telemetry/types.d.ts +27 -0
  87. package/dist/telemetry/types.d.ts.map +1 -0
  88. package/package.json +5 -1
@@ -0,0 +1,795 @@
1
+ var e = class extends Error {
2
+ kind;
3
+ status;
4
+ body;
5
+ requestId;
6
+ contentType;
7
+ constructor(e) {
8
+ super(e.message), this.name = "GatewayRequestError", this.kind = e.kind, this.status = e.status ?? 0, this.body = e.body ?? "", this.requestId = e.requestId, this.contentType = e.contentType;
9
+ }
10
+ };
11
+ async function t(e) {
12
+ return r(e, e.retryPolicy ?? {
13
+ delaysMs: [
14
+ 1e3,
15
+ 2e3,
16
+ 4e3
17
+ ],
18
+ jitterRatio: 0
19
+ }, 0);
20
+ }
21
+ function n(e, t) {
22
+ let n = { ...e };
23
+ if (!t) return n;
24
+ if (t instanceof Headers) return t.forEach((e, t) => {
25
+ n[t] = e;
26
+ }), n;
27
+ if (Array.isArray(t)) {
28
+ for (let [e, r] of t) n[e] = r;
29
+ return n;
30
+ }
31
+ return {
32
+ ...n,
33
+ ...t
34
+ };
35
+ }
36
+ async function r(t, a, o) {
37
+ let { url: u, init: d, onEvent: f } = t, p = performance.now();
38
+ f?.({
39
+ type: "request:start",
40
+ requestId: d.requestId,
41
+ endpoint: u,
42
+ method: d.method ?? "GET",
43
+ attempt: o,
44
+ maxAttempts: a.delaysMs.length + 1
45
+ });
46
+ try {
47
+ let m = n(t.defaultHeaders ?? {}, d.headers), h = t.auth;
48
+ if (h?.token) {
49
+ let e = h.headerName ?? "Authorization";
50
+ m[e] = h.scheme === "raw" ? h.token : `Bearer ${h.token}`;
51
+ }
52
+ if (h?.additionalHeaders) for (let [e, t] of Object.entries(h.additionalHeaders)) m[e] = t;
53
+ let g = await fetch(u, {
54
+ ...d,
55
+ credentials: "include",
56
+ headers: m
57
+ }), _ = Math.round(performance.now() - p);
58
+ if (!g.ok) {
59
+ let n = await g.text(), p = i(g.status), m = g.headers.get("content-type") ?? void 0;
60
+ if ((p === "rate-limit" || p === "server") && o < a.delaysMs.length) return f?.({
61
+ type: "request:retry",
62
+ requestId: d.requestId,
63
+ endpoint: u,
64
+ method: d.method ?? "GET",
65
+ attempt: o,
66
+ maxAttempts: a.delaysMs.length + 1,
67
+ durationMs: _,
68
+ status: g.status,
69
+ errorKind: p
70
+ }), await c(s(a.delaysMs[o], a.jitterRatio ?? 0)), r(t, a, o + 1);
71
+ throw f?.({
72
+ type: "request:error",
73
+ requestId: d.requestId,
74
+ endpoint: u,
75
+ method: d.method ?? "GET",
76
+ attempt: o,
77
+ maxAttempts: a.delaysMs.length + 1,
78
+ durationMs: _,
79
+ status: g.status,
80
+ errorKind: p
81
+ }), new e({
82
+ message: l(g.status, n, m),
83
+ kind: p,
84
+ requestId: d.requestId,
85
+ status: g.status,
86
+ body: n,
87
+ contentType: m
88
+ });
89
+ }
90
+ return f?.({
91
+ type: "request:success",
92
+ requestId: d.requestId,
93
+ endpoint: u,
94
+ method: d.method ?? "GET",
95
+ attempt: o,
96
+ maxAttempts: a.delaysMs.length + 1,
97
+ durationMs: _,
98
+ status: g.status
99
+ }), g;
100
+ } catch (n) {
101
+ if (n instanceof DOMException && n.name === "AbortError" || n instanceof e) throw n;
102
+ let i = Math.round(performance.now() - p);
103
+ if (o < a.delaysMs.length) return f?.({
104
+ type: "request:retry",
105
+ requestId: d.requestId,
106
+ endpoint: u,
107
+ method: d.method ?? "GET",
108
+ attempt: o,
109
+ maxAttempts: a.delaysMs.length + 1,
110
+ durationMs: i,
111
+ errorKind: "network"
112
+ }), await c(s(a.delaysMs[o], a.jitterRatio ?? 0)), r(t, a, o + 1);
113
+ throw f?.({
114
+ type: "request:error",
115
+ requestId: d.requestId,
116
+ endpoint: u,
117
+ method: d.method ?? "GET",
118
+ attempt: o,
119
+ maxAttempts: a.delaysMs.length + 1,
120
+ durationMs: i,
121
+ errorKind: "network"
122
+ }), new e({
123
+ message: n instanceof Error ? n.message : "Network error",
124
+ kind: "network",
125
+ requestId: d.requestId
126
+ });
127
+ }
128
+ }
129
+ function i(e) {
130
+ return e === 401 || e === 403 ? "auth" : e === 429 ? "rate-limit" : e >= 500 ? "server" : e >= 400 ? "client" : "unknown";
131
+ }
132
+ async function a(t, n) {
133
+ let r = t.headers.get("content-type") ?? "", i = await t.text();
134
+ if (!i.trim()) throw new e({
135
+ message: "Empty response body",
136
+ kind: "unknown",
137
+ requestId: n,
138
+ status: t.status,
139
+ contentType: r
140
+ });
141
+ try {
142
+ return JSON.parse(i);
143
+ } catch {
144
+ throw new e({
145
+ message: `Invalid JSON response (status ${t.status}, content-type "${r || "unknown"}")`,
146
+ kind: "unknown",
147
+ requestId: n,
148
+ status: t.status,
149
+ body: i,
150
+ contentType: r
151
+ });
152
+ }
153
+ }
154
+ function o() {
155
+ return crypto.randomUUID();
156
+ }
157
+ function s(e, t) {
158
+ if (t <= 0) return e;
159
+ let n = 1 + Math.random() * t;
160
+ return Math.round(e * n);
161
+ }
162
+ function c(e) {
163
+ return new Promise((t) => setTimeout(t, e));
164
+ }
165
+ function l(e, t, n) {
166
+ let r = `Request failed with ${e}`;
167
+ if (!t.trim()) return r;
168
+ if ((n ?? "").toLowerCase().includes("application/json") || t.trim().startsWith("{")) try {
169
+ let e = JSON.parse(t), n = typeof e.message == "string" ? e.message : null, i = e.error && typeof e.error == "object" ? e.error : null, a = i && typeof i.message == "string" ? i.message : null, o = Array.isArray(e.detail) ? e.detail[0] : e.detail, s = o && typeof o == "object" && "msg" in o && typeof o.msg == "string" ? o.msg : typeof o == "string" ? o : null;
170
+ return a || n || s || r;
171
+ } catch {
172
+ return r;
173
+ }
174
+ return (n ?? "").toLowerCase().includes("text/html") ? `${r} (received HTML instead of API JSON)` : r;
175
+ }
176
+ var u = [
177
+ 1e3,
178
+ 2e3,
179
+ 4e3
180
+ ], d = class {
181
+ clientId;
182
+ baseUrl;
183
+ model;
184
+ maxTokens;
185
+ system;
186
+ temperature;
187
+ apiKey;
188
+ organization;
189
+ defaultSessionId;
190
+ onEvent;
191
+ constructor(e) {
192
+ this.clientId = e.clientId, this.baseUrl = e.baseUrl.replace(/\/+$/, ""), this.model = e.model, this.maxTokens = e.maxTokens, this.system = e.system, this.temperature = e.temperature, this.apiKey = e.apiKey, this.organization = e.organization, this.defaultSessionId = e.defaultSessionId, this.onEvent = e.onEvent;
193
+ }
194
+ async bootstrapSession() {
195
+ return {
196
+ id: this.defaultSessionId ?? o(),
197
+ messages: []
198
+ };
199
+ }
200
+ async sendMessage(e) {
201
+ let t = e.requestId ?? o();
202
+ return {
203
+ role: "assistant",
204
+ message: (await a(await this.request({
205
+ url: `${this.baseUrl}/chat/completions`,
206
+ init: {
207
+ method: "POST",
208
+ signal: e.signal,
209
+ requestId: t,
210
+ headers: { "Content-Type": "application/json" },
211
+ body: JSON.stringify(this.buildRequestPayload(e.messages, e.query, !1, e.model))
212
+ }
213
+ }), t)).choices?.[0]?.message?.content?.trim() || "No response returned.",
214
+ datetime: Date.now(),
215
+ partial: !1
216
+ };
217
+ }
218
+ async sendMessageStream(e) {
219
+ let t = e.requestId ?? o(), n = await this.request({
220
+ url: `${this.baseUrl}/chat/completions`,
221
+ init: {
222
+ method: "POST",
223
+ signal: e.signal,
224
+ requestId: t,
225
+ headers: {
226
+ "Content-Type": "application/json",
227
+ Accept: "text/event-stream, application/json, text/plain, */*"
228
+ },
229
+ body: JSON.stringify(this.buildRequestPayload(e.messages, e.query, !0, e.model))
230
+ }
231
+ }), r = (n.headers.get("content-type") ?? "").toLowerCase();
232
+ return n.body && r.includes("text/event-stream") ? (e.onMode?.("sse", r), e.onStreamEvent?.({
233
+ phase: "start",
234
+ mode: "sse",
235
+ contentType: r
236
+ }), this.parseEventStream(n, t, e.onChunk, e.onStreamEvent, r)) : (e.onMode?.("json", r), e.onStreamEvent?.({
237
+ phase: "start",
238
+ mode: "json",
239
+ contentType: r
240
+ }), this.sendMessage({
241
+ ...e,
242
+ requestId: t
243
+ }));
244
+ }
245
+ async checkHealth(e) {
246
+ let t = e?.requestId ?? o(), n = performance.now(), r = await this.request({
247
+ url: `${this.baseUrl}/models`,
248
+ init: {
249
+ method: "GET",
250
+ signal: e?.signal,
251
+ requestId: t
252
+ }
253
+ });
254
+ return {
255
+ healthy: r.ok,
256
+ requestId: t,
257
+ status: r.status,
258
+ durationMs: Math.round(performance.now() - n)
259
+ };
260
+ }
261
+ async getClientMetadata() {
262
+ return {
263
+ clientId: this.clientId,
264
+ name: "OpenAI Assistant",
265
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
266
+ };
267
+ }
268
+ async listModels(e) {
269
+ let t = e?.requestId ?? o(), n = ((await a(await this.request({
270
+ url: `${this.baseUrl}/models`,
271
+ init: {
272
+ method: "GET",
273
+ signal: e?.signal,
274
+ requestId: t
275
+ }
276
+ }), t)).data ?? []).filter((e) => typeof e.id == "string" && e.id.length > 0).map((e) => e.id), r = n.filter((e) => m(e));
277
+ return (r.length ? r : n).map((e) => ({
278
+ id: e,
279
+ label: e,
280
+ default: e === this.model
281
+ }));
282
+ }
283
+ buildRequestPayload(e, t, n, r) {
284
+ let i = this.mapMessages(e, t), a = {
285
+ model: r || this.model,
286
+ messages: i,
287
+ stream: n
288
+ };
289
+ return a.max_completion_tokens = this.maxTokens, typeof this.temperature == "number" && (a.temperature = this.temperature), a;
290
+ }
291
+ mapMessages(e, t) {
292
+ let n = [];
293
+ return this.system && n.push({
294
+ role: "system",
295
+ content: this.system
296
+ }), n.push(...e.filter((e) => e.role === "user" || e.role === "assistant").filter((e) => e.message.trim().length > 0).map((e) => ({
297
+ role: e.role,
298
+ content: e.message
299
+ }))), (!n.length || n[n.length - 1]?.role !== "user") && n.push({
300
+ role: "user",
301
+ content: t
302
+ }), n;
303
+ }
304
+ async parseEventStream(t, n, r, i, a) {
305
+ if (!t.body) throw new e({
306
+ message: "Missing stream body",
307
+ kind: "unknown",
308
+ requestId: n,
309
+ status: t.status
310
+ });
311
+ let o = t.body.getReader(), s = new TextDecoder(), c = "", l = "", u = Date.now(), d = !1;
312
+ for (;;) {
313
+ let { value: f, done: p } = await o.read();
314
+ if (p) break;
315
+ c += s.decode(f, { stream: !0 }).replace(/\r\n/g, "\n");
316
+ let m = c.indexOf("\n\n");
317
+ for (; m !== -1;) {
318
+ let o = c.slice(0, m);
319
+ c = c.slice(m + 2), m = c.indexOf("\n\n");
320
+ let s = this.parseSseEvent(o);
321
+ if (!s) continue;
322
+ if (s.data === "[DONE]") {
323
+ d = !0;
324
+ continue;
325
+ }
326
+ let f = {};
327
+ try {
328
+ f = JSON.parse(s.data);
329
+ } catch {
330
+ continue;
331
+ }
332
+ let p = f.error;
333
+ if (p) {
334
+ let r = typeof p.message == "string" && p.message || typeof f.message == "string" && f.message || "OpenAI stream error";
335
+ throw i?.({
336
+ phase: "error",
337
+ mode: "sse",
338
+ contentType: a,
339
+ message: r
340
+ }), new e({
341
+ message: r,
342
+ kind: "server",
343
+ requestId: n,
344
+ status: t.status,
345
+ body: s.data
346
+ });
347
+ }
348
+ let h = (Array.isArray(f.choices) ? f.choices : [])[0], g = h?.delta, _ = typeof g?.content == "string" ? g.content : "", v = typeof f.delta == "string" ? f.delta : "", y = _ || v;
349
+ y && (l += y, r?.({
350
+ delta: y,
351
+ fullMessage: l,
352
+ role: "assistant",
353
+ datetime: u,
354
+ done: !1
355
+ }), i?.({
356
+ phase: "delta",
357
+ mode: "sse",
358
+ contentType: a,
359
+ delta: y,
360
+ fullMessage: l
361
+ }));
362
+ let b = typeof h?.finish_reason == "string" ? h.finish_reason : null;
363
+ b && b !== "null" && (d = !0);
364
+ }
365
+ }
366
+ if (!l.trim()) throw new e({
367
+ message: "Empty stream response body",
368
+ kind: "unknown",
369
+ requestId: n,
370
+ status: t.status
371
+ });
372
+ return r?.({
373
+ delta: "",
374
+ fullMessage: l,
375
+ role: "assistant",
376
+ datetime: u,
377
+ done: !0,
378
+ partial: !d
379
+ }), i?.({
380
+ phase: "complete",
381
+ mode: "sse",
382
+ contentType: a,
383
+ fullMessage: l
384
+ }), {
385
+ role: "assistant",
386
+ message: l,
387
+ datetime: u,
388
+ partial: !d
389
+ };
390
+ }
391
+ parseSseEvent(e) {
392
+ let t = e.split("\n"), n = "message", r = [];
393
+ for (let e of t) e.startsWith("event:") && (n = e.slice(6).trim()), e.startsWith("data:") && r.push(e.slice(5).trimStart());
394
+ return r.length ? {
395
+ event: n,
396
+ data: r.join("\n")
397
+ } : null;
398
+ }
399
+ request(e) {
400
+ return t({
401
+ url: e.url,
402
+ init: e.init,
403
+ retryPolicy: { delaysMs: u },
404
+ auth: {
405
+ token: this.apiKey,
406
+ headerName: "Authorization",
407
+ scheme: "bearer"
408
+ },
409
+ defaultHeaders: {
410
+ "Content-Type": "application/json",
411
+ Accept: "application/json, text/plain, */*",
412
+ ...this.organization ? { "OpenAI-Organization": this.organization } : {}
413
+ },
414
+ onEvent: this.onEvent
415
+ });
416
+ }
417
+ };
418
+ const f = ({ clientId: e, baseUrl: t, gatewayConfig: n, onEvent: r, auth: i }) => {
419
+ let a = n?.model ?? "gpt-4.1-mini", o = Number(n?.max_tokens ?? n?.maxTokens ?? 1024), s = n?.temperature, c = n?.api_key ?? n?.apiKey ?? i?.token ?? null, l = n?.organization ?? n?.openai_organization ?? n?.openaiOrganization ?? null, u = n?.session_id ?? n?.sessionId ?? null;
420
+ return new d({
421
+ clientId: e,
422
+ baseUrl: t,
423
+ model: String(a),
424
+ maxTokens: Number.isFinite(o) && o > 0 ? o : 1024,
425
+ system: typeof n?.system == "string" ? n.system : void 0,
426
+ temperature: typeof s == "number" ? s : void 0,
427
+ apiKey: c ? String(c) : null,
428
+ organization: l ? String(l) : null,
429
+ defaultSessionId: u ? String(u) : null,
430
+ onEvent: r
431
+ });
432
+ };
433
+ function p(e) {
434
+ let t = e.model;
435
+ if (t !== void 0 && (typeof t != "string" || !t.trim())) throw Error("Invalid `gateway-config`: openai model must be a non-empty string.");
436
+ let n = e.max_tokens ?? e.maxTokens;
437
+ if (n !== void 0) {
438
+ let e = Number(n);
439
+ if (!Number.isFinite(e) || e <= 0) throw Error("Invalid `gateway-config`: openai max_tokens/maxTokens must be a positive number.");
440
+ }
441
+ let r = e.temperature;
442
+ if (r !== void 0) {
443
+ let e = Number(r);
444
+ if (!Number.isFinite(e) || e < 0 || e > 2) throw Error("Invalid `gateway-config`: openai temperature must be between 0 and 2.");
445
+ }
446
+ return e;
447
+ }
448
+ function m(e) {
449
+ let t = e.trim().toLowerCase();
450
+ return t ? t.startsWith("gpt-") || t.startsWith("chatgpt-") : !1;
451
+ }
452
+ var h = [
453
+ 1e3,
454
+ 2e3,
455
+ 4e3
456
+ ], g = class {
457
+ clientId;
458
+ baseUrl;
459
+ model;
460
+ maxTokens;
461
+ system;
462
+ temperature;
463
+ apiKey;
464
+ anthropicVersion;
465
+ defaultSessionId;
466
+ onEvent;
467
+ constructor(e) {
468
+ this.clientId = e.clientId, this.baseUrl = e.baseUrl.replace(/\/+$/, ""), this.model = e.model, this.maxTokens = e.maxTokens, this.system = e.system, this.temperature = e.temperature, this.apiKey = e.apiKey, this.anthropicVersion = e.anthropicVersion, this.defaultSessionId = e.defaultSessionId, this.onEvent = e.onEvent;
469
+ }
470
+ async bootstrapSession() {
471
+ return {
472
+ id: this.defaultSessionId ?? o(),
473
+ messages: []
474
+ };
475
+ }
476
+ async sendMessage(e) {
477
+ let t = e.requestId ?? o(), n = await a(await this.request({
478
+ url: `${this.baseUrl}/messages`,
479
+ init: {
480
+ method: "POST",
481
+ signal: e.signal,
482
+ requestId: t,
483
+ body: JSON.stringify(this.buildRequestPayload(e.messages, e.query, !1, e.model))
484
+ }
485
+ }), t);
486
+ return {
487
+ role: "assistant",
488
+ message: this.extractTextFromMessage(n),
489
+ datetime: Date.now(),
490
+ partial: !1
491
+ };
492
+ }
493
+ async sendMessageStream(e) {
494
+ let t = e.requestId ?? o(), n = await this.request({
495
+ url: `${this.baseUrl}/messages`,
496
+ init: {
497
+ method: "POST",
498
+ signal: e.signal,
499
+ requestId: t,
500
+ headers: { Accept: "text/event-stream, application/json, text/plain, */*" },
501
+ body: JSON.stringify(this.buildRequestPayload(e.messages, e.query, !0, e.model))
502
+ }
503
+ }), r = (n.headers.get("content-type") ?? "").toLowerCase();
504
+ return n.body && r.includes("text/event-stream") ? (e.onMode?.("sse", r), e.onStreamEvent?.({
505
+ phase: "start",
506
+ mode: "sse",
507
+ contentType: r
508
+ }), this.parseEventStream(n, t, e.onChunk, e.onStreamEvent, r)) : (e.onMode?.("json", r), e.onStreamEvent?.({
509
+ phase: "start",
510
+ mode: "json",
511
+ contentType: r
512
+ }), this.sendMessage({
513
+ ...e,
514
+ requestId: t
515
+ }));
516
+ }
517
+ async checkHealth(e) {
518
+ let t = e?.requestId ?? o(), n = performance.now(), r = await this.request({
519
+ url: `${this.baseUrl}/models`,
520
+ init: {
521
+ method: "GET",
522
+ signal: e?.signal,
523
+ requestId: t
524
+ }
525
+ });
526
+ return {
527
+ healthy: r.ok,
528
+ requestId: t,
529
+ status: r.status,
530
+ durationMs: Math.round(performance.now() - n)
531
+ };
532
+ }
533
+ async getClientMetadata() {
534
+ return {
535
+ clientId: this.clientId,
536
+ name: "Claude Assistant",
537
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
538
+ };
539
+ }
540
+ async listModels(e) {
541
+ let t = e?.requestId ?? o();
542
+ return ((await a(await this.request({
543
+ url: `${this.baseUrl}/models`,
544
+ init: {
545
+ method: "GET",
546
+ signal: e?.signal,
547
+ requestId: t
548
+ }
549
+ }), t)).data ?? []).filter((e) => typeof e.id == "string" && e.id.length > 0).map((e) => ({
550
+ id: e.id,
551
+ label: e.display_name || e.id,
552
+ default: e.id === this.model
553
+ }));
554
+ }
555
+ buildRequestPayload(e, t, n, r) {
556
+ let i = this.mapMessages(e, t), a = {
557
+ model: r || this.model,
558
+ max_tokens: this.maxTokens,
559
+ messages: i,
560
+ stream: n
561
+ };
562
+ return this.system && (a.system = this.system), typeof this.temperature == "number" && (a.temperature = this.temperature), a;
563
+ }
564
+ mapMessages(e, t) {
565
+ let n = e.filter((e) => e.role === "user" || e.role === "assistant").filter((e) => e.message.trim().length > 0).map((e) => ({
566
+ role: e.role,
567
+ content: e.message
568
+ }));
569
+ return (!n.length || n[n.length - 1]?.role !== "user") && n.push({
570
+ role: "user",
571
+ content: t
572
+ }), n;
573
+ }
574
+ extractTextFromMessage(e) {
575
+ return (e.content ?? []).filter((e) => e.type === "text").map((e) => e.text ?? "").join("") || "No response returned.";
576
+ }
577
+ async parseEventStream(t, n, r, i, a) {
578
+ if (!t.body) throw new e({
579
+ message: "Missing stream body",
580
+ kind: "unknown",
581
+ requestId: n,
582
+ status: t.status
583
+ });
584
+ let o = t.body.getReader(), s = new TextDecoder(), c = "", l = "", u = Date.now(), d = !1;
585
+ for (;;) {
586
+ let { value: f, done: p } = await o.read();
587
+ if (p) break;
588
+ c += s.decode(f, { stream: !0 }).replace(/\r\n/g, "\n");
589
+ let m = c.indexOf("\n\n");
590
+ for (; m !== -1;) {
591
+ let o = c.slice(0, m);
592
+ c = c.slice(m + 2), m = c.indexOf("\n\n");
593
+ let s = this.parseSseEvent(o);
594
+ if (!s) continue;
595
+ if (s.data === "[DONE]") {
596
+ d = !0;
597
+ continue;
598
+ }
599
+ let f = {};
600
+ try {
601
+ f = JSON.parse(s.data);
602
+ } catch {
603
+ continue;
604
+ }
605
+ if (s.event === "error" || f.type === "error") {
606
+ let r = f.error, o = typeof r?.message == "string" && r.message || typeof f.message == "string" && f.message || "Claude stream error";
607
+ throw i?.({
608
+ phase: "error",
609
+ mode: "sse",
610
+ contentType: a,
611
+ message: o
612
+ }), new e({
613
+ message: o,
614
+ kind: "server",
615
+ requestId: n,
616
+ status: t.status,
617
+ body: s.data
618
+ });
619
+ }
620
+ if (s.event === "message_stop" || f.type === "message_stop") {
621
+ d = !0;
622
+ continue;
623
+ }
624
+ if (!(s.event === "content_block_delta" || f.type === "content_block_delta")) continue;
625
+ let p = f.delta;
626
+ !p || p.type !== "text_delta" || typeof p.text != "string" || (l += p.text, r?.({
627
+ delta: p.text,
628
+ fullMessage: l,
629
+ role: "assistant",
630
+ datetime: u,
631
+ done: !1
632
+ }), i?.({
633
+ phase: "delta",
634
+ mode: "sse",
635
+ contentType: a,
636
+ delta: p.text,
637
+ fullMessage: l
638
+ }));
639
+ }
640
+ }
641
+ if (!l.trim()) throw new e({
642
+ message: "Empty stream response body",
643
+ kind: "unknown",
644
+ requestId: n,
645
+ status: t.status
646
+ });
647
+ return r?.({
648
+ delta: "",
649
+ fullMessage: l,
650
+ role: "assistant",
651
+ datetime: u,
652
+ done: !0,
653
+ partial: !d
654
+ }), i?.({
655
+ phase: "complete",
656
+ mode: "sse",
657
+ contentType: a,
658
+ fullMessage: l
659
+ }), {
660
+ role: "assistant",
661
+ message: l,
662
+ datetime: u,
663
+ partial: !d
664
+ };
665
+ }
666
+ parseSseEvent(e) {
667
+ let t = e.split("\n"), n = "message", r = [];
668
+ for (let e of t) e.startsWith("event:") && (n = e.slice(6).trim()), e.startsWith("data:") && r.push(e.slice(5).trimStart());
669
+ return r.length ? {
670
+ event: n,
671
+ data: r.join("\n")
672
+ } : null;
673
+ }
674
+ request(e) {
675
+ return t({
676
+ url: e.url,
677
+ init: e.init,
678
+ retryPolicy: { delaysMs: h },
679
+ auth: {
680
+ token: this.apiKey,
681
+ headerName: "x-api-key",
682
+ scheme: "raw"
683
+ },
684
+ defaultHeaders: {
685
+ "Content-Type": "application/json",
686
+ Accept: "application/json, text/plain, */*",
687
+ "anthropic-version": this.anthropicVersion,
688
+ "anthropic-dangerous-direct-browser-access": "true"
689
+ },
690
+ onEvent: this.onEvent
691
+ });
692
+ }
693
+ };
694
+ const _ = ({ clientId: e, baseUrl: t, gatewayConfig: n, onEvent: r, auth: i }) => {
695
+ let a = n?.model ?? "claude-sonnet-4-6", o = Number(n?.max_tokens ?? n?.maxTokens ?? 1024), s = n?.temperature, c = n?.anthropic_version ?? n?.anthropicVersion ?? "2023-06-01", l = n?.api_key ?? n?.apiKey ?? i?.token ?? null, u = n?.session_id ?? n?.sessionId ?? null;
696
+ return new g({
697
+ clientId: e,
698
+ baseUrl: t,
699
+ model: String(a),
700
+ maxTokens: Number.isFinite(o) && o > 0 ? o : 1024,
701
+ system: typeof n?.system == "string" ? n.system : void 0,
702
+ temperature: typeof s == "number" ? s : void 0,
703
+ apiKey: l ? String(l) : null,
704
+ anthropicVersion: String(c),
705
+ defaultSessionId: u ? String(u) : null,
706
+ onEvent: r
707
+ });
708
+ };
709
+ function v(e) {
710
+ let t = e.model;
711
+ if (t !== void 0 && (typeof t != "string" || !t.trim())) throw Error("Invalid `gateway-config`: claude model must be a non-empty string.");
712
+ let n = e.max_tokens ?? e.maxTokens;
713
+ if (n !== void 0) {
714
+ let e = Number(n);
715
+ if (!Number.isFinite(e) || e <= 0) throw Error("Invalid `gateway-config`: claude max_tokens/maxTokens must be a positive number.");
716
+ }
717
+ let r = e.temperature;
718
+ if (r !== void 0) {
719
+ let e = Number(r);
720
+ if (!Number.isFinite(e) || e < 0 || e > 1) throw Error("Invalid `gateway-config`: claude temperature must be between 0 and 1.");
721
+ }
722
+ return e;
723
+ }
724
+ var y = [
725
+ "That's a great question! Here's what I think:\n\n**Web components** are built on three main browser APIs:\n\n1. **Custom Elements** — define your own HTML tags\n2. **Shadow DOM** — encapsulated styling and markup\n3. **HTML Templates** — reusable content fragments\n\nThey work natively in all modern browsers.",
726
+ "Sure, I can help with that! Let me break it down:\n\n- First, you'll want to understand the **component lifecycle**\n- Then look at how **attributes** map to **properties**\n- Finally, consider your **event strategy**\n\n```js\nclass MyElement extends HTMLElement {\n connectedCallback() {\n console.log('Connected!');\n }\n}\n```",
727
+ "Here are some key points to consider:\n\n> The best code is the code you don't have to write.\n\n1. Keep components **small and focused**\n2. Use **composition** over inheritance\n3. Leverage **CSS custom properties** for theming\n4. Always consider **accessibility**\n\nLet me know if you'd like more detail on any of these!"
728
+ ], b = 25, x = class {
729
+ #e = 0;
730
+ bootstrapSession() {
731
+ return Promise.resolve({ id: "mock-session" });
732
+ }
733
+ sendMessage(e) {
734
+ let t = y[this.#e++ % y.length];
735
+ return Promise.resolve({
736
+ role: "assistant",
737
+ message: t,
738
+ datetime: Date.now()
739
+ });
740
+ }
741
+ async sendMessageStream(e) {
742
+ let t = y[this.#e++ % y.length], n = t.split(/(\s+)/);
743
+ e.onMode?.("sse", "text/event-stream"), e.onStreamEvent?.({
744
+ phase: "start",
745
+ mode: "sse"
746
+ });
747
+ let r = "";
748
+ for (let t = 0; t < n.length; t++) {
749
+ if (e.signal?.aborted) throw new DOMException("Aborted", "AbortError");
750
+ r += n[t];
751
+ let i = t === n.length - 1;
752
+ e.onChunk?.({
753
+ delta: n[t],
754
+ fullMessage: r,
755
+ role: "assistant",
756
+ datetime: Date.now(),
757
+ done: i
758
+ }), i || await new Promise((e) => setTimeout(e, b));
759
+ }
760
+ return e.onStreamEvent?.({
761
+ phase: "complete",
762
+ mode: "sse",
763
+ fullMessage: t
764
+ }), {
765
+ role: "assistant",
766
+ message: t,
767
+ datetime: Date.now()
768
+ };
769
+ }
770
+ checkHealth() {
771
+ return Promise.resolve({
772
+ healthy: !0,
773
+ requestId: "mock",
774
+ status: 200,
775
+ durationMs: 1
776
+ });
777
+ }
778
+ getClientMetadata() {
779
+ return Promise.resolve({ clientId: "mock-client" });
780
+ }
781
+ listModels() {
782
+ return Promise.resolve([{
783
+ id: "mock-fast",
784
+ label: "Mock Fast",
785
+ default: !0
786
+ }, {
787
+ id: "mock-smart",
788
+ label: "Mock Smart"
789
+ }]);
790
+ }
791
+ };
792
+ function S(e) {
793
+ return new x();
794
+ }
795
+ export { d as a, e as c, t as d, a as f, v as i, i as l, g as n, f as o, _ as r, p as s, S as t, o as u };