@qodalis/cli-server-jobs 2.0.0-beta.8 → 2.0.0-rc.1

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.
@@ -8,7 +8,11 @@ var jobs = (() => {
8
8
  var __getProtoOf = Object.getPrototypeOf;
9
9
  var __hasOwnProp = Object.prototype.hasOwnProperty;
10
10
  var __commonJS = (cb, mod) => function __require() {
11
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
11
+ try {
12
+ return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
13
+ } catch (e) {
14
+ throw mod = 0, e;
15
+ }
12
16
  };
13
17
  var __copyProps = (to, from, except, desc) => {
14
18
  if (from && typeof from === "object" || typeof from === "function") {
@@ -27,7 +31,7 @@ var jobs = (() => {
27
31
  mod
28
32
  ));
29
33
  var require_constants = __commonJS({
30
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/constants.js"(exports$1, module2) {
34
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/constants.js"(exports, module2) {
31
35
  var SEMVER_SPEC_VERSION = "2.0.0";
32
36
  var MAX_LENGTH = 256;
33
37
  var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || /* istanbul ignore next */
@@ -56,26 +60,26 @@ var jobs = (() => {
56
60
  }
57
61
  });
58
62
  var require_debug = __commonJS({
59
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/debug.js"(exports$1, module2) {
63
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/debug.js"(exports, module2) {
60
64
  var debug = typeof process === "object" && process.env && process.env.NODE_DEBUG && /\bsemver\b/i.test(process.env.NODE_DEBUG) ? (...args) => console.error("SEMVER", ...args) : () => {
61
65
  };
62
66
  module2.exports = debug;
63
67
  }
64
68
  });
65
69
  var require_re = __commonJS({
66
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/re.js"(exports$1, module2) {
70
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/re.js"(exports, module2) {
67
71
  var {
68
72
  MAX_SAFE_COMPONENT_LENGTH,
69
73
  MAX_SAFE_BUILD_LENGTH,
70
74
  MAX_LENGTH
71
75
  } = require_constants();
72
76
  var debug = require_debug();
73
- exports$1 = module2.exports = {};
74
- var re = exports$1.re = [];
75
- var safeRe = exports$1.safeRe = [];
76
- var src = exports$1.src = [];
77
- var safeSrc = exports$1.safeSrc = [];
78
- var t = exports$1.t = {};
77
+ exports = module2.exports = {};
78
+ var re = exports.re = [];
79
+ var safeRe = exports.safeRe = [];
80
+ var src = exports.src = [];
81
+ var safeSrc = exports.safeSrc = [];
82
+ var t = exports.t = {};
79
83
  var R = 0;
80
84
  var LETTERDASHNUMBER = "[a-zA-Z0-9-]";
81
85
  var safeRegexReplacements = [
@@ -128,18 +132,18 @@ var jobs = (() => {
128
132
  createToken("COERCERTLFULL", src[t.COERCEFULL], true);
129
133
  createToken("LONETILDE", "(?:~>?)");
130
134
  createToken("TILDETRIM", `(\\s*)${src[t.LONETILDE]}\\s+`, true);
131
- exports$1.tildeTrimReplace = "$1~";
135
+ exports.tildeTrimReplace = "$1~";
132
136
  createToken("TILDE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`);
133
137
  createToken("TILDELOOSE", `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`);
134
138
  createToken("LONECARET", "(?:\\^)");
135
139
  createToken("CARETTRIM", `(\\s*)${src[t.LONECARET]}\\s+`, true);
136
- exports$1.caretTrimReplace = "$1^";
140
+ exports.caretTrimReplace = "$1^";
137
141
  createToken("CARET", `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`);
138
142
  createToken("CARETLOOSE", `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`);
139
143
  createToken("COMPARATORLOOSE", `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`);
140
144
  createToken("COMPARATOR", `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`);
141
145
  createToken("COMPARATORTRIM", `(\\s*)${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true);
142
- exports$1.comparatorTrimReplace = "$1$2$3";
146
+ exports.comparatorTrimReplace = "$1$2$3";
143
147
  createToken("HYPHENRANGE", `^\\s*(${src[t.XRANGEPLAIN]})\\s+-\\s+(${src[t.XRANGEPLAIN]})\\s*$`);
144
148
  createToken("HYPHENRANGELOOSE", `^\\s*(${src[t.XRANGEPLAINLOOSE]})\\s+-\\s+(${src[t.XRANGEPLAINLOOSE]})\\s*$`);
145
149
  createToken("STAR", "(<|>)?=?\\s*\\*");
@@ -148,7 +152,7 @@ var jobs = (() => {
148
152
  }
149
153
  });
150
154
  var require_parse_options = __commonJS({
151
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/parse-options.js"(exports$1, module2) {
155
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/parse-options.js"(exports, module2) {
152
156
  var looseOption = Object.freeze({ loose: true });
153
157
  var emptyOpts = Object.freeze({});
154
158
  var parseOptions = (options) => {
@@ -164,7 +168,7 @@ var jobs = (() => {
164
168
  }
165
169
  });
166
170
  var require_identifiers = __commonJS({
167
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/identifiers.js"(exports$1, module2) {
171
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/identifiers.js"(exports, module2) {
168
172
  var numeric = /^[0-9]+$/;
169
173
  var compareIdentifiers = (a, b) => {
170
174
  if (typeof a === "number" && typeof b === "number") {
@@ -186,12 +190,24 @@ var jobs = (() => {
186
190
  }
187
191
  });
188
192
  var require_semver = __commonJS({
189
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/classes/semver.js"(exports$1, module2) {
193
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/semver.js"(exports, module2) {
190
194
  var debug = require_debug();
191
195
  var { MAX_LENGTH, MAX_SAFE_INTEGER } = require_constants();
192
196
  var { safeRe: re, t } = require_re();
193
197
  var parseOptions = require_parse_options();
194
198
  var { compareIdentifiers } = require_identifiers();
199
+ var isPrereleaseIdentifier = (prerelease, identifier) => {
200
+ const identifiers = identifier.split(".");
201
+ if (identifiers.length > prerelease.length) {
202
+ return false;
203
+ }
204
+ for (let i = 0; i < identifiers.length; i++) {
205
+ if (compareIdentifiers(prerelease[i], identifiers[i]) !== 0) {
206
+ return false;
207
+ }
208
+ }
209
+ return true;
210
+ };
195
211
  var SemVer = class _SemVer {
196
212
  constructor(version, options) {
197
213
  options = parseOptions(options);
@@ -438,8 +454,9 @@ var jobs = (() => {
438
454
  if (identifierBase === false) {
439
455
  prerelease = [identifier];
440
456
  }
441
- if (compareIdentifiers(this.prerelease[0], identifier) === 0) {
442
- if (isNaN(this.prerelease[1])) {
457
+ if (isPrereleaseIdentifier(this.prerelease, identifier)) {
458
+ const prereleaseBase = this.prerelease[identifier.split(".").length];
459
+ if (isNaN(prereleaseBase)) {
443
460
  this.prerelease = prerelease;
444
461
  }
445
462
  } else {
@@ -462,7 +479,7 @@ var jobs = (() => {
462
479
  }
463
480
  });
464
481
  var require_parse = __commonJS({
465
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/parse.js"(exports$1, module2) {
482
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/parse.js"(exports, module2) {
466
483
  var SemVer = require_semver();
467
484
  var parse = (version, options, throwErrors = false) => {
468
485
  if (version instanceof SemVer) {
@@ -481,7 +498,7 @@ var jobs = (() => {
481
498
  }
482
499
  });
483
500
  var require_valid = __commonJS({
484
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/valid.js"(exports$1, module2) {
501
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/valid.js"(exports, module2) {
485
502
  var parse = require_parse();
486
503
  var valid2 = (version, options) => {
487
504
  const v = parse(version, options);
@@ -491,7 +508,7 @@ var jobs = (() => {
491
508
  }
492
509
  });
493
510
  var require_clean = __commonJS({
494
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/clean.js"(exports$1, module2) {
511
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/clean.js"(exports, module2) {
495
512
  var parse = require_parse();
496
513
  var clean = (version, options) => {
497
514
  const s = parse(version.trim().replace(/^[=v]+/, ""), options);
@@ -501,7 +518,7 @@ var jobs = (() => {
501
518
  }
502
519
  });
503
520
  var require_inc = __commonJS({
504
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/inc.js"(exports$1, module2) {
521
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/inc.js"(exports, module2) {
505
522
  var SemVer = require_semver();
506
523
  var inc = (version, release, options, identifier, identifierBase) => {
507
524
  if (typeof options === "string") {
@@ -522,7 +539,7 @@ var jobs = (() => {
522
539
  }
523
540
  });
524
541
  var require_diff = __commonJS({
525
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/diff.js"(exports$1, module2) {
542
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/diff.js"(exports, module2) {
526
543
  var parse = require_parse();
527
544
  var diff = (version1, version2) => {
528
545
  const v1 = parse(version1, null, true);
@@ -563,28 +580,28 @@ var jobs = (() => {
563
580
  }
564
581
  });
565
582
  var require_major = __commonJS({
566
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/major.js"(exports$1, module2) {
583
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/major.js"(exports, module2) {
567
584
  var SemVer = require_semver();
568
585
  var major = (a, loose) => new SemVer(a, loose).major;
569
586
  module2.exports = major;
570
587
  }
571
588
  });
572
589
  var require_minor = __commonJS({
573
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/minor.js"(exports$1, module2) {
590
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/minor.js"(exports, module2) {
574
591
  var SemVer = require_semver();
575
592
  var minor = (a, loose) => new SemVer(a, loose).minor;
576
593
  module2.exports = minor;
577
594
  }
578
595
  });
579
596
  var require_patch = __commonJS({
580
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/patch.js"(exports$1, module2) {
597
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/patch.js"(exports, module2) {
581
598
  var SemVer = require_semver();
582
599
  var patch = (a, loose) => new SemVer(a, loose).patch;
583
600
  module2.exports = patch;
584
601
  }
585
602
  });
586
603
  var require_prerelease = __commonJS({
587
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/prerelease.js"(exports$1, module2) {
604
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/prerelease.js"(exports, module2) {
588
605
  var parse = require_parse();
589
606
  var prerelease = (version, options) => {
590
607
  const parsed = parse(version, options);
@@ -594,28 +611,28 @@ var jobs = (() => {
594
611
  }
595
612
  });
596
613
  var require_compare = __commonJS({
597
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/compare.js"(exports$1, module2) {
614
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare.js"(exports, module2) {
598
615
  var SemVer = require_semver();
599
616
  var compare2 = (a, b, loose) => new SemVer(a, loose).compare(new SemVer(b, loose));
600
617
  module2.exports = compare2;
601
618
  }
602
619
  });
603
620
  var require_rcompare = __commonJS({
604
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/rcompare.js"(exports$1, module2) {
621
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/rcompare.js"(exports, module2) {
605
622
  var compare2 = require_compare();
606
623
  var rcompare = (a, b, loose) => compare2(b, a, loose);
607
624
  module2.exports = rcompare;
608
625
  }
609
626
  });
610
627
  var require_compare_loose = __commonJS({
611
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/compare-loose.js"(exports$1, module2) {
628
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare-loose.js"(exports, module2) {
612
629
  var compare2 = require_compare();
613
630
  var compareLoose = (a, b) => compare2(a, b, true);
614
631
  module2.exports = compareLoose;
615
632
  }
616
633
  });
617
634
  var require_compare_build = __commonJS({
618
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/compare-build.js"(exports$1, module2) {
635
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/compare-build.js"(exports, module2) {
619
636
  var SemVer = require_semver();
620
637
  var compareBuild = (a, b, loose) => {
621
638
  const versionA = new SemVer(a, loose);
@@ -626,63 +643,63 @@ var jobs = (() => {
626
643
  }
627
644
  });
628
645
  var require_sort = __commonJS({
629
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/sort.js"(exports$1, module2) {
646
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/sort.js"(exports, module2) {
630
647
  var compareBuild = require_compare_build();
631
- var sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose));
648
+ var sort = (list2, loose) => list2.sort((a, b) => compareBuild(a, b, loose));
632
649
  module2.exports = sort;
633
650
  }
634
651
  });
635
652
  var require_rsort = __commonJS({
636
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/rsort.js"(exports$1, module2) {
653
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/rsort.js"(exports, module2) {
637
654
  var compareBuild = require_compare_build();
638
- var rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));
655
+ var rsort = (list2, loose) => list2.sort((a, b) => compareBuild(b, a, loose));
639
656
  module2.exports = rsort;
640
657
  }
641
658
  });
642
659
  var require_gt = __commonJS({
643
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/gt.js"(exports$1, module2) {
660
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gt.js"(exports, module2) {
644
661
  var compare2 = require_compare();
645
662
  var gt = (a, b, loose) => compare2(a, b, loose) > 0;
646
663
  module2.exports = gt;
647
664
  }
648
665
  });
649
666
  var require_lt = __commonJS({
650
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/lt.js"(exports$1, module2) {
667
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lt.js"(exports, module2) {
651
668
  var compare2 = require_compare();
652
669
  var lt = (a, b, loose) => compare2(a, b, loose) < 0;
653
670
  module2.exports = lt;
654
671
  }
655
672
  });
656
673
  var require_eq = __commonJS({
657
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/eq.js"(exports$1, module2) {
674
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/eq.js"(exports, module2) {
658
675
  var compare2 = require_compare();
659
676
  var eq = (a, b, loose) => compare2(a, b, loose) === 0;
660
677
  module2.exports = eq;
661
678
  }
662
679
  });
663
680
  var require_neq = __commonJS({
664
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/neq.js"(exports$1, module2) {
681
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/neq.js"(exports, module2) {
665
682
  var compare2 = require_compare();
666
683
  var neq = (a, b, loose) => compare2(a, b, loose) !== 0;
667
684
  module2.exports = neq;
668
685
  }
669
686
  });
670
687
  var require_gte = __commonJS({
671
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/gte.js"(exports$1, module2) {
688
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/gte.js"(exports, module2) {
672
689
  var compare2 = require_compare();
673
690
  var gte2 = (a, b, loose) => compare2(a, b, loose) >= 0;
674
691
  module2.exports = gte2;
675
692
  }
676
693
  });
677
694
  var require_lte = __commonJS({
678
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/lte.js"(exports$1, module2) {
695
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/lte.js"(exports, module2) {
679
696
  var compare2 = require_compare();
680
697
  var lte = (a, b, loose) => compare2(a, b, loose) <= 0;
681
698
  module2.exports = lte;
682
699
  }
683
700
  });
684
701
  var require_cmp = __commonJS({
685
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/cmp.js"(exports$1, module2) {
702
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/cmp.js"(exports, module2) {
686
703
  var eq = require_eq();
687
704
  var neq = require_neq();
688
705
  var gt = require_gt();
@@ -729,7 +746,7 @@ var jobs = (() => {
729
746
  }
730
747
  });
731
748
  var require_coerce = __commonJS({
732
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/coerce.js"(exports$1, module2) {
749
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/coerce.js"(exports, module2) {
733
750
  var SemVer = require_semver();
734
751
  var parse = require_parse();
735
752
  var { safeRe: re, t } = require_re();
@@ -771,8 +788,46 @@ var jobs = (() => {
771
788
  module2.exports = coerce2;
772
789
  }
773
790
  });
791
+ var require_truncate = __commonJS({
792
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/truncate.js"(exports, module2) {
793
+ var parse = require_parse();
794
+ var constants2 = require_constants();
795
+ var SemVer = require_semver();
796
+ var truncate = (version, truncation, options) => {
797
+ if (!constants2.RELEASE_TYPES.includes(truncation)) {
798
+ return null;
799
+ }
800
+ const clonedVersion = cloneInputVersion(version, options);
801
+ return clonedVersion && doTruncation(clonedVersion, truncation);
802
+ };
803
+ var cloneInputVersion = (version, options) => {
804
+ const versionStringToParse = version instanceof SemVer ? version.version : version;
805
+ return parse(versionStringToParse, options);
806
+ };
807
+ var doTruncation = (version, truncation) => {
808
+ if (isPrerelease(truncation)) {
809
+ return version.version;
810
+ }
811
+ version.prerelease = [];
812
+ switch (truncation) {
813
+ case "major":
814
+ version.minor = 0;
815
+ version.patch = 0;
816
+ break;
817
+ case "minor":
818
+ version.patch = 0;
819
+ break;
820
+ }
821
+ return version.format();
822
+ };
823
+ var isPrerelease = (type) => {
824
+ return type.startsWith("pre");
825
+ };
826
+ module2.exports = truncate;
827
+ }
828
+ });
774
829
  var require_lrucache = __commonJS({
775
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/internal/lrucache.js"(exports$1, module2) {
830
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/internal/lrucache.js"(exports, module2) {
776
831
  var LRUCache = class {
777
832
  constructor() {
778
833
  this.max = 1e3;
@@ -807,7 +862,7 @@ var jobs = (() => {
807
862
  }
808
863
  });
809
864
  var require_range = __commonJS({
810
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/classes/range.js"(exports$1, module2) {
865
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/range.js"(exports, module2) {
811
866
  var SPACE_CHARACTERS = /\s+/g;
812
867
  var Range = class _Range {
813
868
  constructor(range, options) {
@@ -874,6 +929,7 @@ var jobs = (() => {
874
929
  return this.range;
875
930
  }
876
931
  parseRange(range) {
932
+ range = range.replace(BUILDSTRIPRE, "");
877
933
  const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE);
878
934
  const memoKey = memoOpts + ":" + range;
879
935
  const cached = cache.get(memoKey);
@@ -956,12 +1012,14 @@ var jobs = (() => {
956
1012
  var SemVer = require_semver();
957
1013
  var {
958
1014
  safeRe: re,
1015
+ src,
959
1016
  t,
960
1017
  comparatorTrimReplace,
961
1018
  tildeTrimReplace,
962
1019
  caretTrimReplace
963
1020
  } = require_re();
964
1021
  var { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require_constants();
1022
+ var BUILDSTRIPRE = new RegExp(src[t.BUILD], "g");
965
1023
  var isNullSet = (c) => c.value === "<0.0.0-0";
966
1024
  var isAny = (c) => c.value === "";
967
1025
  var isSatisfiable = (comparators, options) => {
@@ -990,20 +1048,22 @@ var jobs = (() => {
990
1048
  return comp;
991
1049
  };
992
1050
  var isX = (id) => !id || id.toLowerCase() === "x" || id === "*";
1051
+ var invalidXRangeOrder = (M, m, p) => isX(M) && !isX(m) || isX(m) && p && !isX(p);
993
1052
  var replaceTildes = (comp, options) => {
994
1053
  return comp.trim().split(/\s+/).map((c) => replaceTilde(c, options)).join(" ");
995
1054
  };
996
1055
  var replaceTilde = (comp, options) => {
997
1056
  const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE];
1057
+ const z = options.includePrerelease ? "-0" : "";
998
1058
  return comp.replace(r, (_, M, m, p, pr) => {
999
1059
  debug("tilde", comp, _, M, m, p, pr);
1000
1060
  let ret;
1001
1061
  if (isX(M)) {
1002
1062
  ret = "";
1003
1063
  } else if (isX(m)) {
1004
- ret = `>=${M}.0.0 <${+M + 1}.0.0-0`;
1064
+ ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0`;
1005
1065
  } else if (isX(p)) {
1006
- ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0`;
1066
+ ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0`;
1007
1067
  } else if (pr) {
1008
1068
  debug("replaceTilde pr", pr);
1009
1069
  ret = `>=${M}.${m}.${p}-${pr} <${M}.${+m + 1}.0-0`;
@@ -1049,9 +1109,9 @@ var jobs = (() => {
1049
1109
  debug("no pr");
1050
1110
  if (M === "0") {
1051
1111
  if (m === "0") {
1052
- ret = `>=${M}.${m}.${p}${z} <${M}.${m}.${+p + 1}-0`;
1112
+ ret = `>=${M}.${m}.${p} <${M}.${m}.${+p + 1}-0`;
1053
1113
  } else {
1054
- ret = `>=${M}.${m}.${p}${z} <${M}.${+m + 1}.0-0`;
1114
+ ret = `>=${M}.${m}.${p} <${M}.${+m + 1}.0-0`;
1055
1115
  }
1056
1116
  } else {
1057
1117
  ret = `>=${M}.${m}.${p} <${+M + 1}.0.0-0`;
@@ -1070,6 +1130,9 @@ var jobs = (() => {
1070
1130
  const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE];
1071
1131
  return comp.replace(r, (ret, gtlt, M, m, p, pr) => {
1072
1132
  debug("xRange", comp, ret, gtlt, M, m, p, pr);
1133
+ if (invalidXRangeOrder(M, m, p)) {
1134
+ return comp;
1135
+ }
1073
1136
  const xM = isX(M);
1074
1137
  const xm = xM || isX(m);
1075
1138
  const xp = xm || isX(p);
@@ -1181,7 +1244,7 @@ var jobs = (() => {
1181
1244
  }
1182
1245
  });
1183
1246
  var require_comparator = __commonJS({
1184
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/classes/comparator.js"(exports$1, module2) {
1247
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/classes/comparator.js"(exports, module2) {
1185
1248
  var ANY = /* @__PURE__ */ Symbol("SemVer ANY");
1186
1249
  var Comparator = class _Comparator {
1187
1250
  static get ANY() {
@@ -1291,7 +1354,7 @@ var jobs = (() => {
1291
1354
  }
1292
1355
  });
1293
1356
  var require_satisfies = __commonJS({
1294
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/satisfies.js"(exports$1, module2) {
1357
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/functions/satisfies.js"(exports, module2) {
1295
1358
  var Range = require_range();
1296
1359
  var satisfies2 = (version, range, options) => {
1297
1360
  try {
@@ -1305,14 +1368,14 @@ var jobs = (() => {
1305
1368
  }
1306
1369
  });
1307
1370
  var require_to_comparators = __commonJS({
1308
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/to-comparators.js"(exports$1, module2) {
1371
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/to-comparators.js"(exports, module2) {
1309
1372
  var Range = require_range();
1310
1373
  var toComparators = (range, options) => new Range(range, options).set.map((comp) => comp.map((c) => c.value).join(" ").trim().split(" "));
1311
1374
  module2.exports = toComparators;
1312
1375
  }
1313
1376
  });
1314
1377
  var require_max_satisfying = __commonJS({
1315
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/max-satisfying.js"(exports$1, module2) {
1378
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/max-satisfying.js"(exports, module2) {
1316
1379
  var SemVer = require_semver();
1317
1380
  var Range = require_range();
1318
1381
  var maxSatisfying = (versions, range, options) => {
@@ -1338,7 +1401,7 @@ var jobs = (() => {
1338
1401
  }
1339
1402
  });
1340
1403
  var require_min_satisfying = __commonJS({
1341
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/min-satisfying.js"(exports$1, module2) {
1404
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-satisfying.js"(exports, module2) {
1342
1405
  var SemVer = require_semver();
1343
1406
  var Range = require_range();
1344
1407
  var minSatisfying = (versions, range, options) => {
@@ -1364,7 +1427,7 @@ var jobs = (() => {
1364
1427
  }
1365
1428
  });
1366
1429
  var require_min_version = __commonJS({
1367
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/min-version.js"(exports$1, module2) {
1430
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/min-version.js"(exports, module2) {
1368
1431
  var SemVer = require_semver();
1369
1432
  var Range = require_range();
1370
1433
  var gt = require_gt();
@@ -1420,7 +1483,7 @@ var jobs = (() => {
1420
1483
  }
1421
1484
  });
1422
1485
  var require_valid2 = __commonJS({
1423
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/valid.js"(exports$1, module2) {
1486
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/valid.js"(exports, module2) {
1424
1487
  var Range = require_range();
1425
1488
  var validRange = (range, options) => {
1426
1489
  try {
@@ -1433,7 +1496,7 @@ var jobs = (() => {
1433
1496
  }
1434
1497
  });
1435
1498
  var require_outside = __commonJS({
1436
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/outside.js"(exports$1, module2) {
1499
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/outside.js"(exports, module2) {
1437
1500
  var SemVer = require_semver();
1438
1501
  var Comparator = require_comparator();
1439
1502
  var { ANY } = Comparator;
@@ -1499,21 +1562,21 @@ var jobs = (() => {
1499
1562
  }
1500
1563
  });
1501
1564
  var require_gtr = __commonJS({
1502
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/gtr.js"(exports$1, module2) {
1565
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/gtr.js"(exports, module2) {
1503
1566
  var outside = require_outside();
1504
1567
  var gtr = (version, range, options) => outside(version, range, ">", options);
1505
1568
  module2.exports = gtr;
1506
1569
  }
1507
1570
  });
1508
1571
  var require_ltr = __commonJS({
1509
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/ltr.js"(exports$1, module2) {
1572
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/ltr.js"(exports, module2) {
1510
1573
  var outside = require_outside();
1511
1574
  var ltr = (version, range, options) => outside(version, range, "<", options);
1512
1575
  module2.exports = ltr;
1513
1576
  }
1514
1577
  });
1515
1578
  var require_intersects = __commonJS({
1516
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/intersects.js"(exports$1, module2) {
1579
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/intersects.js"(exports, module2) {
1517
1580
  var Range = require_range();
1518
1581
  var intersects = (r1, r2, options) => {
1519
1582
  r1 = new Range(r1, options);
@@ -1524,7 +1587,7 @@ var jobs = (() => {
1524
1587
  }
1525
1588
  });
1526
1589
  var require_simplify = __commonJS({
1527
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/simplify.js"(exports$1, module2) {
1590
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/simplify.js"(exports, module2) {
1528
1591
  var satisfies2 = require_satisfies();
1529
1592
  var compare2 = require_compare();
1530
1593
  module2.exports = (versions, range, options) => {
@@ -1571,7 +1634,7 @@ var jobs = (() => {
1571
1634
  }
1572
1635
  });
1573
1636
  var require_subset = __commonJS({
1574
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/ranges/subset.js"(exports$1, module2) {
1637
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/ranges/subset.js"(exports, module2) {
1575
1638
  var Range = require_range();
1576
1639
  var Comparator = require_comparator();
1577
1640
  var { ANY } = Comparator;
@@ -1678,7 +1741,7 @@ var jobs = (() => {
1678
1741
  if (higher === c && higher !== gt) {
1679
1742
  return false;
1680
1743
  }
1681
- } else if (gt.operator === ">=" && !satisfies2(gt.semver, String(c), options)) {
1744
+ } else if (gt.operator === ">=" && !c.test(gt.semver)) {
1682
1745
  return false;
1683
1746
  }
1684
1747
  }
@@ -1693,7 +1756,7 @@ var jobs = (() => {
1693
1756
  if (lower === c && lower !== lt) {
1694
1757
  return false;
1695
1758
  }
1696
- } else if (lt.operator === "<=" && !satisfies2(lt.semver, String(c), options)) {
1759
+ } else if (lt.operator === "<=" && !c.test(lt.semver)) {
1697
1760
  return false;
1698
1761
  }
1699
1762
  }
@@ -1730,7 +1793,7 @@ var jobs = (() => {
1730
1793
  }
1731
1794
  });
1732
1795
  var require_semver2 = __commonJS({
1733
- "../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/index.js"(exports$1, module2) {
1796
+ "../../node_modules/.pnpm/semver@7.8.5/node_modules/semver/index.js"(exports, module2) {
1734
1797
  var internalRe = require_re();
1735
1798
  var constants2 = require_constants();
1736
1799
  var SemVer = require_semver();
@@ -1758,6 +1821,7 @@ var jobs = (() => {
1758
1821
  var lte = require_lte();
1759
1822
  var cmp = require_cmp();
1760
1823
  var coerce2 = require_coerce();
1824
+ var truncate = require_truncate();
1761
1825
  var Comparator = require_comparator();
1762
1826
  var Range = require_range();
1763
1827
  var satisfies2 = require_satisfies();
@@ -1796,6 +1860,7 @@ var jobs = (() => {
1796
1860
  lte,
1797
1861
  cmp,
1798
1862
  coerce: coerce2,
1863
+ truncate,
1799
1864
  Comparator,
1800
1865
  Range,
1801
1866
  satisfies: satisfies2,
@@ -1902,7 +1967,7 @@ var jobs = (() => {
1902
1967
  CliIcon2["Server"] = "\u{1F5A5}";
1903
1968
  CliIcon2["Cloud"] = "\u2601";
1904
1969
  CliIcon2["Network"] = "\u{1F310}";
1905
- CliIcon2["Monitor"] = "\u{1F5A5}";
1970
+ CliIcon2["Monitor"] = "\u{1F4FA}";
1906
1971
  CliIcon2["Printer"] = "\u{1F5A8}";
1907
1972
  CliIcon2["USB"] = "\u{1F50C}";
1908
1973
  CliIcon2["Speaker"] = "\u{1F50A}";
@@ -1912,14 +1977,14 @@ var jobs = (() => {
1912
1977
  CliIcon2["Music"] = "\u{1F3B5}";
1913
1978
  CliIcon2["Phone"] = "\u{1F4DE}";
1914
1979
  CliIcon2["Package"] = "\u{1F4E6}";
1915
- CliIcon2["Plugin"] = "\u{1F50C}";
1916
- CliIcon2["Extension"] = "\u{1F9E9}";
1917
- CliIcon2["Module"] = "\u{1F4E6}";
1980
+ CliIcon2["Plugin"] = "\u{1F9E9}";
1981
+ CliIcon2["Extension"] = "\u{1F50C}";
1982
+ CliIcon2["Module"] = "\u{1F9F1}";
1918
1983
  CliIcon2["Evaluate"] = "\u{1F50D}";
1919
- CliIcon2["Variable"] = "\u{1F527}";
1984
+ CliIcon2["Variable"] = "\u{1D465}";
1920
1985
  CliIcon2["Script"] = "\u{1F4DC}";
1921
- CliIcon2["Code"] = "\u{1F4BE}";
1922
- CliIcon2["Logs"] = "\u{1F4DC}";
1986
+ CliIcon2["Code"] = "\u{1F4DD}";
1987
+ CliIcon2["Logs"] = "\u{1F4CB}";
1923
1988
  CliIcon2["Power"] = "\u23FB";
1924
1989
  CliIcon2["Heart"] = "\u2764";
1925
1990
  CliIcon2["Flame"] = "\u{1F525}";
@@ -1950,15 +2015,100 @@ var jobs = (() => {
1950
2015
  CliIcon2["Gift"] = "\u{1F381}";
1951
2016
  return CliIcon2;
1952
2017
  })(CliIcon || {});
1953
- var ICliCompletionProvider_TOKEN = "cli-completion-provider";
2018
+ function createCliToken(name) {
2019
+ return name;
2020
+ }
2021
+ var ICliUserSessionService_TOKEN = createCliToken("cli-user-session-service");
2022
+ var ICliUsersStoreService_TOKEN = createCliToken("cli-users-store-service");
2023
+ var ICliGroupsStoreService_TOKEN = createCliToken("cli-groups-store-service");
2024
+ var ICliAuthService_TOKEN = createCliToken("cli-auth-service");
2025
+ var ICliCompletionProvider_TOKEN = createCliToken("cli-completion-provider");
2026
+ var ICliDragDropService_TOKEN = createCliToken("cli-drag-drop-service");
2027
+ var ICliFileTransferService_TOKEN = createCliToken("cli-file-transfer-service");
2028
+ var ICliTranslationService_TOKEN = createCliToken("cli-translation-service");
2029
+ var ICliPermissionService_TOKEN = createCliToken("cli-permission-service");
2030
+ var ICliFilePickerProvider_TOKEN = createCliToken("cli-file-picker-provider");
2031
+ var ICliHttpClient_TOKEN = createCliToken("cli-http-client");
2032
+ var ICliUserEventService_TOKEN = createCliToken("cli-user-event-service");
2033
+ var ICliAuditService_TOKEN = createCliToken("cli-audit-service");
2034
+ var ICliAuthorizationService_TOKEN = createCliToken("cli-authorization-service");
2035
+ var ICliPermissionRegistry_TOKEN = createCliToken("cli-permission-registry");
2036
+ var ICliSessionsService_TOKEN = createCliToken("cli-sessions-service");
2037
+ var ICliKeyValueStore_TOKEN = createCliToken("cli-key-value-store");
2038
+ var ICliServerAuthTokenProvider_TOKEN = createCliToken("cli-server-auth-token-provider");
2039
+ var ICliServerAuthService_TOKEN = createCliToken("cli-server-auth-service");
2040
+ var ICliServerManager_TOKEN = createCliToken("cli-server-manager");
2041
+ function resolveHeaders(provider) {
2042
+ if (!provider) return {};
2043
+ return typeof provider === "function" ? provider() : provider;
2044
+ }
2045
+ function resolveServerHeaders(services, serverName, configHeaders) {
2046
+ if (services) {
2047
+ const authService = services.get(
2048
+ ICliServerAuthService_TOKEN
2049
+ );
2050
+ if (authService) {
2051
+ return authService.getHeaders(serverName, configHeaders);
2052
+ }
2053
+ }
2054
+ return resolveHeaders(configHeaders);
2055
+ }
2056
+ var ICliCommandGuard_TOKEN = createCliToken("cli-command-guard");
2057
+ var ICliEventBus_TOKEN = createCliToken("cli-event-bus");
1954
2058
  var DefaultLibraryAuthor = {
1955
2059
  name: "Nicolae Lupei",
1956
2060
  email: "nicolae.lupei@qodalis.com"
1957
2061
  };
2062
+ function splitShellWords(text) {
2063
+ const words = [];
2064
+ let current = "";
2065
+ let inWord = false;
2066
+ for (let i = 0; i < text.length; i++) {
2067
+ const ch = text[i];
2068
+ if (ch === "\\" && i + 1 < text.length) {
2069
+ current += text[++i];
2070
+ inWord = true;
2071
+ } else if (ch === "'" && text.indexOf("'", i + 1) !== -1) {
2072
+ const end = text.indexOf("'", i + 1);
2073
+ current += text.slice(i + 1, end);
2074
+ inWord = true;
2075
+ i = end;
2076
+ } else if (ch === '"' && closingDoubleQuote(text, i) !== -1) {
2077
+ const end = closingDoubleQuote(text, i);
2078
+ current += unescapeDoubleQuoted(text.slice(i + 1, end));
2079
+ inWord = true;
2080
+ i = end;
2081
+ } else if (/\s/.test(ch)) {
2082
+ if (inWord) words.push(current);
2083
+ current = "";
2084
+ inWord = false;
2085
+ } else {
2086
+ current += ch;
2087
+ inWord = true;
2088
+ }
2089
+ }
2090
+ if (inWord) words.push(current);
2091
+ return words;
2092
+ }
2093
+ function joinShellWords(text) {
2094
+ return splitShellWords(text).join(" ");
2095
+ }
2096
+ function closingDoubleQuote(text, start) {
2097
+ for (let i = start + 1; i < text.length; i++) {
2098
+ if (text[i] === "\\") i++;
2099
+ else if (text[i] === '"') return i;
2100
+ }
2101
+ return -1;
2102
+ }
2103
+ function unescapeDoubleQuoted(text) {
2104
+ return text.replace(/\\(["\\$`])/g, "$1");
2105
+ }
1958
2106
  var semver = __toESM(require_semver2());
2107
+ var API_VERSION = 2;
2108
+ var VERSIONS_ENDPOINT = "/api/qcli/versions";
1959
2109
  var ServerVersionNegotiator = class {
1960
2110
  static {
1961
- this.CLIENT_SUPPORTED_VERSIONS = [2];
2111
+ this.CLIENT_SUPPORTED_VERSIONS = [API_VERSION];
1962
2112
  }
1963
2113
  /**
1964
2114
  * Given a server's version info, pick the highest mutually compatible version.
@@ -1975,9 +2125,18 @@ var jobs = (() => {
1975
2125
  * Returns the negotiated API version and the base path for all subsequent calls,
1976
2126
  * or null if the server is unreachable or incompatible.
1977
2127
  */
1978
- static async discover(baseUrl) {
2128
+ static async discover(baseUrl, headers, options) {
2129
+ let response;
2130
+ try {
2131
+ const resolved = resolveHeaders(headers);
2132
+ response = await fetch(`${baseUrl}${VERSIONS_ENDPOINT}`, {
2133
+ headers: Object.keys(resolved).length > 0 ? resolved : void 0
2134
+ });
2135
+ } catch (e) {
2136
+ if (options?.rethrowNetworkErrors) throw e;
2137
+ return null;
2138
+ }
1979
2139
  try {
1980
- const response = await fetch(`${baseUrl}/api/qcli/versions`);
1981
2140
  if (!response.ok) return null;
1982
2141
  const info = await response.json();
1983
2142
  const version = this.negotiate(info);
@@ -1991,6 +2150,85 @@ var jobs = (() => {
1991
2150
  }
1992
2151
  }
1993
2152
  };
2153
+ function buildAuthenticatedWebSocketUrl(wsUrl, headers) {
2154
+ const resolved = resolveHeaders(headers);
2155
+ if (Object.keys(resolved).length === 0) {
2156
+ return wsUrl;
2157
+ }
2158
+ const separator = wsUrl.includes("?") ? "&" : "?";
2159
+ const params = Object.entries(resolved).map(
2160
+ ([key, value]) => `_header_${encodeURIComponent(key)}=${encodeURIComponent(value)}`
2161
+ ).join("&");
2162
+ return `${wsUrl}${separator}${params}`;
2163
+ }
2164
+ async function resolveServerWebSocketUrl(services, serverName, wsUrl, configHeaders) {
2165
+ const authService = services?.get(ICliServerAuthService_TOKEN);
2166
+ const params = await authService?.getWebSocketParams?.(serverName);
2167
+ if (params) {
2168
+ return appendQueryParams(wsUrl, params);
2169
+ }
2170
+ return buildAuthenticatedWebSocketUrl(wsUrl, () => resolveServerHeaders(services, serverName, configHeaders));
2171
+ }
2172
+ function appendQueryParams(url, params) {
2173
+ const entries = Object.entries(params);
2174
+ if (!entries.length) return url;
2175
+ const query = entries.map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`).join("&");
2176
+ return `${url}${url.includes("?") ? "&" : "?"}${query}`;
2177
+ }
2178
+ function writeColumns(context, rows, formatLeft, formatRight) {
2179
+ const width = Math.max(...rows.map(([left]) => left.length)) + 2;
2180
+ for (const [left, right] of rows) {
2181
+ context.writer.writeln(
2182
+ ` ${formatLeft(left.padEnd(width))}${formatRight(right)}`
2183
+ );
2184
+ }
2185
+ }
2186
+ function writeUsage(context, rows) {
2187
+ const { writer, translator } = context;
2188
+ writer.writeln(`\u{1F4CB} ${translator.t("cli.common.usage", "Usage:")}`);
2189
+ writeColumns(
2190
+ context,
2191
+ rows,
2192
+ (cmd) => writer.wrapInColor(
2193
+ cmd,
2194
+ "\x1B[36m"
2195
+ /* Cyan */
2196
+ ),
2197
+ (text) => text
2198
+ );
2199
+ }
2200
+ function writeExamples(context, rows) {
2201
+ const { writer, translator } = context;
2202
+ writer.writeln(`\u{1F4DD} ${translator.t("cli.common.examples", "Examples:")}`);
2203
+ writeColumns(
2204
+ context,
2205
+ rows,
2206
+ (cmd) => cmd,
2207
+ (comment) => writer.wrapInColor(
2208
+ `# ${comment}`,
2209
+ "\x1B[32m"
2210
+ /* Green */
2211
+ )
2212
+ );
2213
+ }
2214
+ function writeWrapped(context, text, indent = 0) {
2215
+ const cols = context.terminal?.cols ?? 80;
2216
+ const width = Math.max(20, Math.min(cols - 1, 100) - indent);
2217
+ const pad = " ".repeat(indent);
2218
+ let line = "";
2219
+ for (const word of text.split(/\s+/).filter(Boolean)) {
2220
+ if (line && visibleLength2(line) + 1 + visibleLength2(word) > width) {
2221
+ context.writer.writeln(pad + line);
2222
+ line = word;
2223
+ } else {
2224
+ line = line ? `${line} ${word}` : word;
2225
+ }
2226
+ }
2227
+ if (line) context.writer.writeln(pad + line);
2228
+ }
2229
+ function visibleLength2(text) {
2230
+ return text.replace(/\x1b\[[0-9;]*m/g, "").length;
2231
+ }
1994
2232
  var bootCliModule = async (module2) => {
1995
2233
  if (typeof window !== "undefined" && window.__cliModuleRegistry) {
1996
2234
  await window.__cliModuleRegistry.register(module2);
@@ -2897,7 +3135,7 @@ var jobs = (() => {
2897
3135
 
2898
3136
  // src/lib/processors/cli-jobs-command-processor.ts
2899
3137
  function getServices(context, args) {
2900
- const manager = context.services.get("cli-server-manager");
3138
+ const manager = context.services.getRequired("cli-server-manager");
2901
3139
  if (!manager || !manager.connections) {
2902
3140
  return [];
2903
3141
  }
@@ -2908,7 +3146,7 @@ var jobs = (() => {
2908
3146
  if (!connection.connected) continue;
2909
3147
  const config = connection.config;
2910
3148
  const baseUrl = config.url.endsWith("/") ? config.url.slice(0, -1) : config.url;
2911
- const headers = config.headers ?? {};
3149
+ const headers = resolveServerHeaders(context.services, name, config.headers);
2912
3150
  results.push({ name, service: new CliJobsService(baseUrl, headers) });
2913
3151
  }
2914
3152
  return results;
@@ -2921,10 +3159,41 @@ var jobs = (() => {
2921
3159
  }
2922
3160
  }
2923
3161
  const jobs = await service.listJobs();
2924
- const match = jobs.find(
2925
- (j) => j.name.toLowerCase() === nameOrId.toLowerCase() || j.id === nameOrId
3162
+ const lower = nameOrId.toLowerCase();
3163
+ return jobs.find((j) => j.id === nameOrId) ?? jobs.find((j) => j.name === nameOrId) ?? jobs.find((j) => j.name.toLowerCase() === lower) ?? null;
3164
+ }
3165
+ async function findJobOnServers(context, services, nameOrId) {
3166
+ const matches = [];
3167
+ const missing = [];
3168
+ for (const { name, service } of services) {
3169
+ try {
3170
+ const job = await resolveJobId(service, nameOrId);
3171
+ if (job) {
3172
+ matches.push({ name, service, job });
3173
+ } else {
3174
+ missing.push(name);
3175
+ }
3176
+ } catch (e) {
3177
+ context.writer.writeError(`Error on server ${name}: ${e.message}`);
3178
+ }
3179
+ }
3180
+ if (matches.length === 0 && missing.length > 0) {
3181
+ if (missing.length === services.length) {
3182
+ context.writer.writeError(
3183
+ services.length === 1 ? `Job "${nameOrId}" not found on server ${missing[0]}.` : `Job "${nameOrId}" not found on any of the ${services.length} connected servers.`
3184
+ );
3185
+ } else {
3186
+ context.writer.writeError(
3187
+ `Job "${nameOrId}" not found on ${missing.length === 1 ? "server" : "servers"} ${missing.join(", ")}.`
3188
+ );
3189
+ }
3190
+ }
3191
+ return matches;
3192
+ }
3193
+ function writeServerHeader(context, name) {
3194
+ context.writer.writeln(
3195
+ context.writer.wrapInColor(`Server: ${name}`, CliForegroundColor.Cyan)
2926
3196
  );
2927
- return match ?? null;
2928
3197
  }
2929
3198
  function formatRelativeTime(isoString) {
2930
3199
  if (!isoString) return "-";
@@ -2999,6 +3268,26 @@ var jobs = (() => {
2999
3268
  command: "jobs",
3000
3269
  description: "Manage background jobs on connected servers",
3001
3270
  author: DefaultLibraryAuthor,
3271
+ writeDescription: (context) => {
3272
+ const t = context.translator;
3273
+ writeWrapped(
3274
+ context,
3275
+ t.t("cli.server.jobs.help.see_control_background_jobs", "See and control the background jobs that run on connected servers: list them, run one now, pause or stop it, read its history and logs, change its settings, or watch events live. A job is picked by name (any case) or ID and looked up on every connected server; actions apply to each server that has the job, and --server limits a command to one server.")
3276
+ );
3277
+ context.writer.writeln();
3278
+ writeUsage(context, [
3279
+ ["server jobs", t.t("cli.server.jobs.help.same_server_jobs_list", "Same as server jobs list")],
3280
+ ["server jobs <action> <name|id>", "info, trigger, pause, resume, stop, cancel, history, logs, edit"],
3281
+ ["server jobs watch", t.t("cli.server.jobs.help.live_job_events", "Live job events")]
3282
+ ]);
3283
+ context.writer.writeln();
3284
+ writeExamples(context, [
3285
+ ["server jobs", t.t("cli.server.jobs.help.all_jobs", "All jobs")],
3286
+ ["server jobs trigger cleanup", t.t("cli.server.jobs.help.run_cleanup_job_now", "Run the cleanup job now")],
3287
+ ["server jobs history cleanup --status failed", t.t("cli.server.jobs.help.failed_runs", "Its failed runs")],
3288
+ ["server jobs logs cleanup --server node", t.t("cli.server.jobs.help.last_run_output_node", "Last run output, on node")]
3289
+ ]);
3290
+ },
3002
3291
  metadata: {
3003
3292
  icon: CliIcon.Gear,
3004
3293
  module: "@qodalis/cli-server-jobs"
@@ -3009,6 +3298,23 @@ var jobs = (() => {
3009
3298
  {
3010
3299
  command: "list",
3011
3300
  description: "List all jobs across connected servers",
3301
+ writeDescription: (context) => {
3302
+ const t = context.translator;
3303
+ writeWrapped(
3304
+ context,
3305
+ t.t("cli.server.jobs.list.help.list_jobs_every_connected", "List the jobs of every connected server: group, status, schedule, last and next run, and how long the last run took. With several servers, each gets its own table.")
3306
+ );
3307
+ context.writer.writeln();
3308
+ writeUsage(context, [
3309
+ ["server jobs list", t.t("cli.server.jobs.list.help.jobs_all_connected_servers", "Jobs on all connected servers")],
3310
+ ["server jobs ls --group <name>", t.t("cli.server.jobs.list.help.only_one_group", "Only one group")]
3311
+ ]);
3312
+ context.writer.writeln();
3313
+ writeExamples(context, [
3314
+ ["server jobs ls --server node", t.t("cli.server.jobs.list.help.jobs_node_server", "Jobs on the node server")],
3315
+ ["server jobs list --group reports", t.t("cli.server.jobs.list.help.jobs_reports_group", "Jobs in the reports group")]
3316
+ ]);
3317
+ },
3012
3318
  aliases: ["ls"],
3013
3319
  parameters: [
3014
3320
  serverParam,
@@ -3027,6 +3333,21 @@ var jobs = (() => {
3027
3333
  {
3028
3334
  command: "info",
3029
3335
  description: "Show detailed information about a job",
3336
+ writeDescription: (context) => {
3337
+ const t = context.translator;
3338
+ writeWrapped(
3339
+ context,
3340
+ t.t("cli.server.jobs.info.help.show_everything_about_one", "Show everything about one job: schedule, retries, timeout, overlap policy, the execution running now and the result of the last run. The job is found by name (any case) or ID.")
3341
+ );
3342
+ context.writer.writeln();
3343
+ writeUsage(context, [
3344
+ ["server jobs info <name|id>", ""]
3345
+ ]);
3346
+ context.writer.writeln();
3347
+ writeExamples(context, [
3348
+ ["server jobs info cleanup", t.t("cli.server.jobs.info.help.details_cleanup_job", "Details of the cleanup job")]
3349
+ ]);
3350
+ },
3030
3351
  valueRequired: true,
3031
3352
  parameters: [serverParam],
3032
3353
  processCommand: async (cmd, context) => {
@@ -3037,6 +3358,22 @@ var jobs = (() => {
3037
3358
  {
3038
3359
  command: "trigger",
3039
3360
  description: "Trigger immediate execution of a job",
3361
+ writeDescription: (context) => {
3362
+ const t = context.translator;
3363
+ writeWrapped(
3364
+ context,
3365
+ t.t("cli.server.jobs.trigger.help.run_job_now_without", "Run a job now, without waiting for its next scheduled time. Its schedule does not change.")
3366
+ );
3367
+ context.writer.writeln();
3368
+ writeUsage(context, [
3369
+ ["server jobs trigger <name|id>", ""]
3370
+ ]);
3371
+ context.writer.writeln();
3372
+ writeExamples(context, [
3373
+ ["server jobs trigger cleanup", t.t("cli.server.jobs.trigger.help.run_cleanup_now", "Run cleanup now")],
3374
+ ["server jobs logs cleanup", t.t("cli.server.jobs.trigger.help.then_read_output", "Then read its output")]
3375
+ ]);
3376
+ },
3040
3377
  valueRequired: true,
3041
3378
  parameters: [serverParam],
3042
3379
  processCommand: async (cmd, context) => {
@@ -3047,6 +3384,22 @@ var jobs = (() => {
3047
3384
  {
3048
3385
  command: "pause",
3049
3386
  description: "Pause scheduled execution of a job",
3387
+ writeDescription: (context) => {
3388
+ const t = context.translator;
3389
+ writeWrapped(
3390
+ context,
3391
+ t.t("cli.server.jobs.pause.help.stop_running_job_schedule", "Stop running a job on its schedule until it is resumed. Use cancel or stop for a run that is already in progress.")
3392
+ );
3393
+ context.writer.writeln();
3394
+ writeUsage(context, [
3395
+ ["server jobs pause <name|id>", ""]
3396
+ ]);
3397
+ context.writer.writeln();
3398
+ writeExamples(context, [
3399
+ ["server jobs pause cleanup", t.t("cli.server.jobs.pause.help.hold_cleanup", "Hold cleanup")],
3400
+ ["server jobs resume cleanup", t.t("cli.server.jobs.pause.help.put_back_schedule", "Put it back on schedule")]
3401
+ ]);
3402
+ },
3050
3403
  valueRequired: true,
3051
3404
  parameters: [serverParam],
3052
3405
  processCommand: async (cmd, context) => {
@@ -3057,6 +3410,21 @@ var jobs = (() => {
3057
3410
  {
3058
3411
  command: "resume",
3059
3412
  description: "Resume a paused job",
3413
+ writeDescription: (context) => {
3414
+ const t = context.translator;
3415
+ writeWrapped(
3416
+ context,
3417
+ t.t("cli.server.jobs.resume.help.put_paused_job_back", "Put a paused job back on its schedule.")
3418
+ );
3419
+ context.writer.writeln();
3420
+ writeUsage(context, [
3421
+ ["server jobs resume <name|id>", ""]
3422
+ ]);
3423
+ context.writer.writeln();
3424
+ writeExamples(context, [
3425
+ ["server jobs resume cleanup", t.t("cli.server.jobs.resume.help.run_cleanup_schedule_again", "Run cleanup on schedule again")]
3426
+ ]);
3427
+ },
3060
3428
  valueRequired: true,
3061
3429
  parameters: [serverParam],
3062
3430
  processCommand: async (cmd, context) => {
@@ -3067,6 +3435,21 @@ var jobs = (() => {
3067
3435
  {
3068
3436
  command: "stop",
3069
3437
  description: "Stop a job and cancel current execution if running",
3438
+ writeDescription: (context) => {
3439
+ const t = context.translator;
3440
+ writeWrapped(
3441
+ context,
3442
+ t.t("cli.server.jobs.stop.help.take_job_off_schedule", "Take a job off its schedule and cancel the run in progress, if there is one.")
3443
+ );
3444
+ context.writer.writeln();
3445
+ writeUsage(context, [
3446
+ ["server jobs stop <name|id>", ""]
3447
+ ]);
3448
+ context.writer.writeln();
3449
+ writeExamples(context, [
3450
+ ["server jobs stop cleanup", t.t("cli.server.jobs.stop.help.stop_cleanup_completely", "Stop cleanup completely")]
3451
+ ]);
3452
+ },
3070
3453
  valueRequired: true,
3071
3454
  parameters: [serverParam],
3072
3455
  processCommand: async (cmd, context) => {
@@ -3077,6 +3460,21 @@ var jobs = (() => {
3077
3460
  {
3078
3461
  command: "cancel",
3079
3462
  description: "Cancel the current execution of a job",
3463
+ writeDescription: (context) => {
3464
+ const t = context.translator;
3465
+ writeWrapped(
3466
+ context,
3467
+ t.t("cli.server.jobs.cancel.help.cancel_run_progress_job", "Cancel the run in progress of a job. The job stays on its schedule and runs again at the next time.")
3468
+ );
3469
+ context.writer.writeln();
3470
+ writeUsage(context, [
3471
+ ["server jobs cancel <name|id>", ""]
3472
+ ]);
3473
+ context.writer.writeln();
3474
+ writeExamples(context, [
3475
+ ["server jobs cancel cleanup", t.t("cli.server.jobs.cancel.help.abort_current_cleanup_run", "Abort the current cleanup run")]
3476
+ ]);
3477
+ },
3080
3478
  valueRequired: true,
3081
3479
  parameters: [serverParam],
3082
3480
  processCommand: async (cmd, context) => {
@@ -3087,6 +3485,23 @@ var jobs = (() => {
3087
3485
  {
3088
3486
  command: "history",
3089
3487
  description: "Show execution history for a job",
3488
+ writeDescription: (context) => {
3489
+ const t = context.translator;
3490
+ writeWrapped(
3491
+ context,
3492
+ t.t("cli.server.jobs.history.help.list_past_runs_job", "List the past runs of a job: status, start time, duration, retry attempt and the start of the error message. Use the short ID with logs --exec to read the output of one run.")
3493
+ );
3494
+ context.writer.writeln();
3495
+ writeUsage(context, [
3496
+ ["server jobs history <name|id>", t.t("cli.server.jobs.history.help.last_20_runs", "The last 20 runs")],
3497
+ ["server jobs history <name|id> --limit <n> --offset <n>", t.t("cli.server.jobs.history.help.page_through_older_runs", "Page through older runs")]
3498
+ ]);
3499
+ context.writer.writeln();
3500
+ writeExamples(context, [
3501
+ ["server jobs history cleanup --status failed", t.t("cli.server.jobs.history.help.only_failed_runs", "Only failed runs")],
3502
+ ["server jobs history cleanup --limit 5", t.t("cli.server.jobs.history.help.last_5_runs", "The last 5 runs")]
3503
+ ]);
3504
+ },
3090
3505
  valueRequired: true,
3091
3506
  parameters: [
3092
3507
  serverParam,
@@ -3119,6 +3534,22 @@ var jobs = (() => {
3119
3534
  {
3120
3535
  command: "logs",
3121
3536
  description: "Show logs from the latest or a specific execution",
3537
+ writeDescription: (context) => {
3538
+ const t = context.translator;
3539
+ writeWrapped(
3540
+ context,
3541
+ t.t("cli.server.jobs.logs.help.print_log_entries_latest", "Print the log entries of the latest run of a job, or of one run picked by its execution ID (from history).")
3542
+ );
3543
+ context.writer.writeln();
3544
+ writeUsage(context, [
3545
+ ["server jobs logs <name|id>", t.t("cli.server.jobs.logs.help.logs_latest_run", "Logs of the latest run")],
3546
+ ["server jobs logs <name|id> --exec <id>", t.t("cli.server.jobs.logs.help.logs_one_run", "Logs of one run")]
3547
+ ]);
3548
+ context.writer.writeln();
3549
+ writeExamples(context, [
3550
+ ["server jobs logs cleanup", t.t("cli.server.jobs.logs.help.what_last_cleanup_run", "What the last cleanup run printed")]
3551
+ ]);
3552
+ },
3122
3553
  valueRequired: true,
3123
3554
  parameters: [
3124
3555
  serverParam,
@@ -3137,6 +3568,21 @@ var jobs = (() => {
3137
3568
  {
3138
3569
  command: "edit",
3139
3570
  description: "Interactively edit job settings",
3571
+ writeDescription: (context) => {
3572
+ const t = context.translator;
3573
+ writeWrapped(
3574
+ context,
3575
+ t.t("cli.server.jobs.edit.help.change_job_step_step", "Change a job step by step: description, group, cron schedule or interval, max retries, timeout and overlap policy (skip, queue or cancel). Press Enter to keep a value and Ctrl+C or Escape to cancel; nothing changes until you confirm. A job on several servers needs --server.")
3576
+ );
3577
+ context.writer.writeln();
3578
+ writeUsage(context, [
3579
+ ["server jobs edit <name|id>", ""]
3580
+ ]);
3581
+ context.writer.writeln();
3582
+ writeExamples(context, [
3583
+ ["server jobs edit cleanup", t.t("cli.server.jobs.edit.help.edit_cleanup_server_has", "Edit cleanup on the server that has it")]
3584
+ ]);
3585
+ },
3140
3586
  valueRequired: true,
3141
3587
  parameters: [serverParam],
3142
3588
  processCommand: async (cmd, context) => {
@@ -3147,6 +3593,21 @@ var jobs = (() => {
3147
3593
  {
3148
3594
  command: "watch",
3149
3595
  description: "Live view of job events via WebSocket",
3596
+ writeDescription: (context) => {
3597
+ const t = context.translator;
3598
+ writeWrapped(
3599
+ context,
3600
+ t.t("cli.server.jobs.watch.help.follow_job_events_they", "Follow job events as they happen (started, completed, failed and so on) on every connected server, one line per event. Press Ctrl+C to stop.")
3601
+ );
3602
+ context.writer.writeln();
3603
+ writeUsage(context, [
3604
+ ["server jobs watch", t.t("cli.server.jobs.watch.help.events_all_connected_servers", "Events from all connected servers")]
3605
+ ]);
3606
+ context.writer.writeln();
3607
+ writeExamples(context, [
3608
+ ["server jobs watch --server node", t.t("cli.server.jobs.watch.help.only_events_node", "Only events from node")]
3609
+ ]);
3610
+ },
3150
3611
  parameters: [serverParam],
3151
3612
  processCommand: async (cmd, context) => {
3152
3613
  await this.handleWatch(cmd, context);
@@ -3220,9 +3681,9 @@ var jobs = (() => {
3220
3681
  }
3221
3682
  // ── Info ──────────────────────────────────────────────────────────
3222
3683
  async handleInfo(cmd, context) {
3223
- const nameOrId = (cmd.value ?? "").trim();
3684
+ const nameOrId = joinShellWords(cmd.value ?? "");
3224
3685
  if (!nameOrId) {
3225
- context.writer.writeError("Usage: jobs info <id|name>");
3686
+ context.writer.writeError("Usage: server jobs info <id|name>");
3226
3687
  return;
3227
3688
  }
3228
3689
  const services = getServices(context, cmd.args);
@@ -3230,74 +3691,53 @@ var jobs = (() => {
3230
3691
  context.writer.writeInfo("No connected servers.");
3231
3692
  return;
3232
3693
  }
3233
- for (const { name, service } of services) {
3234
- try {
3235
- const job = await resolveJobId(service, nameOrId);
3236
- if (!job) {
3237
- if (services.length === 1) {
3238
- context.writer.writeError(
3239
- `Job "${nameOrId}" not found on server ${name}.`
3240
- );
3241
- }
3242
- continue;
3243
- }
3244
- if (services.length > 1) {
3245
- context.writer.writeln(
3246
- context.writer.wrapInColor(
3247
- `Server: ${name}`,
3248
- CliForegroundColor.Cyan
3249
- )
3250
- );
3251
- }
3252
- const lines = [
3253
- ["ID", job.id],
3254
- ["Name", job.name],
3255
- ["Description", job.description],
3256
- ["Group", job.group ?? "-"],
3257
- ["Status", statusColor(job.status, context.writer)],
3258
- [
3259
- "Schedule",
3260
- job.schedule ?? (job.interval ? `every ${job.interval}ms` : "-")
3261
- ],
3262
- ["Max Retries", String(job.maxRetries)],
3263
- [
3264
- "Timeout",
3265
- job.timeout ? `${job.timeout}ms` : "none"
3266
- ],
3267
- ["Overlap Policy", job.overlapPolicy],
3268
- [
3269
- "Current Execution",
3270
- job.currentExecutionId ?? "none"
3271
- ],
3272
- ["Next Run", formatRelativeTime(job.nextRunAt)],
3273
- ["Last Run", formatRelativeTime(job.lastRunAt)],
3274
- [
3275
- "Last Run Status",
3276
- job.lastRunStatus ? statusColor(job.lastRunStatus, context.writer) : "-"
3277
- ],
3278
- ["Last Run Duration", formatDuration(job.lastRunDuration)]
3279
- ];
3280
- for (const [label, value] of lines) {
3281
- context.writer.writeln(
3282
- ` ${context.writer.wrapInColor(
3283
- label.padEnd(20),
3284
- CliForegroundColor.Yellow
3285
- )} ${value}`
3286
- );
3287
- }
3288
- return;
3289
- } catch (e) {
3290
- context.writer.writeError(
3291
- `Error on server ${name}: ${e.message}`
3694
+ const matches = await findJobOnServers(context, services, nameOrId);
3695
+ for (const { name, job } of matches) {
3696
+ if (services.length > 1) {
3697
+ writeServerHeader(context, name);
3698
+ }
3699
+ const lines = [
3700
+ ["ID", job.id],
3701
+ ["Name", job.name],
3702
+ ["Description", job.description],
3703
+ ["Group", job.group ?? "-"],
3704
+ ["Status", statusColor(job.status, context.writer)],
3705
+ [
3706
+ "Schedule",
3707
+ job.schedule ?? (job.interval ? `every ${job.interval}ms` : "-")
3708
+ ],
3709
+ ["Max Retries", String(job.maxRetries)],
3710
+ ["Timeout", job.timeout ? `${job.timeout}ms` : "none"],
3711
+ ["Overlap Policy", job.overlapPolicy],
3712
+ ["Current Execution", job.currentExecutionId ?? "none"],
3713
+ ["Next Run", formatRelativeTime(job.nextRunAt)],
3714
+ ["Last Run", formatRelativeTime(job.lastRunAt)],
3715
+ [
3716
+ "Last Run Status",
3717
+ job.lastRunStatus ? statusColor(job.lastRunStatus, context.writer) : "-"
3718
+ ],
3719
+ ["Last Run Duration", formatDuration(job.lastRunDuration)]
3720
+ ];
3721
+ for (const [label, value] of lines) {
3722
+ context.writer.writeln(
3723
+ ` ${context.writer.wrapInColor(
3724
+ label.padEnd(20),
3725
+ CliForegroundColor.Yellow
3726
+ )} ${value}`
3292
3727
  );
3293
3728
  }
3294
3729
  }
3295
3730
  }
3296
3731
  // ── Action (trigger/pause/resume/stop/cancel) ────────────────────
3732
+ /**
3733
+ * Without --server the action applies to every connected server that has
3734
+ * the job, each reported on its own line. When several servers have it,
3735
+ * a note says so (and how to target one).
3736
+ */
3297
3737
  async handleAction(cmd, context, action) {
3298
- const nameOrId = (cmd.value ?? "").trim();
3738
+ const nameOrId = joinShellWords(cmd.value ?? "");
3299
3739
  if (!nameOrId) {
3300
- context.writer.writeError(`Usage: jobs ${action} <id|name>`);
3740
+ context.writer.writeError(`Usage: server jobs ${action} <id|name>`);
3301
3741
  return;
3302
3742
  }
3303
3743
  const services = getServices(context, cmd.args);
@@ -3305,17 +3745,14 @@ var jobs = (() => {
3305
3745
  context.writer.writeInfo("No connected servers.");
3306
3746
  return;
3307
3747
  }
3308
- for (const { name, service } of services) {
3748
+ const matches = await findJobOnServers(context, services, nameOrId);
3749
+ if (matches.length > 1) {
3750
+ context.writer.writeInfo(
3751
+ `Job "${nameOrId}" is on ${matches.length} servers (${matches.map((m) => m.name).join(", ")}); applying ${action} to each. Use --server <name> to target one.`
3752
+ );
3753
+ }
3754
+ for (const { name, service, job } of matches) {
3309
3755
  try {
3310
- const job = await resolveJobId(service, nameOrId);
3311
- if (!job) {
3312
- if (services.length === 1) {
3313
- context.writer.writeError(
3314
- `Job "${nameOrId}" not found on server ${name}.`
3315
- );
3316
- }
3317
- continue;
3318
- }
3319
3756
  switch (action) {
3320
3757
  case "trigger":
3321
3758
  await service.triggerJob(job.id);
@@ -3335,9 +3772,8 @@ var jobs = (() => {
3335
3772
  }
3336
3773
  const serverSuffix = services.length > 1 ? ` on server ${name}` : "";
3337
3774
  context.writer.writeSuccess(
3338
- `Job "${job.name}" ${action}${action.endsWith("e") ? "d" : "ed"}${serverSuffix}.`
3775
+ `Job "${job.name}" ${PAST_TENSE[action] ?? `${action}ed`}${serverSuffix}.`
3339
3776
  );
3340
- return;
3341
3777
  } catch (e) {
3342
3778
  context.writer.writeError(
3343
3779
  `Failed to ${action} job on ${name}: ${e.message}`
@@ -3347,9 +3783,9 @@ var jobs = (() => {
3347
3783
  }
3348
3784
  // ── History ──────────────────────────────────────────────────────
3349
3785
  async handleHistory(cmd, context) {
3350
- const nameOrId = (cmd.value ?? "").trim();
3786
+ const nameOrId = joinShellWords(cmd.value ?? "");
3351
3787
  if (!nameOrId) {
3352
- context.writer.writeError("Usage: jobs history <id|name>");
3788
+ context.writer.writeError("Usage: server jobs history <id|name>");
3353
3789
  return;
3354
3790
  }
3355
3791
  const services = getServices(context, cmd.args);
@@ -3360,24 +3796,11 @@ var jobs = (() => {
3360
3796
  const limit = cmd.args["limit"] ?? 20;
3361
3797
  const offset = cmd.args["offset"] ?? 0;
3362
3798
  const status = cmd.args["status"];
3363
- for (const { name, service } of services) {
3799
+ const matches = await findJobOnServers(context, services, nameOrId);
3800
+ for (const { name, service, job } of matches) {
3364
3801
  try {
3365
- const job = await resolveJobId(service, nameOrId);
3366
- if (!job) {
3367
- if (services.length === 1) {
3368
- context.writer.writeError(
3369
- `Job "${nameOrId}" not found on server ${name}.`
3370
- );
3371
- }
3372
- continue;
3373
- }
3374
3802
  if (services.length > 1) {
3375
- context.writer.writeln(
3376
- context.writer.wrapInColor(
3377
- `Server: ${name}`,
3378
- CliForegroundColor.Cyan
3379
- )
3380
- );
3803
+ writeServerHeader(context, name);
3381
3804
  }
3382
3805
  const history = await service.getHistory(job.id, {
3383
3806
  limit,
@@ -3388,7 +3811,7 @@ var jobs = (() => {
3388
3811
  context.writer.writeInfo(
3389
3812
  `No execution history for "${job.name}".`
3390
3813
  );
3391
- return;
3814
+ continue;
3392
3815
  }
3393
3816
  context.writer.writeln(
3394
3817
  `Showing ${history.items.length} of ${history.total} executions for "${job.name}":`
@@ -3410,7 +3833,6 @@ var jobs = (() => {
3410
3833
  exec.error ? exec.error.substring(0, 40) : "-"
3411
3834
  ]);
3412
3835
  context.writer.writeTable(headers, rows);
3413
- return;
3414
3836
  } catch (e) {
3415
3837
  context.writer.writeError(
3416
3838
  `Error on server ${name}: ${e.message}`
@@ -3420,9 +3842,9 @@ var jobs = (() => {
3420
3842
  }
3421
3843
  // ── Logs ─────────────────────────────────────────────────────────
3422
3844
  async handleLogs(cmd, context) {
3423
- const nameOrId = (cmd.value ?? "").trim();
3845
+ const nameOrId = joinShellWords(cmd.value ?? "");
3424
3846
  if (!nameOrId) {
3425
- context.writer.writeError("Usage: jobs logs <id|name>");
3847
+ context.writer.writeError("Usage: server jobs logs <id|name>");
3426
3848
  return;
3427
3849
  }
3428
3850
  const services = getServices(context, cmd.args);
@@ -3431,16 +3853,11 @@ var jobs = (() => {
3431
3853
  return;
3432
3854
  }
3433
3855
  const execId = cmd.args["exec"];
3434
- for (const { name, service } of services) {
3856
+ const matches = await findJobOnServers(context, services, nameOrId);
3857
+ for (const { name, service, job } of matches) {
3435
3858
  try {
3436
- const job = await resolveJobId(service, nameOrId);
3437
- if (!job) {
3438
- if (services.length === 1) {
3439
- context.writer.writeError(
3440
- `Job "${nameOrId}" not found on server ${name}.`
3441
- );
3442
- }
3443
- continue;
3859
+ if (services.length > 1) {
3860
+ writeServerHeader(context, name);
3444
3861
  }
3445
3862
  let execution;
3446
3863
  if (execId) {
@@ -3453,27 +3870,19 @@ var jobs = (() => {
3453
3870
  context.writer.writeInfo(
3454
3871
  `No executions found for "${job.name}".`
3455
3872
  );
3456
- return;
3873
+ continue;
3457
3874
  }
3458
3875
  execution = await service.getExecution(
3459
3876
  job.id,
3460
3877
  history.items[0].id
3461
3878
  );
3462
3879
  }
3463
- if (services.length > 1) {
3464
- context.writer.writeln(
3465
- context.writer.wrapInColor(
3466
- `Server: ${name}`,
3467
- CliForegroundColor.Cyan
3468
- )
3469
- );
3470
- }
3471
3880
  context.writer.writeln(
3472
3881
  `Logs for "${job.name}" execution ${execution.id.substring(0, 8)} (${statusColor(execution.status, context.writer)}):`
3473
3882
  );
3474
3883
  if (!execution.logs || execution.logs.length === 0) {
3475
3884
  context.writer.writeInfo(" No log entries.");
3476
- return;
3885
+ continue;
3477
3886
  }
3478
3887
  for (const entry of execution.logs) {
3479
3888
  const ts = new Date(entry.timestamp).toLocaleTimeString();
@@ -3485,7 +3894,6 @@ var jobs = (() => {
3485
3894
  ` ${context.writer.wrapInColor(ts, CliForegroundColor.White)} ${level} ${entry.message}`
3486
3895
  );
3487
3896
  }
3488
- return;
3489
3897
  } catch (e) {
3490
3898
  context.writer.writeError(
3491
3899
  `Error on server ${name}: ${e.message}`
@@ -3494,10 +3902,15 @@ var jobs = (() => {
3494
3902
  }
3495
3903
  }
3496
3904
  // ── Edit ─────────────────────────────────────────────────────────
3905
+ /**
3906
+ * Prompt for each setting; Enter keeps the current value. Ctrl+C or
3907
+ * Escape at any prompt (the reader resolves null) cancels the whole edit
3908
+ * and nothing is sent. A job on several servers needs --server.
3909
+ */
3497
3910
  async handleEdit(cmd, context) {
3498
- const nameOrId = (cmd.value ?? "").trim();
3911
+ const nameOrId = joinShellWords(cmd.value ?? "");
3499
3912
  if (!nameOrId) {
3500
- context.writer.writeError("Usage: jobs edit <id|name>");
3913
+ context.writer.writeError("Usage: server jobs edit <id|name>");
3501
3914
  return;
3502
3915
  }
3503
3916
  const services = getServices(context, cmd.args);
@@ -3505,118 +3918,113 @@ var jobs = (() => {
3505
3918
  context.writer.writeInfo("No connected servers.");
3506
3919
  return;
3507
3920
  }
3508
- for (const { name, service } of services) {
3509
- try {
3510
- const job = await resolveJobId(service, nameOrId);
3511
- if (!job) {
3512
- if (services.length === 1) {
3513
- context.writer.writeError(
3514
- `Job "${nameOrId}" not found on server ${name}.`
3515
- );
3516
- }
3517
- continue;
3518
- }
3519
- context.writer.writeln(
3520
- `Editing job "${context.writer.wrapInColor(job.name, CliForegroundColor.Cyan)}" on server ${name}`
3521
- );
3522
- context.writer.writeln(
3523
- "Press Enter to keep current value, or type a new value."
3524
- );
3525
- context.writer.writeln("");
3526
- const update = {};
3527
- const newDesc = await context.reader.readLine(
3528
- `Description [${job.description}]: `
3529
- );
3530
- if (newDesc == null) {
3531
- context.writer.writeInfo("Edit cancelled.");
3532
- return;
3533
- }
3534
- if (newDesc.trim()) {
3535
- update.description = newDesc.trim();
3536
- }
3537
- const newGroup = await context.reader.readLine(
3538
- `Group [${job.group ?? "none"}]: `
3539
- );
3540
- if (newGroup == null) {
3541
- context.writer.writeInfo("Edit cancelled.");
3542
- return;
3543
- }
3544
- if (newGroup.trim()) {
3545
- update.group = newGroup.trim();
3546
- }
3547
- const currentSchedule = job.schedule ?? (job.interval ? `interval: ${job.interval}ms` : "none");
3548
- const newSchedule = await context.reader.readLine(
3549
- `Cron schedule [${currentSchedule}]: `
3550
- );
3551
- if (newSchedule == null) {
3552
- context.writer.writeInfo("Edit cancelled.");
3553
- return;
3554
- }
3555
- if (newSchedule.trim()) {
3556
- update.schedule = newSchedule.trim();
3557
- }
3558
- if (!newSchedule.trim()) {
3559
- const newInterval = await context.reader.readLine(
3560
- `Interval (e.g. 30s, 5m) [${job.interval ? `${job.interval}ms` : "none"}]: `
3561
- );
3562
- if (newInterval != null && newInterval.trim()) {
3563
- update.interval = newInterval.trim();
3564
- }
3565
- }
3566
- const newRetries = await context.reader.readLine(
3567
- `Max retries [${job.maxRetries}]: `
3568
- );
3569
- if (newRetries != null && newRetries.trim()) {
3570
- const parsed = parseInt(newRetries.trim(), 10);
3571
- if (!isNaN(parsed)) {
3572
- update.maxRetries = parsed;
3573
- }
3574
- }
3575
- const newTimeout = await context.reader.readLine(
3576
- `Timeout (e.g. 5m, 1h) [${job.timeout ? `${job.timeout}ms` : "none"}]: `
3577
- );
3578
- if (newTimeout != null && newTimeout.trim()) {
3579
- update.timeout = newTimeout.trim();
3580
- }
3581
- const newOverlap = await context.reader.readLine(
3582
- `Overlap policy (skip/queue/cancel) [${job.overlapPolicy}]: `
3583
- );
3584
- if (newOverlap != null && newOverlap.trim() && ["skip", "queue", "cancel"].includes(
3585
- newOverlap.trim().toLowerCase()
3586
- )) {
3587
- update.overlapPolicy = newOverlap.trim().toLowerCase();
3588
- }
3589
- if (Object.keys(update).length === 0) {
3590
- context.writer.writeInfo("No changes made.");
3591
- return;
3592
- }
3593
- const confirm = await context.reader.readConfirm(
3594
- "Apply changes?"
3921
+ const matches = await findJobOnServers(context, services, nameOrId);
3922
+ if (matches.length === 0) {
3923
+ return;
3924
+ }
3925
+ if (matches.length > 1) {
3926
+ context.writer.writeError(
3927
+ `Job "${nameOrId}" is on ${matches.length} servers (${matches.map((m) => m.name).join(", ")}). Use --server <name> to choose the one to edit.`
3928
+ );
3929
+ return;
3930
+ }
3931
+ const { name, service, job } = matches[0];
3932
+ const cancelled = () => {
3933
+ context.writer.writeInfo("Edit cancelled.");
3934
+ };
3935
+ const aborted = () => !!context.signal?.aborted;
3936
+ const ask = async (prompt) => {
3937
+ if (aborted()) return null;
3938
+ const answer = await context.reader.readLine(prompt);
3939
+ return answer == null || aborted() ? null : answer.trim();
3940
+ };
3941
+ try {
3942
+ context.writer.writeln(
3943
+ `Editing job "${context.writer.wrapInColor(job.name, CliForegroundColor.Cyan)}" on server ${name}`
3944
+ );
3945
+ context.writer.writeln(
3946
+ "Press Enter to keep current value, or type a new value. Ctrl+C cancels."
3947
+ );
3948
+ context.writer.writeln("");
3949
+ const update = {};
3950
+ const newDesc = await ask(`Description [${job.description}]: `);
3951
+ if (newDesc == null) return cancelled();
3952
+ if (newDesc) update.description = newDesc;
3953
+ const newGroup = await ask(`Group [${job.group ?? "none"}]: `);
3954
+ if (newGroup == null) return cancelled();
3955
+ if (newGroup) update.group = newGroup;
3956
+ const currentSchedule = job.schedule ?? (job.interval ? `interval: ${job.interval}ms` : "none");
3957
+ const newSchedule = await ask(
3958
+ `Cron schedule [${currentSchedule}]: `
3959
+ );
3960
+ if (newSchedule == null) return cancelled();
3961
+ if (newSchedule) update.schedule = newSchedule;
3962
+ if (!newSchedule) {
3963
+ const newInterval = await ask(
3964
+ `Interval (e.g. 30s, 5m) [${job.interval ? `${job.interval}ms` : "none"}]: `
3595
3965
  );
3596
- if (!confirm) {
3597
- context.writer.writeInfo("Edit cancelled.");
3598
- return;
3966
+ if (newInterval == null) return cancelled();
3967
+ if (newInterval) update.interval = newInterval;
3968
+ }
3969
+ const newRetries = await ask(`Max retries [${job.maxRetries}]: `);
3970
+ if (newRetries == null) return cancelled();
3971
+ if (newRetries) {
3972
+ const parsed = parseInt(newRetries, 10);
3973
+ if (!isNaN(parsed)) {
3974
+ update.maxRetries = parsed;
3599
3975
  }
3600
- await service.updateJob(job.id, update);
3601
- context.writer.writeSuccess(
3602
- `Job "${job.name}" updated successfully.`
3603
- );
3976
+ }
3977
+ const newTimeout = await ask(
3978
+ `Timeout (e.g. 5m, 1h) [${job.timeout ? `${job.timeout}ms` : "none"}]: `
3979
+ );
3980
+ if (newTimeout == null) return cancelled();
3981
+ if (newTimeout) update.timeout = newTimeout;
3982
+ const newOverlap = await ask(
3983
+ `Overlap policy (skip/queue/cancel) [${job.overlapPolicy}]: `
3984
+ );
3985
+ if (newOverlap == null) return cancelled();
3986
+ if (newOverlap && ["skip", "queue", "cancel"].includes(newOverlap.toLowerCase())) {
3987
+ update.overlapPolicy = newOverlap.toLowerCase();
3988
+ }
3989
+ if (Object.keys(update).length === 0) {
3990
+ context.writer.writeInfo("No changes made.");
3604
3991
  return;
3605
- } catch (e) {
3606
- context.writer.writeError(
3607
- `Error on server ${name}: ${e.message}`
3608
- );
3609
3992
  }
3993
+ const confirm = aborted() ? null : await context.reader.readConfirm("Apply changes?");
3994
+ if (!confirm || aborted()) return cancelled();
3995
+ await service.updateJob(job.id, update);
3996
+ context.writer.writeSuccess(
3997
+ `Job "${job.name}" updated successfully.`
3998
+ );
3999
+ } catch (e) {
4000
+ context.writer.writeError(`Error on server ${name}: ${e.message}`);
3610
4001
  }
3611
4002
  }
3612
4003
  // ── Watch ────────────────────────────────────────────────────────
4004
+ /**
4005
+ * Stream job events until Ctrl+C (context.onAbort / context.signal) or
4006
+ * until every watched server has closed its connection. On exit the
4007
+ * sockets are closed and every subscription and listener is removed.
4008
+ */
3613
4009
  async handleWatch(cmd, context) {
3614
- const manager = context.services.get("cli-server-manager");
4010
+ const manager = context.services.getRequired("cli-server-manager");
3615
4011
  if (!manager || !manager.connections) {
3616
4012
  context.writer.writeInfo("No connected servers.");
3617
4013
  return;
3618
4014
  }
3619
4015
  const targetServer = cmd.args["server"];
4016
+ const targets = [];
4017
+ for (const [serverName, connection] of manager.connections) {
4018
+ if (targetServer && serverName !== targetServer) continue;
4019
+ if (!connection.connected) continue;
4020
+ targets.push([serverName, connection]);
4021
+ }
4022
+ if (targets.length === 0) {
4023
+ context.writer.writeInfo(
4024
+ targetServer ? `Server "${targetServer}" is not connected.` : "No connected servers."
4025
+ );
4026
+ return;
4027
+ }
3620
4028
  context.writer.writeln(
3621
4029
  context.writer.wrapInColor(
3622
4030
  "Watching job events... (press Ctrl+C to stop)",
@@ -3624,33 +4032,60 @@ var jobs = (() => {
3624
4032
  )
3625
4033
  );
3626
4034
  context.writer.writeln("");
3627
- const sockets = [];
3628
- const abortHandler = () => {
3629
- for (const ws of sockets) {
3630
- try {
3631
- ws.close();
3632
- } catch {
3633
- }
4035
+ const open = /* @__PURE__ */ new Set();
4036
+ let stopped = false;
4037
+ let reason = "aborted";
4038
+ let resolveDone;
4039
+ const done = new Promise((resolve) => resolveDone = resolve);
4040
+ const closeSocket = (ws) => {
4041
+ ws.onmessage = null;
4042
+ ws.onerror = null;
4043
+ ws.onclose = null;
4044
+ try {
4045
+ ws.close();
4046
+ } catch {
3634
4047
  }
3635
4048
  };
3636
- context.onAbort.subscribe(abortHandler);
3637
- for (const [serverName, connection] of manager.connections) {
3638
- if (targetServer && serverName !== targetServer) continue;
3639
- if (!connection.connected) continue;
4049
+ const onAbortSignal = () => stop("aborted");
4050
+ const abortSub = context.onAbort?.subscribe(onAbortSignal);
4051
+ context.signal?.addEventListener("abort", onAbortSignal);
4052
+ function stop(why) {
4053
+ if (stopped) return;
4054
+ stopped = true;
4055
+ reason = why;
4056
+ abortSub?.unsubscribe();
4057
+ context.signal?.removeEventListener("abort", onAbortSignal);
4058
+ for (const ws of open) closeSocket(ws);
4059
+ open.clear();
4060
+ resolveDone();
4061
+ }
4062
+ if (context.signal?.aborted) {
4063
+ stop("aborted");
4064
+ }
4065
+ const multiServer = targets.length > 1;
4066
+ for (const [serverName, connection] of targets) {
4067
+ if (stopped) break;
3640
4068
  const config = connection.config;
3641
4069
  const baseUrl = config.url.endsWith("/") ? config.url.slice(0, -1) : config.url;
3642
- const wsUrl = baseUrl.replace(/^https:/, "wss:").replace(/^http:/, "ws:") + "/ws/v1/qcli/events";
3643
4070
  try {
4071
+ const wsUrl = await resolveServerWebSocketUrl(
4072
+ context.services,
4073
+ serverName,
4074
+ baseUrl.replace(/^https:/, "wss:").replace(/^http:/, "ws:") + "/ws/v1/qcli/events",
4075
+ config.headers
4076
+ );
4077
+ if (stopped) break;
3644
4078
  const ws = new WebSocket(wsUrl);
3645
- sockets.push(ws);
4079
+ open.add(ws);
3646
4080
  ws.onmessage = (event) => {
4081
+ if (stopped) return;
3647
4082
  try {
3648
4083
  const data = JSON.parse(event.data);
3649
4084
  if (!data.type || !data.type.startsWith("job:")) {
3650
4085
  return;
3651
4086
  }
3652
4087
  const ts = (/* @__PURE__ */ new Date()).toLocaleTimeString();
3653
- const serverPrefix = manager.connections.size > 1 ? context.writer.wrapInColor(
4088
+ const serverPrefix = multiServer ? context.writer.wrapInColor(
3654
4089
  `[${serverName}] `,
3655
4090
  CliForegroundColor.Cyan
3656
4091
  ) : "";
@@ -3678,11 +4113,19 @@ var jobs = (() => {
3678
4113
  }
3679
4114
  };
3680
4115
  ws.onerror = () => {
4116
+ if (stopped) return;
3681
4117
  context.writer.writeError(
3682
4118
  `WebSocket error on server ${serverName}`
3683
4119
  );
3684
4120
  };
3685
4121
  ws.onclose = () => {
4122
+ if (stopped || !open.delete(ws)) return;
4123
+ context.writer.writeWarning(
4124
+ `Connection to server ${serverName} closed.`
4125
+ );
4126
+ if (open.size === 0) {
4127
+ stop("closed");
4128
+ }
3686
4129
  };
3687
4130
  } catch (e) {
3688
4131
  context.writer.writeError(
@@ -3690,22 +4133,23 @@ var jobs = (() => {
3690
4133
  );
3691
4134
  }
3692
4135
  }
3693
- await new Promise((resolve) => {
3694
- const sub = context.onAbort.subscribe(() => {
3695
- sub.unsubscribe();
3696
- resolve();
3697
- });
3698
- if (context.signal) {
3699
- context.signal.addEventListener("abort", () => {
3700
- sub.unsubscribe();
3701
- resolve();
3702
- });
3703
- }
3704
- });
4136
+ if (!stopped && open.size === 0) {
4137
+ stop("closed");
4138
+ }
4139
+ await done;
3705
4140
  context.writer.writeln("");
3706
- context.writer.writeInfo("Stopped watching job events.");
4141
+ context.writer.writeInfo(
4142
+ reason === "closed" ? "Stopped watching job events: no server connection left." : "Stopped watching job events."
4143
+ );
3707
4144
  }
3708
4145
  };
4146
+ var PAST_TENSE = {
4147
+ trigger: "triggered",
4148
+ pause: "paused",
4149
+ resume: "resumed",
4150
+ stop: "stopped",
4151
+ cancel: "cancelled"
4152
+ };
3709
4153
 
3710
4154
  // src/lib/completion/cli-job-name-completion-provider.ts
3711
4155
  var JOB_NAME_SUBCOMMANDS = /* @__PURE__ */ new Set([
@@ -3747,16 +4191,16 @@ var jobs = (() => {
3747
4191
  }
3748
4192
  const lowerPrefix = token.toLowerCase();
3749
4193
  try {
3750
- const manager = this.services.get("cli-server-manager");
4194
+ const manager = this.services.getRequired("cli-server-manager");
3751
4195
  if (!manager?.connections) {
3752
4196
  return [];
3753
4197
  }
3754
4198
  const names = [];
3755
- for (const [, connection] of manager.connections) {
4199
+ for (const [name, connection] of manager.connections) {
3756
4200
  if (!connection.connected) continue;
3757
4201
  const config = connection.config;
3758
4202
  const baseUrl = config.url.endsWith("/") ? config.url.slice(0, -1) : config.url;
3759
- const headers = config.headers ?? {};
4203
+ const headers = resolveServerHeaders(this.services, name, config.headers);
3760
4204
  const service = new CliJobsService(baseUrl, headers);
3761
4205
  try {
3762
4206
  const jobs = await service.listJobs();
@@ -3776,12 +4220,12 @@ var jobs = (() => {
3776
4220
  };
3777
4221
 
3778
4222
  // src/lib/version.ts
3779
- var API_VERSION = 2;
4223
+ var API_VERSION2 = 2;
3780
4224
 
3781
4225
  // src/cli-entrypoint.ts
3782
4226
  var completionProvider = new CliJobNameCompletionProvider();
3783
4227
  var module = {
3784
- apiVersion: API_VERSION,
4228
+ apiVersion: API_VERSION2,
3785
4229
  name: "@qodalis/cli-server-jobs",
3786
4230
  processors: [new CliJobsCommandProcessor()],
3787
4231
  services: [