@symbo.ls/sdk 3.2.3 → 3.2.7

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 (183) hide show
  1. package/README.md +141 -0
  2. package/dist/cjs/config/environment.js +94 -10
  3. package/dist/cjs/index.js +152 -12
  4. package/dist/cjs/services/AdminService.js +351 -0
  5. package/dist/cjs/services/AuthService.js +738 -305
  6. package/dist/cjs/services/BaseService.js +158 -6
  7. package/dist/cjs/services/BranchService.js +484 -0
  8. package/dist/cjs/services/CollabService.js +439 -116
  9. package/dist/cjs/services/DnsService.js +340 -0
  10. package/dist/cjs/services/FeatureFlagService.js +175 -0
  11. package/dist/cjs/services/FileService.js +201 -0
  12. package/dist/cjs/services/IntegrationService.js +538 -0
  13. package/dist/cjs/services/MetricsService.js +62 -0
  14. package/dist/cjs/services/PaymentService.js +271 -0
  15. package/dist/cjs/services/PlanService.js +426 -0
  16. package/dist/cjs/services/ProjectService.js +1207 -0
  17. package/dist/cjs/services/PullRequestService.js +503 -0
  18. package/dist/cjs/services/ScreenshotService.js +304 -0
  19. package/dist/cjs/services/SubscriptionService.js +396 -0
  20. package/dist/cjs/services/TrackingService.js +661 -0
  21. package/dist/cjs/services/WaitlistService.js +148 -0
  22. package/dist/cjs/services/index.js +60 -4
  23. package/dist/cjs/state/RootStateManager.js +2 -23
  24. package/dist/cjs/state/rootEventBus.js +9 -0
  25. package/dist/cjs/utils/CollabClient.js +78 -12
  26. package/dist/cjs/utils/TokenManager.js +16 -3
  27. package/dist/cjs/utils/changePreprocessor.js +199 -0
  28. package/dist/cjs/utils/jsonDiff.js +46 -4
  29. package/dist/cjs/utils/ordering.js +309 -0
  30. package/dist/cjs/utils/services.js +285 -128
  31. package/dist/cjs/utils/validation.js +0 -3
  32. package/dist/esm/config/environment.js +94 -10
  33. package/dist/esm/index.js +47862 -18248
  34. package/dist/esm/services/AdminService.js +1132 -0
  35. package/dist/esm/services/AuthService.js +1493 -386
  36. package/dist/esm/services/BaseService.js +757 -6
  37. package/dist/esm/services/BranchService.js +1265 -0
  38. package/dist/esm/services/CollabService.js +24956 -16089
  39. package/dist/esm/services/DnsService.js +1121 -0
  40. package/dist/esm/services/FeatureFlagService.js +956 -0
  41. package/dist/esm/services/FileService.js +982 -0
  42. package/dist/esm/services/IntegrationService.js +1319 -0
  43. package/dist/esm/services/MetricsService.js +843 -0
  44. package/dist/esm/services/PaymentService.js +1052 -0
  45. package/dist/esm/services/PlanService.js +1207 -0
  46. package/dist/esm/services/ProjectService.js +2526 -0
  47. package/dist/esm/services/PullRequestService.js +1284 -0
  48. package/dist/esm/services/ScreenshotService.js +1085 -0
  49. package/dist/esm/services/SubscriptionService.js +1177 -0
  50. package/dist/esm/services/TrackingService.js +18454 -0
  51. package/dist/esm/services/WaitlistService.js +929 -0
  52. package/dist/esm/services/index.js +47373 -18027
  53. package/dist/esm/state/RootStateManager.js +11 -23
  54. package/dist/esm/state/rootEventBus.js +9 -0
  55. package/dist/esm/utils/CollabClient.js +17526 -16120
  56. package/dist/esm/utils/TokenManager.js +16 -3
  57. package/dist/esm/utils/changePreprocessor.js +542 -0
  58. package/dist/esm/utils/jsonDiff.js +958 -43
  59. package/dist/esm/utils/ordering.js +291 -0
  60. package/dist/esm/utils/services.js +285 -128
  61. package/dist/esm/utils/validation.js +116 -50
  62. package/dist/node/config/environment.js +94 -10
  63. package/dist/node/index.js +183 -16
  64. package/dist/node/services/AdminService.js +332 -0
  65. package/dist/node/services/AuthService.js +742 -310
  66. package/dist/node/services/BaseService.js +148 -6
  67. package/dist/node/services/BranchService.js +465 -0
  68. package/dist/node/services/CollabService.js +439 -116
  69. package/dist/node/services/DnsService.js +321 -0
  70. package/dist/node/services/FeatureFlagService.js +156 -0
  71. package/dist/node/services/FileService.js +182 -0
  72. package/dist/node/services/IntegrationService.js +519 -0
  73. package/dist/node/services/MetricsService.js +43 -0
  74. package/dist/node/services/PaymentService.js +252 -0
  75. package/dist/node/services/PlanService.js +407 -0
  76. package/dist/node/services/ProjectService.js +1188 -0
  77. package/dist/node/services/PullRequestService.js +484 -0
  78. package/dist/node/services/ScreenshotService.js +285 -0
  79. package/dist/node/services/SubscriptionService.js +377 -0
  80. package/dist/node/services/TrackingService.js +632 -0
  81. package/dist/node/services/WaitlistService.js +129 -0
  82. package/dist/node/services/index.js +60 -4
  83. package/dist/node/state/RootStateManager.js +2 -23
  84. package/dist/node/state/rootEventBus.js +9 -0
  85. package/dist/node/utils/CollabClient.js +77 -11
  86. package/dist/node/utils/TokenManager.js +16 -3
  87. package/dist/node/utils/changePreprocessor.js +180 -0
  88. package/dist/node/utils/jsonDiff.js +46 -4
  89. package/dist/node/utils/ordering.js +290 -0
  90. package/dist/node/utils/services.js +285 -128
  91. package/dist/node/utils/validation.js +0 -3
  92. package/package.json +30 -18
  93. package/src/config/environment.js +95 -10
  94. package/src/index.js +190 -23
  95. package/src/services/AdminService.js +374 -0
  96. package/src/services/AuthService.js +874 -328
  97. package/src/services/BaseService.js +166 -6
  98. package/src/services/BranchService.js +536 -0
  99. package/src/services/CollabService.js +557 -148
  100. package/src/services/DnsService.js +366 -0
  101. package/src/services/FeatureFlagService.js +174 -0
  102. package/src/services/FileService.js +213 -0
  103. package/src/services/IntegrationService.js +548 -0
  104. package/src/services/MetricsService.js +40 -0
  105. package/src/services/PaymentService.js +287 -0
  106. package/src/services/PlanService.js +468 -0
  107. package/src/services/ProjectService.js +1366 -0
  108. package/src/services/PullRequestService.js +537 -0
  109. package/src/services/ScreenshotService.js +258 -0
  110. package/src/services/SubscriptionService.js +425 -0
  111. package/src/services/TrackingService.js +853 -0
  112. package/src/services/WaitlistService.js +130 -0
  113. package/src/services/index.js +79 -5
  114. package/src/services/tests/BranchService/createBranch.test.js +153 -0
  115. package/src/services/tests/BranchService/deleteBranch.test.js +173 -0
  116. package/src/services/tests/BranchService/getBranchChanges.test.js +146 -0
  117. package/src/services/tests/BranchService/listBranches.test.js +87 -0
  118. package/src/services/tests/BranchService/mergeBranch.test.js +210 -0
  119. package/src/services/tests/BranchService/publishVersion.test.js +183 -0
  120. package/src/services/tests/BranchService/renameBranch.test.js +240 -0
  121. package/src/services/tests/BranchService/resetBranch.test.js +152 -0
  122. package/src/services/tests/FeatureFlagService/adminFeatureFlags.test.js +67 -0
  123. package/src/services/tests/FeatureFlagService/getFeatureFlags.test.js +75 -0
  124. package/src/services/tests/FileService/createFileFormData.test.js +74 -0
  125. package/src/services/tests/FileService/getFileUrl.test.js +69 -0
  126. package/src/services/tests/FileService/updateProjectIcon.test.js +109 -0
  127. package/src/services/tests/FileService/uploadDocument.test.js +36 -0
  128. package/src/services/tests/FileService/uploadFile.test.js +78 -0
  129. package/src/services/tests/FileService/uploadFileWithValidation.test.js +114 -0
  130. package/src/services/tests/FileService/uploadImage.test.js +36 -0
  131. package/src/services/tests/FileService/uploadMultipleFiles.test.js +111 -0
  132. package/src/services/tests/FileService/validateFile.test.js +63 -0
  133. package/src/services/tests/PlanService/createPlan.test.js +104 -0
  134. package/src/services/tests/PlanService/createPlanWithValidation.test.js +523 -0
  135. package/src/services/tests/PlanService/deletePlan.test.js +92 -0
  136. package/src/services/tests/PlanService/getActivePlans.test.js +123 -0
  137. package/src/services/tests/PlanService/getAdminPlans.test.js +84 -0
  138. package/src/services/tests/PlanService/getPlan.test.js +50 -0
  139. package/src/services/tests/PlanService/getPlanByKey.test.js +109 -0
  140. package/src/services/tests/PlanService/getPlanWithValidation.test.js +85 -0
  141. package/src/services/tests/PlanService/getPlans.test.js +53 -0
  142. package/src/services/tests/PlanService/getPlansByPriceRange.test.js +109 -0
  143. package/src/services/tests/PlanService/getPlansWithValidation.test.js +48 -0
  144. package/src/services/tests/PlanService/initializePlans.test.js +75 -0
  145. package/src/services/tests/PlanService/updatePlan.test.js +111 -0
  146. package/src/services/tests/PlanService/updatePlanWithValidation.test.js +556 -0
  147. package/src/state/RootStateManager.js +37 -32
  148. package/src/state/rootEventBus.js +19 -0
  149. package/src/utils/CollabClient.js +99 -12
  150. package/src/utils/TokenManager.js +20 -3
  151. package/src/utils/changePreprocessor.js +239 -0
  152. package/src/utils/jsonDiff.js +40 -5
  153. package/src/utils/ordering.js +271 -0
  154. package/src/utils/services.js +306 -139
  155. package/src/utils/validation.js +0 -3
  156. package/dist/cjs/services/AIService.js +0 -155
  157. package/dist/cjs/services/BasedService.js +0 -1185
  158. package/dist/cjs/services/CoreService.js +0 -2295
  159. package/dist/cjs/services/SocketService.js +0 -309
  160. package/dist/cjs/services/SymstoryService.js +0 -571
  161. package/dist/cjs/utils/basedQuerys.js +0 -181
  162. package/dist/cjs/utils/symstoryClient.js +0 -259
  163. package/dist/esm/services/AIService.js +0 -185
  164. package/dist/esm/services/BasedService.js +0 -5262
  165. package/dist/esm/services/CoreService.js +0 -2827
  166. package/dist/esm/services/SocketService.js +0 -456
  167. package/dist/esm/services/SymstoryService.js +0 -7025
  168. package/dist/esm/utils/basedQuerys.js +0 -163
  169. package/dist/esm/utils/symstoryClient.js +0 -354
  170. package/dist/node/services/AIService.js +0 -136
  171. package/dist/node/services/BasedService.js +0 -1156
  172. package/dist/node/services/CoreService.js +0 -2266
  173. package/dist/node/services/SocketService.js +0 -280
  174. package/dist/node/services/SymstoryService.js +0 -542
  175. package/dist/node/utils/basedQuerys.js +0 -162
  176. package/dist/node/utils/symstoryClient.js +0 -230
  177. package/src/services/AIService.js +0 -150
  178. package/src/services/BasedService.js +0 -1302
  179. package/src/services/CoreService.js +0 -2548
  180. package/src/services/SocketService.js +0 -336
  181. package/src/services/SymstoryService.js +0 -649
  182. package/src/utils/basedQuerys.js +0 -164
  183. package/src/utils/symstoryClient.js +0 -252
@@ -10,7 +10,9 @@ const CONFIG = {
10
10
  // Feature toggles that apply across all environments by default
11
11
  features: {
12
12
  newUserOnboarding: true,
13
- betaFeatures: false
13
+ betaFeatures: false,
14
+ // Tracking is enabled by default unless overridden per environment
15
+ trackingEnabled: true
14
16
  }
15
17
  },
16
18
 
@@ -23,16 +25,36 @@ const CONFIG = {
23
25
  basedEnv: 'development', // For based api
24
26
  basedProject: 'platform-v2-sm', // For based api
25
27
  basedOrg: 'symbols', // For based api
26
- githubClientId: 'Ov23liHxyWFBxS8f1gnF', // For github api
28
+ githubClientId: 'Ov23liAFrsR0StbAO6PO', // For github api
29
+ grafanaUrl: '', // For grafana tracing
30
+ grafanaAppName: 'Symbols Localhost',
27
31
  // Environment-specific feature toggles (override common)
28
32
  features: {
29
- betaFeatures: true // Enable beta features in local dev
30
- }
33
+ // Disable tracking by default on localhost/dev machines
34
+ trackingEnabled: false,
35
+ // Enable beta features in local dev
36
+ betaFeatures: true,
37
+ // Preserve common defaults explicitly for local
38
+ newUserOnboarding: true
39
+ },
40
+ typesenseCollectionName: 'docs',
41
+ typesenseApiKey: 'vZya3L2zpq8L6iI5WWMUZJZABvT63VDb',
42
+ typesenseHost: 'localhost',
43
+ typesensePort: '8108',
44
+ typesenseProtocol: 'http'
31
45
  },
32
46
  development: {
33
47
  socketUrl: 'https://dev.api.symbols.app',
34
48
  apiUrl: 'https://dev.api.symbols.app',
35
- githubClientId: 'Ov23liHxyWFBxS8f1gnF'
49
+ githubClientId: 'Ov23liHxyWFBxS8f1gnF',
50
+ grafanaUrl:
51
+ 'https://faro-collector-prod-us-east-0.grafana.net/collect/7a3ba473cee2025c68513667024316b8', // For grafana tracing
52
+ grafanaAppName: 'Symbols Dev',
53
+ typesenseCollectionName: 'docs',
54
+ typesenseApiKey: 'awmcVpbWqZi9IUgmvslp1C5LKDU8tMjA',
55
+ typesenseHost: 'tl2qpnwxev4cjm36p-1.a1.typesense.net',
56
+ typesensePort: '443',
57
+ typesenseProtocol: 'https'
36
58
  },
37
59
  testing: {
38
60
  socketUrl: 'https://test.api.symbols.app',
@@ -40,12 +62,26 @@ const CONFIG = {
40
62
  basedEnv: 'testing',
41
63
  basedProject: 'platform-v2-sm',
42
64
  basedOrg: 'symbols',
43
- githubClientId: 'Ov23liHxyWFBxS8f1gnF'
65
+ githubClientId: 'Ov23liHxyWFBxS8f1gnF',
66
+ grafanaUrl: '', // For grafana tracing
67
+ grafanaAppName: 'Symbols Test',
68
+ typesenseCollectionName: 'docs',
69
+ typesenseApiKey: 'awmcVpbWqZi9IUgmvslp1C5LKDU8tMjA',
70
+ typesenseHost: 'tl2qpnwxev4cjm36p-1.a1.typesense.net',
71
+ typesensePort: '443',
72
+ typesenseProtocol: 'https'
44
73
  },
45
74
  upcoming: {
46
75
  socketUrl: 'https://upcoming.api.symbols.app',
47
76
  apiUrl: 'https://upcoming.api.symbols.app',
48
- githubClientId: 'Ov23liWF7NvdZ056RV5J'
77
+ githubClientId: 'Ov23liWF7NvdZ056RV5J',
78
+ grafanaUrl: '', // For grafana tracing
79
+ grafanaAppName: 'Symbols Upcoming',
80
+ typesenseCollectionName: 'docs',
81
+ typesenseApiKey: 'awmcVpbWqZi9IUgmvslp1C5LKDU8tMjA',
82
+ typesenseHost: 'tl2qpnwxev4cjm36p-1.a1.typesense.net',
83
+ typesensePort: '443',
84
+ typesenseProtocol: 'https'
49
85
  },
50
86
  staging: {
51
87
  socketUrl: 'https://staging.api.symbols.app',
@@ -53,7 +89,30 @@ const CONFIG = {
53
89
  basedEnv: 'staging',
54
90
  basedProject: 'platform-v2-sm',
55
91
  basedOrg: 'symbols',
56
- githubClientId: 'Ov23ligwZDQVD0VfuWNa'
92
+ githubClientId: 'Ov23ligwZDQVD0VfuWNa',
93
+ grafanaUrl: '', // For grafana tracing
94
+ grafanaAppName: 'Symbols Staging',
95
+ typesenseCollectionName: 'docs',
96
+ typesenseApiKey: 'awmcVpbWqZi9IUgmvslp1C5LKDU8tMjA',
97
+ typesenseHost: 'tl2qpnwxev4cjm36p-1.a1.typesense.net',
98
+ typesensePort: '443',
99
+ typesenseProtocol: 'https'
100
+ },
101
+ preview: {
102
+ socketUrl: 'https://api.symbols.app',
103
+ apiUrl: 'https://api.symbols.app',
104
+ basedEnv: 'production',
105
+ basedProject: 'platform-v2-sm',
106
+ basedOrg: 'symbols',
107
+ githubClientId: 'Ov23liFAlOEIXtX3dBtR',
108
+ grafanaUrl:
109
+ 'https://faro-collector-prod-us-east-0.grafana.net/collect/5c1089f3c3eea4ec5658e05c3f53baae', // For grafana tracing
110
+ grafanaAppName: 'Symbols Preview',
111
+ typesenseCollectionName: 'docs',
112
+ typesenseApiKey: 'awmcVpbWqZi9IUgmvslp1C5LKDU8tMjA',
113
+ typesenseHost: 'tl2qpnwxev4cjm36p-1.a1.typesense.net',
114
+ typesensePort: '443',
115
+ typesenseProtocol: 'https'
57
116
  },
58
117
  production: {
59
118
  socketUrl: 'https://api.symbols.app',
@@ -61,7 +120,15 @@ const CONFIG = {
61
120
  basedEnv: 'production',
62
121
  basedProject: 'platform-v2-sm',
63
122
  basedOrg: 'symbols',
64
- githubClientId: 'Ov23liFAlOEIXtX3dBtR'
123
+ githubClientId: 'Ov23liFAlOEIXtX3dBtR',
124
+ grafanaUrl:
125
+ 'https://faro-collector-prod-us-east-0.grafana.net/collect/5c1089f3c3eea4ec5658e05c3f53baae', // For grafana tracing
126
+ grafanaAppName: 'Symbols',
127
+ typesenseCollectionName: 'docs',
128
+ typesenseApiKey: 'awmcVpbWqZi9IUgmvslp1C5LKDU8tMjA',
129
+ typesenseHost: 'tl2qpnwxev4cjm36p-1.a1.typesense.net',
130
+ typesensePort: '443',
131
+ typesenseProtocol: 'https'
65
132
  }
66
133
  }
67
134
 
@@ -87,6 +154,11 @@ export const getConfig = () => {
87
154
  // Create the final config with environment variable overrides
88
155
  const finalConfig = {
89
156
  ...envConfig,
157
+ // Deep-merge feature flags so env-specific overrides don't drop common defaults
158
+ features: {
159
+ ...(CONFIG.common.features || {}),
160
+ ...((CONFIG[env] && CONFIG[env].features) || {})
161
+ },
90
162
  socketUrl: process.env.SYMBOLS_APP_SOCKET_URL || envConfig.socketUrl,
91
163
  apiUrl: process.env.SYMBOLS_APP_API_URL || envConfig.apiUrl,
92
164
  basedEnv: process.env.SYMBOLS_APP_BASED_ENV || envConfig.basedEnv,
@@ -95,9 +167,20 @@ export const getConfig = () => {
95
167
  basedOrg: process.env.SYMBOLS_APP_BASED_ORG || envConfig.basedOrg,
96
168
  githubClientId:
97
169
  process.env.SYMBOLS_APP_GITHUB_CLIENT_ID || envConfig.githubClientId,
170
+ grafanaUrl: process.env.SYMBOLS_APP_GRAFANA_URL || envConfig.grafanaUrl,
171
+ typesenseCollectionName:
172
+ process.env.TYPESENSE_COLLECTION_NAME ||
173
+ envConfig.typesenseCollectionName,
174
+ typesenseApiKey:
175
+ process.env.TYPESENSE_API_KEY || envConfig.typesenseApiKey,
176
+ typesenseHost: process.env.TYPESENSE_HOST || envConfig.typesenseHost,
177
+ typesensePort: process.env.TYPESENSE_PORT || envConfig.typesensePort,
178
+ typesenseProtocol:
179
+ process.env.TYPESENSE_PROTOCOL || envConfig.typesenseProtocol,
98
180
  isDevelopment: isDevelopment(env),
99
181
  isTesting: env === 'testing',
100
182
  isStaging: env === 'staging',
183
+ isPreview: env === 'preview',
101
184
  isProduction: env === 'production'
102
185
  // Store all environment variables for potential future use
103
186
  }
@@ -119,11 +202,13 @@ export const getConfig = () => {
119
202
  }
120
203
 
121
204
  if (finalConfig.isDevelopment) {
122
- console.log(
205
+ console.warn(
123
206
  'environment in SDK:',
124
207
  env || process.env.NODE_ENV || process.env.NODE_ENV
125
208
  )
126
209
  console.log(finalConfig)
210
+ } else if (global.window) {
211
+ global.window.finalConfig = finalConfig
127
212
  }
128
213
 
129
214
  return finalConfig
package/src/index.js CHANGED
@@ -1,11 +1,36 @@
1
1
  import {
2
2
  createAuthService,
3
- createCoreService,
4
- createCollabService
3
+ createCollabService,
4
+ createProjectService,
5
+ createPlanService,
6
+ createFileService,
7
+ createPaymentService,
8
+ createDnsService,
9
+ createBranchService,
10
+ createPullRequestService,
11
+ createAdminService,
12
+ createSubscriptionService,
13
+ createScreenshotService,
14
+ createTrackingService,
15
+ createWaitlistService,
16
+ createMetricsService,
17
+ createIntegrationService,
18
+ createFeatureFlagService
5
19
  } from './services/index.js'
6
20
 
7
21
  import { SERVICE_METHODS } from './utils/services.js'
8
22
  import environment from './config/environment.js'
23
+ import { rootBus } from './state/rootEventBus.js'
24
+
25
+ const isBrowserEnvironment = () => typeof window !== 'undefined'
26
+
27
+ export const isLocalhost = () => {
28
+ if (!isBrowserEnvironment()) {
29
+ return false
30
+ }
31
+ const host = window.location && window.location.hostname
32
+ return host === 'localhost' || host === '127.0.0.1' || host === '::1' || host === '' || !host
33
+ }
9
34
 
10
35
  export class SDK {
11
36
  constructor (options = {}) {
@@ -13,6 +38,12 @@ export class SDK {
13
38
  this._context = {}
14
39
  this._options = this._validateOptions(options)
15
40
 
41
+ // Expose resolved environment config on SDK instance
42
+ this.environment = environment
43
+
44
+ // Expose root event bus on SDK instance
45
+ this.rootBus = rootBus
46
+
16
47
  // Create proxy methods for direct service access
17
48
  this._createServiceProxies()
18
49
  }
@@ -35,15 +66,114 @@ export class SDK {
35
66
  })
36
67
  ),
37
68
  this._initService(
38
- 'core',
39
- createCoreService({
69
+ 'collab',
70
+ createCollabService({
40
71
  context: this._context,
41
72
  options: this._options
42
73
  })
43
74
  ),
75
+ // Initialize new modular services
44
76
  this._initService(
45
- 'collab',
46
- createCollabService({
77
+ 'project',
78
+ createProjectService({
79
+ context: this._context,
80
+ options: this._options
81
+ })
82
+ ),
83
+ this._initService(
84
+ 'plan',
85
+ createPlanService({
86
+ context: this._context,
87
+ options: this._options
88
+ })
89
+ ),
90
+ this._initService(
91
+ 'subscription',
92
+ createSubscriptionService({
93
+ context: this._context,
94
+ options: this._options
95
+ })
96
+ ),
97
+ this._initService(
98
+ 'file',
99
+ createFileService({
100
+ context: this._context,
101
+ options: this._options
102
+ })
103
+ ),
104
+ this._initService(
105
+ 'payment',
106
+ createPaymentService({
107
+ context: this._context,
108
+ options: this._options
109
+ })
110
+ ),
111
+ this._initService(
112
+ 'dns',
113
+ createDnsService({
114
+ context: this._context,
115
+ options: this._options
116
+ })
117
+ ),
118
+ this._initService(
119
+ 'branch',
120
+ createBranchService({
121
+ context: this._context,
122
+ options: this._options
123
+ })
124
+ ),
125
+ this._initService(
126
+ 'pullRequest',
127
+ createPullRequestService({
128
+ context: this._context,
129
+ options: this._options
130
+ })
131
+ ),
132
+ this._initService(
133
+ 'admin',
134
+ createAdminService({
135
+ context: this._context,
136
+ options: this._options
137
+ })
138
+ ),
139
+ this._initService(
140
+ 'screenshot',
141
+ createScreenshotService({
142
+ context: this._context,
143
+ options: this._options
144
+ })
145
+ ),
146
+ this._initService(
147
+ 'tracking',
148
+ createTrackingService({
149
+ context: this._context,
150
+ options: this._options
151
+ })
152
+ ),
153
+ this._initService(
154
+ 'waitlist',
155
+ createWaitlistService({
156
+ context: this._context,
157
+ options: this._options
158
+ })
159
+ ),
160
+ this._initService(
161
+ 'metrics',
162
+ createMetricsService({
163
+ context: this._context,
164
+ options: this._options
165
+ })
166
+ ),
167
+ this._initService(
168
+ 'integration',
169
+ createIntegrationService({
170
+ context: this._context,
171
+ options: this._options
172
+ })
173
+ ),
174
+ this._initService(
175
+ 'featureFlag',
176
+ createFeatureFlagService({
47
177
  context: this._context,
48
178
  options: this._options
49
179
  })
@@ -71,16 +201,36 @@ export class SDK {
71
201
  }
72
202
 
73
203
  _validateOptions (options) {
204
+ const onLocalhost = isLocalhost()
205
+ const hasGrafanaUrl = Boolean(environment.grafanaUrl)
74
206
  const defaults = {
75
207
  useNewServices: true, // Use new service implementations by default
76
208
  apiUrl: environment.apiUrl,
77
209
  socketUrl: environment.socketUrl,
78
210
  timeout: 30000,
79
211
  retryAttempts: 3,
80
- debug: false
212
+ debug: false,
213
+ tracking: {
214
+ // Force-disabled on localhost or when no Grafana URL is configured
215
+ enabled: onLocalhost ? false : (hasGrafanaUrl ? environment.features.trackingEnabled : false)
216
+ }
81
217
  }
82
218
 
83
- return { ...defaults, ...options }
219
+ const merged = {
220
+ ...defaults,
221
+ ...options,
222
+ tracking: {
223
+ ...defaults.tracking,
224
+ ...(options.tracking || {})
225
+ }
226
+ }
227
+
228
+ // Enforce disabled tracking on localhost or when no Grafana URL configured, even if overridden
229
+ if (onLocalhost || !hasGrafanaUrl) {
230
+ merged.tracking.enabled = false
231
+ }
232
+
233
+ return merged
84
234
  }
85
235
 
86
236
  // Get service instance
@@ -93,9 +243,12 @@ export class SDK {
93
243
 
94
244
  // Update context
95
245
  updateContext (newContext) {
246
+ // Do not persist authToken in SDK context; TokenManager is the source of truth
247
+ const { ...sanitized } = newContext || {}
248
+
96
249
  this._context = {
97
250
  ...this._context,
98
- ...newContext
251
+ ...sanitized
99
252
  }
100
253
 
101
254
  // Update context for all services
@@ -107,8 +260,9 @@ export class SDK {
107
260
  // Check if SDK is ready
108
261
  isReady () {
109
262
  const sdkServices = Array.from(this._services.values())
110
- return sdkServices.length > 0 && sdkServices.every(service =>
111
- service.isReady()
263
+ return (
264
+ sdkServices.length > 0 &&
265
+ sdkServices.every((service) => service.isReady())
112
266
  )
113
267
  }
114
268
 
@@ -147,26 +301,26 @@ export class SDK {
147
301
  * Destroys all services and cleans up resources
148
302
  * @returns {Promise<boolean>} Returns true when cleanup is complete
149
303
  */
150
- async destroy() {
304
+ async destroy () {
151
305
  try {
152
306
  // Call destroy on all services
153
307
  const destroyPromises = Array.from(this._services.entries())
154
308
  .filter(([, service]) => typeof service.destroy === 'function')
155
309
  .map(async ([name, service]) => {
156
- await service.destroy();
157
- console.log(`Service ${name} destroyed successfully`);
158
- });
310
+ await service.destroy()
311
+ console.log(`Service ${name} destroyed successfully`)
312
+ })
159
313
 
160
- await Promise.all(destroyPromises);
314
+ await Promise.all(destroyPromises)
161
315
 
162
316
  // Clear services and reset state
163
- this._services.clear();
164
- this._context = {};
317
+ this._services.clear()
318
+ this._context = {}
165
319
 
166
- return true;
320
+ return true
167
321
  } catch (error) {
168
- console.error('Error during SDK destruction:', error);
169
- throw error;
322
+ console.error('Error during SDK destruction:', error)
323
+ throw error
170
324
  }
171
325
  }
172
326
  }
@@ -176,8 +330,21 @@ export default SDK
176
330
  // Export services for direct usage
177
331
  export {
178
332
  createAuthService,
179
- createCoreService,
180
- createCollabService
333
+ createCollabService,
334
+ createProjectService,
335
+ createPlanService,
336
+ createFileService,
337
+ createPaymentService,
338
+ createDnsService,
339
+ createBranchService,
340
+ createPullRequestService,
341
+ createAdminService,
342
+ createSubscriptionService,
343
+ createTrackingService,
344
+ createWaitlistService,
345
+ createMetricsService,
346
+ createIntegrationService,
347
+ createFeatureFlagService
181
348
  } from './services/index.js'
182
349
 
183
350
  // Export environment configuration