@useknest/widget-core 0.1.0-beta.14 → 0.1.0-beta.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/auth.d.ts CHANGED
@@ -4,10 +4,10 @@ import { SupabaseClient } from '@supabase/supabase-js';
4
4
  * This must be called before sending chat messages.
5
5
  *
6
6
  * @param supabaseUrl - The Supabase project URL
7
- * @param supabaseAnonKey - The Supabase anonymous/public key
7
+ * @param supabasePublishableKey - The Supabase publishable key
8
8
  * @returns Promise resolving to true if auth succeeded, false otherwise
9
9
  */
10
- export declare function initWidgetAuth(supabaseUrl: string, supabaseAnonKey: string): Promise<boolean>;
10
+ export declare function initWidgetAuth(supabaseUrl: string, supabasePublishableKey: string): Promise<boolean>;
11
11
  /**
12
12
  * Gets the current access token for API requests.
13
13
  * Returns null if not authenticated.
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM1E;;;;;;;GAOG;AACH,wBAAsB,cAAc,CACnC,WAAW,EAAE,MAAM,EACnB,eAAe,EAAE,MAAM,GACrB,OAAO,CAAC,OAAO,CAAC,CAmDlB;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAU7D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAEzD"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAM1E;;;;;;;GAOG;AACH,wBAAsB,cAAc,CACnC,WAAW,EAAE,MAAM,EACnB,sBAAsB,EAAE,MAAM,GAC5B,OAAO,CAAC,OAAO,CAAC,CAmDlB;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAU7D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,IAAI,CAEzD"}
@@ -26,4 +26,7 @@ export declare function getAttachmentUploadUrl(baseUrl?: string): string;
26
26
  export declare function getAttachmentSignedUrlEndpoint(baseUrl?: string): string;
27
27
  /** Returns true if the MIME type is a supported image type. */
28
28
  export declare function isImageType(fileType: string): boolean;
29
+ export declare const HUMAN_TAKEOVER_CAPTION = "A human agent will get back to you shortly.";
30
+ export declare const PRESENCE_LABEL_WIDGET = "We are online";
31
+ export declare const PRESENCE_LABEL_DASHBOARD = "Customer online";
29
32
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,yBAAyB,CAAC;AACvD,eAAO,MAAM,QAAQ,YAAY,CAAC;AAIlC,eAAO,MAAM,mBAAmB,6CAA6C,CAAC;AAC9E,eAAO,MAAM,+BAA+B,mDAAmD,CAAC;AAEhG,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAExE;AAED,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAE1E;AAED,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AACxE,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAC9D,eAAO,MAAM,kBAAkB,iGACgE,CAAC;AAChG,eAAO,MAAM,mBAAmB,mGACiE,CAAC;AAClG,eAAO,MAAM,kBAAkB,4CAA4C,CAAC;AAC5E,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAC7C,eAAO,MAAM,uBAAuB,mHAC6E,CAAC;AAClH,eAAO,MAAM,yBAAyB,UAIrC,CAAC;AAEF,eAAO,MAAM,mBAAmB,UAAyD,CAAC;AAC1F,eAAO,MAAM,sBAAsB,UAIlC,CAAC;AACF,eAAO,MAAM,wBAAwB,UAAsD,CAAC;AAC5F,eAAO,MAAM,0BAA0B,QAAqC,CAAC;AAC7E,eAAO,MAAM,yBAAyB,QAAmB,CAAC;AAC1D,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,iEAAiE;AACjE,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAEjF;AAED,iEAAiE;AACjE,wBAAgB,8BAA8B,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAEzF;AAED,+DAA+D;AAC/D,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAErD"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,yBAAyB,CAAC;AACvD,eAAO,MAAM,QAAQ,YAAY,CAAC;AAIlC,eAAO,MAAM,mBAAmB,6CAA6C,CAAC;AAC9E,eAAO,MAAM,+BAA+B,mDAAmD,CAAC;AAEhG,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAExE;AAED,wDAAwD;AACxD,wBAAgB,eAAe,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAE1E;AAED,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AACxE,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAC9D,eAAO,MAAM,kBAAkB,iGACgE,CAAC;AAChG,eAAO,MAAM,mBAAmB,mGACiE,CAAC;AAClG,eAAO,MAAM,kBAAkB,4CAA4C,CAAC;AAC5E,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAC7C,eAAO,MAAM,uBAAuB,mHAC6E,CAAC;AAClH,eAAO,MAAM,yBAAyB,UAIrC,CAAC;AAEF,eAAO,MAAM,mBAAmB,UAAyD,CAAC;AAC1F,eAAO,MAAM,sBAAsB,UAIlC,CAAC;AACF,eAAO,MAAM,wBAAwB,UAAsD,CAAC;AAC5F,eAAO,MAAM,0BAA0B,QAAqC,CAAC;AAC7E,eAAO,MAAM,yBAAyB,QAAmB,CAAC;AAC1D,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,iEAAiE;AACjE,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAEjF;AAED,iEAAiE;AACjE,wBAAgB,8BAA8B,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,CAEzF;AAED,+DAA+D;AAC/D,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,eAAO,MAAM,sBAAsB,gDAAgD,CAAC;AACpF,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AACrD,eAAO,MAAM,wBAAwB,oBAAoB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export type { WidgetMode, MessageRole, Source, Attachment, Message, ChatMessageRequest, ChatMessageResponse, ChatApiError, WidgetConfig, SSEEvent, WidgetUser } from './types';
2
- export { DEFAULT_BASE_URL, API_PATH, getChatApiUrl, getConfigApiUrl, FALLBACK_ERROR_MESSAGE, DEFAULT_ERROR_MESSAGE, AUTH_ERROR_MESSAGE, USAGE_LIMIT_MESSAGE, DEFAULT_AVATAR_URL, DEFAULT_BRAND_COLOR, DEFAULT_WELCOME_MESSAGE, DEFAULT_EXAMPLE_QUESTIONS, PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_PUBLISHABLE_KEY, ALLOWED_IMAGE_TYPES, ALLOWED_DOCUMENT_TYPES, ALLOWED_ATTACHMENT_TYPES, ACCEPTED_FILE_TYPES_STRING, MAX_ATTACHMENT_SIZE_BYTES, MAX_ATTACHMENTS_PER_MESSAGE, getAttachmentUploadUrl, getAttachmentSignedUrlEndpoint, isImageType } from './constants';
2
+ export { DEFAULT_BASE_URL, API_PATH, getChatApiUrl, getConfigApiUrl, FALLBACK_ERROR_MESSAGE, DEFAULT_ERROR_MESSAGE, AUTH_ERROR_MESSAGE, USAGE_LIMIT_MESSAGE, DEFAULT_AVATAR_URL, DEFAULT_BRAND_COLOR, DEFAULT_WELCOME_MESSAGE, DEFAULT_EXAMPLE_QUESTIONS, PUBLIC_SUPABASE_URL, PUBLIC_SUPABASE_PUBLISHABLE_KEY, ALLOWED_IMAGE_TYPES, ALLOWED_DOCUMENT_TYPES, ALLOWED_ATTACHMENT_TYPES, ACCEPTED_FILE_TYPES_STRING, MAX_ATTACHMENT_SIZE_BYTES, MAX_ATTACHMENTS_PER_MESSAGE, getAttachmentUploadUrl, getAttachmentSignedUrlEndpoint, isImageType, HUMAN_TAKEOVER_CAPTION, PRESENCE_LABEL_WIDGET, PRESENCE_LABEL_DASHBOARD } from './constants';
3
3
  export { fetchWidgetConfig } from './config';
4
4
  export type { ConfigResult, ConfigErrorType } from './config';
5
5
  export { streamChatMessage } from './streaming';
@@ -9,7 +9,7 @@ export { validateAttachment, requestUploadUrl, uploadToStorage, uploadAttachment
9
9
  export { initWidgetAuth, getAccessToken, isAuthenticated, getSupabaseClient } from './auth';
10
10
  export { initWidgetSentry, captureWidgetException } from './sentry';
11
11
  export { subscribeToThread } from './realtime';
12
- export type { BroadcastMessage } from './realtime';
12
+ export type { BroadcastMessage, PresenceOptions } from './realtime';
13
13
  export { loadChatState, saveChatState, saveChatStateDebounced, clearChatState } from './persistence';
14
14
  export type { PersistedChatState } from './persistence';
15
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACX,UAAU,EACV,WAAW,EACX,MAAM,EACN,UAAU,EACV,OAAO,EACP,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,MAAM,SAAS,CAAC;AAGjB,OAAO,EACN,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,EACnB,+BAA+B,EAC/B,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,EACtB,8BAA8B,EAC9B,WAAW,EACX,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGzE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGxD,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAG5F,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAGpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,EACN,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,cAAc,EACd,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACX,UAAU,EACV,WAAW,EACX,MAAM,EACN,UAAU,EACV,OAAO,EACP,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,MAAM,SAAS,CAAC;AAGjB,OAAO,EACN,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,mBAAmB,EACnB,+BAA+B,EAC/B,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,yBAAyB,EACzB,2BAA2B,EAC3B,sBAAsB,EACtB,8BAA8B,EAC9B,WAAW,EACX,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAG9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAGzE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGxD,OAAO,EACN,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAC;AAG5F,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAGpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGpE,OAAO,EACN,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,cAAc,EACd,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -26,7 +26,7 @@ function Fe(n = W) {
26
26
  function ut(n) {
27
27
  return fe.includes(n);
28
28
  }
29
- const Ce = "knest-widget-config-", ke = 1440 * 60 * 1e3;
29
+ const lt = "A human agent will get back to you shortly.", ct = "We are online", dt = "Customer online", Ce = "knest-widget-config-", ke = 1440 * 60 * 1e3;
30
30
  function J(n) {
31
31
  return Ce + n;
32
32
  }
@@ -69,14 +69,14 @@ async function se(n, u) {
69
69
  return console.error("Error fetching widget config:", e), { config: null, error: "network" };
70
70
  }
71
71
  }
72
- async function lt(n, u, e) {
72
+ async function gt(n, u, e) {
73
73
  const l = _e(n);
74
74
  return l ? (e && se(n, u).then((c) => {
75
75
  c.config && c.config.updatedAt !== l.updatedAt && e(c.config);
76
76
  }), { config: l, error: null }) : se(n, u);
77
77
  }
78
78
  let _ = null, H = !1, x = null;
79
- async function ct(n, u) {
79
+ async function pt(n, u) {
80
80
  return x || (H && _ ? !0 : (x = (async () => {
81
81
  try {
82
82
  _ = be(n, u, {
@@ -115,35 +115,35 @@ function Pe() {
115
115
  function xe() {
116
116
  return _;
117
117
  }
118
- async function dt(n) {
119
- const { publishableApiKey: u, content: e, threadId: l, callbacks: c, baseUrl: E, metadata: A, user: o } = n;
118
+ async function ft(n) {
119
+ const { publishableApiKey: u, content: e, threadId: l, callbacks: c, baseUrl: p, metadata: h, user: i } = n;
120
120
  try {
121
121
  if (!Pe())
122
122
  throw new Error("Widget not authenticated. Call initWidgetAuth() first.");
123
- const h = await Q();
124
- if (!h)
123
+ const m = await Q();
124
+ if (!m)
125
125
  throw new Error("No access token available. Please refresh and try again.");
126
- const y = { content: e };
127
- l && (y.threadId = l), A && (y.metadata = A), o && (!o.id && !o.email ? console.warn("[Knest] user prop ignored: at least id or email is required.") : (y.user = o, o.email && (y.email = o.email), o.fullName && (y.fullName = o.fullName)));
128
- const R = await fetch(Ie(E), {
126
+ const b = { content: e };
127
+ l && (b.threadId = l), h && (b.metadata = h), i && (!i.id && !i.email ? console.warn("[Knest] user prop ignored: at least id or email is required.") : (b.user = i, i.email && (b.email = i.email), i.fullName && (b.fullName = i.fullName)));
128
+ const R = await fetch(Ie(p), {
129
129
  method: "POST",
130
130
  headers: {
131
131
  "Content-Type": "application/json",
132
132
  "X-Api-Key": u,
133
- Authorization: `Bearer ${h}`
133
+ Authorization: `Bearer ${m}`
134
134
  },
135
135
  credentials: "include",
136
- body: JSON.stringify(y)
136
+ body: JSON.stringify(b)
137
137
  });
138
138
  if (!R.ok) {
139
139
  if (R.status === 401 || R.status === 403)
140
140
  throw new Error(Oe);
141
141
  if (R.status === 429) {
142
- const f = await R.json();
143
- throw f.code === "USAGE_LIMIT_EXCEEDED" ? new Error(Ne) : new Error(f.error || "Rate limited");
142
+ const E = await R.json();
143
+ throw E.code === "USAGE_LIMIT_EXCEEDED" ? new Error(Ne) : new Error(E.error || "Rate limited");
144
144
  }
145
- const m = await R.json();
146
- throw new Error(m.error || "Failed to send message");
145
+ const A = await R.json();
146
+ throw new Error(A.error || "Failed to send message");
147
147
  }
148
148
  const v = R.body?.getReader();
149
149
  if (!v)
@@ -151,9 +151,9 @@ async function dt(n) {
151
151
  const w = new TextDecoder();
152
152
  let k = "", L = !1;
153
153
  for (; ; ) {
154
- const { done: m, value: f } = await v.read();
155
- if (m) break;
156
- k += w.decode(f, { stream: !0 });
154
+ const { done: A, value: E } = await v.read();
155
+ if (A) break;
156
+ k += w.decode(E, { stream: !0 });
157
157
  const T = k.split(`
158
158
  `);
159
159
  k = T.pop() || "";
@@ -176,9 +176,9 @@ async function dt(n) {
176
176
  }
177
177
  }
178
178
  L || c.onError(Re);
179
- } catch (h) {
180
- const y = h instanceof Error ? h.message : re;
181
- c.onError(y);
179
+ } catch (m) {
180
+ const b = m instanceof Error ? m.message : re;
181
+ c.onError(b);
182
182
  }
183
183
  }
184
184
  var ie = typeof globalThis < "u" ? globalThis : typeof window < "u" ? window : typeof global < "u" ? global : typeof self < "u" ? self : {};
@@ -198,7 +198,7 @@ function Me() {
198
198
  * @public
199
199
  */
200
200
  var e = (function(l) {
201
- var c = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i, E = 0, A = {}, o = {
201
+ var c = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i, p = 0, h = {}, i = {
202
202
  /**
203
203
  * By default, Prism will attempt to highlight all code elements (by calling {@link Prism.highlightAll}) on the
204
204
  * current page after the page finished loading. This might be a problem if e.g. you wanted to asynchronously load
@@ -254,7 +254,7 @@ function Me() {
254
254
  */
255
255
  util: {
256
256
  encode: function a(t) {
257
- return t instanceof h ? new h(t.type, a(t.content), t.alias) : Array.isArray(t) ? t.map(a) : t.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/\u00a0/g, " ");
257
+ return t instanceof m ? new m(t.type, a(t.content), t.alias) : Array.isArray(t) ? t.map(a) : t.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/\u00a0/g, " ");
258
258
  },
259
259
  /**
260
260
  * Returns the name of the type of the given value.
@@ -282,7 +282,7 @@ function Me() {
282
282
  * @returns {number}
283
283
  */
284
284
  objId: function(a) {
285
- return a.__id || Object.defineProperty(a, "__id", { value: ++E }), a.__id;
285
+ return a.__id || Object.defineProperty(a, "__id", { value: ++p }), a.__id;
286
286
  },
287
287
  /**
288
288
  * Creates a deep clone of the given object.
@@ -296,13 +296,13 @@ function Me() {
296
296
  */
297
297
  clone: function a(t, r) {
298
298
  r = r || {};
299
- var s, i;
300
- switch (o.util.type(t)) {
299
+ var s, o;
300
+ switch (i.util.type(t)) {
301
301
  case "Object":
302
- if (i = o.util.objId(t), r[i])
303
- return r[i];
302
+ if (o = i.util.objId(t), r[o])
303
+ return r[o];
304
304
  s = /** @type {Record<string, any>} */
305
- {}, r[i] = s;
305
+ {}, r[o] = s;
306
306
  for (var g in t)
307
307
  t.hasOwnProperty(g) && (s[g] = a(t[g], r));
308
308
  return (
@@ -310,10 +310,10 @@ function Me() {
310
310
  s
311
311
  );
312
312
  case "Array":
313
- return i = o.util.objId(t), r[i] ? r[i] : (s = [], r[i] = s, /** @type {Array} */
313
+ return o = i.util.objId(t), r[o] ? r[o] : (s = [], r[o] = s, /** @type {Array} */
314
314
  /** @type {any} */
315
- t.forEach(function(p, d) {
316
- s[d] = a(p, r);
315
+ t.forEach(function(f, d) {
316
+ s[d] = a(f, r);
317
317
  }), /** @type {any} */
318
318
  s);
319
319
  default:
@@ -396,10 +396,10 @@ function Me() {
396
396
  */
397
397
  isActive: function(a, t, r) {
398
398
  for (var s = "no-" + t; a; ) {
399
- var i = a.classList;
400
- if (i.contains(t))
399
+ var o = a.classList;
400
+ if (o.contains(t))
401
401
  return !0;
402
- if (i.contains(s))
402
+ if (o.contains(s))
403
403
  return !1;
404
404
  a = a.parentElement;
405
405
  }
@@ -417,10 +417,10 @@ function Me() {
417
417
  /**
418
418
  * The grammar for plain, unformatted text.
419
419
  */
420
- plain: A,
421
- plaintext: A,
422
- text: A,
423
- txt: A,
420
+ plain: h,
421
+ plaintext: h,
422
+ text: h,
423
+ txt: h,
424
424
  /**
425
425
  * Creates a deep copy of the language with the given id and appends the given tokens.
426
426
  *
@@ -450,7 +450,7 @@ function Me() {
450
450
  * });
451
451
  */
452
452
  extend: function(a, t) {
453
- var r = o.util.clone(o.languages[a]);
453
+ var r = i.util.clone(i.languages[a]);
454
454
  for (var s in t)
455
455
  r[s] = t[s];
456
456
  return r;
@@ -532,29 +532,29 @@ function Me() {
532
532
  */
533
533
  insertBefore: function(a, t, r, s) {
534
534
  s = s || /** @type {any} */
535
- o.languages;
536
- var i = s[a], g = {};
537
- for (var p in i)
538
- if (i.hasOwnProperty(p)) {
539
- if (p == t)
535
+ i.languages;
536
+ var o = s[a], g = {};
537
+ for (var f in o)
538
+ if (o.hasOwnProperty(f)) {
539
+ if (f == t)
540
540
  for (var d in r)
541
541
  r.hasOwnProperty(d) && (g[d] = r[d]);
542
- r.hasOwnProperty(p) || (g[p] = i[p]);
542
+ r.hasOwnProperty(f) || (g[f] = o[f]);
543
543
  }
544
544
  var S = s[a];
545
- return s[a] = g, o.languages.DFS(o.languages, function(b, F) {
546
- F === S && b != a && (this[b] = g);
545
+ return s[a] = g, i.languages.DFS(i.languages, function(I, F) {
546
+ F === S && I != a && (this[I] = g);
547
547
  }), g;
548
548
  },
549
549
  // Traverse a language definition with Depth First Search
550
- DFS: function a(t, r, s, i) {
551
- i = i || {};
552
- var g = o.util.objId;
553
- for (var p in t)
554
- if (t.hasOwnProperty(p)) {
555
- r.call(t, p, t[p], s || p);
556
- var d = t[p], S = o.util.type(d);
557
- S === "Object" && !i[g(d)] ? (i[g(d)] = !0, a(d, r, null, i)) : S === "Array" && !i[g(d)] && (i[g(d)] = !0, a(d, r, p, i));
550
+ DFS: function a(t, r, s, o) {
551
+ o = o || {};
552
+ var g = i.util.objId;
553
+ for (var f in t)
554
+ if (t.hasOwnProperty(f)) {
555
+ r.call(t, f, t[f], s || f);
556
+ var d = t[f], S = i.util.type(d);
557
+ S === "Object" && !o[g(d)] ? (o[g(d)] = !0, a(d, r, null, o)) : S === "Array" && !o[g(d)] && (o[g(d)] = !0, a(d, r, f, o));
558
558
  }
559
559
  }
560
560
  },
@@ -572,7 +572,7 @@ function Me() {
572
572
  * @public
573
573
  */
574
574
  highlightAll: function(a, t) {
575
- o.highlightAllUnder(document, a, t);
575
+ i.highlightAllUnder(document, a, t);
576
576
  },
577
577
  /**
578
578
  * Fetches all the descendants of `container` that have a `.language-xxxx` class and then calls
@@ -595,9 +595,9 @@ function Me() {
595
595
  container: a,
596
596
  selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
597
597
  };
598
- o.hooks.run("before-highlightall", s), s.elements = Array.prototype.slice.apply(s.container.querySelectorAll(s.selector)), o.hooks.run("before-all-elements-highlight", s);
599
- for (var i = 0, g; g = s.elements[i++]; )
600
- o.highlightElement(g, t === !0, s.callback);
598
+ i.hooks.run("before-highlightall", s), s.elements = Array.prototype.slice.apply(s.container.querySelectorAll(s.selector)), i.hooks.run("before-all-elements-highlight", s);
599
+ for (var o = 0, g; g = s.elements[o++]; )
600
+ i.highlightElement(g, t === !0, s.callback);
601
601
  },
602
602
  /**
603
603
  * Highlights the code inside a single element.
@@ -628,38 +628,38 @@ function Me() {
628
628
  * @public
629
629
  */
630
630
  highlightElement: function(a, t, r) {
631
- var s = o.util.getLanguage(a), i = o.languages[s];
632
- o.util.setLanguage(a, s);
631
+ var s = i.util.getLanguage(a), o = i.languages[s];
632
+ i.util.setLanguage(a, s);
633
633
  var g = a.parentElement;
634
- g && g.nodeName.toLowerCase() === "pre" && o.util.setLanguage(g, s);
635
- var p = a.textContent, d = {
634
+ g && g.nodeName.toLowerCase() === "pre" && i.util.setLanguage(g, s);
635
+ var f = a.textContent, d = {
636
636
  element: a,
637
637
  language: s,
638
- grammar: i,
639
- code: p
638
+ grammar: o,
639
+ code: f
640
640
  };
641
641
  function S(F) {
642
- d.highlightedCode = F, o.hooks.run("before-insert", d), d.element.innerHTML = d.highlightedCode, o.hooks.run("after-highlight", d), o.hooks.run("complete", d), r && r.call(d.element);
642
+ d.highlightedCode = F, i.hooks.run("before-insert", d), d.element.innerHTML = d.highlightedCode, i.hooks.run("after-highlight", d), i.hooks.run("complete", d), r && r.call(d.element);
643
643
  }
644
- if (o.hooks.run("before-sanity-check", d), g = d.element.parentElement, g && g.nodeName.toLowerCase() === "pre" && !g.hasAttribute("tabindex") && g.setAttribute("tabindex", "0"), !d.code) {
645
- o.hooks.run("complete", d), r && r.call(d.element);
644
+ if (i.hooks.run("before-sanity-check", d), g = d.element.parentElement, g && g.nodeName.toLowerCase() === "pre" && !g.hasAttribute("tabindex") && g.setAttribute("tabindex", "0"), !d.code) {
645
+ i.hooks.run("complete", d), r && r.call(d.element);
646
646
  return;
647
647
  }
648
- if (o.hooks.run("before-highlight", d), !d.grammar) {
649
- S(o.util.encode(d.code));
648
+ if (i.hooks.run("before-highlight", d), !d.grammar) {
649
+ S(i.util.encode(d.code));
650
650
  return;
651
651
  }
652
652
  if (t && l.Worker) {
653
- var b = new Worker(o.filename);
654
- b.onmessage = function(F) {
653
+ var I = new Worker(i.filename);
654
+ I.onmessage = function(F) {
655
655
  S(F.data);
656
- }, b.postMessage(JSON.stringify({
656
+ }, I.postMessage(JSON.stringify({
657
657
  language: d.language,
658
658
  code: d.code,
659
659
  immediateClose: !0
660
660
  }));
661
661
  } else
662
- S(o.highlight(d.code, d.grammar, d.language));
662
+ S(i.highlight(d.code, d.grammar, d.language));
663
663
  },
664
664
  /**
665
665
  * Low-level function, only use if you know what you’re doing. It accepts a string of text as input
@@ -687,9 +687,9 @@ function Me() {
687
687
  grammar: t,
688
688
  language: r
689
689
  };
690
- if (o.hooks.run("before-tokenize", s), !s.grammar)
690
+ if (i.hooks.run("before-tokenize", s), !s.grammar)
691
691
  throw new Error('The language "' + s.language + '" has no grammar.');
692
- return s.tokens = o.tokenize(s.code, s.grammar), o.hooks.run("after-tokenize", s), h.stringify(o.util.encode(s.tokens), s.language);
692
+ return s.tokens = i.tokenize(s.code, s.grammar), i.hooks.run("after-tokenize", s), m.stringify(i.util.encode(s.tokens), s.language);
693
693
  },
694
694
  /**
695
695
  * This is the heart of Prism, and the most low-level function you can use. It accepts a string of text as input
@@ -722,8 +722,8 @@ function Me() {
722
722
  t[s] = r[s];
723
723
  delete t.rest;
724
724
  }
725
- var i = new v();
726
- return w(i, i.head, a), R(a, i, t, i.head, 0), L(i);
725
+ var o = new v();
726
+ return w(o, o.head, a), R(a, o, t, o.head, 0), L(o);
727
727
  },
728
728
  /**
729
729
  * @namespace
@@ -745,7 +745,7 @@ function Me() {
745
745
  * @public
746
746
  */
747
747
  add: function(a, t) {
748
- var r = o.hooks.all;
748
+ var r = i.hooks.all;
749
749
  r[a] = r[a] || [], r[a].push(t);
750
750
  },
751
751
  /**
@@ -758,19 +758,19 @@ function Me() {
758
758
  * @public
759
759
  */
760
760
  run: function(a, t) {
761
- var r = o.hooks.all[a];
761
+ var r = i.hooks.all[a];
762
762
  if (!(!r || !r.length))
763
- for (var s = 0, i; i = r[s++]; )
764
- i(t);
763
+ for (var s = 0, o; o = r[s++]; )
764
+ o(t);
765
765
  }
766
766
  },
767
- Token: h
767
+ Token: m
768
768
  };
769
- l.Prism = o;
770
- function h(a, t, r, s) {
769
+ l.Prism = i;
770
+ function m(a, t, r, s) {
771
771
  this.type = a, this.content = t, this.alias = r, this.length = (s || "").length | 0;
772
772
  }
773
- h.stringify = function a(t, r) {
773
+ m.stringify = function a(t, r) {
774
774
  if (typeof t == "string")
775
775
  return t;
776
776
  if (Array.isArray(t)) {
@@ -779,7 +779,7 @@ function Me() {
779
779
  s += a(S, r);
780
780
  }), s;
781
781
  }
782
- var i = {
782
+ var o = {
783
783
  type: t.type,
784
784
  content: a(t.content, r),
785
785
  tag: "span",
@@ -787,64 +787,64 @@ function Me() {
787
787
  attributes: {},
788
788
  language: r
789
789
  }, g = t.alias;
790
- g && (Array.isArray(g) ? Array.prototype.push.apply(i.classes, g) : i.classes.push(g)), o.hooks.run("wrap", i);
791
- var p = "";
792
- for (var d in i.attributes)
793
- p += " " + d + '="' + (i.attributes[d] || "").replace(/"/g, "&quot;") + '"';
794
- return "<" + i.tag + ' class="' + i.classes.join(" ") + '"' + p + ">" + i.content + "</" + i.tag + ">";
790
+ g && (Array.isArray(g) ? Array.prototype.push.apply(o.classes, g) : o.classes.push(g)), i.hooks.run("wrap", o);
791
+ var f = "";
792
+ for (var d in o.attributes)
793
+ f += " " + d + '="' + (o.attributes[d] || "").replace(/"/g, "&quot;") + '"';
794
+ return "<" + o.tag + ' class="' + o.classes.join(" ") + '"' + f + ">" + o.content + "</" + o.tag + ">";
795
795
  };
796
- function y(a, t, r, s) {
796
+ function b(a, t, r, s) {
797
797
  a.lastIndex = t;
798
- var i = a.exec(r);
799
- if (i && s && i[1]) {
800
- var g = i[1].length;
801
- i.index += g, i[0] = i[0].slice(g);
798
+ var o = a.exec(r);
799
+ if (o && s && o[1]) {
800
+ var g = o[1].length;
801
+ o.index += g, o[0] = o[0].slice(g);
802
802
  }
803
- return i;
803
+ return o;
804
804
  }
805
- function R(a, t, r, s, i, g) {
806
- for (var p in r)
807
- if (!(!r.hasOwnProperty(p) || !r[p])) {
808
- var d = r[p];
805
+ function R(a, t, r, s, o, g) {
806
+ for (var f in r)
807
+ if (!(!r.hasOwnProperty(f) || !r[f])) {
808
+ var d = r[f];
809
809
  d = Array.isArray(d) ? d : [d];
810
810
  for (var S = 0; S < d.length; ++S) {
811
- if (g && g.cause == p + "," + S)
811
+ if (g && g.cause == f + "," + S)
812
812
  return;
813
- var b = d[S], F = b.inside, ee = !!b.lookbehind, te = !!b.greedy, me = b.alias;
814
- if (te && !b.pattern.global) {
815
- var Se = b.pattern.toString().match(/[imsuy]*$/)[0];
816
- b.pattern = RegExp(b.pattern.source, Se + "g");
813
+ var I = d[S], F = I.inside, ee = !!I.lookbehind, te = !!I.greedy, me = I.alias;
814
+ if (te && !I.pattern.global) {
815
+ var Ae = I.pattern.toString().match(/[imsuy]*$/)[0];
816
+ I.pattern = RegExp(I.pattern.source, Ae + "g");
817
817
  }
818
- for (var ne = b.pattern || b, I = s.next, N = i; I !== t.tail && !(g && N >= g.reach); N += I.value.length, I = I.next) {
819
- var D = I.value;
818
+ for (var ne = I.pattern || I, y = s.next, N = o; y !== t.tail && !(g && N >= g.reach); N += y.value.length, y = y.next) {
819
+ var D = y.value;
820
820
  if (t.length > a.length)
821
821
  return;
822
- if (!(D instanceof h)) {
822
+ if (!(D instanceof m)) {
823
823
  var M = 1, O;
824
824
  if (te) {
825
- if (O = y(ne, N, a, ee), !O || O.index >= a.length)
825
+ if (O = b(ne, N, a, ee), !O || O.index >= a.length)
826
826
  break;
827
- var $ = O.index, Ae = O.index + O[0].length, C = N;
828
- for (C += I.value.length; $ >= C; )
829
- I = I.next, C += I.value.length;
830
- if (C -= I.value.length, N = C, I.value instanceof h)
827
+ var $ = O.index, Se = O.index + O[0].length, C = N;
828
+ for (C += y.value.length; $ >= C; )
829
+ y = y.next, C += y.value.length;
830
+ if (C -= y.value.length, N = C, y.value instanceof m)
831
831
  continue;
832
- for (var P = I; P !== t.tail && (C < Ae || typeof P.value == "string"); P = P.next)
832
+ for (var P = y; P !== t.tail && (C < Se || typeof P.value == "string"); P = P.next)
833
833
  M++, C += P.value.length;
834
834
  M--, D = a.slice(N, C), O.index -= N;
835
- } else if (O = y(ne, 0, D, ee), !O)
835
+ } else if (O = b(ne, 0, D, ee), !O)
836
836
  continue;
837
- var $ = O.index, G = O[0], j = D.slice(0, $), ae = D.slice($ + G.length), K = N + D.length;
837
+ var $ = O.index, B = O[0], j = D.slice(0, $), ae = D.slice($ + B.length), K = N + D.length;
838
838
  g && K > g.reach && (g.reach = K);
839
- var B = I.prev;
840
- j && (B = w(t, B, j), N += j.length), k(t, B, M);
841
- var Te = new h(p, F ? o.tokenize(G, F) : G, me, G);
842
- if (I = w(t, B, Te), ae && w(t, I, ae), M > 1) {
839
+ var G = y.prev;
840
+ j && (G = w(t, G, j), N += j.length), k(t, G, M);
841
+ var Te = new m(f, F ? i.tokenize(B, F) : B, me, B);
842
+ if (y = w(t, G, Te), ae && w(t, y, ae), M > 1) {
843
843
  var q = {
844
- cause: p + "," + S,
844
+ cause: f + "," + S,
845
845
  reach: K
846
846
  };
847
- R(a, t, r, I.prev, N, q), g && q.reach > g.reach && (g.reach = q.reach);
847
+ R(a, t, r, y.prev, N, q), g && q.reach > g.reach && (g.reach = q.reach);
848
848
  }
849
849
  }
850
850
  }
@@ -856,13 +856,13 @@ function Me() {
856
856
  a.next = t, this.head = a, this.tail = t, this.length = 0;
857
857
  }
858
858
  function w(a, t, r) {
859
- var s = t.next, i = { value: r, prev: t, next: s };
860
- return t.next = i, s.prev = i, a.length++, i;
859
+ var s = t.next, o = { value: r, prev: t, next: s };
860
+ return t.next = o, s.prev = o, a.length++, o;
861
861
  }
862
862
  function k(a, t, r) {
863
- for (var s = t.next, i = 0; i < r && s !== a.tail; i++)
863
+ for (var s = t.next, o = 0; o < r && s !== a.tail; o++)
864
864
  s = s.next;
865
- t.next = s, s.prev = t, a.length -= i;
865
+ t.next = s, s.prev = t, a.length -= o;
866
866
  }
867
867
  function L(a) {
868
868
  for (var t = [], r = a.head.next; r !== a.tail; )
@@ -870,20 +870,20 @@ function Me() {
870
870
  return t;
871
871
  }
872
872
  if (!l.document)
873
- return l.addEventListener && (o.disableWorkerMessageHandler || l.addEventListener("message", function(a) {
874
- var t = JSON.parse(a.data), r = t.language, s = t.code, i = t.immediateClose;
875
- l.postMessage(o.highlight(s, o.languages[r], r)), i && l.close();
876
- }, !1)), o;
877
- var m = o.util.currentScript();
878
- m && (o.filename = m.src, m.hasAttribute("data-manual") && (o.manual = !0));
879
- function f() {
880
- o.manual || o.highlightAll();
873
+ return l.addEventListener && (i.disableWorkerMessageHandler || l.addEventListener("message", function(a) {
874
+ var t = JSON.parse(a.data), r = t.language, s = t.code, o = t.immediateClose;
875
+ l.postMessage(i.highlight(s, i.languages[r], r)), o && l.close();
876
+ }, !1)), i;
877
+ var A = i.util.currentScript();
878
+ A && (i.filename = A.src, A.hasAttribute("data-manual") && (i.manual = !0));
879
+ function E() {
880
+ i.manual || i.highlightAll();
881
881
  }
882
- if (!o.manual) {
882
+ if (!i.manual) {
883
883
  var T = document.readyState;
884
- T === "loading" || T === "interactive" && m && m.defer ? document.addEventListener("DOMContentLoaded", f) : window.requestAnimationFrame ? window.requestAnimationFrame(f) : window.setTimeout(f, 16);
884
+ T === "loading" || T === "interactive" && A && A.defer ? document.addEventListener("DOMContentLoaded", E) : window.requestAnimationFrame ? window.requestAnimationFrame(E) : window.setTimeout(E, 16);
885
885
  }
886
- return o;
886
+ return i;
887
887
  })(u);
888
888
  n.exports && (n.exports = e), typeof ie < "u" && (ie.Prism = e), e.languages.markup = {
889
889
  comment: {
@@ -976,32 +976,32 @@ function Me() {
976
976
  * @example
977
977
  * addInlined('style', 'css');
978
978
  */
979
- value: function(c, E) {
980
- var A = {};
981
- A["language-" + E] = {
979
+ value: function(c, p) {
980
+ var h = {};
981
+ h["language-" + p] = {
982
982
  pattern: /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,
983
983
  lookbehind: !0,
984
- inside: e.languages[E]
985
- }, A.cdata = /^<!\[CDATA\[|\]\]>$/i;
986
- var o = {
984
+ inside: e.languages[p]
985
+ }, h.cdata = /^<!\[CDATA\[|\]\]>$/i;
986
+ var i = {
987
987
  "included-cdata": {
988
988
  pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
989
- inside: A
989
+ inside: h
990
990
  }
991
991
  };
992
- o["language-" + E] = {
992
+ i["language-" + p] = {
993
993
  pattern: /[\s\S]+/,
994
- inside: e.languages[E]
994
+ inside: e.languages[p]
995
995
  };
996
- var h = {};
997
- h[c] = {
996
+ var m = {};
997
+ m[c] = {
998
998
  pattern: RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, function() {
999
999
  return c;
1000
1000
  }), "i"),
1001
1001
  lookbehind: !0,
1002
1002
  greedy: !0,
1003
- inside: o
1004
- }, e.languages.insertBefore("markup", "cdata", h);
1003
+ inside: i
1004
+ }, e.languages.insertBefore("markup", "cdata", m);
1005
1005
  }
1006
1006
  }), Object.defineProperty(e.languages.markup.tag, "addAttribute", {
1007
1007
  /**
@@ -1097,8 +1097,8 @@ function Me() {
1097
1097
  },
1098
1098
  punctuation: /[(){};:,]/
1099
1099
  }, l.languages.css.atrule.inside.rest = l.languages.css;
1100
- var E = l.languages.markup;
1101
- E && (E.tag.addInlined("style", "css"), E.tag.addAttribute("style", "css"));
1100
+ var p = l.languages.markup;
1101
+ p && (p.tag.addInlined("style", "css"), p.tag.addAttribute("style", "css"));
1102
1102
  })(e), e.languages.clike = {
1103
1103
  comment: [
1104
1104
  {
@@ -1263,9 +1263,9 @@ function Me() {
1263
1263
  if (typeof e > "u" || typeof document > "u")
1264
1264
  return;
1265
1265
  Element.prototype.matches || (Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector);
1266
- var l = "Loading…", c = function(m, f) {
1267
- return "✖ Error " + m + " while fetching file: " + f;
1268
- }, E = "✖ Error: File does not exist or is empty", A = {
1266
+ var l = "Loading…", c = function(A, E) {
1267
+ return "✖ Error " + A + " while fetching file: " + E;
1268
+ }, p = "✖ Error: File does not exist or is empty", h = {
1269
1269
  js: "javascript",
1270
1270
  py: "python",
1271
1271
  rb: "ruby",
@@ -1275,52 +1275,52 @@ function Me() {
1275
1275
  bat: "batch",
1276
1276
  h: "c",
1277
1277
  tex: "latex"
1278
- }, o = "data-src-status", h = "loading", y = "loaded", R = "failed", v = "pre[data-src]:not([" + o + '="' + y + '"]):not([' + o + '="' + h + '"])';
1279
- function w(m, f, T) {
1278
+ }, i = "data-src-status", m = "loading", b = "loaded", R = "failed", v = "pre[data-src]:not([" + i + '="' + b + '"]):not([' + i + '="' + m + '"])';
1279
+ function w(A, E, T) {
1280
1280
  var a = new XMLHttpRequest();
1281
- a.open("GET", m, !0), a.onreadystatechange = function() {
1282
- a.readyState == 4 && (a.status < 400 && a.responseText ? f(a.responseText) : a.status >= 400 ? T(c(a.status, a.statusText)) : T(E));
1281
+ a.open("GET", A, !0), a.onreadystatechange = function() {
1282
+ a.readyState == 4 && (a.status < 400 && a.responseText ? E(a.responseText) : a.status >= 400 ? T(c(a.status, a.statusText)) : T(p));
1283
1283
  }, a.send(null);
1284
1284
  }
1285
- function k(m) {
1286
- var f = /^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(m || "");
1287
- if (f) {
1288
- var T = Number(f[1]), a = f[2], t = f[3];
1285
+ function k(A) {
1286
+ var E = /^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(A || "");
1287
+ if (E) {
1288
+ var T = Number(E[1]), a = E[2], t = E[3];
1289
1289
  return a ? t ? [T, Number(t)] : [T, void 0] : [T, T];
1290
1290
  }
1291
1291
  }
1292
- e.hooks.add("before-highlightall", function(m) {
1293
- m.selector += ", " + v;
1294
- }), e.hooks.add("before-sanity-check", function(m) {
1295
- var f = (
1292
+ e.hooks.add("before-highlightall", function(A) {
1293
+ A.selector += ", " + v;
1294
+ }), e.hooks.add("before-sanity-check", function(A) {
1295
+ var E = (
1296
1296
  /** @type {HTMLPreElement} */
1297
- m.element
1297
+ A.element
1298
1298
  );
1299
- if (f.matches(v)) {
1300
- m.code = "", f.setAttribute(o, h);
1301
- var T = f.appendChild(document.createElement("CODE"));
1299
+ if (E.matches(v)) {
1300
+ A.code = "", E.setAttribute(i, m);
1301
+ var T = E.appendChild(document.createElement("CODE"));
1302
1302
  T.textContent = l;
1303
- var a = f.getAttribute("data-src"), t = m.language;
1303
+ var a = E.getAttribute("data-src"), t = A.language;
1304
1304
  if (t === "none") {
1305
1305
  var r = (/\.(\w+)$/.exec(a) || [, "none"])[1];
1306
- t = A[r] || r;
1306
+ t = h[r] || r;
1307
1307
  }
1308
- e.util.setLanguage(T, t), e.util.setLanguage(f, t);
1308
+ e.util.setLanguage(T, t), e.util.setLanguage(E, t);
1309
1309
  var s = e.plugins.autoloader;
1310
1310
  s && s.loadLanguages(t), w(
1311
1311
  a,
1312
- function(i) {
1313
- f.setAttribute(o, y);
1314
- var g = k(f.getAttribute("data-range"));
1312
+ function(o) {
1313
+ E.setAttribute(i, b);
1314
+ var g = k(E.getAttribute("data-range"));
1315
1315
  if (g) {
1316
- var p = i.split(/\r\n?|\n/g), d = g[0], S = g[1] == null ? p.length : g[1];
1317
- d < 0 && (d += p.length), d = Math.max(0, Math.min(d - 1, p.length)), S < 0 && (S += p.length), S = Math.max(0, Math.min(S, p.length)), i = p.slice(d, S).join(`
1318
- `), f.hasAttribute("data-start") || f.setAttribute("data-start", String(d + 1));
1316
+ var f = o.split(/\r\n?|\n/g), d = g[0], S = g[1] == null ? f.length : g[1];
1317
+ d < 0 && (d += f.length), d = Math.max(0, Math.min(d - 1, f.length)), S < 0 && (S += f.length), S = Math.max(0, Math.min(S, f.length)), o = f.slice(d, S).join(`
1318
+ `), E.hasAttribute("data-start") || E.setAttribute("data-start", String(d + 1));
1319
1319
  }
1320
- T.textContent = i, e.highlightElement(T);
1320
+ T.textContent = o, e.highlightElement(T);
1321
1321
  },
1322
- function(i) {
1323
- f.setAttribute(o, R), T.textContent = i;
1322
+ function(o) {
1323
+ E.setAttribute(i, R), T.textContent = o;
1324
1324
  }
1325
1325
  );
1326
1326
  }
@@ -1332,8 +1332,8 @@ function Me() {
1332
1332
  *
1333
1333
  * @param {ParentNode} [container=document]
1334
1334
  */
1335
- highlight: function(f) {
1336
- for (var T = (f || document).querySelectorAll(v), a = 0, t; t = T[a++]; )
1335
+ highlight: function(E) {
1336
+ for (var T = (E || document).querySelectorAll(v), a = 0, t; t = T[a++]; )
1337
1337
  e.highlightElement(t);
1338
1338
  }
1339
1339
  };
@@ -1347,7 +1347,7 @@ function Me() {
1347
1347
  var $e = Me();
1348
1348
  const ue = /* @__PURE__ */ Ue($e);
1349
1349
  var le = {}, ce;
1350
- function Ge() {
1350
+ function Be() {
1351
1351
  return ce || (ce = 1, Prism.languages.python = {
1352
1352
  comment: {
1353
1353
  pattern: /(^|[^\\])#.*/,
@@ -1410,9 +1410,9 @@ function Ge() {
1410
1410
  punctuation: /[{}[\];(),.:]/
1411
1411
  }, Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest = Prism.languages.python, Prism.languages.py = Prism.languages.python), le;
1412
1412
  }
1413
- Ge();
1413
+ Be();
1414
1414
  var de = {}, ge;
1415
- function Be() {
1415
+ function Ge() {
1416
1416
  return ge || (ge = 1, (function(n) {
1417
1417
  n.languages.typescript = n.languages.extend("javascript", {
1418
1418
  "class-name": {
@@ -1459,7 +1459,7 @@ function Be() {
1459
1459
  }), n.languages.ts = n.languages.typescript;
1460
1460
  })(Prism)), de;
1461
1461
  }
1462
- Be();
1462
+ Ge();
1463
1463
  (function(n) {
1464
1464
  var u = "\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b", e = {
1465
1465
  pattern: /(^(["']?)\w+\2)[ \t]+\S.*/,
@@ -1675,8 +1675,8 @@ Be();
1675
1675
  "operator",
1676
1676
  "punctuation",
1677
1677
  "number"
1678
- ], E = l.variable[1].inside, A = 0; A < c.length; A++)
1679
- E[c[A]] = n.languages.bash[c[A]];
1678
+ ], p = l.variable[1].inside, h = 0; h < c.length; h++)
1679
+ p[c[h]] = n.languages.bash[c[h]];
1680
1680
  n.languages.sh = n.languages.bash, n.languages.shell = n.languages.bash;
1681
1681
  })(Prism);
1682
1682
  Prism.languages.json = {
@@ -1871,15 +1871,15 @@ Object.defineProperty(Prism.languages.markup.tag, "addInlined", {
1871
1871
  pattern: /[\s\S]+/,
1872
1872
  inside: Prism.languages[e]
1873
1873
  };
1874
- var E = {};
1875
- E[u] = {
1874
+ var p = {};
1875
+ p[u] = {
1876
1876
  pattern: RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, function() {
1877
1877
  return u;
1878
1878
  }), "i"),
1879
1879
  lookbehind: !0,
1880
1880
  greedy: !0,
1881
1881
  inside: c
1882
- }, Prism.languages.insertBefore("markup", "cdata", E);
1882
+ }, Prism.languages.insertBefore("markup", "cdata", p);
1883
1883
  }
1884
1884
  });
1885
1885
  Object.defineProperty(Prism.languages.markup.tag, "addAttribute", {
@@ -1981,19 +1981,19 @@ const he = new Y.Renderer();
1981
1981
  he.code = ({ text: n, lang: u }) => {
1982
1982
  const e = u ? He[u] || u : "plaintext", l = ue.languages[e];
1983
1983
  if (l) {
1984
- const E = ue.highlight(n, l, e);
1985
- return `<pre><code class="language-${e}">${E}</code></pre>`;
1984
+ const p = ue.highlight(n, l, e);
1985
+ return `<pre><code class="language-${e}">${p}</code></pre>`;
1986
1986
  }
1987
1987
  return `<pre><code>${n.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")}</code></pre>`;
1988
1988
  };
1989
1989
  Y.use({ renderer: he });
1990
- function gt(n) {
1990
+ function Et(n) {
1991
1991
  return Y.parse(n);
1992
1992
  }
1993
- function pt(n) {
1993
+ function ht(n) {
1994
1994
  return n < 1024 ? `${n} B` : n < 1024 * 1024 ? `${(n / 1024).toFixed(1)} KB` : `${(n / (1024 * 1024)).toFixed(1)} MB`;
1995
1995
  }
1996
- function ft(n) {
1996
+ function mt(n) {
1997
1997
  return Ee.includes(n.type) ? n.size > we ? "File exceeds the 10MB size limit." : null : `File type "${n.type}" is not supported.`;
1998
1998
  }
1999
1999
  async function ze({
@@ -2002,24 +2002,24 @@ async function ze({
2002
2002
  fileName: e,
2003
2003
  fileType: l,
2004
2004
  fileSize: c,
2005
- baseUrl: E
2005
+ baseUrl: p
2006
2006
  }) {
2007
- const A = await Q(), o = await fetch(Le(E), {
2007
+ const h = await Q(), i = await fetch(Le(p), {
2008
2008
  method: "POST",
2009
2009
  headers: {
2010
2010
  "Content-Type": "application/json",
2011
2011
  "X-Api-Key": n,
2012
- ...A ? { Authorization: `Bearer ${A}` } : {}
2012
+ ...h ? { Authorization: `Bearer ${h}` } : {}
2013
2013
  },
2014
2014
  body: JSON.stringify({ threadId: u, fileName: e, fileType: l, fileSize: c })
2015
2015
  });
2016
- if (!o.ok) {
2017
- const h = await o.json().catch(() => ({}));
2016
+ if (!i.ok) {
2017
+ const m = await i.json().catch(() => ({}));
2018
2018
  throw new Error(
2019
- h.error || `Upload URL request failed: ${o.status}`
2019
+ m.error || `Upload URL request failed: ${i.status}`
2020
2020
  );
2021
2021
  }
2022
- return o.json();
2022
+ return i.json();
2023
2023
  }
2024
2024
  async function Ye(n, u) {
2025
2025
  const e = await fetch(n, {
@@ -2030,13 +2030,13 @@ async function Ye(n, u) {
2030
2030
  if (!e.ok)
2031
2031
  throw new Error(`Storage upload failed: ${e.status}`);
2032
2032
  }
2033
- async function Et({
2033
+ async function At({
2034
2034
  publishableApiKey: n,
2035
2035
  threadId: u,
2036
2036
  file: e,
2037
2037
  baseUrl: l
2038
2038
  }) {
2039
- const { uploadUrl: c, storagePath: E } = await ze({
2039
+ const { uploadUrl: c, storagePath: p } = await ze({
2040
2040
  publishableApiKey: n,
2041
2041
  threadId: u,
2042
2042
  fileName: e.name,
@@ -2044,9 +2044,9 @@ async function Et({
2044
2044
  fileSize: e.size,
2045
2045
  baseUrl: l
2046
2046
  });
2047
- return await Ye(c, e), { fileName: e.name, fileType: e.type, fileSize: e.size, storagePath: E };
2047
+ return await Ye(c, e), { fileName: e.name, fileType: e.type, fileSize: e.size, storagePath: p };
2048
2048
  }
2049
- async function ht({
2049
+ async function St({
2050
2050
  publishableApiKey: n,
2051
2051
  storagePath: u,
2052
2052
  baseUrl: e
@@ -2078,7 +2078,6 @@ const We = "https://005d25250a41bd0071570b0c0a2b2c4d@o4510467570073600.ingest.us
2078
2078
  "knest"
2079
2079
  ];
2080
2080
  function je(n) {
2081
- if (n.tags?.source === "knest-widget") return !0;
2082
2081
  const u = n.exception?.values?.[0]?.stacktrace?.frames;
2083
2082
  return !u || u.length === 0 ? !1 : u.some((e) => {
2084
2083
  const l = e.filename || "";
@@ -2086,7 +2085,7 @@ function je(n) {
2086
2085
  });
2087
2086
  }
2088
2087
  let pe = !1;
2089
- function mt() {
2088
+ function Tt() {
2090
2089
  pe || (Z.init({
2091
2090
  dsn: We,
2092
2091
  // Only capture errors, not performance data.
@@ -2100,42 +2099,54 @@ function mt() {
2100
2099
  xhr: !1
2101
2100
  })
2102
2101
  ],
2103
- // Tag all events as coming from the widget.
2104
- initialScope: {
2105
- tags: {
2106
- source: "knest-widget"
2107
- }
2108
- },
2109
- // Filter out errors that don't originate from our widget code.
2102
+ // Filter out errors that don't originate from our widget code, then stamp the
2103
+ // source tag so all events reaching Sentry are identifiable as widget errors.
2104
+ // NOTE: we do NOT use initialScope to set this tag — that would apply it to every
2105
+ // event the SDK captures (including host-page errors via GlobalHandlers/onerror),
2106
+ // which would bypass the isWidgetError check and let customer errors through.
2110
2107
  beforeSend(n) {
2111
- return je(n) ? n : null;
2108
+ return je(n) ? (n.tags = { ...n.tags, source: "knest-widget" }, n) : null;
2112
2109
  }
2113
2110
  }), pe = !0);
2114
2111
  }
2115
- function St(n, u) {
2112
+ function bt(n, u) {
2116
2113
  const e = typeof n == "string" ? new Error(n) : n;
2117
2114
  Z.captureException(e, {
2118
2115
  tags: { source: "knest-widget" },
2119
2116
  extra: u
2120
2117
  });
2121
2118
  }
2122
- function At(n, u) {
2123
- const e = xe();
2124
- if (!e)
2125
- return () => {
2126
- };
2127
- const l = e.channel(`thread:${n}`).on("broadcast", { event: "new-message" }, (c) => {
2128
- u(c.payload);
2129
- }).subscribe();
2130
- return () => {
2131
- l.unsubscribe();
2119
+ function It(n, u, e) {
2120
+ const l = xe();
2121
+ if (!l) return () => {
2122
+ };
2123
+ const c = e?.role === "visitor" ? "agent" : "visitor";
2124
+ let p = l.channel(`thread:${n}`).on("broadcast", { event: "new-message" }, (h) => {
2125
+ u(h.payload);
2126
+ });
2127
+ if (e) {
2128
+ const { onPresenceChange: h } = e;
2129
+ p = p.on("presence", { event: "sync" }, () => {
2130
+ try {
2131
+ const i = p.presenceState(), m = Object.values(i).flat().some((b) => b.type === c);
2132
+ h(m);
2133
+ } catch {
2134
+ }
2135
+ });
2136
+ }
2137
+ return p.subscribe((h) => {
2138
+ h === "SUBSCRIBED" && e && p.track({ type: e.role }).catch(() => {
2139
+ });
2140
+ }), () => {
2141
+ e && p.untrack().catch(() => {
2142
+ }), p.unsubscribe();
2132
2143
  };
2133
2144
  }
2134
2145
  const Ke = "knest-widget-chat-", qe = 14400 * 1e3, Ve = 300, U = /* @__PURE__ */ new Map();
2135
2146
  function z(n) {
2136
2147
  return Ke + n;
2137
2148
  }
2138
- function Tt(n) {
2149
+ function yt(n) {
2139
2150
  try {
2140
2151
  const u = localStorage.getItem(z(n));
2141
2152
  if (!u) return null;
@@ -2151,7 +2162,7 @@ function Ze(n, u) {
2151
2162
  } catch {
2152
2163
  }
2153
2164
  }
2154
- function bt(n, u) {
2165
+ function Rt(n, u) {
2155
2166
  const e = U.get(n);
2156
2167
  e !== void 0 && clearTimeout(e);
2157
2168
  const l = setTimeout(() => {
@@ -2159,7 +2170,7 @@ function bt(n, u) {
2159
2170
  }, Ve);
2160
2171
  U.set(n, l);
2161
2172
  }
2162
- function It(n) {
2173
+ function Ot(n) {
2163
2174
  const u = U.get(n);
2164
2175
  u !== void 0 && (clearTimeout(u), U.delete(n));
2165
2176
  try {
@@ -2181,34 +2192,37 @@ export {
2181
2192
  st as DEFAULT_EXAMPLE_QUESTIONS,
2182
2193
  rt as DEFAULT_WELCOME_MESSAGE,
2183
2194
  Re as FALLBACK_ERROR_MESSAGE,
2195
+ lt as HUMAN_TAKEOVER_CAPTION,
2184
2196
  ot as MAX_ATTACHMENTS_PER_MESSAGE,
2185
2197
  we as MAX_ATTACHMENT_SIZE_BYTES,
2198
+ dt as PRESENCE_LABEL_DASHBOARD,
2199
+ ct as PRESENCE_LABEL_WIDGET,
2186
2200
  tt as PUBLIC_SUPABASE_PUBLISHABLE_KEY,
2187
2201
  et as PUBLIC_SUPABASE_URL,
2188
2202
  Ne as USAGE_LIMIT_MESSAGE,
2189
- St as captureWidgetException,
2190
- It as clearChatState,
2191
- ht as fetchSignedUrl,
2192
- lt as fetchWidgetConfig,
2193
- gt as formatContent,
2194
- pt as formatFileSize,
2203
+ bt as captureWidgetException,
2204
+ Ot as clearChatState,
2205
+ St as fetchSignedUrl,
2206
+ gt as fetchWidgetConfig,
2207
+ Et as formatContent,
2208
+ ht as formatFileSize,
2195
2209
  Q as getAccessToken,
2196
2210
  Fe as getAttachmentSignedUrlEndpoint,
2197
2211
  Le as getAttachmentUploadUrl,
2198
2212
  Ie as getChatApiUrl,
2199
2213
  ye as getConfigApiUrl,
2200
2214
  xe as getSupabaseClient,
2201
- ct as initWidgetAuth,
2202
- mt as initWidgetSentry,
2215
+ pt as initWidgetAuth,
2216
+ Tt as initWidgetSentry,
2203
2217
  Pe as isAuthenticated,
2204
2218
  ut as isImageType,
2205
- Tt as loadChatState,
2219
+ yt as loadChatState,
2206
2220
  ze as requestUploadUrl,
2207
2221
  Ze as saveChatState,
2208
- bt as saveChatStateDebounced,
2209
- dt as streamChatMessage,
2210
- At as subscribeToThread,
2211
- Et as uploadAttachment,
2222
+ Rt as saveChatStateDebounced,
2223
+ ft as streamChatMessage,
2224
+ It as subscribeToThread,
2225
+ At as uploadAttachment,
2212
2226
  Ye as uploadToStorage,
2213
- ft as validateAttachment
2227
+ mt as validateAttachment
2214
2228
  };
@@ -6,11 +6,19 @@ export interface BroadcastMessage {
6
6
  metadata: Record<string, unknown>;
7
7
  created_at: string;
8
8
  }
9
+ export interface PresenceOptions {
10
+ role: 'visitor' | 'agent';
11
+ onPresenceChange: (isOtherOnline: boolean) => void;
12
+ }
9
13
  /**
10
14
  * Subscribes to broadcast messages on a thread channel.
11
- * Used by the widget to receive real-time human agent replies.
15
+ * Optionally co-tracks presence on the same channel to show online indicators.
16
+ *
17
+ * Presence is fully best-effort: `track()` is fire-and-forget, the sync handler is
18
+ * guarded with try/catch, and the subscribe callback is kept synchronous so that no
19
+ * presence error can ever disrupt broadcast delivery.
12
20
  *
13
- * @returns Unsubscribe function to call on cleanup.
21
+ * @returns Cleanup function call on component destroy.
14
22
  */
15
- export declare function subscribeToThread(threadId: string, onMessage: (message: BroadcastMessage) => void): () => void;
23
+ export declare function subscribeToThread(threadId: string, onMessage: (message: BroadcastMessage) => void, presence?: PresenceOptions): () => void;
16
24
  //# sourceMappingURL=realtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAC5C,MAAM,IAAI,CAgBZ"}
1
+ {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../src/realtime.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC;IAC1B,gBAAgB,EAAE,CAAC,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;CACnD;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAChC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,EAC9C,QAAQ,CAAC,EAAE,eAAe,GACxB,MAAM,IAAI,CAwCZ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@useknest/widget-core",
3
- "version": "0.1.0-beta.14",
3
+ "version": "0.1.0-beta.16",
4
4
  "type": "module",
5
5
  "description": "Core business logic for Knest chat widget",
6
6
  "files": [