@nonoun/native-ai 1.0.1

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