aios-core 4.2.8 → 4.2.10

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.
@@ -7,8 +7,8 @@
7
7
  # - SHA256 hashes for change detection
8
8
  # - File types for categorization
9
9
  #
10
- version: 4.2.8
11
- generated_at: "2026-02-16T14:40:32.757Z"
10
+ version: 4.2.10
11
+ generated_at: "2026-02-16T15:38:48.714Z"
12
12
  generator: scripts/generate-install-manifest.js
13
13
  file_count: 1004
14
14
  files:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aios-core",
3
- "version": "4.2.8",
3
+ "version": "4.2.10",
4
4
  "description": "Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework",
5
5
  "bin": {
6
6
  "aios": "bin/aios.js",
@@ -710,10 +710,12 @@ async function runWizard(options = {}) {
710
710
  const isCI = process.env.CI === 'true' || !process.stdout.isTTY;
711
711
  const hasProKey = !!process.env.AIOS_PRO_KEY;
712
712
 
713
+ const proOptions = { targetDir: process.cwd() };
714
+
713
715
  if (isCI && hasProKey) {
714
716
  // CI mode: auto-run if AIOS_PRO_KEY is set
715
717
  console.log('\nšŸ”‘ Pro license key detected, running Pro setup...');
716
- const proResult = await runProWizard({ quiet: true });
718
+ const proResult = await runProWizard({ ...proOptions, quiet: true });
717
719
  answers.proInstalled = proResult.success;
718
720
  answers.proResult = proResult;
719
721
  } else if (!isCI && !options.quiet) {
@@ -728,15 +730,19 @@ async function runWizard(options = {}) {
728
730
  ]);
729
731
 
730
732
  if (hasPro) {
731
- const proResult = await runProWizard();
733
+ const proResult = await runProWizard(proOptions);
732
734
  answers.proInstalled = proResult.success;
733
735
  answers.proResult = proResult;
736
+
737
+ if (!proResult.success && proResult.error) {
738
+ console.error(`\nāš ļø Pro installation issue: ${proResult.error}`);
739
+ }
734
740
  } else {
735
741
  answers.proInstalled = false;
736
742
  }
737
743
  }
738
- } catch {
739
- // Pro module not available — skip silently
744
+ } catch (error) {
745
+ console.error(`\nāš ļø Pro setup error: ${error.message}`);
740
746
  answers.proInstalled = false;
741
747
  }
742
748
  }
@@ -772,6 +772,11 @@ async function activateProByAuth(client, sessionToken) {
772
772
  showInfo('Deactivate another device or upgrade your license.');
773
773
  return { success: false, error: error.message };
774
774
  }
775
+ if (error.code === 'ALREADY_ACTIVATED') {
776
+ // License already exists — treat as success (re-install scenario)
777
+ spinner.succeed('Pro license already activated for this account.');
778
+ return { success: true, key: 'existing', activationResult: { reactivation: true } };
779
+ }
775
780
 
776
781
  spinner.fail(`Activation failed: ${error.message}`);
777
782
  return { success: false, error: error.message };
@@ -132,14 +132,20 @@ class LicenseApiClient {
132
132
  return;
133
133
  }
134
134
 
135
+ // Normalize server error envelope: { error: { code, message, details } } → flat
136
+ const err = response.error || response;
137
+ const code = err.code;
138
+ const message = err.message;
139
+ const details = err.details;
140
+
135
141
  // Client errors
136
142
  switch (statusCode) {
137
143
  case 400:
138
144
  reject(
139
145
  new LicenseActivationError(
140
- response.message || 'Invalid request',
141
- response.code || 'BAD_REQUEST',
142
- response.details,
146
+ message || 'Invalid request',
147
+ code || 'BAD_REQUEST',
148
+ details,
143
149
  ),
144
150
  );
145
151
  break;
@@ -149,28 +155,28 @@ class LicenseApiClient {
149
155
  break;
150
156
 
151
157
  case 403:
152
- if (response.code === 'EXPIRED_KEY') {
158
+ if (code === 'EXPIRED_KEY') {
153
159
  reject(LicenseActivationError.expiredKey());
154
- } else if (response.code === 'SEAT_LIMIT_EXCEEDED') {
160
+ } else if (code === 'SEAT_LIMIT_EXCEEDED') {
155
161
  reject(
156
162
  LicenseActivationError.seatLimitExceeded(
157
- response.details?.used || 0,
158
- response.details?.max || 0,
163
+ details?.used || 0,
164
+ details?.max || 0,
159
165
  ),
160
166
  );
161
167
  } else {
162
168
  reject(
163
169
  new LicenseActivationError(
164
- response.message || 'Access forbidden',
165
- response.code || 'FORBIDDEN',
166
- response.details,
170
+ message || 'Access forbidden',
171
+ code || 'FORBIDDEN',
172
+ details,
167
173
  ),
168
174
  );
169
175
  }
170
176
  break;
171
177
 
172
178
  case 429:
173
- reject(LicenseActivationError.rateLimited(response.retryAfter));
179
+ reject(LicenseActivationError.rateLimited(err.retryAfter || response.retryAfter));
174
180
  break;
175
181
 
176
182
  case 500:
@@ -178,12 +184,12 @@ class LicenseApiClient {
178
184
  case 503:
179
185
  case 504:
180
186
  // Preserve server error code if provided (e.g., BUYER_SERVICE_UNAVAILABLE)
181
- if (response.code) {
187
+ if (code) {
182
188
  reject(
183
189
  new LicenseActivationError(
184
- response.message || 'Server error',
185
- response.code,
186
- response.details,
190
+ message || 'Server error',
191
+ code,
192
+ details,
187
193
  ),
188
194
  );
189
195
  } else {