@symbo.ls/sdk 3.1.2 → 3.2.6

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 (187) hide show
  1. package/README.md +143 -2
  2. package/dist/cjs/config/environment.js +98 -30
  3. package/dist/cjs/index.js +144 -24
  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 +743 -0
  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 +64 -16
  23. package/dist/cjs/state/RootStateManager.js +65 -0
  24. package/dist/cjs/state/rootEventBus.js +74 -0
  25. package/dist/cjs/utils/CollabClient.js +223 -0
  26. package/dist/cjs/utils/TokenManager.js +78 -30
  27. package/dist/cjs/utils/changePreprocessor.js +199 -0
  28. package/dist/cjs/utils/jsonDiff.js +145 -0
  29. package/dist/cjs/utils/ordering.js +309 -0
  30. package/dist/cjs/utils/services.js +301 -103
  31. package/dist/cjs/utils/validation.js +0 -3
  32. package/dist/esm/config/environment.js +98 -30
  33. package/dist/esm/index.js +49505 -8718
  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 +26895 -0
  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 +49062 -8569
  53. package/dist/esm/state/RootStateManager.js +90 -0
  54. package/dist/esm/state/rootEventBus.js +56 -0
  55. package/dist/esm/utils/CollabClient.js +18889 -0
  56. package/dist/esm/utils/TokenManager.js +78 -30
  57. package/dist/esm/utils/changePreprocessor.js +542 -0
  58. package/dist/esm/utils/jsonDiff.js +7011 -0
  59. package/dist/esm/utils/ordering.js +291 -0
  60. package/dist/esm/utils/services.js +301 -103
  61. package/dist/esm/utils/validation.js +116 -50
  62. package/dist/node/config/environment.js +98 -30
  63. package/dist/node/index.js +175 -32
  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 +724 -0
  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 +64 -16
  83. package/dist/node/state/RootStateManager.js +36 -0
  84. package/dist/node/state/rootEventBus.js +55 -0
  85. package/dist/node/utils/CollabClient.js +194 -0
  86. package/dist/node/utils/TokenManager.js +78 -30
  87. package/dist/node/utils/changePreprocessor.js +180 -0
  88. package/dist/node/utils/jsonDiff.js +116 -0
  89. package/dist/node/utils/ordering.js +290 -0
  90. package/dist/node/utils/services.js +301 -103
  91. package/dist/node/utils/validation.js +0 -3
  92. package/package.json +39 -21
  93. package/src/config/environment.js +99 -28
  94. package/src/index.js +181 -36
  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 +900 -0
  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 +80 -13
  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 +76 -0
  148. package/src/state/rootEventBus.js +67 -0
  149. package/src/utils/CollabClient.js +248 -0
  150. package/src/utils/TokenManager.js +88 -33
  151. package/src/utils/changePreprocessor.js +239 -0
  152. package/src/utils/jsonDiff.js +144 -0
  153. package/src/utils/ordering.js +271 -0
  154. package/src/utils/services.js +326 -107
  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 -1751
  159. package/dist/cjs/services/SocketIOService.js +0 -307
  160. package/dist/cjs/services/SocketService.js +0 -161
  161. package/dist/cjs/services/SymstoryService.js +0 -571
  162. package/dist/cjs/utils/basedQuerys.js +0 -181
  163. package/dist/cjs/utils/symstoryClient.js +0 -259
  164. package/dist/esm/services/AIService.js +0 -185
  165. package/dist/esm/services/BasedService.js +0 -5278
  166. package/dist/esm/services/CoreService.js +0 -2264
  167. package/dist/esm/services/SocketIOService.js +0 -470
  168. package/dist/esm/services/SocketService.js +0 -191
  169. package/dist/esm/services/SymstoryService.js +0 -7041
  170. package/dist/esm/utils/basedQuerys.js +0 -163
  171. package/dist/esm/utils/symstoryClient.js +0 -370
  172. package/dist/node/services/AIService.js +0 -136
  173. package/dist/node/services/BasedService.js +0 -1156
  174. package/dist/node/services/CoreService.js +0 -1722
  175. package/dist/node/services/SocketIOService.js +0 -278
  176. package/dist/node/services/SocketService.js +0 -142
  177. package/dist/node/services/SymstoryService.js +0 -542
  178. package/dist/node/utils/basedQuerys.js +0 -162
  179. package/dist/node/utils/symstoryClient.js +0 -230
  180. package/src/services/AIService.js +0 -150
  181. package/src/services/BasedService.js +0 -1301
  182. package/src/services/CoreService.js +0 -1943
  183. package/src/services/SocketIOService.js +0 -334
  184. package/src/services/SocketService.js +0 -168
  185. package/src/services/SymstoryService.js +0 -649
  186. package/src/utils/basedQuerys.js +0 -164
  187. 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
 
@@ -18,58 +20,115 @@ const CONFIG = {
18
20
 
19
21
  local: {
20
22
  // local
21
- baseUrl: 'http://localhost:8080', // For symstory api
22
23
  socketUrl: 'http://localhost:8080', // For socket api
23
- routerUrl: 'http://localhost:8080', // For router api
24
24
  apiUrl: 'http://localhost:8080', // For server api
25
25
  basedEnv: 'development', // For based api
26
26
  basedProject: 'platform-v2-sm', // For based api
27
27
  basedOrg: 'symbols', // For based api
28
- githubClientId: 'Ov23liHxyWFBxS8f1gnF', // For github api
28
+ githubClientId: 'Ov23liAFrsR0StbAO6PO', // For github api
29
+ grafanaUrl: '', // For grafana tracing
30
+ grafanaAppName: 'Symbols Localhost',
29
31
  // Environment-specific feature toggles (override common)
30
32
  features: {
31
- betaFeatures: true // Enable beta features in local dev
32
- }
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'
33
45
  },
34
46
  development: {
35
- baseUrl: 'https://dev.api.symbols.app',
36
47
  socketUrl: 'https://dev.api.symbols.app',
37
- routerUrl: 'https://dev.api.symbols.app',
38
48
  apiUrl: 'https://dev.api.symbols.app',
39
- basedEnv: 'development',
40
- basedProject: 'platform-v2-sm',
41
- basedOrg: 'symbols',
42
- 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'
43
58
  },
44
59
  testing: {
45
- baseUrl: 'https://test.api.symbols.app',
46
60
  socketUrl: 'https://test.api.symbols.app',
47
- routerUrl: 'https://test.api.symbols.app',
48
61
  apiUrl: 'https://test.api.symbols.app',
49
62
  basedEnv: 'testing',
50
63
  basedProject: 'platform-v2-sm',
51
64
  basedOrg: 'symbols',
52
- 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'
73
+ },
74
+ upcoming: {
75
+ socketUrl: 'https://upcoming.api.symbols.app',
76
+ apiUrl: 'https://upcoming.api.symbols.app',
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'
53
85
  },
54
86
  staging: {
55
- baseUrl: 'https://staging.api.symbols.app',
56
87
  socketUrl: 'https://staging.api.symbols.app',
57
- routerUrl: 'https://staging.api.symbols.app',
58
88
  apiUrl: 'https://staging.api.symbols.app',
59
89
  basedEnv: 'staging',
60
90
  basedProject: 'platform-v2-sm',
61
91
  basedOrg: 'symbols',
62
- 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'
63
116
  },
64
117
  production: {
65
- baseUrl: 'https://api.symbols.app',
66
118
  socketUrl: 'https://api.symbols.app',
67
- routerUrl: 'https://api.symbols.app',
68
119
  apiUrl: 'https://api.symbols.app',
69
120
  basedEnv: 'production',
70
121
  basedProject: 'platform-v2-sm',
71
122
  basedOrg: 'symbols',
72
- 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'
73
132
  }
74
133
  }
75
134
 
@@ -95,9 +154,12 @@ export const getConfig = () => {
95
154
  // Create the final config with environment variable overrides
96
155
  const finalConfig = {
97
156
  ...envConfig,
98
- baseUrl: process.env.SYMBOLS_APP_BASE_URL || envConfig.baseUrl,
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
+ },
99
162
  socketUrl: process.env.SYMBOLS_APP_SOCKET_URL || envConfig.socketUrl,
100
- routerUrl: process.env.SYMBOLS_APP_ROUTER_URL || envConfig.routerUrl,
101
163
  apiUrl: process.env.SYMBOLS_APP_API_URL || envConfig.apiUrl,
102
164
  basedEnv: process.env.SYMBOLS_APP_BASED_ENV || envConfig.basedEnv,
103
165
  basedProject:
@@ -105,21 +167,28 @@ export const getConfig = () => {
105
167
  basedOrg: process.env.SYMBOLS_APP_BASED_ORG || envConfig.basedOrg,
106
168
  githubClientId:
107
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,
108
180
  isDevelopment: isDevelopment(env),
109
181
  isTesting: env === 'testing',
110
182
  isStaging: env === 'staging',
183
+ isPreview: env === 'preview',
111
184
  isProduction: env === 'production'
112
185
  // Store all environment variables for potential future use
113
186
  }
114
187
 
115
188
  // Validate critical configuration values
116
189
  const requiredFields = [
117
- 'baseUrl',
118
190
  'socketUrl',
119
191
  'apiUrl',
120
- 'basedEnv',
121
- 'basedProject',
122
- 'basedOrg',
123
192
  'githubClientId',
124
193
  'googleClientId'
125
194
  ]
@@ -133,11 +202,13 @@ export const getConfig = () => {
133
202
  }
134
203
 
135
204
  if (finalConfig.isDevelopment) {
136
- console.log(
205
+ console.warn(
137
206
  'environment in SDK:',
138
207
  env || process.env.NODE_ENV || process.env.NODE_ENV
139
208
  )
140
209
  console.log(finalConfig)
210
+ } else if (global.window) {
211
+ global.window.finalConfig = finalConfig
141
212
  }
142
213
 
143
214
  return finalConfig
package/src/index.js CHANGED
@@ -1,14 +1,36 @@
1
1
  import {
2
- createSymstoryService,
3
2
  createAuthService,
4
- createAIService,
5
- createSocketService,
6
- createCoreService
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
7
19
  } from './services/index.js'
8
20
 
9
21
  import { SERVICE_METHODS } from './utils/services.js'
10
- import { SymstoryService } from './services/SymstoryService.js'
11
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
+ }
12
34
 
13
35
  export class SDK {
14
36
  constructor (options = {}) {
@@ -16,6 +38,12 @@ export class SDK {
16
38
  this._context = {}
17
39
  this._options = this._validateOptions(options)
18
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
+
19
47
  // Create proxy methods for direct service access
20
48
  this._createServiceProxies()
21
49
  }
@@ -38,29 +66,114 @@ export class SDK {
38
66
  })
39
67
  ),
40
68
  this._initService(
41
- 'socket',
42
- createSocketService({
69
+ 'collab',
70
+ createCollabService({
71
+ context: this._context,
72
+ options: this._options
73
+ })
74
+ ),
75
+ // Initialize new modular services
76
+ this._initService(
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({
43
100
  context: this._context,
44
101
  options: this._options
45
102
  })
46
103
  ),
47
104
  this._initService(
48
- 'symstory',
49
- createSymstoryService({
105
+ 'payment',
106
+ createPaymentService({
50
107
  context: this._context,
51
108
  options: this._options
52
109
  })
53
110
  ),
54
111
  this._initService(
55
- 'ai',
56
- createAIService({
112
+ 'dns',
113
+ createDnsService({
57
114
  context: this._context,
58
115
  options: this._options
59
116
  })
60
117
  ),
61
118
  this._initService(
62
- 'core',
63
- createCoreService({
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({
64
177
  context: this._context,
65
178
  options: this._options
66
179
  })
@@ -88,16 +201,36 @@ export class SDK {
88
201
  }
89
202
 
90
203
  _validateOptions (options) {
204
+ const onLocalhost = isLocalhost()
205
+ const hasGrafanaUrl = Boolean(environment.grafanaUrl)
91
206
  const defaults = {
92
207
  useNewServices: true, // Use new service implementations by default
93
- baseUrl: environment.baseUrl,
208
+ apiUrl: environment.apiUrl,
94
209
  socketUrl: environment.socketUrl,
95
210
  timeout: 30000,
96
211
  retryAttempts: 3,
97
- 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
+ }
98
217
  }
99
218
 
100
- 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
101
234
  }
102
235
 
103
236
  // Get service instance
@@ -110,25 +243,26 @@ export class SDK {
110
243
 
111
244
  // Update context
112
245
  updateContext (newContext) {
246
+ // Do not persist authToken in SDK context; TokenManager is the source of truth
247
+ const { ...sanitized } = newContext || {}
248
+
113
249
  this._context = {
114
250
  ...this._context,
115
- ...newContext
251
+ ...sanitized
116
252
  }
117
253
 
118
254
  // Update context for all services
119
255
  for (const service of this._services.values()) {
120
256
  service.updateContext(this._context)
121
- if (service instanceof SymstoryService) {
122
- service.init()
123
- }
124
257
  }
125
258
  }
126
259
 
127
260
  // Check if SDK is ready
128
261
  isReady () {
129
262
  const sdkServices = Array.from(this._services.values())
130
- return sdkServices.length > 0 && sdkServices.every(service =>
131
- service.isReady()
263
+ return (
264
+ sdkServices.length > 0 &&
265
+ sdkServices.every((service) => service.isReady())
132
266
  )
133
267
  }
134
268
 
@@ -167,26 +301,26 @@ export class SDK {
167
301
  * Destroys all services and cleans up resources
168
302
  * @returns {Promise<boolean>} Returns true when cleanup is complete
169
303
  */
170
- async destroy() {
304
+ async destroy () {
171
305
  try {
172
306
  // Call destroy on all services
173
307
  const destroyPromises = Array.from(this._services.entries())
174
308
  .filter(([, service]) => typeof service.destroy === 'function')
175
309
  .map(async ([name, service]) => {
176
- await service.destroy();
177
- console.log(`Service ${name} destroyed successfully`);
178
- });
310
+ await service.destroy()
311
+ console.log(`Service ${name} destroyed successfully`)
312
+ })
179
313
 
180
- await Promise.all(destroyPromises);
314
+ await Promise.all(destroyPromises)
181
315
 
182
316
  // Clear services and reset state
183
- this._services.clear();
184
- this._context = {};
317
+ this._services.clear()
318
+ this._context = {}
185
319
 
186
- return true;
320
+ return true
187
321
  } catch (error) {
188
- console.error('Error during SDK destruction:', error);
189
- throw error;
322
+ console.error('Error during SDK destruction:', error)
323
+ throw error
190
324
  }
191
325
  }
192
326
  }
@@ -195,11 +329,22 @@ export default SDK
195
329
 
196
330
  // Export services for direct usage
197
331
  export {
198
- createSymstoryService,
199
332
  createAuthService,
200
- createAIService,
201
- createSocketService,
202
- createCoreService
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
203
348
  } from './services/index.js'
204
349
 
205
350
  // Export environment configuration