@symbo.ls/sdk 3.1.1 → 3.2.3

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 (83) hide show
  1. package/README.md +174 -13
  2. package/dist/cjs/config/environment.js +32 -42
  3. package/dist/cjs/index.js +31 -24
  4. package/dist/cjs/services/AIService.js +3 -3
  5. package/dist/cjs/services/AuthService.js +44 -3
  6. package/dist/cjs/services/BasedService.js +530 -24
  7. package/dist/cjs/services/CollabService.js +420 -0
  8. package/dist/cjs/services/CoreService.js +2295 -0
  9. package/dist/cjs/services/SocketService.js +207 -59
  10. package/dist/cjs/services/SymstoryService.js +135 -49
  11. package/dist/cjs/services/index.js +8 -16
  12. package/dist/cjs/state/RootStateManager.js +86 -0
  13. package/dist/cjs/state/rootEventBus.js +65 -0
  14. package/dist/cjs/utils/CollabClient.js +157 -0
  15. package/dist/cjs/utils/TokenManager.js +409 -0
  16. package/dist/cjs/utils/basedQuerys.js +120 -0
  17. package/dist/cjs/utils/jsonDiff.js +103 -0
  18. package/dist/cjs/utils/permission.js +4 -4
  19. package/dist/cjs/utils/services.js +133 -69
  20. package/dist/cjs/utils/symstoryClient.js +33 -2
  21. package/dist/esm/config/environment.js +32 -42
  22. package/dist/esm/index.js +20586 -11525
  23. package/dist/esm/services/AIService.js +3 -3
  24. package/dist/esm/services/AuthService.js +48 -7
  25. package/dist/esm/services/BasedService.js +676 -65
  26. package/dist/esm/services/CollabService.js +18028 -0
  27. package/dist/esm/services/CoreService.js +2827 -0
  28. package/dist/esm/services/SocketService.js +323 -58
  29. package/dist/esm/services/SymstoryService.js +287 -111
  30. package/dist/esm/services/index.js +20456 -11470
  31. package/dist/esm/state/RootStateManager.js +102 -0
  32. package/dist/esm/state/rootEventBus.js +47 -0
  33. package/dist/esm/utils/CollabClient.js +17483 -0
  34. package/dist/esm/utils/TokenManager.js +395 -0
  35. package/dist/esm/utils/basedQuerys.js +120 -0
  36. package/dist/esm/utils/jsonDiff.js +6096 -0
  37. package/dist/esm/utils/permission.js +4 -4
  38. package/dist/esm/utils/services.js +133 -69
  39. package/dist/esm/utils/symstoryClient.js +63 -43
  40. package/dist/esm/utils/validation.js +89 -19
  41. package/dist/node/config/environment.js +32 -42
  42. package/dist/node/index.js +37 -28
  43. package/dist/node/services/AIService.js +3 -3
  44. package/dist/node/services/AuthService.js +44 -3
  45. package/dist/node/services/BasedService.js +531 -25
  46. package/dist/node/services/CollabService.js +401 -0
  47. package/dist/node/services/CoreService.js +2266 -0
  48. package/dist/node/services/SocketService.js +197 -59
  49. package/dist/node/services/SymstoryService.js +135 -49
  50. package/dist/node/services/index.js +8 -16
  51. package/dist/node/state/RootStateManager.js +57 -0
  52. package/dist/node/state/rootEventBus.js +46 -0
  53. package/dist/node/utils/CollabClient.js +128 -0
  54. package/dist/node/utils/TokenManager.js +390 -0
  55. package/dist/node/utils/basedQuerys.js +120 -0
  56. package/dist/node/utils/jsonDiff.js +74 -0
  57. package/dist/node/utils/permission.js +4 -4
  58. package/dist/node/utils/services.js +133 -69
  59. package/dist/node/utils/symstoryClient.js +33 -2
  60. package/package.json +23 -14
  61. package/src/config/environment.js +33 -42
  62. package/src/index.js +45 -28
  63. package/src/services/AIService.js +3 -3
  64. package/src/services/AuthService.js +52 -3
  65. package/src/services/BasedService.js +603 -23
  66. package/src/services/CollabService.js +491 -0
  67. package/src/services/CoreService.js +2548 -0
  68. package/src/services/SocketService.js +227 -59
  69. package/src/services/SymstoryService.js +150 -64
  70. package/src/services/index.js +7 -14
  71. package/src/state/RootStateManager.js +71 -0
  72. package/src/state/rootEventBus.js +48 -0
  73. package/src/utils/CollabClient.js +161 -0
  74. package/src/utils/TokenManager.js +462 -0
  75. package/src/utils/basedQuerys.js +123 -0
  76. package/src/utils/jsonDiff.js +109 -0
  77. package/src/utils/permission.js +4 -4
  78. package/src/utils/services.js +144 -69
  79. package/src/utils/symstoryClient.js +36 -2
  80. package/dist/cjs/services/SocketIOService.js +0 -309
  81. package/dist/esm/services/SocketIOService.js +0 -467
  82. package/dist/node/services/SocketIOService.js +0 -280
  83. package/src/services/SocketIOService.js +0 -356
package/README.md CHANGED
@@ -12,8 +12,8 @@ import { SDK } from '@symbo.ls/sdk'
12
12
 
13
13
  const sdk = new SDK({
14
14
  useNewServices: true, // Use new service implementations
15
- baseUrl: 'https://api.symbols.app',
16
- socketUrl: 'https://socket.symbols.app',
15
+ apiUrl: 'https://api.symbols.app',
16
+ socketUrl: 'https://api.symbols.app',
17
17
  timeout: 30000,
18
18
  retryAttempts: 3,
19
19
  debug: false
@@ -396,8 +396,8 @@ sdk.destroy()
396
396
  ```javascript
397
397
  const options = {
398
398
  useNewServices: true,
399
- baseUrl: 'https://api.symbols.app',
400
- socketUrl: 'https://socket.symbols.app',
399
+ apiUrl: 'https://api.symbols.app',
400
+ socketUrl: 'https://api.symbols.app',
401
401
  timeout: 30000,
402
402
  retryAttempts: 3,
403
403
  debug: false
@@ -418,7 +418,7 @@ const canEdit = sdk.hasPermission(projectId, 'edit')
418
418
  const hasCopilot = sdk.checkProjectFeature(projectTier, 'aiCopilot')
419
419
 
420
420
  // Check if user has global admin access
421
- const isAdmin = sdk.hasGlobalPermission('admin', 'manageUsers')
421
+ const isAdmin = sdk.hasGlobalPermission('admin', 'governance')
422
422
  ```
423
423
 
424
424
  ## Permission Types
@@ -494,11 +494,11 @@ if (isProjectAdmin) {
494
494
  const canMerge = projectId => {
495
495
  const hasPermission = sdk.hasPermission(projectId, 'merge')
496
496
  const isProtectedBranch = sdk.getBranchProtection(projectId)
497
-
497
+
498
498
  if (isProtectedBranch) {
499
499
  return hasPermission && sdk.hasPermission(projectId, 'manage')
500
500
  }
501
-
501
+
502
502
  return hasPermission
503
503
  }
504
504
  ```
@@ -510,8 +510,8 @@ const canMerge = projectId => {
510
510
  const ROLE_PERMISSIONS = {
511
511
  guest: ['viewPublicProjects'],
512
512
  user: ['viewPublicProjects', 'createProject'],
513
- admin: ['viewPublicProjects', 'createProject', 'manageUsers'],
514
- superAdmin: ['viewPublicProjects', 'createProject', 'manageUsers', 'managePlatform']
513
+ admin: ['viewPublicProjects', 'createProject', 'governance'],
514
+ superAdmin: ['viewPublicProjects', 'createProject', 'governance', 'managePlatform']
515
515
  }
516
516
  ```
517
517
 
@@ -551,7 +551,7 @@ if (canInvite) {
551
551
  const tier = sdk.getProjectTier(projectId)
552
552
  const maxMembers = TIER_LIMITS[tier].teamMembers
553
553
  const currentSize = await sdk.getCurrentTeamSize()
554
-
554
+
555
555
  if (currentSize < maxMembers) {
556
556
  await sdk.inviteTeamMember(email, 'editor')
557
557
  }
@@ -563,7 +563,7 @@ if (canInvite) {
563
563
  const handleAIFeature = async (projectId) => {
564
564
  const tier = await sdk.getProjectTier(projectId)
565
565
  const copilotAccess = sdk.checkProjectFeature(tier, 'aiCopilot')
566
-
566
+
567
567
  if (copilotAccess) {
568
568
  const tokensLeft = await sdk.getAITokensRemaining(projectId)
569
569
  return {
@@ -572,7 +572,7 @@ const handleAIFeature = async (projectId) => {
572
572
  maxTokens: copilotAccess
573
573
  }
574
574
  }
575
-
575
+
576
576
  return { hasAccess: false }
577
577
  }
578
578
  ```
@@ -582,7 +582,7 @@ const handleAIFeature = async (projectId) => {
582
582
  const protectBranch = async (projectId, branchName) => {
583
583
  const canManage = sdk.hasPermission(projectId, 'manage')
584
584
  if (!canManage) return false
585
-
585
+
586
586
  return sdk.setBranchProtection(projectId, branchName, {
587
587
  requireReview: true,
588
588
  requiredApprovals: 2,
@@ -614,5 +614,166 @@ try {
614
614
  }
615
615
  ```
616
616
 
617
+ ## Token Management
618
+
619
+ The SDK now includes automatic token management with persistence and refresh capabilities:
620
+
621
+ ### Features
622
+ - **Automatic Token Refresh**: Tokens are refreshed automatically before expiration
623
+ - **Persistent Storage**: Tokens persist across page refreshes using localStorage
624
+ - **Secure Handling**: Automatic cleanup on logout and error handling
625
+ - **Flexible Storage**: Supports localStorage, sessionStorage, or memory storage
626
+
627
+ ### Configuration
628
+ ```javascript
629
+ import { getTokenManager } from '@symbols/sdk'
630
+
631
+ // Configure token management (optional - handled automatically by CoreService)
632
+ const tokenManager = getTokenManager({
633
+ storageType: 'localStorage', // 'localStorage' | 'sessionStorage' | 'memory'
634
+ refreshBuffer: 60 * 1000, // Refresh 1 minute before expiry
635
+ apiUrl: '/api',
636
+ onTokenRefresh: (tokens) => console.log('Token refreshed'),
637
+ onTokenExpired: () => console.log('Session expired'),
638
+ onTokenError: (error) => console.error('Token error:', error)
639
+ })
640
+ ```
641
+
642
+ ### Usage with CoreService
643
+ ```javascript
644
+ // Initialize SDK - token management is automatic
645
+ const symbols = new Symbols({
646
+ appKey: 'your-app-key',
647
+ authToken: 'your-initial-token' // Optional
648
+ })
649
+
650
+ // Login - tokens are automatically managed
651
+ const loginResult = await symbols.login('user@example.com', 'password')
652
+
653
+ // All subsequent API calls automatically use fresh tokens
654
+ const projects = await symbols.getProjects()
655
+ const projectData = await symbols.getProjectData('projectId123')
656
+
657
+ // Logout - tokens are automatically cleared
658
+ await symbols.logout()
659
+ ```
660
+
661
+ ## New Core Service Methods
662
+
663
+ ### Project Data Management (Symstory Replacement)
664
+ ```javascript
665
+ // Apply changes to project
666
+ await symbols.applyProjectChanges('projectId', [
667
+ ['update', ['components', 'Button'], { color: 'blue' }],
668
+ ['delete', ['pages', 'oldPage']]
669
+ ], { message: 'Update button color', type: 'patch' })
670
+
671
+ // Get current project data
672
+ const projectData = await symbols.getProjectData('projectId', {
673
+ branch: 'main',
674
+ includeHistory: true
675
+ })
676
+
677
+ // Restore to previous version
678
+ await symbols.restoreProjectVersion('projectId', '1.2.0', {
679
+ message: 'Rollback to stable version'
680
+ })
681
+
682
+ // Helper methods for single operations
683
+ await symbols.updateProjectItem('projectId', ['components', 'Button'], { color: 'red' })
684
+ await symbols.deleteProjectItem('projectId', ['pages', 'unused'])
685
+ await symbols.setProjectValue('projectId', ['settings', 'theme'], 'dark')
686
+ ```
687
+
688
+ ### Pull Request Management
689
+ ```javascript
690
+ // Create pull request
691
+ const pr = await symbols.createPullRequest('projectId', {
692
+ source: 'feature/new-ui',
693
+ target: 'main',
694
+ title: 'Add new UI components',
695
+ description: 'Modern UI overhaul'
696
+ })
697
+
698
+ // List pull requests
699
+ const { pullRequests, pagination } = await symbols.listPullRequests('projectId', {
700
+ status: 'open',
701
+ page: 1,
702
+ limit: 10
703
+ })
704
+
705
+ // Review pull request
706
+ await symbols.approvePullRequest('projectId', 'pr_123', 'Great work!')
707
+
708
+ // Request changes
709
+ await symbols.requestPullRequestChanges('projectId', 'pr_123', [
710
+ {
711
+ file: 'src/Button.js',
712
+ line: 25,
713
+ comment: 'Add error handling',
714
+ type: 'issue'
715
+ }
716
+ ])
717
+
718
+ // Merge pull request
719
+ await symbols.mergePullRequest('projectId', 'pr_123')
720
+
721
+ // Get diff
722
+ const diff = await symbols.getPullRequestDiff('projectId', 'pr_123')
723
+ ```
724
+
725
+ ### Branch Management
726
+ ```javascript
727
+ // List branches
728
+ const branches = await symbols.listBranches('projectId')
729
+
730
+ // Create branch
731
+ await symbols.createFeatureBranch('projectId', 'user authentication')
732
+ // Creates: 'feature/user-authentication'
733
+
734
+ // Check branch status
735
+ const status = await symbols.getBranchStatus('projectId', 'feature/new-ui')
736
+
737
+ // Preview merge
738
+ const preview = await symbols.previewMerge('projectId', 'feature/new-ui', 'main')
739
+ if (preview.data.conflicts.length === 0) {
740
+ // Commit merge if no conflicts
741
+ await symbols.commitMerge('projectId', 'feature/new-ui', {
742
+ message: 'Add new UI features',
743
+ type: 'minor'
744
+ })
745
+ }
746
+
747
+ // Delete branch safely
748
+ await symbols.deleteBranchSafely('projectId', 'feature/old-feature')
749
+
750
+ // Publish version
751
+ await symbols.publishVersion('projectId', {
752
+ version: '1.2.0',
753
+ branch: 'main'
754
+ })
755
+ ```
756
+
757
+ ## Error Handling
758
+
759
+ The SDK provides comprehensive error handling for all scenarios:
760
+
761
+ ```javascript
762
+ try {
763
+ await symbols.mergePullRequest('projectId', 'pr_123')
764
+ } catch (error) {
765
+ if (error.message.includes('conflicts')) {
766
+ // Handle merge conflicts
767
+ console.log('Manual conflict resolution required')
768
+ } else if (error.message.includes('403')) {
769
+ // Handle permission errors
770
+ console.log('Insufficient permissions')
771
+ } else {
772
+ // Handle other errors
773
+ console.error('Operation failed:', error.message)
774
+ }
775
+ }
776
+ ```
777
+
617
778
 
618
779
 
@@ -17,9 +17,11 @@ var __copyProps = (to, from, except, desc) => {
17
17
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
18
  var environment_exports = {};
19
19
  __export(environment_exports, {
20
- default: () => environment_default
20
+ default: () => environment_default,
21
+ getConfig: () => getConfig
21
22
  });
22
23
  module.exports = __toCommonJS(environment_exports);
24
+ var import_utils = require("@domql/utils");
23
25
  const CONFIG = {
24
26
  // Common defaults for all environments
25
27
  common: {
@@ -33,17 +35,14 @@ const CONFIG = {
33
35
  },
34
36
  // Environment-specific configurations
35
37
  local: {
36
- baseUrl: "http://localhost:3000",
37
- // For symstory api
38
+ // local
38
39
  socketUrl: "http://localhost:8080",
39
40
  // For socket api
40
- routerUrl: "http://localhost:3090",
41
- // For router api
42
- apiUrl: "http://localhost:13335",
41
+ apiUrl: "http://localhost:8080",
43
42
  // For server api
44
43
  basedEnv: "development",
45
44
  // For based api
46
- basedProject: "platform-v2",
45
+ basedProject: "platform-v2-sm",
47
46
  // For based api
48
47
  basedOrg: "symbols",
49
48
  // For based api
@@ -56,41 +55,45 @@ const CONFIG = {
56
55
  }
57
56
  },
58
57
  development: {
59
- baseUrl: "https://story.symbo.ls",
60
- socketUrl: "https://socket.symbols.app",
61
- routerUrl: "https://router.symbols.app",
62
- apiUrl: "https://api.symbols.app",
63
- basedEnv: "development",
64
- basedProject: "platform-v2",
58
+ socketUrl: "https://dev.api.symbols.app",
59
+ apiUrl: "https://dev.api.symbols.app",
60
+ githubClientId: "Ov23liHxyWFBxS8f1gnF"
61
+ },
62
+ testing: {
63
+ socketUrl: "https://test.api.symbols.app",
64
+ apiUrl: "https://test.api.symbols.app",
65
+ basedEnv: "testing",
66
+ basedProject: "platform-v2-sm",
65
67
  basedOrg: "symbols",
66
68
  githubClientId: "Ov23liHxyWFBxS8f1gnF"
67
69
  },
70
+ upcoming: {
71
+ socketUrl: "https://upcoming.api.symbols.app",
72
+ apiUrl: "https://upcoming.api.symbols.app",
73
+ githubClientId: "Ov23liWF7NvdZ056RV5J"
74
+ },
68
75
  staging: {
69
- baseUrl: "https://staging.story.symbo.ls",
70
- socketUrl: "https://staging.socket.symbols.app",
71
- routerUrl: "https://staging.router.symbols.app",
76
+ socketUrl: "https://staging.api.symbols.app",
72
77
  apiUrl: "https://staging.api.symbols.app",
73
78
  basedEnv: "staging",
74
- basedProject: "platform-v2",
79
+ basedProject: "platform-v2-sm",
75
80
  basedOrg: "symbols",
76
81
  githubClientId: "Ov23ligwZDQVD0VfuWNa"
77
82
  },
78
83
  production: {
79
- baseUrl: "https://story.symbo.ls",
80
- socketUrl: "https://socket.symbols.app",
81
- routerUrl: "https://router.symbols.app",
84
+ socketUrl: "https://api.symbols.app",
82
85
  apiUrl: "https://api.symbols.app",
83
86
  basedEnv: "production",
84
- basedProject: "platform-v2",
87
+ basedProject: "platform-v2-sm",
85
88
  basedOrg: "symbols",
86
89
  githubClientId: "Ov23liFAlOEIXtX3dBtR"
87
90
  }
88
91
  };
89
92
  const getEnvironment = () => {
90
- const env = process.env.SYMBOLS_APP_ENV || "" || "development";
93
+ // @preserve-env
94
+ const env = process.env.SYMBOLS_APP_ENV || process.env.NODE_ENV;
91
95
  if (!CONFIG[env]) {
92
- console.warn(`Unknown environment "${env}", falling back to development`);
93
- return "development";
96
+ throw new Error(`Unknown environment "${env}"`);
94
97
  }
95
98
  return env;
96
99
  };
@@ -100,25 +103,21 @@ const getConfig = () => {
100
103
  const envConfig = { ...CONFIG.common, ...CONFIG[env] };
101
104
  const finalConfig = {
102
105
  ...envConfig,
103
- baseUrl: process.env.SYMBOLS_APP_BASE_URL || envConfig.baseUrl,
104
106
  socketUrl: process.env.SYMBOLS_APP_SOCKET_URL || envConfig.socketUrl,
105
- routerUrl: process.env.SYMBOLS_APP_ROUTER_URL || envConfig.routerUrl,
106
107
  apiUrl: process.env.SYMBOLS_APP_API_URL || envConfig.apiUrl,
107
108
  basedEnv: process.env.SYMBOLS_APP_BASED_ENV || envConfig.basedEnv,
108
109
  basedProject: process.env.SYMBOLS_APP_BASED_PROJECT || envConfig.basedProject,
109
110
  basedOrg: process.env.SYMBOLS_APP_BASED_ORG || envConfig.basedOrg,
110
111
  githubClientId: process.env.SYMBOLS_APP_GITHUB_CLIENT_ID || envConfig.githubClientId,
111
- isDevelopment: env === "development" || env === "local",
112
+ isDevelopment: (0, import_utils.isDevelopment)(env),
113
+ isTesting: env === "testing",
112
114
  isStaging: env === "staging",
113
115
  isProduction: env === "production"
116
+ // Store all environment variables for potential future use
114
117
  };
115
118
  const requiredFields = [
116
- "baseUrl",
117
119
  "socketUrl",
118
120
  "apiUrl",
119
- "basedEnv",
120
- "basedProject",
121
- "basedOrg",
122
121
  "githubClientId",
123
122
  "googleClientId"
124
123
  ];
@@ -131,9 +130,7 @@ const getConfig = () => {
131
130
  if (finalConfig.isDevelopment) {
132
131
  console.log(
133
132
  "environment in SDK:",
134
- env,
135
- "",
136
- process.env.SYMBOLS_APP_ENV
133
+ env || process.env.NODE_ENV || process.env.NODE_ENV
137
134
  );
138
135
  console.log(finalConfig);
139
136
  }
@@ -141,14 +138,7 @@ const getConfig = () => {
141
138
  } catch (error) {
142
139
  console.error("Failed to load environment configuration:", error);
143
140
  return {
144
- baseUrl: "https://story.symbo.ls",
145
- socketUrl: "https://socket.symbols.app",
146
- routerUrl: "https://router.symbols.app",
147
- apiUrl: "https://api.symbols.app",
148
- basedEnv: "development",
149
- basedProject: "platform-v2",
150
- basedOrg: "symbols",
151
- githubClientId: "Ov23liHxyWFBxS8f1gnF"
141
+ ...CONFIG.development
152
142
  };
153
143
  }
154
144
  };
package/dist/cjs/index.js CHANGED
@@ -28,14 +28,17 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
28
28
  var index_exports = {};
29
29
  __export(index_exports, {
30
30
  SDK: () => SDK,
31
+ createAuthService: () => import_services3.createAuthService,
32
+ createCollabService: () => import_services3.createCollabService,
33
+ createCoreService: () => import_services3.createCoreService,
31
34
  default: () => index_default,
32
35
  environment: () => import_environment2.default
33
36
  });
34
37
  module.exports = __toCommonJS(index_exports);
35
38
  var import_services = require("./services/index.js");
36
39
  var import_services2 = require("./utils/services.js");
37
- var import_SymstoryService = require("./services/SymstoryService.js");
38
40
  var import_environment = __toESM(require("./config/environment.js"), 1);
41
+ var import_services3 = require("./services/index.js");
39
42
  var import_environment2 = __toESM(require("./config/environment.js"), 1);
40
43
  class SDK {
41
44
  constructor(options = {}) {
@@ -44,19 +47,13 @@ class SDK {
44
47
  this._options = this._validateOptions(options);
45
48
  this._createServiceProxies();
46
49
  }
50
+ // Initialize SDK with context
47
51
  async initialize(context = {}) {
48
52
  this._context = {
49
53
  ...this._context,
50
54
  ...context
51
55
  };
52
56
  await Promise.all([
53
- this._initService(
54
- "based",
55
- (0, import_services.createBasedService)({
56
- context: this._context,
57
- options: this._options
58
- })
59
- ),
60
57
  this._initService(
61
58
  "auth",
62
59
  (0, import_services.createAuthService)({
@@ -65,22 +62,15 @@ class SDK {
65
62
  })
66
63
  ),
67
64
  this._initService(
68
- "socket",
69
- (0, import_services.createSocketService)({
65
+ "core",
66
+ (0, import_services.createCoreService)({
70
67
  context: this._context,
71
68
  options: this._options
72
69
  })
73
70
  ),
74
71
  this._initService(
75
- "symstory",
76
- (0, import_services.createSymstoryService)({
77
- context: this._context,
78
- options: this._options
79
- })
80
- ),
81
- this._initService(
82
- "ai",
83
- (0, import_services.createAIService)({
72
+ "collab",
73
+ (0, import_services.createCollabService)({
84
74
  context: this._context,
85
75
  options: this._options
86
76
  })
@@ -104,7 +94,7 @@ class SDK {
104
94
  const defaults = {
105
95
  useNewServices: true,
106
96
  // Use new service implementations by default
107
- baseUrl: import_environment.default.baseUrl,
97
+ apiUrl: import_environment.default.apiUrl,
108
98
  socketUrl: import_environment.default.socketUrl,
109
99
  timeout: 3e4,
110
100
  retryAttempts: 3,
@@ -127,14 +117,12 @@ class SDK {
127
117
  };
128
118
  for (const service of this._services.values()) {
129
119
  service.updateContext(this._context);
130
- if (service instanceof import_SymstoryService.SymstoryService) {
131
- service.init();
132
- }
133
120
  }
134
121
  }
135
122
  // Check if SDK is ready
136
123
  isReady() {
137
- return Array.from(this._services.values()).every(
124
+ const sdkServices = Array.from(this._services.values());
125
+ return sdkServices.length > 0 && sdkServices.every(
138
126
  (service) => service.isReady()
139
127
  );
140
128
  }
@@ -165,5 +153,24 @@ class SDK {
165
153
  }
166
154
  }
167
155
  }
156
+ /**
157
+ * Destroys all services and cleans up resources
158
+ * @returns {Promise<boolean>} Returns true when cleanup is complete
159
+ */
160
+ async destroy() {
161
+ try {
162
+ const destroyPromises = Array.from(this._services.entries()).filter(([, service]) => typeof service.destroy === "function").map(async ([name, service]) => {
163
+ await service.destroy();
164
+ console.log(`Service ${name} destroyed successfully`);
165
+ });
166
+ await Promise.all(destroyPromises);
167
+ this._services.clear();
168
+ this._context = {};
169
+ return true;
170
+ } catch (error) {
171
+ console.error("Error during SDK destruction:", error);
172
+ throw error;
173
+ }
174
+ }
168
175
  }
169
176
  var index_default = SDK;
@@ -27,7 +27,7 @@ class AIService extends import_BaseService.BaseService {
27
27
  this._client = null;
28
28
  this._initialized = false;
29
29
  this._defaultConfig = {
30
- baseUrl: "https://api.openai.com/v1/engines/text-curie/completions",
30
+ apiUrl: "https://api.openai.com/v1/engines/text-curie/completions",
31
31
  temperature: 0,
32
32
  maxTokens: 2e3,
33
33
  headers: {
@@ -71,7 +71,7 @@ class AIService extends import_BaseService.BaseService {
71
71
  };
72
72
  }
73
73
  validateConfig(config = {}) {
74
- const requiredFields = ["baseUrl", "temperature", "maxTokens"];
74
+ const requiredFields = ["apiUrl", "temperature", "maxTokens"];
75
75
  const missingFields = requiredFields.filter((field) => !config[field]);
76
76
  if (missingFields.length > 0) {
77
77
  throw new Error(
@@ -99,7 +99,7 @@ class AIService extends import_BaseService.BaseService {
99
99
  ...opts
100
100
  })
101
101
  };
102
- const response = await this._request(config.baseUrl, options);
102
+ const response = await this._request(config.apiUrl, options);
103
103
  return response;
104
104
  } catch (error) {
105
105
  throw new Error(`AI prompt failed: ${error.message}`);
@@ -109,15 +109,53 @@ class AuthService extends import_BaseService.BaseService {
109
109
  async googleAuth(idToken) {
110
110
  try {
111
111
  const based = this._getBasedService("googleAuth");
112
- return await based.call("users:google-auth", { idToken });
112
+ const response = await based.call("users:google-auth", { idToken });
113
+ if (this._initialized) {
114
+ this.updateContext({ authToken: response.token });
115
+ }
116
+ based.setAuthState({
117
+ token: response.token,
118
+ userId: response.userId,
119
+ persistent: true
120
+ });
121
+ return response;
113
122
  } catch (error) {
114
123
  throw new Error(`Google auth failed: ${error.message}`);
115
124
  }
116
125
  }
126
+ async googleAuthCallback(code, redirectUri) {
127
+ try {
128
+ const based = this._getBasedService("googleAuthCallback");
129
+ const response = await based.call("users:google-auth-callback", {
130
+ code,
131
+ redirectUri
132
+ });
133
+ if (this._initialized) {
134
+ this.updateContext({ authToken: response.token });
135
+ }
136
+ based.setAuthState({
137
+ token: response.token,
138
+ userId: response.userId,
139
+ persistent: true
140
+ });
141
+ return response;
142
+ } catch (error) {
143
+ throw new Error(`Google auth callback failed: ${error.message}`);
144
+ }
145
+ }
117
146
  async githubAuth(code) {
118
147
  try {
119
148
  const based = this._getBasedService("githubAuth");
120
- return await based.call("users:github-auth", { code });
149
+ const response = await based.call("users:github-auth", { code });
150
+ if (this._initialized) {
151
+ this.updateContext({ authToken: response.token });
152
+ }
153
+ based.setAuthState({
154
+ token: response.token,
155
+ userId: response.userId,
156
+ persistent: true
157
+ });
158
+ return response;
121
159
  } catch (error) {
122
160
  throw new Error(`GitHub auth failed: ${error.message}`);
123
161
  }
@@ -126,7 +164,7 @@ class AuthService extends import_BaseService.BaseService {
126
164
  this._requireReady("logout");
127
165
  try {
128
166
  const based = this._getBasedService("logout");
129
- await based.call("logout");
167
+ await based.call("users:logout");
130
168
  this.updateContext({ authToken: null });
131
169
  } catch (error) {
132
170
  throw new Error(`Logout failed: ${error.message}`);
@@ -308,6 +346,7 @@ class AuthService extends import_BaseService.BaseService {
308
346
  }, 0);
309
347
  }
310
348
  async getProjectMembers(projectId) {
349
+ var _a;
311
350
  this._requireReady("getProjectMembers");
312
351
  if (!projectId) {
313
352
  throw new Error("Project ID is required");
@@ -316,6 +355,8 @@ class AuthService extends import_BaseService.BaseService {
316
355
  const based = this._getBasedService("getProjectMembers");
317
356
  return await based.call("projects:get-members", { projectId });
318
357
  } catch (error) {
358
+ if ((_a = error.message) == null ? void 0 : _a.includes("Authentication failed. Please try again"))
359
+ window.location.reload();
319
360
  throw new Error(`Failed to get project members: ${error.message}`);
320
361
  }
321
362
  }