@pagelines/sdk 1.0.863 → 1.0.865

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.
@@ -5,8 +5,9 @@ type JsonSchema = Record<string, unknown>;
5
5
  * SHOULD reject contracts whose `version` they don't understand.
6
6
  *
7
7
  * v1: initial — schemas keyed by name.
8
+ * v2: prelaunch cleanup removed fleet message-preview fields.
8
9
  */
9
- export declare const CONTRACT_VERSION = "1.0.0";
10
+ export declare const CONTRACT_VERSION = "2.0.0";
10
11
  export interface WireContract {
11
12
  version: string;
12
13
  generatedAt: string;
package/dist/sdkClient.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import "./rolldown-runtime.js";
2
- import { PAGELINES_APP_CONFIG as e, SettingsObject as t, cookieUtil as n, createLogger as r, objectId as i, runAuthenticatedChatTurnStream as a, shortId as o, toChatStreamError as s, zChatEvent as c } from "@pagelines/core";
3
- import { computed as l, ref as u, watch as d } from "vue";
2
+ import { PAGELINES_APP_CONFIG as e, SettingsObject as t, cookieUtil as n, createLogger as r, objectId as i, runAuthenticatedChatTurnStream as a, serverTransitionBudgets as o, shortId as s, toChatStreamError as c, zChatEvent as l } from "@pagelines/core";
3
+ import { computed as u, ref as d, watch as f } from "vue";
4
4
  //#region api.ts
5
5
  function resolveApiBase(t, n) {
6
6
  let r = Number(globalThis.process?.env?.PORT) || e.port;
@@ -28,9 +28,9 @@ function createApiFetch(e, t, r) {
28
28
  }
29
29
  //#endregion
30
30
  //#region ../../node_modules/.pnpm/nanostores@1.4.1/node_modules/nanostores/clean-stores/index.js
31
- var f = Symbol("clean"), p, m = [], h = 0, g = null, _ = 4, v = (p = globalThis).nanostoresGlobal || (p.nanostoresGlobal = { epoch: 0 }), drainQueue = () => {
32
- for (h = 0; h < m.length; h += _) m[h](m[h + 1].value, m[h + 2], m[h + 3]);
33
- m.length = 0;
31
+ var p = Symbol("clean"), m, h = [], g = 0, _ = null, v = 4, y = (m = globalThis).nanostoresGlobal || (m.nanostoresGlobal = { epoch: 0 }), drainQueue = () => {
32
+ for (g = 0; g < h.length; g += v) h[g](h[g + 1].value, h[g + 2], h[g + 3]);
33
+ h.length = 0;
34
34
  }, atom = /* @__NO_SIDE_EFFECTS__ */ (e) => {
35
35
  let t = [], n = {
36
36
  get() {
@@ -40,15 +40,15 @@ var f = Symbol("clean"), p, m = [], h = 0, g = null, _ = 4, v = (p = globalThis)
40
40
  lc: 0,
41
41
  listen(e) {
42
42
  return n.lc = t.push(e), () => {
43
- for (let t = h + _; t < m.length;) m[t] === e ? m.splice(t, _) : t += _;
43
+ for (let t = g + v; t < h.length;) h[t] === e ? h.splice(t, v) : t += v;
44
44
  let r = t.indexOf(e);
45
45
  ~r && (t.splice(r, 1), --n.lc || n.off());
46
46
  };
47
47
  },
48
48
  notify(e, r) {
49
- v.epoch++;
50
- let i = !m.length && !0;
51
- for (let i of t) g?.has(i) || (g?.add(i), m.push(i, n, e, r));
49
+ y.epoch++;
50
+ let i = !h.length && !0;
51
+ for (let i of t) _?.has(i) || (_?.add(i), h.push(i, n, e, r));
52
52
  i && drainQueue();
53
53
  },
54
54
  off() {},
@@ -62,7 +62,7 @@ var f = Symbol("clean"), p, m = [], h = 0, g = null, _ = 4, v = (p = globalThis)
62
62
  },
63
63
  value: e
64
64
  };
65
- return process.env.NODE_ENV !== "production" && (n[f] = () => {
65
+ return process.env.NODE_ENV !== "production" && (n[p] = () => {
66
66
  t = [], n.lc = 0, n.off();
67
67
  }), n;
68
68
  };
@@ -106,7 +106,7 @@ function _defineProperty(e, t, n) {
106
106
  }
107
107
  //#endregion
108
108
  //#region sdkStorage.ts
109
- var y = globalThis, b = y.__PL_AUTH_USER__ ?? (y.__PL_AUTH_USER__ = /* @__PURE__ */ atom(void 0)), x = y.__PL_AUTH_TOKEN__ ?? (y.__PL_AUTH_TOKEN__ = /* @__PURE__ */ atom(null)), S = y.__PL_AUTH_DEVICE_ID__ ?? (y.__PL_AUTH_DEVICE_ID__ = /* @__PURE__ */ atom(null)), SDKStorage = class {
109
+ var b = globalThis, x = b.__PL_AUTH_USER__ ?? (b.__PL_AUTH_USER__ = /* @__PURE__ */ atom(void 0)), S = b.__PL_AUTH_TOKEN__ ?? (b.__PL_AUTH_TOKEN__ = /* @__PURE__ */ atom(null)), C = b.__PL_AUTH_DEVICE_ID__ ?? (b.__PL_AUTH_DEVICE_ID__ = /* @__PURE__ */ atom(null)), SDKStorage = class {
110
110
  constructor() {
111
111
  _defineProperty(this, "logger", r("SDKStorage"));
112
112
  }
@@ -114,12 +114,12 @@ var y = globalThis, b = y.__PL_AUTH_USER__ ?? (y.__PL_AUTH_USER__ = /* @__PURE__
114
114
  return typeof window < "u" && typeof localStorage?.getItem == "function" && typeof localStorage?.setItem == "function" && typeof localStorage?.removeItem == "function";
115
115
  }
116
116
  syncWithGlobalStores(e) {
117
- let { activeUser: t, token: n, deviceId: r } = e, i = b.get(), a = x.get(), o = S.get();
118
- i && (t.value = i), a && (n.value = a), o && (r.value = o), d(t, (e) => b.set(e), { immediate: !0 }), d(n, (e) => x.set(e), { immediate: !0 }), d(r, (e) => S.set(e), { immediate: !0 }), b.subscribe((e) => {
117
+ let { activeUser: t, token: n, deviceId: r } = e, i = x.get(), a = S.get(), o = C.get();
118
+ i && (t.value = i), a && (n.value = a), o && (r.value = o), f(t, (e) => x.set(e), { immediate: !0 }), f(n, (e) => S.set(e), { immediate: !0 }), f(r, (e) => C.set(e), { immediate: !0 }), x.subscribe((e) => {
119
119
  e !== t.value && (t.value = e);
120
- }), x.subscribe((e) => {
121
- e !== n.value && (n.value = e);
122
120
  }), S.subscribe((e) => {
121
+ e !== n.value && (n.value = e);
122
+ }), C.subscribe((e) => {
123
123
  e !== r.value && (r.value = e);
124
124
  });
125
125
  }
@@ -149,7 +149,7 @@ var y = globalThis, b = y.__PL_AUTH_USER__ ?? (y.__PL_AUTH_USER__ = /* @__PURE__
149
149
  } catch (e) {
150
150
  this.logger.error("Failed to clear user from localStorage", { data: e });
151
151
  }
152
- b.set(void 0), x.set(null), S.set(null);
152
+ x.set(void 0), S.set(null), C.set(null);
153
153
  }
154
154
  }
155
155
  getItem(e) {
@@ -209,7 +209,7 @@ var y = globalThis, b = y.__PL_AUTH_USER__ ?? (y.__PL_AUTH_USER__ = /* @__PURE__
209
209
  }
210
210
  }
211
211
  async waitUntilReady(e) {
212
- let { agentId: t, onStatus: n, timeoutMs: r = 3e5, pollIntervalMs: i = 3e3 } = e, a = Date.now(), o;
212
+ let { agentId: t, onStatus: n, timeoutMs: r = o.wake, pollIntervalMs: i = 3e3 } = e, a = Date.now(), s;
213
213
  for (; Date.now() - a < r;) {
214
214
  let e = await this.getLiveStatus({ agentId: t });
215
215
  if (e.lifecycle === "running") {
@@ -217,7 +217,7 @@ var y = globalThis, b = y.__PL_AUTH_USER__ ?? (y.__PL_AUTH_USER__ = /* @__PURE__
217
217
  return;
218
218
  }
219
219
  if (e.lifecycle === "error") throw Error(e.detail || "Your bot hit a problem starting");
220
- e.lifecycle !== o && (n?.(e.lifecycle), o = e.lifecycle), await new Promise((e) => setTimeout(e, i));
220
+ e.lifecycle !== s && (n?.(e.lifecycle), s = e.lifecycle), await new Promise((e) => setTimeout(e, i));
221
221
  }
222
222
  throw Error("Your bot is taking longer than expected — please try again");
223
223
  }
@@ -243,7 +243,7 @@ var y = globalThis, b = y.__PL_AUTH_USER__ ?? (y.__PL_AUTH_USER__ = /* @__PURE__
243
243
  if (!e) throw Error("No organization found. Please sign in first.");
244
244
  return e;
245
245
  }
246
- }, C = "Signed in, but your account could not be loaded. Try again.";
246
+ }, w = "Signed in, but your account could not be loaded. Try again.";
247
247
  async function withLoadingState(e, t) {
248
248
  e.loading.value = !0, e.error.value = null;
249
249
  try {
@@ -266,7 +266,7 @@ var AuthClient = class {
266
266
  })).json();
267
267
  if (!n.ok) throw Error(n.error);
268
268
  let r = await this.getCurrentUser();
269
- if (!r) throw Error(C);
269
+ if (!r) throw Error(w);
270
270
  return r;
271
271
  }
272
272
  async sendCode(e) {
@@ -375,7 +375,7 @@ var AuthClient = class {
375
375
  });
376
376
  let r = await this.getCurrentUser();
377
377
  if (!r) {
378
- this.ctx.error.value = C, this.ctx.logger.error("Google login: token accepted but user hydration failed"), e?.onError?.(C);
378
+ this.ctx.error.value = w, this.ctx.logger.error("Google login: token accepted but user hydration failed"), e?.onError?.(w);
379
379
  return;
380
380
  }
381
381
  this.ctx.logger.info("Google login successful"), e?.onSuccess?.(r);
@@ -448,7 +448,7 @@ function parseChatEvent(e) {
448
448
  for (let e of t) e.startsWith("event:") ? n = e.slice(6).trim() : e.startsWith("data:") && (r = e.slice(5).trim());
449
449
  if (!n || r === void 0) return null;
450
450
  try {
451
- let e = c.safeParse({
451
+ let e = l.safeParse({
452
452
  event: n,
453
453
  data: JSON.parse(r)
454
454
  });
@@ -520,11 +520,11 @@ var ChatClient = class {
520
520
  e.onError("No response stream");
521
521
  return;
522
522
  }
523
- let c = new TextDecoder(), l = "";
523
+ let s = new TextDecoder(), l = "";
524
524
  outer: for (;;) {
525
525
  let { done: t, value: n } = await a.read();
526
526
  if (t) break;
527
- l += c.decode(n, { stream: !0 });
527
+ l += s.decode(n, { stream: !0 });
528
528
  let o = l.indexOf("\n\n");
529
529
  for (; o !== -1;) {
530
530
  let t = l.slice(0, o);
@@ -536,7 +536,7 @@ var ChatClient = class {
536
536
  else if (n.event === "working_end") e.onWorkingEnd?.();
537
537
  else if (n.event === "message_delta") e.onDelta(n.data.delta, n.data.role);
538
538
  else if (n.event === "error") {
539
- r = !0, e.onError(s(n.data));
539
+ r = !0, e.onError(c(n.data));
540
540
  break outer;
541
541
  } else if (n.event === "message" && (n.data.message.role === "assistant" || n.data.message.role === "system")) {
542
542
  i = !0;
@@ -576,9 +576,9 @@ var ChatClient = class {
576
576
  e.onError(t instanceof Error ? t.message : "Conversation failed");
577
577
  return;
578
578
  }
579
- let c = i ? `${t}/api/conversations/${encodeURIComponent(r)}/stream?since=${encodeURIComponent(i)}` : `${t}/api/conversations/${encodeURIComponent(r)}/stream`, l = `nonce_${o(16)}`, u = detectBrowserTimezone();
579
+ let o = i ? `${t}/api/conversations/${encodeURIComponent(r)}/stream?since=${encodeURIComponent(i)}` : `${t}/api/conversations/${encodeURIComponent(r)}/stream`, l = `nonce_${s(16)}`, u = detectBrowserTimezone();
580
580
  await a({
581
- streamUrl: c,
581
+ streamUrl: o,
582
582
  sendUrl: `${t}/api/messages`,
583
583
  headers: n,
584
584
  sendBody: {
@@ -597,7 +597,7 @@ var ChatClient = class {
597
597
  n && e.onMessage?.(n);
598
598
  },
599
599
  onDone: () => e.onDone(r),
600
- onChatError: (t) => e.onError(s(t)),
600
+ onChatError: (t) => e.onError(c(t)),
601
601
  onTransportError: (t) => e.onError(t.code ? {
602
602
  code: t.code,
603
603
  error: t.message
@@ -687,27 +687,27 @@ var ChatClient = class {
687
687
  delete() {
688
688
  typeof window < "u" && delete globalThis[this.key];
689
689
  }
690
- }, w = new SDKGlobal(), T = class PageLinesSDK extends t {
690
+ }, T = new SDKGlobal(), E = class PageLinesSDK extends t {
691
691
  static getInstance(e = {}) {
692
- return w.get() || new PageLinesSDK(e);
692
+ return T.get() || new PageLinesSDK(e);
693
693
  }
694
694
  get isDev() {
695
695
  return this.settings.isDev ?? (typeof window < "u" ? window.location.hostname === "localhost" || window.location.hostname.includes("127.0.0.1") : !1);
696
696
  }
697
697
  constructor(e = {}) {
698
- let t = w.get();
698
+ let t = T.get();
699
699
  if (t) return console.debug("[PageLinesSDK] Returning existing singleton instance"), t;
700
- super("PageLinesSDK", e), _defineProperty(this, "activeUser", u()), _defineProperty(this, "token", u(null)), _defineProperty(this, "deviceId", u(null)), _defineProperty(this, "loading", u(!1)), _defineProperty(this, "error", u(null)), _defineProperty(this, "apiBase", this.settings.apiBase || void 0), _defineProperty(this, "storage", new SDKStorage()), _defineProperty(this, "sessionId", i({ prefix: "ses" })), _defineProperty(this, "currentAgent", l(() => {
700
+ super("PageLinesSDK", e), _defineProperty(this, "activeUser", d()), _defineProperty(this, "token", d(null)), _defineProperty(this, "deviceId", d(null)), _defineProperty(this, "loading", d(!1)), _defineProperty(this, "error", d(null)), _defineProperty(this, "apiBase", this.settings.apiBase || void 0), _defineProperty(this, "storage", new SDKStorage()), _defineProperty(this, "sessionId", i({ prefix: "ses" })), _defineProperty(this, "currentAgent", u(() => {
701
701
  let e = this.activeUser.value;
702
702
  if (!e?.agents) return;
703
703
  let t = e.primaryAgentId || e.agents[0]?.agentId;
704
704
  if (t) return e.agents.find((e) => e.agentId === t);
705
- })), _defineProperty(this, "currentOrg", l(() => {
705
+ })), _defineProperty(this, "currentOrg", u(() => {
706
706
  let e = this.currentAgent.value;
707
707
  if (!e?.orgId) return;
708
708
  let t = this.activeUser.value;
709
709
  if (t?.orgs) return t.orgs.find((t) => t.orgId === e.orgId);
710
- })), _defineProperty(this, "initialized", void 0), _defineProperty(this, "resolveUser", void 0), _defineProperty(this, "agent", void 0), _defineProperty(this, "auth", void 0), _defineProperty(this, "billing", void 0), _defineProperty(this, "chat", void 0), _defineProperty(this, "user", void 0), w.set(this);
710
+ })), _defineProperty(this, "initialized", void 0), _defineProperty(this, "resolveUser", void 0), _defineProperty(this, "agent", void 0), _defineProperty(this, "auth", void 0), _defineProperty(this, "billing", void 0), _defineProperty(this, "chat", void 0), _defineProperty(this, "user", void 0), T.set(this);
711
711
  let n = {
712
712
  apiFetch: createApiFetch({
713
713
  isDev: this.isDev,
@@ -754,10 +754,10 @@ var ChatClient = class {
754
754
  this.logger.info("Clearing session"), this.activeUser.value = void 0, this.token.value = null, this.deviceId.value = null, this.error.value = null, this.storage.clearStorage();
755
755
  }
756
756
  clear() {
757
- this.logger.info("Clearing SDK completely"), this.clearSession(), this.loading.value = !1, this.sessionId = i({ prefix: "ses" }), w.delete();
757
+ this.logger.info("Clearing SDK completely"), this.clearSession(), this.loading.value = !1, this.sessionId = i({ prefix: "ses" }), T.delete();
758
758
  }
759
759
  };
760
760
  //#endregion
761
- export { AuthClient as a, resolveApiBase as c, BillingClient as i, UserClient as n, AgentClient as o, ChatClient as r, _defineProperty as s, T as t };
761
+ export { AuthClient as a, resolveApiBase as c, BillingClient as i, UserClient as n, AgentClient as o, ChatClient as r, _defineProperty as s, E as t };
762
762
 
763
763
  //# sourceMappingURL=sdkClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdkClient.js","names":[],"sources":["../api.ts","../../../node_modules/.pnpm/nanostores@1.4.1/node_modules/nanostores/clean-stores/index.js","../../../node_modules/.pnpm/nanostores@1.4.1/node_modules/nanostores/atom/index.js","../sdkStorage.ts","../clients/AgentClient.ts","../clients/AuthClient.ts","../clients/BillingClient.ts","../clients/ChatClient.ts","../clients/UserClient.ts","../sdkClient.ts"],"sourcesContent":["import type { ApiResponse } from '@pagelines/core'\nimport { cookieUtil, PAGELINES_APP_CONFIG } 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 const port = Number(globalThis.process?.env?.PORT) || PAGELINES_APP_CONFIG.port\n return apiBase || (isDev ? `http://localhost:${port}` : PAGELINES_APP_CONFIG.urls.app)\n}\n\nexport function createApiFetch(\n settings: ApiClientSettings,\n responseHandler?: (response: ApiResponse) => void,\n /**\n * Fires when the server answers 401 TOKEN_ERROR — the one long-lived\n * session token is dead (revoked / expired / signed out elsewhere).\n * There is no refresh to attempt; the caller clears its session state.\n */\n onSessionDead?: () => void,\n): typeof globalThis.fetch {\n const baseUrl = resolveApiBase(settings.apiBase, settings.isDev)\n\n return async (input: RequestInfo | URL, init?: RequestInit) => {\n const token = cookieUtil.getAuthToken()\n const headers = new Headers(init?.headers)\n if (!headers.has('Content-Type'))\n headers.set('Content-Type', 'application/json')\n if (token && !headers.has('Authorization'))\n headers.set('Authorization', `Bearer ${token}`)\n\n const requestInput = typeof input === 'string' && input.startsWith('/')\n ? `${baseUrl}${input}`\n : input\n\n const response = await fetch(requestInput, {\n ...init,\n headers,\n credentials: 'include',\n })\n\n if (onSessionDead && response.status === 401) {\n const body = await response.clone().json().catch(() => undefined) as { code?: string } | undefined\n if (body?.code === 'TOKEN_ERROR')\n onSessionDead()\n }\n\n if (responseHandler) {\n const originalJson = response.json.bind(response)\n response.json = async () => {\n const result = await originalJson()\n if (typeof result === 'object' && result !== null) {\n if ('ok' in result && ('user' in result || 'token' in result))\n responseHandler(result as ApiResponse)\n }\n return result\n }\n }\n\n return response\n }\n}\n","import { cleanTasks } from '../task/index.js'\n\nexport const clean = Symbol('clean')\n\nexport const 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\nlet batchSeen = null\nconst QUEUE_ITEMS_PER_LISTENER = 4\n// Use globalThis.nanostoresGlobal to store epoch so all module instances share\n// the same counter. This fixes issues when Nano Store is bundled separately\n// in different parts of an application (e.g., tree-shaking separates core\n// from React), causing each bundle to have its own epoch instance.\nexport const nanostoresGlobal = (globalThis.nanostoresGlobal ||= { epoch: 0 })\n\nlet drainQueue = () => {\n for (\n lqIndex = 0;\n lqIndex < listenerQueue.length;\n lqIndex += QUEUE_ITEMS_PER_LISTENER\n ) {\n listenerQueue[lqIndex](\n listenerQueue[lqIndex + 1].value,\n listenerQueue[lqIndex + 2],\n listenerQueue[lqIndex + 3]\n )\n }\n listenerQueue.length = 0\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport const batch = fn => {\n let outer = !batchSeen\n if (outer) batchSeen = new Set()\n try {\n fn()\n } finally {\n if (outer) {\n try {\n if (listenerQueue.length) drainQueue()\n } finally {\n batchSeen = null\n }\n }\n }\n}\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 init: initialValue,\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 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 nanostoresGlobal.epoch++\n let runListenerQueue = !listenerQueue.length && !batchSeen\n for (let listener of listeners) {\n if (batchSeen?.has(listener)) continue\n batchSeen?.add(listener)\n listenerQueue.push(\n listener,\n $atom,\n oldValue,\n batchSeen ? undefined : changedKey\n )\n }\n\n if (runListenerQueue) {\n drainQueue()\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\n// atoms when both run on the same page (Astro multi-island, dashboard preview\n// of a widget, etc.). Each bundle has its own Vue instance — without these\n// globals, signing in to one wouldn't reflect in the other.\n//\n// Web's HttpOnly pl-session cookie is NOT in nanostores — JS cannot read it.\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>>\nconst $globalDeviceId = (_g.__PL_AUTH_DEVICE_ID__ ??= atom<string | null>(null)) as ReturnType<typeof atom<string | null>>\n\nexport interface AuthRefs {\n activeUser: Ref<EnrichedUser | undefined>\n token: Ref<string | null>\n deviceId: Ref<string | null>\n}\n\n/**\n * SDKStorage - Handles all storage, sync, and persistence for PageLinesSDK\n *\n * Three storage layers, each with a clear job:\n * - Vue refs — runtime source of truth (in-memory)\n * - cookies — survive reload; auth-token is transitional JS Bearer mirror, deviceId is telemetry\n * - nanostores — bridge SDK widget bundle ↔ main app bundle on same page\n * - localStorage — UX optimization for cold-load (user object only, never tokens)\n *\n * Web's HttpOnly pl-session cookie is server-owned — JS has no access to it,\n * so it never touches any of these layers.\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-bundle persistence.\n */\n syncWithGlobalStores(refs: AuthRefs): void {\n const { activeUser, token, deviceId } = refs\n\n // 1. Restore from global store on init\n const storedUser = $globalActiveUser.get()\n const storedToken = $globalToken.get()\n const storedDevice = $globalDeviceId.get()\n\n if (storedUser) activeUser.value = storedUser\n if (storedToken) token.value = storedToken\n if (storedDevice) deviceId.value = storedDevice\n\n // 2. Vue refs → global stores (for persistence)\n watch(activeUser, (v) => $globalActiveUser.set(v), { immediate: true })\n watch(token, (v) => $globalToken.set(v), { immediate: true })\n watch(deviceId, (v) => $globalDeviceId.set(v), { immediate: true })\n\n // 3. Global stores → Vue refs (for cross-page updates)\n $globalActiveUser.subscribe((v) => { if (v !== activeUser.value) activeUser.value = v })\n $globalToken.subscribe((v) => { if (v !== token.value) token.value = v })\n $globalDeviceId.subscribe((v) => { if (v !== deviceId.value) deviceId.value = v })\n }\n\n /**\n * Load user and token from browser storage on initialization.\n * deviceId comes from a server-set non-HttpOnly cookie (read-only for JS).\n */\n loadFromStorage(refs: AuthRefs): void {\n if (typeof window === 'undefined')\n return\n\n const savedToken = cookieUtil.getAuthToken()\n if (savedToken) refs.token.value = savedToken\n\n const savedDevice = cookieUtil.getDeviceId()\n if (savedDevice) refs.deviceId.value = savedDevice\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 refs.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 the transitional JS session-token mirror to browser storage.\n * deviceId is server-owned (Set-Cookie) — JS doesn't write it.\n */\n saveToStorage(refs: AuthRefs): void {\n if (typeof window === 'undefined')\n return\n\n if (refs.token.value) cookieUtil.setAuthToken(refs.token.value)\n else cookieUtil.removeAuthToken()\n\n // Save user to localStorage for quick loading\n if (this.isLocalStorageFunctional()) {\n try {\n if (refs.activeUser.value) {\n localStorage.setItem('pagelines-user', JSON.stringify(refs.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 local stored user data and JS-owned tokens. Server-owned cookies\n * (pl-session, pl-device-id) are cleared by /api/auth/logout via\n * Set-Cookie max-age=0 — JS can't touch them.\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 $globalDeviceId.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 { AgentConfig, LiveStatus } from '@pagelines/core'\nimport type { SDKContext } from './types'\nimport { resolveApiBase } from '../api'\n\nexport class AgentClient {\n constructor(private ctx: SDKContext) {}\n\n async create(args: { name: string, orgId?: string }): Promise<AgentConfig> {\n const orgId = args.orgId || this.resolveOrgId()\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n\n const response = await fetch(`${apiBase}/api/agents`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Idempotency-Key': globalThis.crypto.randomUUID(),\n ...(this.ctx.token.value && { Authorization: `Bearer ${this.ctx.token.value}` }),\n },\n body: JSON.stringify({ name: args.name, orgId }),\n })\n\n const data = await response.json() as { ok: boolean, data?: AgentConfig, error?: string }\n\n if (!data.ok || !data.data) {\n const msg = data.error || 'Failed to create agent'\n this.ctx.error.value = msg\n throw new Error(msg)\n }\n\n this.ctx.processApiResponse(data as any)\n return data.data\n }\n\n /**\n * Live runtime status — the same canonical `LiveStatus` shape every other\n * status producer emits (`GET /agents` rows, SSE status frames, lifecycle\n * action responses). See plans/bots/bot-state-management.md.\n * `{ lifecycle: 'unknown' }` is the graceful degrade on any fetch failure.\n */\n async getLiveStatus(args: { agentId: string }): Promise<LiveStatus> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n\n try {\n const response = await fetch(`${apiBase}/api/agents/state?ids=${encodeURIComponent(args.agentId)}`, {\n headers: {\n ...(this.ctx.token.value && { Authorization: `Bearer ${this.ctx.token.value}` }),\n },\n })\n\n const data = await response.json() as { ok: boolean, data?: Record<string, LiveStatus> }\n return data.ok ? data.data?.[args.agentId] ?? { lifecycle: 'unknown' } : { lifecycle: 'unknown' }\n } catch (err) {\n this.ctx.logger.warn('agent.getLiveStatus failed', {\n agentId: args.agentId,\n error: err instanceof Error ? err.message : String(err),\n })\n return { lifecycle: 'unknown' }\n }\n }\n\n /**\n * Poll until the agent's lifecycle reaches `running`. `onStatus` receives\n * the server-reported lifecycle verbatim ('starting', 'running', …) so the\n * caller renders feedback tied to actual provisioner state, not a rotating\n * set of decorative messages. Per first-principles → \"Always give feedback\n * — no magic\". Map lifecycle values to user copy at the call site.\n */\n async waitUntilReady(args: {\n agentId: string\n onStatus?: (lifecycle: LiveStatus['lifecycle']) => void\n timeoutMs?: number\n pollIntervalMs?: number\n }): Promise<void> {\n const { agentId, onStatus, timeoutMs = 300_000, pollIntervalMs = 3_000 } = args\n const start = Date.now()\n let lastLifecycle: LiveStatus['lifecycle'] | undefined\n\n while (Date.now() - start < timeoutMs) {\n const status = await this.getLiveStatus({ agentId })\n\n if (status.lifecycle === 'running') {\n onStatus?.('running')\n return\n }\n\n if (status.lifecycle === 'error')\n throw new Error(status.detail || 'Your bot hit a problem starting')\n\n // Only fire onStatus on change — avoids spamming the caller's UI with\n // redundant updates on every poll tick.\n if (status.lifecycle !== lastLifecycle) {\n onStatus?.(status.lifecycle)\n lastLifecycle = status.lifecycle\n }\n\n await new Promise((r) => setTimeout(r, pollIntervalMs))\n }\n\n throw new Error('Your bot is taking longer than expected — please try again')\n }\n\n /** Send a typed webhook event to a bot agent. No auth required — the proxy is public. */\n async webhook<T = Record<string, unknown>>(args: {\n agentId: string\n type: string\n data: T\n meta?: { source?: string, timestamp?: string, correlationId?: string, [key: string]: unknown }\n }): Promise<{ ok: boolean, error?: string }> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const url = `${apiBase}/api/bot-api/webhooks/agents/${args.agentId}`\n\n const body: Record<string, unknown> = { type: args.type, data: args.data }\n if (args.meta) body.meta = args.meta\n\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n\n if (!res.ok) {\n const text = await res.text().catch(() => 'Unknown error')\n throw new Error(`Webhook delivery failed (${res.status}): ${text.slice(0, 200)}`)\n }\n\n return res.json() as Promise<{ ok: boolean, error?: string }>\n }\n\n private resolveOrgId(): string {\n const user = this.ctx.activeUser.value\n const orgId = user?.orgs?.[0]?.orgId\n if (!orgId) {\n throw new Error('No organization found. Please sign in first.')\n }\n return orgId\n }\n}\n","import type { EnrichedUser } from '@pagelines/core'\nimport type { SDKContext } from './types'\nimport { resolveApiBase } from '../api'\n\nconst USER_HYDRATION_ERROR = 'Signed in, but your account could not be loaded. Try again.'\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 private async authenticateWithCode(email: string, code: string): Promise<EnrichedUser> {\n const response = await this.ctx.apiFetch('/api/auth/verify-code', {\n method: 'POST',\n body: JSON.stringify({ email, code }),\n })\n const data = await response.json() as { ok: true } | { ok: false, error: string }\n if (!data.ok)\n throw new Error(data.error)\n\n const user = await this.getCurrentUser()\n if (!user)\n throw new Error(USER_HYDRATION_ERROR)\n return user\n }\n\n async sendCode(email: string): Promise<void> {\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.apiFetch('/api/auth/check-email', {\n method: 'POST',\n body: JSON.stringify({ email }),\n })\n const data = await response.json() as { ok: true } | { ok: false, error: string }\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 await this.authenticateWithCode(email, code)\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 logout(): Promise<void> {\n return withLoadingState(this.ctx, async () => {\n try {\n await this.ctx.apiFetch('/api/auth/logout', { method: '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.apiFetch('/api/users/me', {\n method: 'GET',\n })\n const data = await response.json() as { ok: true, data: EnrichedUser } | { ok: false, error: string }\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 // Set activeUser directly — `/users/me` envelope is\n // `{ ok: true, data: enrichedUser }`. processApiResponse is shaped\n // for sign-in responses (token + user + deviceId at the top level);\n // synthesizing a fake legacy envelope to feed it is shadow-state.\n // The token check guards against stale in-flight responses landing\n // after a logout cleared the session.\n if (this.ctx.token.value)\n this.ctx.activeUser.value = data.data\n return data.data\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.apiFetch('/api/auth/check-email', {\n method: 'POST',\n body: JSON.stringify({ email: args.email }),\n })\n const data = await response.json() as { ok: true } | { ok: false, error: string }\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 await this.authenticateWithCode(args.email, args.code)\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 // eslint-disable-next-line ts/no-misused-promises -- addEventListener types the handler as void-returning; the hydration below must be awaited\n const handler = async (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 } = event.data\n\n // The auth response carries no user — its envelope is\n // `{ redirect, redirectReason, isNew, deviceId }` plus the token. Set the\n // token, then hydrate the same way every other entry point does, or\n // `onSuccess` fires with `undefined` and a real session reads to the\n // caller as \"nothing happened\".\n this.ctx.processApiResponse({ ok: true, data: {}, token })\n const user = await this.getCurrentUser()\n if (!user) {\n // A token without an account is not a sign-in. Reporting success here\n // is what made a real failure look like nothing happening.\n this.ctx.error.value = USER_HYDRATION_ERROR\n this.ctx.logger.error('Google login: token accepted but user hydration failed')\n args?.onError?.(USER_HYDRATION_ERROR)\n return\n }\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 { SDKContext } from './types'\nimport { resolveApiBase } from '../api'\n\nexport interface BillingStatus {\n plan?: string\n status: string\n hasActiveBilling: boolean\n maxAgents: number\n trialEnd?: string\n trialDaysRemaining?: number\n paymentRecovery?: {\n graceEndsAt?: string\n suspended: boolean\n url?: string\n }\n}\n\nexport class BillingClient {\n constructor(private ctx: SDKContext) {}\n\n async confirmCheckout(args?: { sessionId?: string }): Promise<BillingStatus> {\n if (args?.sessionId) {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const response = await fetch(`${apiBase}/api/billing/complete-checkout`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.ctx.token.value && { Authorization: `Bearer ${this.ctx.token.value}` }),\n },\n body: JSON.stringify({ sessionId: args.sessionId }),\n })\n\n const data = await response.json() as { ok: boolean, error?: string }\n if (!data.ok) {\n const msg = data.error || 'Failed to complete checkout'\n this.ctx.error.value = msg\n throw new Error(msg)\n }\n }\n\n return this.getStatus()\n }\n\n async getStatus(): Promise<BillingStatus> {\n const orgId = this.resolveOrgId()\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n\n const response = await fetch(`${apiBase}/api/billing/details/${orgId}`, {\n headers: {\n ...(this.ctx.token.value && { Authorization: `Bearer ${this.ctx.token.value}` }),\n },\n })\n\n const data = await response.json() as {\n ok: boolean\n data?: {\n plan: string\n status: string\n maxAgents: number\n trialEnd?: string\n trialDaysRemaining?: number\n paymentRecovery?: BillingStatus['paymentRecovery']\n }\n error?: string\n }\n\n if (!data.ok || !data.data) {\n return {\n plan: undefined,\n status: 'none',\n hasActiveBilling: false,\n maxAgents: 0,\n }\n }\n\n const hasActiveBilling = ['active', 'trial', 'canceling'].includes(data.data.status)\n || (data.data.status === 'past_due' && data.data.paymentRecovery?.suspended !== true)\n\n return {\n plan: data.data.plan,\n status: data.data.status,\n hasActiveBilling,\n maxAgents: data.data.maxAgents,\n ...(data.data.trialEnd && { trialEnd: data.data.trialEnd }),\n ...(data.data.trialDaysRemaining !== undefined && { trialDaysRemaining: data.data.trialDaysRemaining }),\n ...(data.data.paymentRecovery && { paymentRecovery: data.data.paymentRecovery }),\n }\n }\n\n private resolveOrgId(): string {\n const user = this.ctx.activeUser.value\n const orgId = user?.orgs?.[0]?.orgId\n if (!orgId) {\n throw new Error('No organization found. Please sign in first.')\n }\n return orgId\n }\n}\n","import type { ApiResponse, ChatAttachmentInput, ChatMessage as WireChatMessage, ChatToolActivityData } from '@pagelines/core'\nimport type { ChatMessage } from '../agent/schema'\nimport type { SDKContext } from './types'\nimport type { ChatEvent, ChatStreamError, ChatTurnStreamTransportError } from '@pagelines/core'\nimport { runAuthenticatedChatTurnStream, shortId, toChatStreamError, zChatEvent } from '@pagelines/core'\nimport { resolveApiBase } from '../api'\n\ntype CancelConversationTurnResponse = { cancelled: boolean, cancelledTurnIds: string[] }\n\nfunction parseChatEvent(frame: string): ChatEvent | null {\n const lines = frame.split('\\n').filter((l) => l.length > 0)\n let name: string | undefined\n let payload: string | undefined\n for (const line of lines) {\n if (line.startsWith('event:'))\n name = line.slice(6).trim()\n else if (line.startsWith('data:'))\n payload = line.slice(5).trim()\n }\n if (!name || payload === undefined)\n return null\n try {\n const parsed = zChatEvent.safeParse({ event: name, data: JSON.parse(payload) })\n return parsed.success ? parsed.data : null\n } catch {\n return null\n }\n}\n\nfunction toAuthenticatedTransportError(error: ChatTurnStreamTransportError): string {\n if (error.stage === 'stream-open' && error.message.startsWith('HTTP '))\n return `Stream failed: ${error.message}`\n return error.message\n}\n\nfunction detectBrowserTimezone(): string | undefined {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || undefined\n } catch {\n return undefined\n }\n}\n\nfunction toChatMessage(message: WireChatMessage): ChatMessage | undefined {\n if (message.role !== 'assistant' && message.role !== 'system')\n return undefined\n return {\n id: message.messageId,\n text: message.content,\n sender: message.role === 'system' ? 'system' : 'agent',\n timestamp: message.createdAt,\n conversationId: message.conversationId,\n sequence: message.sequence,\n systemKind: message.systemKind,\n ...(message.metadata?.turnOutcome ? { turnOutcome: message.metadata.turnOutcome } : {}),\n ...(message.metadata?.attachments?.length\n ? { attachments: message.metadata.attachments }\n : {}),\n ...(message.metadata?.toolActivities?.length\n ? { toolActivities: message.metadata.toolActivities }\n : {}),\n ...(message.metadata?.issue ? { issue: message.metadata.issue } : {}),\n }\n}\n\nexport class ChatClient {\n constructor(private ctx: SDKContext) {}\n\n async cancelConversationTurn(args: {\n conversationId: string\n turnId?: string\n }): Promise<CancelConversationTurnResponse> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const authHeaders: Record<string, string> = this.ctx.token.value\n ? { Authorization: `Bearer ${this.ctx.token.value}` }\n : {}\n\n const res = await fetch(`${apiBase}/api/conversations/${encodeURIComponent(args.conversationId)}/cancel`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...authHeaders },\n body: JSON.stringify(args.turnId ? { turnId: args.turnId } : {}),\n })\n const result = await res.json() as ApiResponse<CancelConversationTurnResponse>\n if (!result.ok)\n throw new Error(result.error || `Cancel failed: HTTP ${res.status}`)\n return result.data\n }\n\n /**\n * Public/visitor chat — anonymous chat against an agent's public handle,\n * routed through the messaging substrate. Same SSE wire format as\n * `chatStreamAuthenticated` — the only difference is the route (no auth,\n * handle-based lookup, anonymousId instead of userId).\n *\n * The visitor identity is `anonymousId` — caller is responsible for\n * generating + persisting it (typically `sdk.user.generateAnonId()`\n * which stores a stable ID in localStorage).\n */\n async chatStreamPublic(args: {\n handle: string\n message: string\n anonymousId: string\n attachments?: ChatAttachmentInput[]\n context?: string\n onDelta: (text: string, role?: 'assistant' | 'system') => void\n onMessage?: (message: ChatMessage) => void\n onDone: (conversationId: string) => void\n onError: (error: string | ChatStreamError) => void\n onStatus?: (status: string) => void\n onToolActivity?: (activity: ChatToolActivityData) => void\n onWorkingEnd?: () => void\n }): Promise<void> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const url = `${apiBase}/api/agents/public/${encodeURIComponent(args.handle)}/chat/v2/stream`\n\n let conversationId = ''\n let errorSeen = false\n let assistantSeen = false\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n message: args.message,\n anonymousId: args.anonymousId,\n ...(args.attachments?.length ? { attachments: args.attachments } : {}),\n ...(args.context ? { context: args.context } : {}),\n }),\n })\n\n if (!res.ok) {\n const errorBody = await res.json().catch(() => ({ error: 'Request failed' })) as { error?: string }\n args.onError(errorBody.error || `HTTP ${res.status}`)\n return\n }\n\n // Server emits the resolved conversationId in a response header so the\n // SDK can persist it across page loads (e.g. for \"resume conversation\"\n // flows). The substrate would also have a `message` event with the\n // conversationId on the persisted user msg, but the header arrives\n // first and is cheaper to parse.\n conversationId = res.headers.get('X-Conversation-Id') || ''\n reader = res.body?.getReader()\n if (!reader) {\n args.onError('No response stream')\n return\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n outer: while (true) {\n const { done, value } = await reader.read()\n if (done)\n break\n buffer += decoder.decode(value, { stream: true })\n let sep = buffer.indexOf('\\n\\n')\n while (sep !== -1) {\n const frame = buffer.slice(0, sep)\n buffer = buffer.slice(sep + 2)\n const event = parseChatEvent(frame)\n if (event) {\n if (event.event === 'working_state') {\n args.onStatus?.(event.data.description)\n } else if (event.event === 'tool_activity') {\n args.onToolActivity?.(event.data)\n } else if (event.event === 'working_end') {\n args.onWorkingEnd?.()\n } else if (event.event === 'message_delta') {\n args.onDelta(event.data.delta, event.data.role)\n } else if (event.event === 'error') {\n errorSeen = true\n args.onError(toChatStreamError(event.data))\n break outer\n } else if (event.event === 'message' && (event.data.message.role === 'assistant' || event.data.message.role === 'system')) {\n assistantSeen = true\n const message = toChatMessage(event.data.message)\n if (message)\n args.onMessage?.(message)\n // Wait for stream_end — the v2 route emits it after the\n // assistant message lands so deltas-then-message ordering is\n // preserved without breaking out early.\n } else if (event.event === 'stream_end') {\n break outer\n }\n }\n sep = buffer.indexOf('\\n\\n')\n }\n }\n\n if (!errorSeen && assistantSeen)\n args.onDone(conversationId)\n else if (!errorSeen)\n args.onError('[no-reply] Stream ended before reply arrived')\n } catch (err) {\n args.onError(err instanceof Error ? err.message : 'Stream failed')\n } finally {\n try {\n await reader?.cancel()\n } catch {\n // Stream already closed.\n }\n }\n }\n\n\n /**\n * Authenticated chat — substrate-backed:\n * POST /api/conversations, open SSE from that conversation's latest\n * sequence, then POST /api/messages. Opening the stream before send keeps\n * fast working_state / message_delta frames from outrunning the subscriber.\n * Same callback contract as `chatStream` so callers don't need transport details.\n * Mirrors `src/modules/agent/client.ts → sendChatMessageStream`.\n */\n async chatStreamAuthenticated(args: {\n agentId: string\n message: string\n attachments?: ChatAttachmentInput[]\n /** Reserved — substrate resolves conversation server-side from (userId, agentId). */\n conversationId?: string\n /** Reserved — substrate replays history from the canonical messages table. */\n history?: Array<{ role: 'user' | 'assistant', content: string }>\n onDelta: (text: string, role?: 'assistant' | 'system') => void\n onMessage?: (message: ChatMessage) => void\n onDone: (conversationId: string) => void\n onError: (error: string | ChatStreamError) => void\n onStatus?: (status: string) => void\n onToolActivity?: (activity: ChatToolActivityData) => void\n onWorkingEnd?: () => void\n }): Promise<void> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const authHeaders: Record<string, string> = this.ctx.token.value\n ? { Authorization: `Bearer ${this.ctx.token.value}` }\n : {}\n\n // 1. Resolve the conversation — `POST /conversations` returns the\n // singleton (user, agent) conversationId. Chat is conversation-addressed.\n let conversationId: string\n let latestSequence: string | null = null\n try {\n const res = await fetch(`${apiBase}/api/conversations`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...authHeaders },\n body: JSON.stringify({ agentId: args.agentId }),\n })\n const result = await res.json() as ApiResponse<{ conversationId: string, latestSequence?: string | null }>\n if (!result.ok) {\n args.onError(result.error || `Conversation failed: HTTP ${res.status}`)\n return\n }\n conversationId = result.data.conversationId\n latestSequence = result.data.latestSequence ?? null\n } catch (err) {\n args.onError(err instanceof Error ? err.message : 'Conversation failed')\n return\n }\n\n const streamUrl = latestSequence\n ? `${apiBase}/api/conversations/${encodeURIComponent(conversationId)}/stream?since=${encodeURIComponent(latestSequence)}`\n : `${apiBase}/api/conversations/${encodeURIComponent(conversationId)}/stream`\n const clientNonce = `nonce_${shortId(16)}`\n const viewerTimezone = detectBrowserTimezone()\n await runAuthenticatedChatTurnStream({\n streamUrl,\n sendUrl: `${apiBase}/api/messages`,\n headers: authHeaders,\n sendBody: {\n conversationId,\n content: args.message,\n clientNonce,\n ...(viewerTimezone ? { viewerTimezone } : {}),\n ...(args.attachments && args.attachments.length > 0 ? { attachments: args.attachments } : {}),\n },\n onStatus: args.onStatus,\n onDelta: args.onDelta,\n onToolActivity: args.onToolActivity,\n onWorkingEnd: args.onWorkingEnd,\n onMessage: (message) => {\n const chatMessage = toChatMessage(message)\n if (chatMessage)\n args.onMessage?.(chatMessage)\n },\n onDone: () => args.onDone(conversationId),\n onChatError: (error) => args.onError(toChatStreamError(error)),\n // A coded rejection (e.g. TURN_ACTIVE) stays structured so the\n // controller can switch on it; only uncoded transport failures\n // flatten to the legacy string path.\n onTransportError: (error) => args.onError(error.code\n ? { code: error.code, error: error.message }\n : toAuthenticatedTransportError(error)),\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.apiFetch(`/api/agents/public/${encodeURIComponent(args.handle)}`)\n\n const data = await response.json() as { ok: true, data: AgentConfig } | { ok: false, error: string }\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.apiFetch(`/api/agents/by-email/${encodeURIComponent(args.email)}`)\n\n const data = await response.json() as { ok: true, data: AgentConfig } | { ok: false, error: string }\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 { ApiResponse, EnrichedUser } from '@pagelines/core'\nimport { objectId, SettingsObject } from '@pagelines/core'\nimport { computed, ref } from 'vue'\nimport { createApiFetch } from './api'\nimport { SDKStorage } from './sdkStorage'\nimport { AgentClient } from './clients/AgentClient'\nimport { AuthClient } from './clients/AuthClient'\nimport { BillingClient } from './clients/BillingClient'\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 // Opaque session token for Bearer clients. Web may also have the same\n // credential in the HttpOnly pl-session cookie, which JS cannot read.\n deviceId = 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 // 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 agent!: AgentClient\n readonly auth!: AuthClient\n readonly billing!: BillingClient\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 // Shared fetch with response handler. One long-lived session token —\n // a 401 TOKEN_ERROR means the session is dead; clear local state.\n const apiFetch = createApiFetch(\n { isDev: this.isDev, apiBase: this.apiBase },\n this.processApiResponse.bind(this),\n () => this.clearSession(),\n )\n\n // Build shared context for sub-clients\n const ctx: SDKContext = {\n apiFetch,\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.agent = new AgentClient(ctx)\n this.auth = new AuthClient(ctx)\n this.billing = new BillingClient(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.authRefs())\n\n // Sync with global stores for persistence across navigation\n this.storage.syncWithGlobalStores(this.authRefs())\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.auth.getCurrentUser().then((user) => {\n if (this.resolveUser) {\n this.resolveUser(user)\n this.resolveUser = undefined\n }\n }).catch((err: unknown) => {\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 if (!response.ok) return\n\n let dirty = false\n\n if (response.user) {\n this.activeUser.value = response.user\n this.logger.info('User updated from API response', { data: response.user })\n dirty = true\n }\n\n if (response.token) {\n this.token.value = response.token\n this.logger.info('Token updated from API response')\n dirty = true\n }\n\n // deviceId rides inside data.* on /verify-code and Apple/Google routes.\n // Server ALSO sets it as a non-HttpOnly cookie — we mirror to the ref\n // so the rest of the SDK can observe \"we're paired\" reactively.\n const incomingDeviceId = (response.data as { deviceId?: string } | undefined)?.deviceId\n if (incomingDeviceId) {\n this.deviceId.value = incomingDeviceId\n dirty = true\n }\n\n if (dirty) this.persistAuth()\n\n // Resolve initialization promise\n if (this.resolveUser) {\n this.resolveUser(response.user)\n this.resolveUser = undefined\n }\n }\n\n private authRefs() {\n return {\n activeUser: this.activeUser,\n token: this.token,\n deviceId: this.deviceId,\n }\n }\n\n private persistAuth() {\n this.storage.saveToStorage(this.authRefs())\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.deviceId.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"],"x_google_ignoreList":[1,2],"mappings":"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"}
1
+ {"version":3,"file":"sdkClient.js","names":[],"sources":["../api.ts","../../../node_modules/.pnpm/nanostores@1.4.1/node_modules/nanostores/clean-stores/index.js","../../../node_modules/.pnpm/nanostores@1.4.1/node_modules/nanostores/atom/index.js","../sdkStorage.ts","../clients/AgentClient.ts","../clients/AuthClient.ts","../clients/BillingClient.ts","../clients/ChatClient.ts","../clients/UserClient.ts","../sdkClient.ts"],"sourcesContent":["import type { ApiResponse } from '@pagelines/core'\nimport { cookieUtil, PAGELINES_APP_CONFIG } 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 const port = Number(globalThis.process?.env?.PORT) || PAGELINES_APP_CONFIG.port\n return apiBase || (isDev ? `http://localhost:${port}` : PAGELINES_APP_CONFIG.urls.app)\n}\n\nexport function createApiFetch(\n settings: ApiClientSettings,\n responseHandler?: (response: ApiResponse) => void,\n /**\n * Fires when the server answers 401 TOKEN_ERROR — the one long-lived\n * session token is dead (revoked / expired / signed out elsewhere).\n * There is no refresh to attempt; the caller clears its session state.\n */\n onSessionDead?: () => void,\n): typeof globalThis.fetch {\n const baseUrl = resolveApiBase(settings.apiBase, settings.isDev)\n\n return async (input: RequestInfo | URL, init?: RequestInit) => {\n const token = cookieUtil.getAuthToken()\n const headers = new Headers(init?.headers)\n if (!headers.has('Content-Type'))\n headers.set('Content-Type', 'application/json')\n if (token && !headers.has('Authorization'))\n headers.set('Authorization', `Bearer ${token}`)\n\n const requestInput = typeof input === 'string' && input.startsWith('/')\n ? `${baseUrl}${input}`\n : input\n\n const response = await fetch(requestInput, {\n ...init,\n headers,\n credentials: 'include',\n })\n\n if (onSessionDead && response.status === 401) {\n const body = await response.clone().json().catch(() => undefined) as { code?: string } | undefined\n if (body?.code === 'TOKEN_ERROR')\n onSessionDead()\n }\n\n if (responseHandler) {\n const originalJson = response.json.bind(response)\n response.json = async () => {\n const result = await originalJson()\n if (typeof result === 'object' && result !== null) {\n if ('ok' in result && ('user' in result || 'token' in result))\n responseHandler(result as ApiResponse)\n }\n return result\n }\n }\n\n return response\n }\n}\n","import { cleanTasks } from '../task/index.js'\n\nexport const clean = Symbol('clean')\n\nexport const 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\nlet batchSeen = null\nconst QUEUE_ITEMS_PER_LISTENER = 4\n// Use globalThis.nanostoresGlobal to store epoch so all module instances share\n// the same counter. This fixes issues when Nano Store is bundled separately\n// in different parts of an application (e.g., tree-shaking separates core\n// from React), causing each bundle to have its own epoch instance.\nexport const nanostoresGlobal = (globalThis.nanostoresGlobal ||= { epoch: 0 })\n\nlet drainQueue = () => {\n for (\n lqIndex = 0;\n lqIndex < listenerQueue.length;\n lqIndex += QUEUE_ITEMS_PER_LISTENER\n ) {\n listenerQueue[lqIndex](\n listenerQueue[lqIndex + 1].value,\n listenerQueue[lqIndex + 2],\n listenerQueue[lqIndex + 3]\n )\n }\n listenerQueue.length = 0\n}\n\n/* @__NO_SIDE_EFFECTS__ */\nexport const batch = fn => {\n let outer = !batchSeen\n if (outer) batchSeen = new Set()\n try {\n fn()\n } finally {\n if (outer) {\n try {\n if (listenerQueue.length) drainQueue()\n } finally {\n batchSeen = null\n }\n }\n }\n}\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 init: initialValue,\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 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 nanostoresGlobal.epoch++\n let runListenerQueue = !listenerQueue.length && !batchSeen\n for (let listener of listeners) {\n if (batchSeen?.has(listener)) continue\n batchSeen?.add(listener)\n listenerQueue.push(\n listener,\n $atom,\n oldValue,\n batchSeen ? undefined : changedKey\n )\n }\n\n if (runListenerQueue) {\n drainQueue()\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\n// atoms when both run on the same page (Astro multi-island, dashboard preview\n// of a widget, etc.). Each bundle has its own Vue instance — without these\n// globals, signing in to one wouldn't reflect in the other.\n//\n// Web's HttpOnly pl-session cookie is NOT in nanostores — JS cannot read it.\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>>\nconst $globalDeviceId = (_g.__PL_AUTH_DEVICE_ID__ ??= atom<string | null>(null)) as ReturnType<typeof atom<string | null>>\n\nexport interface AuthRefs {\n activeUser: Ref<EnrichedUser | undefined>\n token: Ref<string | null>\n deviceId: Ref<string | null>\n}\n\n/**\n * SDKStorage - Handles all storage, sync, and persistence for PageLinesSDK\n *\n * Three storage layers, each with a clear job:\n * - Vue refs — runtime source of truth (in-memory)\n * - cookies — survive reload; auth-token is transitional JS Bearer mirror, deviceId is telemetry\n * - nanostores — bridge SDK widget bundle ↔ main app bundle on same page\n * - localStorage — UX optimization for cold-load (user object only, never tokens)\n *\n * Web's HttpOnly pl-session cookie is server-owned — JS has no access to it,\n * so it never touches any of these layers.\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-bundle persistence.\n */\n syncWithGlobalStores(refs: AuthRefs): void {\n const { activeUser, token, deviceId } = refs\n\n // 1. Restore from global store on init\n const storedUser = $globalActiveUser.get()\n const storedToken = $globalToken.get()\n const storedDevice = $globalDeviceId.get()\n\n if (storedUser) activeUser.value = storedUser\n if (storedToken) token.value = storedToken\n if (storedDevice) deviceId.value = storedDevice\n\n // 2. Vue refs → global stores (for persistence)\n watch(activeUser, (v) => $globalActiveUser.set(v), { immediate: true })\n watch(token, (v) => $globalToken.set(v), { immediate: true })\n watch(deviceId, (v) => $globalDeviceId.set(v), { immediate: true })\n\n // 3. Global stores → Vue refs (for cross-page updates)\n $globalActiveUser.subscribe((v) => { if (v !== activeUser.value) activeUser.value = v })\n $globalToken.subscribe((v) => { if (v !== token.value) token.value = v })\n $globalDeviceId.subscribe((v) => { if (v !== deviceId.value) deviceId.value = v })\n }\n\n /**\n * Load user and token from browser storage on initialization.\n * deviceId comes from a server-set non-HttpOnly cookie (read-only for JS).\n */\n loadFromStorage(refs: AuthRefs): void {\n if (typeof window === 'undefined')\n return\n\n const savedToken = cookieUtil.getAuthToken()\n if (savedToken) refs.token.value = savedToken\n\n const savedDevice = cookieUtil.getDeviceId()\n if (savedDevice) refs.deviceId.value = savedDevice\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 refs.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 the transitional JS session-token mirror to browser storage.\n * deviceId is server-owned (Set-Cookie) — JS doesn't write it.\n */\n saveToStorage(refs: AuthRefs): void {\n if (typeof window === 'undefined')\n return\n\n if (refs.token.value) cookieUtil.setAuthToken(refs.token.value)\n else cookieUtil.removeAuthToken()\n\n // Save user to localStorage for quick loading\n if (this.isLocalStorageFunctional()) {\n try {\n if (refs.activeUser.value) {\n localStorage.setItem('pagelines-user', JSON.stringify(refs.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 local stored user data and JS-owned tokens. Server-owned cookies\n * (pl-session, pl-device-id) are cleared by /api/auth/logout via\n * Set-Cookie max-age=0 — JS can't touch them.\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 $globalDeviceId.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 { AgentConfig, LiveStatus } from '@pagelines/core'\nimport type { SDKContext } from './types'\nimport { serverTransitionBudgets } from '@pagelines/core'\nimport { resolveApiBase } from '../api'\n\nexport class AgentClient {\n constructor(private ctx: SDKContext) {}\n\n async create(args: { name: string, orgId?: string }): Promise<AgentConfig> {\n const orgId = args.orgId || this.resolveOrgId()\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n\n const response = await fetch(`${apiBase}/api/agents`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Idempotency-Key': globalThis.crypto.randomUUID(),\n ...(this.ctx.token.value && { Authorization: `Bearer ${this.ctx.token.value}` }),\n },\n body: JSON.stringify({ name: args.name, orgId }),\n })\n\n const data = await response.json() as { ok: boolean, data?: AgentConfig, error?: string }\n\n if (!data.ok || !data.data) {\n const msg = data.error || 'Failed to create agent'\n this.ctx.error.value = msg\n throw new Error(msg)\n }\n\n this.ctx.processApiResponse(data as any)\n return data.data\n }\n\n /**\n * Live runtime status — the same canonical `LiveStatus` shape every other\n * status producer emits (`GET /agents` rows, SSE status frames, lifecycle\n * action responses). See plans/bots/bot-state-management.md.\n * `{ lifecycle: 'unknown' }` is the graceful degrade on any fetch failure.\n */\n async getLiveStatus(args: { agentId: string }): Promise<LiveStatus> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n\n try {\n const response = await fetch(`${apiBase}/api/agents/state?ids=${encodeURIComponent(args.agentId)}`, {\n headers: {\n ...(this.ctx.token.value && { Authorization: `Bearer ${this.ctx.token.value}` }),\n },\n })\n\n const data = await response.json() as { ok: boolean, data?: Record<string, LiveStatus> }\n return data.ok ? data.data?.[args.agentId] ?? { lifecycle: 'unknown' } : { lifecycle: 'unknown' }\n } catch (err) {\n this.ctx.logger.warn('agent.getLiveStatus failed', {\n agentId: args.agentId,\n error: err instanceof Error ? err.message : String(err),\n })\n return { lifecycle: 'unknown' }\n }\n }\n\n /**\n * Poll until the agent's lifecycle reaches `running`. `onStatus` receives\n * the server-reported lifecycle verbatim ('starting', 'running', …) so the\n * caller renders feedback tied to actual provisioner state, not a rotating\n * set of decorative messages. Per first-principles → \"Always give feedback\n * — no magic\". Map lifecycle values to user copy at the call site.\n */\n async waitUntilReady(args: {\n agentId: string\n onStatus?: (lifecycle: LiveStatus['lifecycle']) => void\n timeoutMs?: number\n pollIntervalMs?: number\n }): Promise<void> {\n const { agentId, onStatus, timeoutMs = serverTransitionBudgets.wake, pollIntervalMs = 3_000 } = args\n const start = Date.now()\n let lastLifecycle: LiveStatus['lifecycle'] | undefined\n\n while (Date.now() - start < timeoutMs) {\n const status = await this.getLiveStatus({ agentId })\n\n if (status.lifecycle === 'running') {\n onStatus?.('running')\n return\n }\n\n if (status.lifecycle === 'error')\n throw new Error(status.detail || 'Your bot hit a problem starting')\n\n // Only fire onStatus on change — avoids spamming the caller's UI with\n // redundant updates on every poll tick.\n if (status.lifecycle !== lastLifecycle) {\n onStatus?.(status.lifecycle)\n lastLifecycle = status.lifecycle\n }\n\n await new Promise((r) => setTimeout(r, pollIntervalMs))\n }\n\n throw new Error('Your bot is taking longer than expected — please try again')\n }\n\n /** Send a typed webhook event to a bot agent. No auth required — the proxy is public. */\n async webhook<T = Record<string, unknown>>(args: {\n agentId: string\n type: string\n data: T\n meta?: { source?: string, timestamp?: string, correlationId?: string, [key: string]: unknown }\n }): Promise<{ ok: boolean, error?: string }> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const url = `${apiBase}/api/bot-api/webhooks/agents/${args.agentId}`\n\n const body: Record<string, unknown> = { type: args.type, data: args.data }\n if (args.meta) body.meta = args.meta\n\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(body),\n })\n\n if (!res.ok) {\n const text = await res.text().catch(() => 'Unknown error')\n throw new Error(`Webhook delivery failed (${res.status}): ${text.slice(0, 200)}`)\n }\n\n return res.json() as Promise<{ ok: boolean, error?: string }>\n }\n\n private resolveOrgId(): string {\n const user = this.ctx.activeUser.value\n const orgId = user?.orgs?.[0]?.orgId\n if (!orgId) {\n throw new Error('No organization found. Please sign in first.')\n }\n return orgId\n }\n}\n","import type { EnrichedUser } from '@pagelines/core'\nimport type { SDKContext } from './types'\nimport { resolveApiBase } from '../api'\n\nconst USER_HYDRATION_ERROR = 'Signed in, but your account could not be loaded. Try again.'\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 private async authenticateWithCode(email: string, code: string): Promise<EnrichedUser> {\n const response = await this.ctx.apiFetch('/api/auth/verify-code', {\n method: 'POST',\n body: JSON.stringify({ email, code }),\n })\n const data = await response.json() as { ok: true } | { ok: false, error: string }\n if (!data.ok)\n throw new Error(data.error)\n\n const user = await this.getCurrentUser()\n if (!user)\n throw new Error(USER_HYDRATION_ERROR)\n return user\n }\n\n async sendCode(email: string): Promise<void> {\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.apiFetch('/api/auth/check-email', {\n method: 'POST',\n body: JSON.stringify({ email }),\n })\n const data = await response.json() as { ok: true } | { ok: false, error: string }\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 await this.authenticateWithCode(email, code)\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 logout(): Promise<void> {\n return withLoadingState(this.ctx, async () => {\n try {\n await this.ctx.apiFetch('/api/auth/logout', { method: '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.apiFetch('/api/users/me', {\n method: 'GET',\n })\n const data = await response.json() as { ok: true, data: EnrichedUser } | { ok: false, error: string }\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 // Set activeUser directly — `/users/me` envelope is\n // `{ ok: true, data: enrichedUser }`. processApiResponse is shaped\n // for sign-in responses (token + user + deviceId at the top level);\n // synthesizing a fake legacy envelope to feed it is shadow-state.\n // The token check guards against stale in-flight responses landing\n // after a logout cleared the session.\n if (this.ctx.token.value)\n this.ctx.activeUser.value = data.data\n return data.data\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.apiFetch('/api/auth/check-email', {\n method: 'POST',\n body: JSON.stringify({ email: args.email }),\n })\n const data = await response.json() as { ok: true } | { ok: false, error: string }\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 await this.authenticateWithCode(args.email, args.code)\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 // eslint-disable-next-line ts/no-misused-promises -- addEventListener types the handler as void-returning; the hydration below must be awaited\n const handler = async (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 } = event.data\n\n // The auth response carries no user — its envelope is\n // `{ redirect, redirectReason, isNew, deviceId }` plus the token. Set the\n // token, then hydrate the same way every other entry point does, or\n // `onSuccess` fires with `undefined` and a real session reads to the\n // caller as \"nothing happened\".\n this.ctx.processApiResponse({ ok: true, data: {}, token })\n const user = await this.getCurrentUser()\n if (!user) {\n // A token without an account is not a sign-in. Reporting success here\n // is what made a real failure look like nothing happening.\n this.ctx.error.value = USER_HYDRATION_ERROR\n this.ctx.logger.error('Google login: token accepted but user hydration failed')\n args?.onError?.(USER_HYDRATION_ERROR)\n return\n }\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 { SDKContext } from './types'\nimport { resolveApiBase } from '../api'\n\nexport interface BillingStatus {\n plan?: string\n status: string\n hasActiveBilling: boolean\n maxAgents: number\n trialEnd?: string\n trialDaysRemaining?: number\n paymentRecovery?: {\n graceEndsAt?: string\n suspended: boolean\n url?: string\n }\n}\n\nexport class BillingClient {\n constructor(private ctx: SDKContext) {}\n\n async confirmCheckout(args?: { sessionId?: string }): Promise<BillingStatus> {\n if (args?.sessionId) {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const response = await fetch(`${apiBase}/api/billing/complete-checkout`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.ctx.token.value && { Authorization: `Bearer ${this.ctx.token.value}` }),\n },\n body: JSON.stringify({ sessionId: args.sessionId }),\n })\n\n const data = await response.json() as { ok: boolean, error?: string }\n if (!data.ok) {\n const msg = data.error || 'Failed to complete checkout'\n this.ctx.error.value = msg\n throw new Error(msg)\n }\n }\n\n return this.getStatus()\n }\n\n async getStatus(): Promise<BillingStatus> {\n const orgId = this.resolveOrgId()\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n\n const response = await fetch(`${apiBase}/api/billing/details/${orgId}`, {\n headers: {\n ...(this.ctx.token.value && { Authorization: `Bearer ${this.ctx.token.value}` }),\n },\n })\n\n const data = await response.json() as {\n ok: boolean\n data?: {\n plan: string\n status: string\n maxAgents: number\n trialEnd?: string\n trialDaysRemaining?: number\n paymentRecovery?: BillingStatus['paymentRecovery']\n }\n error?: string\n }\n\n if (!data.ok || !data.data) {\n return {\n plan: undefined,\n status: 'none',\n hasActiveBilling: false,\n maxAgents: 0,\n }\n }\n\n const hasActiveBilling = ['active', 'trial', 'canceling'].includes(data.data.status)\n || (data.data.status === 'past_due' && data.data.paymentRecovery?.suspended !== true)\n\n return {\n plan: data.data.plan,\n status: data.data.status,\n hasActiveBilling,\n maxAgents: data.data.maxAgents,\n ...(data.data.trialEnd && { trialEnd: data.data.trialEnd }),\n ...(data.data.trialDaysRemaining !== undefined && { trialDaysRemaining: data.data.trialDaysRemaining }),\n ...(data.data.paymentRecovery && { paymentRecovery: data.data.paymentRecovery }),\n }\n }\n\n private resolveOrgId(): string {\n const user = this.ctx.activeUser.value\n const orgId = user?.orgs?.[0]?.orgId\n if (!orgId) {\n throw new Error('No organization found. Please sign in first.')\n }\n return orgId\n }\n}\n","import type { ApiResponse, ChatAttachmentInput, ChatMessage as WireChatMessage, ChatToolActivityData } from '@pagelines/core'\nimport type { ChatMessage } from '../agent/schema'\nimport type { SDKContext } from './types'\nimport type { ChatEvent, ChatStreamError, ChatTurnStreamTransportError } from '@pagelines/core'\nimport { runAuthenticatedChatTurnStream, shortId, toChatStreamError, zChatEvent } from '@pagelines/core'\nimport { resolveApiBase } from '../api'\n\ntype CancelConversationTurnResponse = { cancelled: boolean, cancelledTurnIds: string[] }\n\nfunction parseChatEvent(frame: string): ChatEvent | null {\n const lines = frame.split('\\n').filter((l) => l.length > 0)\n let name: string | undefined\n let payload: string | undefined\n for (const line of lines) {\n if (line.startsWith('event:'))\n name = line.slice(6).trim()\n else if (line.startsWith('data:'))\n payload = line.slice(5).trim()\n }\n if (!name || payload === undefined)\n return null\n try {\n const parsed = zChatEvent.safeParse({ event: name, data: JSON.parse(payload) })\n return parsed.success ? parsed.data : null\n } catch {\n return null\n }\n}\n\nfunction toAuthenticatedTransportError(error: ChatTurnStreamTransportError): string {\n if (error.stage === 'stream-open' && error.message.startsWith('HTTP '))\n return `Stream failed: ${error.message}`\n return error.message\n}\n\nfunction detectBrowserTimezone(): string | undefined {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone || undefined\n } catch {\n return undefined\n }\n}\n\nfunction toChatMessage(message: WireChatMessage): ChatMessage | undefined {\n if (message.role !== 'assistant' && message.role !== 'system')\n return undefined\n return {\n id: message.messageId,\n text: message.content,\n sender: message.role === 'system' ? 'system' : 'agent',\n timestamp: message.createdAt,\n conversationId: message.conversationId,\n sequence: message.sequence,\n systemKind: message.systemKind,\n ...(message.metadata?.turnOutcome ? { turnOutcome: message.metadata.turnOutcome } : {}),\n ...(message.metadata?.attachments?.length\n ? { attachments: message.metadata.attachments }\n : {}),\n ...(message.metadata?.toolActivities?.length\n ? { toolActivities: message.metadata.toolActivities }\n : {}),\n ...(message.metadata?.issue ? { issue: message.metadata.issue } : {}),\n }\n}\n\nexport class ChatClient {\n constructor(private ctx: SDKContext) {}\n\n async cancelConversationTurn(args: {\n conversationId: string\n turnId?: string\n }): Promise<CancelConversationTurnResponse> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const authHeaders: Record<string, string> = this.ctx.token.value\n ? { Authorization: `Bearer ${this.ctx.token.value}` }\n : {}\n\n const res = await fetch(`${apiBase}/api/conversations/${encodeURIComponent(args.conversationId)}/cancel`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...authHeaders },\n body: JSON.stringify(args.turnId ? { turnId: args.turnId } : {}),\n })\n const result = await res.json() as ApiResponse<CancelConversationTurnResponse>\n if (!result.ok)\n throw new Error(result.error || `Cancel failed: HTTP ${res.status}`)\n return result.data\n }\n\n /**\n * Public/visitor chat — anonymous chat against an agent's public handle,\n * routed through the messaging substrate. Same SSE wire format as\n * `chatStreamAuthenticated` — the only difference is the route (no auth,\n * handle-based lookup, anonymousId instead of userId).\n *\n * The visitor identity is `anonymousId` — caller is responsible for\n * generating + persisting it (typically `sdk.user.generateAnonId()`\n * which stores a stable ID in localStorage).\n */\n async chatStreamPublic(args: {\n handle: string\n message: string\n anonymousId: string\n attachments?: ChatAttachmentInput[]\n context?: string\n onDelta: (text: string, role?: 'assistant' | 'system') => void\n onMessage?: (message: ChatMessage) => void\n onDone: (conversationId: string) => void\n onError: (error: string | ChatStreamError) => void\n onStatus?: (status: string) => void\n onToolActivity?: (activity: ChatToolActivityData) => void\n onWorkingEnd?: () => void\n }): Promise<void> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const url = `${apiBase}/api/agents/public/${encodeURIComponent(args.handle)}/chat/v2/stream`\n\n let conversationId = ''\n let errorSeen = false\n let assistantSeen = false\n let reader: ReadableStreamDefaultReader<Uint8Array> | undefined\n\n try {\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n message: args.message,\n anonymousId: args.anonymousId,\n ...(args.attachments?.length ? { attachments: args.attachments } : {}),\n ...(args.context ? { context: args.context } : {}),\n }),\n })\n\n if (!res.ok) {\n const errorBody = await res.json().catch(() => ({ error: 'Request failed' })) as { error?: string }\n args.onError(errorBody.error || `HTTP ${res.status}`)\n return\n }\n\n // Server emits the resolved conversationId in a response header so the\n // SDK can persist it across page loads (e.g. for \"resume conversation\"\n // flows). The substrate would also have a `message` event with the\n // conversationId on the persisted user msg, but the header arrives\n // first and is cheaper to parse.\n conversationId = res.headers.get('X-Conversation-Id') || ''\n reader = res.body?.getReader()\n if (!reader) {\n args.onError('No response stream')\n return\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n outer: while (true) {\n const { done, value } = await reader.read()\n if (done)\n break\n buffer += decoder.decode(value, { stream: true })\n let sep = buffer.indexOf('\\n\\n')\n while (sep !== -1) {\n const frame = buffer.slice(0, sep)\n buffer = buffer.slice(sep + 2)\n const event = parseChatEvent(frame)\n if (event) {\n if (event.event === 'working_state') {\n args.onStatus?.(event.data.description)\n } else if (event.event === 'tool_activity') {\n args.onToolActivity?.(event.data)\n } else if (event.event === 'working_end') {\n args.onWorkingEnd?.()\n } else if (event.event === 'message_delta') {\n args.onDelta(event.data.delta, event.data.role)\n } else if (event.event === 'error') {\n errorSeen = true\n args.onError(toChatStreamError(event.data))\n break outer\n } else if (event.event === 'message' && (event.data.message.role === 'assistant' || event.data.message.role === 'system')) {\n assistantSeen = true\n const message = toChatMessage(event.data.message)\n if (message)\n args.onMessage?.(message)\n // Wait for stream_end — the v2 route emits it after the\n // assistant message lands so deltas-then-message ordering is\n // preserved without breaking out early.\n } else if (event.event === 'stream_end') {\n break outer\n }\n }\n sep = buffer.indexOf('\\n\\n')\n }\n }\n\n if (!errorSeen && assistantSeen)\n args.onDone(conversationId)\n else if (!errorSeen)\n args.onError('[no-reply] Stream ended before reply arrived')\n } catch (err) {\n args.onError(err instanceof Error ? err.message : 'Stream failed')\n } finally {\n try {\n await reader?.cancel()\n } catch {\n // Stream already closed.\n }\n }\n }\n\n\n /**\n * Authenticated chat — substrate-backed:\n * POST /api/conversations, open SSE from that conversation's latest\n * sequence, then POST /api/messages. Opening the stream before send keeps\n * fast working_state / message_delta frames from outrunning the subscriber.\n * Same callback contract as `chatStream` so callers don't need transport details.\n * Mirrors `src/modules/agent/client.ts → sendChatMessageStream`.\n */\n async chatStreamAuthenticated(args: {\n agentId: string\n message: string\n attachments?: ChatAttachmentInput[]\n /** Reserved — substrate resolves conversation server-side from (userId, agentId). */\n conversationId?: string\n /** Reserved — substrate replays history from the canonical messages table. */\n history?: Array<{ role: 'user' | 'assistant', content: string }>\n onDelta: (text: string, role?: 'assistant' | 'system') => void\n onMessage?: (message: ChatMessage) => void\n onDone: (conversationId: string) => void\n onError: (error: string | ChatStreamError) => void\n onStatus?: (status: string) => void\n onToolActivity?: (activity: ChatToolActivityData) => void\n onWorkingEnd?: () => void\n }): Promise<void> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const authHeaders: Record<string, string> = this.ctx.token.value\n ? { Authorization: `Bearer ${this.ctx.token.value}` }\n : {}\n\n // 1. Resolve the conversation — `POST /conversations` returns the\n // singleton (user, agent) conversationId. Chat is conversation-addressed.\n let conversationId: string\n let latestSequence: string | null = null\n try {\n const res = await fetch(`${apiBase}/api/conversations`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...authHeaders },\n body: JSON.stringify({ agentId: args.agentId }),\n })\n const result = await res.json() as ApiResponse<{ conversationId: string, latestSequence?: string | null }>\n if (!result.ok) {\n args.onError(result.error || `Conversation failed: HTTP ${res.status}`)\n return\n }\n conversationId = result.data.conversationId\n latestSequence = result.data.latestSequence ?? null\n } catch (err) {\n args.onError(err instanceof Error ? err.message : 'Conversation failed')\n return\n }\n\n const streamUrl = latestSequence\n ? `${apiBase}/api/conversations/${encodeURIComponent(conversationId)}/stream?since=${encodeURIComponent(latestSequence)}`\n : `${apiBase}/api/conversations/${encodeURIComponent(conversationId)}/stream`\n const clientNonce = `nonce_${shortId(16)}`\n const viewerTimezone = detectBrowserTimezone()\n await runAuthenticatedChatTurnStream({\n streamUrl,\n sendUrl: `${apiBase}/api/messages`,\n headers: authHeaders,\n sendBody: {\n conversationId,\n content: args.message,\n clientNonce,\n ...(viewerTimezone ? { viewerTimezone } : {}),\n ...(args.attachments && args.attachments.length > 0 ? { attachments: args.attachments } : {}),\n },\n onStatus: args.onStatus,\n onDelta: args.onDelta,\n onToolActivity: args.onToolActivity,\n onWorkingEnd: args.onWorkingEnd,\n onMessage: (message) => {\n const chatMessage = toChatMessage(message)\n if (chatMessage)\n args.onMessage?.(chatMessage)\n },\n onDone: () => args.onDone(conversationId),\n onChatError: (error) => args.onError(toChatStreamError(error)),\n // A coded rejection (e.g. TURN_ACTIVE) stays structured so the\n // controller can switch on it; only uncoded transport failures\n // flatten to the legacy string path.\n onTransportError: (error) => args.onError(error.code\n ? { code: error.code, error: error.message }\n : toAuthenticatedTransportError(error)),\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.apiFetch(`/api/agents/public/${encodeURIComponent(args.handle)}`)\n\n const data = await response.json() as { ok: true, data: AgentConfig } | { ok: false, error: string }\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.apiFetch(`/api/agents/by-email/${encodeURIComponent(args.email)}`)\n\n const data = await response.json() as { ok: true, data: AgentConfig } | { ok: false, error: string }\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 { ApiResponse, EnrichedUser } from '@pagelines/core'\nimport { objectId, SettingsObject } from '@pagelines/core'\nimport { computed, ref } from 'vue'\nimport { createApiFetch } from './api'\nimport { SDKStorage } from './sdkStorage'\nimport { AgentClient } from './clients/AgentClient'\nimport { AuthClient } from './clients/AuthClient'\nimport { BillingClient } from './clients/BillingClient'\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 // Opaque session token for Bearer clients. Web may also have the same\n // credential in the HttpOnly pl-session cookie, which JS cannot read.\n deviceId = 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 // 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 agent!: AgentClient\n readonly auth!: AuthClient\n readonly billing!: BillingClient\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 // Shared fetch with response handler. One long-lived session token —\n // a 401 TOKEN_ERROR means the session is dead; clear local state.\n const apiFetch = createApiFetch(\n { isDev: this.isDev, apiBase: this.apiBase },\n this.processApiResponse.bind(this),\n () => this.clearSession(),\n )\n\n // Build shared context for sub-clients\n const ctx: SDKContext = {\n apiFetch,\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.agent = new AgentClient(ctx)\n this.auth = new AuthClient(ctx)\n this.billing = new BillingClient(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.authRefs())\n\n // Sync with global stores for persistence across navigation\n this.storage.syncWithGlobalStores(this.authRefs())\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.auth.getCurrentUser().then((user) => {\n if (this.resolveUser) {\n this.resolveUser(user)\n this.resolveUser = undefined\n }\n }).catch((err: unknown) => {\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 if (!response.ok) return\n\n let dirty = false\n\n if (response.user) {\n this.activeUser.value = response.user\n this.logger.info('User updated from API response', { data: response.user })\n dirty = true\n }\n\n if (response.token) {\n this.token.value = response.token\n this.logger.info('Token updated from API response')\n dirty = true\n }\n\n // deviceId rides inside data.* on /verify-code and Apple/Google routes.\n // Server ALSO sets it as a non-HttpOnly cookie — we mirror to the ref\n // so the rest of the SDK can observe \"we're paired\" reactively.\n const incomingDeviceId = (response.data as { deviceId?: string } | undefined)?.deviceId\n if (incomingDeviceId) {\n this.deviceId.value = incomingDeviceId\n dirty = true\n }\n\n if (dirty) this.persistAuth()\n\n // Resolve initialization promise\n if (this.resolveUser) {\n this.resolveUser(response.user)\n this.resolveUser = undefined\n }\n }\n\n private authRefs() {\n return {\n activeUser: this.activeUser,\n token: this.token,\n deviceId: this.deviceId,\n }\n }\n\n private persistAuth() {\n this.storage.saveToStorage(this.authRefs())\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.deviceId.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"],"x_google_ignoreList":[1,2],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pagelines/sdk",
3
- "version": "1.0.863",
3
+ "version": "1.0.865",
4
4
  "description": "PageLines SDK for agent management, auth, and billing",
5
5
  "type": "module",
6
6
  "main": "./dist/sdk.js",