@symbo.ls/sdk 2.32.2 → 2.32.4

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.
Files changed (90) hide show
  1. package/dist/cjs/config/environment.js +43 -8
  2. package/dist/cjs/index.js +12 -4
  3. package/dist/cjs/services/AdminService.js +4 -4
  4. package/dist/cjs/services/AuthService.js +36 -149
  5. package/dist/cjs/services/BaseService.js +5 -18
  6. package/dist/cjs/services/BranchService.js +10 -10
  7. package/dist/cjs/services/CollabService.js +94 -61
  8. package/dist/cjs/services/CoreService.js +19 -19
  9. package/dist/cjs/services/DnsService.js +4 -4
  10. package/dist/cjs/services/FileService.js +2 -2
  11. package/dist/cjs/services/PaymentService.js +2 -2
  12. package/dist/cjs/services/PlanService.js +12 -12
  13. package/dist/cjs/services/ProjectService.js +45 -35
  14. package/dist/cjs/services/PullRequestService.js +7 -7
  15. package/dist/cjs/services/ScreenshotService.js +304 -0
  16. package/dist/cjs/services/SubscriptionService.js +14 -14
  17. package/dist/cjs/services/index.js +4 -0
  18. package/dist/cjs/utils/TokenManager.js +16 -5
  19. package/dist/cjs/utils/changePreprocessor.js +134 -0
  20. package/dist/cjs/utils/jsonDiff.js +46 -4
  21. package/dist/cjs/utils/ordering.js +274 -0
  22. package/dist/cjs/utils/services.js +14 -1
  23. package/dist/esm/config/environment.js +43 -8
  24. package/dist/esm/index.js +1099 -417
  25. package/dist/esm/services/AdminService.js +68 -35
  26. package/dist/esm/services/AuthService.js +100 -168
  27. package/dist/esm/services/BaseService.js +64 -31
  28. package/dist/esm/services/BranchService.js +74 -41
  29. package/dist/esm/services/CollabService.js +570 -97
  30. package/dist/esm/services/CoreService.js +83 -50
  31. package/dist/esm/services/DnsService.js +68 -35
  32. package/dist/esm/services/FileService.js +66 -33
  33. package/dist/esm/services/PaymentService.js +66 -33
  34. package/dist/esm/services/PlanService.js +76 -43
  35. package/dist/esm/services/ProjectService.js +547 -66
  36. package/dist/esm/services/PullRequestService.js +71 -38
  37. package/dist/esm/services/ScreenshotService.js +992 -0
  38. package/dist/esm/services/SubscriptionService.js +78 -45
  39. package/dist/esm/services/index.js +1076 -412
  40. package/dist/esm/utils/CollabClient.js +89 -12
  41. package/dist/esm/utils/TokenManager.js +16 -5
  42. package/dist/esm/utils/changePreprocessor.js +442 -0
  43. package/dist/esm/utils/jsonDiff.js +46 -4
  44. package/dist/esm/utils/ordering.js +256 -0
  45. package/dist/esm/utils/services.js +14 -1
  46. package/dist/node/config/environment.js +43 -8
  47. package/dist/node/index.js +14 -5
  48. package/dist/node/services/AdminService.js +4 -4
  49. package/dist/node/services/AuthService.js +36 -139
  50. package/dist/node/services/BaseService.js +5 -18
  51. package/dist/node/services/BranchService.js +10 -10
  52. package/dist/node/services/CollabService.js +95 -62
  53. package/dist/node/services/CoreService.js +19 -19
  54. package/dist/node/services/DnsService.js +4 -4
  55. package/dist/node/services/FileService.js +2 -2
  56. package/dist/node/services/PaymentService.js +2 -2
  57. package/dist/node/services/PlanService.js +12 -12
  58. package/dist/node/services/ProjectService.js +45 -35
  59. package/dist/node/services/PullRequestService.js +7 -7
  60. package/dist/node/services/ScreenshotService.js +285 -0
  61. package/dist/node/services/SubscriptionService.js +14 -14
  62. package/dist/node/services/index.js +4 -0
  63. package/dist/node/utils/TokenManager.js +16 -5
  64. package/dist/node/utils/changePreprocessor.js +115 -0
  65. package/dist/node/utils/jsonDiff.js +46 -4
  66. package/dist/node/utils/ordering.js +255 -0
  67. package/dist/node/utils/services.js +14 -1
  68. package/package.json +7 -6
  69. package/src/config/environment.js +48 -9
  70. package/src/index.js +38 -22
  71. package/src/services/AdminService.js +4 -4
  72. package/src/services/AuthService.js +42 -175
  73. package/src/services/BaseService.js +7 -24
  74. package/src/services/BranchService.js +10 -10
  75. package/src/services/CollabService.js +115 -74
  76. package/src/services/CoreService.js +19 -19
  77. package/src/services/DnsService.js +4 -4
  78. package/src/services/FileService.js +2 -2
  79. package/src/services/PaymentService.js +2 -2
  80. package/src/services/PlanService.js +12 -12
  81. package/src/services/ProjectService.js +50 -35
  82. package/src/services/PullRequestService.js +7 -7
  83. package/src/services/ScreenshotService.js +258 -0
  84. package/src/services/SubscriptionService.js +14 -14
  85. package/src/services/index.js +6 -1
  86. package/src/utils/TokenManager.js +19 -5
  87. package/src/utils/changePreprocessor.js +139 -0
  88. package/src/utils/jsonDiff.js +40 -5
  89. package/src/utils/ordering.js +244 -0
  90. package/src/utils/services.js +15 -1
package/dist/esm/index.js CHANGED
@@ -14111,18 +14111,28 @@ var CONFIG = {
14111
14111
  // For based api
14112
14112
  basedOrg: "symbols",
14113
14113
  // For based api
14114
- githubClientId: "Ov23liHxyWFBxS8f1gnF",
14114
+ githubClientId: "Ov23liAFrsR0StbAO6PO",
14115
14115
  // For github api
14116
14116
  // Environment-specific feature toggles (override common)
14117
14117
  features: {
14118
14118
  betaFeatures: true
14119
14119
  // Enable beta features in local dev
14120
- }
14120
+ },
14121
+ typesenseCollectionName: "docs",
14122
+ typesenseApiKey: "vZya3L2zpq8L6iI5WWMUZJZABvT63VDb",
14123
+ typesenseHost: "localhost",
14124
+ typesensePort: "8108",
14125
+ typesenseProtocol: "http"
14121
14126
  },
14122
14127
  development: {
14123
14128
  socketUrl: "https://dev.api.symbols.app",
14124
14129
  apiUrl: "https://dev.api.symbols.app",
14125
- githubClientId: "Ov23liHxyWFBxS8f1gnF"
14130
+ githubClientId: "Ov23liHxyWFBxS8f1gnF",
14131
+ typesenseCollectionName: "docs",
14132
+ typesenseApiKey: "awmcVpbWqZi9IUgmvslp1C5LKDU8tMjA",
14133
+ typesenseHost: "tl2qpnwxev4cjm36p-1.a1.typesense.net",
14134
+ typesensePort: "443",
14135
+ typesenseProtocol: "https"
14126
14136
  },
14127
14137
  testing: {
14128
14138
  socketUrl: "https://test.api.symbols.app",
@@ -14130,12 +14140,22 @@ var CONFIG = {
14130
14140
  basedEnv: "testing",
14131
14141
  basedProject: "platform-v2-sm",
14132
14142
  basedOrg: "symbols",
14133
- githubClientId: "Ov23liHxyWFBxS8f1gnF"
14143
+ githubClientId: "Ov23liHxyWFBxS8f1gnF",
14144
+ typesenseCollectionName: "docs",
14145
+ typesenseApiKey: "awmcVpbWqZi9IUgmvslp1C5LKDU8tMjA",
14146
+ typesenseHost: "tl2qpnwxev4cjm36p-1.a1.typesense.net",
14147
+ typesensePort: "443",
14148
+ typesenseProtocol: "https"
14134
14149
  },
14135
14150
  upcoming: {
14136
14151
  socketUrl: "https://upcoming.api.symbols.app",
14137
14152
  apiUrl: "https://upcoming.api.symbols.app",
14138
- githubClientId: "Ov23liWF7NvdZ056RV5J"
14153
+ githubClientId: "Ov23liWF7NvdZ056RV5J",
14154
+ typesenseCollectionName: "docs",
14155
+ typesenseApiKey: "awmcVpbWqZi9IUgmvslp1C5LKDU8tMjA",
14156
+ typesenseHost: "tl2qpnwxev4cjm36p-1.a1.typesense.net",
14157
+ typesensePort: "443",
14158
+ typesenseProtocol: "https"
14139
14159
  },
14140
14160
  staging: {
14141
14161
  socketUrl: "https://staging.api.symbols.app",
@@ -14143,7 +14163,12 @@ var CONFIG = {
14143
14163
  basedEnv: "staging",
14144
14164
  basedProject: "platform-v2-sm",
14145
14165
  basedOrg: "symbols",
14146
- githubClientId: "Ov23ligwZDQVD0VfuWNa"
14166
+ githubClientId: "Ov23ligwZDQVD0VfuWNa",
14167
+ typesenseCollectionName: "docs",
14168
+ typesenseApiKey: "awmcVpbWqZi9IUgmvslp1C5LKDU8tMjA",
14169
+ typesenseHost: "tl2qpnwxev4cjm36p-1.a1.typesense.net",
14170
+ typesensePort: "443",
14171
+ typesenseProtocol: "https"
14147
14172
  },
14148
14173
  production: {
14149
14174
  socketUrl: "https://api.symbols.app",
@@ -14151,7 +14176,12 @@ var CONFIG = {
14151
14176
  basedEnv: "production",
14152
14177
  basedProject: "platform-v2-sm",
14153
14178
  basedOrg: "symbols",
14154
- githubClientId: "Ov23liFAlOEIXtX3dBtR"
14179
+ githubClientId: "Ov23liFAlOEIXtX3dBtR",
14180
+ typesenseCollectionName: "docs",
14181
+ typesenseApiKey: "awmcVpbWqZi9IUgmvslp1C5LKDU8tMjA",
14182
+ typesenseHost: "tl2qpnwxev4cjm36p-1.a1.typesense.net",
14183
+ typesensePort: "443",
14184
+ typesenseProtocol: "https"
14155
14185
  }
14156
14186
  };
14157
14187
  var getEnvironment = () => {
@@ -14173,6 +14203,11 @@ var getConfig = () => {
14173
14203
  basedProject: process.env.SYMBOLS_APP_BASED_PROJECT || envConfig.basedProject,
14174
14204
  basedOrg: process.env.SYMBOLS_APP_BASED_ORG || envConfig.basedOrg,
14175
14205
  githubClientId: process.env.SYMBOLS_APP_GITHUB_CLIENT_ID || envConfig.githubClientId,
14206
+ typesenseCollectionName: process.env.TYPESENSE_COLLECTION_NAME || envConfig.typesenseCollectionName,
14207
+ typesenseApiKey: process.env.TYPESENSE_API_KEY || envConfig.typesenseApiKey,
14208
+ typesenseHost: process.env.TYPESENSE_HOST || envConfig.typesenseHost,
14209
+ typesensePort: process.env.TYPESENSE_PORT || envConfig.typesensePort,
14210
+ typesenseProtocol: process.env.TYPESENSE_PROTOCOL || envConfig.typesenseProtocol,
14176
14211
  isDevelopment: isDevelopment(env),
14177
14212
  isTesting: env === "testing",
14178
14213
  isStaging: env === "staging",
@@ -14192,7 +14227,7 @@ var getConfig = () => {
14192
14227
  );
14193
14228
  }
14194
14229
  if (finalConfig.isDevelopment) {
14195
- console.log(
14230
+ console.warn(
14196
14231
  "environment in SDK:",
14197
14232
  env || process.env.NODE_ENV || process.env.NODE_ENV
14198
14233
  );
@@ -14231,7 +14266,7 @@ var TokenManager = class {
14231
14266
  });
14232
14267
  this.config = {
14233
14268
  storagePrefix: "symbols_",
14234
- storageType: typeof window === "undefined" || process.env.NODE_ENV === "test" ? "memory" : "localStorage",
14269
+ storageType: typeof window === "undefined" || process.env.NODE_ENV === "test" || process.env.NODE_ENV === "testing" ? "memory" : "localStorage",
14235
14270
  // 'localStorage' | 'sessionStorage' | 'memory'
14236
14271
  refreshBuffer: 60 * 1e3,
14237
14272
  // Refresh 1 minute before expiry
@@ -14271,15 +14306,26 @@ var TokenManager = class {
14271
14306
  if (typeof window === "undefined") {
14272
14307
  return this._memoryStorage;
14273
14308
  }
14274
- const hasLocalStorage = typeof window.localStorage !== "undefined";
14275
- const hasSessionStorage = typeof window.sessionStorage !== "undefined";
14309
+ const safeGetStorage = (provider) => {
14310
+ try {
14311
+ const storage = provider();
14312
+ const testKey = `${this.config.storagePrefix}__tm_test__`;
14313
+ storage.setItem(testKey, "1");
14314
+ storage.removeItem(testKey);
14315
+ return storage;
14316
+ } catch {
14317
+ return null;
14318
+ }
14319
+ };
14320
+ const localStorageInstance = safeGetStorage(() => window.localStorage);
14321
+ const sessionStorageInstance = safeGetStorage(() => window.sessionStorage);
14276
14322
  switch (this.config.storageType) {
14277
14323
  case "sessionStorage":
14278
- return hasSessionStorage ? window.sessionStorage : this._memoryStorage;
14324
+ return sessionStorageInstance || this._memoryStorage;
14279
14325
  case "memory":
14280
14326
  return this._memoryStorage;
14281
14327
  default:
14282
- return hasLocalStorage ? window.localStorage : this._memoryStorage;
14328
+ return localStorageInstance || this._memoryStorage;
14283
14329
  }
14284
14330
  }
14285
14331
  /**
@@ -14618,20 +14664,10 @@ var BaseService = class {
14618
14664
  }
14619
14665
  this._tokenManager = getTokenManager({
14620
14666
  apiUrl: this._apiUrl,
14621
- onTokenRefresh: (tokens) => {
14622
- this.updateContext({ authToken: tokens.accessToken });
14623
- },
14624
- onTokenExpired: () => {
14625
- this.updateContext({ authToken: null });
14626
- },
14627
14667
  onTokenError: (error) => {
14628
14668
  console.error("Token management error:", error);
14629
14669
  }
14630
14670
  });
14631
- const { authToken } = this._context;
14632
- if (authToken && !this._tokenManager.hasTokens()) {
14633
- this._tokenManager.setTokens({ access_token: authToken });
14634
- }
14635
14671
  this._setReady();
14636
14672
  } catch (error) {
14637
14673
  this._setError(error);
@@ -14640,7 +14676,9 @@ var BaseService = class {
14640
14676
  }
14641
14677
  // Update context
14642
14678
  updateContext(context) {
14643
- this._context = { ...this._context, ...context };
14679
+ if (context && typeof context === "object") {
14680
+ Object.assign(this._context, context);
14681
+ }
14644
14682
  }
14645
14683
  // Get service status
14646
14684
  getStatus() {
@@ -14695,11 +14733,6 @@ var BaseService = class {
14695
14733
  error
14696
14734
  );
14697
14735
  }
14698
- } else if (this._requiresInit(options.methodName)) {
14699
- const { authToken } = this._context;
14700
- if (authToken) {
14701
- defaultHeaders.Authorization = `Bearer ${authToken}`;
14702
- }
14703
14736
  }
14704
14737
  try {
14705
14738
  const response = await fetch(url2, {
@@ -14717,11 +14750,11 @@ var BaseService = class {
14717
14750
  error = await response.json();
14718
14751
  } catch {
14719
14752
  }
14720
- throw new Error(error.message || error.error || "Request failed");
14753
+ throw new Error(error.message || error.error || "Request failed", { cause: error });
14721
14754
  }
14722
14755
  return response.status === 204 ? null : response.json();
14723
14756
  } catch (error) {
14724
- throw new Error(`Request failed: ${error.message}`);
14757
+ throw new Error(`Request failed: ${error.message}`, { cause: error });
14725
14758
  }
14726
14759
  }
14727
14760
  // Helper method to determine if a method requires initialization
@@ -14902,118 +14935,10 @@ var AuthService = class extends BaseService {
14902
14935
  "pro2",
14903
14936
  "enterprise"
14904
14937
  ]);
14905
- this._initialized = false;
14906
- this._apiUrl = null;
14907
- this._tokenManager = null;
14908
14938
  this._projectRoleCache = /* @__PURE__ */ new Map();
14909
14939
  this._roleCacheExpiry = 5 * 60 * 1e3;
14910
14940
  }
14911
- init({ context }) {
14912
- try {
14913
- const { appKey, authToken } = context || this._context;
14914
- this._apiUrl = environment_default.apiUrl;
14915
- if (!this._apiUrl) {
14916
- throw new Error("Auth service base URL not configured");
14917
- }
14918
- this._tokenManager = getTokenManager({
14919
- apiUrl: this._apiUrl,
14920
- onTokenRefresh: (tokens) => {
14921
- this.updateContext({ authToken: tokens.accessToken });
14922
- },
14923
- onTokenExpired: () => {
14924
- this.updateContext({ authToken: null });
14925
- },
14926
- onTokenError: (error) => {
14927
- console.error("Token management error:", error);
14928
- }
14929
- });
14930
- if (authToken && !this._tokenManager.hasTokens()) {
14931
- this._tokenManager.setTokens({ access_token: authToken });
14932
- }
14933
- this._info = {
14934
- config: {
14935
- apiUrl: this._apiUrl,
14936
- appKey: appKey ? `${appKey.substr(0, 4)}...${appKey.substr(-4)}` : null,
14937
- hasToken: Boolean(authToken)
14938
- }
14939
- };
14940
- this._initialized = true;
14941
- this._setReady();
14942
- } catch (error) {
14943
- this._setError(error);
14944
- throw error;
14945
- }
14946
- }
14947
- // Helper method to make HTTP requests
14948
- async _request(endpoint, options = {}) {
14949
- const url2 = `${this._apiUrl}/core${endpoint}`;
14950
- const defaultHeaders = {};
14951
- if (!(options.body instanceof FormData)) {
14952
- defaultHeaders["Content-Type"] = "application/json";
14953
- }
14954
- if (this._requiresInit(options.methodName) && this._tokenManager) {
14955
- try {
14956
- const validToken = await this._tokenManager.ensureValidToken();
14957
- if (validToken) {
14958
- const authHeader = this._tokenManager.getAuthHeader();
14959
- if (authHeader) {
14960
- defaultHeaders.Authorization = authHeader;
14961
- }
14962
- }
14963
- } catch (error) {
14964
- console.warn(
14965
- "Token management failed, proceeding without authentication:",
14966
- error
14967
- );
14968
- }
14969
- } else if (this._requiresInit(options.methodName)) {
14970
- const { authToken } = this._context;
14971
- if (authToken) {
14972
- defaultHeaders.Authorization = `Bearer ${authToken}`;
14973
- }
14974
- }
14975
- try {
14976
- const response = await fetch(url2, {
14977
- ...options,
14978
- headers: {
14979
- ...defaultHeaders,
14980
- ...options.headers
14981
- }
14982
- });
14983
- if (!response.ok) {
14984
- let error = {
14985
- message: `HTTP ${response.status}: ${response.statusText}`
14986
- };
14987
- try {
14988
- error = await response.json();
14989
- } catch {
14990
- }
14991
- throw new Error(error.message || error.error || "Request failed");
14992
- }
14993
- return response.status === 204 ? null : response.json();
14994
- } catch (error) {
14995
- throw new Error(`Request failed: ${error.message}`);
14996
- }
14997
- }
14998
- _requiresInit(methodName) {
14999
- const noInitMethods = /* @__PURE__ */ new Set([
15000
- "register",
15001
- "login",
15002
- "googleAuth",
15003
- "googleAuthCallback",
15004
- "githubAuth",
15005
- "requestPasswordReset",
15006
- "confirmPasswordReset",
15007
- "confirmRegistration",
15008
- "verifyEmail"
15009
- ]);
15010
- return !noInitMethods.has(methodName);
15011
- }
15012
- _requireReady(methodName) {
15013
- if (this._requiresInit(methodName) && !this._initialized) {
15014
- throw new Error("Auth service not initialized");
15015
- }
15016
- }
14941
+ // Use BaseService.init/_request/_requireReady implementations
15017
14942
  // ==================== AUTH METHODS ====================
15018
14943
  async register(userData) {
15019
14944
  try {
@@ -15027,7 +14952,7 @@ var AuthService = class extends BaseService {
15027
14952
  }
15028
14953
  throw new Error(response.message);
15029
14954
  } catch (error) {
15030
- throw new Error(`Registration failed: ${error.message}`);
14955
+ throw new Error(`Registration failed: ${error.message}`, { cause: error });
15031
14956
  }
15032
14957
  }
15033
14958
  async login(email, password) {
@@ -15049,14 +14974,13 @@ var AuthService = class extends BaseService {
15049
14974
  if (this._tokenManager) {
15050
14975
  this._tokenManager.setTokens(tokenData);
15051
14976
  }
15052
- this.updateContext({ authToken: tokens.accessToken });
15053
14977
  }
15054
14978
  if (response.success) {
15055
14979
  return response.data;
15056
14980
  }
15057
14981
  throw new Error(response.message);
15058
14982
  } catch (error) {
15059
- throw new Error(`Login failed: ${error.message}`);
14983
+ throw new Error(`Login failed: ${error.message}`, { cause: error });
15060
14984
  }
15061
14985
  }
15062
14986
  async logout() {
@@ -15069,13 +14993,11 @@ var AuthService = class extends BaseService {
15069
14993
  if (this._tokenManager) {
15070
14994
  this._tokenManager.clearTokens();
15071
14995
  }
15072
- this.updateContext({ authToken: null });
15073
14996
  } catch (error) {
15074
14997
  if (this._tokenManager) {
15075
14998
  this._tokenManager.clearTokens();
15076
14999
  }
15077
- this.updateContext({ authToken: null });
15078
- throw new Error(`Logout failed: ${error.message}`);
15000
+ throw new Error(`Logout failed: ${error.message}`, { cause: error });
15079
15001
  }
15080
15002
  }
15081
15003
  async refreshToken(refreshToken) {
@@ -15090,7 +15012,7 @@ var AuthService = class extends BaseService {
15090
15012
  }
15091
15013
  throw new Error(response.message);
15092
15014
  } catch (error) {
15093
- throw new Error(`Token refresh failed: ${error.message}`);
15015
+ throw new Error(`Token refresh failed: ${error.message}`, { cause: error });
15094
15016
  }
15095
15017
  }
15096
15018
  async googleAuth(idToken, inviteToken = null) {
@@ -15116,14 +15038,13 @@ var AuthService = class extends BaseService {
15116
15038
  if (this._tokenManager) {
15117
15039
  this._tokenManager.setTokens(tokenData);
15118
15040
  }
15119
- this.updateContext({ authToken: tokens.accessToken });
15120
15041
  }
15121
15042
  if (response.success) {
15122
15043
  return response.data;
15123
15044
  }
15124
15045
  throw new Error(response.message);
15125
15046
  } catch (error) {
15126
- throw new Error(`Google auth failed: ${error.message}`);
15047
+ throw new Error(`Google auth failed: ${error.message}`, { cause: error });
15127
15048
  }
15128
15049
  }
15129
15050
  async githubAuth(code, inviteToken = null) {
@@ -15149,14 +15070,13 @@ var AuthService = class extends BaseService {
15149
15070
  if (this._tokenManager) {
15150
15071
  this._tokenManager.setTokens(tokenData);
15151
15072
  }
15152
- this.updateContext({ authToken: tokens.accessToken });
15153
15073
  }
15154
15074
  if (response.success) {
15155
15075
  return response.data;
15156
15076
  }
15157
15077
  throw new Error(response.message);
15158
15078
  } catch (error) {
15159
- throw new Error(`GitHub auth failed: ${error.message}`);
15079
+ throw new Error(`GitHub auth failed: ${error.message}`, { cause: error });
15160
15080
  }
15161
15081
  }
15162
15082
  async googleAuthCallback(code, redirectUri, inviteToken = null) {
@@ -15182,14 +15102,13 @@ var AuthService = class extends BaseService {
15182
15102
  if (this._tokenManager) {
15183
15103
  this._tokenManager.setTokens(tokenData);
15184
15104
  }
15185
- this.updateContext({ authToken: tokens.accessToken });
15186
15105
  }
15187
15106
  if (response.success) {
15188
15107
  return response.data;
15189
15108
  }
15190
15109
  throw new Error(response.message);
15191
15110
  } catch (error) {
15192
- throw new Error(`Google auth callback failed: ${error.message}`);
15111
+ throw new Error(`Google auth callback failed: ${error.message}`, { cause: error });
15193
15112
  }
15194
15113
  }
15195
15114
  async requestPasswordReset(email) {
@@ -15204,7 +15123,7 @@ var AuthService = class extends BaseService {
15204
15123
  }
15205
15124
  throw new Error(response.message);
15206
15125
  } catch (error) {
15207
- throw new Error(`Password reset request failed: ${error.message}`);
15126
+ throw new Error(`Password reset request failed: ${error.message}`, { cause: error });
15208
15127
  }
15209
15128
  }
15210
15129
  async confirmPasswordReset(token, password) {
@@ -15219,7 +15138,7 @@ var AuthService = class extends BaseService {
15219
15138
  }
15220
15139
  throw new Error(response.message);
15221
15140
  } catch (error) {
15222
- throw new Error(`Password reset confirmation failed: ${error.message}`);
15141
+ throw new Error(`Password reset confirmation failed: ${error.message}`, { cause: error });
15223
15142
  }
15224
15143
  }
15225
15144
  async confirmRegistration(token) {
@@ -15234,7 +15153,7 @@ var AuthService = class extends BaseService {
15234
15153
  }
15235
15154
  throw new Error(response.message);
15236
15155
  } catch (error) {
15237
- throw new Error(`Registration confirmation failed: ${error.message}`);
15156
+ throw new Error(`Registration confirmation failed: ${error.message}`, { cause: error });
15238
15157
  }
15239
15158
  }
15240
15159
  async requestPasswordChange() {
@@ -15249,7 +15168,7 @@ var AuthService = class extends BaseService {
15249
15168
  }
15250
15169
  throw new Error(response.message);
15251
15170
  } catch (error) {
15252
- throw new Error(`Password change request failed: ${error.message}`);
15171
+ throw new Error(`Password change request failed: ${error.message}`, { cause: error });
15253
15172
  }
15254
15173
  }
15255
15174
  async confirmPasswordChange(currentPassword, newPassword, code) {
@@ -15265,7 +15184,7 @@ var AuthService = class extends BaseService {
15265
15184
  }
15266
15185
  throw new Error(response.message);
15267
15186
  } catch (error) {
15268
- throw new Error(`Password change confirmation failed: ${error.message}`);
15187
+ throw new Error(`Password change confirmation failed: ${error.message}`, { cause: error });
15269
15188
  }
15270
15189
  }
15271
15190
  async getMe() {
@@ -15280,7 +15199,7 @@ var AuthService = class extends BaseService {
15280
15199
  }
15281
15200
  throw new Error(response.message);
15282
15201
  } catch (error) {
15283
- throw new Error(`Failed to get user profile: ${error.message}`);
15202
+ throw new Error(`Failed to get user profile: ${error.message}`, { cause: error });
15284
15203
  }
15285
15204
  }
15286
15205
  /**
@@ -15380,7 +15299,7 @@ var AuthService = class extends BaseService {
15380
15299
  }
15381
15300
  throw new Error(response.message);
15382
15301
  } catch (error) {
15383
- throw new Error(`Failed to get user profile: ${error.message}`);
15302
+ throw new Error(`Failed to get user profile: ${error.message}`, { cause: error });
15384
15303
  }
15385
15304
  }
15386
15305
  async updateUserProfile(profileData) {
@@ -15396,7 +15315,7 @@ var AuthService = class extends BaseService {
15396
15315
  }
15397
15316
  throw new Error(response.message);
15398
15317
  } catch (error) {
15399
- throw new Error(`Failed to update user profile: ${error.message}`);
15318
+ throw new Error(`Failed to update user profile: ${error.message}`, { cause: error });
15400
15319
  }
15401
15320
  }
15402
15321
  async getUserProjects() {
@@ -15419,7 +15338,7 @@ var AuthService = class extends BaseService {
15419
15338
  }
15420
15339
  throw new Error(response.message);
15421
15340
  } catch (error) {
15422
- throw new Error(`Failed to get user projects: ${error.message}`);
15341
+ throw new Error(`Failed to get user projects: ${error.message}`, { cause: error });
15423
15342
  }
15424
15343
  }
15425
15344
  async getUser(userId) {
@@ -15437,7 +15356,7 @@ var AuthService = class extends BaseService {
15437
15356
  }
15438
15357
  throw new Error(response.message);
15439
15358
  } catch (error) {
15440
- throw new Error(`Failed to get user: ${error.message}`);
15359
+ throw new Error(`Failed to get user: ${error.message}`, { cause: error });
15441
15360
  }
15442
15361
  }
15443
15362
  async getUserByEmail(email) {
@@ -15455,7 +15374,7 @@ var AuthService = class extends BaseService {
15455
15374
  }
15456
15375
  throw new Error(response.message);
15457
15376
  } catch (error) {
15458
- throw new Error(`Failed to get user by email: ${error.message}`);
15377
+ throw new Error(`Failed to get user by email: ${error.message}`, { cause: error });
15459
15378
  }
15460
15379
  }
15461
15380
  // ==================== PROJECT ROLE METHODS ====================
@@ -15468,6 +15387,9 @@ var AuthService = class extends BaseService {
15468
15387
  if (!projectId) {
15469
15388
  throw new Error("Project ID is required");
15470
15389
  }
15390
+ if (!this.hasValidTokens()) {
15391
+ return "guest";
15392
+ }
15471
15393
  const cacheKey = `role_${projectId}`;
15472
15394
  const cached = this._projectRoleCache.get(cacheKey);
15473
15395
  if (cached && Date.now() - cached.timestamp < this._roleCacheExpiry) {
@@ -15488,7 +15410,11 @@ var AuthService = class extends BaseService {
15488
15410
  }
15489
15411
  throw new Error(response.message);
15490
15412
  } catch (error) {
15491
- throw new Error(`Failed to get project role: ${error.message}`);
15413
+ const message = (error == null ? void 0 : error.message) || "";
15414
+ if (/401|403|unauthorized|no token|invalid token/iu.test(message)) {
15415
+ return "guest";
15416
+ }
15417
+ throw new Error(`Failed to get project role: ${message}`, { cause: error });
15492
15418
  }
15493
15419
  }
15494
15420
  /**
@@ -15500,6 +15426,9 @@ var AuthService = class extends BaseService {
15500
15426
  if (!projectKey) {
15501
15427
  throw new Error("Project key is required");
15502
15428
  }
15429
+ if (!this.hasValidTokens()) {
15430
+ return "guest";
15431
+ }
15503
15432
  const cacheKey = `role_key_${projectKey}`;
15504
15433
  const cached = this._projectRoleCache.get(cacheKey);
15505
15434
  if (cached && Date.now() - cached.timestamp < this._roleCacheExpiry) {
@@ -15520,7 +15449,11 @@ var AuthService = class extends BaseService {
15520
15449
  }
15521
15450
  throw new Error(response.message);
15522
15451
  } catch (error) {
15523
- throw new Error(`Failed to get project role by key: ${error.message}`);
15452
+ const message = (error == null ? void 0 : error.message) || "";
15453
+ if (/401|403|unauthorized|no token|invalid token/iu.test(message)) {
15454
+ return "guest";
15455
+ }
15456
+ throw new Error(`Failed to get project role by key: ${message}`, { cause: error });
15524
15457
  }
15525
15458
  }
15526
15459
  /**
@@ -15623,7 +15556,7 @@ var AuthService = class extends BaseService {
15623
15556
  try {
15624
15557
  return await this.getMe();
15625
15558
  } catch (error) {
15626
- throw new Error(`Failed to get current user: ${error.message}`);
15559
+ throw new Error(`Failed to get current user: ${error.message}`, { cause: error });
15627
15560
  }
15628
15561
  }
15629
15562
  /**
@@ -15780,7 +15713,6 @@ var AuthService = class extends BaseService {
15780
15713
  this._tokenManager = null;
15781
15714
  }
15782
15715
  this._projectRoleCache.clear();
15783
- this._initialized = false;
15784
15716
  this._setReady(false);
15785
15717
  }
15786
15718
  };
@@ -15933,11 +15865,11 @@ var CoreService = class extends BaseService {
15933
15865
  error = await response.json();
15934
15866
  } catch {
15935
15867
  }
15936
- throw new Error(error.message || error.error || "Request failed");
15868
+ throw new Error(error.message || error.error || "Request failed", { cause: error });
15937
15869
  }
15938
15870
  return response.status === 204 ? null : response.json();
15939
15871
  } catch (error) {
15940
- throw new Error(`Request failed: ${error.message}`);
15872
+ throw new Error(`Request failed: ${error.message}`, { cause: error });
15941
15873
  }
15942
15874
  }
15943
15875
  // ==================== AUTH METHODS ====================
@@ -15953,7 +15885,7 @@ var CoreService = class extends BaseService {
15953
15885
  }
15954
15886
  throw new Error(response.message);
15955
15887
  } catch (error) {
15956
- throw new Error(`Registration failed: ${error.message}`);
15888
+ throw new Error(`Registration failed: ${error.message}`, { cause: error });
15957
15889
  }
15958
15890
  }
15959
15891
  async login(email, password) {
@@ -15982,7 +15914,7 @@ var CoreService = class extends BaseService {
15982
15914
  }
15983
15915
  throw new Error(response.message);
15984
15916
  } catch (error) {
15985
- throw new Error(`Login failed: ${error.message}`);
15917
+ throw new Error(`Login failed: ${error.message}`, { cause: error });
15986
15918
  }
15987
15919
  }
15988
15920
  async logout() {
@@ -16001,7 +15933,7 @@ var CoreService = class extends BaseService {
16001
15933
  this._tokenManager.clearTokens();
16002
15934
  }
16003
15935
  this.updateContext({ authToken: null });
16004
- throw new Error(`Logout failed: ${error.message}`);
15936
+ throw new Error(`Logout failed: ${error.message}`, { cause: error });
16005
15937
  }
16006
15938
  }
16007
15939
  async refreshToken(refreshToken) {
@@ -16016,7 +15948,7 @@ var CoreService = class extends BaseService {
16016
15948
  }
16017
15949
  throw new Error(response.message);
16018
15950
  } catch (error) {
16019
- throw new Error(`Token refresh failed: ${error.message}`);
15951
+ throw new Error(`Token refresh failed: ${error.message}`, { cause: error });
16020
15952
  }
16021
15953
  }
16022
15954
  async googleAuth(idToken, inviteToken = null) {
@@ -16049,7 +15981,7 @@ var CoreService = class extends BaseService {
16049
15981
  }
16050
15982
  throw new Error(response.message);
16051
15983
  } catch (error) {
16052
- throw new Error(`Google auth failed: ${error.message}`);
15984
+ throw new Error(`Google auth failed: ${error.message}`, { cause: error });
16053
15985
  }
16054
15986
  }
16055
15987
  async githubAuth(code, inviteToken = null) {
@@ -16082,7 +16014,7 @@ var CoreService = class extends BaseService {
16082
16014
  }
16083
16015
  throw new Error(response.message);
16084
16016
  } catch (error) {
16085
- throw new Error(`GitHub auth failed: ${error.message}`);
16017
+ throw new Error(`GitHub auth failed: ${error.message}`, { cause: error });
16086
16018
  }
16087
16019
  }
16088
16020
  async googleAuthCallback(code, redirectUri, inviteToken = null) {
@@ -16115,7 +16047,7 @@ var CoreService = class extends BaseService {
16115
16047
  }
16116
16048
  throw new Error(response.message);
16117
16049
  } catch (error) {
16118
- throw new Error(`Google auth callback failed: ${error.message}`);
16050
+ throw new Error(`Google auth callback failed: ${error.message}`, { cause: error });
16119
16051
  }
16120
16052
  }
16121
16053
  async requestPasswordReset(email) {
@@ -16130,7 +16062,7 @@ var CoreService = class extends BaseService {
16130
16062
  }
16131
16063
  throw new Error(response.message);
16132
16064
  } catch (error) {
16133
- throw new Error(`Password reset request failed: ${error.message}`);
16065
+ throw new Error(`Password reset request failed: ${error.message}`, { cause: error });
16134
16066
  }
16135
16067
  }
16136
16068
  async confirmPasswordReset(token, password) {
@@ -16145,7 +16077,7 @@ var CoreService = class extends BaseService {
16145
16077
  }
16146
16078
  throw new Error(response.message);
16147
16079
  } catch (error) {
16148
- throw new Error(`Password reset confirmation failed: ${error.message}`);
16080
+ throw new Error(`Password reset confirmation failed: ${error.message}`, { cause: error });
16149
16081
  }
16150
16082
  }
16151
16083
  async confirmRegistration(token) {
@@ -16160,7 +16092,7 @@ var CoreService = class extends BaseService {
16160
16092
  }
16161
16093
  throw new Error(response.message);
16162
16094
  } catch (error) {
16163
- throw new Error(`Registration confirmation failed: ${error.message}`);
16095
+ throw new Error(`Registration confirmation failed: ${error.message}`, { cause: error });
16164
16096
  }
16165
16097
  }
16166
16098
  async requestPasswordChange() {
@@ -16175,7 +16107,7 @@ var CoreService = class extends BaseService {
16175
16107
  }
16176
16108
  throw new Error(response.message);
16177
16109
  } catch (error) {
16178
- throw new Error(`Password change request failed: ${error.message}`);
16110
+ throw new Error(`Password change request failed: ${error.message}`, { cause: error });
16179
16111
  }
16180
16112
  }
16181
16113
  async confirmPasswordChange(currentPassword, newPassword, code) {
@@ -16191,7 +16123,7 @@ var CoreService = class extends BaseService {
16191
16123
  }
16192
16124
  throw new Error(response.message);
16193
16125
  } catch (error) {
16194
- throw new Error(`Password change confirmation failed: ${error.message}`);
16126
+ throw new Error(`Password change confirmation failed: ${error.message}`, { cause: error });
16195
16127
  }
16196
16128
  }
16197
16129
  async getMe() {
@@ -16206,7 +16138,7 @@ var CoreService = class extends BaseService {
16206
16138
  }
16207
16139
  throw new Error(response.message);
16208
16140
  } catch (error) {
16209
- throw new Error(`Failed to get user profile: ${error.message}`);
16141
+ throw new Error(`Failed to get user profile: ${error.message}`, { cause: error });
16210
16142
  }
16211
16143
  }
16212
16144
  /**
@@ -16322,7 +16254,7 @@ var CoreService = class extends BaseService {
16322
16254
  }
16323
16255
  throw new Error(response.message);
16324
16256
  } catch (error) {
16325
- throw new Error(`Failed to update user profile: ${error.message}`);
16257
+ throw new Error(`Failed to update user profile: ${error.message}`, { cause: error });
16326
16258
  }
16327
16259
  }
16328
16260
  async getUserProjects() {
@@ -16345,7 +16277,7 @@ var CoreService = class extends BaseService {
16345
16277
  }
16346
16278
  throw new Error(response.message);
16347
16279
  } catch (error) {
16348
- throw new Error(`Failed to get user projects: ${error.message}`);
16280
+ throw new Error(`Failed to get user projects: ${error.message}`, { cause: error });
16349
16281
  }
16350
16282
  }
16351
16283
  async getUser(userId) {
@@ -16363,7 +16295,7 @@ var CoreService = class extends BaseService {
16363
16295
  }
16364
16296
  throw new Error(response.message);
16365
16297
  } catch (error) {
16366
- throw new Error(`Failed to get user: ${error.message}`);
16298
+ throw new Error(`Failed to get user: ${error.message}`, { cause: error });
16367
16299
  }
16368
16300
  }
16369
16301
  async getUserByEmail(email) {
@@ -16381,7 +16313,7 @@ var CoreService = class extends BaseService {
16381
16313
  }
16382
16314
  throw new Error(response.message);
16383
16315
  } catch (error) {
16384
- throw new Error(`Failed to get user by email: ${error.message}`);
16316
+ throw new Error(`Failed to get user by email: ${error.message}`, { cause: error });
16385
16317
  }
16386
16318
  }
16387
16319
  // ==================== PROJECT METHODS ====================
@@ -21953,12 +21885,54 @@ function isPlainObject(o) {
21953
21885
  return o && typeof o === "object" && !Array.isArray(o);
21954
21886
  }
21955
21887
  function deepEqual(a, b) {
21956
- try {
21957
- return JSON.stringify(a) === JSON.stringify(b);
21958
- } catch (err) {
21959
- console.warn("deepEqual error", err);
21888
+ if (Object.is(a, b)) {
21889
+ return true;
21890
+ }
21891
+ if (typeof a === "function" && typeof b === "function") {
21892
+ try {
21893
+ return a.toString() === b.toString();
21894
+ } catch {
21895
+ return false;
21896
+ }
21897
+ }
21898
+ if (typeof a === "function" || typeof b === "function") {
21960
21899
  return false;
21961
21900
  }
21901
+ if (a instanceof Date && b instanceof Date) {
21902
+ return a.getTime() === b.getTime();
21903
+ }
21904
+ if (a instanceof RegExp && b instanceof RegExp) {
21905
+ return String(a) === String(b);
21906
+ }
21907
+ if (Array.isArray(a) && Array.isArray(b)) {
21908
+ if (a.length !== b.length) {
21909
+ return false;
21910
+ }
21911
+ for (let i = 0; i < a.length; i++) {
21912
+ if (!deepEqual(a[i], b[i])) {
21913
+ return false;
21914
+ }
21915
+ }
21916
+ return true;
21917
+ }
21918
+ if (a && b && typeof a === "object" && typeof b === "object") {
21919
+ const aKeys = Object.keys(a);
21920
+ const bKeys = Object.keys(b);
21921
+ if (aKeys.length !== bKeys.length) {
21922
+ return false;
21923
+ }
21924
+ for (let i = 0; i < aKeys.length; i++) {
21925
+ const key = aKeys[i];
21926
+ if (!Object.hasOwn(b, key)) {
21927
+ return false;
21928
+ }
21929
+ if (!deepEqual(a[key], b[key])) {
21930
+ return false;
21931
+ }
21932
+ }
21933
+ return true;
21934
+ }
21935
+ return false;
21962
21936
  }
21963
21937
  function getRootMap(ydoc) {
21964
21938
  return ydoc.getMap("root");
@@ -28337,86 +28311,452 @@ var validateParams = {
28337
28311
  };
28338
28312
 
28339
28313
  // src/services/CollabService.js
28340
- import { deepStringify } from "@domql/utils";
28341
- var CollabService = class extends BaseService {
28342
- constructor(config) {
28343
- super(config);
28344
- this._client = null;
28345
- this._stateManager = null;
28346
- this._connected = false;
28347
- this._undoStack = [];
28348
- this._redoStack = [];
28349
- this._isUndoRedo = false;
28350
- this._pendingOps = [];
28314
+ import { deepStringifyFunctions } from "@domql/utils";
28315
+
28316
+ // src/utils/ordering.js
28317
+ function isObjectLike(val) {
28318
+ return val && typeof val === "object" && !Array.isArray(val);
28319
+ }
28320
+ function normalizePath(path) {
28321
+ if (Array.isArray(path)) {
28322
+ return path;
28351
28323
  }
28352
- init({ context }) {
28353
- if (context == null ? void 0 : context.state) {
28354
- try {
28355
- this._stateManager = new RootStateManager(context.state);
28356
- } catch (err) {
28357
- this._setError(err);
28358
- throw err;
28359
- }
28360
- }
28361
- this._setReady();
28324
+ if (typeof path === "string") {
28325
+ return [path];
28362
28326
  }
28363
- /**
28364
- * Overridden to re-initialise the state manager once the root state becomes
28365
- * available via a subsequent SDK `updateContext()` call.
28366
- */
28367
- updateContext(context = {}) {
28368
- super.updateContext(context);
28369
- if (context.state) {
28370
- this._stateManager = new RootStateManager(context.state);
28327
+ return [];
28328
+ }
28329
+ function getParentPathsFromTuples(tuples = []) {
28330
+ const seen = /* @__PURE__ */ new Set();
28331
+ const parents = [];
28332
+ const META_KEYS = /* @__PURE__ */ new Set([
28333
+ "style",
28334
+ "class",
28335
+ "text",
28336
+ "html",
28337
+ "content",
28338
+ "data",
28339
+ "attr",
28340
+ "state",
28341
+ "scope",
28342
+ "define",
28343
+ "on",
28344
+ "extend",
28345
+ "extends",
28346
+ "childExtend",
28347
+ "childExtends",
28348
+ "children",
28349
+ "component",
28350
+ "context",
28351
+ "tag",
28352
+ "key",
28353
+ "__order",
28354
+ "if"
28355
+ ]);
28356
+ for (let i = 0; i < tuples.length; i++) {
28357
+ const tuple = tuples[i];
28358
+ if (!Array.isArray(tuple) || tuple.length < 2) {
28359
+ continue;
28371
28360
  }
28372
- }
28373
- /**
28374
- * Ensure that the state manager exists. This is called right before any
28375
- * operation that requires access to the root state (e.g. `connect()`).
28376
- * Throws an explicit error if the root state is still missing so that the
28377
- * caller can react accordingly.
28378
- */
28379
- _ensureStateManager() {
28380
- var _a, _b;
28381
- if (!this._stateManager) {
28382
- if (!((_a = this._context) == null ? void 0 : _a.state)) {
28383
- throw new Error("[CollabService] Cannot operate without root state");
28361
+ const path = normalizePath(tuple[1]);
28362
+ if (!path.length) {
28363
+ continue;
28364
+ }
28365
+ if (path[0] === "schema") {
28366
+ continue;
28367
+ }
28368
+ const immediateParent = path.slice(0, -1);
28369
+ if (immediateParent.length) {
28370
+ const key = JSON.stringify(immediateParent);
28371
+ if (!seen.has(key)) {
28372
+ seen.add(key);
28373
+ parents.push(immediateParent);
28384
28374
  }
28385
- this._stateManager = new RootStateManager(this._context.state);
28386
28375
  }
28387
- const root = (_b = this._stateManager) == null ? void 0 : _b.root;
28388
- if (root && !root.__element) {
28389
- root.__element = {
28390
- /**
28391
- * Very small subset of the DOMQL `call` API that we rely on inside the
28392
- * CollabService for browser notifications and data helpers.
28393
- * In a Node.js test context we simply log or return fallbacks.
28394
- */
28395
- call: (method, ...args2) => {
28396
- switch (method) {
28397
- case "openNotification": {
28398
- const [payload = {}] = args2;
28399
- const { type = "info", title = "", message = "" } = payload;
28400
- const logger = type === "error" ? console.error : console.log;
28401
- logger(`[Notification] ${title}${message ? ` \u2013 ${message}` : ""}`);
28402
- return;
28403
- }
28404
- case "deepStringify": {
28405
- return deepStringify(...args2);
28406
- }
28407
- default:
28408
- return {};
28409
- }
28376
+ const last2 = path[path.length - 1];
28377
+ if (META_KEYS.has(last2) && path.length >= 2) {
28378
+ const containerParent = path.slice(0, -2);
28379
+ if (containerParent.length) {
28380
+ const key2 = JSON.stringify(containerParent);
28381
+ if (!seen.has(key2)) {
28382
+ seen.add(key2);
28383
+ parents.push(containerParent);
28410
28384
  }
28411
- };
28385
+ }
28386
+ }
28387
+ for (let j = 0; j < path.length; j++) {
28388
+ const seg = path[j];
28389
+ if (!META_KEYS.has(seg)) {
28390
+ continue;
28391
+ }
28392
+ const containerParent2 = path.slice(0, j);
28393
+ if (!containerParent2.length) {
28394
+ continue;
28395
+ }
28396
+ const key3 = JSON.stringify(containerParent2);
28397
+ if (!seen.has(key3)) {
28398
+ seen.add(key3);
28399
+ parents.push(containerParent2);
28400
+ }
28412
28401
  }
28413
28402
  }
28414
- /* ---------- Connection Management ---------- */
28415
- async connect(options = {}) {
28416
- var _a, _b, _c, _d, _e, _f;
28417
- this._ensureStateManager();
28418
- const {
28419
- authToken: jwt,
28403
+ return parents;
28404
+ }
28405
+ function computeOrdersFromState(root, parentPaths = []) {
28406
+ if (!root || typeof root.getByPath !== "function") {
28407
+ return [];
28408
+ }
28409
+ const orders = [];
28410
+ const EXCLUDE_KEYS = /* @__PURE__ */ new Set(["__order"]);
28411
+ for (let i = 0; i < parentPaths.length; i++) {
28412
+ const parentPath = parentPaths[i];
28413
+ const obj = (() => {
28414
+ try {
28415
+ return root.getByPath(parentPath);
28416
+ } catch {
28417
+ return null;
28418
+ }
28419
+ })();
28420
+ if (!isObjectLike(obj)) {
28421
+ continue;
28422
+ }
28423
+ const keys2 = Object.keys(obj).filter((k) => !EXCLUDE_KEYS.has(k));
28424
+ orders.push({ path: parentPath, keys: keys2 });
28425
+ }
28426
+ return orders;
28427
+ }
28428
+ function normaliseSchemaCode(code) {
28429
+ if (typeof code !== "string" || !code.length) {
28430
+ return "";
28431
+ }
28432
+ return code.replaceAll("/////n", "\n").replaceAll("/////tilde", "`");
28433
+ }
28434
+ function parseExportedObject(code) {
28435
+ const src = normaliseSchemaCode(code);
28436
+ if (!src) {
28437
+ return null;
28438
+ }
28439
+ const body = src.replace(/^\s*export\s+default\s*/u, "return ");
28440
+ try {
28441
+ return new Function(body)();
28442
+ } catch {
28443
+ return null;
28444
+ }
28445
+ }
28446
+ function extractTopLevelKeysFromCode(code) {
28447
+ const obj = parseExportedObject(code);
28448
+ if (!obj || typeof obj !== "object") {
28449
+ return [];
28450
+ }
28451
+ return Object.keys(obj);
28452
+ }
28453
+ function computeOrdersForTuples(root, tuples = []) {
28454
+ const pendingChildrenByContainer = /* @__PURE__ */ new Map();
28455
+ for (let i = 0; i < tuples.length; i++) {
28456
+ const t = tuples[i];
28457
+ if (!Array.isArray(t)) {
28458
+ continue;
28459
+ }
28460
+ const [action, path] = t;
28461
+ const p = normalizePath(path);
28462
+ if (!Array.isArray(p) || p.length < 3) {
28463
+ continue;
28464
+ }
28465
+ if (p[0] === "schema") {
28466
+ continue;
28467
+ }
28468
+ const [typeName, containerKey, childKey] = p;
28469
+ const containerPath = [typeName, containerKey];
28470
+ const key = JSON.stringify(containerPath);
28471
+ if (!pendingChildrenByContainer.has(key)) {
28472
+ pendingChildrenByContainer.set(key, /* @__PURE__ */ new Set());
28473
+ }
28474
+ if (action === "update" || action === "set") {
28475
+ pendingChildrenByContainer.get(key).add(childKey);
28476
+ }
28477
+ }
28478
+ const preferredOrderMap = /* @__PURE__ */ new Map();
28479
+ for (let i = 0; i < tuples.length; i++) {
28480
+ const t = tuples[i];
28481
+ if (!Array.isArray(t)) {
28482
+ continue;
28483
+ }
28484
+ const [action, path, value2] = t;
28485
+ const p = normalizePath(path);
28486
+ if (action !== "update" || !Array.isArray(p) || p.length < 3) {
28487
+ continue;
28488
+ }
28489
+ if (p[0] !== "schema") {
28490
+ continue;
28491
+ }
28492
+ const [, type, key] = p;
28493
+ const containerPath = [type, key];
28494
+ const uses = value2 && Array.isArray(value2.uses) ? value2.uses : null;
28495
+ const code = value2 && value2.code;
28496
+ const obj = (() => {
28497
+ try {
28498
+ return root && typeof root.getByPath === "function" ? root.getByPath(containerPath) : null;
28499
+ } catch {
28500
+ return null;
28501
+ }
28502
+ })();
28503
+ if (!obj) {
28504
+ continue;
28505
+ }
28506
+ const present = new Set(Object.keys(obj));
28507
+ const EXCLUDE_KEYS = /* @__PURE__ */ new Set(["__order"]);
28508
+ const codeKeys = extractTopLevelKeysFromCode(code);
28509
+ let resolved = [];
28510
+ const pendingKey = JSON.stringify(containerPath);
28511
+ const pendingChildren = pendingChildrenByContainer.get(pendingKey) || /* @__PURE__ */ new Set();
28512
+ const eligible = /* @__PURE__ */ new Set([...present, ...pendingChildren]);
28513
+ if (Array.isArray(codeKeys) && codeKeys.length) {
28514
+ resolved = codeKeys.filter((k) => eligible.has(k) && !EXCLUDE_KEYS.has(k));
28515
+ }
28516
+ if (Array.isArray(uses) && uses.length) {
28517
+ for (let u = 0; u < uses.length; u++) {
28518
+ const keyName = uses[u];
28519
+ if (eligible.has(keyName) && !EXCLUDE_KEYS.has(keyName) && !resolved.includes(keyName)) {
28520
+ resolved.push(keyName);
28521
+ }
28522
+ }
28523
+ }
28524
+ if (pendingChildren.size) {
28525
+ for (const child of pendingChildren) {
28526
+ if (!EXCLUDE_KEYS.has(child) && !resolved.includes(child)) {
28527
+ resolved.push(child);
28528
+ }
28529
+ }
28530
+ }
28531
+ if (resolved.length) {
28532
+ preferredOrderMap.set(JSON.stringify(containerPath), { path: containerPath, keys: resolved });
28533
+ }
28534
+ }
28535
+ const parents = getParentPathsFromTuples(tuples);
28536
+ const orders = [];
28537
+ const seen = /* @__PURE__ */ new Set();
28538
+ preferredOrderMap.forEach((v) => {
28539
+ const k = JSON.stringify(v.path);
28540
+ if (!seen.has(k)) {
28541
+ seen.add(k);
28542
+ orders.push(v);
28543
+ }
28544
+ });
28545
+ const fallbackOrders = computeOrdersFromState(root, parents);
28546
+ for (let i = 0; i < fallbackOrders.length; i++) {
28547
+ const v = fallbackOrders[i];
28548
+ const k = JSON.stringify(v.path);
28549
+ if (seen.has(k)) {
28550
+ continue;
28551
+ }
28552
+ const pending = pendingChildrenByContainer.get(k);
28553
+ if (pending && pending.size) {
28554
+ const existing = new Set(v.keys);
28555
+ for (const child of pending) {
28556
+ if (existing.has(child)) {
28557
+ continue;
28558
+ }
28559
+ v.keys.push(child);
28560
+ }
28561
+ }
28562
+ seen.add(k);
28563
+ orders.push(v);
28564
+ }
28565
+ return orders;
28566
+ }
28567
+
28568
+ // src/utils/changePreprocessor.js
28569
+ function isPlainObject2(val) {
28570
+ return val && typeof val === "object" && !Array.isArray(val);
28571
+ }
28572
+ function getByPathSafe(root, path) {
28573
+ if (!root || typeof root.getByPath !== "function") {
28574
+ return null;
28575
+ }
28576
+ try {
28577
+ return root.getByPath(path);
28578
+ } catch {
28579
+ return null;
28580
+ }
28581
+ }
28582
+ function preprocessChanges(root, tuples = [], options = {}) {
28583
+ const expandTuple = (t) => {
28584
+ const [action, path, value2] = t || [];
28585
+ const isSchemaPath = Array.isArray(path) && path[0] === "schema";
28586
+ if (action === "delete") {
28587
+ return [t];
28588
+ }
28589
+ const canConsiderExpansion = action === "update" && Array.isArray(path) && (path.length === 1 || path.length === 2 || isSchemaPath && path.length === 3) && isPlainObject2(value2);
28590
+ if (!canConsiderExpansion) {
28591
+ return [t];
28592
+ }
28593
+ const prev = getByPathSafe(root, path) || {};
28594
+ const next = value2 || {};
28595
+ if (!isPlainObject2(prev) || !isPlainObject2(next)) {
28596
+ return [t];
28597
+ }
28598
+ const ops = diffJson(prev, next, []);
28599
+ if (!ops.length) {
28600
+ return [t];
28601
+ }
28602
+ const out = [];
28603
+ for (let i = 0; i < ops.length; i++) {
28604
+ const op = ops[i];
28605
+ const fullPath = [...path, ...op.path];
28606
+ const last2 = fullPath[fullPath.length - 1];
28607
+ if (op.action === "set") {
28608
+ out.push(["update", fullPath, op.value]);
28609
+ } else if (op.action === "del") {
28610
+ if (last2 !== "__order") {
28611
+ out.push(["delete", fullPath]);
28612
+ }
28613
+ }
28614
+ }
28615
+ return out;
28616
+ };
28617
+ const minimizeTuples = (input) => {
28618
+ const out = [];
28619
+ const seen2 = /* @__PURE__ */ new Set();
28620
+ for (let i = 0; i < input.length; i++) {
28621
+ const expanded = expandTuple(input[i]);
28622
+ for (let k = 0; k < expanded.length; k++) {
28623
+ const tuple = expanded[k];
28624
+ const isDelete = Array.isArray(tuple) && tuple[0] === "delete";
28625
+ const isOrderKey = isDelete && Array.isArray(tuple[1]) && tuple[1][tuple[1].length - 1] === "__order";
28626
+ if (!isOrderKey) {
28627
+ const key = JSON.stringify(tuple);
28628
+ if (!seen2.has(key)) {
28629
+ seen2.add(key);
28630
+ out.push(tuple);
28631
+ }
28632
+ }
28633
+ }
28634
+ }
28635
+ return out;
28636
+ };
28637
+ const granularChanges = (() => {
28638
+ try {
28639
+ const res = minimizeTuples(tuples);
28640
+ if (options.append && options.append.length) {
28641
+ res.push(...options.append);
28642
+ }
28643
+ return res;
28644
+ } catch {
28645
+ return Array.isArray(tuples) ? tuples.slice() : [];
28646
+ }
28647
+ })();
28648
+ const baseOrders = computeOrdersForTuples(root, granularChanges);
28649
+ const preferOrdersMap = /* @__PURE__ */ new Map();
28650
+ for (let i = 0; i < tuples.length; i++) {
28651
+ const t = tuples[i];
28652
+ if (!Array.isArray(t) || t.length < 3) {
28653
+ continue;
28654
+ }
28655
+ const [action, path, value2] = t;
28656
+ if (action !== "update" || !Array.isArray(path) || path.length !== 1 && path.length !== 2 || !isPlainObject2(value2)) {
28657
+ continue;
28658
+ }
28659
+ const keys2 = Object.keys(value2).filter((k) => k !== "__order");
28660
+ const key = JSON.stringify(path);
28661
+ preferOrdersMap.set(key, { path, keys: keys2 });
28662
+ }
28663
+ const mergedOrders = [];
28664
+ const seen = /* @__PURE__ */ new Set();
28665
+ preferOrdersMap.forEach((v, k) => {
28666
+ seen.add(k);
28667
+ mergedOrders.push(v);
28668
+ });
28669
+ for (let i = 0; i < baseOrders.length; i++) {
28670
+ const v = baseOrders[i];
28671
+ const k = JSON.stringify(v.path);
28672
+ if (!seen.has(k)) {
28673
+ seen.add(k);
28674
+ mergedOrders.push(v);
28675
+ }
28676
+ }
28677
+ return { granularChanges, orders: mergedOrders };
28678
+ }
28679
+
28680
+ // src/services/CollabService.js
28681
+ var CollabService = class extends BaseService {
28682
+ constructor(config) {
28683
+ super(config);
28684
+ this._client = null;
28685
+ this._stateManager = null;
28686
+ this._connected = false;
28687
+ this._undoStack = [];
28688
+ this._redoStack = [];
28689
+ this._isUndoRedo = false;
28690
+ this._pendingOps = [];
28691
+ }
28692
+ init({ context }) {
28693
+ if (context == null ? void 0 : context.state) {
28694
+ try {
28695
+ this._stateManager = new RootStateManager(context.state);
28696
+ } catch (err) {
28697
+ this._setError(err);
28698
+ throw err;
28699
+ }
28700
+ }
28701
+ this._setReady();
28702
+ }
28703
+ /**
28704
+ * Overridden to re-initialise the state manager once the root state becomes
28705
+ * available via a subsequent SDK `updateContext()` call.
28706
+ */
28707
+ updateContext(context = {}) {
28708
+ super.updateContext(context);
28709
+ if (context.state) {
28710
+ this._stateManager = new RootStateManager(context.state);
28711
+ }
28712
+ }
28713
+ /**
28714
+ * Ensure that the state manager exists. This is called right before any
28715
+ * operation that requires access to the root state (e.g. `connect()`).
28716
+ * Throws an explicit error if the root state is still missing so that the
28717
+ * caller can react accordingly.
28718
+ */
28719
+ _ensureStateManager() {
28720
+ var _a, _b;
28721
+ if (!this._stateManager) {
28722
+ if (!((_a = this._context) == null ? void 0 : _a.state)) {
28723
+ throw new Error("[CollabService] Cannot operate without root state");
28724
+ }
28725
+ this._stateManager = new RootStateManager(this._context.state);
28726
+ }
28727
+ const root = (_b = this._stateManager) == null ? void 0 : _b.root;
28728
+ if (root && !root.__element) {
28729
+ root.__element = {
28730
+ /**
28731
+ * Very small subset of the DOMQL `call` API that we rely on inside the
28732
+ * CollabService for browser notifications and data helpers.
28733
+ * In a Node.js test context we simply log or return fallbacks.
28734
+ */
28735
+ call: (method, ...args2) => {
28736
+ switch (method) {
28737
+ case "openNotification": {
28738
+ const [payload = {}] = args2;
28739
+ const { type = "info", title = "", message = "" } = payload;
28740
+ const logger = type === "error" ? console.error : console.log;
28741
+ logger(`[Notification] ${title}${message ? ` \u2013 ${message}` : ""}`);
28742
+ return;
28743
+ }
28744
+ case "deepStringifyFunctions": {
28745
+ return deepStringifyFunctions(...args2);
28746
+ }
28747
+ default:
28748
+ return {};
28749
+ }
28750
+ }
28751
+ };
28752
+ }
28753
+ }
28754
+ /* ---------- Connection Management ---------- */
28755
+ async connect(options = {}) {
28756
+ var _a, _b, _c, _d, _e, _f;
28757
+ this._ensureStateManager();
28758
+ const {
28759
+ authToken: jwt,
28420
28760
  projectId,
28421
28761
  branch = "main",
28422
28762
  pro
@@ -28437,57 +28777,49 @@ var CollabService = class extends BaseService {
28437
28777
  if (this._client) {
28438
28778
  await this.disconnect();
28439
28779
  }
28440
- try {
28441
- this._client = new CollabClient({
28442
- jwt,
28443
- projectId,
28444
- branch,
28445
- live: Boolean(pro)
28446
- });
28447
- await new Promise((resolve) => {
28448
- var _a2, _b2;
28449
- if ((_a2 = this._client.socket) == null ? void 0 : _a2.connected) {
28450
- resolve();
28451
- } else {
28452
- (_b2 = this._client.socket) == null ? void 0 : _b2.once("connect", resolve);
28453
- }
28454
- });
28455
- console.log("[CollabService] socket connected");
28456
- (_b = this._client.socket) == null ? void 0 : _b.on("ops", ({ changes }) => {
28457
- console.log(`ops event`);
28458
- console.log(changes);
28459
- this._stateManager.applyChanges(changes, { fromSocket: true });
28460
- });
28461
- (_c = this._client.socket) == null ? void 0 : _c.on("commit", ({ version: version2 }) => {
28462
- if (version2) {
28463
- this._stateManager.setVersion(version2);
28464
- }
28465
- rootBus.emit("checkpoint:done", { version: version2, origin: "auto" });
28466
- });
28467
- (_d = this._client.socket) == null ? void 0 : _d.on("clients", this._handleClientsEvent.bind(this));
28468
- (_e = this._client.socket) == null ? void 0 : _e.on(
28469
- "bundle:done",
28470
- this._handleBundleDoneEvent.bind(this)
28471
- );
28472
- (_f = this._client.socket) == null ? void 0 : _f.on(
28473
- "bundle:error",
28474
- this._handleBundleErrorEvent.bind(this)
28475
- );
28476
- if (this._pendingOps.length) {
28477
- console.log(
28478
- `[CollabService] Flushing ${this._pendingOps.length} offline operation batch(es)`
28479
- );
28480
- this._pendingOps.forEach(({ tuples }) => {
28481
- this.socket.emit("ops", { changes: tuples, ts: Date.now() });
28482
- });
28483
- this._pendingOps.length = 0;
28780
+ this._client = new CollabClient({
28781
+ jwt,
28782
+ projectId,
28783
+ branch,
28784
+ live: Boolean(pro)
28785
+ });
28786
+ await new Promise((resolve) => {
28787
+ var _a2, _b2;
28788
+ if ((_a2 = this._client.socket) == null ? void 0 : _a2.connected) {
28789
+ resolve();
28790
+ } else {
28791
+ (_b2 = this._client.socket) == null ? void 0 : _b2.once("connect", resolve);
28484
28792
  }
28485
- this._connected = true;
28486
- console.log("[CollabService] Connected to project:", projectId);
28487
- } catch (err) {
28488
- console.error("[CollabService] Connection failed:", err);
28489
- throw err;
28793
+ });
28794
+ (_b = this._client.socket) == null ? void 0 : _b.on("ops", ({ changes }) => {
28795
+ console.log(`ops event`);
28796
+ this._stateManager.applyChanges(changes, { fromSocket: true });
28797
+ });
28798
+ (_c = this._client.socket) == null ? void 0 : _c.on("commit", ({ version: version2 }) => {
28799
+ if (version2) {
28800
+ this._stateManager.setVersion(version2);
28801
+ }
28802
+ rootBus.emit("checkpoint:done", { version: version2, origin: "auto" });
28803
+ });
28804
+ (_d = this._client.socket) == null ? void 0 : _d.on("clients", this._handleClientsEvent.bind(this));
28805
+ (_e = this._client.socket) == null ? void 0 : _e.on(
28806
+ "bundle:done",
28807
+ this._handleBundleDoneEvent.bind(this)
28808
+ );
28809
+ (_f = this._client.socket) == null ? void 0 : _f.on(
28810
+ "bundle:error",
28811
+ this._handleBundleErrorEvent.bind(this)
28812
+ );
28813
+ if (this._pendingOps.length) {
28814
+ console.log(
28815
+ `[CollabService] Flushing ${this._pendingOps.length} offline operation batch(es)`
28816
+ );
28817
+ this._pendingOps.forEach(({ changes, granularChanges, orders }) => {
28818
+ this.socket.emit("ops", { changes, granularChanges, orders, ts: Date.now() });
28819
+ });
28820
+ this._pendingOps.length = 0;
28490
28821
  }
28822
+ this._connected = true;
28491
28823
  }
28492
28824
  disconnect() {
28493
28825
  var _a;
@@ -28525,24 +28857,60 @@ var CollabService = class extends BaseService {
28525
28857
  }
28526
28858
  /* ---------- data helpers ---------- */
28527
28859
  updateData(tuples, options = {}) {
28528
- var _a;
28860
+ var _a, _b, _c;
28529
28861
  this._ensureStateManager();
28530
28862
  const { isUndo = false, isRedo = false } = options;
28531
28863
  if (!isUndo && !isRedo && !this._isUndoRedo) {
28532
28864
  this._trackForUndo(tuples, options);
28533
28865
  }
28866
+ const root = (_a = this._stateManager) == null ? void 0 : _a.root;
28867
+ const { granularChanges: processedTuples, orders } = preprocessChanges(
28868
+ root,
28869
+ tuples,
28870
+ options
28871
+ );
28534
28872
  if (options.append && options.append.length) {
28535
- tuples.push(...options.append);
28873
+ processedTuples.push(...options.append);
28536
28874
  }
28537
28875
  this._stateManager.applyChanges(tuples, { ...options });
28538
- tuples = deepStringify(tuples, []);
28876
+ const state = (_b = this._stateManager) == null ? void 0 : _b.root;
28877
+ const el = state == null ? void 0 : state.__element;
28878
+ const stringifiedGranularTuples = (el == null ? void 0 : el.call) ? el.call(
28879
+ "deepStringifyFunctions",
28880
+ processedTuples,
28881
+ Array.isArray(processedTuples) ? [] : {}
28882
+ ) : deepStringifyFunctions(
28883
+ processedTuples,
28884
+ Array.isArray(processedTuples) ? [] : {}
28885
+ );
28886
+ const stringifiedTuples = (el == null ? void 0 : el.call) ? el.call(
28887
+ "deepStringifyFunctions",
28888
+ tuples,
28889
+ Array.isArray(tuples) ? [] : {}
28890
+ ) : deepStringifyFunctions(tuples, Array.isArray(tuples) ? [] : {});
28539
28891
  if (!this.isConnected()) {
28540
28892
  console.warn("[CollabService] Not connected, queuing real-time update");
28541
- this._pendingOps.push({ tuples, options });
28893
+ this._pendingOps.push({
28894
+ changes: stringifiedTuples,
28895
+ granularChanges: stringifiedGranularTuples,
28896
+ orders,
28897
+ options
28898
+ });
28542
28899
  return;
28543
28900
  }
28544
- if ((_a = this.socket) == null ? void 0 : _a.connected) {
28545
- this.socket.emit("ops", { changes: tuples, ts: Date.now() });
28901
+ if ((_c = this.socket) == null ? void 0 : _c.connected) {
28902
+ console.log("[CollabService] Sending operations to the backend", {
28903
+ changes: stringifiedTuples,
28904
+ granularChanges: stringifiedGranularTuples,
28905
+ orders,
28906
+ ts: Date.now()
28907
+ });
28908
+ this.socket.emit("ops", {
28909
+ changes: stringifiedTuples,
28910
+ granularChanges: stringifiedGranularTuples,
28911
+ orders,
28912
+ ts: Date.now()
28913
+ });
28546
28914
  }
28547
28915
  return { success: true };
28548
28916
  }
@@ -28683,7 +29051,7 @@ var CollabService = class extends BaseService {
28683
29051
  const updatedOpts = { ...opts, skipComponentsChangedEvent: true };
28684
29052
  return this.updateData(tuples, updatedOpts);
28685
29053
  } catch (error) {
28686
- throw new Error(`Failed to add item: ${error.message}`);
29054
+ throw new Error(`Failed to add item: ${error.message}`, { cause: error });
28687
29055
  }
28688
29056
  }
28689
29057
  addMultipleItems(items, opts = {}) {
@@ -28712,7 +29080,7 @@ var CollabService = class extends BaseService {
28712
29080
  title: "Failed to add item",
28713
29081
  message: error.message
28714
29082
  });
28715
- throw new Error(`Failed to add item: ${error.message}`);
29083
+ throw new Error(`Failed to add item: ${error.message}`, { cause: error });
28716
29084
  }
28717
29085
  }
28718
29086
  updateItem(type, data2, opts = {}) {
@@ -28734,7 +29102,9 @@ var CollabService = class extends BaseService {
28734
29102
  title: "Failed to update item",
28735
29103
  message: error.message
28736
29104
  });
28737
- throw new Error(`Failed to update item: ${error.message}`);
29105
+ throw new Error(`Failed to update item: ${error.message}`, {
29106
+ cause: error
29107
+ });
28738
29108
  }
28739
29109
  }
28740
29110
  deleteItem(type, key, opts = {}) {
@@ -28759,7 +29129,9 @@ var CollabService = class extends BaseService {
28759
29129
  title: "Failed to delete item",
28760
29130
  message: error.message
28761
29131
  });
28762
- throw new Error(`Failed to delete item: ${error.message}`);
29132
+ throw new Error(`Failed to delete item: ${error.message}`, {
29133
+ cause: error
29134
+ });
28763
29135
  }
28764
29136
  }
28765
29137
  /* ---------- socket event helpers ---------- */
@@ -28852,6 +29224,7 @@ var CollabService = class extends BaseService {
28852
29224
  };
28853
29225
 
28854
29226
  // src/services/ProjectService.js
29227
+ import { deepStringifyFunctions as deepStringifyFunctions2 } from "@domql/utils";
28855
29228
  var ProjectService = class extends BaseService {
28856
29229
  // ==================== PROJECT METHODS ====================
28857
29230
  async createProject(projectData) {
@@ -28867,7 +29240,7 @@ var ProjectService = class extends BaseService {
28867
29240
  }
28868
29241
  throw new Error(response.message);
28869
29242
  } catch (error) {
28870
- throw new Error(`Failed to create project: ${error.message}`);
29243
+ throw new Error(`Failed to create project: ${error.message}`, { cause: error });
28871
29244
  }
28872
29245
  }
28873
29246
  async getProjects(params2 = {}) {
@@ -28890,7 +29263,7 @@ var ProjectService = class extends BaseService {
28890
29263
  }
28891
29264
  throw new Error(response.message);
28892
29265
  } catch (error) {
28893
- throw new Error(`Failed to get projects: ${error.message}`);
29266
+ throw new Error(`Failed to get projects: ${error.message}`, { cause: error });
28894
29267
  }
28895
29268
  }
28896
29269
  /**
@@ -28921,7 +29294,7 @@ var ProjectService = class extends BaseService {
28921
29294
  }
28922
29295
  throw new Error(response.message);
28923
29296
  } catch (error) {
28924
- throw new Error(`Failed to list public projects: ${error.message}`);
29297
+ throw new Error(`Failed to list public projects: ${error.message}`, { cause: error });
28925
29298
  }
28926
29299
  }
28927
29300
  async getProject(projectId) {
@@ -28943,7 +29316,7 @@ var ProjectService = class extends BaseService {
28943
29316
  }
28944
29317
  throw new Error(response.message);
28945
29318
  } catch (error) {
28946
- throw new Error(`Failed to get project: ${error.message}`);
29319
+ throw new Error(`Failed to get project: ${error.message}`, { cause: error });
28947
29320
  }
28948
29321
  }
28949
29322
  /**
@@ -28968,7 +29341,7 @@ var ProjectService = class extends BaseService {
28968
29341
  }
28969
29342
  throw new Error(response.message);
28970
29343
  } catch (error) {
28971
- throw new Error(`Failed to get public project: ${error.message}`);
29344
+ throw new Error(`Failed to get public project: ${error.message}`, { cause: error });
28972
29345
  }
28973
29346
  }
28974
29347
  async getProjectByKey(key) {
@@ -28990,7 +29363,7 @@ var ProjectService = class extends BaseService {
28990
29363
  }
28991
29364
  throw new Error(response.message);
28992
29365
  } catch (error) {
28993
- throw new Error(`Failed to get project by key: ${error.message}`);
29366
+ throw new Error(`Failed to get project by key: ${error.message}`, { cause: error });
28994
29367
  }
28995
29368
  }
28996
29369
  /**
@@ -29024,7 +29397,7 @@ var ProjectService = class extends BaseService {
29024
29397
  }
29025
29398
  throw new Error(response.message);
29026
29399
  } catch (error) {
29027
- throw new Error(`Failed to get project data by key: ${error.message}`);
29400
+ throw new Error(`Failed to get project data by key: ${error.message}`, { cause: error });
29028
29401
  }
29029
29402
  }
29030
29403
  async updateProject(projectId, data2) {
@@ -29043,7 +29416,7 @@ var ProjectService = class extends BaseService {
29043
29416
  }
29044
29417
  throw new Error(response.message);
29045
29418
  } catch (error) {
29046
- throw new Error(`Failed to update project: ${error.message}`);
29419
+ throw new Error(`Failed to update project: ${error.message}`, { cause: error });
29047
29420
  }
29048
29421
  }
29049
29422
  async updateProjectComponents(projectId, components) {
@@ -29065,7 +29438,7 @@ var ProjectService = class extends BaseService {
29065
29438
  }
29066
29439
  throw new Error(response.message);
29067
29440
  } catch (error) {
29068
- throw new Error(`Failed to update project components: ${error.message}`);
29441
+ throw new Error(`Failed to update project components: ${error.message}`, { cause: error });
29069
29442
  }
29070
29443
  }
29071
29444
  async updateProjectSettings(projectId, settings) {
@@ -29084,7 +29457,7 @@ var ProjectService = class extends BaseService {
29084
29457
  }
29085
29458
  throw new Error(response.message);
29086
29459
  } catch (error) {
29087
- throw new Error(`Failed to update project settings: ${error.message}`);
29460
+ throw new Error(`Failed to update project settings: ${error.message}`, { cause: error });
29088
29461
  }
29089
29462
  }
29090
29463
  async updateProjectName(projectId, name) {
@@ -29103,7 +29476,7 @@ var ProjectService = class extends BaseService {
29103
29476
  }
29104
29477
  throw new Error(response.message);
29105
29478
  } catch (error) {
29106
- throw new Error(`Failed to update project name: ${error.message}`);
29479
+ throw new Error(`Failed to update project name: ${error.message}`, { cause: error });
29107
29480
  }
29108
29481
  }
29109
29482
  async updateProjectPackage(projectId, pkg) {
@@ -29122,7 +29495,7 @@ var ProjectService = class extends BaseService {
29122
29495
  }
29123
29496
  throw new Error(response.message);
29124
29497
  } catch (error) {
29125
- throw new Error(`Failed to update project package: ${error.message}`);
29498
+ throw new Error(`Failed to update project package: ${error.message}`, { cause: error });
29126
29499
  }
29127
29500
  }
29128
29501
  async duplicateProject(projectId, newName, newKey, targetUserId) {
@@ -29141,7 +29514,7 @@ var ProjectService = class extends BaseService {
29141
29514
  }
29142
29515
  throw new Error(response.message);
29143
29516
  } catch (error) {
29144
- throw new Error(`Failed to duplicate project: ${error.message}`);
29517
+ throw new Error(`Failed to duplicate project: ${error.message}`, { cause: error });
29145
29518
  }
29146
29519
  }
29147
29520
  async removeProject(projectId) {
@@ -29159,7 +29532,7 @@ var ProjectService = class extends BaseService {
29159
29532
  }
29160
29533
  throw new Error(response.message);
29161
29534
  } catch (error) {
29162
- throw new Error(`Failed to remove project: ${error.message}`);
29535
+ throw new Error(`Failed to remove project: ${error.message}`, { cause: error });
29163
29536
  }
29164
29537
  }
29165
29538
  async checkProjectKeyAvailability(key) {
@@ -29178,7 +29551,8 @@ var ProjectService = class extends BaseService {
29178
29551
  throw new Error(response.message);
29179
29552
  } catch (error) {
29180
29553
  throw new Error(
29181
- `Failed to check project key availability: ${error.message}`
29554
+ `Failed to check project key availability: ${error.message}`,
29555
+ { cause: error }
29182
29556
  );
29183
29557
  }
29184
29558
  }
@@ -29198,7 +29572,7 @@ var ProjectService = class extends BaseService {
29198
29572
  }
29199
29573
  throw new Error(response.message);
29200
29574
  } catch (error) {
29201
- throw new Error(`Failed to get project members: ${error.message}`);
29575
+ throw new Error(`Failed to get project members: ${error.message}`, { cause: error });
29202
29576
  }
29203
29577
  }
29204
29578
  async inviteMember(projectId, email, role = "guest", options = {}) {
@@ -29227,7 +29601,7 @@ var ProjectService = class extends BaseService {
29227
29601
  }
29228
29602
  throw new Error(response.message);
29229
29603
  } catch (error) {
29230
- throw new Error(`Failed to invite member: ${error.message}`);
29604
+ throw new Error(`Failed to invite member: ${error.message}`, { cause: error });
29231
29605
  }
29232
29606
  }
29233
29607
  async acceptInvite(token) {
@@ -29246,7 +29620,7 @@ var ProjectService = class extends BaseService {
29246
29620
  }
29247
29621
  throw new Error(response.message);
29248
29622
  } catch (error) {
29249
- throw new Error(`Failed to accept invite: ${error.message}`);
29623
+ throw new Error(`Failed to accept invite: ${error.message}`, { cause: error });
29250
29624
  }
29251
29625
  }
29252
29626
  async updateMemberRole(projectId, memberId, role) {
@@ -29268,7 +29642,7 @@ var ProjectService = class extends BaseService {
29268
29642
  }
29269
29643
  throw new Error(response.message);
29270
29644
  } catch (error) {
29271
- throw new Error(`Failed to update member role: ${error.message}`);
29645
+ throw new Error(`Failed to update member role: ${error.message}`, { cause: error });
29272
29646
  }
29273
29647
  }
29274
29648
  async removeMember(projectId, memberId) {
@@ -29289,7 +29663,7 @@ var ProjectService = class extends BaseService {
29289
29663
  }
29290
29664
  throw new Error(response.message);
29291
29665
  } catch (error) {
29292
- throw new Error(`Failed to remove member: ${error.message}`);
29666
+ throw new Error(`Failed to remove member: ${error.message}`, { cause: error });
29293
29667
  }
29294
29668
  }
29295
29669
  // ==================== PROJECT LIBRARY METHODS ====================
@@ -29309,7 +29683,7 @@ var ProjectService = class extends BaseService {
29309
29683
  }
29310
29684
  throw new Error(response.message);
29311
29685
  } catch (error) {
29312
- throw new Error(`Failed to get available libraries: ${error.message}`);
29686
+ throw new Error(`Failed to get available libraries: ${error.message}`, { cause: error });
29313
29687
  }
29314
29688
  }
29315
29689
  async getProjectLibraries(projectId) {
@@ -29327,7 +29701,7 @@ var ProjectService = class extends BaseService {
29327
29701
  }
29328
29702
  throw new Error(response.message);
29329
29703
  } catch (error) {
29330
- throw new Error(`Failed to get project libraries: ${error.message}`);
29704
+ throw new Error(`Failed to get project libraries: ${error.message}`, { cause: error });
29331
29705
  }
29332
29706
  }
29333
29707
  async addProjectLibraries(projectId, libraryIds) {
@@ -29342,11 +29716,11 @@ var ProjectService = class extends BaseService {
29342
29716
  methodName: "addProjectLibraries"
29343
29717
  });
29344
29718
  if (response.success) {
29345
- return response.data;
29719
+ return response;
29346
29720
  }
29347
29721
  throw new Error(response.message);
29348
29722
  } catch (error) {
29349
- throw new Error(`Failed to add project libraries: ${error.message}`);
29723
+ throw new Error(`Failed to add project libraries: ${error.message}`, { cause: error });
29350
29724
  }
29351
29725
  }
29352
29726
  async removeProjectLibraries(projectId, libraryIds) {
@@ -29365,7 +29739,7 @@ var ProjectService = class extends BaseService {
29365
29739
  }
29366
29740
  throw new Error(response.message);
29367
29741
  } catch (error) {
29368
- throw new Error(`Failed to remove project libraries: ${error.message}`);
29742
+ throw new Error(`Failed to remove project libraries: ${error.message}`, { cause: error });
29369
29743
  }
29370
29744
  }
29371
29745
  // ==================== PROJECT DATA METHODS (SYMSTORY REPLACEMENT) ====================
@@ -29382,14 +29756,20 @@ var ProjectService = class extends BaseService {
29382
29756
  throw new Error("Changes must be an array");
29383
29757
  }
29384
29758
  const { message, branch = "main", type = "patch" } = options;
29759
+ const state = this._context && this._context.state;
29760
+ const { granularChanges, orders: preprocessorOrders } = preprocessChanges(state, changes, options);
29761
+ const derivedOrders = options.orders || (preprocessorOrders && preprocessorOrders.length ? preprocessorOrders : state ? computeOrdersForTuples(state, granularChanges) : []);
29762
+ const stringify = (val) => deepStringifyFunctions2(val, Array.isArray(val) ? [] : {});
29385
29763
  try {
29386
29764
  const response = await this._request(`/projects/${projectId}/changes`, {
29387
29765
  method: "POST",
29388
29766
  body: JSON.stringify({
29389
- changes,
29767
+ changes: stringify(changes),
29768
+ granularChanges: stringify(granularChanges),
29390
29769
  message,
29391
29770
  branch,
29392
- type
29771
+ type,
29772
+ ...derivedOrders && derivedOrders.length ? { orders: derivedOrders } : {}
29393
29773
  }),
29394
29774
  methodName: "applyProjectChanges"
29395
29775
  });
@@ -29398,7 +29778,7 @@ var ProjectService = class extends BaseService {
29398
29778
  }
29399
29779
  throw new Error(response.message);
29400
29780
  } catch (error) {
29401
- throw new Error(`Failed to apply project changes: ${error.message}`);
29781
+ throw new Error(`Failed to apply project changes: ${error.message}`, { cause: error });
29402
29782
  }
29403
29783
  }
29404
29784
  /**
@@ -29433,7 +29813,7 @@ var ProjectService = class extends BaseService {
29433
29813
  }
29434
29814
  throw new Error(response.message);
29435
29815
  } catch (error) {
29436
- throw new Error(`Failed to get project data: ${error.message}`);
29816
+ throw new Error(`Failed to get project data: ${error.message}`, { cause: error });
29437
29817
  }
29438
29818
  }
29439
29819
  /**
@@ -29463,7 +29843,7 @@ var ProjectService = class extends BaseService {
29463
29843
  }
29464
29844
  throw new Error(response.message);
29465
29845
  } catch (error) {
29466
- throw new Error(`Failed to get project versions: ${error.message}`);
29846
+ throw new Error(`Failed to get project versions: ${error.message}`, { cause: error });
29467
29847
  }
29468
29848
  }
29469
29849
  /**
@@ -29495,7 +29875,7 @@ var ProjectService = class extends BaseService {
29495
29875
  }
29496
29876
  throw new Error(response.message);
29497
29877
  } catch (error) {
29498
- throw new Error(`Failed to restore project version: ${error.message}`);
29878
+ throw new Error(`Failed to restore project version: ${error.message}`, { cause: error });
29499
29879
  }
29500
29880
  }
29501
29881
  /**
@@ -29595,7 +29975,7 @@ var ProjectService = class extends BaseService {
29595
29975
  }
29596
29976
  throw new Error(response.message);
29597
29977
  } catch (error) {
29598
- throw new Error(`Failed to get favorite projects: ${error.message}`);
29978
+ throw new Error(`Failed to get favorite projects: ${error.message}`, { cause: error });
29599
29979
  }
29600
29980
  }
29601
29981
  async addFavoriteProject(projectId) {
@@ -29613,7 +29993,7 @@ var ProjectService = class extends BaseService {
29613
29993
  }
29614
29994
  throw new Error(response.message);
29615
29995
  } catch (error) {
29616
- throw new Error(`Failed to add favorite project: ${error.message}`);
29996
+ throw new Error(`Failed to add favorite project: ${error.message}`, { cause: error });
29617
29997
  }
29618
29998
  }
29619
29999
  async removeFavoriteProject(projectId) {
@@ -29631,7 +30011,7 @@ var ProjectService = class extends BaseService {
29631
30011
  }
29632
30012
  throw new Error(response.message);
29633
30013
  } catch (error) {
29634
- throw new Error(`Failed to remove favorite project: ${error.message}`);
30014
+ throw new Error(`Failed to remove favorite project: ${error.message}`, { cause: error });
29635
30015
  }
29636
30016
  }
29637
30017
  // ==================== RECENT PROJECT METHODS ====================
@@ -29660,7 +30040,7 @@ var ProjectService = class extends BaseService {
29660
30040
  }
29661
30041
  throw new Error(response.message);
29662
30042
  } catch (error) {
29663
- throw new Error(`Failed to get recent projects: ${error.message}`);
30043
+ throw new Error(`Failed to get recent projects: ${error.message}`, { cause: error });
29664
30044
  }
29665
30045
  }
29666
30046
  };
@@ -29682,7 +30062,7 @@ var PlanService = class extends BaseService {
29682
30062
  }
29683
30063
  throw new Error(response.message);
29684
30064
  } catch (error) {
29685
- throw new Error(`Failed to get plans: ${error.message}`);
30065
+ throw new Error(`Failed to get plans: ${error.message}`, { cause: error });
29686
30066
  }
29687
30067
  }
29688
30068
  /**
@@ -29702,7 +30082,7 @@ var PlanService = class extends BaseService {
29702
30082
  }
29703
30083
  throw new Error(response.message);
29704
30084
  } catch (error) {
29705
- throw new Error(`Failed to get plan: ${error.message}`);
30085
+ throw new Error(`Failed to get plan: ${error.message}`, { cause: error });
29706
30086
  }
29707
30087
  }
29708
30088
  // ==================== ADMIN PLAN METHODS ====================
@@ -29721,7 +30101,7 @@ var PlanService = class extends BaseService {
29721
30101
  }
29722
30102
  throw new Error(response.message);
29723
30103
  } catch (error) {
29724
- throw new Error(`Failed to get admin plans: ${error.message}`);
30104
+ throw new Error(`Failed to get admin plans: ${error.message}`, { cause: error });
29725
30105
  }
29726
30106
  }
29727
30107
  /**
@@ -29743,7 +30123,7 @@ var PlanService = class extends BaseService {
29743
30123
  }
29744
30124
  throw new Error(response.message);
29745
30125
  } catch (error) {
29746
- throw new Error(`Failed to create plan: ${error.message}`);
30126
+ throw new Error(`Failed to create plan: ${error.message}`, { cause: error });
29747
30127
  }
29748
30128
  }
29749
30129
  /**
@@ -29768,7 +30148,7 @@ var PlanService = class extends BaseService {
29768
30148
  }
29769
30149
  throw new Error(response.message);
29770
30150
  } catch (error) {
29771
- throw new Error(`Failed to update plan: ${error.message}`);
30151
+ throw new Error(`Failed to update plan: ${error.message}`, { cause: error });
29772
30152
  }
29773
30153
  }
29774
30154
  /**
@@ -29789,7 +30169,7 @@ var PlanService = class extends BaseService {
29789
30169
  }
29790
30170
  throw new Error(response.message);
29791
30171
  } catch (error) {
29792
- throw new Error(`Failed to delete plan: ${error.message}`);
30172
+ throw new Error(`Failed to delete plan: ${error.message}`, { cause: error });
29793
30173
  }
29794
30174
  }
29795
30175
  /**
@@ -29807,7 +30187,7 @@ var PlanService = class extends BaseService {
29807
30187
  }
29808
30188
  throw new Error(response.message);
29809
30189
  } catch (error) {
29810
- throw new Error(`Failed to initialize plans: ${error.message}`);
30190
+ throw new Error(`Failed to initialize plans: ${error.message}`, { cause: error });
29811
30191
  }
29812
30192
  }
29813
30193
  // ==================== PLAN HELPER METHODS ====================
@@ -29822,7 +30202,7 @@ var PlanService = class extends BaseService {
29822
30202
  }
29823
30203
  return plans;
29824
30204
  } catch (error) {
29825
- throw new Error(`Failed to get plans with validation: ${error.message}`);
30205
+ throw new Error(`Failed to get plans with validation: ${error.message}`, { cause: error });
29826
30206
  }
29827
30207
  }
29828
30208
  /**
@@ -29839,7 +30219,7 @@ var PlanService = class extends BaseService {
29839
30219
  }
29840
30220
  return plan;
29841
30221
  } catch (error) {
29842
- throw new Error(`Failed to get plan with validation: ${error.message}`);
30222
+ throw new Error(`Failed to get plan with validation: ${error.message}`, { cause: error });
29843
30223
  }
29844
30224
  }
29845
30225
  /**
@@ -29891,7 +30271,7 @@ var PlanService = class extends BaseService {
29891
30271
  const plans = await this.getPlans();
29892
30272
  return plans.filter((plan) => plan.active !== false);
29893
30273
  } catch (error) {
29894
- throw new Error(`Failed to get active plans: ${error.message}`);
30274
+ throw new Error(`Failed to get active plans: ${error.message}`, { cause: error });
29895
30275
  }
29896
30276
  }
29897
30277
  /**
@@ -29905,7 +30285,7 @@ var PlanService = class extends BaseService {
29905
30285
  return price >= minPrice && price <= maxPrice;
29906
30286
  });
29907
30287
  } catch (error) {
29908
- throw new Error(`Failed to get plans by price range: ${error.message}`);
30288
+ throw new Error(`Failed to get plans by price range: ${error.message}`, { cause: error });
29909
30289
  }
29910
30290
  }
29911
30291
  /**
@@ -29923,7 +30303,7 @@ var PlanService = class extends BaseService {
29923
30303
  }
29924
30304
  return plan;
29925
30305
  } catch (error) {
29926
- throw new Error(`Failed to get plan by key: ${error.message}`);
30306
+ throw new Error(`Failed to get plan by key: ${error.message}`, { cause: error });
29927
30307
  }
29928
30308
  }
29929
30309
  };
@@ -29964,7 +30344,7 @@ var SubscriptionService = class extends BaseService {
29964
30344
  }
29965
30345
  throw new Error(response.message);
29966
30346
  } catch (error) {
29967
- throw new Error(`Failed to create subscription: ${error.message}`);
30347
+ throw new Error(`Failed to create subscription: ${error.message}`, { cause: error });
29968
30348
  }
29969
30349
  }
29970
30350
  /**
@@ -29985,7 +30365,7 @@ var SubscriptionService = class extends BaseService {
29985
30365
  }
29986
30366
  throw new Error(response.message);
29987
30367
  } catch (error) {
29988
- throw new Error(`Failed to get project subscription status: ${error.message}`);
30368
+ throw new Error(`Failed to get project subscription status: ${error.message}`, { cause: error });
29989
30369
  }
29990
30370
  }
29991
30371
  /**
@@ -30006,7 +30386,7 @@ var SubscriptionService = class extends BaseService {
30006
30386
  }
30007
30387
  throw new Error(response.message);
30008
30388
  } catch (error) {
30009
- throw new Error(`Failed to get subscription usage: ${error.message}`);
30389
+ throw new Error(`Failed to get subscription usage: ${error.message}`, { cause: error });
30010
30390
  }
30011
30391
  }
30012
30392
  /**
@@ -30027,7 +30407,7 @@ var SubscriptionService = class extends BaseService {
30027
30407
  }
30028
30408
  throw new Error(response.message);
30029
30409
  } catch (error) {
30030
- throw new Error(`Failed to cancel subscription: ${error.message}`);
30410
+ throw new Error(`Failed to cancel subscription: ${error.message}`, { cause: error });
30031
30411
  }
30032
30412
  }
30033
30413
  /**
@@ -30064,7 +30444,7 @@ var SubscriptionService = class extends BaseService {
30064
30444
  }
30065
30445
  throw new Error(response.message);
30066
30446
  } catch (error) {
30067
- throw new Error(`Failed to list invoices: ${error.message}`);
30447
+ throw new Error(`Failed to list invoices: ${error.message}`, { cause: error });
30068
30448
  }
30069
30449
  }
30070
30450
  /**
@@ -30091,7 +30471,7 @@ var SubscriptionService = class extends BaseService {
30091
30471
  }
30092
30472
  throw new Error(response.message);
30093
30473
  } catch (error) {
30094
- throw new Error(`Failed to get portal URL: ${error.message}`);
30474
+ throw new Error(`Failed to get portal URL: ${error.message}`, { cause: error });
30095
30475
  }
30096
30476
  }
30097
30477
  // ==================== SUBSCRIPTION HELPER METHODS ====================
@@ -30126,7 +30506,7 @@ var SubscriptionService = class extends BaseService {
30126
30506
  const status = await this.getProjectStatus(projectId);
30127
30507
  return status.hasSubscription === true;
30128
30508
  } catch (error) {
30129
- throw new Error(`Failed to check subscription status: ${error.message}`);
30509
+ throw new Error(`Failed to check subscription status: ${error.message}`, { cause: error });
30130
30510
  }
30131
30511
  }
30132
30512
  /**
@@ -30140,7 +30520,7 @@ var SubscriptionService = class extends BaseService {
30140
30520
  }
30141
30521
  return status.subscription;
30142
30522
  } catch (error) {
30143
- throw new Error(`Failed to get project subscription: ${error.message}`);
30523
+ throw new Error(`Failed to get project subscription: ${error.message}`, { cause: error });
30144
30524
  }
30145
30525
  }
30146
30526
  /**
@@ -30154,7 +30534,7 @@ var SubscriptionService = class extends BaseService {
30154
30534
  }
30155
30535
  return status.usage;
30156
30536
  } catch (error) {
30157
- throw new Error(`Failed to get project usage: ${error.message}`);
30537
+ throw new Error(`Failed to get project usage: ${error.message}`, { cause: error });
30158
30538
  }
30159
30539
  }
30160
30540
  /**
@@ -30168,7 +30548,7 @@ var SubscriptionService = class extends BaseService {
30168
30548
  pagination: result.pagination || {}
30169
30549
  };
30170
30550
  } catch (error) {
30171
- throw new Error(`Failed to get invoices with pagination: ${error.message}`);
30551
+ throw new Error(`Failed to get invoices with pagination: ${error.message}`, { cause: error });
30172
30552
  }
30173
30553
  }
30174
30554
  /**
@@ -30179,7 +30559,7 @@ var SubscriptionService = class extends BaseService {
30179
30559
  const usage = await this.getUsage(subscriptionId);
30180
30560
  return usage && usage.subscription && usage.subscription.status === "active";
30181
30561
  } catch (error) {
30182
- throw new Error(`Failed to check subscription status: ${error.message}`);
30562
+ throw new Error(`Failed to check subscription status: ${error.message}`, { cause: error });
30183
30563
  }
30184
30564
  }
30185
30565
  /**
@@ -30190,7 +30570,7 @@ var SubscriptionService = class extends BaseService {
30190
30570
  const usage = await this.getUsage(subscriptionId);
30191
30571
  return usage.limits || {};
30192
30572
  } catch (error) {
30193
- throw new Error(`Failed to get subscription limits: ${error.message}`);
30573
+ throw new Error(`Failed to get subscription limits: ${error.message}`, { cause: error });
30194
30574
  }
30195
30575
  }
30196
30576
  /**
@@ -30226,7 +30606,7 @@ var SubscriptionService = class extends BaseService {
30226
30606
  }
30227
30607
  throw new Error(response.message);
30228
30608
  } catch (error) {
30229
- throw new Error(`Failed to change subscription: ${error.message}`);
30609
+ throw new Error(`Failed to change subscription: ${error.message}`, { cause: error });
30230
30610
  }
30231
30611
  }
30232
30612
  /**
@@ -30254,7 +30634,7 @@ var SubscriptionService = class extends BaseService {
30254
30634
  }
30255
30635
  throw new Error(response.message);
30256
30636
  } catch (error) {
30257
- throw new Error(`Failed to downgrade subscription: ${error.message}`);
30637
+ throw new Error(`Failed to downgrade subscription: ${error.message}`, { cause: error });
30258
30638
  }
30259
30639
  }
30260
30640
  /**
@@ -30343,7 +30723,7 @@ var FileService = class extends BaseService {
30343
30723
  message: response.message
30344
30724
  };
30345
30725
  } catch (error) {
30346
- throw new Error(`File upload failed: ${error.message}`);
30726
+ throw new Error(`File upload failed: ${error.message}`, { cause: error });
30347
30727
  }
30348
30728
  }
30349
30729
  async updateProjectIcon(projectId, iconFile) {
@@ -30367,7 +30747,7 @@ var FileService = class extends BaseService {
30367
30747
  }
30368
30748
  throw new Error(response.message);
30369
30749
  } catch (error) {
30370
- throw new Error(`Failed to update project icon: ${error.message}`);
30750
+ throw new Error(`Failed to update project icon: ${error.message}`, { cause: error });
30371
30751
  }
30372
30752
  }
30373
30753
  // ==================== FILE HELPER METHODS ====================
@@ -30517,7 +30897,7 @@ var PaymentService = class extends BaseService {
30517
30897
  }
30518
30898
  throw new Error(response.message);
30519
30899
  } catch (error) {
30520
- throw new Error(`Failed to checkout: ${error.message}`);
30900
+ throw new Error(`Failed to checkout: ${error.message}`, { cause: error });
30521
30901
  }
30522
30902
  }
30523
30903
  async getSubscriptionStatus(projectId) {
@@ -30538,7 +30918,7 @@ var PaymentService = class extends BaseService {
30538
30918
  }
30539
30919
  throw new Error(response.message);
30540
30920
  } catch (error) {
30541
- throw new Error(`Failed to get subscription status: ${error.message}`);
30921
+ throw new Error(`Failed to get subscription status: ${error.message}`, { cause: error });
30542
30922
  }
30543
30923
  }
30544
30924
  // ==================== PAYMENT HELPER METHODS ====================
@@ -30754,7 +31134,7 @@ var DnsService = class extends BaseService {
30754
31134
  }
30755
31135
  throw new Error(response.message);
30756
31136
  } catch (error) {
30757
- throw new Error(`Failed to create DNS record: ${error.message}`);
31137
+ throw new Error(`Failed to create DNS record: ${error.message}`, { cause: error });
30758
31138
  }
30759
31139
  }
30760
31140
  async getDnsRecord(domain) {
@@ -30772,7 +31152,7 @@ var DnsService = class extends BaseService {
30772
31152
  }
30773
31153
  throw new Error(response.message);
30774
31154
  } catch (error) {
30775
- throw new Error(`Failed to get DNS record: ${error.message}`);
31155
+ throw new Error(`Failed to get DNS record: ${error.message}`, { cause: error });
30776
31156
  }
30777
31157
  }
30778
31158
  async getCustomHost(hostname) {
@@ -30808,7 +31188,7 @@ var DnsService = class extends BaseService {
30808
31188
  }
30809
31189
  throw new Error(response.message);
30810
31190
  } catch (error) {
30811
- throw new Error(`Failed to remove DNS record: ${error.message}`);
31191
+ throw new Error(`Failed to remove DNS record: ${error.message}`, { cause: error });
30812
31192
  }
30813
31193
  }
30814
31194
  // Deprecated, use addProjectCustomDomains instead
@@ -30832,7 +31212,7 @@ var DnsService = class extends BaseService {
30832
31212
  }
30833
31213
  throw new Error(response.message);
30834
31214
  } catch (error) {
30835
- throw new Error(`Failed to set project domains: ${error.message}`);
31215
+ throw new Error(`Failed to set project domains: ${error.message}`, { cause: error });
30836
31216
  }
30837
31217
  }
30838
31218
  // customDomains could be a string or an array of strings
@@ -31108,7 +31488,7 @@ var BranchService = class extends BaseService {
31108
31488
  }
31109
31489
  throw new Error(response.message);
31110
31490
  } catch (error) {
31111
- throw new Error(`Failed to list branches: ${error.message}`);
31491
+ throw new Error(`Failed to list branches: ${error.message}`, { cause: error });
31112
31492
  }
31113
31493
  }
31114
31494
  /**
@@ -31134,7 +31514,7 @@ var BranchService = class extends BaseService {
31134
31514
  }
31135
31515
  throw new Error(response.message);
31136
31516
  } catch (error) {
31137
- throw new Error(`Failed to create branch: ${error.message}`);
31517
+ throw new Error(`Failed to create branch: ${error.message}`, { cause: error });
31138
31518
  }
31139
31519
  }
31140
31520
  /**
@@ -31164,7 +31544,7 @@ var BranchService = class extends BaseService {
31164
31544
  }
31165
31545
  throw new Error(response.message);
31166
31546
  } catch (error) {
31167
- throw new Error(`Failed to delete branch: ${error.message}`);
31547
+ throw new Error(`Failed to delete branch: ${error.message}`, { cause: error });
31168
31548
  }
31169
31549
  }
31170
31550
  /**
@@ -31200,7 +31580,7 @@ var BranchService = class extends BaseService {
31200
31580
  }
31201
31581
  throw new Error(response.message);
31202
31582
  } catch (error) {
31203
- throw new Error(`Failed to rename branch: ${error.message}`);
31583
+ throw new Error(`Failed to rename branch: ${error.message}`, { cause: error });
31204
31584
  }
31205
31585
  }
31206
31586
  /**
@@ -31239,7 +31619,7 @@ var BranchService = class extends BaseService {
31239
31619
  }
31240
31620
  throw new Error(response.message);
31241
31621
  } catch (error) {
31242
- throw new Error(`Failed to get branch changes: ${error.message}`);
31622
+ throw new Error(`Failed to get branch changes: ${error.message}`, { cause: error });
31243
31623
  }
31244
31624
  }
31245
31625
  /**
@@ -31286,7 +31666,7 @@ var BranchService = class extends BaseService {
31286
31666
  if (error.message.includes("conflicts") || error.message.includes("409")) {
31287
31667
  throw new Error(`Merge conflicts detected: ${error.message}`);
31288
31668
  }
31289
- throw new Error(`Failed to merge branch: ${error.message}`);
31669
+ throw new Error(`Failed to merge branch: ${error.message}`, { cause: error });
31290
31670
  }
31291
31671
  }
31292
31672
  /**
@@ -31315,7 +31695,7 @@ var BranchService = class extends BaseService {
31315
31695
  }
31316
31696
  throw new Error(response.message);
31317
31697
  } catch (error) {
31318
- throw new Error(`Failed to reset branch: ${error.message}`);
31698
+ throw new Error(`Failed to reset branch: ${error.message}`, { cause: error });
31319
31699
  }
31320
31700
  }
31321
31701
  /**
@@ -31341,7 +31721,7 @@ var BranchService = class extends BaseService {
31341
31721
  }
31342
31722
  throw new Error(response.message);
31343
31723
  } catch (error) {
31344
- throw new Error(`Failed to publish version: ${error.message}`);
31724
+ throw new Error(`Failed to publish version: ${error.message}`, { cause: error });
31345
31725
  }
31346
31726
  }
31347
31727
  // ==================== BRANCH HELPER METHODS ====================
@@ -31373,7 +31753,7 @@ var BranchService = class extends BaseService {
31373
31753
  const branches = await this.listBranches(projectId);
31374
31754
  return ((_a = branches == null ? void 0 : branches.data) == null ? void 0 : _a.includes(branchName)) || false;
31375
31755
  } catch (error) {
31376
- throw new Error(`Failed to check if branch exists: ${error.message}`);
31756
+ throw new Error(`Failed to check if branch exists: ${error.message}`, { cause: error });
31377
31757
  }
31378
31758
  }
31379
31759
  /**
@@ -31443,7 +31823,7 @@ var BranchService = class extends BaseService {
31443
31823
  canRename: exists && branchName !== "main"
31444
31824
  };
31445
31825
  } catch (error) {
31446
- throw new Error(`Failed to get branch status: ${error.message}`);
31826
+ throw new Error(`Failed to get branch status: ${error.message}`, { cause: error });
31447
31827
  }
31448
31828
  }
31449
31829
  /**
@@ -31578,7 +31958,7 @@ var PullRequestService = class extends BaseService {
31578
31958
  }
31579
31959
  throw new Error(response.message);
31580
31960
  } catch (error) {
31581
- throw new Error(`Failed to create pull request: ${error.message}`);
31961
+ throw new Error(`Failed to create pull request: ${error.message}`, { cause: error });
31582
31962
  }
31583
31963
  }
31584
31964
  /**
@@ -31614,7 +31994,7 @@ var PullRequestService = class extends BaseService {
31614
31994
  }
31615
31995
  throw new Error(response.message);
31616
31996
  } catch (error) {
31617
- throw new Error(`Failed to list pull requests: ${error.message}`);
31997
+ throw new Error(`Failed to list pull requests: ${error.message}`, { cause: error });
31618
31998
  }
31619
31999
  }
31620
32000
  /**
@@ -31641,7 +32021,7 @@ var PullRequestService = class extends BaseService {
31641
32021
  }
31642
32022
  throw new Error(response.message);
31643
32023
  } catch (error) {
31644
- throw new Error(`Failed to get pull request: ${error.message}`);
32024
+ throw new Error(`Failed to get pull request: ${error.message}`, { cause: error });
31645
32025
  }
31646
32026
  }
31647
32027
  /**
@@ -31675,7 +32055,7 @@ var PullRequestService = class extends BaseService {
31675
32055
  }
31676
32056
  throw new Error(response.message);
31677
32057
  } catch (error) {
31678
- throw new Error(`Failed to review pull request: ${error.message}`);
32058
+ throw new Error(`Failed to review pull request: ${error.message}`, { cause: error });
31679
32059
  }
31680
32060
  }
31681
32061
  /**
@@ -31706,7 +32086,7 @@ var PullRequestService = class extends BaseService {
31706
32086
  }
31707
32087
  throw new Error(response.message);
31708
32088
  } catch (error) {
31709
- throw new Error(`Failed to add pull request comment: ${error.message}`);
32089
+ throw new Error(`Failed to add pull request comment: ${error.message}`, { cause: error });
31710
32090
  }
31711
32091
  }
31712
32092
  /**
@@ -31736,7 +32116,7 @@ var PullRequestService = class extends BaseService {
31736
32116
  if (error.message.includes("conflicts") || error.message.includes("409")) {
31737
32117
  throw new Error(`Pull request has merge conflicts: ${error.message}`);
31738
32118
  }
31739
- throw new Error(`Failed to merge pull request: ${error.message}`);
32119
+ throw new Error(`Failed to merge pull request: ${error.message}`, { cause: error });
31740
32120
  }
31741
32121
  }
31742
32122
  /**
@@ -31763,7 +32143,7 @@ var PullRequestService = class extends BaseService {
31763
32143
  }
31764
32144
  throw new Error(response.message);
31765
32145
  } catch (error) {
31766
- throw new Error(`Failed to get pull request diff: ${error.message}`);
32146
+ throw new Error(`Failed to get pull request diff: ${error.message}`, { cause: error });
31767
32147
  }
31768
32148
  }
31769
32149
  // ==================== PULL REQUEST HELPER METHODS ====================
@@ -32083,7 +32463,7 @@ var AdminService = class extends BaseService {
32083
32463
  }
32084
32464
  throw new Error(response.message);
32085
32465
  } catch (error) {
32086
- throw new Error(`Failed to get admin users: ${error.message}`);
32466
+ throw new Error(`Failed to get admin users: ${error.message}`, { cause: error });
32087
32467
  }
32088
32468
  }
32089
32469
  /**
@@ -32114,7 +32494,7 @@ var AdminService = class extends BaseService {
32114
32494
  }
32115
32495
  throw new Error(response.message);
32116
32496
  } catch (error) {
32117
- throw new Error(`Failed to assign projects to user: ${error.message}`);
32497
+ throw new Error(`Failed to assign projects to user: ${error.message}`, { cause: error });
32118
32498
  }
32119
32499
  }
32120
32500
  /**
@@ -32143,7 +32523,7 @@ var AdminService = class extends BaseService {
32143
32523
  if ((_a = error.message) == null ? void 0 : _a.includes("Duplicate")) {
32144
32524
  throw new Error("Username already exists");
32145
32525
  }
32146
- throw new Error(`Failed to update user: ${error.message}`);
32526
+ throw new Error(`Failed to update user: ${error.message}`, { cause: error });
32147
32527
  }
32148
32528
  }
32149
32529
  // ==================== ADMIN HELPER METHODS ====================
@@ -32273,7 +32653,7 @@ var AdminService = class extends BaseService {
32273
32653
  });
32274
32654
  return stats;
32275
32655
  } catch (error) {
32276
- throw new Error(`Failed to get user stats: ${error.message}`);
32656
+ throw new Error(`Failed to get user stats: ${error.message}`, { cause: error });
32277
32657
  }
32278
32658
  }
32279
32659
  /**
@@ -32360,6 +32740,287 @@ var AdminService = class extends BaseService {
32360
32740
  }
32361
32741
  };
32362
32742
 
32743
+ // src/services/ScreenshotService.js
32744
+ var ScreenshotService = class extends BaseService {
32745
+ constructor(config) {
32746
+ super(config);
32747
+ this._debounceTimers = /* @__PURE__ */ new Map();
32748
+ this._inflightRefreshes = /* @__PURE__ */ new Map();
32749
+ }
32750
+ // ==================== PROJECT-LEVEL OPERATIONS ====================
32751
+ async createScreenshotProject(payload) {
32752
+ this._requireReady("createScreenshotProject");
32753
+ try {
32754
+ const response = await this._request("/screenshots/projects", {
32755
+ method: "POST",
32756
+ body: JSON.stringify(payload),
32757
+ methodName: "createScreenshotProject"
32758
+ });
32759
+ if (response.success) {
32760
+ return response;
32761
+ }
32762
+ throw new Error(response.message);
32763
+ } catch (error) {
32764
+ throw new Error(`Failed to create screenshot project: ${error.message}`, { cause: error });
32765
+ }
32766
+ }
32767
+ async getProjectScreenshots(projectKey, params2 = {}) {
32768
+ this._requireReady("getProjectScreenshots");
32769
+ if (!projectKey) {
32770
+ throw new Error("projectKey is required");
32771
+ }
32772
+ const { type = "all", status, limit = 50, offset: offset2 = 0 } = params2;
32773
+ const qs = new URLSearchParams();
32774
+ if (type) {
32775
+ qs.set("type", type);
32776
+ }
32777
+ if (status) {
32778
+ qs.set("status", status);
32779
+ }
32780
+ if (limit != null) {
32781
+ qs.set("limit", String(limit));
32782
+ }
32783
+ if (offset2 != null) {
32784
+ qs.set("offset", String(offset2));
32785
+ }
32786
+ try {
32787
+ const response = await this._request(
32788
+ `/screenshots/projects/${encodeURIComponent(projectKey)}${qs.toString() ? `?${qs.toString()}` : ""}`,
32789
+ { method: "GET", methodName: "getProjectScreenshots" }
32790
+ );
32791
+ if (response.success) {
32792
+ return response;
32793
+ }
32794
+ throw new Error(response.message);
32795
+ } catch (error) {
32796
+ throw new Error(`Failed to get project screenshots: ${error.message}`, { cause: error });
32797
+ }
32798
+ }
32799
+ async reprocessProjectScreenshots(projectKey, body = {}) {
32800
+ this._requireReady("reprocessProjectScreenshots");
32801
+ if (!projectKey) {
32802
+ throw new Error("projectKey is required");
32803
+ }
32804
+ try {
32805
+ const response = await this._request(
32806
+ `/screenshots/projects/${encodeURIComponent(projectKey)}/reprocess`,
32807
+ { method: "POST", body: JSON.stringify(body), methodName: "reprocessProjectScreenshots" }
32808
+ );
32809
+ if (response.success) {
32810
+ return response;
32811
+ }
32812
+ throw new Error(response.message);
32813
+ } catch (error) {
32814
+ throw new Error(`Failed to reprocess screenshots: ${error.message}`, { cause: error });
32815
+ }
32816
+ }
32817
+ async recreateProjectScreenshots(projectKey, body = {}) {
32818
+ this._requireReady("recreateProjectScreenshots");
32819
+ if (!projectKey) {
32820
+ throw new Error("projectKey is required");
32821
+ }
32822
+ try {
32823
+ const response = await this._request(
32824
+ `/screenshots/projects/${encodeURIComponent(projectKey)}/recreate`,
32825
+ { method: "POST", body: JSON.stringify(body), methodName: "recreateProjectScreenshots" }
32826
+ );
32827
+ if (response.success) {
32828
+ return response;
32829
+ }
32830
+ throw new Error(response.message);
32831
+ } catch (error) {
32832
+ throw new Error(`Failed to recreate screenshots: ${error.message}`, { cause: error });
32833
+ }
32834
+ }
32835
+ async deleteProjectScreenshots(projectKey) {
32836
+ this._requireReady("deleteProjectScreenshots");
32837
+ if (!projectKey) {
32838
+ throw new Error("projectKey is required");
32839
+ }
32840
+ try {
32841
+ const response = await this._request(
32842
+ `/screenshots/projects/${encodeURIComponent(projectKey)}`,
32843
+ { method: "DELETE", methodName: "deleteProjectScreenshots" }
32844
+ );
32845
+ if (response.success) {
32846
+ return response;
32847
+ }
32848
+ throw new Error(response.message);
32849
+ } catch (error) {
32850
+ throw new Error(`Failed to delete project screenshots: ${error.message}`, { cause: error });
32851
+ }
32852
+ }
32853
+ // ==================== THUMBNAIL ====================
32854
+ async getThumbnailCandidate(projectKey, options = {}) {
32855
+ this._requireReady("getThumbnailCandidate");
32856
+ if (!projectKey) {
32857
+ throw new Error("projectKey is required");
32858
+ }
32859
+ const { includeData = false } = options;
32860
+ const qs = new URLSearchParams();
32861
+ if (includeData) {
32862
+ qs.set("include_data", "true");
32863
+ }
32864
+ try {
32865
+ const response = await this._request(
32866
+ `/screenshots/projects/${encodeURIComponent(projectKey)}/thumbnail/candidate${qs.toString() ? `?${qs.toString()}` : ""}`,
32867
+ { method: "GET", methodName: "getThumbnailCandidate" }
32868
+ );
32869
+ if (response.success) {
32870
+ return response;
32871
+ }
32872
+ throw new Error(response.message);
32873
+ } catch (error) {
32874
+ throw new Error(`Failed to get thumbnail candidate: ${error.message}`, { cause: error });
32875
+ }
32876
+ }
32877
+ async updateProjectThumbnail(projectKey, body = {}) {
32878
+ this._requireReady("updateProjectThumbnail");
32879
+ if (!projectKey) {
32880
+ throw new Error("projectKey is required");
32881
+ }
32882
+ try {
32883
+ const response = await this._request(
32884
+ `/screenshots/projects/${encodeURIComponent(projectKey)}/thumbnail`,
32885
+ { method: "POST", body: JSON.stringify(body), methodName: "updateProjectThumbnail" }
32886
+ );
32887
+ if (response.success) {
32888
+ return response;
32889
+ }
32890
+ throw new Error(response.message);
32891
+ } catch (error) {
32892
+ throw new Error(`Failed to update project thumbnail: ${error.message}`, { cause: error });
32893
+ }
32894
+ }
32895
+ // ==================== INDIVIDUAL SHOTS ====================
32896
+ async getPageScreenshot(screenshotId, format = "json") {
32897
+ this._requireReady("getPageScreenshot");
32898
+ if (!screenshotId) {
32899
+ throw new Error("screenshotId is required");
32900
+ }
32901
+ const qs = new URLSearchParams();
32902
+ if (format) {
32903
+ qs.set("format", format);
32904
+ }
32905
+ try {
32906
+ return await this._request(
32907
+ `/screenshots/pages/${encodeURIComponent(screenshotId)}${qs.toString() ? `?${qs.toString()}` : ""}`,
32908
+ { method: "GET", methodName: "getPageScreenshot" }
32909
+ );
32910
+ } catch (error) {
32911
+ throw new Error(`Failed to get page screenshot: ${error.message}`, { cause: error });
32912
+ }
32913
+ }
32914
+ async getComponentScreenshot(screenshotId, format = "json") {
32915
+ this._requireReady("getComponentScreenshot");
32916
+ if (!screenshotId) {
32917
+ throw new Error("screenshotId is required");
32918
+ }
32919
+ const qs = new URLSearchParams();
32920
+ if (format) {
32921
+ qs.set("format", format);
32922
+ }
32923
+ try {
32924
+ return await this._request(
32925
+ `/screenshots/components/${encodeURIComponent(screenshotId)}${qs.toString() ? `?${qs.toString()}` : ""}`,
32926
+ { method: "GET", methodName: "getComponentScreenshot" }
32927
+ );
32928
+ } catch (error) {
32929
+ throw new Error(`Failed to get component screenshot: ${error.message}`, { cause: error });
32930
+ }
32931
+ }
32932
+ async getScreenshotByKey(projectKey, type, key, format = "json") {
32933
+ this._requireReady("getScreenshotByKey");
32934
+ if (!projectKey) {
32935
+ throw new Error("projectKey is required");
32936
+ }
32937
+ if (!type || !["component", "page"].includes(String(type))) {
32938
+ throw new Error("type must be 'component' or 'page'");
32939
+ }
32940
+ if (!key) {
32941
+ throw new Error("key is required");
32942
+ }
32943
+ const qs = new URLSearchParams();
32944
+ if (format) {
32945
+ qs.set("format", format);
32946
+ }
32947
+ const sub = type === "component" ? "components" : "pages";
32948
+ try {
32949
+ return await this._request(
32950
+ `/screenshots/projects/${encodeURIComponent(projectKey)}/${sub}/${encodeURIComponent(key)}${qs.toString() ? `?${qs.toString()}` : ""}`,
32951
+ { method: "GET", methodName: "getScreenshotByKey" }
32952
+ );
32953
+ } catch (error) {
32954
+ throw new Error(`Failed to get screenshot by key: ${error.message}`, { cause: error });
32955
+ }
32956
+ }
32957
+ async getQueueStatistics() {
32958
+ this._requireReady("getQueueStatistics");
32959
+ try {
32960
+ const response = await this._request("/screenshots/queue/stats", {
32961
+ method: "GET",
32962
+ methodName: "getQueueStatistics"
32963
+ });
32964
+ if (response.success) {
32965
+ return response;
32966
+ }
32967
+ throw new Error(response.message);
32968
+ } catch (error) {
32969
+ throw new Error(`Failed to get queue statistics: ${error.message}`, { cause: error });
32970
+ }
32971
+ }
32972
+ // ==================== COMBINATION/DEBOUNCED ====================
32973
+ /**
32974
+ * Debounced thumbnail refresh that recreates screenshots and then updates thumbnail.
32975
+ * Subsequent calls within debounce window reset the timer.
32976
+ */
32977
+ async refreshThumbnail(projectKey, options = {}) {
32978
+ this._requireReady("refreshThumbnail");
32979
+ if (!projectKey) {
32980
+ throw new Error("projectKey is required");
32981
+ }
32982
+ const {
32983
+ debounceMs = 15e3,
32984
+ waitAfterRecreateMs = 2e4,
32985
+ recreate = {
32986
+ process_pages: true,
32987
+ process_components: false,
32988
+ process_descriptions: false,
32989
+ force: false,
32990
+ priority: 5
32991
+ },
32992
+ thumbnail = {
32993
+ strategy: "auto",
32994
+ force: true
32995
+ }
32996
+ } = options;
32997
+ const existingTimer = this._debounceTimers.get(projectKey);
32998
+ if (existingTimer) {
32999
+ clearTimeout(existingTimer);
33000
+ }
33001
+ const executionPromise = await new Promise((resolve) => {
33002
+ const timer = setTimeout(async () => {
33003
+ try {
33004
+ await this.recreateProjectScreenshots(projectKey, recreate);
33005
+ await new Promise((resolveDelay) => {
33006
+ setTimeout(resolveDelay, waitAfterRecreateMs);
33007
+ });
33008
+ const result = await this.updateProjectThumbnail(projectKey, thumbnail);
33009
+ resolve(result);
33010
+ } catch (e) {
33011
+ resolve({ success: false, error: (e == null ? void 0 : e.message) || String(e) });
33012
+ } finally {
33013
+ this._debounceTimers.delete(projectKey);
33014
+ this._inflightRefreshes.delete(projectKey);
33015
+ }
33016
+ }, debounceMs);
33017
+ this._debounceTimers.set(projectKey, timer);
33018
+ });
33019
+ this._inflightRefreshes.set(projectKey, executionPromise);
33020
+ return executionPromise;
33021
+ }
33022
+ };
33023
+
32363
33024
  // src/services/index.js
32364
33025
  var createService = (ServiceClass, config) => new ServiceClass(config);
32365
33026
  var createAuthService = (config) => createService(AuthService, config);
@@ -32374,6 +33035,7 @@ var createDnsService = (config) => createService(DnsService, config);
32374
33035
  var createBranchService = (config) => createService(BranchService, config);
32375
33036
  var createPullRequestService = (config) => createService(PullRequestService, config);
32376
33037
  var createAdminService = (config) => createService(AdminService, config);
33038
+ var createScreenshotService = (config) => createService(ScreenshotService, config);
32377
33039
 
32378
33040
  // src/utils/services.js
32379
33041
  var SERVICE_METHODS = {
@@ -32601,7 +33263,20 @@ var SERVICE_METHODS = {
32601
33263
  promoteToAdmin: "admin",
32602
33264
  demoteFromAdmin: "admin",
32603
33265
  // Utility methods
32604
- getHealthStatus: "core"
33266
+ getHealthStatus: "core",
33267
+ // Screenshot methods
33268
+ createScreenshotProject: "screenshot",
33269
+ getProjectScreenshots: "screenshot",
33270
+ reprocessProjectScreenshots: "screenshot",
33271
+ recreateProjectScreenshots: "screenshot",
33272
+ deleteProjectScreenshots: "screenshot",
33273
+ getThumbnailCandidate: "screenshot",
33274
+ updateProjectThumbnail: "screenshot",
33275
+ getPageScreenshot: "screenshot",
33276
+ getComponentScreenshot: "screenshot",
33277
+ getScreenshotByKey: "screenshot",
33278
+ getQueueStatistics: "screenshot",
33279
+ refreshThumbnail: "screenshot"
32605
33280
  };
32606
33281
 
32607
33282
  // src/index.js
@@ -32610,6 +33285,7 @@ var SDK = class {
32610
33285
  this._services = /* @__PURE__ */ new Map();
32611
33286
  this._context = {};
32612
33287
  this._options = this._validateOptions(options);
33288
+ this.rootBus = rootBus;
32613
33289
  this._createServiceProxies();
32614
33290
  }
32615
33291
  // Initialize SDK with context
@@ -32703,6 +33379,13 @@ var SDK = class {
32703
33379
  context: this._context,
32704
33380
  options: this._options
32705
33381
  })
33382
+ ),
33383
+ this._initService(
33384
+ "screenshot",
33385
+ createScreenshotService({
33386
+ context: this._context,
33387
+ options: this._options
33388
+ })
32706
33389
  )
32707
33390
  ]);
32708
33391
  return this;
@@ -32740,9 +33423,10 @@ var SDK = class {
32740
33423
  }
32741
33424
  // Update context
32742
33425
  updateContext(newContext) {
33426
+ const { authToken, ...sanitized } = newContext || {};
32743
33427
  this._context = {
32744
33428
  ...this._context,
32745
- ...newContext
33429
+ ...sanitized
32746
33430
  };
32747
33431
  for (const service of this._services.values()) {
32748
33432
  service.updateContext(this._context);
@@ -32751,9 +33435,7 @@ var SDK = class {
32751
33435
  // Check if SDK is ready
32752
33436
  isReady() {
32753
33437
  const sdkServices = Array.from(this._services.values());
32754
- return sdkServices.length > 0 && sdkServices.every(
32755
- (service) => service.isReady()
32756
- );
33438
+ return sdkServices.length > 0 && sdkServices.every((service) => service.isReady());
32757
33439
  }
32758
33440
  // Get SDK status
32759
33441
  getStatus() {