@fiction/sdk 1.0.102 → 1.0.103

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/sdk.js CHANGED
@@ -1,4 +1,4 @@
1
- import { F as e } from "./sdkClient-DrwTKpFz.js";
1
+ import { F as e } from "./sdkClient-CACIEN8g.js";
2
2
  import { MediaSchema as a } from "@fiction/types";
3
3
  import { S as t } from "./socialPlatforms-Ck-b3SnQ.js";
4
4
  export {
@@ -1,11 +1,11 @@
1
- var K = Object.defineProperty;
2
- var X = (u, r, e) => r in u ? K(u, r, { enumerable: !0, configurable: !0, writable: !0, value: e }) : u[r] = e;
3
- var l = (u, r) => K(u, "name", { value: r, configurable: !0 });
1
+ var G = Object.defineProperty;
2
+ var X = (u, r, e) => r in u ? G(u, r, { enumerable: !0, configurable: !0, writable: !0, value: e }) : u[r] = e;
3
+ var l = (u, r) => G(u, "name", { value: r, configurable: !0 });
4
4
  var n = (u, r, e) => X(u, typeof r != "symbol" ? r + "" : r, e);
5
5
  import { objectId as L } from "@fiction/utils";
6
- import { watch as R, ref as k, computed as q } from "vue";
6
+ import { watch as K, ref as I, computed as q } from "vue";
7
7
  import { hc as Z } from "hono/client";
8
- const w = globalThis.process, v = typeof window < "u", E = typeof w < "u" && !v, p = v ? typeof window < "u" && window.location && !window.location.hostname.includes("localhost") : E && typeof w < "u" && w.env?.NODE_ENV === "production", ee = !p, S = {
8
+ const w = globalThis.process, v = typeof window < "u", U = typeof w < "u" && !v, m = v ? typeof window < "u" && window.location && !window.location.hostname.includes("localhost") : U && typeof w < "u" && w.env?.NODE_ENV === "production", ee = !m, S = {
9
9
  error: { priority: 50, color: "#FF0000", nodeColor: "\x1B[31m" },
10
10
  warn: { priority: 40, color: "#FFA500", nodeColor: "\x1B[33m" },
11
11
  info: { priority: 30, color: "#00ABFF", nodeColor: "\x1B[36m" },
@@ -23,20 +23,20 @@ const w = globalThis.process, v = typeof window < "u", E = typeof w < "u" && !v,
23
23
  }, v && this.initBrowserLogging();
24
24
  }
25
25
  getDefaultLevel() {
26
- if (E && typeof w < "u" && w.env?.LOG_LEVEL)
26
+ if (U && typeof w < "u" && w.env?.LOG_LEVEL)
27
27
  return w.env.LOG_LEVEL;
28
28
  if (v && typeof localStorage < "u") {
29
29
  const r = localStorage.getItem("FICTION_LOG_LEVEL");
30
30
  if (r)
31
31
  return r;
32
32
  }
33
- return p ? "info" : "debug";
33
+ return m ? "info" : "debug";
34
34
  }
35
35
  initBrowserLogging() {
36
36
  if (!v)
37
37
  return;
38
38
  const e = localStorage.getItem("FICTION_LOG") === "true", t = window.location?.hostname || "";
39
- this.enabledInBrowser = ee || e || t === "localhost" || t.includes("127.0.0.1"), p && !e && !y.hasShownHelp && (console.log(
39
+ this.enabledInBrowser = ee || e || t === "localhost" || t.includes("127.0.0.1"), m && !e && !y.hasShownHelp && (console.log(
40
40
  "%cFiction WWW Logger (disabled in production)",
41
41
  "color: #888; font-size: 12px"
42
42
  ), console.log(
@@ -82,7 +82,7 @@ const w = globalThis.process, v = typeof window < "u", E = typeof w < "u" && !v,
82
82
  return {
83
83
  name: r.name,
84
84
  message: r.message,
85
- stack: p ? r.stack?.split(`
85
+ stack: m ? r.stack?.split(`
86
86
  `).slice(0, 3).join(`
87
87
  `) : r.stack,
88
88
  ...r
@@ -93,9 +93,9 @@ const w = globalThis.process, v = typeof window < "u", E = typeof w < "u" && !v,
93
93
  if (typeof r != "object")
94
94
  return r;
95
95
  if (Array.isArray(r))
96
- return r.length > 20 && p ? `Array(${r.length}) [${r.slice(0, 3).map((o) => this.formatData(o, e, t + 1)).join(", ")}, ...]` : r.map((o) => this.formatData(o, e, t + 1));
96
+ return r.length > 20 && m ? `Array(${r.length}) [${r.slice(0, 3).map((o) => this.formatData(o, e, t + 1)).join(", ")}, ...]` : r.map((o) => this.formatData(o, e, t + 1));
97
97
  try {
98
- const o = {}, i = Object.entries(r), s = p ? 50 : 200;
98
+ const o = {}, i = Object.entries(r), s = m ? 50 : 200;
99
99
  for (const [c, d] of i.slice(0, s))
100
100
  o[c] = this.formatData(d, e, t + 1);
101
101
  return i.length > s && (o["..."] = `${i.length - s} more properties`), this.redactSensitive(o);
@@ -110,10 +110,10 @@ const w = globalThis.process, v = typeof window < "u", E = typeof w < "u" && !v,
110
110
  i !== void 0 ? console[e](`%c${a}`, h, t, this.formatData(i)) : console[e](`%c${a}`, h, t), s && (s instanceof Error ? console.error(s) : console.error("Error details:", s));
111
111
  }
112
112
  async logToNode(r) {
113
- if (!E || !this.shouldLog(r.level))
113
+ if (!U || !this.shouldLog(r.level))
114
114
  return;
115
115
  const { level: e, description: t, context: o, data: i, error: s } = r, c = o || this.context || "www";
116
- if (p) {
116
+ if (m) {
117
117
  const d = {
118
118
  timestamp: this.formatISOTimestamp(),
119
119
  level: e.toUpperCase()
@@ -123,7 +123,7 @@ const w = globalThis.process, v = typeof window < "u", E = typeof w < "u" && !v,
123
123
  try {
124
124
  const a = (await import("./index-C-0XxdQQ.js").catch(() => null))?.default, h = S[e], P = this.formatTimestamp();
125
125
  if (a) {
126
- const J = a.dim, G = a.hex(h.color), W = J(`${P} `), Q = G(`${e.toUpperCase()} `), H = G(`(${c}): `), Y = `${W}${Q}${H}${t}`;
126
+ const J = a.dim, R = a.hex(h.color), W = J(`${P} `), Q = R(`${e.toUpperCase()} `), H = R(`(${c}): `), Y = `${W}${Q}${H}${t}`;
127
127
  console[e](Y), i !== void 0 && console.log(JSON.stringify(this.formatData(i), null, 2)), s && (s instanceof Error && a ? (console.error(a.red("Error:"), s.message), s.stack && console.error(a.gray(s.stack))) : console.error("Error:", s));
128
128
  } else
129
129
  console[e](`${P} ${e.toUpperCase()} (${c}): ${t}`), i !== void 0 && console.log(JSON.stringify(this.formatData(i), null, 2)), s && console.error("Error:", s);
@@ -132,7 +132,7 @@ const w = globalThis.process, v = typeof window < "u", E = typeof w < "u" && !v,
132
132
  }
133
133
  }
134
134
  log(r) {
135
- v ? this.logToBrowser(r) : E && this.logToNode(r).catch(console.error);
135
+ v ? this.logToBrowser(r) : U && this.logToNode(r).catch(console.error);
136
136
  }
137
137
  error(r, e) {
138
138
  this.log({ level: "error", description: r, data: e, context: this.context });
@@ -169,12 +169,12 @@ const w = globalThis.process, v = typeof window < "u", E = typeof w < "u" && !v,
169
169
  }
170
170
  };
171
171
  l(y, "Logger"), n(y, "hasShownHelp", !1);
172
- let U = y;
172
+ let E = y;
173
173
  function V(u) {
174
- return new U({}, u).createContextLogger(u);
174
+ return new E({}, u).createContextLogger(u);
175
175
  }
176
176
  l(V, "createLogger");
177
- const g = new U();
177
+ const g = new E();
178
178
  g.error.bind(g);
179
179
  g.warn.bind(g);
180
180
  g.info.bind(g);
@@ -277,12 +277,12 @@ const B = class B {
277
277
  };
278
278
  l(B, "CookieUtil");
279
279
  let F = B;
280
- const I = new F();
280
+ const k = new F();
281
281
  function re(u, r) {
282
282
  const e = u.apiBase || (u.isDev ? "http://localhost:5555" : "https://app.fiction.com");
283
283
  return Z(e, {
284
284
  fetch: /* @__PURE__ */ l(async (o, i) => {
285
- const s = I.getAuthToken(), c = await fetch(o, {
285
+ const s = k.getAuthToken(), c = await fetch(o, {
286
286
  ...i,
287
287
  headers: {
288
288
  ...i?.headers,
@@ -307,7 +307,7 @@ function re(u, r) {
307
307
  });
308
308
  }
309
309
  l(re, "createApiClient");
310
- let oe = Symbol("clean"), f = [], m = 0;
310
+ let oe = Symbol("clean"), f = [], p = 0;
311
311
  const b = 4;
312
312
  let _ = /* @__PURE__ */ l((u) => {
313
313
  let r = [], e = {
@@ -318,7 +318,7 @@ let _ = /* @__PURE__ */ l((u) => {
318
318
  lc: 0,
319
319
  listen(t) {
320
320
  return e.lc = r.push(t), () => {
321
- for (let i = m + b; i < f.length; )
321
+ for (let i = p + b; i < f.length; )
322
322
  f[i] === t ? f.splice(i, b) : i += b;
323
323
  let o = r.indexOf(t);
324
324
  ~o && (r.splice(o, 1), --e.lc || e.off());
@@ -329,11 +329,11 @@ let _ = /* @__PURE__ */ l((u) => {
329
329
  for (let s of r)
330
330
  f.push(s, e.value, t, o);
331
331
  if (i) {
332
- for (m = 0; m < f.length; m += b)
333
- f[m](
334
- f[m + 1],
335
- f[m + 2],
336
- f[m + 3]
332
+ for (p = 0; p < f.length; p += b)
333
+ f[p](
334
+ f[p + 1],
335
+ f[p + 2],
336
+ f[p + 3]
337
337
  );
338
338
  f.length = 0;
339
339
  }
@@ -365,9 +365,9 @@ const C = _(void 0), $ = _(null), O = class O {
365
365
  */
366
366
  syncWithGlobalStores(r, e) {
367
367
  const t = C.get(), o = $.get();
368
- t && (r.value = t), o && (e.value = o), R(r, (i) => {
368
+ t && (r.value = t), o && (e.value = o), K(r, (i) => {
369
369
  C.set(i);
370
- }, { immediate: !0 }), R(e, (i) => {
370
+ }, { immediate: !0 }), K(e, (i) => {
371
371
  $.set(i);
372
372
  }, { immediate: !0 }), C.subscribe((i) => {
373
373
  i !== r.value && (r.value = i);
@@ -381,7 +381,7 @@ const C = _(void 0), $ = _(null), O = class O {
381
381
  loadFromStorage(r, e) {
382
382
  if (typeof window > "u")
383
383
  return;
384
- const t = I.getAuthToken();
384
+ const t = k.getAuthToken();
385
385
  t && (e.value = t);
386
386
  try {
387
387
  const o = localStorage.getItem("fiction-user");
@@ -395,7 +395,7 @@ const C = _(void 0), $ = _(null), O = class O {
395
395
  */
396
396
  saveToStorage(r, e) {
397
397
  if (!(typeof window > "u")) {
398
- e.value ? I.setAuthToken(e.value) : I.removeAuthToken();
398
+ e.value ? k.setAuthToken(e.value) : k.removeAuthToken();
399
399
  try {
400
400
  r.value ? localStorage.setItem("fiction-user", JSON.stringify(r.value)) : localStorage.removeItem("fiction-user");
401
401
  } catch (t) {
@@ -408,7 +408,7 @@ const C = _(void 0), $ = _(null), O = class O {
408
408
  */
409
409
  clearStorage() {
410
410
  if (!(typeof window > "u")) {
411
- I.removeAuthToken();
411
+ k.removeAuthToken();
412
412
  try {
413
413
  localStorage.removeItem("fiction-user");
414
414
  } catch (r) {
@@ -467,10 +467,10 @@ const x = new D(), T = class T extends A {
467
467
  return console.debug("[FictionSDK] Returning existing singleton instance"), t;
468
468
  super("FictionSDK", e);
469
469
  // Vue reactive state
470
- n(this, "activeUser", k());
471
- n(this, "token", k(null));
472
- n(this, "loading", k(!1));
473
- n(this, "error", k(null));
470
+ n(this, "activeUser", I());
471
+ n(this, "token", I(null));
472
+ n(this, "loading", I(!1));
473
+ n(this, "error", I(null));
474
474
  n(this, "apiBase", this.settings.apiBase || void 0);
475
475
  // Storage handler for persistence
476
476
  n(this, "storage", new j());
@@ -670,7 +670,11 @@ const x = new D(), T = class T extends A {
670
670
  const o = await (await this.api.auth["verify-code"].$post({
671
671
  json: { email: e.email, code: e.code }
672
672
  })).json();
673
- return o.ok ? (this.logger.info("Login successful", { email: e.email }), e.orgId && e.autoCreateContact !== !1 && this.activeUser.value?.userId && await this.autoCreateContact({
673
+ return this.logger.info("Login with code response", {
674
+ hasUser: !!o.user,
675
+ hasToken: !!o.token,
676
+ ok: o.ok
677
+ }), o.ok ? (this.processApiResponse(o), this.logger.info("Login successful", { email: e.email }), e.orgId && e.autoCreateContact !== !1 && this.activeUser.value?.userId && await this.autoCreateContact({
674
678
  userId: this.activeUser.value.userId,
675
679
  orgId: e.orgId
676
680
  }), !0) : (this.error.value = o.error, this.logger.error("Login failed", { email: e.email, error: o.error }), !1);
@@ -799,4 +803,4 @@ export {
799
803
  A as S,
800
804
  V as c
801
805
  };
802
- //# sourceMappingURL=sdkClient-DrwTKpFz.js.map
806
+ //# sourceMappingURL=sdkClient-CACIEN8g.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdkClient-DrwTKpFz.js","sources":["../../../src/utils/logger.ts","../../../src/utils/base.ts","../../../src/utils/cookies.ts","../api.ts","../../../node_modules/.pnpm/nanostores@1.0.1/node_modules/nanostores/clean-stores/index.js","../../../node_modules/.pnpm/nanostores@1.0.1/node_modules/nanostores/atom/index.js","../sdkStorage.ts","../sdkClient.ts"],"sourcesContent":["/* eslint-disable no-console */\n\n// Use globalThis.process instead of node:process import for browser compatibility\n// Safe because we always check `typeof process !== 'undefined'` before accessing properties\n\n// eslint-disable-next-line node/prefer-global/process\nconst process = (globalThis as any).process\n\ntype LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\ntype LogData = Record<string, unknown> | unknown\n\nexport interface LogHelper {\n error: (description: string, data?: LogData) => void\n warn: (description: string, data?: LogData) => void\n info: (description: string, data?: LogData) => void\n debug: (description: string, data?: LogData) => void\n trace: (description: string, data?: LogData) => void\n isEnabled?: () => boolean\n setLevel?: (level: LogLevel) => void\n}\n\ninterface LoggerConfig {\n level: LogLevel\n context?: string\n description?: string\n data?: LogData\n error?: Error | unknown\n timestamp?: boolean\n}\n\ninterface LogSettings {\n enabled?: boolean\n minLevel?: LogLevel\n timestamps?: boolean\n}\n\n// Universal environment detection\nconst isBrowser = typeof window !== 'undefined'\nconst isNode = typeof process !== 'undefined' && !isBrowser\nconst isProd = isBrowser\n ? (typeof window !== 'undefined' && window.location && !window.location.hostname.includes('localhost'))\n : (isNode && typeof process !== 'undefined' && process.env?.NODE_ENV === 'production')\nconst isDev = !isProd\n\n// Log level configuration\nconst logLevels: Record<LogLevel, { priority: number, color: string, nodeColor?: string }> = {\n error: { priority: 50, color: '#FF0000', nodeColor: '\\x1B[31m' },\n warn: { priority: 40, color: '#FFA500', nodeColor: '\\x1B[33m' },\n info: { priority: 30, color: '#00ABFF', nodeColor: '\\x1B[36m' },\n debug: { priority: 20, color: '#00BD0C', nodeColor: '\\x1B[32m' },\n trace: { priority: 10, color: '#5233FF', nodeColor: '\\x1B[35m' },\n}\n\n// Sensitive keys to redact\nconst SENSITIVE_KEYS = ['password', 'token', 'secret', 'apikey', 'api_key', 'authorization', 'cookie']\n\nexport class Logger {\n private settings: Required<LogSettings>\n private enabledInBrowser: boolean = false\n private context?: string\n private static hasShownHelp = false\n\n constructor(settings: LogSettings = {}, context?: string) {\n this.context = context\n this.settings = {\n enabled: settings.enabled ?? true,\n minLevel: settings.minLevel ?? this.getDefaultLevel(),\n timestamps: settings.timestamps ?? true,\n }\n\n if (isBrowser) {\n this.initBrowserLogging()\n }\n }\n\n private getDefaultLevel(): LogLevel {\n // Check environment variable first\n if (isNode && typeof process !== 'undefined' && process.env?.LOG_LEVEL) {\n return process.env.LOG_LEVEL as LogLevel\n }\n\n // Check localStorage in browser\n if (isBrowser && typeof localStorage !== 'undefined') {\n const level = localStorage.getItem('FICTION_LOG_LEVEL')\n if (level)\n return level as LogLevel\n }\n\n // Default: info in production, debug in development\n return isProd ? 'info' : 'debug'\n }\n\n private initBrowserLogging(): void {\n if (!isBrowser)\n return\n\n const logKey = 'FICTION_LOG'\n const enabled = localStorage.getItem(logKey) === 'true'\n const hostname = window.location?.hostname || ''\n\n // Enable in dev, or if explicitly enabled via localStorage\n this.enabledInBrowser = isDev || enabled || hostname === 'localhost' || hostname.includes('127.0.0.1')\n\n // Show help message once in production\n if (isProd && !enabled && !Logger.hasShownHelp) {\n console.log(\n '%cFiction WWW Logger (disabled in production)',\n 'color: #888; font-size: 12px',\n )\n console.log(\n '%cTo enable: localStorage.setItem(\"FICTION_LOG\", \"true\")',\n 'color: #888; font-size: 11px',\n )\n Logger.hasShownHelp = true\n }\n }\n\n private shouldLog(level: LogLevel): boolean {\n if (!this.settings.enabled)\n return false\n\n // In browser, check if enabled\n if (isBrowser && !this.enabledInBrowser)\n return false\n\n const currentPriority = logLevels[level].priority\n const minPriority = logLevels[this.settings.minLevel].priority\n\n return currentPriority >= minPriority\n }\n\n private formatTimestamp(): string {\n return new Date().toLocaleTimeString('en-GB', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n }\n\n private formatISOTimestamp(): string {\n return new Date().toISOString()\n }\n\n private redactSensitive(obj: any): any {\n if (typeof obj !== 'object' || obj === null)\n return obj\n\n if (Array.isArray(obj)) {\n return obj.map((item) => this.redactSensitive(item))\n }\n\n const result: any = {}\n for (const [key, value] of Object.entries(obj)) {\n const lowerKey = key.toLowerCase()\n if (SENSITIVE_KEYS.some((sensitive) => lowerKey.includes(sensitive))) {\n result[key] = '[REDACTED]'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = this.redactSensitive(value)\n } else {\n result[key] = value\n }\n }\n return result\n }\n\n private formatData(data: unknown, maxDepth: number = 3, currentDepth: number = 0): unknown {\n if (currentDepth >= maxDepth) {\n return '[Max Depth]'\n }\n\n if (data === null || data === undefined) {\n return data\n }\n\n // Handle Error objects specially\n if (data instanceof Error) {\n return {\n name: data.name,\n message: data.message,\n stack: isProd ? data.stack?.split('\\n').slice(0, 3).join('\\n') : data.stack,\n ...(data as any), // Include any additional error properties\n }\n }\n\n if (data instanceof Date) {\n return data.toISOString()\n }\n\n if (typeof data !== 'object') {\n return data\n }\n\n if (Array.isArray(data)) {\n if (data.length > 20 && isProd) {\n return `Array(${data.length}) [${data.slice(0, 3).map((item) =>\n this.formatData(item, maxDepth, currentDepth + 1)).join(', ')}, ...]`\n }\n return data.map((item) => this.formatData(item, maxDepth, currentDepth + 1))\n }\n\n // Handle regular objects\n try {\n const formatted: Record<string, unknown> = {}\n const entries = Object.entries(data)\n const maxProperties = isProd ? 50 : 200\n\n for (const [key, value] of entries.slice(0, maxProperties)) {\n formatted[key] = this.formatData(value, maxDepth, currentDepth + 1)\n }\n\n if (entries.length > maxProperties) {\n formatted['...'] = `${entries.length - maxProperties} more properties`\n }\n\n return this.redactSensitive(formatted)\n } catch {\n return '[Unserializable]'\n }\n }\n\n private logToBrowser(config: LoggerConfig): void {\n if (!isBrowser || !this.shouldLog(config.level))\n return\n\n const { level, description, context, data, error } = config\n const levelConfig = logLevels[level]\n const ctx = context || this.context || 'www'\n\n // Format for browser console\n const prefix = `[${ctx}] ${level.toUpperCase()}:`\n const style = `color: ${levelConfig.color}; font-weight: bold;`\n\n // Log main message\n if (data !== undefined) {\n console[level](`%c${prefix}`, style, description, this.formatData(data))\n } else {\n console[level](`%c${prefix}`, style, description)\n }\n\n // Log error details if present\n if (error) {\n if (error instanceof Error) {\n console.error(error)\n } else {\n console.error('Error details:', error)\n }\n }\n }\n\n private async logToNode(config: LoggerConfig): Promise<void> {\n if (!isNode || !this.shouldLog(config.level))\n return\n\n const { level, description, context, data, error } = config\n const ctx = context || this.context || 'www'\n\n if (isProd) {\n // Production: Single-line JSON format for log aggregation\n const logEntry: any = {\n timestamp: this.formatISOTimestamp(),\n level: level.toUpperCase(),\n context: ctx,\n message: description,\n }\n if (data) {\n logEntry.data = this.formatData(data)\n }\n if (error) {\n logEntry.error = this.formatData(error)\n }\n\n console[level](`${logEntry.timestamp} ${logEntry.level} [${ctx}] ${description}`, data || error ? JSON.stringify({ data, error }) : '')\n } else {\n // Development: Pretty-printed format\n try {\n // Dynamic import for Node-only dependencies\n const chalkModule = await import('chalk').catch(() => null)\n const chalk = chalkModule?.default\n\n const levelConfig = logLevels[level]\n const timestamp = this.formatTimestamp()\n\n if (chalk) {\n const dim = chalk.dim\n const colored = chalk.hex(levelConfig.color)\n\n const logTimestamp = dim(`${timestamp} `)\n const logLevel = colored(`${level.toUpperCase()} `)\n const logContext = colored(`(${ctx}): `)\n const logMessage = `${logTimestamp}${logLevel}${logContext}${description}`\n\n console[level](logMessage)\n\n // Log data if present\n if (data !== undefined) {\n console.log(JSON.stringify(this.formatData(data), null, 2))\n }\n\n // Log error if present\n if (error) {\n if (error instanceof Error && chalk) {\n console.error(chalk.red('Error:'), error.message)\n if (error.stack) {\n console.error(chalk.gray(error.stack))\n }\n } else {\n console.error('Error:', error)\n }\n }\n } else {\n // Fallback without chalk\n console[level](`${timestamp} ${level.toUpperCase()} (${ctx}): ${description}`)\n if (data !== undefined) {\n console.log(JSON.stringify(this.formatData(data), null, 2))\n }\n if (error) {\n console.error('Error:', error)\n }\n }\n } catch {\n // Fallback if dynamic imports fail\n console[level](`${this.formatTimestamp()} ${level.toUpperCase()} (${ctx}): ${description}`)\n if (data !== undefined) {\n console.log(JSON.stringify(this.formatData(data), null, 2))\n }\n if (error) {\n console.error('Error:', error)\n }\n }\n }\n }\n\n private log(config: LoggerConfig): void {\n if (isBrowser) {\n this.logToBrowser(config)\n } else if (isNode) {\n // Use promise but don't await (fire and forget)\n this.logToNode(config).catch(console.error)\n }\n }\n\n error(description: string, data?: LogData): void {\n this.log({ level: 'error', description, data, context: this.context })\n }\n\n warn(description: string, data?: LogData): void {\n this.log({ level: 'warn', description, data, context: this.context })\n }\n\n info(description: string, data?: LogData): void {\n this.log({ level: 'info', description, data, context: this.context })\n }\n\n debug(description: string, data?: LogData): void {\n this.log({ level: 'debug', description, data, context: this.context })\n }\n\n trace(description: string, data?: LogData): void {\n this.log({ level: 'trace', description, data, context: this.context })\n }\n\n isEnabled(): boolean {\n if (isBrowser) {\n return this.enabledInBrowser\n }\n return true // Always enabled in Node\n }\n\n setLevel(level: LogLevel): void {\n this.settings.minLevel = level\n }\n\n createContextLogger(context: string): LogHelper {\n const contextualLogger = new Logger(this.settings, context)\n\n return {\n error: (description: string, data?: LogData) => contextualLogger.error(description, data),\n warn: (description: string, data?: LogData) => contextualLogger.warn(description, data),\n info: (description: string, data?: LogData) => contextualLogger.info(description, data),\n debug: (description: string, data?: LogData) => contextualLogger.debug(description, data),\n trace: (description: string, data?: LogData) => contextualLogger.trace(description, data),\n isEnabled: () => contextualLogger.isEnabled(),\n setLevel: (level: LogLevel) => contextualLogger.setLevel(level),\n }\n }\n}\n\n// Factory function - main export\nexport function createLogger(context: string): LogHelper {\n return new Logger({}, context).createContextLogger(context)\n}\n\n// Default logger instance for convenience\nexport const logger = new Logger()\n\n// Convenience exports\nexport const error = logger.error.bind(logger)\nexport const warn = logger.warn.bind(logger)\nexport const info = logger.info.bind(logger)\nexport const debug = logger.debug.bind(logger)\nexport const trace = logger.trace.bind(logger)\n","import { createLogger } from './logger'\n\nexport type SettingsObjectSettings = {\n [key: string]: unknown\n}\n\n/**\n * Base class for objects with settings and contextual logging.\n * Services use this.logger.error(message, { data }) pattern directly.\n */\nexport abstract class SettingsObject<T extends SettingsObjectSettings = SettingsObjectSettings> {\n name: string\n settings: T\n logger: ReturnType<typeof createLogger>\n\n constructor(name: string, settings: T) {\n this.name = name\n this.settings = settings\n this.logger = createLogger(name)\n }\n}\n","/**\n * Client-side cookie utilities\n * Provides simple interface for reading/writing cookies with secure defaults\n */\n\nexport interface CookieOptions {\n httpOnly?: boolean\n secure?: boolean\n sameSite?: 'strict' | 'lax' | 'none'\n maxAge?: number // in seconds\n domain?: string\n path?: string\n}\n\nexport class CookieUtil {\n // Configuration properties\n tokenName = 'auth-token'\n tokenMaxAge = 60 * 60 * 24 * 7 // 7 days\n fallbackStorageKey = 'token' // For localStorage migration\n productionDomain = '.fiction.com'\n /**\n * Get cookie value by name\n */\n getCookie(name: string): string | null {\n if (typeof document === 'undefined')\n return null\n\n const cookies = document.cookie.split(';')\n for (const cookie of cookies) {\n const [cookieName, cookieValue] = cookie.trim().split('=')\n if (cookieName === name) {\n return decodeURIComponent(cookieValue || '')\n }\n }\n return null\n }\n\n /**\n * Set cookie with secure defaults\n */\n setCookie(name: string, value: string, options: CookieOptions = {}): void {\n if (typeof document === 'undefined')\n return\n\n const {\n secure = true,\n sameSite = 'lax',\n maxAge = 60 * 60 * 24 * 7, // 7 days default\n domain,\n path = '/',\n } = options\n\n let cookieString = `${name}=${encodeURIComponent(value)}`\n cookieString += `; Path=${path}`\n cookieString += `; Max-Age=${maxAge}`\n cookieString += `; SameSite=${sameSite}`\n\n if (secure) {\n cookieString += '; Secure'\n }\n\n if (domain) {\n cookieString += `; Domain=${domain}`\n }\n\n document.cookie = cookieString\n }\n\n /**\n * Remove cookie by setting expired date\n */\n removeCookie(name: string, options: Pick<CookieOptions, 'domain' | 'path'> = {}): void {\n this.setCookie(name, '', { ...options, maxAge: 0 })\n }\n\n /**\n * Get auth token with fallback to localStorage for migration\n */\n getAuthToken(): string | null {\n // Try cookie first (new approach)\n const cookieToken = this.getCookie(this.tokenName)\n if (cookieToken)\n return cookieToken\n\n // Fallback to localStorage for migration\n if (typeof localStorage !== 'undefined') {\n const localToken = localStorage.getItem(this.fallbackStorageKey)\n if (localToken) {\n // Migrate to cookie and remove from localStorage\n this.setAuthToken(localToken)\n localStorage.removeItem(this.fallbackStorageKey)\n return localToken\n }\n }\n\n return null\n }\n\n /**\n * Set auth token in cookie with production-ready settings\n */\n setAuthToken(token: string): void {\n const isProduction = typeof window !== 'undefined' && window.location.hostname !== 'localhost'\n\n this.setCookie(this.tokenName, token, {\n secure: isProduction,\n sameSite: 'lax',\n maxAge: this.tokenMaxAge,\n domain: isProduction ? this.productionDomain : undefined,\n path: '/',\n })\n }\n\n /**\n * Remove auth token\n */\n removeAuthToken(): void {\n const isProduction = typeof window !== 'undefined' && window.location.hostname !== 'localhost'\n\n this.removeCookie(this.tokenName, {\n domain: isProduction ? this.productionDomain : undefined,\n path: '/',\n })\n\n // Also remove from localStorage if it exists (cleanup)\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(this.fallbackStorageKey)\n }\n }\n}\n\nexport const cookieUtil = new CookieUtil()\n","import type { Hono } from 'hono'\nimport { hc } from 'hono/client'\nimport { cookieUtil } from '@/utils/cookies'\n\nexport interface ApiClientSettings {\n isDev: boolean\n apiBase?: string\n [key: string]: unknown\n}\n\n/**\n * Create fully typed Hono RPC client for Fiction 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 // Auto-detect API base URL\n const baseUrl = settings.apiBase || (settings.isDev ? 'http://localhost:5555' : 'https://app.fiction.com')\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 const originalJson = response.json.bind(response)\n const interceptedResponse = response.clone()\n\n // Override json method to process ApiResponse\n Object.defineProperty(interceptedResponse, 'json', {\n value: 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 interceptedResponse\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\nexport let 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 '@fiction/types'\nimport { atom } from 'nanostores'\nimport { watch } from 'vue'\nimport { cookieUtil } from '@/utils/cookies'\nimport { createLogger } from '@/utils/logger'\n\n// Global nanostores for persistence across page navigations\n// These must be outside the class to survive view transitions\nconst $globalActiveUser = atom<EnrichedUser | undefined>(undefined)\nconst $globalToken = atom<string | null>(null)\n\n/**\n * SDKStorage - Handles all storage, sync, and persistence for FictionSDK\n *\n * Extracted from FictionSDK 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 * 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 try {\n const savedUser = localStorage.getItem('fiction-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 * 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 try {\n if (activeUser.value) {\n localStorage.setItem('fiction-user', JSON.stringify(activeUser.value))\n } else {\n localStorage.removeItem('fiction-user')\n }\n } catch (error) {\n this.logger.error('Failed to save user to localStorage', { data: error })\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 try {\n localStorage.removeItem('fiction-user')\n } catch (error) {\n this.logger.error('Failed to clear user from localStorage', { data: error })\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 (typeof window === 'undefined')\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 (typeof window === 'undefined')\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 { 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 { Self } from '@fiction/types'\nimport type { ApiResponse, EnrichedUser } from '@fiction/types'\nimport { objectId } from '@fiction/utils'\nimport { computed, ref } from 'vue'\nimport { SettingsObject } from '@/utils/base'\nimport { createApiClient } from './api'\nimport { SDKStorage } from './sdkStorage'\n\nexport interface FictionSDKSettings {\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 = '__FICTION_SDK__'\n\n get(): FictionSDK | undefined {\n if (typeof window === 'undefined')\n return undefined\n return (globalThis as any)[this.key]\n }\n\n set(instance: FictionSDK): 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 FictionSDK extends SettingsObject<FictionSDKSettings> {\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: FictionSDKSettings = {}): FictionSDK {\n // Browser: return singleton or create\n // Node: always create new (no singleton)\n return sdkGlobal.get() || new FictionSDK(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 currentSelf = computed(() => {\n const user = this.activeUser.value\n if (!user?.selves)\n return undefined\n\n const selfId = user.primarySelfId || user.selves[0]?.selfId\n if (!selfId)\n return undefined\n\n return user.selves.find((s) => s.selfId === selfId)\n })\n\n currentOrg = computed(() => {\n const self = this.currentSelf.value\n if (!self?.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 === self.orgId)\n })\n\n // Initialization state\n initialized?: Promise<EnrichedUser | undefined>\n resolveUser?: (value: EnrichedUser | undefined) => void\n\n constructor(settings: FictionSDKSettings = {}) {\n // Browser: return existing singleton\n // Node: always create new\n const existing = sdkGlobal.get()\n if (existing) {\n console.debug('[FictionSDK] Returning existing singleton instance')\n return existing\n }\n\n super('FictionSDK', 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 this.logger.info('FictionSDK 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 // Convenience methods for common auth operations\n async sendCode(email: string): Promise<void> {\n this.loading.value = true\n this.error.value = null\n\n try {\n const response = await this.api.auth['check-email'].$post({\n json: { email },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.logger.error('Send code error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Failed to send verification code'\n this.error.value = errorMessage\n throw err\n } finally {\n this.loading.value = false\n }\n }\n\n async verifyCode(email: string, code: string): Promise<void> {\n this.loading.value = true\n this.error.value = null\n\n try {\n const response = await this.api.auth['verify-code'].$post({\n json: { email, code },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.logger.error('Verify code error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Failed to verify code'\n this.error.value = errorMessage\n throw err\n } finally {\n this.loading.value = false\n }\n }\n\n async login(email: string, password: string): Promise<void> {\n this.loading.value = true\n this.error.value = null\n\n try {\n const response = await this.api.auth.login.$post({\n json: { email, password },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.logger.error('Login error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Login failed'\n this.error.value = errorMessage\n throw err\n } finally {\n this.loading.value = false\n }\n }\n\n async logout(): Promise<void> {\n this.loading.value = true\n this.error.value = null\n\n try {\n await this.api.auth.logout.$post()\n\n // Clear local state\n this.activeUser.value = undefined\n this.token.value = null\n this.storage.clearStorage()\n } catch (err) {\n this.logger.error('Logout error (user still logged out locally)', { data: err })\n // Still clear local state even if API call fails\n this.activeUser.value = undefined\n this.token.value = null\n this.storage.clearStorage()\n } finally {\n this.loading.value = false\n }\n }\n\n async getCurrentUser(): Promise<EnrichedUser | undefined> {\n if (!this.token.value) {\n return undefined\n }\n\n this.loading.value = true\n\n try {\n const response = await this.api.auth.me.$get()\n const data = await response.json()\n\n if (!data.ok) {\n this.error.value = data.error\n // Clear invalid session\n if (data.error.includes('Authentication')) {\n this.activeUser.value = undefined\n this.token.value = null\n this.storage.clearStorage()\n }\n return undefined\n }\n\n return data.user\n } catch (err) {\n this.logger.error('Get current user error', { data: err })\n this.error.value = err instanceof Error ? err.message : 'Failed to get user info'\n return undefined\n } finally {\n this.loading.value = false\n }\n }\n\n async getPublicSelf(args: { handle: string }): Promise<Self | undefined> {\n this.loading.value = true\n this.error.value = null\n\n try {\n const response = await this.api.self.public[':handle'].$get({\n param: { handle: args.handle },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.error.value = data.error\n this.logger.error('Failed to fetch public self', { handle: args.handle, error: data.error })\n return undefined\n }\n\n return data.data\n } catch (err) {\n this.logger.error('Get public self error', { handle: args.handle, error: err })\n this.error.value = err instanceof Error ? err.message : 'Failed to fetch self'\n return undefined\n } finally {\n this.loading.value = false\n }\n }\n\n async getSelfByEmail(args: { email: string }): Promise<Self | undefined> {\n this.loading.value = true\n this.error.value = null\n\n try {\n const response = await this.api.self['by-email'][':email'].$get({\n param: { email: args.email },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.error.value = data.error\n this.logger.error('Failed to fetch self by email', { email: args.email, error: data.error })\n return undefined\n }\n\n return data.data\n } catch (err) {\n this.logger.error('Get self by email error', { email: args.email, error: err })\n this.error.value = err instanceof Error ? err.message : 'Failed to fetch self'\n return undefined\n } finally {\n this.loading.value = false\n }\n }\n\n async requestAuthCode(args: { email: string }): Promise<boolean> {\n this.loading.value = true\n this.error.value = null\n\n try {\n const response = await this.api.auth['check-email'].$post({\n json: { email: args.email },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.error.value = data.error\n this.logger.error('Failed to request auth code', { email: args.email, error: data.error })\n return false\n }\n\n this.logger.info('Auth code requested successfully', { email: args.email })\n return true\n } catch (err) {\n this.logger.error('Request auth code error', { email: args.email, error: err })\n this.error.value = err instanceof Error ? err.message : 'Failed to request auth code'\n return false\n } finally {\n this.loading.value = false\n }\n }\n\n async loginWithCode(args: {\n email: string\n code: string\n orgId?: string\n autoCreateContact?: boolean\n }): Promise<boolean> {\n this.loading.value = true\n this.error.value = null\n\n try {\n const response = await this.api.auth['verify-code'].$post({\n json: { email: args.email, code: args.code },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.error.value = data.error\n this.logger.error('Login failed', { email: args.email, error: data.error })\n return false\n }\n\n // ApiResponse interceptor automatically updates activeUser and token\n this.logger.info('Login successful', { email: args.email })\n\n // Auto-create contact if orgId provided (opt-out pattern)\n if (args.orgId && args.autoCreateContact !== false && this.activeUser.value?.userId) {\n await this.autoCreateContact({\n userId: this.activeUser.value.userId,\n orgId: args.orgId,\n })\n }\n\n return true\n } catch (err) {\n this.logger.error('Login with code error', { email: args.email, error: err })\n this.error.value = err instanceof Error ? err.message : 'Login failed'\n return false\n } finally {\n this.loading.value = false\n }\n }\n\n async trackUsage(args: {\n selfId: string\n type: 'voice' | 'chat'\n quantity: number\n participantId?: string\n }): Promise<boolean> {\n try {\n // Get self to extract orgId (self-first architecture)\n const self = this.currentSelf.value\n if (!self?.orgId) {\n this.logger.error('Cannot track usage: no current self with orgId', { args })\n return false\n }\n\n const response = await this.api.usage.record.$post({\n json: {\n orgId: self.orgId,\n selfId: args.selfId,\n sessionId: this.sessionId, // Auto-managed by SDK\n type: args.type,\n quantity: args.quantity,\n // Track the participant if provided, otherwise use current user or anonymous\n userId: args.participantId || this.activeUser.value?.userId || 'anonymous',\n },\n })\n\n const data = await response.json() as ApiResponse<any>\n\n if (!data.ok) {\n this.logger.error('Failed to track usage', { error: data.error, args })\n return false\n }\n\n return true\n } catch (err) {\n this.logger.error('Track usage error', { error: err, args })\n return false\n }\n }\n\n /**\n * Auto-create contact on authentication\n * Called internally by loginWithCode - can be disabled with autoCreateContact: false\n */\n async autoCreateContact(args: {\n userId: string\n orgId: string\n }): Promise<boolean> {\n try {\n const response = await this.api.contact.resolve.$post({\n json: { userId: args.userId, orgId: args.orgId },\n })\n\n const data = await response.json() as ApiResponse<any>\n\n if (!data.ok) {\n this.logger.error('Failed to auto-create contact', { error: data.error, args })\n return false\n }\n\n this.logger.info('Contact resolved', { userId: args.userId, orgId: args.orgId })\n return true\n } catch (err) {\n this.logger.error('Auto-create contact error', { error: err, args })\n return false\n }\n }\n\n /**\n * Start conversation session (auto-creates conversation if needed)\n * Returns conversation data for tracking messages\n */\n async startConversation(args: {\n selfId: string\n userId?: string\n anonId?: string\n channel: 'voice' | 'chat' // Required: Type of conversation for proper credit calculation\n }): Promise<{ conversationId: string, hostParticipantId?: string, visitorParticipantId?: string } | undefined> {\n try {\n // Get self to extract orgId\n const self = this.currentSelf.value\n if (!self?.orgId) {\n this.logger.error('Cannot start conversation: no current self with orgId', { args })\n return undefined\n }\n\n const response = await this.api.conversation.start.$post({\n json: {\n orgId: self.orgId,\n selfId: args.selfId,\n userId: args.userId || this.activeUser.value?.userId,\n anonId: args.anonId,\n channel: args.channel,\n },\n })\n\n const data = await response.json() as ApiResponse<{\n conversationId: string\n hostParticipantId?: string\n visitorParticipantId?: string\n }>\n\n if (!data.ok || !data.data) {\n const errorMsg = data.ok ? 'No conversation data returned' : 'error' in data ? data.error : 'Unknown error'\n this.logger.error('Failed to start conversation', { error: errorMsg, args })\n return undefined\n }\n\n this.logger.info('Conversation started', { conversationId: data.data.conversationId })\n return data.data\n } catch (err) {\n this.logger.error('Start conversation error', { error: err, args })\n return undefined\n }\n }\n\n /**\n * Generate anonymous ID for tracking unauthenticated users\n * Stored in localStorage for persistence across sessions\n */\n generateAnonId(): string {\n const storageKey = 'fictionAnonId'\n let anonId = this.storage.getItem(storageKey)\n\n if (!anonId) {\n anonId = objectId({ prefix: 'anon' })\n this.storage.setItem(storageKey, anonId)\n }\n\n return anonId\n }\n\n /**\n * Save message to conversation\n * Called by SelfController to persist messages\n */\n async saveMessage(args: {\n conversationId: string\n participantId: string\n content: string\n role: 'user' | 'agent' | 'system'\n }): Promise<boolean> {\n try {\n const response = await this.api.conversation.messages.$post({\n json: {\n sessionId: args.conversationId,\n participantId: args.participantId,\n content: args.content,\n role: args.role,\n },\n })\n\n const data = await response.json() as ApiResponse<any>\n\n if (!data.ok) {\n this.logger.error('Failed to save message', { error: 'error' in data ? data.error : 'Unknown error', args })\n return false\n }\n\n return true\n } catch (err) {\n this.logger.error('Save message error', { error: err, args })\n return false\n }\n }\n\n /**\n * Track conversion events (view_profile, profile_interaction)\n * Sends event to parent window if embedded, otherwise logs locally\n */\n track(args: {\n event: 'view_profile' | 'profile_interaction'\n selfId: 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: 'fiction_track',\n event: args.event,\n selfId: args.selfId,\n properties: args.properties || {},\n }, '*')\n }\n\n this.logger.info('SDK event tracked', { event: args.event, selfId: args.selfId })\n } catch (err) {\n this.logger.error('Track event error', { error: err, args })\n }\n }\n}\n"],"names":["process","isBrowser","isNode","isProd","isDev","logLevels","SENSITIVE_KEYS","_Logger","settings","context","__publicField","level","enabled","hostname","currentPriority","minPriority","obj","item","result","key","value","lowerKey","sensitive","data","maxDepth","currentDepth","formatted","entries","maxProperties","config","description","error","levelConfig","prefix","style","ctx","logEntry","chalk","timestamp","dim","colored","logTimestamp","logLevel","logContext","logMessage","contextualLogger","__name","Logger","createLogger","logger","_SettingsObject","name","SettingsObject","_CookieUtil","cookies","cookie","cookieName","cookieValue","options","secure","sameSite","maxAge","domain","path","cookieString","cookieToken","localToken","token","isProduction","CookieUtil","cookieUtil","createApiClient","responseHandler","baseUrl","hc","input","init","response","originalJson","interceptedResponse","clean","listenerQueue","lqIndex","QUEUE_ITEMS_PER_LISTENER","atom","initialValue","listeners","$atom","listener","index","oldValue","changedKey","runListenerQueue","newValue","unbind","$globalActiveUser","$globalToken","_SDKStorage","activeUser","storedUser","storedToken","watch","newUser","newToken","savedToken","savedUser","SDKStorage","_SDKGlobal","instance","SDKGlobal","sdkGlobal","_FictionSDK","existing","ref","objectId","computed","user","selfId","s","self","org","resolve","err","email","errorMessage","code","password","args","errorMsg","storageKey","anonId","FictionSDK"],"mappings":"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","x_google_ignoreList":[4,5]}
1
+ {"version":3,"file":"sdkClient-CACIEN8g.js","sources":["../../../src/utils/logger.ts","../../../src/utils/base.ts","../../../src/utils/cookies.ts","../api.ts","../../../node_modules/.pnpm/nanostores@1.0.1/node_modules/nanostores/clean-stores/index.js","../../../node_modules/.pnpm/nanostores@1.0.1/node_modules/nanostores/atom/index.js","../sdkStorage.ts","../sdkClient.ts"],"sourcesContent":["/* eslint-disable no-console */\n\n// Use globalThis.process instead of node:process import for browser compatibility\n// Safe because we always check `typeof process !== 'undefined'` before accessing properties\n\n// eslint-disable-next-line node/prefer-global/process\nconst process = (globalThis as any).process\n\ntype LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace'\ntype LogData = Record<string, unknown> | unknown\n\nexport interface LogHelper {\n error: (description: string, data?: LogData) => void\n warn: (description: string, data?: LogData) => void\n info: (description: string, data?: LogData) => void\n debug: (description: string, data?: LogData) => void\n trace: (description: string, data?: LogData) => void\n isEnabled?: () => boolean\n setLevel?: (level: LogLevel) => void\n}\n\ninterface LoggerConfig {\n level: LogLevel\n context?: string\n description?: string\n data?: LogData\n error?: Error | unknown\n timestamp?: boolean\n}\n\ninterface LogSettings {\n enabled?: boolean\n minLevel?: LogLevel\n timestamps?: boolean\n}\n\n// Universal environment detection\nconst isBrowser = typeof window !== 'undefined'\nconst isNode = typeof process !== 'undefined' && !isBrowser\nconst isProd = isBrowser\n ? (typeof window !== 'undefined' && window.location && !window.location.hostname.includes('localhost'))\n : (isNode && typeof process !== 'undefined' && process.env?.NODE_ENV === 'production')\nconst isDev = !isProd\n\n// Log level configuration\nconst logLevels: Record<LogLevel, { priority: number, color: string, nodeColor?: string }> = {\n error: { priority: 50, color: '#FF0000', nodeColor: '\\x1B[31m' },\n warn: { priority: 40, color: '#FFA500', nodeColor: '\\x1B[33m' },\n info: { priority: 30, color: '#00ABFF', nodeColor: '\\x1B[36m' },\n debug: { priority: 20, color: '#00BD0C', nodeColor: '\\x1B[32m' },\n trace: { priority: 10, color: '#5233FF', nodeColor: '\\x1B[35m' },\n}\n\n// Sensitive keys to redact\nconst SENSITIVE_KEYS = ['password', 'token', 'secret', 'apikey', 'api_key', 'authorization', 'cookie']\n\nexport class Logger {\n private settings: Required<LogSettings>\n private enabledInBrowser: boolean = false\n private context?: string\n private static hasShownHelp = false\n\n constructor(settings: LogSettings = {}, context?: string) {\n this.context = context\n this.settings = {\n enabled: settings.enabled ?? true,\n minLevel: settings.minLevel ?? this.getDefaultLevel(),\n timestamps: settings.timestamps ?? true,\n }\n\n if (isBrowser) {\n this.initBrowserLogging()\n }\n }\n\n private getDefaultLevel(): LogLevel {\n // Check environment variable first\n if (isNode && typeof process !== 'undefined' && process.env?.LOG_LEVEL) {\n return process.env.LOG_LEVEL as LogLevel\n }\n\n // Check localStorage in browser\n if (isBrowser && typeof localStorage !== 'undefined') {\n const level = localStorage.getItem('FICTION_LOG_LEVEL')\n if (level)\n return level as LogLevel\n }\n\n // Default: info in production, debug in development\n return isProd ? 'info' : 'debug'\n }\n\n private initBrowserLogging(): void {\n if (!isBrowser)\n return\n\n const logKey = 'FICTION_LOG'\n const enabled = localStorage.getItem(logKey) === 'true'\n const hostname = window.location?.hostname || ''\n\n // Enable in dev, or if explicitly enabled via localStorage\n this.enabledInBrowser = isDev || enabled || hostname === 'localhost' || hostname.includes('127.0.0.1')\n\n // Show help message once in production\n if (isProd && !enabled && !Logger.hasShownHelp) {\n console.log(\n '%cFiction WWW Logger (disabled in production)',\n 'color: #888; font-size: 12px',\n )\n console.log(\n '%cTo enable: localStorage.setItem(\"FICTION_LOG\", \"true\")',\n 'color: #888; font-size: 11px',\n )\n Logger.hasShownHelp = true\n }\n }\n\n private shouldLog(level: LogLevel): boolean {\n if (!this.settings.enabled)\n return false\n\n // In browser, check if enabled\n if (isBrowser && !this.enabledInBrowser)\n return false\n\n const currentPriority = logLevels[level].priority\n const minPriority = logLevels[this.settings.minLevel].priority\n\n return currentPriority >= minPriority\n }\n\n private formatTimestamp(): string {\n return new Date().toLocaleTimeString('en-GB', {\n hour12: false,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n })\n }\n\n private formatISOTimestamp(): string {\n return new Date().toISOString()\n }\n\n private redactSensitive(obj: any): any {\n if (typeof obj !== 'object' || obj === null)\n return obj\n\n if (Array.isArray(obj)) {\n return obj.map((item) => this.redactSensitive(item))\n }\n\n const result: any = {}\n for (const [key, value] of Object.entries(obj)) {\n const lowerKey = key.toLowerCase()\n if (SENSITIVE_KEYS.some((sensitive) => lowerKey.includes(sensitive))) {\n result[key] = '[REDACTED]'\n } else if (typeof value === 'object' && value !== null) {\n result[key] = this.redactSensitive(value)\n } else {\n result[key] = value\n }\n }\n return result\n }\n\n private formatData(data: unknown, maxDepth: number = 3, currentDepth: number = 0): unknown {\n if (currentDepth >= maxDepth) {\n return '[Max Depth]'\n }\n\n if (data === null || data === undefined) {\n return data\n }\n\n // Handle Error objects specially\n if (data instanceof Error) {\n return {\n name: data.name,\n message: data.message,\n stack: isProd ? data.stack?.split('\\n').slice(0, 3).join('\\n') : data.stack,\n ...(data as any), // Include any additional error properties\n }\n }\n\n if (data instanceof Date) {\n return data.toISOString()\n }\n\n if (typeof data !== 'object') {\n return data\n }\n\n if (Array.isArray(data)) {\n if (data.length > 20 && isProd) {\n return `Array(${data.length}) [${data.slice(0, 3).map((item) =>\n this.formatData(item, maxDepth, currentDepth + 1)).join(', ')}, ...]`\n }\n return data.map((item) => this.formatData(item, maxDepth, currentDepth + 1))\n }\n\n // Handle regular objects\n try {\n const formatted: Record<string, unknown> = {}\n const entries = Object.entries(data)\n const maxProperties = isProd ? 50 : 200\n\n for (const [key, value] of entries.slice(0, maxProperties)) {\n formatted[key] = this.formatData(value, maxDepth, currentDepth + 1)\n }\n\n if (entries.length > maxProperties) {\n formatted['...'] = `${entries.length - maxProperties} more properties`\n }\n\n return this.redactSensitive(formatted)\n } catch {\n return '[Unserializable]'\n }\n }\n\n private logToBrowser(config: LoggerConfig): void {\n if (!isBrowser || !this.shouldLog(config.level))\n return\n\n const { level, description, context, data, error } = config\n const levelConfig = logLevels[level]\n const ctx = context || this.context || 'www'\n\n // Format for browser console\n const prefix = `[${ctx}] ${level.toUpperCase()}:`\n const style = `color: ${levelConfig.color}; font-weight: bold;`\n\n // Log main message\n if (data !== undefined) {\n console[level](`%c${prefix}`, style, description, this.formatData(data))\n } else {\n console[level](`%c${prefix}`, style, description)\n }\n\n // Log error details if present\n if (error) {\n if (error instanceof Error) {\n console.error(error)\n } else {\n console.error('Error details:', error)\n }\n }\n }\n\n private async logToNode(config: LoggerConfig): Promise<void> {\n if (!isNode || !this.shouldLog(config.level))\n return\n\n const { level, description, context, data, error } = config\n const ctx = context || this.context || 'www'\n\n if (isProd) {\n // Production: Single-line JSON format for log aggregation\n const logEntry: any = {\n timestamp: this.formatISOTimestamp(),\n level: level.toUpperCase(),\n context: ctx,\n message: description,\n }\n if (data) {\n logEntry.data = this.formatData(data)\n }\n if (error) {\n logEntry.error = this.formatData(error)\n }\n\n console[level](`${logEntry.timestamp} ${logEntry.level} [${ctx}] ${description}`, data || error ? JSON.stringify({ data, error }) : '')\n } else {\n // Development: Pretty-printed format\n try {\n // Dynamic import for Node-only dependencies\n const chalkModule = await import('chalk').catch(() => null)\n const chalk = chalkModule?.default\n\n const levelConfig = logLevels[level]\n const timestamp = this.formatTimestamp()\n\n if (chalk) {\n const dim = chalk.dim\n const colored = chalk.hex(levelConfig.color)\n\n const logTimestamp = dim(`${timestamp} `)\n const logLevel = colored(`${level.toUpperCase()} `)\n const logContext = colored(`(${ctx}): `)\n const logMessage = `${logTimestamp}${logLevel}${logContext}${description}`\n\n console[level](logMessage)\n\n // Log data if present\n if (data !== undefined) {\n console.log(JSON.stringify(this.formatData(data), null, 2))\n }\n\n // Log error if present\n if (error) {\n if (error instanceof Error && chalk) {\n console.error(chalk.red('Error:'), error.message)\n if (error.stack) {\n console.error(chalk.gray(error.stack))\n }\n } else {\n console.error('Error:', error)\n }\n }\n } else {\n // Fallback without chalk\n console[level](`${timestamp} ${level.toUpperCase()} (${ctx}): ${description}`)\n if (data !== undefined) {\n console.log(JSON.stringify(this.formatData(data), null, 2))\n }\n if (error) {\n console.error('Error:', error)\n }\n }\n } catch {\n // Fallback if dynamic imports fail\n console[level](`${this.formatTimestamp()} ${level.toUpperCase()} (${ctx}): ${description}`)\n if (data !== undefined) {\n console.log(JSON.stringify(this.formatData(data), null, 2))\n }\n if (error) {\n console.error('Error:', error)\n }\n }\n }\n }\n\n private log(config: LoggerConfig): void {\n if (isBrowser) {\n this.logToBrowser(config)\n } else if (isNode) {\n // Use promise but don't await (fire and forget)\n this.logToNode(config).catch(console.error)\n }\n }\n\n error(description: string, data?: LogData): void {\n this.log({ level: 'error', description, data, context: this.context })\n }\n\n warn(description: string, data?: LogData): void {\n this.log({ level: 'warn', description, data, context: this.context })\n }\n\n info(description: string, data?: LogData): void {\n this.log({ level: 'info', description, data, context: this.context })\n }\n\n debug(description: string, data?: LogData): void {\n this.log({ level: 'debug', description, data, context: this.context })\n }\n\n trace(description: string, data?: LogData): void {\n this.log({ level: 'trace', description, data, context: this.context })\n }\n\n isEnabled(): boolean {\n if (isBrowser) {\n return this.enabledInBrowser\n }\n return true // Always enabled in Node\n }\n\n setLevel(level: LogLevel): void {\n this.settings.minLevel = level\n }\n\n createContextLogger(context: string): LogHelper {\n const contextualLogger = new Logger(this.settings, context)\n\n return {\n error: (description: string, data?: LogData) => contextualLogger.error(description, data),\n warn: (description: string, data?: LogData) => contextualLogger.warn(description, data),\n info: (description: string, data?: LogData) => contextualLogger.info(description, data),\n debug: (description: string, data?: LogData) => contextualLogger.debug(description, data),\n trace: (description: string, data?: LogData) => contextualLogger.trace(description, data),\n isEnabled: () => contextualLogger.isEnabled(),\n setLevel: (level: LogLevel) => contextualLogger.setLevel(level),\n }\n }\n}\n\n// Factory function - main export\nexport function createLogger(context: string): LogHelper {\n return new Logger({}, context).createContextLogger(context)\n}\n\n// Default logger instance for convenience\nexport const logger = new Logger()\n\n// Convenience exports\nexport const error = logger.error.bind(logger)\nexport const warn = logger.warn.bind(logger)\nexport const info = logger.info.bind(logger)\nexport const debug = logger.debug.bind(logger)\nexport const trace = logger.trace.bind(logger)\n","import { createLogger } from './logger'\n\nexport type SettingsObjectSettings = {\n [key: string]: unknown\n}\n\n/**\n * Base class for objects with settings and contextual logging.\n * Services use this.logger.error(message, { data }) pattern directly.\n */\nexport abstract class SettingsObject<T extends SettingsObjectSettings = SettingsObjectSettings> {\n name: string\n settings: T\n logger: ReturnType<typeof createLogger>\n\n constructor(name: string, settings: T) {\n this.name = name\n this.settings = settings\n this.logger = createLogger(name)\n }\n}\n","/**\n * Client-side cookie utilities\n * Provides simple interface for reading/writing cookies with secure defaults\n */\n\nexport interface CookieOptions {\n httpOnly?: boolean\n secure?: boolean\n sameSite?: 'strict' | 'lax' | 'none'\n maxAge?: number // in seconds\n domain?: string\n path?: string\n}\n\nexport class CookieUtil {\n // Configuration properties\n tokenName = 'auth-token'\n tokenMaxAge = 60 * 60 * 24 * 7 // 7 days\n fallbackStorageKey = 'token' // For localStorage migration\n productionDomain = '.fiction.com'\n /**\n * Get cookie value by name\n */\n getCookie(name: string): string | null {\n if (typeof document === 'undefined')\n return null\n\n const cookies = document.cookie.split(';')\n for (const cookie of cookies) {\n const [cookieName, cookieValue] = cookie.trim().split('=')\n if (cookieName === name) {\n return decodeURIComponent(cookieValue || '')\n }\n }\n return null\n }\n\n /**\n * Set cookie with secure defaults\n */\n setCookie(name: string, value: string, options: CookieOptions = {}): void {\n if (typeof document === 'undefined')\n return\n\n const {\n secure = true,\n sameSite = 'lax',\n maxAge = 60 * 60 * 24 * 7, // 7 days default\n domain,\n path = '/',\n } = options\n\n let cookieString = `${name}=${encodeURIComponent(value)}`\n cookieString += `; Path=${path}`\n cookieString += `; Max-Age=${maxAge}`\n cookieString += `; SameSite=${sameSite}`\n\n if (secure) {\n cookieString += '; Secure'\n }\n\n if (domain) {\n cookieString += `; Domain=${domain}`\n }\n\n document.cookie = cookieString\n }\n\n /**\n * Remove cookie by setting expired date\n */\n removeCookie(name: string, options: Pick<CookieOptions, 'domain' | 'path'> = {}): void {\n this.setCookie(name, '', { ...options, maxAge: 0 })\n }\n\n /**\n * Get auth token with fallback to localStorage for migration\n */\n getAuthToken(): string | null {\n // Try cookie first (new approach)\n const cookieToken = this.getCookie(this.tokenName)\n if (cookieToken)\n return cookieToken\n\n // Fallback to localStorage for migration\n if (typeof localStorage !== 'undefined') {\n const localToken = localStorage.getItem(this.fallbackStorageKey)\n if (localToken) {\n // Migrate to cookie and remove from localStorage\n this.setAuthToken(localToken)\n localStorage.removeItem(this.fallbackStorageKey)\n return localToken\n }\n }\n\n return null\n }\n\n /**\n * Set auth token in cookie with production-ready settings\n */\n setAuthToken(token: string): void {\n const isProduction = typeof window !== 'undefined' && window.location.hostname !== 'localhost'\n\n this.setCookie(this.tokenName, token, {\n secure: isProduction,\n sameSite: 'lax',\n maxAge: this.tokenMaxAge,\n domain: isProduction ? this.productionDomain : undefined,\n path: '/',\n })\n }\n\n /**\n * Remove auth token\n */\n removeAuthToken(): void {\n const isProduction = typeof window !== 'undefined' && window.location.hostname !== 'localhost'\n\n this.removeCookie(this.tokenName, {\n domain: isProduction ? this.productionDomain : undefined,\n path: '/',\n })\n\n // Also remove from localStorage if it exists (cleanup)\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(this.fallbackStorageKey)\n }\n }\n}\n\nexport const cookieUtil = new CookieUtil()\n","import type { Hono } from 'hono'\nimport { hc } from 'hono/client'\nimport { cookieUtil } from '@/utils/cookies'\n\nexport interface ApiClientSettings {\n isDev: boolean\n apiBase?: string\n [key: string]: unknown\n}\n\n/**\n * Create fully typed Hono RPC client for Fiction 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 // Auto-detect API base URL\n const baseUrl = settings.apiBase || (settings.isDev ? 'http://localhost:5555' : 'https://app.fiction.com')\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 const originalJson = response.json.bind(response)\n const interceptedResponse = response.clone()\n\n // Override json method to process ApiResponse\n Object.defineProperty(interceptedResponse, 'json', {\n value: 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 interceptedResponse\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\nexport let 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 '@fiction/types'\nimport { atom } from 'nanostores'\nimport { watch } from 'vue'\nimport { cookieUtil } from '@/utils/cookies'\nimport { createLogger } from '@/utils/logger'\n\n// Global nanostores for persistence across page navigations\n// These must be outside the class to survive view transitions\nconst $globalActiveUser = atom<EnrichedUser | undefined>(undefined)\nconst $globalToken = atom<string | null>(null)\n\n/**\n * SDKStorage - Handles all storage, sync, and persistence for FictionSDK\n *\n * Extracted from FictionSDK 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 * 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 try {\n const savedUser = localStorage.getItem('fiction-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 * 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 try {\n if (activeUser.value) {\n localStorage.setItem('fiction-user', JSON.stringify(activeUser.value))\n } else {\n localStorage.removeItem('fiction-user')\n }\n } catch (error) {\n this.logger.error('Failed to save user to localStorage', { data: error })\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 try {\n localStorage.removeItem('fiction-user')\n } catch (error) {\n this.logger.error('Failed to clear user from localStorage', { data: error })\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 (typeof window === 'undefined')\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 (typeof window === 'undefined')\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 { 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 { Self } from '@fiction/types'\nimport type { ApiResponse, EnrichedUser } from '@fiction/types'\nimport { objectId } from '@fiction/utils'\nimport { computed, ref } from 'vue'\nimport { SettingsObject } from '@/utils/base'\nimport { createApiClient } from './api'\nimport { SDKStorage } from './sdkStorage'\n\nexport interface FictionSDKSettings {\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 = '__FICTION_SDK__'\n\n get(): FictionSDK | undefined {\n if (typeof window === 'undefined')\n return undefined\n return (globalThis as any)[this.key]\n }\n\n set(instance: FictionSDK): 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 FictionSDK extends SettingsObject<FictionSDKSettings> {\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: FictionSDKSettings = {}): FictionSDK {\n // Browser: return singleton or create\n // Node: always create new (no singleton)\n return sdkGlobal.get() || new FictionSDK(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 currentSelf = computed(() => {\n const user = this.activeUser.value\n if (!user?.selves)\n return undefined\n\n const selfId = user.primarySelfId || user.selves[0]?.selfId\n if (!selfId)\n return undefined\n\n return user.selves.find((s) => s.selfId === selfId)\n })\n\n currentOrg = computed(() => {\n const self = this.currentSelf.value\n if (!self?.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 === self.orgId)\n })\n\n // Initialization state\n initialized?: Promise<EnrichedUser | undefined>\n resolveUser?: (value: EnrichedUser | undefined) => void\n\n constructor(settings: FictionSDKSettings = {}) {\n // Browser: return existing singleton\n // Node: always create new\n const existing = sdkGlobal.get()\n if (existing) {\n console.debug('[FictionSDK] Returning existing singleton instance')\n return existing\n }\n\n super('FictionSDK', 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 this.logger.info('FictionSDK 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 // Convenience methods for common auth operations\n async sendCode(email: string): Promise<void> {\n this.loading.value = true\n this.error.value = null\n\n try {\n const response = await this.api.auth['check-email'].$post({\n json: { email },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.logger.error('Send code error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Failed to send verification code'\n this.error.value = errorMessage\n throw err\n } finally {\n this.loading.value = false\n }\n }\n\n async verifyCode(email: string, code: string): Promise<void> {\n this.loading.value = true\n this.error.value = null\n\n try {\n const response = await this.api.auth['verify-code'].$post({\n json: { email, code },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.logger.error('Verify code error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Failed to verify code'\n this.error.value = errorMessage\n throw err\n } finally {\n this.loading.value = false\n }\n }\n\n async login(email: string, password: string): Promise<void> {\n this.loading.value = true\n this.error.value = null\n\n try {\n const response = await this.api.auth.login.$post({\n json: { email, password },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.error.value = data.error\n throw new Error(data.error)\n }\n } catch (err) {\n this.logger.error('Login error', { data: err })\n const errorMessage = err instanceof Error ? err.message : 'Login failed'\n this.error.value = errorMessage\n throw err\n } finally {\n this.loading.value = false\n }\n }\n\n async logout(): Promise<void> {\n this.loading.value = true\n this.error.value = null\n\n try {\n await this.api.auth.logout.$post()\n\n // Clear local state\n this.activeUser.value = undefined\n this.token.value = null\n this.storage.clearStorage()\n } catch (err) {\n this.logger.error('Logout error (user still logged out locally)', { data: err })\n // Still clear local state even if API call fails\n this.activeUser.value = undefined\n this.token.value = null\n this.storage.clearStorage()\n } finally {\n this.loading.value = false\n }\n }\n\n async getCurrentUser(): Promise<EnrichedUser | undefined> {\n if (!this.token.value) {\n return undefined\n }\n\n this.loading.value = true\n\n try {\n const response = await this.api.auth.me.$get()\n const data = await response.json()\n\n if (!data.ok) {\n this.error.value = data.error\n // Clear invalid session\n if (data.error.includes('Authentication')) {\n this.activeUser.value = undefined\n this.token.value = null\n this.storage.clearStorage()\n }\n return undefined\n }\n\n return data.user\n } catch (err) {\n this.logger.error('Get current user error', { data: err })\n this.error.value = err instanceof Error ? err.message : 'Failed to get user info'\n return undefined\n } finally {\n this.loading.value = false\n }\n }\n\n async getPublicSelf(args: { handle: string }): Promise<Self | undefined> {\n this.loading.value = true\n this.error.value = null\n\n try {\n const response = await this.api.self.public[':handle'].$get({\n param: { handle: args.handle },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.error.value = data.error\n this.logger.error('Failed to fetch public self', { handle: args.handle, error: data.error })\n return undefined\n }\n\n return data.data\n } catch (err) {\n this.logger.error('Get public self error', { handle: args.handle, error: err })\n this.error.value = err instanceof Error ? err.message : 'Failed to fetch self'\n return undefined\n } finally {\n this.loading.value = false\n }\n }\n\n async getSelfByEmail(args: { email: string }): Promise<Self | undefined> {\n this.loading.value = true\n this.error.value = null\n\n try {\n const response = await this.api.self['by-email'][':email'].$get({\n param: { email: args.email },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.error.value = data.error\n this.logger.error('Failed to fetch self by email', { email: args.email, error: data.error })\n return undefined\n }\n\n return data.data\n } catch (err) {\n this.logger.error('Get self by email error', { email: args.email, error: err })\n this.error.value = err instanceof Error ? err.message : 'Failed to fetch self'\n return undefined\n } finally {\n this.loading.value = false\n }\n }\n\n async requestAuthCode(args: { email: string }): Promise<boolean> {\n this.loading.value = true\n this.error.value = null\n\n try {\n const response = await this.api.auth['check-email'].$post({\n json: { email: args.email },\n })\n\n const data = await response.json()\n\n if (!data.ok) {\n this.error.value = data.error\n this.logger.error('Failed to request auth code', { email: args.email, error: data.error })\n return false\n }\n\n this.logger.info('Auth code requested successfully', { email: args.email })\n return true\n } catch (err) {\n this.logger.error('Request auth code error', { email: args.email, error: err })\n this.error.value = err instanceof Error ? err.message : 'Failed to request auth code'\n return false\n } finally {\n this.loading.value = false\n }\n }\n\n async loginWithCode(args: {\n email: string\n code: string\n orgId?: string\n autoCreateContact?: boolean\n }): Promise<boolean> {\n this.loading.value = true\n this.error.value = null\n\n try {\n const response = await this.api.auth['verify-code'].$post({\n json: { email: args.email, code: args.code },\n })\n\n const data = await response.json()\n\n this.logger.info('Login with code response', {\n hasUser: !!data.user,\n hasToken: !!data.token,\n ok: data.ok\n })\n\n if (!data.ok) {\n this.error.value = data.error\n this.logger.error('Login failed', { email: args.email, error: data.error })\n return false\n }\n\n // Explicitly process response to update activeUser and token\n this.processApiResponse(data)\n this.logger.info('Login successful', { email: args.email })\n\n // Auto-create contact if orgId provided (opt-out pattern)\n if (args.orgId && args.autoCreateContact !== false && this.activeUser.value?.userId) {\n await this.autoCreateContact({\n userId: this.activeUser.value.userId,\n orgId: args.orgId,\n })\n }\n\n return true\n } catch (err) {\n this.logger.error('Login with code error', { email: args.email, error: err })\n this.error.value = err instanceof Error ? err.message : 'Login failed'\n return false\n } finally {\n this.loading.value = false\n }\n }\n\n async trackUsage(args: {\n selfId: string\n type: 'voice' | 'chat'\n quantity: number\n participantId?: string\n }): Promise<boolean> {\n try {\n // Get self to extract orgId (self-first architecture)\n const self = this.currentSelf.value\n if (!self?.orgId) {\n this.logger.error('Cannot track usage: no current self with orgId', { args })\n return false\n }\n\n const response = await this.api.usage.record.$post({\n json: {\n orgId: self.orgId,\n selfId: args.selfId,\n sessionId: this.sessionId, // Auto-managed by SDK\n type: args.type,\n quantity: args.quantity,\n // Track the participant if provided, otherwise use current user or anonymous\n userId: args.participantId || this.activeUser.value?.userId || 'anonymous',\n },\n })\n\n const data = await response.json() as ApiResponse<any>\n\n if (!data.ok) {\n this.logger.error('Failed to track usage', { error: data.error, args })\n return false\n }\n\n return true\n } catch (err) {\n this.logger.error('Track usage error', { error: err, args })\n return false\n }\n }\n\n /**\n * Auto-create contact on authentication\n * Called internally by loginWithCode - can be disabled with autoCreateContact: false\n */\n async autoCreateContact(args: {\n userId: string\n orgId: string\n }): Promise<boolean> {\n try {\n const response = await this.api.contact.resolve.$post({\n json: { userId: args.userId, orgId: args.orgId },\n })\n\n const data = await response.json() as ApiResponse<any>\n\n if (!data.ok) {\n this.logger.error('Failed to auto-create contact', { error: data.error, args })\n return false\n }\n\n this.logger.info('Contact resolved', { userId: args.userId, orgId: args.orgId })\n return true\n } catch (err) {\n this.logger.error('Auto-create contact error', { error: err, args })\n return false\n }\n }\n\n /**\n * Start conversation session (auto-creates conversation if needed)\n * Returns conversation data for tracking messages\n */\n async startConversation(args: {\n selfId: string\n userId?: string\n anonId?: string\n channel: 'voice' | 'chat' // Required: Type of conversation for proper credit calculation\n }): Promise<{ conversationId: string, hostParticipantId?: string, visitorParticipantId?: string } | undefined> {\n try {\n // Get self to extract orgId\n const self = this.currentSelf.value\n if (!self?.orgId) {\n this.logger.error('Cannot start conversation: no current self with orgId', { args })\n return undefined\n }\n\n const response = await this.api.conversation.start.$post({\n json: {\n orgId: self.orgId,\n selfId: args.selfId,\n userId: args.userId || this.activeUser.value?.userId,\n anonId: args.anonId,\n channel: args.channel,\n },\n })\n\n const data = await response.json() as ApiResponse<{\n conversationId: string\n hostParticipantId?: string\n visitorParticipantId?: string\n }>\n\n if (!data.ok || !data.data) {\n const errorMsg = data.ok ? 'No conversation data returned' : 'error' in data ? data.error : 'Unknown error'\n this.logger.error('Failed to start conversation', { error: errorMsg, args })\n return undefined\n }\n\n this.logger.info('Conversation started', { conversationId: data.data.conversationId })\n return data.data\n } catch (err) {\n this.logger.error('Start conversation error', { error: err, args })\n return undefined\n }\n }\n\n /**\n * Generate anonymous ID for tracking unauthenticated users\n * Stored in localStorage for persistence across sessions\n */\n generateAnonId(): string {\n const storageKey = 'fictionAnonId'\n let anonId = this.storage.getItem(storageKey)\n\n if (!anonId) {\n anonId = objectId({ prefix: 'anon' })\n this.storage.setItem(storageKey, anonId)\n }\n\n return anonId\n }\n\n /**\n * Save message to conversation\n * Called by SelfController to persist messages\n */\n async saveMessage(args: {\n conversationId: string\n participantId: string\n content: string\n role: 'user' | 'agent' | 'system'\n }): Promise<boolean> {\n try {\n const response = await this.api.conversation.messages.$post({\n json: {\n sessionId: args.conversationId,\n participantId: args.participantId,\n content: args.content,\n role: args.role,\n },\n })\n\n const data = await response.json() as ApiResponse<any>\n\n if (!data.ok) {\n this.logger.error('Failed to save message', { error: 'error' in data ? data.error : 'Unknown error', args })\n return false\n }\n\n return true\n } catch (err) {\n this.logger.error('Save message error', { error: err, args })\n return false\n }\n }\n\n /**\n * Track conversion events (view_profile, profile_interaction)\n * Sends event to parent window if embedded, otherwise logs locally\n */\n track(args: {\n event: 'view_profile' | 'profile_interaction'\n selfId: 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: 'fiction_track',\n event: args.event,\n selfId: args.selfId,\n properties: args.properties || {},\n }, '*')\n }\n\n this.logger.info('SDK event tracked', { event: args.event, selfId: args.selfId })\n } catch (err) {\n this.logger.error('Track event error', { error: err, args })\n }\n }\n}\n"],"names":["process","isBrowser","isNode","isProd","isDev","logLevels","SENSITIVE_KEYS","_Logger","settings","context","__publicField","level","enabled","hostname","currentPriority","minPriority","obj","item","result","key","value","lowerKey","sensitive","data","maxDepth","currentDepth","formatted","entries","maxProperties","config","description","error","levelConfig","prefix","style","ctx","logEntry","chalk","timestamp","dim","colored","logTimestamp","logLevel","logContext","logMessage","contextualLogger","__name","Logger","createLogger","logger","_SettingsObject","name","SettingsObject","_CookieUtil","cookies","cookie","cookieName","cookieValue","options","secure","sameSite","maxAge","domain","path","cookieString","cookieToken","localToken","token","isProduction","CookieUtil","cookieUtil","createApiClient","responseHandler","baseUrl","hc","input","init","response","originalJson","interceptedResponse","clean","listenerQueue","lqIndex","QUEUE_ITEMS_PER_LISTENER","atom","initialValue","listeners","$atom","listener","index","oldValue","changedKey","runListenerQueue","newValue","unbind","$globalActiveUser","$globalToken","_SDKStorage","activeUser","storedUser","storedToken","watch","newUser","newToken","savedToken","savedUser","SDKStorage","_SDKGlobal","instance","SDKGlobal","sdkGlobal","_FictionSDK","existing","ref","objectId","computed","user","selfId","s","self","org","resolve","err","email","errorMessage","code","password","args","errorMsg","storageKey","anonId","FictionSDK"],"mappings":"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","x_google_ignoreList":[4,5]}
package/dist/self.js CHANGED
@@ -1,10 +1,10 @@
1
1
  var E = Object.defineProperty;
2
2
  var d = (e, l) => E(e, "name", { value: l, configurable: !0 });
3
- import { _ as A, g as C, b as I, a as M } from "./SelfWrap.vue_vue_type_script_setup_true_lang-D3gTmqI-.js";
4
- import { f as q, A as J, d as K, c as X, C as Y, V as ee, e as te, j as se, h as ae, i as oe, k as ie, p as le } from "./SelfWrap.vue_vue_type_script_setup_true_lang-D3gTmqI-.js";
3
+ import { _ as A, g as C, b as I, a as M } from "./SelfWrap.vue_vue_type_script_setup_true_lang-DDXRQsTq.js";
4
+ import { f as q, A as J, d as K, c as X, C as Y, V as ee, e as te, j as se, h as ae, i as oe, k as ie, p as le } from "./SelfWrap.vue_vue_type_script_setup_true_lang-DDXRQsTq.js";
5
5
  import { defineComponent as b, createBlock as u, openBlock as c, withCtx as k, createElementVNode as o, createVNode as _, ref as v, watch as O, nextTick as U, createElementBlock as p, createCommentVNode as f, normalizeClass as h, normalizeStyle as V, unref as x } from "vue";
6
6
  import { _ as $ } from "./FModal.vue_vue_type_script_setup_true_lang-cL0BFEkZ.js";
7
- import { _ as N } from "./SelfProvider.vue_vue_type_script_setup_true_lang-D11Njfq9.js";
7
+ import { _ as N } from "./SelfProvider.vue_vue_type_script_setup_true_lang-BAy_cFAO.js";
8
8
  const T = { class: "relative w-full h-[80vh] md:h-[600px]" }, P = /* @__PURE__ */ b({
9
9
  name: "SelfModal",
10
10
  __name: "SelfModal",