@pagelines/sdk 1.0.391 → 1.0.392
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/test/webhook.test.d.ts +1 -0
- package/dist/clients/AgentClient.d.ts +15 -0
- package/dist/sdkClient.js +136 -121
- package/dist/sdkClient.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -20,5 +20,20 @@ export declare class AgentClient {
|
|
|
20
20
|
timeoutMs?: number;
|
|
21
21
|
pollIntervalMs?: number;
|
|
22
22
|
}): Promise<void>;
|
|
23
|
+
/** Send a typed webhook event to a bot agent. No auth required — the proxy is public. */
|
|
24
|
+
webhook<T = Record<string, unknown>>(args: {
|
|
25
|
+
agentId: string;
|
|
26
|
+
type: string;
|
|
27
|
+
data: T;
|
|
28
|
+
meta?: {
|
|
29
|
+
source?: string;
|
|
30
|
+
timestamp?: string;
|
|
31
|
+
correlationId?: string;
|
|
32
|
+
[key: string]: unknown;
|
|
33
|
+
};
|
|
34
|
+
}): Promise<{
|
|
35
|
+
ok: boolean;
|
|
36
|
+
error?: string;
|
|
37
|
+
}>;
|
|
23
38
|
private resolveOrgId;
|
|
24
39
|
}
|
package/dist/sdkClient.js
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
var W = Object.defineProperty;
|
|
2
2
|
var Q = (a, e, t) => e in a ? W(a, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : a[e] = t;
|
|
3
|
-
var
|
|
3
|
+
var u = (a, e) => W(a, "name", { value: e, configurable: !0 });
|
|
4
4
|
var i = (a, e, t) => Q(a, typeof e != "symbol" ? e + "" : e, t);
|
|
5
|
-
import { APP_PORT as V, APP_PROD_URL as X, cookieUtil as x, createLogger as Y, objectId as
|
|
5
|
+
import { APP_PORT as V, APP_PROD_URL as X, cookieUtil as x, createLogger as Y, objectId as $, SettingsObject as Z } from "@pagelines/core";
|
|
6
6
|
import { watch as q, ref as k, computed as z } from "vue";
|
|
7
7
|
import { hc as ee } from "hono/client";
|
|
8
|
-
function
|
|
8
|
+
function p(a, e) {
|
|
9
9
|
return a || (e ? `http://localhost:${V}` : X);
|
|
10
10
|
}
|
|
11
|
-
|
|
11
|
+
u(p, "resolveApiBase");
|
|
12
12
|
function te(a, e) {
|
|
13
|
-
const t =
|
|
13
|
+
const t = p(a.apiBase, a.isDev);
|
|
14
14
|
return ee(t, {
|
|
15
|
-
fetch: /* @__PURE__ */
|
|
16
|
-
const n = x.getAuthToken(), l = await fetch(
|
|
17
|
-
...
|
|
15
|
+
fetch: /* @__PURE__ */ u(async (s, o) => {
|
|
16
|
+
const n = x.getAuthToken(), l = await fetch(s, {
|
|
17
|
+
...o,
|
|
18
18
|
headers: {
|
|
19
|
-
...
|
|
19
|
+
...o?.headers,
|
|
20
20
|
"Content-Type": "application/json",
|
|
21
21
|
// Only include Authorization header if token exists
|
|
22
22
|
...n && { Authorization: `Bearer ${n}` }
|
|
@@ -35,9 +35,9 @@ function te(a, e) {
|
|
|
35
35
|
}, "fetch")
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
u(te, "createApiClient");
|
|
39
39
|
let re = /* @__PURE__ */ Symbol("clean"), d = [], f = 0;
|
|
40
|
-
const
|
|
40
|
+
const b = 4, K = /* @__PURE__ */ u(/* @__NO_SIDE_EFFECTS__ */ (a) => {
|
|
41
41
|
let e = [], t = {
|
|
42
42
|
get() {
|
|
43
43
|
return t.lc || t.listen(() => {
|
|
@@ -46,18 +46,18 @@ const A = 4, K = /* @__PURE__ */ h(/* @__NO_SIDE_EFFECTS__ */ (a) => {
|
|
|
46
46
|
lc: 0,
|
|
47
47
|
listen(r) {
|
|
48
48
|
return t.lc = e.push(r), () => {
|
|
49
|
-
for (let
|
|
50
|
-
d[
|
|
51
|
-
let
|
|
52
|
-
~
|
|
49
|
+
for (let o = f + b; o < d.length; )
|
|
50
|
+
d[o] === r ? d.splice(o, b) : o += b;
|
|
51
|
+
let s = e.indexOf(r);
|
|
52
|
+
~s && (e.splice(s, 1), --t.lc || t.off());
|
|
53
53
|
};
|
|
54
54
|
},
|
|
55
|
-
notify(r,
|
|
56
|
-
let
|
|
55
|
+
notify(r, s) {
|
|
56
|
+
let o = !d.length;
|
|
57
57
|
for (let n of e)
|
|
58
|
-
d.push(n, t.value, r,
|
|
59
|
-
if (
|
|
60
|
-
for (f = 0; f < d.length; f +=
|
|
58
|
+
d.push(n, t.value, r, s);
|
|
59
|
+
if (o) {
|
|
60
|
+
for (f = 0; f < d.length; f += b)
|
|
61
61
|
d[f](
|
|
62
62
|
d[f + 1],
|
|
63
63
|
d[f + 2],
|
|
@@ -71,19 +71,19 @@ const A = 4, K = /* @__PURE__ */ h(/* @__NO_SIDE_EFFECTS__ */ (a) => {
|
|
|
71
71
|
off() {
|
|
72
72
|
},
|
|
73
73
|
set(r) {
|
|
74
|
-
let
|
|
75
|
-
|
|
74
|
+
let s = t.value;
|
|
75
|
+
s !== r && (t.value = r, t.notify(s));
|
|
76
76
|
},
|
|
77
77
|
subscribe(r) {
|
|
78
|
-
let
|
|
79
|
-
return r(t.value),
|
|
78
|
+
let s = t.listen(r);
|
|
79
|
+
return r(t.value), s;
|
|
80
80
|
},
|
|
81
81
|
value: a
|
|
82
82
|
};
|
|
83
83
|
return process.env.NODE_ENV !== "production" && (t[re] = () => {
|
|
84
84
|
e = [], t.lc = 0, t.off();
|
|
85
85
|
}), t;
|
|
86
|
-
}, "atom"), y = globalThis,
|
|
86
|
+
}, "atom"), y = globalThis, A = y.__PL_AUTH_USER__ ?? (y.__PL_AUTH_USER__ = /* @__PURE__ */ K(void 0)), U = y.__PL_AUTH_TOKEN__ ?? (y.__PL_AUTH_TOKEN__ = /* @__PURE__ */ K(null)), F = class F {
|
|
87
87
|
constructor() {
|
|
88
88
|
i(this, "logger", Y("SDKStorage"));
|
|
89
89
|
}
|
|
@@ -97,15 +97,15 @@ const A = 4, K = /* @__PURE__ */ h(/* @__NO_SIDE_EFFECTS__ */ (a) => {
|
|
|
97
97
|
* Sync Vue reactive refs with global nanostores for cross-page persistence
|
|
98
98
|
*/
|
|
99
99
|
syncWithGlobalStores(e, t) {
|
|
100
|
-
const r =
|
|
101
|
-
r && (e.value = r),
|
|
102
|
-
|
|
103
|
-
}, { immediate: !0 }), q(t, (
|
|
104
|
-
|
|
105
|
-
}, { immediate: !0 }),
|
|
106
|
-
|
|
107
|
-
}),
|
|
108
|
-
|
|
100
|
+
const r = A.get(), s = U.get();
|
|
101
|
+
r && (e.value = r), s && (t.value = s), q(e, (o) => {
|
|
102
|
+
A.set(o);
|
|
103
|
+
}, { immediate: !0 }), q(t, (o) => {
|
|
104
|
+
U.set(o);
|
|
105
|
+
}, { immediate: !0 }), A.subscribe((o) => {
|
|
106
|
+
o !== e.value && (e.value = o);
|
|
107
|
+
}), U.subscribe((o) => {
|
|
108
|
+
o !== t.value && (t.value = o);
|
|
109
109
|
});
|
|
110
110
|
}
|
|
111
111
|
/**
|
|
@@ -117,10 +117,10 @@ const A = 4, K = /* @__PURE__ */ h(/* @__NO_SIDE_EFFECTS__ */ (a) => {
|
|
|
117
117
|
const r = x.getAuthToken();
|
|
118
118
|
if (r && (t.value = r), this.isLocalStorageFunctional())
|
|
119
119
|
try {
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
} catch (
|
|
123
|
-
this.logger.error("Failed to load user from localStorage", { data:
|
|
120
|
+
const s = localStorage.getItem("pagelines-user");
|
|
121
|
+
s && (e.value = JSON.parse(s));
|
|
122
|
+
} catch (s) {
|
|
123
|
+
this.logger.error("Failed to load user from localStorage", { data: s });
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
/**
|
|
@@ -145,7 +145,7 @@ const A = 4, K = /* @__PURE__ */ h(/* @__NO_SIDE_EFFECTS__ */ (a) => {
|
|
|
145
145
|
} catch (e) {
|
|
146
146
|
this.logger.error("Failed to clear user from localStorage", { data: e });
|
|
147
147
|
}
|
|
148
|
-
|
|
148
|
+
A.set(void 0), U.set(null);
|
|
149
149
|
}
|
|
150
150
|
}
|
|
151
151
|
/**
|
|
@@ -172,19 +172,19 @@ const A = 4, K = /* @__PURE__ */ h(/* @__NO_SIDE_EFFECTS__ */ (a) => {
|
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
};
|
|
175
|
-
|
|
176
|
-
let
|
|
175
|
+
u(F, "SDKStorage");
|
|
176
|
+
let B = F;
|
|
177
177
|
const J = [
|
|
178
178
|
"Deploying your server...",
|
|
179
179
|
"Setting up your workspace...",
|
|
180
180
|
"Installing tools...",
|
|
181
181
|
"Almost ready..."
|
|
182
|
-
],
|
|
182
|
+
], O = class O {
|
|
183
183
|
constructor(e) {
|
|
184
184
|
this.ctx = e;
|
|
185
185
|
}
|
|
186
186
|
async create(e) {
|
|
187
|
-
const t = e.orgId || this.resolveOrgId(), r =
|
|
187
|
+
const t = e.orgId || this.resolveOrgId(), r = p(this.ctx.apiBase, this.ctx.isDev), o = await (await fetch(`${r}/api/agent`, {
|
|
188
188
|
method: "POST",
|
|
189
189
|
headers: {
|
|
190
190
|
"Content-Type": "application/json",
|
|
@@ -192,24 +192,24 @@ const J = [
|
|
|
192
192
|
},
|
|
193
193
|
body: JSON.stringify({ name: e.name, orgId: t })
|
|
194
194
|
})).json();
|
|
195
|
-
if (!
|
|
196
|
-
const n =
|
|
195
|
+
if (!o.ok || !o.data?.[0]) {
|
|
196
|
+
const n = o.error || "Failed to create agent";
|
|
197
197
|
throw this.ctx.error.value = n, new Error(n);
|
|
198
198
|
}
|
|
199
|
-
return this.ctx.processApiResponse(
|
|
199
|
+
return this.ctx.processApiResponse(o), o.data[0];
|
|
200
200
|
}
|
|
201
201
|
async getStatus(e) {
|
|
202
|
-
const t =
|
|
202
|
+
const t = p(this.ctx.apiBase, this.ctx.isDev), s = await (await fetch(`${t}/api/agent/${e.agentId}/status`, {
|
|
203
203
|
headers: {
|
|
204
204
|
...this.ctx.token.value && { Authorization: `Bearer ${this.ctx.token.value}` }
|
|
205
205
|
}
|
|
206
206
|
})).json();
|
|
207
|
-
return !
|
|
207
|
+
return !s.ok || !s.data ? { status: "unknown", ready: !1, error: "Failed to check status" } : s.data;
|
|
208
208
|
}
|
|
209
209
|
async waitUntilReady(e) {
|
|
210
|
-
const { agentId: t, onStatus: r, timeoutMs:
|
|
210
|
+
const { agentId: t, onStatus: r, timeoutMs: s = 3e5, pollIntervalMs: o = 3e3 } = e, n = Date.now();
|
|
211
211
|
let l = 0;
|
|
212
|
-
for (; Date.now() - n <
|
|
212
|
+
for (; Date.now() - n < s; ) {
|
|
213
213
|
const g = await this.getStatus({ agentId: t });
|
|
214
214
|
if (g.ready) {
|
|
215
215
|
r?.("Ready!");
|
|
@@ -217,10 +217,25 @@ const J = [
|
|
|
217
217
|
}
|
|
218
218
|
if (g.status === "error")
|
|
219
219
|
throw new Error(g.error || "Provisioning failed");
|
|
220
|
-
r && l < J.length && (r(J[l]), l++), await new Promise((c) => setTimeout(c,
|
|
220
|
+
r && l < J.length && (r(J[l]), l++), await new Promise((c) => setTimeout(c, o));
|
|
221
221
|
}
|
|
222
222
|
throw new Error("Agent provisioning timed out — please try again");
|
|
223
223
|
}
|
|
224
|
+
/** Send a typed webhook event to a bot agent. No auth required — the proxy is public. */
|
|
225
|
+
async webhook(e) {
|
|
226
|
+
const r = `${p(this.ctx.apiBase, this.ctx.isDev)}/api/bot-api/agents/${e.agentId}/webhook`, s = { type: e.type, data: e.data };
|
|
227
|
+
e.meta && (s.meta = e.meta);
|
|
228
|
+
const o = await fetch(r, {
|
|
229
|
+
method: "POST",
|
|
230
|
+
headers: { "Content-Type": "application/json" },
|
|
231
|
+
body: JSON.stringify(s)
|
|
232
|
+
});
|
|
233
|
+
if (!o.ok) {
|
|
234
|
+
const n = await o.text().catch(() => "Unknown error");
|
|
235
|
+
throw new Error(`Webhook delivery failed (${o.status}): ${n.slice(0, 200)}`);
|
|
236
|
+
}
|
|
237
|
+
return o.json();
|
|
238
|
+
}
|
|
224
239
|
resolveOrgId() {
|
|
225
240
|
const t = this.ctx.activeUser.value?.orgs?.[0]?.orgId;
|
|
226
241
|
if (!t)
|
|
@@ -228,8 +243,8 @@ const J = [
|
|
|
228
243
|
return t;
|
|
229
244
|
}
|
|
230
245
|
};
|
|
231
|
-
|
|
232
|
-
let
|
|
246
|
+
u(O, "AgentClient");
|
|
247
|
+
let D = O;
|
|
233
248
|
async function m(a, e) {
|
|
234
249
|
a.loading.value = !0, a.error.value = null;
|
|
235
250
|
try {
|
|
@@ -238,8 +253,8 @@ async function m(a, e) {
|
|
|
238
253
|
a.loading.value = !1;
|
|
239
254
|
}
|
|
240
255
|
}
|
|
241
|
-
|
|
242
|
-
const
|
|
256
|
+
u(m, "withLoadingState");
|
|
257
|
+
const R = class R {
|
|
243
258
|
constructor(e) {
|
|
244
259
|
this.ctx = e;
|
|
245
260
|
}
|
|
@@ -261,15 +276,15 @@ const _ = class _ {
|
|
|
261
276
|
async verifyCode(e, t) {
|
|
262
277
|
return m(this.ctx, async () => {
|
|
263
278
|
try {
|
|
264
|
-
const
|
|
279
|
+
const s = await (await this.ctx.api.auth["verify-code"].$post({
|
|
265
280
|
json: { email: e, code: t }
|
|
266
281
|
})).json();
|
|
267
|
-
if (!
|
|
268
|
-
throw this.ctx.error.value =
|
|
282
|
+
if (!s.ok)
|
|
283
|
+
throw this.ctx.error.value = s.error, new Error(s.error);
|
|
269
284
|
} catch (r) {
|
|
270
285
|
this.ctx.logger.error("Verify code error", { data: r });
|
|
271
|
-
const
|
|
272
|
-
throw this.ctx.error.value =
|
|
286
|
+
const s = r instanceof Error ? r.message : "Failed to verify code";
|
|
287
|
+
throw this.ctx.error.value = s, r;
|
|
273
288
|
}
|
|
274
289
|
});
|
|
275
290
|
}
|
|
@@ -328,44 +343,44 @@ const _ = class _ {
|
|
|
328
343
|
this.ctx.logger.error("loginWithGoogle: Only available in browser");
|
|
329
344
|
return;
|
|
330
345
|
}
|
|
331
|
-
const t =
|
|
332
|
-
|
|
346
|
+
const t = p(this.ctx.apiBase, this.ctx.isDev), r = window.location.origin, s = `${t}/auth/google-popup?origin=${encodeURIComponent(r)}`, o = 500, n = 600, l = window.screenX + (window.outerWidth - o) / 2, g = window.screenY + (window.outerHeight - n) / 2, c = window.open(
|
|
347
|
+
s,
|
|
333
348
|
"google-auth",
|
|
334
|
-
`width=${
|
|
349
|
+
`width=${o},height=${n},left=${l},top=${g},popup=yes`
|
|
335
350
|
);
|
|
336
351
|
if (!c) {
|
|
337
|
-
const
|
|
338
|
-
this.ctx.error.value =
|
|
352
|
+
const h = "Popup was blocked. Please allow popups for this site.";
|
|
353
|
+
this.ctx.error.value = h, e?.onError?.(h);
|
|
339
354
|
return;
|
|
340
355
|
}
|
|
341
|
-
const
|
|
356
|
+
const v = /* @__PURE__ */ u((h) => {
|
|
342
357
|
const S = new URL(t).origin;
|
|
343
|
-
if (
|
|
344
|
-
if (
|
|
345
|
-
window.removeEventListener("message",
|
|
346
|
-
const { token: w, user: M } =
|
|
358
|
+
if (h.origin === S) {
|
|
359
|
+
if (h.data?.type === "auth-success") {
|
|
360
|
+
window.removeEventListener("message", v);
|
|
361
|
+
const { token: w, user: M } = h.data;
|
|
347
362
|
this.ctx.processApiResponse({ ok: !0, data: {}, token: w, user: M }), this.ctx.logger.info("Google login successful"), e?.onSuccess?.(M);
|
|
348
|
-
} else if (
|
|
349
|
-
window.removeEventListener("message",
|
|
350
|
-
const w =
|
|
363
|
+
} else if (h.data?.type === "auth-error") {
|
|
364
|
+
window.removeEventListener("message", v);
|
|
365
|
+
const w = h.data.error || "Google authentication failed";
|
|
351
366
|
this.ctx.error.value = w, this.ctx.logger.error("Google login failed", { error: w }), e?.onError?.(w);
|
|
352
367
|
}
|
|
353
368
|
}
|
|
354
369
|
}, "handler");
|
|
355
|
-
window.addEventListener("message",
|
|
370
|
+
window.addEventListener("message", v);
|
|
356
371
|
const I = setInterval(() => {
|
|
357
|
-
c.closed && (clearInterval(I), window.removeEventListener("message",
|
|
372
|
+
c.closed && (clearInterval(I), window.removeEventListener("message", v));
|
|
358
373
|
}, 500);
|
|
359
374
|
}
|
|
360
375
|
};
|
|
361
|
-
|
|
362
|
-
let C =
|
|
363
|
-
const
|
|
376
|
+
u(R, "AuthClient");
|
|
377
|
+
let C = R;
|
|
378
|
+
const _ = class _ {
|
|
364
379
|
constructor(e) {
|
|
365
380
|
this.ctx = e;
|
|
366
381
|
}
|
|
367
382
|
async chatStream(e) {
|
|
368
|
-
const r = `${
|
|
383
|
+
const r = `${p(this.ctx.apiBase, this.ctx.isDev)}/api/agent/public/${encodeURIComponent(e.handle)}/chat/stream`;
|
|
369
384
|
return this._streamChat({
|
|
370
385
|
url: r,
|
|
371
386
|
headers: { "Content-Type": "application/json" },
|
|
@@ -385,7 +400,7 @@ const O = class O {
|
|
|
385
400
|
});
|
|
386
401
|
}
|
|
387
402
|
async chatStreamAuthenticated(e) {
|
|
388
|
-
const r = `${
|
|
403
|
+
const r = `${p(this.ctx.apiBase, this.ctx.isDev)}/api/agent/${encodeURIComponent(e.agentId)}/chat/stream`;
|
|
389
404
|
return this._streamChat({
|
|
390
405
|
url: r,
|
|
391
406
|
headers: {
|
|
@@ -423,32 +438,32 @@ const O = class O {
|
|
|
423
438
|
e.onError("No response stream");
|
|
424
439
|
return;
|
|
425
440
|
}
|
|
426
|
-
const
|
|
427
|
-
let
|
|
441
|
+
const s = new TextDecoder();
|
|
442
|
+
let o = "", n = e.conversationId || "";
|
|
428
443
|
for (; ; ) {
|
|
429
444
|
const { done: l, value: g } = await r.read();
|
|
430
445
|
if (l)
|
|
431
446
|
break;
|
|
432
|
-
|
|
433
|
-
const c =
|
|
447
|
+
o += s.decode(g, { stream: !0 });
|
|
448
|
+
const c = o.split(`
|
|
434
449
|
`);
|
|
435
|
-
|
|
436
|
-
for (const
|
|
437
|
-
if (!
|
|
450
|
+
o = c.pop() || "";
|
|
451
|
+
for (const v of c) {
|
|
452
|
+
if (!v.startsWith("data: "))
|
|
438
453
|
continue;
|
|
439
|
-
const I =
|
|
454
|
+
const I = v.slice(6).trim();
|
|
440
455
|
if (I === "[DONE]") {
|
|
441
456
|
e.onDone(n);
|
|
442
457
|
return;
|
|
443
458
|
}
|
|
444
459
|
try {
|
|
445
|
-
const
|
|
446
|
-
if (
|
|
447
|
-
e.onStatus?.(
|
|
460
|
+
const h = JSON.parse(I);
|
|
461
|
+
if (h.pl_status) {
|
|
462
|
+
e.onStatus?.(h.pl_status);
|
|
448
463
|
continue;
|
|
449
464
|
}
|
|
450
|
-
|
|
451
|
-
const S =
|
|
465
|
+
h.pl_metadata?.conversationId && (n = h.pl_metadata.conversationId);
|
|
466
|
+
const S = h.choices?.[0]?.delta;
|
|
452
467
|
S?.content && e.onDelta(S.content);
|
|
453
468
|
} catch {
|
|
454
469
|
}
|
|
@@ -460,9 +475,9 @@ const O = class O {
|
|
|
460
475
|
}
|
|
461
476
|
}
|
|
462
477
|
async chatMessage(e) {
|
|
463
|
-
const r = `${
|
|
478
|
+
const r = `${p(this.ctx.apiBase, this.ctx.isDev)}/api/agent/public/${encodeURIComponent(e.handle)}/chat`;
|
|
464
479
|
try {
|
|
465
|
-
const
|
|
480
|
+
const o = await (await fetch(r, {
|
|
466
481
|
method: "POST",
|
|
467
482
|
headers: { "Content-Type": "application/json" },
|
|
468
483
|
body: JSON.stringify({
|
|
@@ -472,22 +487,22 @@ const O = class O {
|
|
|
472
487
|
context: e.context
|
|
473
488
|
})
|
|
474
489
|
})).json();
|
|
475
|
-
if (!
|
|
476
|
-
this.ctx.logger.error("chatMessage failed", { error: !
|
|
490
|
+
if (!o.ok || !o.data) {
|
|
491
|
+
this.ctx.logger.error("chatMessage failed", { error: !o.ok && "error" in o ? o.error : "Unknown" });
|
|
477
492
|
return;
|
|
478
493
|
}
|
|
479
494
|
return {
|
|
480
|
-
conversationId:
|
|
481
|
-
content:
|
|
495
|
+
conversationId: o.data.conversationId,
|
|
496
|
+
content: o.data.message.content
|
|
482
497
|
};
|
|
483
|
-
} catch (
|
|
484
|
-
this.ctx.logger.error("chatMessage error", { error:
|
|
498
|
+
} catch (s) {
|
|
499
|
+
this.ctx.logger.error("chatMessage error", { error: s });
|
|
485
500
|
return;
|
|
486
501
|
}
|
|
487
502
|
}
|
|
488
503
|
};
|
|
489
|
-
|
|
490
|
-
let P =
|
|
504
|
+
u(_, "ChatClient");
|
|
505
|
+
let P = _;
|
|
491
506
|
const N = class N {
|
|
492
507
|
constructor(e) {
|
|
493
508
|
this.ctx = e;
|
|
@@ -531,7 +546,7 @@ const N = class N {
|
|
|
531
546
|
generateAnonId() {
|
|
532
547
|
const e = "pagelinesAnonId";
|
|
533
548
|
let t = this.ctx.storage.getItem(e);
|
|
534
|
-
return t || (t =
|
|
549
|
+
return t || (t = $({ prefix: "anon" }), this.ctx.storage.setItem(e, t)), t;
|
|
535
550
|
}
|
|
536
551
|
track(e) {
|
|
537
552
|
try {
|
|
@@ -546,7 +561,7 @@ const N = class N {
|
|
|
546
561
|
}
|
|
547
562
|
}
|
|
548
563
|
};
|
|
549
|
-
|
|
564
|
+
u(N, "UserClient");
|
|
550
565
|
let j = N;
|
|
551
566
|
const G = class G {
|
|
552
567
|
constructor() {
|
|
@@ -563,7 +578,7 @@ const G = class G {
|
|
|
563
578
|
typeof window < "u" && delete globalThis[this.key];
|
|
564
579
|
}
|
|
565
580
|
};
|
|
566
|
-
|
|
581
|
+
u(G, "SDKGlobal");
|
|
567
582
|
let L = G;
|
|
568
583
|
const E = new L(), T = class T extends Z {
|
|
569
584
|
constructor(t = {}) {
|
|
@@ -578,9 +593,9 @@ const E = new L(), T = class T extends Z {
|
|
|
578
593
|
i(this, "error", k(null));
|
|
579
594
|
i(this, "apiBase", this.settings.apiBase || void 0);
|
|
580
595
|
// Storage handler for persistence
|
|
581
|
-
i(this, "storage", new
|
|
596
|
+
i(this, "storage", new B());
|
|
582
597
|
// Auto-managed session ID for usage tracking
|
|
583
|
-
i(this, "sessionId",
|
|
598
|
+
i(this, "sessionId", $({ prefix: "ses" }));
|
|
584
599
|
// Typed Hono RPC client - uses SDKAppType (auth/self/usage routes only)
|
|
585
600
|
// Initialized in constructor (definite assignment via singleton pattern)
|
|
586
601
|
i(this, "apiClient");
|
|
@@ -591,7 +606,7 @@ const E = new L(), T = class T extends Z {
|
|
|
591
606
|
return;
|
|
592
607
|
const r = t.primaryAgentId || t.agents[0]?.agentId;
|
|
593
608
|
if (r)
|
|
594
|
-
return t.agents.find((
|
|
609
|
+
return t.agents.find((s) => s.agentId === r);
|
|
595
610
|
}));
|
|
596
611
|
i(this, "currentOrg", z(() => {
|
|
597
612
|
const t = this.currentAgent.value;
|
|
@@ -599,7 +614,7 @@ const E = new L(), T = class T extends Z {
|
|
|
599
614
|
return;
|
|
600
615
|
const r = this.activeUser.value;
|
|
601
616
|
if (r?.orgs)
|
|
602
|
-
return r.orgs.find((
|
|
617
|
+
return r.orgs.find((s) => s.orgId === t.orgId);
|
|
603
618
|
}));
|
|
604
619
|
// Initialization state
|
|
605
620
|
i(this, "initialized");
|
|
@@ -613,7 +628,7 @@ const E = new L(), T = class T extends Z {
|
|
|
613
628
|
{ isDev: this.isDev, apiBase: this.apiBase },
|
|
614
629
|
this.processApiResponse.bind(this)
|
|
615
630
|
);
|
|
616
|
-
const
|
|
631
|
+
const s = {
|
|
617
632
|
api: this.api,
|
|
618
633
|
apiBase: this.apiBase,
|
|
619
634
|
isDev: this.isDev,
|
|
@@ -627,12 +642,12 @@ const E = new L(), T = class T extends Z {
|
|
|
627
642
|
logger: this.logger,
|
|
628
643
|
processApiResponse: this.processApiResponse.bind(this)
|
|
629
644
|
};
|
|
630
|
-
this.agent = new
|
|
631
|
-
this.resolveUser =
|
|
632
|
-
}), this.token.value && !this.activeUser.value ? this.getCurrentUser().then((
|
|
633
|
-
this.resolveUser && (this.resolveUser(
|
|
634
|
-
}).catch((
|
|
635
|
-
this.logger.error("Auto user fetch failed", { data:
|
|
645
|
+
this.agent = new D(s), this.auth = new C(s), this.chat = new P(s), this.user = new j(s), this.logger.info("PageLinesSDK initialized"), this.storage.loadFromStorage(this.activeUser, this.token), this.storage.syncWithGlobalStores(this.activeUser, this.token), this.initialized = new Promise((o) => {
|
|
646
|
+
this.resolveUser = o;
|
|
647
|
+
}), this.token.value && !this.activeUser.value ? this.getCurrentUser().then((o) => {
|
|
648
|
+
this.resolveUser && (this.resolveUser(o), this.resolveUser = void 0);
|
|
649
|
+
}).catch((o) => {
|
|
650
|
+
this.logger.error("Auto user fetch failed", { data: o }), this.resolveUser && (this.resolveUser(void 0), this.resolveUser = void 0);
|
|
636
651
|
}) : this.activeUser.value ? this.resolveUser?.(this.activeUser.value) : this.resolveUser?.(void 0);
|
|
637
652
|
}
|
|
638
653
|
/**
|
|
@@ -661,7 +676,7 @@ const E = new L(), T = class T extends Z {
|
|
|
661
676
|
}
|
|
662
677
|
// Full reset - clears session + state + destroys singleton
|
|
663
678
|
clear() {
|
|
664
|
-
this.logger.info("Clearing SDK completely"), this.clearSession(), this.loading.value = !1, this.sessionId =
|
|
679
|
+
this.logger.info("Clearing SDK completely"), this.clearSession(), this.loading.value = !1, this.sessionId = $({ prefix: "ses" }), E.delete();
|
|
665
680
|
}
|
|
666
681
|
// Backward-compatible delegates — these forward to sub-clients
|
|
667
682
|
// Can be removed in a future breaking change
|
|
@@ -708,14 +723,14 @@ const E = new L(), T = class T extends Z {
|
|
|
708
723
|
return this.user.track(t);
|
|
709
724
|
}
|
|
710
725
|
};
|
|
711
|
-
|
|
726
|
+
u(T, "PageLinesSDK");
|
|
712
727
|
let H = T;
|
|
713
728
|
export {
|
|
714
|
-
|
|
729
|
+
D as A,
|
|
715
730
|
P as C,
|
|
716
731
|
H as P,
|
|
717
732
|
j as U,
|
|
718
733
|
C as a,
|
|
719
|
-
|
|
734
|
+
p as r
|
|
720
735
|
};
|
|
721
736
|
//# sourceMappingURL=sdkClient.js.map
|
package/dist/sdkClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdkClient.js","sources":["../api.ts","../../../node_modules/.pnpm/nanostores@1.1.1/node_modules/nanostores/clean-stores/index.js","../../../node_modules/.pnpm/nanostores@1.1.1/node_modules/nanostores/atom/index.js","../sdkStorage.ts","../clients/AgentClient.ts","../clients/AuthClient.ts","../clients/ChatClient.ts","../clients/UserClient.ts","../sdkClient.ts"],"sourcesContent":["import type { Hono } from 'hono'\nimport { APP_PORT, APP_PROD_URL } from '@pagelines/core'\nimport { hc } from 'hono/client'\nimport { cookieUtil } from '@pagelines/core'\n\nexport interface ApiClientSettings {\n isDev: boolean\n apiBase?: string\n [key: string]: unknown\n}\n\n/**\n * Resolve API base URL from settings.\n * Centralizes the isDev/apiBase/production URL logic used across SDK clients.\n */\nexport function resolveApiBase(apiBase?: string, isDev?: boolean): string {\n return apiBase || (isDev ? `http://localhost:${APP_PORT}` : APP_PROD_URL)\n}\n\n/**\n * Create fully typed Hono RPC client for PageLines SDK\n *\n * @template TAppType - The Hono app type from the server (enables full type safety)\n * @param settings - Configuration for API base URL and environment\n * @param responseHandler - Optional handler to process ApiResponse for auto user/token updates\n * @returns Typed Hono client with response interceptor\n *\n * @example\n * ```typescript\n * import type { SDKAppType } from '@/modules/main/server'\n * const client = createApiClient<SDKAppType>({ isDev: true })\n * const response = await client.api.auth['check-email'].$post({ json: { email } })\n * ```\n */\nexport function createApiClient<TAppType extends Hono = any>(\n settings: ApiClientSettings,\n responseHandler?: (response: any) => void,\n): ReturnType<typeof hc<TAppType>> {\n const baseUrl = resolveApiBase(settings.apiBase, settings.isDev)\n\n // Create typed Hono RPC client with response interceptor\n const client = hc<TAppType>(baseUrl, {\n fetch: async (input: RequestInfo | URL, init?: RequestInit) => {\n const token = cookieUtil.getAuthToken()\n\n const response = await fetch(input, {\n ...init,\n headers: {\n ...init?.headers,\n 'Content-Type': 'application/json',\n // Only include Authorization header if token exists\n ...(token && { 'Authorization': `Bearer ${token}` }),\n },\n // Use 'omit' for Bearer tokens (not cookies) to allow CORS wildcard origin\n credentials: 'omit',\n })\n\n // Intercept response to process ApiResponse pattern\n if (responseHandler) {\n // Wrap the original response's json method directly\n const originalJson = response.json.bind(response)\n\n // Override json method on the response object itself\n response.json = async () => {\n const result = await originalJson()\n\n // Process ApiResponse pattern if it has user/token fields\n if (typeof result === 'object' && result !== null) {\n if ('ok' in result && ('user' in result || 'token' in result)) {\n responseHandler(result)\n }\n }\n\n return result\n }\n }\n\n return response\n },\n })\n\n return client\n}\n","import { cleanTasks } from '../task/index.js'\n\nexport let clean = Symbol('clean')\n\nexport let cleanStores = (...stores) => {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'cleanStores() can be used only during development or tests'\n )\n }\n cleanTasks()\n for (let $store of stores) {\n if ($store) {\n if ($store.mocked) delete $store.mocked\n if ($store[clean]) $store[clean]()\n }\n }\n}\n","import { clean } from '../clean-stores/index.js'\n\nlet listenerQueue = []\nlet lqIndex = 0\nconst QUEUE_ITEMS_PER_LISTENER = 4\nexport let epoch = 0\n\n/* @__NO_SIDE_EFFECTS__ */\nexport const atom = initialValue => {\n let listeners = []\n let $atom = {\n get() {\n if (!$atom.lc) {\n $atom.listen(() => {})()\n }\n return $atom.value\n },\n lc: 0,\n listen(listener) {\n $atom.lc = listeners.push(listener)\n\n return () => {\n for (\n let i = lqIndex + QUEUE_ITEMS_PER_LISTENER;\n i < listenerQueue.length;\n\n ) {\n if (listenerQueue[i] === listener) {\n listenerQueue.splice(i, QUEUE_ITEMS_PER_LISTENER)\n } else {\n i += QUEUE_ITEMS_PER_LISTENER\n }\n }\n\n let index = listeners.indexOf(listener)\n if (~index) {\n listeners.splice(index, 1)\n if (!--$atom.lc) $atom.off()\n }\n }\n },\n notify(oldValue, changedKey) {\n epoch++\n let runListenerQueue = !listenerQueue.length\n for (let listener of listeners) {\n listenerQueue.push(listener, $atom.value, oldValue, changedKey)\n }\n\n if (runListenerQueue) {\n for (\n lqIndex = 0;\n lqIndex < listenerQueue.length;\n lqIndex += QUEUE_ITEMS_PER_LISTENER\n ) {\n listenerQueue[lqIndex](\n listenerQueue[lqIndex + 1],\n listenerQueue[lqIndex + 2],\n listenerQueue[lqIndex + 3]\n )\n }\n listenerQueue.length = 0\n }\n },\n /* It will be called on last listener unsubscribing.\n We will redefine it in onMount and onStop. */\n off() {},\n set(newValue) {\n let oldValue = $atom.value\n if (oldValue !== newValue) {\n $atom.value = newValue\n $atom.notify(oldValue)\n }\n },\n subscribe(listener) {\n let unbind = $atom.listen(listener)\n listener($atom.value)\n return unbind\n },\n value: initialValue\n }\n\n if (process.env.NODE_ENV !== 'production') {\n $atom[clean] = () => {\n listeners = []\n $atom.lc = 0\n $atom.off()\n }\n }\n\n return $atom\n}\n\nexport const readonlyType = store => store\n","import type { Ref } from 'vue'\nimport type { EnrichedUser } from '@pagelines/core'\nimport { atom } from 'nanostores'\nimport { watch } from 'vue'\nimport { cookieUtil, createLogger } from '@pagelines/core'\n\n// Global nanostores shared via globalThis so SDK and app bundles use the same atoms\nconst _g = globalThis as Record<string, any>\nconst $globalActiveUser = (_g.__PL_AUTH_USER__ ??= atom<EnrichedUser | undefined>(undefined)) as ReturnType<typeof atom<EnrichedUser | undefined>>\nconst $globalToken = (_g.__PL_AUTH_TOKEN__ ??= atom<string | null>(null)) as ReturnType<typeof atom<string | null>>\n\n/**\n * SDKStorage - Handles all storage, sync, and persistence for PageLinesSDK\n *\n * Extracted from PageLinesSDK to keep the main class focused on public API methods.\n * Manages localStorage, cookies, and nanostor synchronization for state persistence.\n */\nexport class SDKStorage {\n private logger = createLogger('SDKStorage')\n\n /**\n * Check if localStorage is fully functional (some test environments provide partial mocks)\n */\n private isLocalStorageFunctional(): boolean {\n return typeof window !== 'undefined'\n && typeof localStorage?.getItem === 'function'\n && typeof localStorage?.setItem === 'function'\n && typeof localStorage?.removeItem === 'function'\n }\n\n /**\n * Sync Vue reactive refs with global nanostores for cross-page persistence\n */\n syncWithGlobalStores(activeUser: Ref<EnrichedUser | undefined>, token: Ref<string | null>): void {\n // 1. Restore from global store on init\n const storedUser = $globalActiveUser.get()\n const storedToken = $globalToken.get()\n\n if (storedUser) {\n activeUser.value = storedUser\n }\n if (storedToken) {\n token.value = storedToken\n }\n\n // 2. Vue refs → global stores (for persistence)\n watch(activeUser, (newUser) => {\n $globalActiveUser.set(newUser)\n }, { immediate: true })\n\n watch(token, (newToken) => {\n $globalToken.set(newToken)\n }, { immediate: true })\n\n // 3. Global stores → Vue refs (for cross-page updates)\n $globalActiveUser.subscribe((newUser) => {\n if (newUser !== activeUser.value) {\n activeUser.value = newUser\n }\n })\n\n $globalToken.subscribe((newToken) => {\n if (newToken !== token.value) {\n token.value = newToken\n }\n })\n }\n\n /**\n * Load user and token from browser storage on initialization\n */\n loadFromStorage(activeUser: Ref<EnrichedUser | undefined>, token: Ref<string | null>): void {\n if (typeof window === 'undefined')\n return\n\n // Load token from cookie\n const savedToken = cookieUtil.getAuthToken()\n if (savedToken) {\n token.value = savedToken\n }\n\n // Try to load user from localStorage for immediate availability\n if (this.isLocalStorageFunctional()) {\n try {\n const savedUser = localStorage.getItem('pagelines-user')\n if (savedUser) {\n activeUser.value = JSON.parse(savedUser)\n }\n } catch (error) {\n this.logger.error('Failed to load user from localStorage', { data: error })\n }\n }\n }\n\n /**\n * Save current user and token to browser storage\n */\n saveToStorage(activeUser: Ref<EnrichedUser | undefined>, token: Ref<string | null>): void {\n if (typeof window === 'undefined')\n return\n\n // Save token to cookie using app's cookie utility\n if (token.value) {\n cookieUtil.setAuthToken(token.value)\n } else {\n cookieUtil.removeAuthToken()\n }\n\n // Save user to localStorage for quick loading\n if (this.isLocalStorageFunctional()) {\n try {\n if (activeUser.value) {\n localStorage.setItem('pagelines-user', JSON.stringify(activeUser.value))\n } else {\n localStorage.removeItem('pagelines-user')\n }\n } catch (error) {\n this.logger.error('Failed to save user to localStorage', { data: error })\n }\n }\n }\n\n /**\n * Clear all stored user data and tokens\n */\n clearStorage(): void {\n if (typeof window === 'undefined')\n return\n\n cookieUtil.removeAuthToken()\n\n if (this.isLocalStorageFunctional()) {\n try {\n localStorage.removeItem('pagelines-user')\n } catch (error) {\n this.logger.error('Failed to clear user from localStorage', { data: error })\n }\n }\n\n // Clear global stores\n $globalActiveUser.set(undefined)\n $globalToken.set(null)\n }\n\n /**\n * Generic localStorage getter\n */\n getItem(key: string): string | null {\n if (!this.isLocalStorageFunctional())\n return null\n\n try {\n return localStorage.getItem(key)\n } catch (error) {\n this.logger.error('Failed to get item from localStorage', { key, error })\n return null\n }\n }\n\n /**\n * Generic localStorage setter\n */\n setItem(key: string, value: string): void {\n if (!this.isLocalStorageFunctional())\n return\n\n try {\n localStorage.setItem(key, value)\n } catch (error) {\n this.logger.error('Failed to set item in localStorage', { key, error })\n }\n }\n}\n","import type { AgentConfig } from '@pagelines/core'\nimport type { SDKContext } from './types'\nimport { resolveApiBase } from '../api'\n\nconst STATUS_MESSAGES = [\n 'Deploying your server...',\n 'Setting up your workspace...',\n 'Installing tools...',\n 'Almost ready...',\n]\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/agent`, {\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({ 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?.[0]) {\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[0]\n }\n\n async getStatus(args: { agentId: string }): Promise<{\n status: string\n ready: boolean\n error?: string\n }> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n\n const response = await fetch(`${apiBase}/api/agent/${args.agentId}/status`, {\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?: { status: string, ready: boolean, error?: string } }\n\n if (!data.ok || !data.data) {\n return { status: 'unknown', ready: false, error: 'Failed to check status' }\n }\n\n return data.data\n }\n\n async waitUntilReady(args: {\n agentId: string\n onStatus?: (message: string) => 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 messageIndex = 0\n\n while (Date.now() - start < timeoutMs) {\n const status = await this.getStatus({ agentId })\n\n if (status.ready) {\n onStatus?.('Ready!')\n return\n }\n\n if (status.status === 'error') {\n throw new Error(status.error || 'Provisioning failed')\n }\n\n if (onStatus && messageIndex < STATUS_MESSAGES.length) {\n onStatus(STATUS_MESSAGES[messageIndex]!)\n messageIndex++\n }\n\n await new Promise(r => setTimeout(r, pollIntervalMs))\n }\n\n throw new Error('Agent provisioning timed out — please try again')\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\n/**\n * Run an async operation with loading/error state management.\n * Sets loading=true and error=null before, loading=false in finally.\n */\nasync function withLoadingState<T>(ctx: SDKContext, fn: () => Promise<T>): Promise<T> {\n ctx.loading.value = true\n ctx.error.value = null\n try {\n return await fn()\n } finally {\n ctx.loading.value = false\n }\n}\n\nexport class AuthClient {\n constructor(private ctx: SDKContext) {}\n\n async sendCode(email: string): Promise<void> {\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth['check-email'].$post({\n json: { email },\n })\n const data = await response.json()\n if (!data.ok) {\n this.ctx.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.ctx.logger.error('Send code error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Failed to send verification code'\n this.ctx.error.value = errorMessage\n throw err\n }\n })\n }\n\n async verifyCode(email: string, code: string): Promise<void> {\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth['verify-code'].$post({\n json: { email, code },\n })\n const data = await response.json()\n if (!data.ok) {\n this.ctx.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.ctx.logger.error('Verify code error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Failed to verify code'\n this.ctx.error.value = errorMessage\n throw err\n }\n })\n }\n\n async logout(): Promise<void> {\n return withLoadingState(this.ctx, async () => {\n try {\n await this.ctx.api.auth.logout.$post()\n } catch (err) {\n this.ctx.logger.error('Logout error (user still logged out locally)', { data: err })\n }\n // Always clear local state regardless of API success\n this.ctx.activeUser.value = undefined\n this.ctx.token.value = null\n this.ctx.storage.clearStorage()\n })\n }\n\n async getCurrentUser(): Promise<EnrichedUser | undefined> {\n if (!this.ctx.token.value) {\n return undefined\n }\n\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth.me.$get()\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n if (data.error.includes('Authentication')) {\n this.ctx.activeUser.value = undefined\n this.ctx.token.value = null\n this.ctx.storage.clearStorage()\n }\n return undefined\n }\n\n return data.user\n } catch (err) {\n this.ctx.logger.error('Get current user error', { data: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to get user info'\n return undefined\n }\n })\n }\n\n async requestAuthCode(args: { email: string }): Promise<boolean> {\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth['check-email'].$post({\n json: { email: args.email },\n })\n const data = await response.json()\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Failed to request auth code', { email: args.email, error: data.error })\n return false\n }\n this.ctx.logger.info('Auth code requested successfully', { email: args.email })\n return true\n } catch (err) {\n this.ctx.logger.error('Request auth code error', { email: args.email, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to request auth code'\n return false\n }\n })\n }\n\n async loginWithCode(args: {\n email: string\n code: string\n orgId?: string\n autoCreateContact?: boolean\n }): Promise<boolean> {\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth['verify-code'].$post({\n json: { email: args.email, code: args.code },\n })\n const data = await response.json()\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Login failed', { email: args.email, error: data.error })\n return false\n }\n this.ctx.logger.info('Login successful', { email: args.email })\n return true\n } catch (err) {\n this.ctx.logger.error('Login with code error', { email: args.email, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Login failed'\n return false\n }\n })\n }\n\n loginWithGoogle(args?: { onSuccess?: (user: EnrichedUser) => void, onError?: (error: string) => void }): void {\n if (typeof window === 'undefined') {\n this.ctx.logger.error('loginWithGoogle: Only available in browser')\n return\n }\n\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const origin = window.location.origin\n const popupUrl = `${apiBase}/auth/google-popup?origin=${encodeURIComponent(origin)}`\n\n // Open centered popup\n const width = 500\n const height = 600\n const left = window.screenX + (window.outerWidth - width) / 2\n const top = window.screenY + (window.outerHeight - height) / 2\n const popup = window.open(\n popupUrl,\n 'google-auth',\n `width=${width},height=${height},left=${left},top=${top},popup=yes`,\n )\n\n if (!popup) {\n const msg = 'Popup was blocked. Please allow popups for this site.'\n this.ctx.error.value = msg\n args?.onError?.(msg)\n return\n }\n\n // Listen for postMessage from popup\n const handler = (event: MessageEvent) => {\n // Validate origin -- must be our API base\n const expectedOrigin = new URL(apiBase).origin\n if (event.origin !== expectedOrigin) return\n\n if (event.data?.type === 'auth-success') {\n window.removeEventListener('message', handler)\n const { token, user } = event.data\n\n // Process the auth response the same way as other login methods\n this.ctx.processApiResponse({ ok: true, data: {}, token, user })\n\n this.ctx.logger.info('Google login successful')\n args?.onSuccess?.(user)\n } else if (event.data?.type === 'auth-error') {\n window.removeEventListener('message', handler)\n const errorMsg = event.data.error || 'Google authentication failed'\n this.ctx.error.value = errorMsg\n this.ctx.logger.error('Google login failed', { error: errorMsg })\n args?.onError?.(errorMsg)\n }\n }\n\n window.addEventListener('message', handler)\n\n // Clean up listener if popup is closed without completing auth\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkClosed)\n window.removeEventListener('message', handler)\n }\n }, 500)\n }\n}\n","import type { ApiResponse } from '@pagelines/core'\nimport type { SDKContext } from './types'\nimport { resolveApiBase } from '../api'\n\nexport class ChatClient {\n constructor(private ctx: SDKContext) {}\n\n async chatStream(args: {\n handle: string\n message: string\n attachments?: Array<{ type: string, url: string, name: string, mimeType: string, mediaId?: string }>\n conversationId?: string\n history?: Array<{ role: 'user' | 'assistant', content: string }>\n visitorId?: string\n context?: string\n onDelta: (text: string) => void\n onDone: (conversationId: string) => void\n onError: (error: string) => void\n onStatus?: (status: string) => void\n }): Promise<void> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const url = `${apiBase}/api/agent/public/${encodeURIComponent(args.handle)}/chat/stream`\n\n return this._streamChat({\n url,\n headers: { 'Content-Type': 'application/json' },\n body: {\n message: args.message,\n conversationId: args.conversationId,\n history: args.history,\n visitorId: args.visitorId,\n context: args.context,\n attachments: args.attachments,\n },\n conversationId: args.conversationId,\n onDelta: args.onDelta,\n onDone: args.onDone,\n onError: args.onError,\n onStatus: args.onStatus,\n })\n }\n\n async chatStreamAuthenticated(args: {\n agentId: string\n message: string\n attachments?: Array<{ type: string, url: string, name: string, mimeType: string, mediaId?: string }>\n conversationId?: string\n history?: Array<{ role: 'user' | 'assistant', content: string }>\n onDelta: (text: string) => void\n onDone: (conversationId: string) => void\n onError: (error: string) => void\n onStatus?: (status: string) => void\n }): Promise<void> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const url = `${apiBase}/api/agent/${encodeURIComponent(args.agentId)}/chat/stream`\n\n return this._streamChat({\n url,\n headers: {\n 'Content-Type': 'application/json',\n ...(this.ctx.token.value && { 'Authorization': `Bearer ${this.ctx.token.value}` }),\n },\n body: {\n message: args.message,\n conversationId: args.conversationId,\n history: args.history,\n attachments: args.attachments,\n },\n conversationId: args.conversationId,\n onDelta: args.onDelta,\n onDone: args.onDone,\n onError: args.onError,\n onStatus: args.onStatus,\n })\n }\n\n /** Shared SSE streaming logic for both public and authenticated chat */\n private async _streamChat(args: {\n url: string\n headers: Record<string, string>\n body: Record<string, unknown>\n conversationId?: string\n onDelta: (text: string) => void\n onDone: (conversationId: string) => void\n onError: (error: string) => void\n onStatus?: (status: string) => void\n }): Promise<void> {\n try {\n const response = await fetch(args.url, {\n method: 'POST',\n headers: args.headers,\n body: JSON.stringify(args.body),\n })\n\n if (!response.ok) {\n const errorBody = await response.json().catch(() => ({ error: 'Request failed' })) as { error?: string }\n args.onError(errorBody.error || `HTTP ${response.status}`)\n return\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n args.onError('No response stream')\n return\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n let resolvedConversationId = args.conversationId || ''\n\n while (true) {\n const { done, value } = await reader.read()\n if (done)\n break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.startsWith('data: '))\n continue\n\n const data = line.slice(6).trim()\n if (data === '[DONE]') {\n args.onDone(resolvedConversationId)\n return\n }\n\n try {\n const chunk = JSON.parse(data) as {\n choices?: Array<{ delta?: { content?: string } }>\n pl_metadata?: { conversationId?: string }\n pl_status?: string\n }\n\n // Handle status events (e.g. \"Waking up...\")\n if (chunk.pl_status) {\n args.onStatus?.(chunk.pl_status)\n continue\n }\n\n if (chunk.pl_metadata?.conversationId) {\n resolvedConversationId = chunk.pl_metadata.conversationId\n }\n\n const delta = chunk.choices?.[0]?.delta\n if (delta?.content) {\n args.onDelta(delta.content)\n }\n } catch {\n // Skip malformed chunks\n }\n }\n }\n\n // Stream ended without [DONE]\n args.onDone(resolvedConversationId)\n } catch (error) {\n args.onError(error instanceof Error ? error.message : 'Stream failed')\n }\n }\n\n async chatMessage(args: {\n handle: string\n message: string\n conversationId?: string\n visitorId?: string\n context?: string\n }): Promise<{ conversationId: string, content: string } | undefined> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const url = `${apiBase}/api/agent/public/${encodeURIComponent(args.handle)}/chat`\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n message: args.message,\n conversationId: args.conversationId,\n visitorId: args.visitorId,\n context: args.context,\n }),\n })\n\n const data = await response.json() as ApiResponse<{\n conversationId: string\n message: { role: 'assistant', content: string }\n }>\n\n if (!data.ok || !data.data) {\n this.ctx.logger.error('chatMessage failed', { error: !data.ok && 'error' in data ? data.error : 'Unknown' })\n return undefined\n }\n\n return {\n conversationId: data.data.conversationId,\n content: data.data.message.content,\n }\n } catch (err) {\n this.ctx.logger.error('chatMessage error', { error: err })\n return undefined\n }\n }\n}\n","import type { AgentConfig } from '@pagelines/core'\nimport { objectId } from '@pagelines/core'\nimport type { SDKContext } from './types'\n\nexport class UserClient {\n constructor(private ctx: SDKContext) {}\n\n async getPublicAgent(args: { handle: string }): Promise<AgentConfig | undefined> {\n this.ctx.loading.value = true\n this.ctx.error.value = null\n\n try {\n const response = await this.ctx.api.agent.public[':handle'].$get({\n param: { handle: args.handle },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Failed to fetch public agent', { handle: args.handle, error: data.error })\n return undefined\n }\n\n return data.data\n } catch (err) {\n this.ctx.logger.error('Get public agent error', { handle: args.handle, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to fetch agent'\n return undefined\n } finally {\n this.ctx.loading.value = false\n }\n }\n\n async getAgentByEmail(args: { email: string }): Promise<AgentConfig | undefined> {\n this.ctx.loading.value = true\n this.ctx.error.value = null\n\n try {\n const response = await this.ctx.api.agent['by-email'][':email'].$get({\n param: { email: args.email },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Failed to fetch agent by email', { email: args.email, error: data.error })\n return undefined\n }\n\n return data.data\n } catch (err) {\n this.ctx.logger.error('Get agent by email error', { email: args.email, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to fetch agent'\n return undefined\n } finally {\n this.ctx.loading.value = false\n }\n }\n\n generateAnonId(): string {\n const storageKey = 'pagelinesAnonId'\n let anonId = this.ctx.storage.getItem(storageKey)\n\n if (!anonId) {\n anonId = objectId({ prefix: 'anon' })\n this.ctx.storage.setItem(storageKey, anonId)\n }\n\n return anonId\n }\n\n track(args: {\n event: 'view_profile' | 'profile_interaction'\n agentId: string\n properties?: Record<string, any>\n }): void {\n try {\n // Track event via postMessage to parent window if embedded\n if (typeof window !== 'undefined' && window.parent !== window) {\n window.parent.postMessage({\n type: 'pagelines_track',\n event: args.event,\n agentId: args.agentId,\n properties: args.properties || {},\n }, '*')\n }\n\n this.ctx.logger.info('SDK event tracked', { event: args.event, agentId: args.agentId })\n } catch (err) {\n this.ctx.logger.error('Track event error', { error: err, args })\n }\n }\n}\n","import type { hc } from 'hono/client'\n// Use stub type for production builds (aliased in vite.config.sdk.ts)\n// Dev uses real SDKAppType from server via alias\nimport type { SDKAppType } from '@/modules/main/server'\nimport type { AgentConfig, EnrichedUser } from '@pagelines/core'\nimport type { ApiResponse } from '@pagelines/core'\nimport { objectId, SettingsObject } from '@pagelines/core'\nimport { computed, ref } from 'vue'\nimport { createApiClient } from './api'\nimport { SDKStorage } from './sdkStorage'\nimport { AgentClient } from './clients/AgentClient'\nimport { AuthClient } from './clients/AuthClient'\nimport { ChatClient } from './clients/ChatClient'\nimport { UserClient } from './clients/UserClient'\nimport type { SDKContext } from './clients/types'\n\nexport interface PageLinesSDKSettings {\n apiBase?: string\n isDev?: boolean\n [key: string]: unknown\n}\n\n/**\n * Browser-only singleton manager\n * Browser: Uses globalThis for cross-bundle singleton (www + widget)\n * Node.js SSR: No singleton - each request gets new instance (prevents request bleeding)\n */\nclass SDKGlobal {\n private key = '__PAGELINES_SDK__'\n\n get(): PageLinesSDK | undefined {\n if (typeof window === 'undefined')\n return undefined\n return (globalThis as any)[this.key]\n }\n\n set(instance: PageLinesSDK): void {\n if (typeof window !== 'undefined')\n (globalThis as any)[this.key] = instance\n }\n\n delete(): void {\n if (typeof window !== 'undefined')\n delete (globalThis as any)[this.key]\n }\n}\n\n// Module-scoped singleton manager\nconst sdkGlobal = new SDKGlobal()\n\nexport class PageLinesSDK extends SettingsObject<PageLinesSDKSettings> {\n /**\n * Get singleton instance in browser (creates if doesn't exist)\n * Node.js: Always creates new instance (no singleton)\n * Recommended: Use this instead of constructor for shared state\n */\n static getInstance(settings: PageLinesSDKSettings = {}): PageLinesSDK {\n // Browser: return singleton or create\n // Node: always create new (no singleton)\n return sdkGlobal.get() || new PageLinesSDK(settings)\n }\n\n // Vue reactive state\n activeUser = ref<EnrichedUser | undefined>()\n token = ref<string | null>(null)\n loading = ref(false)\n error = ref<string | null>(null)\n apiBase = this.settings.apiBase || undefined\n\n // Storage handler for persistence\n private storage = new SDKStorage()\n\n // Auto-managed session ID for usage tracking\n private sessionId = objectId({ prefix: 'ses' })\n\n get isDev() {\n return this.settings.isDev ?? (\n typeof window !== 'undefined'\n ? window.location.hostname === 'localhost' || window.location.hostname.includes('127.0.0.1')\n : false\n )\n }\n\n // Typed Hono RPC client - uses SDKAppType (auth/self/usage routes only)\n // Initialized in constructor (definite assignment via singleton pattern)\n private apiClient!: ReturnType<typeof hc<SDKAppType>>\n\n // Bypass stub typing for route access (production builds use SDKAppType stub)\n // Runtime types are validated via Zod at API boundaries\n private get api() {\n return (this.apiClient as any).api\n }\n\n // Computed properties derived from activeUser (matches UserClient pattern)\n currentAgent = computed(() => {\n const user = this.activeUser.value\n if (!user?.agents)\n return undefined\n\n const agentId = user.primaryAgentId || user.agents[0]?.agentId\n if (!agentId)\n return undefined\n\n return user.agents.find((a) => a.agentId === agentId)\n })\n\n currentOrg = computed(() => {\n const agent = this.currentAgent.value\n if (!agent?.orgId)\n return undefined\n\n const user = this.activeUser.value\n if (!user?.orgs)\n return undefined\n\n return user.orgs.find((org) => org.orgId === agent.orgId)\n })\n\n // Initialization state\n initialized?: Promise<EnrichedUser | undefined>\n resolveUser?: (value: EnrichedUser | undefined) => void\n\n // Sub-clients (new preferred API surface)\n readonly agent!: AgentClient\n readonly auth!: AuthClient\n readonly chat!: ChatClient\n readonly user!: UserClient\n\n constructor(settings: PageLinesSDKSettings = {}) {\n // Browser: return existing singleton\n // Node: always create new\n const existing = sdkGlobal.get()\n if (existing) {\n console.debug('[PageLinesSDK] Returning existing singleton instance')\n return existing\n }\n\n super('PageLinesSDK', settings)\n\n // Browser: set singleton reference (no-op in Node)\n sdkGlobal.set(this)\n\n // Create typed Hono RPC client with response handler\n this.apiClient = createApiClient<SDKAppType>(\n { isDev: this.isDev, apiBase: this.apiBase },\n this.processApiResponse.bind(this),\n )\n\n // Build shared context for sub-clients\n const ctx: SDKContext = {\n api: this.api,\n apiBase: this.apiBase,\n isDev: this.isDev,\n activeUser: this.activeUser,\n token: this.token,\n loading: this.loading,\n error: this.error,\n currentAgent: this.currentAgent,\n storage: this.storage,\n sessionId: this.sessionId,\n logger: this.logger,\n processApiResponse: this.processApiResponse.bind(this),\n }\n\n // Initialize sub-clients\n this.agent = new AgentClient(ctx)\n this.auth = new AuthClient(ctx)\n this.chat = new ChatClient(ctx)\n this.user = new UserClient(ctx)\n\n this.logger.info('PageLinesSDK initialized')\n\n // Initialize from storage using handler\n this.storage.loadFromStorage(this.activeUser, this.token)\n\n // Sync with global stores for persistence across navigation\n this.storage.syncWithGlobalStores(this.activeUser, this.token)\n\n // Set up initialization promise (same pattern as UserClient)\n this.initialized = new Promise((resolve) => {\n this.resolveUser = resolve\n })\n\n // Auto-fetch user if token exists (mirrors UserClient pattern)\n if (this.token.value && !this.activeUser.value) {\n this.getCurrentUser().then((user) => {\n if (this.resolveUser) {\n this.resolveUser(user)\n this.resolveUser = undefined\n }\n }).catch((err) => {\n this.logger.error('Auto user fetch failed', { data: err })\n if (this.resolveUser) {\n this.resolveUser(undefined)\n this.resolveUser = undefined\n }\n })\n } else if (this.activeUser.value) {\n // Resolve immediately if we already have a user from storage\n this.resolveUser?.(this.activeUser.value)\n } else {\n // No token, resolve with undefined\n this.resolveUser?.(undefined)\n }\n }\n\n // Process ApiResponse for automatic user/token updates - public for dependency injection\n processApiResponse(response: ApiResponse<any>): void {\n // Handle user updates\n if (response.ok && response.user) {\n this.activeUser.value = response.user\n this.logger.info('User updated from API response', { data: response.user })\n }\n\n // Handle token updates\n if (response.ok && response.token) {\n this.token.value = response.token\n this.storage.saveToStorage(this.activeUser, this.token)\n this.logger.info('Token updated from API response')\n }\n\n // Resolve initialization promise\n if (this.resolveUser && response.ok) {\n this.resolveUser(response.user)\n this.resolveUser = undefined\n }\n }\n\n // Clear all user data and tokens\n clearSession(): void {\n this.logger.info('Clearing session')\n this.activeUser.value = undefined\n this.token.value = null\n this.error.value = null\n this.storage.clearStorage()\n }\n\n // Full reset - clears session + state + destroys singleton\n clear(): void {\n this.logger.info('Clearing SDK completely')\n\n // 1. Clear session data\n this.clearSession()\n\n // 2. Reset other state\n this.loading.value = false\n this.sessionId = objectId({ prefix: 'ses' })\n\n // 3. Destroy singleton (no-op in Node)\n sdkGlobal.delete()\n }\n\n // Backward-compatible delegates — these forward to sub-clients\n // Can be removed in a future breaking change\n async sendCode(email: string): Promise<void> { return this.auth.sendCode(email) }\n async verifyCode(email: string, code: string): Promise<void> { return this.auth.verifyCode(email, code) }\n async logout(): Promise<void> { return this.auth.logout() }\n async getCurrentUser(): Promise<EnrichedUser | undefined> { return this.auth.getCurrentUser() }\n async requestAuthCode(args: { email: string }): Promise<boolean> { return this.auth.requestAuthCode(args) }\n async loginWithCode(args: { email: string, code: string, orgId?: string, autoCreateContact?: boolean }): Promise<boolean> { return this.auth.loginWithCode(args) }\n loginWithGoogle(args?: { onSuccess?: (user: EnrichedUser) => void, onError?: (error: string) => void }): void { return this.auth.loginWithGoogle(args) }\n\n async chatStream(args: Parameters<ChatClient['chatStream']>[0]): Promise<void> { return this.chat.chatStream(args) }\n async chatStreamAuthenticated(args: Parameters<ChatClient['chatStreamAuthenticated']>[0]): Promise<void> { return this.chat.chatStreamAuthenticated(args) }\n async chatMessage(args: Parameters<ChatClient['chatMessage']>[0]): Promise<{ conversationId: string, content: string } | undefined> { return this.chat.chatMessage(args) }\n\n async getPublicAgent(args: { handle: string }): Promise<AgentConfig | undefined> { return this.user.getPublicAgent(args) }\n async getAgentByEmail(args: { email: string }): Promise<AgentConfig | undefined> { return this.user.getAgentByEmail(args) }\n generateAnonId(): string { return this.user.generateAnonId() }\n track(args: Parameters<UserClient['track']>[0]): void { return this.user.track(args) }\n}\n"],"names":["resolveApiBase","apiBase","isDev","APP_PORT","APP_PROD_URL","__name","createApiClient","settings","responseHandler","baseUrl","hc","input","init","token","cookieUtil","response","originalJson","result","clean","listenerQueue","lqIndex","QUEUE_ITEMS_PER_LISTENER","atom","initialValue","listeners","$atom","listener","i","index","oldValue","changedKey","runListenerQueue","newValue","unbind","_g","$globalActiveUser","$globalToken","_SDKStorage","__publicField","createLogger","activeUser","storedUser","storedToken","watch","newUser","newToken","savedToken","savedUser","error","key","value","SDKStorage","STATUS_MESSAGES","_AgentClient","ctx","args","orgId","data","msg","agentId","onStatus","timeoutMs","pollIntervalMs","start","messageIndex","status","r","AgentClient","withLoadingState","fn","_AuthClient","email","err","errorMessage","code","origin","popupUrl","width","height","left","top","popup","handler","event","expectedOrigin","user","errorMsg","checkClosed","AuthClient","_ChatClient","url","errorBody","reader","decoder","buffer","resolvedConversationId","done","lines","line","chunk","delta","ChatClient","_UserClient","storageKey","anonId","objectId","UserClient","_SDKGlobal","instance","SDKGlobal","sdkGlobal","_PageLinesSDK","SettingsObject","existing","ref","computed","a","agent","org","resolve","PageLinesSDK"],"mappings":"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","x_google_ignoreList":[1,2]}
|
|
1
|
+
{"version":3,"file":"sdkClient.js","sources":["../api.ts","../../../node_modules/.pnpm/nanostores@1.1.1/node_modules/nanostores/clean-stores/index.js","../../../node_modules/.pnpm/nanostores@1.1.1/node_modules/nanostores/atom/index.js","../sdkStorage.ts","../clients/AgentClient.ts","../clients/AuthClient.ts","../clients/ChatClient.ts","../clients/UserClient.ts","../sdkClient.ts"],"sourcesContent":["import type { Hono } from 'hono'\nimport { APP_PORT, APP_PROD_URL } from '@pagelines/core'\nimport { hc } from 'hono/client'\nimport { cookieUtil } from '@pagelines/core'\n\nexport interface ApiClientSettings {\n isDev: boolean\n apiBase?: string\n [key: string]: unknown\n}\n\n/**\n * Resolve API base URL from settings.\n * Centralizes the isDev/apiBase/production URL logic used across SDK clients.\n */\nexport function resolveApiBase(apiBase?: string, isDev?: boolean): string {\n return apiBase || (isDev ? `http://localhost:${APP_PORT}` : APP_PROD_URL)\n}\n\n/**\n * Create fully typed Hono RPC client for PageLines SDK\n *\n * @template TAppType - The Hono app type from the server (enables full type safety)\n * @param settings - Configuration for API base URL and environment\n * @param responseHandler - Optional handler to process ApiResponse for auto user/token updates\n * @returns Typed Hono client with response interceptor\n *\n * @example\n * ```typescript\n * import type { SDKAppType } from '@/modules/main/server'\n * const client = createApiClient<SDKAppType>({ isDev: true })\n * const response = await client.api.auth['check-email'].$post({ json: { email } })\n * ```\n */\nexport function createApiClient<TAppType extends Hono = any>(\n settings: ApiClientSettings,\n responseHandler?: (response: any) => void,\n): ReturnType<typeof hc<TAppType>> {\n const baseUrl = resolveApiBase(settings.apiBase, settings.isDev)\n\n // Create typed Hono RPC client with response interceptor\n const client = hc<TAppType>(baseUrl, {\n fetch: async (input: RequestInfo | URL, init?: RequestInit) => {\n const token = cookieUtil.getAuthToken()\n\n const response = await fetch(input, {\n ...init,\n headers: {\n ...init?.headers,\n 'Content-Type': 'application/json',\n // Only include Authorization header if token exists\n ...(token && { 'Authorization': `Bearer ${token}` }),\n },\n // Use 'omit' for Bearer tokens (not cookies) to allow CORS wildcard origin\n credentials: 'omit',\n })\n\n // Intercept response to process ApiResponse pattern\n if (responseHandler) {\n // Wrap the original response's json method directly\n const originalJson = response.json.bind(response)\n\n // Override json method on the response object itself\n response.json = async () => {\n const result = await originalJson()\n\n // Process ApiResponse pattern if it has user/token fields\n if (typeof result === 'object' && result !== null) {\n if ('ok' in result && ('user' in result || 'token' in result)) {\n responseHandler(result)\n }\n }\n\n return result\n }\n }\n\n return response\n },\n })\n\n return client\n}\n","import { cleanTasks } from '../task/index.js'\n\nexport let clean = Symbol('clean')\n\nexport let cleanStores = (...stores) => {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'cleanStores() can be used only during development or tests'\n )\n }\n cleanTasks()\n for (let $store of stores) {\n if ($store) {\n if ($store.mocked) delete $store.mocked\n if ($store[clean]) $store[clean]()\n }\n }\n}\n","import { clean } from '../clean-stores/index.js'\n\nlet listenerQueue = []\nlet lqIndex = 0\nconst QUEUE_ITEMS_PER_LISTENER = 4\nexport let epoch = 0\n\n/* @__NO_SIDE_EFFECTS__ */\nexport const atom = initialValue => {\n let listeners = []\n let $atom = {\n get() {\n if (!$atom.lc) {\n $atom.listen(() => {})()\n }\n return $atom.value\n },\n lc: 0,\n listen(listener) {\n $atom.lc = listeners.push(listener)\n\n return () => {\n for (\n let i = lqIndex + QUEUE_ITEMS_PER_LISTENER;\n i < listenerQueue.length;\n\n ) {\n if (listenerQueue[i] === listener) {\n listenerQueue.splice(i, QUEUE_ITEMS_PER_LISTENER)\n } else {\n i += QUEUE_ITEMS_PER_LISTENER\n }\n }\n\n let index = listeners.indexOf(listener)\n if (~index) {\n listeners.splice(index, 1)\n if (!--$atom.lc) $atom.off()\n }\n }\n },\n notify(oldValue, changedKey) {\n epoch++\n let runListenerQueue = !listenerQueue.length\n for (let listener of listeners) {\n listenerQueue.push(listener, $atom.value, oldValue, changedKey)\n }\n\n if (runListenerQueue) {\n for (\n lqIndex = 0;\n lqIndex < listenerQueue.length;\n lqIndex += QUEUE_ITEMS_PER_LISTENER\n ) {\n listenerQueue[lqIndex](\n listenerQueue[lqIndex + 1],\n listenerQueue[lqIndex + 2],\n listenerQueue[lqIndex + 3]\n )\n }\n listenerQueue.length = 0\n }\n },\n /* It will be called on last listener unsubscribing.\n We will redefine it in onMount and onStop. */\n off() {},\n set(newValue) {\n let oldValue = $atom.value\n if (oldValue !== newValue) {\n $atom.value = newValue\n $atom.notify(oldValue)\n }\n },\n subscribe(listener) {\n let unbind = $atom.listen(listener)\n listener($atom.value)\n return unbind\n },\n value: initialValue\n }\n\n if (process.env.NODE_ENV !== 'production') {\n $atom[clean] = () => {\n listeners = []\n $atom.lc = 0\n $atom.off()\n }\n }\n\n return $atom\n}\n\nexport const readonlyType = store => store\n","import type { Ref } from 'vue'\nimport type { EnrichedUser } from '@pagelines/core'\nimport { atom } from 'nanostores'\nimport { watch } from 'vue'\nimport { cookieUtil, createLogger } from '@pagelines/core'\n\n// Global nanostores shared via globalThis so SDK and app bundles use the same atoms\nconst _g = globalThis as Record<string, any>\nconst $globalActiveUser = (_g.__PL_AUTH_USER__ ??= atom<EnrichedUser | undefined>(undefined)) as ReturnType<typeof atom<EnrichedUser | undefined>>\nconst $globalToken = (_g.__PL_AUTH_TOKEN__ ??= atom<string | null>(null)) as ReturnType<typeof atom<string | null>>\n\n/**\n * SDKStorage - Handles all storage, sync, and persistence for PageLinesSDK\n *\n * Extracted from PageLinesSDK to keep the main class focused on public API methods.\n * Manages localStorage, cookies, and nanostor synchronization for state persistence.\n */\nexport class SDKStorage {\n private logger = createLogger('SDKStorage')\n\n /**\n * Check if localStorage is fully functional (some test environments provide partial mocks)\n */\n private isLocalStorageFunctional(): boolean {\n return typeof window !== 'undefined'\n && typeof localStorage?.getItem === 'function'\n && typeof localStorage?.setItem === 'function'\n && typeof localStorage?.removeItem === 'function'\n }\n\n /**\n * Sync Vue reactive refs with global nanostores for cross-page persistence\n */\n syncWithGlobalStores(activeUser: Ref<EnrichedUser | undefined>, token: Ref<string | null>): void {\n // 1. Restore from global store on init\n const storedUser = $globalActiveUser.get()\n const storedToken = $globalToken.get()\n\n if (storedUser) {\n activeUser.value = storedUser\n }\n if (storedToken) {\n token.value = storedToken\n }\n\n // 2. Vue refs → global stores (for persistence)\n watch(activeUser, (newUser) => {\n $globalActiveUser.set(newUser)\n }, { immediate: true })\n\n watch(token, (newToken) => {\n $globalToken.set(newToken)\n }, { immediate: true })\n\n // 3. Global stores → Vue refs (for cross-page updates)\n $globalActiveUser.subscribe((newUser) => {\n if (newUser !== activeUser.value) {\n activeUser.value = newUser\n }\n })\n\n $globalToken.subscribe((newToken) => {\n if (newToken !== token.value) {\n token.value = newToken\n }\n })\n }\n\n /**\n * Load user and token from browser storage on initialization\n */\n loadFromStorage(activeUser: Ref<EnrichedUser | undefined>, token: Ref<string | null>): void {\n if (typeof window === 'undefined')\n return\n\n // Load token from cookie\n const savedToken = cookieUtil.getAuthToken()\n if (savedToken) {\n token.value = savedToken\n }\n\n // Try to load user from localStorage for immediate availability\n if (this.isLocalStorageFunctional()) {\n try {\n const savedUser = localStorage.getItem('pagelines-user')\n if (savedUser) {\n activeUser.value = JSON.parse(savedUser)\n }\n } catch (error) {\n this.logger.error('Failed to load user from localStorage', { data: error })\n }\n }\n }\n\n /**\n * Save current user and token to browser storage\n */\n saveToStorage(activeUser: Ref<EnrichedUser | undefined>, token: Ref<string | null>): void {\n if (typeof window === 'undefined')\n return\n\n // Save token to cookie using app's cookie utility\n if (token.value) {\n cookieUtil.setAuthToken(token.value)\n } else {\n cookieUtil.removeAuthToken()\n }\n\n // Save user to localStorage for quick loading\n if (this.isLocalStorageFunctional()) {\n try {\n if (activeUser.value) {\n localStorage.setItem('pagelines-user', JSON.stringify(activeUser.value))\n } else {\n localStorage.removeItem('pagelines-user')\n }\n } catch (error) {\n this.logger.error('Failed to save user to localStorage', { data: error })\n }\n }\n }\n\n /**\n * Clear all stored user data and tokens\n */\n clearStorage(): void {\n if (typeof window === 'undefined')\n return\n\n cookieUtil.removeAuthToken()\n\n if (this.isLocalStorageFunctional()) {\n try {\n localStorage.removeItem('pagelines-user')\n } catch (error) {\n this.logger.error('Failed to clear user from localStorage', { data: error })\n }\n }\n\n // Clear global stores\n $globalActiveUser.set(undefined)\n $globalToken.set(null)\n }\n\n /**\n * Generic localStorage getter\n */\n getItem(key: string): string | null {\n if (!this.isLocalStorageFunctional())\n return null\n\n try {\n return localStorage.getItem(key)\n } catch (error) {\n this.logger.error('Failed to get item from localStorage', { key, error })\n return null\n }\n }\n\n /**\n * Generic localStorage setter\n */\n setItem(key: string, value: string): void {\n if (!this.isLocalStorageFunctional())\n return\n\n try {\n localStorage.setItem(key, value)\n } catch (error) {\n this.logger.error('Failed to set item in localStorage', { key, error })\n }\n }\n}\n","import type { AgentConfig } from '@pagelines/core'\nimport type { SDKContext } from './types'\nimport { resolveApiBase } from '../api'\n\nconst STATUS_MESSAGES = [\n 'Deploying your server...',\n 'Setting up your workspace...',\n 'Installing tools...',\n 'Almost ready...',\n]\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/agent`, {\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({ 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?.[0]) {\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[0]\n }\n\n async getStatus(args: { agentId: string }): Promise<{\n status: string\n ready: boolean\n error?: string\n }> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n\n const response = await fetch(`${apiBase}/api/agent/${args.agentId}/status`, {\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?: { status: string, ready: boolean, error?: string } }\n\n if (!data.ok || !data.data) {\n return { status: 'unknown', ready: false, error: 'Failed to check status' }\n }\n\n return data.data\n }\n\n async waitUntilReady(args: {\n agentId: string\n onStatus?: (message: string) => 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 messageIndex = 0\n\n while (Date.now() - start < timeoutMs) {\n const status = await this.getStatus({ agentId })\n\n if (status.ready) {\n onStatus?.('Ready!')\n return\n }\n\n if (status.status === 'error') {\n throw new Error(status.error || 'Provisioning failed')\n }\n\n if (onStatus && messageIndex < STATUS_MESSAGES.length) {\n onStatus(STATUS_MESSAGES[messageIndex]!)\n messageIndex++\n }\n\n await new Promise(r => setTimeout(r, pollIntervalMs))\n }\n\n throw new Error('Agent provisioning timed out — 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/agents/${args.agentId}/webhook`\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\n/**\n * Run an async operation with loading/error state management.\n * Sets loading=true and error=null before, loading=false in finally.\n */\nasync function withLoadingState<T>(ctx: SDKContext, fn: () => Promise<T>): Promise<T> {\n ctx.loading.value = true\n ctx.error.value = null\n try {\n return await fn()\n } finally {\n ctx.loading.value = false\n }\n}\n\nexport class AuthClient {\n constructor(private ctx: SDKContext) {}\n\n async sendCode(email: string): Promise<void> {\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth['check-email'].$post({\n json: { email },\n })\n const data = await response.json()\n if (!data.ok) {\n this.ctx.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.ctx.logger.error('Send code error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Failed to send verification code'\n this.ctx.error.value = errorMessage\n throw err\n }\n })\n }\n\n async verifyCode(email: string, code: string): Promise<void> {\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth['verify-code'].$post({\n json: { email, code },\n })\n const data = await response.json()\n if (!data.ok) {\n this.ctx.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.ctx.logger.error('Verify code error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Failed to verify code'\n this.ctx.error.value = errorMessage\n throw err\n }\n })\n }\n\n async logout(): Promise<void> {\n return withLoadingState(this.ctx, async () => {\n try {\n await this.ctx.api.auth.logout.$post()\n } catch (err) {\n this.ctx.logger.error('Logout error (user still logged out locally)', { data: err })\n }\n // Always clear local state regardless of API success\n this.ctx.activeUser.value = undefined\n this.ctx.token.value = null\n this.ctx.storage.clearStorage()\n })\n }\n\n async getCurrentUser(): Promise<EnrichedUser | undefined> {\n if (!this.ctx.token.value) {\n return undefined\n }\n\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth.me.$get()\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n if (data.error.includes('Authentication')) {\n this.ctx.activeUser.value = undefined\n this.ctx.token.value = null\n this.ctx.storage.clearStorage()\n }\n return undefined\n }\n\n return data.user\n } catch (err) {\n this.ctx.logger.error('Get current user error', { data: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to get user info'\n return undefined\n }\n })\n }\n\n async requestAuthCode(args: { email: string }): Promise<boolean> {\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth['check-email'].$post({\n json: { email: args.email },\n })\n const data = await response.json()\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Failed to request auth code', { email: args.email, error: data.error })\n return false\n }\n this.ctx.logger.info('Auth code requested successfully', { email: args.email })\n return true\n } catch (err) {\n this.ctx.logger.error('Request auth code error', { email: args.email, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to request auth code'\n return false\n }\n })\n }\n\n async loginWithCode(args: {\n email: string\n code: string\n orgId?: string\n autoCreateContact?: boolean\n }): Promise<boolean> {\n return withLoadingState(this.ctx, async () => {\n try {\n const response = await this.ctx.api.auth['verify-code'].$post({\n json: { email: args.email, code: args.code },\n })\n const data = await response.json()\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Login failed', { email: args.email, error: data.error })\n return false\n }\n this.ctx.logger.info('Login successful', { email: args.email })\n return true\n } catch (err) {\n this.ctx.logger.error('Login with code error', { email: args.email, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Login failed'\n return false\n }\n })\n }\n\n loginWithGoogle(args?: { onSuccess?: (user: EnrichedUser) => void, onError?: (error: string) => void }): void {\n if (typeof window === 'undefined') {\n this.ctx.logger.error('loginWithGoogle: Only available in browser')\n return\n }\n\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const origin = window.location.origin\n const popupUrl = `${apiBase}/auth/google-popup?origin=${encodeURIComponent(origin)}`\n\n // Open centered popup\n const width = 500\n const height = 600\n const left = window.screenX + (window.outerWidth - width) / 2\n const top = window.screenY + (window.outerHeight - height) / 2\n const popup = window.open(\n popupUrl,\n 'google-auth',\n `width=${width},height=${height},left=${left},top=${top},popup=yes`,\n )\n\n if (!popup) {\n const msg = 'Popup was blocked. Please allow popups for this site.'\n this.ctx.error.value = msg\n args?.onError?.(msg)\n return\n }\n\n // Listen for postMessage from popup\n const handler = (event: MessageEvent) => {\n // Validate origin -- must be our API base\n const expectedOrigin = new URL(apiBase).origin\n if (event.origin !== expectedOrigin) return\n\n if (event.data?.type === 'auth-success') {\n window.removeEventListener('message', handler)\n const { token, user } = event.data\n\n // Process the auth response the same way as other login methods\n this.ctx.processApiResponse({ ok: true, data: {}, token, user })\n\n this.ctx.logger.info('Google login successful')\n args?.onSuccess?.(user)\n } else if (event.data?.type === 'auth-error') {\n window.removeEventListener('message', handler)\n const errorMsg = event.data.error || 'Google authentication failed'\n this.ctx.error.value = errorMsg\n this.ctx.logger.error('Google login failed', { error: errorMsg })\n args?.onError?.(errorMsg)\n }\n }\n\n window.addEventListener('message', handler)\n\n // Clean up listener if popup is closed without completing auth\n const checkClosed = setInterval(() => {\n if (popup.closed) {\n clearInterval(checkClosed)\n window.removeEventListener('message', handler)\n }\n }, 500)\n }\n}\n","import type { ApiResponse } from '@pagelines/core'\nimport type { SDKContext } from './types'\nimport { resolveApiBase } from '../api'\n\nexport class ChatClient {\n constructor(private ctx: SDKContext) {}\n\n async chatStream(args: {\n handle: string\n message: string\n attachments?: Array<{ type: string, url: string, name: string, mimeType: string, mediaId?: string }>\n conversationId?: string\n history?: Array<{ role: 'user' | 'assistant', content: string }>\n visitorId?: string\n context?: string\n onDelta: (text: string) => void\n onDone: (conversationId: string) => void\n onError: (error: string) => void\n onStatus?: (status: string) => void\n }): Promise<void> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const url = `${apiBase}/api/agent/public/${encodeURIComponent(args.handle)}/chat/stream`\n\n return this._streamChat({\n url,\n headers: { 'Content-Type': 'application/json' },\n body: {\n message: args.message,\n conversationId: args.conversationId,\n history: args.history,\n visitorId: args.visitorId,\n context: args.context,\n attachments: args.attachments,\n },\n conversationId: args.conversationId,\n onDelta: args.onDelta,\n onDone: args.onDone,\n onError: args.onError,\n onStatus: args.onStatus,\n })\n }\n\n async chatStreamAuthenticated(args: {\n agentId: string\n message: string\n attachments?: Array<{ type: string, url: string, name: string, mimeType: string, mediaId?: string }>\n conversationId?: string\n history?: Array<{ role: 'user' | 'assistant', content: string }>\n onDelta: (text: string) => void\n onDone: (conversationId: string) => void\n onError: (error: string) => void\n onStatus?: (status: string) => void\n }): Promise<void> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const url = `${apiBase}/api/agent/${encodeURIComponent(args.agentId)}/chat/stream`\n\n return this._streamChat({\n url,\n headers: {\n 'Content-Type': 'application/json',\n ...(this.ctx.token.value && { 'Authorization': `Bearer ${this.ctx.token.value}` }),\n },\n body: {\n message: args.message,\n conversationId: args.conversationId,\n history: args.history,\n attachments: args.attachments,\n },\n conversationId: args.conversationId,\n onDelta: args.onDelta,\n onDone: args.onDone,\n onError: args.onError,\n onStatus: args.onStatus,\n })\n }\n\n /** Shared SSE streaming logic for both public and authenticated chat */\n private async _streamChat(args: {\n url: string\n headers: Record<string, string>\n body: Record<string, unknown>\n conversationId?: string\n onDelta: (text: string) => void\n onDone: (conversationId: string) => void\n onError: (error: string) => void\n onStatus?: (status: string) => void\n }): Promise<void> {\n try {\n const response = await fetch(args.url, {\n method: 'POST',\n headers: args.headers,\n body: JSON.stringify(args.body),\n })\n\n if (!response.ok) {\n const errorBody = await response.json().catch(() => ({ error: 'Request failed' })) as { error?: string }\n args.onError(errorBody.error || `HTTP ${response.status}`)\n return\n }\n\n const reader = response.body?.getReader()\n if (!reader) {\n args.onError('No response stream')\n return\n }\n\n const decoder = new TextDecoder()\n let buffer = ''\n let resolvedConversationId = args.conversationId || ''\n\n while (true) {\n const { done, value } = await reader.read()\n if (done)\n break\n\n buffer += decoder.decode(value, { stream: true })\n const lines = buffer.split('\\n')\n buffer = lines.pop() || ''\n\n for (const line of lines) {\n if (!line.startsWith('data: '))\n continue\n\n const data = line.slice(6).trim()\n if (data === '[DONE]') {\n args.onDone(resolvedConversationId)\n return\n }\n\n try {\n const chunk = JSON.parse(data) as {\n choices?: Array<{ delta?: { content?: string } }>\n pl_metadata?: { conversationId?: string }\n pl_status?: string\n }\n\n // Handle status events (e.g. \"Waking up...\")\n if (chunk.pl_status) {\n args.onStatus?.(chunk.pl_status)\n continue\n }\n\n if (chunk.pl_metadata?.conversationId) {\n resolvedConversationId = chunk.pl_metadata.conversationId\n }\n\n const delta = chunk.choices?.[0]?.delta\n if (delta?.content) {\n args.onDelta(delta.content)\n }\n } catch {\n // Skip malformed chunks\n }\n }\n }\n\n // Stream ended without [DONE]\n args.onDone(resolvedConversationId)\n } catch (error) {\n args.onError(error instanceof Error ? error.message : 'Stream failed')\n }\n }\n\n async chatMessage(args: {\n handle: string\n message: string\n conversationId?: string\n visitorId?: string\n context?: string\n }): Promise<{ conversationId: string, content: string } | undefined> {\n const apiBase = resolveApiBase(this.ctx.apiBase, this.ctx.isDev)\n const url = `${apiBase}/api/agent/public/${encodeURIComponent(args.handle)}/chat`\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n message: args.message,\n conversationId: args.conversationId,\n visitorId: args.visitorId,\n context: args.context,\n }),\n })\n\n const data = await response.json() as ApiResponse<{\n conversationId: string\n message: { role: 'assistant', content: string }\n }>\n\n if (!data.ok || !data.data) {\n this.ctx.logger.error('chatMessage failed', { error: !data.ok && 'error' in data ? data.error : 'Unknown' })\n return undefined\n }\n\n return {\n conversationId: data.data.conversationId,\n content: data.data.message.content,\n }\n } catch (err) {\n this.ctx.logger.error('chatMessage error', { error: err })\n return undefined\n }\n }\n}\n","import type { AgentConfig } from '@pagelines/core'\nimport { objectId } from '@pagelines/core'\nimport type { SDKContext } from './types'\n\nexport class UserClient {\n constructor(private ctx: SDKContext) {}\n\n async getPublicAgent(args: { handle: string }): Promise<AgentConfig | undefined> {\n this.ctx.loading.value = true\n this.ctx.error.value = null\n\n try {\n const response = await this.ctx.api.agent.public[':handle'].$get({\n param: { handle: args.handle },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Failed to fetch public agent', { handle: args.handle, error: data.error })\n return undefined\n }\n\n return data.data\n } catch (err) {\n this.ctx.logger.error('Get public agent error', { handle: args.handle, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to fetch agent'\n return undefined\n } finally {\n this.ctx.loading.value = false\n }\n }\n\n async getAgentByEmail(args: { email: string }): Promise<AgentConfig | undefined> {\n this.ctx.loading.value = true\n this.ctx.error.value = null\n\n try {\n const response = await this.ctx.api.agent['by-email'][':email'].$get({\n param: { email: args.email },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.ctx.error.value = data.error\n this.ctx.logger.error('Failed to fetch agent by email', { email: args.email, error: data.error })\n return undefined\n }\n\n return data.data\n } catch (err) {\n this.ctx.logger.error('Get agent by email error', { email: args.email, error: err })\n this.ctx.error.value = err instanceof Error ? err.message : 'Failed to fetch agent'\n return undefined\n } finally {\n this.ctx.loading.value = false\n }\n }\n\n generateAnonId(): string {\n const storageKey = 'pagelinesAnonId'\n let anonId = this.ctx.storage.getItem(storageKey)\n\n if (!anonId) {\n anonId = objectId({ prefix: 'anon' })\n this.ctx.storage.setItem(storageKey, anonId)\n }\n\n return anonId\n }\n\n track(args: {\n event: 'view_profile' | 'profile_interaction'\n agentId: string\n properties?: Record<string, any>\n }): void {\n try {\n // Track event via postMessage to parent window if embedded\n if (typeof window !== 'undefined' && window.parent !== window) {\n window.parent.postMessage({\n type: 'pagelines_track',\n event: args.event,\n agentId: args.agentId,\n properties: args.properties || {},\n }, '*')\n }\n\n this.ctx.logger.info('SDK event tracked', { event: args.event, agentId: args.agentId })\n } catch (err) {\n this.ctx.logger.error('Track event error', { error: err, args })\n }\n }\n}\n","import type { hc } from 'hono/client'\n// Use stub type for production builds (aliased in vite.config.sdk.ts)\n// Dev uses real SDKAppType from server via alias\nimport type { SDKAppType } from '@/modules/main/server'\nimport type { AgentConfig, EnrichedUser } from '@pagelines/core'\nimport type { ApiResponse } from '@pagelines/core'\nimport { objectId, SettingsObject } from '@pagelines/core'\nimport { computed, ref } from 'vue'\nimport { createApiClient } from './api'\nimport { SDKStorage } from './sdkStorage'\nimport { AgentClient } from './clients/AgentClient'\nimport { AuthClient } from './clients/AuthClient'\nimport { ChatClient } from './clients/ChatClient'\nimport { UserClient } from './clients/UserClient'\nimport type { SDKContext } from './clients/types'\n\nexport interface PageLinesSDKSettings {\n apiBase?: string\n isDev?: boolean\n [key: string]: unknown\n}\n\n/**\n * Browser-only singleton manager\n * Browser: Uses globalThis for cross-bundle singleton (www + widget)\n * Node.js SSR: No singleton - each request gets new instance (prevents request bleeding)\n */\nclass SDKGlobal {\n private key = '__PAGELINES_SDK__'\n\n get(): PageLinesSDK | undefined {\n if (typeof window === 'undefined')\n return undefined\n return (globalThis as any)[this.key]\n }\n\n set(instance: PageLinesSDK): void {\n if (typeof window !== 'undefined')\n (globalThis as any)[this.key] = instance\n }\n\n delete(): void {\n if (typeof window !== 'undefined')\n delete (globalThis as any)[this.key]\n }\n}\n\n// Module-scoped singleton manager\nconst sdkGlobal = new SDKGlobal()\n\nexport class PageLinesSDK extends SettingsObject<PageLinesSDKSettings> {\n /**\n * Get singleton instance in browser (creates if doesn't exist)\n * Node.js: Always creates new instance (no singleton)\n * Recommended: Use this instead of constructor for shared state\n */\n static getInstance(settings: PageLinesSDKSettings = {}): PageLinesSDK {\n // Browser: return singleton or create\n // Node: always create new (no singleton)\n return sdkGlobal.get() || new PageLinesSDK(settings)\n }\n\n // Vue reactive state\n activeUser = ref<EnrichedUser | undefined>()\n token = ref<string | null>(null)\n loading = ref(false)\n error = ref<string | null>(null)\n apiBase = this.settings.apiBase || undefined\n\n // Storage handler for persistence\n private storage = new SDKStorage()\n\n // Auto-managed session ID for usage tracking\n private sessionId = objectId({ prefix: 'ses' })\n\n get isDev() {\n return this.settings.isDev ?? (\n typeof window !== 'undefined'\n ? window.location.hostname === 'localhost' || window.location.hostname.includes('127.0.0.1')\n : false\n )\n }\n\n // Typed Hono RPC client - uses SDKAppType (auth/self/usage routes only)\n // Initialized in constructor (definite assignment via singleton pattern)\n private apiClient!: ReturnType<typeof hc<SDKAppType>>\n\n // Bypass stub typing for route access (production builds use SDKAppType stub)\n // Runtime types are validated via Zod at API boundaries\n private get api() {\n return (this.apiClient as any).api\n }\n\n // Computed properties derived from activeUser (matches UserClient pattern)\n currentAgent = computed(() => {\n const user = this.activeUser.value\n if (!user?.agents)\n return undefined\n\n const agentId = user.primaryAgentId || user.agents[0]?.agentId\n if (!agentId)\n return undefined\n\n return user.agents.find((a) => a.agentId === agentId)\n })\n\n currentOrg = computed(() => {\n const agent = this.currentAgent.value\n if (!agent?.orgId)\n return undefined\n\n const user = this.activeUser.value\n if (!user?.orgs)\n return undefined\n\n return user.orgs.find((org) => org.orgId === agent.orgId)\n })\n\n // Initialization state\n initialized?: Promise<EnrichedUser | undefined>\n resolveUser?: (value: EnrichedUser | undefined) => void\n\n // Sub-clients (new preferred API surface)\n readonly agent!: AgentClient\n readonly auth!: AuthClient\n readonly chat!: ChatClient\n readonly user!: UserClient\n\n constructor(settings: PageLinesSDKSettings = {}) {\n // Browser: return existing singleton\n // Node: always create new\n const existing = sdkGlobal.get()\n if (existing) {\n console.debug('[PageLinesSDK] Returning existing singleton instance')\n return existing\n }\n\n super('PageLinesSDK', settings)\n\n // Browser: set singleton reference (no-op in Node)\n sdkGlobal.set(this)\n\n // Create typed Hono RPC client with response handler\n this.apiClient = createApiClient<SDKAppType>(\n { isDev: this.isDev, apiBase: this.apiBase },\n this.processApiResponse.bind(this),\n )\n\n // Build shared context for sub-clients\n const ctx: SDKContext = {\n api: this.api,\n apiBase: this.apiBase,\n isDev: this.isDev,\n activeUser: this.activeUser,\n token: this.token,\n loading: this.loading,\n error: this.error,\n currentAgent: this.currentAgent,\n storage: this.storage,\n sessionId: this.sessionId,\n logger: this.logger,\n processApiResponse: this.processApiResponse.bind(this),\n }\n\n // Initialize sub-clients\n this.agent = new AgentClient(ctx)\n this.auth = new AuthClient(ctx)\n this.chat = new ChatClient(ctx)\n this.user = new UserClient(ctx)\n\n this.logger.info('PageLinesSDK initialized')\n\n // Initialize from storage using handler\n this.storage.loadFromStorage(this.activeUser, this.token)\n\n // Sync with global stores for persistence across navigation\n this.storage.syncWithGlobalStores(this.activeUser, this.token)\n\n // Set up initialization promise (same pattern as UserClient)\n this.initialized = new Promise((resolve) => {\n this.resolveUser = resolve\n })\n\n // Auto-fetch user if token exists (mirrors UserClient pattern)\n if (this.token.value && !this.activeUser.value) {\n this.getCurrentUser().then((user) => {\n if (this.resolveUser) {\n this.resolveUser(user)\n this.resolveUser = undefined\n }\n }).catch((err) => {\n this.logger.error('Auto user fetch failed', { data: err })\n if (this.resolveUser) {\n this.resolveUser(undefined)\n this.resolveUser = undefined\n }\n })\n } else if (this.activeUser.value) {\n // Resolve immediately if we already have a user from storage\n this.resolveUser?.(this.activeUser.value)\n } else {\n // No token, resolve with undefined\n this.resolveUser?.(undefined)\n }\n }\n\n // Process ApiResponse for automatic user/token updates - public for dependency injection\n processApiResponse(response: ApiResponse<any>): void {\n // Handle user updates\n if (response.ok && response.user) {\n this.activeUser.value = response.user\n this.logger.info('User updated from API response', { data: response.user })\n }\n\n // Handle token updates\n if (response.ok && response.token) {\n this.token.value = response.token\n this.storage.saveToStorage(this.activeUser, this.token)\n this.logger.info('Token updated from API response')\n }\n\n // Resolve initialization promise\n if (this.resolveUser && response.ok) {\n this.resolveUser(response.user)\n this.resolveUser = undefined\n }\n }\n\n // Clear all user data and tokens\n clearSession(): void {\n this.logger.info('Clearing session')\n this.activeUser.value = undefined\n this.token.value = null\n this.error.value = null\n this.storage.clearStorage()\n }\n\n // Full reset - clears session + state + destroys singleton\n clear(): void {\n this.logger.info('Clearing SDK completely')\n\n // 1. Clear session data\n this.clearSession()\n\n // 2. Reset other state\n this.loading.value = false\n this.sessionId = objectId({ prefix: 'ses' })\n\n // 3. Destroy singleton (no-op in Node)\n sdkGlobal.delete()\n }\n\n // Backward-compatible delegates — these forward to sub-clients\n // Can be removed in a future breaking change\n async sendCode(email: string): Promise<void> { return this.auth.sendCode(email) }\n async verifyCode(email: string, code: string): Promise<void> { return this.auth.verifyCode(email, code) }\n async logout(): Promise<void> { return this.auth.logout() }\n async getCurrentUser(): Promise<EnrichedUser | undefined> { return this.auth.getCurrentUser() }\n async requestAuthCode(args: { email: string }): Promise<boolean> { return this.auth.requestAuthCode(args) }\n async loginWithCode(args: { email: string, code: string, orgId?: string, autoCreateContact?: boolean }): Promise<boolean> { return this.auth.loginWithCode(args) }\n loginWithGoogle(args?: { onSuccess?: (user: EnrichedUser) => void, onError?: (error: string) => void }): void { return this.auth.loginWithGoogle(args) }\n\n async chatStream(args: Parameters<ChatClient['chatStream']>[0]): Promise<void> { return this.chat.chatStream(args) }\n async chatStreamAuthenticated(args: Parameters<ChatClient['chatStreamAuthenticated']>[0]): Promise<void> { return this.chat.chatStreamAuthenticated(args) }\n async chatMessage(args: Parameters<ChatClient['chatMessage']>[0]): Promise<{ conversationId: string, content: string } | undefined> { return this.chat.chatMessage(args) }\n\n async getPublicAgent(args: { handle: string }): Promise<AgentConfig | undefined> { return this.user.getPublicAgent(args) }\n async getAgentByEmail(args: { email: string }): Promise<AgentConfig | undefined> { return this.user.getAgentByEmail(args) }\n generateAnonId(): string { return this.user.generateAnonId() }\n track(args: Parameters<UserClient['track']>[0]): void { return this.user.track(args) }\n}\n"],"names":["resolveApiBase","apiBase","isDev","APP_PORT","APP_PROD_URL","__name","createApiClient","settings","responseHandler","baseUrl","hc","input","init","token","cookieUtil","response","originalJson","result","clean","listenerQueue","lqIndex","QUEUE_ITEMS_PER_LISTENER","atom","initialValue","listeners","$atom","listener","i","index","oldValue","changedKey","runListenerQueue","newValue","unbind","_g","$globalActiveUser","$globalToken","_SDKStorage","__publicField","createLogger","activeUser","storedUser","storedToken","watch","newUser","newToken","savedToken","savedUser","error","key","value","SDKStorage","STATUS_MESSAGES","_AgentClient","ctx","args","orgId","data","msg","agentId","onStatus","timeoutMs","pollIntervalMs","start","messageIndex","status","r","url","body","res","text","AgentClient","withLoadingState","fn","_AuthClient","email","err","errorMessage","code","origin","popupUrl","width","height","left","top","popup","handler","event","expectedOrigin","user","errorMsg","checkClosed","AuthClient","_ChatClient","errorBody","reader","decoder","buffer","resolvedConversationId","done","lines","line","chunk","delta","ChatClient","_UserClient","storageKey","anonId","objectId","UserClient","_SDKGlobal","instance","SDKGlobal","sdkGlobal","_PageLinesSDK","SettingsObject","existing","ref","computed","a","agent","org","resolve","PageLinesSDK"],"mappings":"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","x_google_ignoreList":[1,2]}
|