@qodalis/cli-core 2.0.0-beta.1 → 2.0.0-beta.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.
package/public-api.js CHANGED
@@ -1911,11 +1911,7 @@ var require_semver2 = __commonJS({
1911
1911
  }
1912
1912
  });
1913
1913
 
1914
- // src/lib/models/permissions.ts
1915
- var DEFAULT_FILE_PERMISSIONS = "rw-r--r--";
1916
- var DEFAULT_DIR_PERMISSIONS = "rwxr-xr-x";
1917
-
1918
- // src/lib/models/index.ts
1914
+ // src/lib/models/colors.ts
1919
1915
  var CliForegroundColor = /* @__PURE__ */ ((CliForegroundColor2) => {
1920
1916
  CliForegroundColor2["Black"] = "\x1B[30m";
1921
1917
  CliForegroundColor2["Red"] = "\x1B[31m";
@@ -1939,6 +1935,8 @@ var CliBackgroundColor = /* @__PURE__ */ ((CliBackgroundColor2) => {
1939
1935
  CliBackgroundColor2["White"] = "\x1B[47m";
1940
1936
  return CliBackgroundColor2;
1941
1937
  })(CliBackgroundColor || {});
1938
+
1939
+ // src/lib/models/icons.ts
1942
1940
  var CliIcon = /* @__PURE__ */ ((CliIcon2) => {
1943
1941
  CliIcon2["CheckIcon"] = "\u2714";
1944
1942
  CliIcon2["CrossIcon"] = "\u2718";
@@ -2008,7 +2006,7 @@ var CliIcon = /* @__PURE__ */ ((CliIcon2) => {
2008
2006
  CliIcon2["Server"] = "\u{1F5A5}";
2009
2007
  CliIcon2["Cloud"] = "\u2601";
2010
2008
  CliIcon2["Network"] = "\u{1F310}";
2011
- CliIcon2["Monitor"] = "\u{1F5A5}";
2009
+ CliIcon2["Monitor"] = "\u{1F4FA}";
2012
2010
  CliIcon2["Printer"] = "\u{1F5A8}";
2013
2011
  CliIcon2["USB"] = "\u{1F50C}";
2014
2012
  CliIcon2["Speaker"] = "\u{1F50A}";
@@ -2018,14 +2016,14 @@ var CliIcon = /* @__PURE__ */ ((CliIcon2) => {
2018
2016
  CliIcon2["Music"] = "\u{1F3B5}";
2019
2017
  CliIcon2["Phone"] = "\u{1F4DE}";
2020
2018
  CliIcon2["Package"] = "\u{1F4E6}";
2021
- CliIcon2["Plugin"] = "\u{1F50C}";
2022
- CliIcon2["Extension"] = "\u{1F9E9}";
2023
- CliIcon2["Module"] = "\u{1F4E6}";
2019
+ CliIcon2["Plugin"] = "\u{1F9E9}";
2020
+ CliIcon2["Extension"] = "\u{1F50C}";
2021
+ CliIcon2["Module"] = "\u{1F9F1}";
2024
2022
  CliIcon2["Evaluate"] = "\u{1F50D}";
2025
- CliIcon2["Variable"] = "\u{1F527}";
2023
+ CliIcon2["Variable"] = "\u{1D465}";
2026
2024
  CliIcon2["Script"] = "\u{1F4DC}";
2027
- CliIcon2["Code"] = "\u{1F4BE}";
2028
- CliIcon2["Logs"] = "\u{1F4DC}";
2025
+ CliIcon2["Code"] = "\u{1F4DD}";
2026
+ CliIcon2["Logs"] = "\u{1F4CB}";
2029
2027
  CliIcon2["Power"] = "\u23FB";
2030
2028
  CliIcon2["Heart"] = "\u2764";
2031
2029
  CliIcon2["Flame"] = "\u{1F525}";
@@ -2056,6 +2054,8 @@ var CliIcon = /* @__PURE__ */ ((CliIcon2) => {
2056
2054
  CliIcon2["Gift"] = "\u{1F381}";
2057
2055
  return CliIcon2;
2058
2056
  })(CliIcon || {});
2057
+
2058
+ // src/lib/models/options.ts
2059
2059
  var CliLogLevel = /* @__PURE__ */ ((CliLogLevel2) => {
2060
2060
  CliLogLevel2[CliLogLevel2["None"] = 0] = "None";
2061
2061
  CliLogLevel2[CliLogLevel2["DEBUG"] = 1] = "DEBUG";
@@ -2065,6 +2065,12 @@ var CliLogLevel = /* @__PURE__ */ ((CliLogLevel2) => {
2065
2065
  CliLogLevel2[CliLogLevel2["ERROR"] = 5] = "ERROR";
2066
2066
  return CliLogLevel2;
2067
2067
  })(CliLogLevel || {});
2068
+
2069
+ // src/lib/models/permissions.ts
2070
+ var DEFAULT_FILE_PERMISSIONS = "rw-r--r--";
2071
+ var DEFAULT_DIR_PERMISSIONS = "rwxr-xr-x";
2072
+
2073
+ // src/lib/models/index.ts
2068
2074
  var enums = {
2069
2075
  CliForegroundColor,
2070
2076
  CliBackgroundColor,
@@ -2072,18 +2078,17 @@ var enums = {
2072
2078
  CliLogLevel
2073
2079
  };
2074
2080
 
2075
- // src/lib/interfaces/completion.ts
2081
+ // src/lib/tokens.ts
2082
+ var ICliUserSessionService_TOKEN = "cli-user-session-service";
2083
+ var ICliUsersStoreService_TOKEN = "cli-users-store-service";
2084
+ var ICliGroupsStoreService_TOKEN = "cli-groups-store-service";
2085
+ var ICliAuthService_TOKEN = "cli-auth-service";
2076
2086
  var ICliCompletionProvider_TOKEN = "cli-completion-provider";
2077
-
2078
- // src/lib/interfaces/file-transfer.ts
2079
- var ICliFileTransferService_TOKEN = "cli-file-transfer-service";
2080
-
2081
- // src/lib/interfaces/drag-drop.ts
2082
2087
  var ICliDragDropService_TOKEN = "cli-drag-drop-service";
2083
-
2084
- // src/lib/interfaces/index.ts
2088
+ var ICliFileTransferService_TOKEN = "cli-file-transfer-service";
2085
2089
  var ICliTranslationService_TOKEN = "cli-translation-service";
2086
2090
  var ICliPermissionService_TOKEN = "cli-permission-service";
2091
+ var ICliFilePickerProvider_TOKEN = "cli-file-picker-provider";
2087
2092
 
2088
2093
  // src/lib/constants/index.ts
2089
2094
  var DefaultLibraryAuthor = {
@@ -2245,6 +2250,19 @@ function getConfigValue(state, category, key, defaultValue) {
2245
2250
  }
2246
2251
  return defaultValue;
2247
2252
  }
2253
+ function getPluginConfigValue(context, category, key, defaultValue) {
2254
+ try {
2255
+ const storeManager = context.services.get(
2256
+ "cli-state-store-manager"
2257
+ );
2258
+ if (!storeManager) return defaultValue;
2259
+ const store = storeManager.getStateStore(CLI_CONFIGURE_STORE_NAME);
2260
+ if (!store) return defaultValue;
2261
+ return getConfigValue(store, category, key, defaultValue);
2262
+ } catch {
2263
+ return defaultValue;
2264
+ }
2265
+ }
2248
2266
  function resolveConfigurationCategories(registry) {
2249
2267
  const categories = /* @__PURE__ */ new Map();
2250
2268
  for (const processor of registry.processors) {
@@ -2266,7 +2284,8 @@ function resolveConfigurationCategories(registry) {
2266
2284
 
2267
2285
  // src/lib/utils/terminal-utils.ts
2268
2286
  var clearTerminalLine = (terminal, contentLength) => {
2269
- const lines = Math.max(1, Math.ceil(contentLength / terminal.cols));
2287
+ if (contentLength <= 0) return;
2288
+ const lines = Math.ceil(contentLength / terminal.cols);
2270
2289
  for (let i = 0; i < lines; i++) {
2271
2290
  terminal.write("\x1B[2K");
2272
2291
  if (i < lines - 1) {
@@ -2297,10 +2316,15 @@ function satisfiesVersionRange(installed, range) {
2297
2316
  return semver.satisfies(coerced, range);
2298
2317
  }
2299
2318
 
2319
+ // src/lib/version.ts
2320
+ var LIBRARY_VERSION = "2.0.0-beta.10";
2321
+ var API_VERSION = 2;
2322
+
2300
2323
  // src/lib/utils/server-version-negotiator.ts
2324
+ var VERSIONS_ENDPOINT = "/api/qcli/versions";
2301
2325
  var ServerVersionNegotiator = class {
2302
2326
  static {
2303
- this.CLIENT_SUPPORTED_VERSIONS = [2];
2327
+ this.CLIENT_SUPPORTED_VERSIONS = [API_VERSION];
2304
2328
  }
2305
2329
  /**
2306
2330
  * Given a server's version info, pick the highest mutually compatible version.
@@ -2319,14 +2343,14 @@ var ServerVersionNegotiator = class {
2319
2343
  */
2320
2344
  static async discover(baseUrl) {
2321
2345
  try {
2322
- const response = await fetch(`${baseUrl}/api/cli/versions`);
2346
+ const response = await fetch(`${baseUrl}${VERSIONS_ENDPOINT}`);
2323
2347
  if (!response.ok) return null;
2324
2348
  const info = await response.json();
2325
2349
  const version = this.negotiate(info);
2326
2350
  if (version === null) return null;
2327
2351
  return {
2328
2352
  apiVersion: version,
2329
- basePath: `${baseUrl}/api/v${version}/cli`
2353
+ basePath: `${baseUrl}/api/v${version}/qcli`
2330
2354
  };
2331
2355
  } catch {
2332
2356
  return null;
@@ -2336,7 +2360,7 @@ var ServerVersionNegotiator = class {
2336
2360
 
2337
2361
  // src/lib/utils/panel-theme-sync.ts
2338
2362
  function hexToRgb(hex) {
2339
- const m = /^#?([0-9A-Fa-f]{6})$/.exec(hex);
2363
+ const m = /^#?([0-9A-Fa-f]{6})([0-9A-Fa-f]{2})?$/.exec(hex);
2340
2364
  if (!m) return null;
2341
2365
  const n = parseInt(m[1], 16);
2342
2366
  return { r: n >> 16 & 255, g: n >> 8 & 255, b: n & 255 };
@@ -2354,10 +2378,13 @@ function hexToRgba(hex, alpha) {
2354
2378
  if (!rgb) return hex;
2355
2379
  return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;
2356
2380
  }
2381
+ var DEFAULT_BG = "#111827";
2382
+ var DEFAULT_FG = "#ffffff";
2383
+ var DEFAULT_ACCENT = "#818cf8";
2357
2384
  function derivePanelThemeStyles(theme) {
2358
- const bg = theme.background || "#111827";
2359
- const fg = theme.foreground || "#ffffff";
2360
- const accent = theme.cyan || theme.blue || theme.magenta || "#818cf8";
2385
+ const bg = theme.background || DEFAULT_BG;
2386
+ const fg = theme.foreground || DEFAULT_FG;
2387
+ const accent = theme.cyan || theme.blue || theme.magenta || DEFAULT_ACCENT;
2361
2388
  return {
2362
2389
  "--cli-panel-bg": bg,
2363
2390
  "--cli-panel-header-bg": shiftColor(bg, 12),
@@ -2391,9 +2418,21 @@ function savePanelPosition(position) {
2391
2418
  }
2392
2419
  function nextPanelPosition(current) {
2393
2420
  const index = POSITION_CYCLE.indexOf(current);
2421
+ if (index === -1) {
2422
+ return POSITION_CYCLE[0];
2423
+ }
2394
2424
  return POSITION_CYCLE[(index + 1) % POSITION_CYCLE.length];
2395
2425
  }
2396
2426
 
2427
+ // src/lib/utils/ansi-utils.ts
2428
+ var ANSI_RE = /\x1b\[[0-9;]*m/g;
2429
+ function stripAnsi(text) {
2430
+ return text.replace(ANSI_RE, "");
2431
+ }
2432
+ function visibleLength(text) {
2433
+ return stripAnsi(text).length;
2434
+ }
2435
+
2397
2436
  // src/lib/utils/index.ts
2398
2437
  var getParameterValue = (p, args) => {
2399
2438
  if (args[p.name] !== void 0) {
@@ -2407,18 +2446,46 @@ var formatJson = (json) => {
2407
2446
  return colorizeJson(identedJson.split("\n").join("\r\n"));
2408
2447
  };
2409
2448
  var colorizeJson = (jsonString) => {
2410
- return jsonString.replace(/"([^"]+)":/g, '\x1B[33m"$1":\x1B[0m').replace(/: "([^"]*)"/g, ': \x1B[32m"$1"\x1B[0m').replace(/: (\d+)/g, ": \x1B[34m$1\x1B[0m").replace(/: (true|false)/g, ": \x1B[35m$1\x1B[0m").replace(/: (null)/g, ": \x1B[36m$1\x1B[0m");
2449
+ const RST = "\x1B[0m";
2450
+ const CYN = "\x1B[36m";
2451
+ const GRN = "\x1B[32m";
2452
+ const YLW = "\x1B[33m";
2453
+ const GRY = "\x1B[90m";
2454
+ const tokenRe = /("(?:[^"\\]|\\.)*"?)(\s*:)?|(\btrue\b|\bfalse\b|\bnull\b)|(-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)|([{}[\],])/g;
2455
+ let result = "";
2456
+ let lastIndex = 0;
2457
+ let m;
2458
+ while ((m = tokenRe.exec(jsonString)) !== null) {
2459
+ if (m.index > lastIndex) {
2460
+ result += jsonString.slice(lastIndex, m.index);
2461
+ }
2462
+ if (m[1] !== void 0) {
2463
+ if (m[2] !== void 0) {
2464
+ result += CYN + m[1] + RST + m[2];
2465
+ } else {
2466
+ result += GRN + m[1] + RST;
2467
+ }
2468
+ } else if (m[3] !== void 0) {
2469
+ result += YLW + m[3] + RST;
2470
+ } else if (m[4] !== void 0) {
2471
+ result += YLW + m[4] + RST;
2472
+ } else if (m[5] !== void 0) {
2473
+ result += GRY + m[5] + RST;
2474
+ }
2475
+ lastIndex = m.index + m[0].length;
2476
+ }
2477
+ if (lastIndex < jsonString.length) {
2478
+ result += jsonString.slice(lastIndex);
2479
+ }
2480
+ return result;
2411
2481
  };
2412
2482
  var toQueryString = (params) => {
2413
2483
  const searchParams = new URLSearchParams();
2414
- for (const key in params) {
2415
- if (params.hasOwnProperty(key)) {
2416
- const value = params[key];
2417
- if (Array.isArray(value)) {
2418
- value.forEach((v) => searchParams.append(key, v.toString()));
2419
- } else if (value !== null && value !== void 0) {
2420
- searchParams.append(key, value.toString());
2421
- }
2484
+ for (const [key, value] of Object.entries(params)) {
2485
+ if (Array.isArray(value)) {
2486
+ value.forEach((v) => searchParams.append(key, v.toString()));
2487
+ } else if (value !== null && value !== void 0) {
2488
+ searchParams.append(key, value.toString());
2422
2489
  }
2423
2490
  }
2424
2491
  return searchParams.toString();
@@ -2455,14 +2522,11 @@ var utils = {
2455
2522
  ObjectDescriber,
2456
2523
  delay,
2457
2524
  getConfigValue,
2525
+ getPluginConfigValue,
2458
2526
  resolveConfigurationCategories,
2459
2527
  CLI_CONFIGURE_STORE_NAME
2460
2528
  };
2461
2529
 
2462
- // src/lib/version.ts
2463
- var LIBRARY_VERSION = "2.0.0-beta.1";
2464
- var API_VERSION = 2;
2465
-
2466
2530
  // src/lib/modules/cli-module-registry.ts
2467
2531
  var CliModuleRegistry = class {
2468
2532
  constructor() {
@@ -2476,20 +2540,33 @@ var CliModuleRegistry = class {
2476
2540
  this.bootHandlers.push(handler);
2477
2541
  }
2478
2542
  /**
2479
- * Register a module and notify all boot handlers.
2480
- * Modules that do not meet the required API version are silently skipped.
2543
+ * Register a web plugin module and notify all boot handlers.
2544
+ * Modules whose `apiVersion` is below the runtime's `API_VERSION` are
2545
+ * skipped with a warning — this ensures only compatible frontend plugins load.
2481
2546
  */
2482
2547
  async register(module) {
2483
2548
  const modApiVersion = module.apiVersion;
2484
2549
  if (typeof modApiVersion !== "number" || modApiVersion < API_VERSION) {
2485
- console.warn(
2486
- `[CLI] Plugin "${module.name}" targets API version ${modApiVersion ?? "unknown"}, but this runtime requires API version ${API_VERSION}. Skipping.`
2487
- );
2550
+ const msg = `[CLI] Plugin "${module.name}" targets API version ${modApiVersion ?? "unknown"}, but this runtime requires API version ${API_VERSION}. Skipping.`;
2551
+ if (this.onWarn) {
2552
+ this.onWarn(msg);
2553
+ } else {
2554
+ console.warn(msg);
2555
+ }
2488
2556
  return;
2489
2557
  }
2490
2558
  this.modules.set(module.name, module);
2491
2559
  for (const handler of this.bootHandlers) {
2492
- await handler(module);
2560
+ try {
2561
+ await handler(module);
2562
+ } catch (e) {
2563
+ const msg = `[CLI] Boot handler failed for module "${module.name}": ${e instanceof Error ? e.message : e}`;
2564
+ if (this.onWarn) {
2565
+ this.onWarn(msg);
2566
+ } else {
2567
+ console.warn(msg);
2568
+ }
2569
+ }
2493
2570
  }
2494
2571
  }
2495
2572
  /**
@@ -2554,16 +2631,21 @@ var bootUmdModule = async (module) => {
2554
2631
  };
2555
2632
 
2556
2633
  // src/lib/types/CancellablePromise.ts
2634
+ var CANCELLATION_ERROR_MESSAGE = "Promise cancelled";
2557
2635
  var CancellablePromise = class {
2558
2636
  constructor(executor) {
2559
2637
  this.executor = executor;
2560
2638
  this.hasCancelled = false;
2561
2639
  this.abortController = new AbortController();
2562
2640
  }
2641
+ /**
2642
+ * Run the executor and return a promise for its result.
2643
+ * If `cancel()` has been called, the promise rejects immediately.
2644
+ */
2563
2645
  execute() {
2564
2646
  return new Promise((resolve, reject) => {
2565
2647
  this.abortController.signal.onabort = () => {
2566
- reject(new Error("Promise cancelled"));
2648
+ reject(new Error(CANCELLATION_ERROR_MESSAGE));
2567
2649
  };
2568
2650
  this.executor(
2569
2651
  (value) => {
@@ -2579,13 +2661,17 @@ var CancellablePromise = class {
2579
2661
  );
2580
2662
  });
2581
2663
  }
2664
+ /**
2665
+ * Cancel the promise. The executing promise rejects with
2666
+ * `Error('Promise cancelled')` and subsequent resolve/reject calls are ignored.
2667
+ */
2582
2668
  cancel() {
2583
2669
  this.hasCancelled = true;
2584
2670
  this.abortController.abort();
2585
2671
  }
2586
2672
  };
2587
2673
 
2588
- // src/lib/themes/index.ts
2674
+ // src/lib/themes/default-themes.ts
2589
2675
  var DefaultThemes = {
2590
2676
  default: {
2591
2677
  background: "#070b14",
@@ -3221,6 +3307,8 @@ var DefaultThemes = {
3221
3307
  }
3222
3308
  };
3223
3309
  DefaultThemes.yellow = DefaultThemes.highContrastLight;
3310
+
3311
+ // src/lib/themes/default-theme-infos.ts
3224
3312
  var DefaultThemeInfos = {
3225
3313
  default: {
3226
3314
  theme: DefaultThemes.default,
@@ -3398,12 +3486,6 @@ var DefaultThemeInfos = {
3398
3486
  }
3399
3487
  };
3400
3488
 
3401
- // src/lib/tokens.ts
3402
- var ICliUserSessionService_TOKEN = "cli-user-session-service";
3403
- var ICliUsersStoreService_TOKEN = "cli-users-store-service";
3404
- var ICliGroupsStoreService_TOKEN = "cli-groups-store-service";
3405
- var ICliAuthService_TOKEN = "cli-auth-service";
3406
-
3407
3489
  // src/lib/worker/create-worker-service.ts
3408
3490
  function createWorkerService(handlers) {
3409
3491
  const abortController = new AbortController();
@@ -3496,9 +3578,17 @@ var BrowserFileTransferService = class {
3496
3578
  const filename = path.split("/").pop() || "download";
3497
3579
  this.downloadToBrowser(filename, content);
3498
3580
  }
3581
+ /**
3582
+ * Not supported in browser — always returns an empty array.
3583
+ * Use `@qodalis/cli-files` for directory listing.
3584
+ */
3499
3585
  async listFiles(_path) {
3500
3586
  return [];
3501
3587
  }
3588
+ /**
3589
+ * Not supported in browser — always returns `false`.
3590
+ * Use `@qodalis/cli-files` for file existence checks.
3591
+ */
3502
3592
  async exists(_path) {
3503
3593
  return false;
3504
3594
  }
@@ -3544,6 +3634,7 @@ var BrowserFileTransferService = class {
3544
3634
 
3545
3635
  exports.API_VERSION = API_VERSION;
3546
3636
  exports.BrowserFileTransferService = BrowserFileTransferService;
3637
+ exports.CANCELLATION_ERROR_MESSAGE = CANCELLATION_ERROR_MESSAGE;
3547
3638
  exports.CLI_CONFIGURE_STORE_NAME = CLI_CONFIGURE_STORE_NAME;
3548
3639
  exports.CancellablePromise = CancellablePromise;
3549
3640
  exports.CliBackgroundColor = CliBackgroundColor;
@@ -3559,6 +3650,7 @@ exports.DefaultThemes = DefaultThemes;
3559
3650
  exports.ICliAuthService_TOKEN = ICliAuthService_TOKEN;
3560
3651
  exports.ICliCompletionProvider_TOKEN = ICliCompletionProvider_TOKEN;
3561
3652
  exports.ICliDragDropService_TOKEN = ICliDragDropService_TOKEN;
3653
+ exports.ICliFilePickerProvider_TOKEN = ICliFilePickerProvider_TOKEN;
3562
3654
  exports.ICliFileTransferService_TOKEN = ICliFileTransferService_TOKEN;
3563
3655
  exports.ICliGroupsStoreService_TOKEN = ICliGroupsStoreService_TOKEN;
3564
3656
  exports.ICliPermissionService_TOKEN = ICliPermissionService_TOKEN;
@@ -3582,6 +3674,7 @@ exports.enums = enums;
3582
3674
  exports.formatJson = formatJson;
3583
3675
  exports.getConfigValue = getConfigValue;
3584
3676
  exports.getParameterValue = getParameterValue;
3677
+ exports.getPluginConfigValue = getPluginConfigValue;
3585
3678
  exports.getRightOfWord = getRightOfWord;
3586
3679
  exports.highlightTextWithBg = highlightTextWithBg;
3587
3680
  exports.initializeBrowserEnvironment = initializeBrowserEnvironment;
@@ -3591,7 +3684,9 @@ exports.resolveConfigurationCategories = resolveConfigurationCategories;
3591
3684
  exports.satisfiesMinVersion = satisfiesMinVersion;
3592
3685
  exports.satisfiesVersionRange = satisfiesVersionRange;
3593
3686
  exports.savePanelPosition = savePanelPosition;
3687
+ exports.stripAnsi = stripAnsi;
3594
3688
  exports.toQueryString = toQueryString;
3595
3689
  exports.utils = utils;
3690
+ exports.visibleLength = visibleLength;
3596
3691
  //# sourceMappingURL=public-api.js.map
3597
3692
  //# sourceMappingURL=public-api.js.map