@pagelines/sdk 1.0.224 → 1.0.225

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/agent.js CHANGED
@@ -1,10 +1,10 @@
1
1
  var A = Object.defineProperty;
2
2
  var c = (e, r) => A(e, "name", { value: r, configurable: !0 });
3
- import { _ as C, a as M } from "./AgentWrap.vue_vue_type_script_setup_true_lang-cp5oaca2.js";
4
- import { b as K, A as L, A as Q, E as R } from "./AgentWrap.vue_vue_type_script_setup_true_lang-cp5oaca2.js";
3
+ import { _ as C, a as M } from "./AgentWrap.vue_vue_type_script_setup_true_lang-BThCK162.js";
4
+ import { b as K, A as L, A as Q, E as R } from "./AgentWrap.vue_vue_type_script_setup_true_lang-BThCK162.js";
5
5
  import { defineComponent as x, createBlock as g, openBlock as l, withCtx as b, createElementVNode as o, createVNode as $, ref as h, watch as z, nextTick as E, createElementBlock as f, createCommentVNode as u, normalizeClass as p, normalizeStyle as N } from "vue";
6
6
  import { _ as B } from "./FModal.vue_vue_type_script_setup_true_lang-cL0BFEkZ.js";
7
- import { _ } from "./AgentProvider.vue_vue_type_script_setup_true_lang-Dpr65Ysi.js";
7
+ import { _ } from "./AgentProvider.vue_vue_type_script_setup_true_lang-Cg6HUUjN.js";
8
8
  import { Agent as Y } from "@pagelines/core";
9
9
  const T = { class: "relative w-full h-[80vh] md:h-[600px]" }, F = /* @__PURE__ */ x({
10
10
  name: "AgentModal",
package/dist/sdk.js CHANGED
@@ -1,4 +1,4 @@
1
- import { A as t, C as r, P as s, U as o } from "./sdkClient-DVubPmNq.js";
1
+ import { A as t, C as r, P as s, U as o } from "./sdkClient-Cxrx9Fsc.js";
2
2
  import { MediaSchema as i } from "@pagelines/core";
3
3
  import { S as m } from "./socialPlatforms-Ck-b3SnQ.js";
4
4
  export {
@@ -1,19 +1,19 @@
1
- var M = Object.defineProperty;
2
- var J = (i, t, e) => t in i ? M(i, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : i[t] = e;
3
- var c = (i, t) => M(i, "name", { value: t, configurable: !0 });
4
- var a = (i, t, e) => J(i, typeof t != "symbol" ? t + "" : t, e);
5
- import { cookieUtil as w, APP_PORT as z, APP_PROD_URL as Q, createLogger as K, objectId as T, SettingsObject as V } from "@pagelines/core";
6
- import { watch as N, ref as k, computed as W } from "vue";
7
- import { hc as H } from "hono/client";
8
- function E(i, t) {
9
- return i || (t ? `http://localhost:${z}` : Q);
1
+ var N = Object.defineProperty;
2
+ var z = (i, t, e) => t in i ? N(i, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : i[t] = e;
3
+ var c = (i, t) => N(i, "name", { value: t, configurable: !0 });
4
+ var a = (i, t, e) => z(i, typeof t != "symbol" ? t + "" : t, e);
5
+ import { cookieUtil as x, APP_PORT as H, APP_PROD_URL as K, createLogger as Q, objectId as $, SettingsObject as V } from "@pagelines/core";
6
+ import { watch as M, ref as S, computed as W } from "vue";
7
+ import { hc as X } from "hono/client";
8
+ function T(i, t) {
9
+ return i || (t ? `http://localhost:${H}` : K);
10
10
  }
11
- c(E, "resolveApiBase");
12
- function X(i, t) {
13
- const e = E(i.apiBase, i.isDev);
14
- return H(e, {
11
+ c(T, "resolveApiBase");
12
+ function Y(i, t) {
13
+ const e = T(i.apiBase, i.isDev);
14
+ return X(e, {
15
15
  fetch: /* @__PURE__ */ c(async (o, s) => {
16
- const g = w.getAuthToken(), d = await fetch(o, {
16
+ const g = x.getAuthToken(), d = await fetch(o, {
17
17
  ...s,
18
18
  headers: {
19
19
  ...s?.headers,
@@ -35,9 +35,9 @@ function X(i, t) {
35
35
  }, "fetch")
36
36
  });
37
37
  }
38
- c(X, "createApiClient");
39
- let Y = /* @__PURE__ */ Symbol("clean"), h = [], f = 0;
40
- const S = 4, q = /* @__PURE__ */ c(/* @__NO_SIDE_EFFECTS__ */ (i) => {
38
+ c(Y, "createApiClient");
39
+ let Z = /* @__PURE__ */ Symbol("clean"), h = [], f = 0;
40
+ const U = 4, J = /* @__PURE__ */ c(/* @__NO_SIDE_EFFECTS__ */ (i) => {
41
41
  let t = [], e = {
42
42
  get() {
43
43
  return e.lc || e.listen(() => {
@@ -46,8 +46,8 @@ const S = 4, q = /* @__PURE__ */ c(/* @__NO_SIDE_EFFECTS__ */ (i) => {
46
46
  lc: 0,
47
47
  listen(r) {
48
48
  return e.lc = t.push(r), () => {
49
- for (let s = f + S; s < h.length; )
50
- h[s] === r ? h.splice(s, S) : s += S;
49
+ for (let s = f + U; s < h.length; )
50
+ h[s] === r ? h.splice(s, U) : s += U;
51
51
  let o = t.indexOf(r);
52
52
  ~o && (t.splice(o, 1), --e.lc || e.off());
53
53
  };
@@ -57,7 +57,7 @@ const S = 4, q = /* @__PURE__ */ c(/* @__NO_SIDE_EFFECTS__ */ (i) => {
57
57
  for (let g of t)
58
58
  h.push(g, e.value, r, o);
59
59
  if (s) {
60
- for (f = 0; f < h.length; f += S)
60
+ for (f = 0; f < h.length; f += U)
61
61
  h[f](
62
62
  h[f + 1],
63
63
  h[f + 2],
@@ -80,12 +80,12 @@ const S = 4, q = /* @__PURE__ */ c(/* @__NO_SIDE_EFFECTS__ */ (i) => {
80
80
  },
81
81
  value: i
82
82
  };
83
- return process.env.NODE_ENV !== "production" && (e[Y] = () => {
83
+ return process.env.NODE_ENV !== "production" && (e[Z] = () => {
84
84
  t = [], e.lc = 0, e.off();
85
85
  }), e;
86
- }, "atom"), b = /* @__PURE__ */ q(void 0), U = /* @__PURE__ */ q(null), P = class P {
86
+ }, "atom"), y = globalThis, b = y.__PL_AUTH_USER__ ?? (y.__PL_AUTH_USER__ = /* @__PURE__ */ J(void 0)), A = y.__PL_AUTH_TOKEN__ ?? (y.__PL_AUTH_TOKEN__ = /* @__PURE__ */ J(null)), R = class R {
87
87
  constructor() {
88
- a(this, "logger", K("SDKStorage"));
88
+ a(this, "logger", Q("SDKStorage"));
89
89
  }
90
90
  /**
91
91
  * Check if localStorage is fully functional (some test environments provide partial mocks)
@@ -97,14 +97,14 @@ const S = 4, q = /* @__PURE__ */ c(/* @__NO_SIDE_EFFECTS__ */ (i) => {
97
97
  * Sync Vue reactive refs with global nanostores for cross-page persistence
98
98
  */
99
99
  syncWithGlobalStores(t, e) {
100
- const r = b.get(), o = U.get();
101
- r && (t.value = r), o && (e.value = o), N(t, (s) => {
100
+ const r = b.get(), o = A.get();
101
+ r && (t.value = r), o && (e.value = o), M(t, (s) => {
102
102
  b.set(s);
103
- }, { immediate: !0 }), N(e, (s) => {
104
- U.set(s);
103
+ }, { immediate: !0 }), M(e, (s) => {
104
+ A.set(s);
105
105
  }, { immediate: !0 }), b.subscribe((s) => {
106
106
  s !== t.value && (t.value = s);
107
- }), U.subscribe((s) => {
107
+ }), A.subscribe((s) => {
108
108
  s !== e.value && (e.value = s);
109
109
  });
110
110
  }
@@ -114,7 +114,7 @@ const S = 4, q = /* @__PURE__ */ c(/* @__NO_SIDE_EFFECTS__ */ (i) => {
114
114
  loadFromStorage(t, e) {
115
115
  if (typeof window > "u")
116
116
  return;
117
- const r = w.getAuthToken();
117
+ const r = x.getAuthToken();
118
118
  if (r && (e.value = r), this.isLocalStorageFunctional())
119
119
  try {
120
120
  const o = localStorage.getItem("pagelines-user");
@@ -127,7 +127,7 @@ const S = 4, q = /* @__PURE__ */ c(/* @__NO_SIDE_EFFECTS__ */ (i) => {
127
127
  * Save current user and token to browser storage
128
128
  */
129
129
  saveToStorage(t, e) {
130
- if (!(typeof window > "u") && (e.value ? w.setAuthToken(e.value) : w.removeAuthToken(), this.isLocalStorageFunctional()))
130
+ if (!(typeof window > "u") && (e.value ? x.setAuthToken(e.value) : x.removeAuthToken(), this.isLocalStorageFunctional()))
131
131
  try {
132
132
  t.value ? localStorage.setItem("pagelines-user", JSON.stringify(t.value)) : localStorage.removeItem("pagelines-user");
133
133
  } catch (r) {
@@ -139,13 +139,13 @@ const S = 4, q = /* @__PURE__ */ c(/* @__NO_SIDE_EFFECTS__ */ (i) => {
139
139
  */
140
140
  clearStorage() {
141
141
  if (!(typeof window > "u")) {
142
- if (w.removeAuthToken(), this.isLocalStorageFunctional())
142
+ if (x.removeAuthToken(), this.isLocalStorageFunctional())
143
143
  try {
144
144
  localStorage.removeItem("pagelines-user");
145
145
  } catch (t) {
146
146
  this.logger.error("Failed to clear user from localStorage", { data: t });
147
147
  }
148
- b.set(void 0), U.set(null);
148
+ b.set(void 0), A.set(null);
149
149
  }
150
150
  }
151
151
  /**
@@ -172,8 +172,8 @@ const S = 4, q = /* @__PURE__ */ c(/* @__NO_SIDE_EFFECTS__ */ (i) => {
172
172
  }
173
173
  }
174
174
  };
175
- c(P, "SDKStorage");
176
- let $ = P;
175
+ c(R, "SDKStorage");
176
+ let j = R;
177
177
  async function p(i, t) {
178
178
  i.loading.value = !0, i.error.value = null;
179
179
  try {
@@ -183,7 +183,7 @@ async function p(i, t) {
183
183
  }
184
184
  }
185
185
  c(p, "withLoadingState");
186
- const D = class D {
186
+ const _ = class _ {
187
187
  constructor(t) {
188
188
  this.ctx = t;
189
189
  }
@@ -287,7 +287,7 @@ const D = class D {
287
287
  this.ctx.logger.error("loginWithGoogle: Only available in browser");
288
288
  return;
289
289
  }
290
- const e = E(this.ctx.apiBase, this.ctx.isDev), r = window.location.origin, o = `${e}/auth/google-popup?origin=${encodeURIComponent(r)}`, s = 500, g = 600, d = window.screenX + (window.outerWidth - s) / 2, v = window.screenY + (window.outerHeight - g) / 2, n = window.open(
290
+ const e = T(this.ctx.apiBase, this.ctx.isDev), r = window.location.origin, o = `${e}/auth/google-popup?origin=${encodeURIComponent(r)}`, s = 500, g = 600, d = window.screenX + (window.outerWidth - s) / 2, v = window.screenY + (window.outerHeight - g) / 2, n = window.open(
291
291
  o,
292
292
  "google-auth",
293
293
  `width=${s},height=${g},left=${d},top=${v},popup=yes`
@@ -298,12 +298,12 @@ const D = class D {
298
298
  return;
299
299
  }
300
300
  const m = /* @__PURE__ */ c((l) => {
301
- const I = new URL(e).origin;
302
- if (l.origin === I) {
301
+ const k = new URL(e).origin;
302
+ if (l.origin === k) {
303
303
  if (l.data?.type === "auth-success") {
304
304
  window.removeEventListener("message", m);
305
- const { token: u, user: y } = l.data;
306
- this.ctx.processApiResponse({ ok: !0, data: {}, token: u, user: y }), this.ctx.logger.info("Google login successful"), t?.onSuccess?.(y);
305
+ const { token: u, user: w } = l.data;
306
+ this.ctx.processApiResponse({ ok: !0, data: {}, token: u, user: w }), this.ctx.logger.info("Google login successful"), t?.onSuccess?.(w);
307
307
  } else if (l.data?.type === "auth-error") {
308
308
  window.removeEventListener("message", m);
309
309
  const u = l.data.error || "Google authentication failed";
@@ -312,19 +312,19 @@ const D = class D {
312
312
  }
313
313
  }, "handler");
314
314
  window.addEventListener("message", m);
315
- const x = setInterval(() => {
316
- n.closed && (clearInterval(x), window.removeEventListener("message", m));
315
+ const I = setInterval(() => {
316
+ n.closed && (clearInterval(I), window.removeEventListener("message", m));
317
317
  }, 500);
318
318
  }
319
319
  };
320
- c(D, "AuthClient");
321
- let j = D;
322
- const R = class R {
320
+ c(_, "AuthClient");
321
+ let C = _;
322
+ const D = class D {
323
323
  constructor(t) {
324
324
  this.ctx = t;
325
325
  }
326
326
  async chatStream(t) {
327
- const r = `${E(this.ctx.apiBase, this.ctx.isDev)}/api/agent/public/${encodeURIComponent(t.handle)}/chat/stream`;
327
+ const r = `${T(this.ctx.apiBase, this.ctx.isDev)}/api/agent/public/${encodeURIComponent(t.handle)}/chat/stream`;
328
328
  try {
329
329
  const o = await fetch(r, {
330
330
  method: "POST",
@@ -355,26 +355,26 @@ const R = class R {
355
355
  if (n)
356
356
  break;
357
357
  d += g.decode(m, { stream: !0 });
358
- const x = d.split(`
358
+ const I = d.split(`
359
359
  `);
360
- d = x.pop() || "";
361
- for (const l of x) {
360
+ d = I.pop() || "";
361
+ for (const l of I) {
362
362
  if (!l.startsWith("data: "))
363
363
  continue;
364
- const I = l.slice(6).trim();
365
- if (I === "[DONE]") {
364
+ const k = l.slice(6).trim();
365
+ if (k === "[DONE]") {
366
366
  t.onDone(v);
367
367
  return;
368
368
  }
369
369
  try {
370
- const u = JSON.parse(I);
370
+ const u = JSON.parse(k);
371
371
  if (u.pl_status) {
372
372
  t.onStatus?.(u.pl_status);
373
373
  continue;
374
374
  }
375
375
  u.pl_metadata?.conversationId && (v = u.pl_metadata.conversationId);
376
- const y = u.choices?.[0]?.delta;
377
- y?.content && t.onDelta(y.content);
376
+ const w = u.choices?.[0]?.delta;
377
+ w?.content && t.onDelta(w.content);
378
378
  } catch {
379
379
  }
380
380
  }
@@ -385,7 +385,7 @@ const R = class R {
385
385
  }
386
386
  }
387
387
  async chatMessage(t) {
388
- const r = `${E(this.ctx.apiBase, this.ctx.isDev)}/api/agent/public/${encodeURIComponent(t.handle)}/chat`;
388
+ const r = `${T(this.ctx.apiBase, this.ctx.isDev)}/api/agent/public/${encodeURIComponent(t.handle)}/chat`;
389
389
  try {
390
390
  const s = await (await fetch(r, {
391
391
  method: "POST",
@@ -411,8 +411,8 @@ const R = class R {
411
411
  }
412
412
  }
413
413
  };
414
- c(R, "ChatClient");
415
- let C = R;
414
+ c(D, "ChatClient");
415
+ let P = D;
416
416
  const O = class O {
417
417
  constructor(t) {
418
418
  this.ctx = t;
@@ -456,7 +456,7 @@ const O = class O {
456
456
  generateAnonId() {
457
457
  const t = "pagelinesAnonId";
458
458
  let e = this.ctx.storage.getItem(t);
459
- return e || (e = T({ prefix: "anon" }), this.ctx.storage.setItem(t, e)), e;
459
+ return e || (e = $({ prefix: "anon" }), this.ctx.storage.setItem(t, e)), e;
460
460
  }
461
461
  track(t) {
462
462
  try {
@@ -490,22 +490,22 @@ const G = class G {
490
490
  };
491
491
  c(G, "SDKGlobal");
492
492
  let B = G;
493
- const A = new B(), L = class L extends V {
493
+ const E = new B(), L = class L extends V {
494
494
  constructor(e = {}) {
495
- const r = A.get();
495
+ const r = E.get();
496
496
  if (r)
497
497
  return console.debug("[PageLinesSDK] Returning existing singleton instance"), r;
498
498
  super("PageLinesSDK", e);
499
499
  // Vue reactive state
500
- a(this, "activeUser", k());
501
- a(this, "token", k(null));
502
- a(this, "loading", k(!1));
503
- a(this, "error", k(null));
500
+ a(this, "activeUser", S());
501
+ a(this, "token", S(null));
502
+ a(this, "loading", S(!1));
503
+ a(this, "error", S(null));
504
504
  a(this, "apiBase", this.settings.apiBase || void 0);
505
505
  // Storage handler for persistence
506
- a(this, "storage", new $());
506
+ a(this, "storage", new j());
507
507
  // Auto-managed session ID for usage tracking
508
- a(this, "sessionId", T({ prefix: "ses" }));
508
+ a(this, "sessionId", $({ prefix: "ses" }));
509
509
  // Typed Hono RPC client - uses SDKAppType (auth/self/usage routes only)
510
510
  // Initialized in constructor (definite assignment via singleton pattern)
511
511
  a(this, "apiClient");
@@ -533,7 +533,7 @@ const A = new B(), L = class L extends V {
533
533
  a(this, "auth");
534
534
  a(this, "chat");
535
535
  a(this, "user");
536
- A.set(this), this.apiClient = X(
536
+ E.set(this), this.apiClient = Y(
537
537
  { isDev: this.isDev, apiBase: this.apiBase },
538
538
  this.processApiResponse.bind(this)
539
539
  );
@@ -551,7 +551,7 @@ const A = new B(), L = class L extends V {
551
551
  logger: this.logger,
552
552
  processApiResponse: this.processApiResponse.bind(this)
553
553
  };
554
- this.auth = new j(o), this.chat = new C(o), this.user = new F(o), this.logger.info("PageLinesSDK initialized"), this.storage.loadFromStorage(this.activeUser, this.token), this.storage.syncWithGlobalStores(this.activeUser, this.token), this.initialized = new Promise((s) => {
554
+ this.auth = new C(o), this.chat = new P(o), this.user = new F(o), this.logger.info("PageLinesSDK initialized"), this.storage.loadFromStorage(this.activeUser, this.token), this.storage.syncWithGlobalStores(this.activeUser, this.token), this.initialized = new Promise((s) => {
555
555
  this.resolveUser = s;
556
556
  }), this.token.value && !this.activeUser.value ? this.getCurrentUser().then((s) => {
557
557
  this.resolveUser && (this.resolveUser(s), this.resolveUser = void 0);
@@ -565,7 +565,7 @@ const A = new B(), L = class L extends V {
565
565
  * Recommended: Use this instead of constructor for shared state
566
566
  */
567
567
  static getInstance(e = {}) {
568
- return A.get() || new L(e);
568
+ return E.get() || new L(e);
569
569
  }
570
570
  get isDev() {
571
571
  return this.settings.isDev ?? (typeof window < "u" ? window.location.hostname === "localhost" || window.location.hostname.includes("127.0.0.1") : !1);
@@ -585,7 +585,7 @@ const A = new B(), L = class L extends V {
585
585
  }
586
586
  // Full reset - clears session + state + destroys singleton
587
587
  clear() {
588
- this.logger.info("Clearing SDK completely"), this.clearSession(), this.loading.value = !1, this.sessionId = T({ prefix: "ses" }), A.delete();
588
+ this.logger.info("Clearing SDK completely"), this.clearSession(), this.loading.value = !1, this.sessionId = $({ prefix: "ses" }), E.delete();
589
589
  }
590
590
  // Backward-compatible delegates — these forward to sub-clients
591
591
  // Can be removed in a future breaking change
@@ -633,11 +633,11 @@ const A = new B(), L = class L extends V {
633
633
  }
634
634
  };
635
635
  c(L, "PageLinesSDK");
636
- let _ = L;
636
+ let q = L;
637
637
  export {
638
- j as A,
639
- C,
640
- _ as P,
638
+ C as A,
639
+ P as C,
640
+ q as P,
641
641
  F as U
642
642
  };
643
- //# sourceMappingURL=sdkClient-DVubPmNq.js.map
643
+ //# sourceMappingURL=sdkClient-Cxrx9Fsc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkClient-Cxrx9Fsc.js","sources":["../api.ts","../../../node_modules/.pnpm/nanostores@1.1.1/node_modules/nanostores/clean-stores/index.js","../../../node_modules/.pnpm/nanostores@1.1.1/node_modules/nanostores/atom/index.js","../sdkStorage.ts","../clients/AuthClient.ts","../clients/ChatClient.ts","../clients/UserClient.ts","../sdkClient.ts"],"sourcesContent":["import type { Hono } from 'hono'\nimport { APP_PORT, APP_PROD_URL } from '@pagelines/core'\nimport { hc } from 'hono/client'\nimport { cookieUtil } from '@pagelines/core'\n\nexport interface ApiClientSettings {\n isDev: boolean\n apiBase?: string\n [key: string]: unknown\n}\n\n/**\n * Resolve API base URL from settings.\n * Centralizes the isDev/apiBase/production URL logic used across SDK clients.\n */\nexport function resolveApiBase(apiBase?: string, isDev?: boolean): string {\n return apiBase || (isDev ? `http://localhost:${APP_PORT}` : APP_PROD_URL)\n}\n\n/**\n * Create fully typed Hono RPC client for PageLines SDK\n *\n * @template TAppType - The Hono app type from the server (enables full type safety)\n * @param settings - Configuration for API base URL and environment\n * @param responseHandler - Optional handler to process ApiResponse for auto user/token updates\n * @returns Typed Hono client with response interceptor\n *\n * @example\n * ```typescript\n * import type { SDKAppType } from '@/modules/main/server'\n * const client = createApiClient<SDKAppType>({ isDev: true })\n * const response = await client.api.auth['check-email'].$post({ json: { email } })\n * ```\n */\nexport function createApiClient<TAppType extends Hono = any>(\n settings: ApiClientSettings,\n responseHandler?: (response: any) => void,\n): ReturnType<typeof hc<TAppType>> {\n const baseUrl = resolveApiBase(settings.apiBase, settings.isDev)\n\n // Create typed Hono RPC client with response interceptor\n const client = hc<TAppType>(baseUrl, {\n fetch: async (input: RequestInfo | URL, init?: RequestInit) => {\n const token = cookieUtil.getAuthToken()\n\n const response = await fetch(input, {\n ...init,\n headers: {\n ...init?.headers,\n 'Content-Type': 'application/json',\n // Only include Authorization header if token exists\n ...(token && { 'Authorization': `Bearer ${token}` }),\n },\n // Use 'omit' for Bearer tokens (not cookies) to allow CORS wildcard origin\n credentials: 'omit',\n })\n\n // Intercept response to process ApiResponse pattern\n if (responseHandler) {\n // Wrap the original response's json method directly\n const originalJson = response.json.bind(response)\n\n // Override json method on the response object itself\n response.json = async () => {\n const result = await originalJson()\n\n // Process ApiResponse pattern if it has user/token fields\n if (typeof result === 'object' && result !== null) {\n if ('ok' in result && ('user' in result || 'token' in result)) {\n responseHandler(result)\n }\n }\n\n return result\n }\n }\n\n return response\n },\n })\n\n return client\n}\n","import { cleanTasks } from '../task/index.js'\n\nexport let clean = Symbol('clean')\n\nexport let cleanStores = (...stores) => {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'cleanStores() can be used only during development or tests'\n )\n }\n cleanTasks()\n for (let $store of stores) {\n if ($store) {\n if ($store.mocked) delete $store.mocked\n if ($store[clean]) $store[clean]()\n }\n }\n}\n","import { clean } from '../clean-stores/index.js'\n\nlet listenerQueue = []\nlet lqIndex = 0\nconst QUEUE_ITEMS_PER_LISTENER = 4\nexport let epoch = 0\n\n/* @__NO_SIDE_EFFECTS__ */\nexport const atom = initialValue => {\n let listeners = []\n let $atom = {\n get() {\n if (!$atom.lc) {\n $atom.listen(() => {})()\n }\n return $atom.value\n },\n lc: 0,\n listen(listener) {\n $atom.lc = listeners.push(listener)\n\n return () => {\n for (\n let i = lqIndex + QUEUE_ITEMS_PER_LISTENER;\n i < listenerQueue.length;\n\n ) {\n if (listenerQueue[i] === listener) {\n listenerQueue.splice(i, QUEUE_ITEMS_PER_LISTENER)\n } else {\n i += QUEUE_ITEMS_PER_LISTENER\n }\n }\n\n let index = listeners.indexOf(listener)\n if (~index) {\n listeners.splice(index, 1)\n if (!--$atom.lc) $atom.off()\n }\n }\n },\n notify(oldValue, changedKey) {\n epoch++\n let runListenerQueue = !listenerQueue.length\n for (let listener of listeners) {\n listenerQueue.push(listener, $atom.value, oldValue, changedKey)\n }\n\n if (runListenerQueue) {\n for (\n lqIndex = 0;\n lqIndex < listenerQueue.length;\n lqIndex += QUEUE_ITEMS_PER_LISTENER\n ) {\n listenerQueue[lqIndex](\n listenerQueue[lqIndex + 1],\n listenerQueue[lqIndex + 2],\n listenerQueue[lqIndex + 3]\n )\n }\n listenerQueue.length = 0\n }\n },\n /* It will be called on last listener unsubscribing.\n We will redefine it in onMount and onStop. */\n off() {},\n set(newValue) {\n let oldValue = $atom.value\n if (oldValue !== newValue) {\n $atom.value = newValue\n $atom.notify(oldValue)\n }\n },\n subscribe(listener) {\n let unbind = $atom.listen(listener)\n listener($atom.value)\n return unbind\n },\n value: initialValue\n }\n\n if (process.env.NODE_ENV !== 'production') {\n $atom[clean] = () => {\n listeners = []\n $atom.lc = 0\n $atom.off()\n }\n }\n\n return $atom\n}\n\nexport const readonlyType = store => store\n","import type { Ref } from 'vue'\nimport type { EnrichedUser } from '@pagelines/core'\nimport { atom } from 'nanostores'\nimport { watch } from 'vue'\nimport { cookieUtil, createLogger } from '@pagelines/core'\n\n// Global nanostores shared via globalThis so SDK and app bundles use the same atoms\nconst _g = globalThis as Record<string, any>\nconst $globalActiveUser = (_g.__PL_AUTH_USER__ ??= atom<EnrichedUser | undefined>(undefined)) as ReturnType<typeof atom<EnrichedUser | undefined>>\nconst $globalToken = (_g.__PL_AUTH_TOKEN__ ??= atom<string | null>(null)) as ReturnType<typeof atom<string | null>>\n\n/**\n * SDKStorage - Handles all storage, sync, and persistence for PageLinesSDK\n *\n * Extracted from PageLinesSDK to keep the main class focused on public API methods.\n * Manages localStorage, cookies, and nanostor synchronization for state persistence.\n */\nexport class SDKStorage {\n private logger = createLogger('SDKStorage')\n\n /**\n * Check if localStorage is fully functional (some test environments provide partial mocks)\n */\n private isLocalStorageFunctional(): boolean {\n return typeof window !== 'undefined'\n && typeof localStorage?.getItem === 'function'\n && typeof localStorage?.setItem === 'function'\n && typeof localStorage?.removeItem === 'function'\n }\n\n /**\n * Sync Vue reactive refs with global nanostores for cross-page persistence\n */\n syncWithGlobalStores(activeUser: Ref<EnrichedUser | undefined>, token: Ref<string | null>): void {\n // 1. Restore from global store on init\n const storedUser = $globalActiveUser.get()\n const storedToken = $globalToken.get()\n\n if (storedUser) {\n activeUser.value = storedUser\n }\n if (storedToken) {\n token.value = storedToken\n }\n\n // 2. Vue refs → global stores (for persistence)\n watch(activeUser, (newUser) => {\n $globalActiveUser.set(newUser)\n }, { immediate: true })\n\n watch(token, (newToken) => {\n $globalToken.set(newToken)\n }, { immediate: true })\n\n // 3. Global stores → Vue refs (for cross-page updates)\n $globalActiveUser.subscribe((newUser) => {\n if (newUser !== activeUser.value) {\n activeUser.value = newUser\n }\n })\n\n $globalToken.subscribe((newToken) => {\n if (newToken !== token.value) {\n token.value = newToken\n }\n })\n }\n\n /**\n * Load user and token from browser storage on initialization\n */\n loadFromStorage(activeUser: Ref<EnrichedUser | undefined>, token: Ref<string | null>): void {\n if (typeof window === 'undefined')\n return\n\n // Load token from cookie\n const savedToken = cookieUtil.getAuthToken()\n if (savedToken) {\n token.value = savedToken\n }\n\n // Try to load user from localStorage for immediate availability\n if (this.isLocalStorageFunctional()) {\n try {\n const savedUser = localStorage.getItem('pagelines-user')\n if (savedUser) {\n activeUser.value = JSON.parse(savedUser)\n }\n } catch (error) {\n this.logger.error('Failed to load user from localStorage', { data: error })\n }\n }\n }\n\n /**\n * Save current user and token to browser storage\n */\n saveToStorage(activeUser: Ref<EnrichedUser | undefined>, token: Ref<string | null>): void {\n if (typeof window === 'undefined')\n return\n\n // Save token to cookie using app's cookie utility\n if (token.value) {\n cookieUtil.setAuthToken(token.value)\n } else {\n cookieUtil.removeAuthToken()\n }\n\n // Save user to localStorage for quick loading\n if (this.isLocalStorageFunctional()) {\n try {\n if (activeUser.value) {\n localStorage.setItem('pagelines-user', JSON.stringify(activeUser.value))\n } else {\n localStorage.removeItem('pagelines-user')\n }\n } catch (error) {\n this.logger.error('Failed to save user to localStorage', { data: error })\n }\n }\n }\n\n /**\n * Clear all stored user data and tokens\n */\n clearStorage(): void {\n if (typeof window === 'undefined')\n return\n\n cookieUtil.removeAuthToken()\n\n if (this.isLocalStorageFunctional()) {\n try {\n localStorage.removeItem('pagelines-user')\n } catch (error) {\n this.logger.error('Failed to clear user from localStorage', { data: error })\n }\n }\n\n // Clear global stores\n $globalActiveUser.set(undefined)\n $globalToken.set(null)\n }\n\n /**\n * Generic localStorage getter\n */\n getItem(key: string): string | null {\n if (!this.isLocalStorageFunctional())\n return null\n\n try {\n return localStorage.getItem(key)\n } catch (error) {\n this.logger.error('Failed to get item from localStorage', { key, error })\n return null\n }\n }\n\n /**\n * Generic localStorage setter\n */\n setItem(key: string, value: string): void {\n if (!this.isLocalStorageFunctional())\n return\n\n try {\n localStorage.setItem(key, value)\n } catch (error) {\n this.logger.error('Failed to set item in localStorage', { key, error })\n }\n }\n}\n","import type { EnrichedUser } from '@pagelines/core'\nimport type { SDKContext } from './types'\nimport { resolveApiBase } from '../api'\n\n/**\n * Run an async operation with loading/error state management.\n * Sets loading=true and error=null before, loading=false in finally.\n */\nasync function withLoadingState<T>(ctx: SDKContext, fn: () => Promise<T>): Promise<T> {\n ctx.loading.value = true\n ctx.error.value = null\n try {\n return await fn()\n } finally {\n ctx.loading.value = false\n }\n}\n\nexport class AuthClient {\n constructor(private ctx: SDKContext) {}\n\n async sendCode(email: string): Promise<void> {\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth['check-email'].$post({\n json: { email },\n })\n const data = await response.json()\n if (!data.ok) {\n this.ctx.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.ctx.logger.error('Send code error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Failed to send verification code'\n this.ctx.error.value = errorMessage\n throw err\n }\n })\n }\n\n async verifyCode(email: string, code: string): Promise<void> {\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth['verify-code'].$post({\n json: { email, code },\n })\n const data = await response.json()\n if (!data.ok) {\n this.ctx.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.ctx.logger.error('Verify code error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Failed to verify code'\n this.ctx.error.value = errorMessage\n throw err\n }\n })\n }\n\n async login(email: string, password: string): Promise<void> {\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth.login.$post({\n json: { email, password },\n })\n const data = await response.json()\n if (!data.ok) {\n this.ctx.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.ctx.logger.error('Login error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Login failed'\n this.ctx.error.value = errorMessage\n throw err\n }\n })\n }\n\n async logout(): Promise<void> {\n return withLoadingState(this.ctx, async () => {\n try {\n await this.ctx.api.auth.logout.$post()\n } catch (err) {\n this.ctx.logger.error('Logout error (user still logged out locally)', { data: err })\n }\n // Always clear local state regardless of API success\n this.ctx.activeUser.value = undefined\n this.ctx.token.value = null\n this.ctx.storage.clearStorage()\n })\n }\n\n async getCurrentUser(): Promise<EnrichedUser | undefined> {\n if (!this.ctx.token.value) {\n return undefined\n }\n\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth.me.$get()\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n if (data.error.includes('Authentication')) {\n this.ctx.activeUser.value = undefined\n this.ctx.token.value = null\n this.ctx.storage.clearStorage()\n }\n return undefined\n }\n\n return data.user\n } catch (err) {\n this.ctx.logger.error('Get current user error', { data: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to get user info'\n return undefined\n }\n })\n }\n\n async requestAuthCode(args: { email: string }): Promise<boolean> {\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth['check-email'].$post({\n json: { email: args.email },\n })\n const data = await response.json()\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Failed to request auth code', { email: args.email, error: data.error })\n return false\n }\n this.ctx.logger.info('Auth code requested successfully', { email: args.email })\n return true\n } catch (err) {\n this.ctx.logger.error('Request auth code error', { email: args.email, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to request auth code'\n return false\n }\n })\n }\n\n async loginWithCode(args: {\n email: string\n code: string\n orgId?: string\n autoCreateContact?: boolean\n }): Promise<boolean> {\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth['verify-code'].$post({\n json: { email: args.email, code: args.code },\n })\n const data = await response.json()\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Login failed', { email: args.email, error: data.error })\n return false\n }\n this.ctx.logger.info('Login successful', { email: args.email })\n return true\n } catch (err) {\n this.ctx.logger.error('Login with code error', { email: args.email, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Login failed'\n return false\n }\n })\n }\n\n loginWithGoogle(args?: { onSuccess?: (user: EnrichedUser) => void, onError?: (error: string) => void }): void {\n if (typeof window === 'undefined') {\n this.ctx.logger.error('loginWithGoogle: Only available in browser')\n return\n }\n\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const origin = window.location.origin\n const popupUrl = `${apiBase}/auth/google-popup?origin=${encodeURIComponent(origin)}`\n\n // Open centered popup\n const width = 500\n const height = 600\n const left = window.screenX + (window.outerWidth - width) / 2\n const top = window.screenY + (window.outerHeight - height) / 2\n const popup = window.open(\n popupUrl,\n 'google-auth',\n `width=${width},height=${height},left=${left},top=${top},popup=yes`,\n )\n\n if (!popup) {\n const msg = 'Popup was blocked. Please allow popups for this site.'\n this.ctx.error.value = msg\n args?.onError?.(msg)\n return\n }\n\n // Listen for postMessage from popup\n const handler = (event: MessageEvent) => {\n // Validate origin -- must be our API base\n const expectedOrigin = new URL(apiBase).origin\n if (event.origin !== expectedOrigin) return\n\n if (event.data?.type === 'auth-success') {\n window.removeEventListener('message', handler)\n const { token, user } = event.data\n\n // Process the auth response the same way as other login methods\n this.ctx.processApiResponse({ ok: true, data: {}, token, user })\n\n this.ctx.logger.info('Google login successful')\n args?.onSuccess?.(user)\n } else if (event.data?.type === 'auth-error') {\n window.removeEventListener('message', handler)\n const errorMsg = event.data.error || 'Google authentication failed'\n this.ctx.error.value = errorMsg\n this.ctx.logger.error('Google login failed', { error: errorMsg })\n args?.onError?.(errorMsg)\n }\n }\n\n window.addEventListener('message', handler)\n\n // Clean up listener if popup is closed without completing auth\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkClosed)\n window.removeEventListener('message', handler)\n }\n }, 500)\n }\n}\n","import type { ApiResponse } from '@pagelines/core'\nimport type { SDKContext } from './types'\nimport { resolveApiBase } from '../api'\n\nexport class ChatClient {\n constructor(private ctx: SDKContext) {}\n\n async chatStream(args: {\n handle: string\n message: string\n attachments?: Array<{ type: string, url: string, name: string, mimeType: string, mediaId?: string }>\n conversationId?: string\n history?: Array<{ role: 'user' | 'assistant', content: string }>\n visitorId?: string\n context?: string\n onDelta: (text: string) => void\n onDone: (conversationId: string) => void\n onError: (error: string) => void\n onStatus?: (status: string) => void\n }): Promise<void> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const url = `${apiBase}/api/agent/public/${encodeURIComponent(args.handle)}/chat/stream`\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n message: args.message,\n conversationId: args.conversationId,\n history: args.history,\n visitorId: args.visitorId,\n context: args.context,\n attachments: args.attachments,\n }),\n })\n\n if (!response.ok) {\n const errorBody = await response.json().catch(() => ({ error: 'Request failed' })) as { error?: string }\n args.onError(errorBody.error || `HTTP ${response.status}`)\n return\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n args.onError('No response stream')\n return\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n let resolvedConversationId = args.conversationId || ''\n\n while (true) {\n const { done, value } = await reader.read()\n if (done)\n break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.startsWith('data: '))\n continue\n\n const data = line.slice(6).trim()\n if (data === '[DONE]') {\n args.onDone(resolvedConversationId)\n return\n }\n\n try {\n const chunk = JSON.parse(data) as {\n choices?: Array<{ delta?: { content?: string } }>\n pl_metadata?: { conversationId?: string }\n pl_status?: string\n }\n\n // Handle status events (e.g. \"Waking up...\")\n if (chunk.pl_status) {\n args.onStatus?.(chunk.pl_status)\n continue\n }\n\n if (chunk.pl_metadata?.conversationId) {\n resolvedConversationId = chunk.pl_metadata.conversationId\n }\n\n const delta = chunk.choices?.[0]?.delta\n if (delta?.content) {\n args.onDelta(delta.content)\n }\n } catch {\n // Skip malformed chunks\n }\n }\n }\n\n // Stream ended without [DONE]\n args.onDone(resolvedConversationId)\n } catch (error) {\n args.onError(error instanceof Error ? error.message : 'Stream failed')\n }\n }\n\n async chatMessage(args: {\n handle: string\n message: string\n conversationId?: string\n visitorId?: string\n context?: string\n }): Promise<{ conversationId: string, content: string } | undefined> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const url = `${apiBase}/api/agent/public/${encodeURIComponent(args.handle)}/chat`\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n message: args.message,\n conversationId: args.conversationId,\n visitorId: args.visitorId,\n context: args.context,\n }),\n })\n\n const data = await response.json() as ApiResponse<{\n conversationId: string\n message: { role: 'assistant', content: string }\n }>\n\n if (!data.ok || !data.data) {\n this.ctx.logger.error('chatMessage failed', { error: !data.ok && 'error' in data ? data.error : 'Unknown' })\n return undefined\n }\n\n return {\n conversationId: data.data.conversationId,\n content: data.data.message.content,\n }\n } catch (err) {\n this.ctx.logger.error('chatMessage error', { error: err })\n return undefined\n }\n }\n\n}\n","import type { AgentConfig } from '@pagelines/core'\nimport { objectId } from '@pagelines/core'\nimport type { SDKContext } from './types'\n\nexport class UserClient {\n constructor(private ctx: SDKContext) {}\n\n async getPublicAgent(args: { handle: string }): Promise<AgentConfig | undefined> {\n this.ctx.loading.value = true\n this.ctx.error.value = null\n\n try {\n const response = await this.ctx.api.agent.public[':handle'].$get({\n param: { handle: args.handle },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Failed to fetch public agent', { handle: args.handle, error: data.error })\n return undefined\n }\n\n return data.data\n } catch (err) {\n this.ctx.logger.error('Get public agent error', { handle: args.handle, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to fetch agent'\n return undefined\n } finally {\n this.ctx.loading.value = false\n }\n }\n\n async getAgentByEmail(args: { email: string }): Promise<AgentConfig | undefined> {\n this.ctx.loading.value = true\n this.ctx.error.value = null\n\n try {\n const response = await this.ctx.api.agent['by-email'][':email'].$get({\n param: { email: args.email },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Failed to fetch agent by email', { email: args.email, error: data.error })\n return undefined\n }\n\n return data.data\n } catch (err) {\n this.ctx.logger.error('Get agent by email error', { email: args.email, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to fetch agent'\n return undefined\n } finally {\n this.ctx.loading.value = false\n }\n }\n\n generateAnonId(): string {\n const storageKey = 'pagelinesAnonId'\n let anonId = this.ctx.storage.getItem(storageKey)\n\n if (!anonId) {\n anonId = objectId({ prefix: 'anon' })\n this.ctx.storage.setItem(storageKey, anonId)\n }\n\n return anonId\n }\n\n track(args: {\n event: 'view_profile' | 'profile_interaction'\n agentId: string\n properties?: Record<string, any>\n }): void {\n try {\n // Track event via postMessage to parent window if embedded\n if (typeof window !== 'undefined' && window.parent !== window) {\n window.parent.postMessage({\n type: 'pagelines_track',\n event: args.event,\n agentId: args.agentId,\n properties: args.properties || {},\n }, '*')\n }\n\n this.ctx.logger.info('SDK event tracked', { event: args.event, agentId: args.agentId })\n } catch (err) {\n this.ctx.logger.error('Track event error', { error: err, args })\n }\n }\n}\n","import type { hc } from 'hono/client'\n// Use stub type for production builds (aliased in vite.config.sdk.ts)\n// Dev uses real SDKAppType from server via alias\nimport type { SDKAppType } from '@/modules/main/server'\nimport type { AgentConfig, EnrichedUser } from '@pagelines/core'\nimport type { ApiResponse } from '@pagelines/core'\nimport { objectId, SettingsObject } from '@pagelines/core'\nimport { computed, ref } from 'vue'\nimport { createApiClient } from './api'\nimport { SDKStorage } from './sdkStorage'\nimport { AuthClient } from './clients/AuthClient'\nimport { ChatClient } from './clients/ChatClient'\nimport { UserClient } from './clients/UserClient'\nimport type { SDKContext } from './clients/types'\n\nexport interface PageLinesSDKSettings {\n apiBase?: string\n isDev?: boolean\n [key: string]: unknown\n}\n\n/**\n * Browser-only singleton manager\n * Browser: Uses globalThis for cross-bundle singleton (www + widget)\n * Node.js SSR: No singleton - each request gets new instance (prevents request bleeding)\n */\nclass SDKGlobal {\n private key = '__PAGELINES_SDK__'\n\n get(): PageLinesSDK | undefined {\n if (typeof window === 'undefined')\n return undefined\n return (globalThis as any)[this.key]\n }\n\n set(instance: PageLinesSDK): void {\n if (typeof window !== 'undefined')\n (globalThis as any)[this.key] = instance\n }\n\n delete(): void {\n if (typeof window !== 'undefined')\n delete (globalThis as any)[this.key]\n }\n}\n\n// Module-scoped singleton manager\nconst sdkGlobal = new SDKGlobal()\n\nexport class PageLinesSDK extends SettingsObject<PageLinesSDKSettings> {\n /**\n * Get singleton instance in browser (creates if doesn't exist)\n * Node.js: Always creates new instance (no singleton)\n * Recommended: Use this instead of constructor for shared state\n */\n static getInstance(settings: PageLinesSDKSettings = {}): PageLinesSDK {\n // Browser: return singleton or create\n // Node: always create new (no singleton)\n return sdkGlobal.get() || new PageLinesSDK(settings)\n }\n\n // Vue reactive state\n activeUser = ref<EnrichedUser | undefined>()\n token = ref<string | null>(null)\n loading = ref(false)\n error = ref<string | null>(null)\n apiBase = this.settings.apiBase || undefined\n\n // Storage handler for persistence\n private storage = new SDKStorage()\n\n // Auto-managed session ID for usage tracking\n private sessionId = objectId({ prefix: 'ses' })\n\n get isDev() {\n return this.settings.isDev ?? (\n typeof window !== 'undefined'\n ? window.location.hostname === 'localhost' || window.location.hostname.includes('127.0.0.1')\n : false\n )\n }\n\n // Typed Hono RPC client - uses SDKAppType (auth/self/usage routes only)\n // Initialized in constructor (definite assignment via singleton pattern)\n private apiClient!: ReturnType<typeof hc<SDKAppType>>\n\n // Bypass stub typing for route access (production builds use SDKAppType stub)\n // Runtime types are validated via Zod at API boundaries\n private get api() {\n return (this.apiClient as any).api\n }\n\n // Computed properties derived from activeUser (matches UserClient pattern)\n currentAgent = computed(() => {\n const user = this.activeUser.value\n if (!user?.agents)\n return undefined\n\n const agentId = user.primaryAgentId || user.agents[0]?.agentId\n if (!agentId)\n return undefined\n\n return user.agents.find((a) => a.agentId === agentId)\n })\n\n currentOrg = computed(() => {\n const agent = this.currentAgent.value\n if (!agent?.orgId)\n return undefined\n\n const user = this.activeUser.value\n if (!user?.orgs)\n return undefined\n\n return user.orgs.find((org) => org.orgId === agent.orgId)\n })\n\n // Initialization state\n initialized?: Promise<EnrichedUser | undefined>\n resolveUser?: (value: EnrichedUser | undefined) => void\n\n // Sub-clients (new preferred API surface)\n readonly auth!: AuthClient\n readonly chat!: ChatClient\n readonly user!: UserClient\n\n constructor(settings: PageLinesSDKSettings = {}) {\n // Browser: return existing singleton\n // Node: always create new\n const existing = sdkGlobal.get()\n if (existing) {\n console.debug('[PageLinesSDK] Returning existing singleton instance')\n return existing\n }\n\n super('PageLinesSDK', settings)\n\n // Browser: set singleton reference (no-op in Node)\n sdkGlobal.set(this)\n\n // Create typed Hono RPC client with response handler\n this.apiClient = createApiClient<SDKAppType>(\n { isDev: this.isDev, apiBase: this.apiBase },\n this.processApiResponse.bind(this),\n )\n\n // Build shared context for sub-clients\n const ctx: SDKContext = {\n api: this.api,\n apiBase: this.apiBase,\n isDev: this.isDev,\n activeUser: this.activeUser,\n token: this.token,\n loading: this.loading,\n error: this.error,\n currentAgent: this.currentAgent,\n storage: this.storage,\n sessionId: this.sessionId,\n logger: this.logger,\n processApiResponse: this.processApiResponse.bind(this),\n }\n\n // Initialize sub-clients\n this.auth = new AuthClient(ctx)\n this.chat = new ChatClient(ctx)\n this.user = new UserClient(ctx)\n\n this.logger.info('PageLinesSDK initialized')\n\n // Initialize from storage using handler\n this.storage.loadFromStorage(this.activeUser, this.token)\n\n // Sync with global stores for persistence across navigation\n this.storage.syncWithGlobalStores(this.activeUser, this.token)\n\n // Set up initialization promise (same pattern as UserClient)\n this.initialized = new Promise((resolve) => {\n this.resolveUser = resolve\n })\n\n // Auto-fetch user if token exists (mirrors UserClient pattern)\n if (this.token.value && !this.activeUser.value) {\n this.getCurrentUser().then((user) => {\n if (this.resolveUser) {\n this.resolveUser(user)\n this.resolveUser = undefined\n }\n }).catch((err) => {\n this.logger.error('Auto user fetch failed', { data: err })\n if (this.resolveUser) {\n this.resolveUser(undefined)\n this.resolveUser = undefined\n }\n })\n } else if (this.activeUser.value) {\n // Resolve immediately if we already have a user from storage\n this.resolveUser?.(this.activeUser.value)\n } else {\n // No token, resolve with undefined\n this.resolveUser?.(undefined)\n }\n }\n\n // Process ApiResponse for automatic user/token updates - public for dependency injection\n processApiResponse(response: ApiResponse<any>): void {\n // Handle user updates\n if (response.ok && response.user) {\n this.activeUser.value = response.user\n this.logger.info('User updated from API response', { data: response.user })\n }\n\n // Handle token updates\n if (response.ok && response.token) {\n this.token.value = response.token\n this.storage.saveToStorage(this.activeUser, this.token)\n this.logger.info('Token updated from API response')\n }\n\n // Resolve initialization promise\n if (this.resolveUser && response.ok) {\n this.resolveUser(response.user)\n this.resolveUser = undefined\n }\n }\n\n // Clear all user data and tokens\n clearSession(): void {\n this.logger.info('Clearing session')\n this.activeUser.value = undefined\n this.token.value = null\n this.error.value = null\n this.storage.clearStorage()\n }\n\n // Full reset - clears session + state + destroys singleton\n clear(): void {\n this.logger.info('Clearing SDK completely')\n\n // 1. Clear session data\n this.clearSession()\n\n // 2. Reset other state\n this.loading.value = false\n this.sessionId = objectId({ prefix: 'ses' })\n\n // 3. Destroy singleton (no-op in Node)\n sdkGlobal.delete()\n }\n\n // Backward-compatible delegates — these forward to sub-clients\n // Can be removed in a future breaking change\n async sendCode(email: string): Promise<void> { return this.auth.sendCode(email) }\n async verifyCode(email: string, code: string): Promise<void> { return this.auth.verifyCode(email, code) }\n async login(email: string, password: string): Promise<void> { return this.auth.login(email, password) }\n async logout(): Promise<void> { return this.auth.logout() }\n async getCurrentUser(): Promise<EnrichedUser | undefined> { return this.auth.getCurrentUser() }\n async requestAuthCode(args: { email: string }): Promise<boolean> { return this.auth.requestAuthCode(args) }\n async loginWithCode(args: { email: string, code: string, orgId?: string, autoCreateContact?: boolean }): Promise<boolean> { return this.auth.loginWithCode(args) }\n loginWithGoogle(args?: { onSuccess?: (user: EnrichedUser) => void, onError?: (error: string) => void }): void { return this.auth.loginWithGoogle(args) }\n\n async chatStream(args: Parameters<ChatClient['chatStream']>[0]): Promise<void> { return this.chat.chatStream(args) }\n async chatMessage(args: Parameters<ChatClient['chatMessage']>[0]): Promise<{ conversationId: string, content: string } | undefined> { return this.chat.chatMessage(args) }\n\n async getPublicAgent(args: { handle: string }): Promise<AgentConfig | undefined> { return this.user.getPublicAgent(args) }\n async getAgentByEmail(args: { email: string }): Promise<AgentConfig | undefined> { return this.user.getAgentByEmail(args) }\n generateAnonId(): string { return this.user.generateAnonId() }\n track(args: Parameters<UserClient['track']>[0]): void { return this.user.track(args) }\n}\n"],"names":["resolveApiBase","apiBase","isDev","APP_PORT","APP_PROD_URL","__name","createApiClient","settings","responseHandler","baseUrl","hc","input","init","token","cookieUtil","response","originalJson","result","clean","listenerQueue","lqIndex","QUEUE_ITEMS_PER_LISTENER","atom","initialValue","listeners","$atom","listener","i","index","oldValue","changedKey","runListenerQueue","newValue","unbind","_g","$globalActiveUser","$globalToken","_SDKStorage","__publicField","createLogger","activeUser","storedUser","storedToken","watch","newUser","newToken","savedToken","savedUser","error","key","value","SDKStorage","withLoadingState","ctx","fn","_AuthClient","email","data","err","errorMessage","code","password","args","origin","popupUrl","width","height","left","top","popup","msg","handler","event","expectedOrigin","user","errorMsg","checkClosed","AuthClient","_ChatClient","url","errorBody","reader","decoder","buffer","resolvedConversationId","done","lines","line","chunk","delta","ChatClient","_UserClient","storageKey","anonId","objectId","UserClient","_SDKGlobal","instance","SDKGlobal","sdkGlobal","_PageLinesSDK","SettingsObject","existing","ref","computed","agentId","a","agent","org","resolve","PageLinesSDK"],"mappings":"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","x_google_ignoreList":[1,2]}