@qodalis/cli-server-jobs 2.0.0-beta.9 → 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.
- package/package.json +2 -2
- package/public-api.d.mts +18 -2
- package/public-api.d.ts +18 -2
- package/public-api.js +460 -256
- package/public-api.js.map +1 -1
- package/public-api.mjs +461 -257
- package/public-api.mjs.map +1 -1
- package/umd/index.global.js +763 -321
package/umd/index.global.js
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
74
|
-
var re = exports
|
|
75
|
-
var safeRe = exports
|
|
76
|
-
var src = exports
|
|
77
|
-
var safeSrc = exports
|
|
78
|
-
var t = exports
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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 (
|
|
442
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 = (
|
|
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.
|
|
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 = (
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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}
|
|
1112
|
+
ret = `>=${M}.${m}.${p} <${M}.${m}.${+p + 1}-0`;
|
|
1053
1113
|
} else {
|
|
1054
|
-
ret = `>=${M}.${m}.${p}
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 === ">=" && !
|
|
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 === "<=" && !
|
|
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.
|
|
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,
|
|
@@ -1950,11 +2015,94 @@ var jobs = (() => {
|
|
|
1950
2015
|
CliIcon2["Gift"] = "\u{1F381}";
|
|
1951
2016
|
return CliIcon2;
|
|
1952
2017
|
})(CliIcon || {});
|
|
1953
|
-
|
|
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());
|
|
1959
2107
|
var API_VERSION = 2;
|
|
1960
2108
|
var VERSIONS_ENDPOINT = "/api/qcli/versions";
|
|
@@ -1977,9 +2125,18 @@ var jobs = (() => {
|
|
|
1977
2125
|
* Returns the negotiated API version and the base path for all subsequent calls,
|
|
1978
2126
|
* or null if the server is unreachable or incompatible.
|
|
1979
2127
|
*/
|
|
1980
|
-
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
|
+
}
|
|
1981
2139
|
try {
|
|
1982
|
-
const response = await fetch(`${baseUrl}${VERSIONS_ENDPOINT}`);
|
|
1983
2140
|
if (!response.ok) return null;
|
|
1984
2141
|
const info = await response.json();
|
|
1985
2142
|
const version = this.negotiate(info);
|
|
@@ -1993,6 +2150,85 @@ var jobs = (() => {
|
|
|
1993
2150
|
}
|
|
1994
2151
|
}
|
|
1995
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
|
+
}
|
|
1996
2232
|
var bootCliModule = async (module2) => {
|
|
1997
2233
|
if (typeof window !== "undefined" && window.__cliModuleRegistry) {
|
|
1998
2234
|
await window.__cliModuleRegistry.register(module2);
|
|
@@ -2899,7 +3135,7 @@ var jobs = (() => {
|
|
|
2899
3135
|
|
|
2900
3136
|
// src/lib/processors/cli-jobs-command-processor.ts
|
|
2901
3137
|
function getServices(context, args) {
|
|
2902
|
-
const manager = context.services.
|
|
3138
|
+
const manager = context.services.getRequired("cli-server-manager");
|
|
2903
3139
|
if (!manager || !manager.connections) {
|
|
2904
3140
|
return [];
|
|
2905
3141
|
}
|
|
@@ -2910,7 +3146,7 @@ var jobs = (() => {
|
|
|
2910
3146
|
if (!connection.connected) continue;
|
|
2911
3147
|
const config = connection.config;
|
|
2912
3148
|
const baseUrl = config.url.endsWith("/") ? config.url.slice(0, -1) : config.url;
|
|
2913
|
-
const headers = config.headers
|
|
3149
|
+
const headers = resolveServerHeaders(context.services, name, config.headers);
|
|
2914
3150
|
results.push({ name, service: new CliJobsService(baseUrl, headers) });
|
|
2915
3151
|
}
|
|
2916
3152
|
return results;
|
|
@@ -2923,10 +3159,41 @@ var jobs = (() => {
|
|
|
2923
3159
|
}
|
|
2924
3160
|
}
|
|
2925
3161
|
const jobs = await service.listJobs();
|
|
2926
|
-
const
|
|
2927
|
-
|
|
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)
|
|
2928
3196
|
);
|
|
2929
|
-
return match ?? null;
|
|
2930
3197
|
}
|
|
2931
3198
|
function formatRelativeTime(isoString) {
|
|
2932
3199
|
if (!isoString) return "-";
|
|
@@ -3001,6 +3268,26 @@ var jobs = (() => {
|
|
|
3001
3268
|
command: "jobs",
|
|
3002
3269
|
description: "Manage background jobs on connected servers",
|
|
3003
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
|
+
},
|
|
3004
3291
|
metadata: {
|
|
3005
3292
|
icon: CliIcon.Gear,
|
|
3006
3293
|
module: "@qodalis/cli-server-jobs"
|
|
@@ -3011,6 +3298,23 @@ var jobs = (() => {
|
|
|
3011
3298
|
{
|
|
3012
3299
|
command: "list",
|
|
3013
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
|
+
},
|
|
3014
3318
|
aliases: ["ls"],
|
|
3015
3319
|
parameters: [
|
|
3016
3320
|
serverParam,
|
|
@@ -3029,6 +3333,21 @@ var jobs = (() => {
|
|
|
3029
3333
|
{
|
|
3030
3334
|
command: "info",
|
|
3031
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
|
+
},
|
|
3032
3351
|
valueRequired: true,
|
|
3033
3352
|
parameters: [serverParam],
|
|
3034
3353
|
processCommand: async (cmd, context) => {
|
|
@@ -3039,6 +3358,22 @@ var jobs = (() => {
|
|
|
3039
3358
|
{
|
|
3040
3359
|
command: "trigger",
|
|
3041
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
|
+
},
|
|
3042
3377
|
valueRequired: true,
|
|
3043
3378
|
parameters: [serverParam],
|
|
3044
3379
|
processCommand: async (cmd, context) => {
|
|
@@ -3049,6 +3384,22 @@ var jobs = (() => {
|
|
|
3049
3384
|
{
|
|
3050
3385
|
command: "pause",
|
|
3051
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
|
+
},
|
|
3052
3403
|
valueRequired: true,
|
|
3053
3404
|
parameters: [serverParam],
|
|
3054
3405
|
processCommand: async (cmd, context) => {
|
|
@@ -3059,6 +3410,21 @@ var jobs = (() => {
|
|
|
3059
3410
|
{
|
|
3060
3411
|
command: "resume",
|
|
3061
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
|
+
},
|
|
3062
3428
|
valueRequired: true,
|
|
3063
3429
|
parameters: [serverParam],
|
|
3064
3430
|
processCommand: async (cmd, context) => {
|
|
@@ -3069,6 +3435,21 @@ var jobs = (() => {
|
|
|
3069
3435
|
{
|
|
3070
3436
|
command: "stop",
|
|
3071
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
|
+
},
|
|
3072
3453
|
valueRequired: true,
|
|
3073
3454
|
parameters: [serverParam],
|
|
3074
3455
|
processCommand: async (cmd, context) => {
|
|
@@ -3079,6 +3460,21 @@ var jobs = (() => {
|
|
|
3079
3460
|
{
|
|
3080
3461
|
command: "cancel",
|
|
3081
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
|
+
},
|
|
3082
3478
|
valueRequired: true,
|
|
3083
3479
|
parameters: [serverParam],
|
|
3084
3480
|
processCommand: async (cmd, context) => {
|
|
@@ -3089,6 +3485,23 @@ var jobs = (() => {
|
|
|
3089
3485
|
{
|
|
3090
3486
|
command: "history",
|
|
3091
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
|
+
},
|
|
3092
3505
|
valueRequired: true,
|
|
3093
3506
|
parameters: [
|
|
3094
3507
|
serverParam,
|
|
@@ -3121,6 +3534,22 @@ var jobs = (() => {
|
|
|
3121
3534
|
{
|
|
3122
3535
|
command: "logs",
|
|
3123
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
|
+
},
|
|
3124
3553
|
valueRequired: true,
|
|
3125
3554
|
parameters: [
|
|
3126
3555
|
serverParam,
|
|
@@ -3139,6 +3568,21 @@ var jobs = (() => {
|
|
|
3139
3568
|
{
|
|
3140
3569
|
command: "edit",
|
|
3141
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
|
+
},
|
|
3142
3586
|
valueRequired: true,
|
|
3143
3587
|
parameters: [serverParam],
|
|
3144
3588
|
processCommand: async (cmd, context) => {
|
|
@@ -3149,6 +3593,21 @@ var jobs = (() => {
|
|
|
3149
3593
|
{
|
|
3150
3594
|
command: "watch",
|
|
3151
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
|
+
},
|
|
3152
3611
|
parameters: [serverParam],
|
|
3153
3612
|
processCommand: async (cmd, context) => {
|
|
3154
3613
|
await this.handleWatch(cmd, context);
|
|
@@ -3222,9 +3681,9 @@ var jobs = (() => {
|
|
|
3222
3681
|
}
|
|
3223
3682
|
// ── Info ──────────────────────────────────────────────────────────
|
|
3224
3683
|
async handleInfo(cmd, context) {
|
|
3225
|
-
const nameOrId = (cmd.value ?? "")
|
|
3684
|
+
const nameOrId = joinShellWords(cmd.value ?? "");
|
|
3226
3685
|
if (!nameOrId) {
|
|
3227
|
-
context.writer.writeError("Usage: jobs info <id|name>");
|
|
3686
|
+
context.writer.writeError("Usage: server jobs info <id|name>");
|
|
3228
3687
|
return;
|
|
3229
3688
|
}
|
|
3230
3689
|
const services = getServices(context, cmd.args);
|
|
@@ -3232,74 +3691,53 @@ var jobs = (() => {
|
|
|
3232
3691
|
context.writer.writeInfo("No connected servers.");
|
|
3233
3692
|
return;
|
|
3234
3693
|
}
|
|
3235
|
-
|
|
3236
|
-
|
|
3237
|
-
|
|
3238
|
-
|
|
3239
|
-
|
|
3240
|
-
|
|
3241
|
-
|
|
3242
|
-
|
|
3243
|
-
|
|
3244
|
-
|
|
3245
|
-
|
|
3246
|
-
|
|
3247
|
-
|
|
3248
|
-
|
|
3249
|
-
|
|
3250
|
-
|
|
3251
|
-
|
|
3252
|
-
|
|
3253
|
-
|
|
3254
|
-
|
|
3255
|
-
|
|
3256
|
-
|
|
3257
|
-
|
|
3258
|
-
|
|
3259
|
-
|
|
3260
|
-
|
|
3261
|
-
|
|
3262
|
-
|
|
3263
|
-
|
|
3264
|
-
|
|
3265
|
-
|
|
3266
|
-
|
|
3267
|
-
|
|
3268
|
-
],
|
|
3269
|
-
["Overlap Policy", job.overlapPolicy],
|
|
3270
|
-
[
|
|
3271
|
-
"Current Execution",
|
|
3272
|
-
job.currentExecutionId ?? "none"
|
|
3273
|
-
],
|
|
3274
|
-
["Next Run", formatRelativeTime(job.nextRunAt)],
|
|
3275
|
-
["Last Run", formatRelativeTime(job.lastRunAt)],
|
|
3276
|
-
[
|
|
3277
|
-
"Last Run Status",
|
|
3278
|
-
job.lastRunStatus ? statusColor(job.lastRunStatus, context.writer) : "-"
|
|
3279
|
-
],
|
|
3280
|
-
["Last Run Duration", formatDuration(job.lastRunDuration)]
|
|
3281
|
-
];
|
|
3282
|
-
for (const [label, value] of lines) {
|
|
3283
|
-
context.writer.writeln(
|
|
3284
|
-
` ${context.writer.wrapInColor(
|
|
3285
|
-
label.padEnd(20),
|
|
3286
|
-
CliForegroundColor.Yellow
|
|
3287
|
-
)} ${value}`
|
|
3288
|
-
);
|
|
3289
|
-
}
|
|
3290
|
-
return;
|
|
3291
|
-
} catch (e) {
|
|
3292
|
-
context.writer.writeError(
|
|
3293
|
-
`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}`
|
|
3294
3727
|
);
|
|
3295
3728
|
}
|
|
3296
3729
|
}
|
|
3297
3730
|
}
|
|
3298
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
|
+
*/
|
|
3299
3737
|
async handleAction(cmd, context, action) {
|
|
3300
|
-
const nameOrId = (cmd.value ?? "")
|
|
3738
|
+
const nameOrId = joinShellWords(cmd.value ?? "");
|
|
3301
3739
|
if (!nameOrId) {
|
|
3302
|
-
context.writer.writeError(`Usage: jobs ${action} <id|name>`);
|
|
3740
|
+
context.writer.writeError(`Usage: server jobs ${action} <id|name>`);
|
|
3303
3741
|
return;
|
|
3304
3742
|
}
|
|
3305
3743
|
const services = getServices(context, cmd.args);
|
|
@@ -3307,17 +3745,14 @@ var jobs = (() => {
|
|
|
3307
3745
|
context.writer.writeInfo("No connected servers.");
|
|
3308
3746
|
return;
|
|
3309
3747
|
}
|
|
3310
|
-
|
|
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) {
|
|
3311
3755
|
try {
|
|
3312
|
-
const job = await resolveJobId(service, nameOrId);
|
|
3313
|
-
if (!job) {
|
|
3314
|
-
if (services.length === 1) {
|
|
3315
|
-
context.writer.writeError(
|
|
3316
|
-
`Job "${nameOrId}" not found on server ${name}.`
|
|
3317
|
-
);
|
|
3318
|
-
}
|
|
3319
|
-
continue;
|
|
3320
|
-
}
|
|
3321
3756
|
switch (action) {
|
|
3322
3757
|
case "trigger":
|
|
3323
3758
|
await service.triggerJob(job.id);
|
|
@@ -3337,9 +3772,8 @@ var jobs = (() => {
|
|
|
3337
3772
|
}
|
|
3338
3773
|
const serverSuffix = services.length > 1 ? ` on server ${name}` : "";
|
|
3339
3774
|
context.writer.writeSuccess(
|
|
3340
|
-
`Job "${job.name}" ${action
|
|
3775
|
+
`Job "${job.name}" ${PAST_TENSE[action] ?? `${action}ed`}${serverSuffix}.`
|
|
3341
3776
|
);
|
|
3342
|
-
return;
|
|
3343
3777
|
} catch (e) {
|
|
3344
3778
|
context.writer.writeError(
|
|
3345
3779
|
`Failed to ${action} job on ${name}: ${e.message}`
|
|
@@ -3349,9 +3783,9 @@ var jobs = (() => {
|
|
|
3349
3783
|
}
|
|
3350
3784
|
// ── History ──────────────────────────────────────────────────────
|
|
3351
3785
|
async handleHistory(cmd, context) {
|
|
3352
|
-
const nameOrId = (cmd.value ?? "")
|
|
3786
|
+
const nameOrId = joinShellWords(cmd.value ?? "");
|
|
3353
3787
|
if (!nameOrId) {
|
|
3354
|
-
context.writer.writeError("Usage: jobs history <id|name>");
|
|
3788
|
+
context.writer.writeError("Usage: server jobs history <id|name>");
|
|
3355
3789
|
return;
|
|
3356
3790
|
}
|
|
3357
3791
|
const services = getServices(context, cmd.args);
|
|
@@ -3362,24 +3796,11 @@ var jobs = (() => {
|
|
|
3362
3796
|
const limit = cmd.args["limit"] ?? 20;
|
|
3363
3797
|
const offset = cmd.args["offset"] ?? 0;
|
|
3364
3798
|
const status = cmd.args["status"];
|
|
3365
|
-
|
|
3799
|
+
const matches = await findJobOnServers(context, services, nameOrId);
|
|
3800
|
+
for (const { name, service, job } of matches) {
|
|
3366
3801
|
try {
|
|
3367
|
-
const job = await resolveJobId(service, nameOrId);
|
|
3368
|
-
if (!job) {
|
|
3369
|
-
if (services.length === 1) {
|
|
3370
|
-
context.writer.writeError(
|
|
3371
|
-
`Job "${nameOrId}" not found on server ${name}.`
|
|
3372
|
-
);
|
|
3373
|
-
}
|
|
3374
|
-
continue;
|
|
3375
|
-
}
|
|
3376
3802
|
if (services.length > 1) {
|
|
3377
|
-
context
|
|
3378
|
-
context.writer.wrapInColor(
|
|
3379
|
-
`Server: ${name}`,
|
|
3380
|
-
CliForegroundColor.Cyan
|
|
3381
|
-
)
|
|
3382
|
-
);
|
|
3803
|
+
writeServerHeader(context, name);
|
|
3383
3804
|
}
|
|
3384
3805
|
const history = await service.getHistory(job.id, {
|
|
3385
3806
|
limit,
|
|
@@ -3390,7 +3811,7 @@ var jobs = (() => {
|
|
|
3390
3811
|
context.writer.writeInfo(
|
|
3391
3812
|
`No execution history for "${job.name}".`
|
|
3392
3813
|
);
|
|
3393
|
-
|
|
3814
|
+
continue;
|
|
3394
3815
|
}
|
|
3395
3816
|
context.writer.writeln(
|
|
3396
3817
|
`Showing ${history.items.length} of ${history.total} executions for "${job.name}":`
|
|
@@ -3412,7 +3833,6 @@ var jobs = (() => {
|
|
|
3412
3833
|
exec.error ? exec.error.substring(0, 40) : "-"
|
|
3413
3834
|
]);
|
|
3414
3835
|
context.writer.writeTable(headers, rows);
|
|
3415
|
-
return;
|
|
3416
3836
|
} catch (e) {
|
|
3417
3837
|
context.writer.writeError(
|
|
3418
3838
|
`Error on server ${name}: ${e.message}`
|
|
@@ -3422,9 +3842,9 @@ var jobs = (() => {
|
|
|
3422
3842
|
}
|
|
3423
3843
|
// ── Logs ─────────────────────────────────────────────────────────
|
|
3424
3844
|
async handleLogs(cmd, context) {
|
|
3425
|
-
const nameOrId = (cmd.value ?? "")
|
|
3845
|
+
const nameOrId = joinShellWords(cmd.value ?? "");
|
|
3426
3846
|
if (!nameOrId) {
|
|
3427
|
-
context.writer.writeError("Usage: jobs logs <id|name>");
|
|
3847
|
+
context.writer.writeError("Usage: server jobs logs <id|name>");
|
|
3428
3848
|
return;
|
|
3429
3849
|
}
|
|
3430
3850
|
const services = getServices(context, cmd.args);
|
|
@@ -3433,16 +3853,11 @@ var jobs = (() => {
|
|
|
3433
3853
|
return;
|
|
3434
3854
|
}
|
|
3435
3855
|
const execId = cmd.args["exec"];
|
|
3436
|
-
|
|
3856
|
+
const matches = await findJobOnServers(context, services, nameOrId);
|
|
3857
|
+
for (const { name, service, job } of matches) {
|
|
3437
3858
|
try {
|
|
3438
|
-
|
|
3439
|
-
|
|
3440
|
-
if (services.length === 1) {
|
|
3441
|
-
context.writer.writeError(
|
|
3442
|
-
`Job "${nameOrId}" not found on server ${name}.`
|
|
3443
|
-
);
|
|
3444
|
-
}
|
|
3445
|
-
continue;
|
|
3859
|
+
if (services.length > 1) {
|
|
3860
|
+
writeServerHeader(context, name);
|
|
3446
3861
|
}
|
|
3447
3862
|
let execution;
|
|
3448
3863
|
if (execId) {
|
|
@@ -3455,27 +3870,19 @@ var jobs = (() => {
|
|
|
3455
3870
|
context.writer.writeInfo(
|
|
3456
3871
|
`No executions found for "${job.name}".`
|
|
3457
3872
|
);
|
|
3458
|
-
|
|
3873
|
+
continue;
|
|
3459
3874
|
}
|
|
3460
3875
|
execution = await service.getExecution(
|
|
3461
3876
|
job.id,
|
|
3462
3877
|
history.items[0].id
|
|
3463
3878
|
);
|
|
3464
3879
|
}
|
|
3465
|
-
if (services.length > 1) {
|
|
3466
|
-
context.writer.writeln(
|
|
3467
|
-
context.writer.wrapInColor(
|
|
3468
|
-
`Server: ${name}`,
|
|
3469
|
-
CliForegroundColor.Cyan
|
|
3470
|
-
)
|
|
3471
|
-
);
|
|
3472
|
-
}
|
|
3473
3880
|
context.writer.writeln(
|
|
3474
3881
|
`Logs for "${job.name}" execution ${execution.id.substring(0, 8)} (${statusColor(execution.status, context.writer)}):`
|
|
3475
3882
|
);
|
|
3476
3883
|
if (!execution.logs || execution.logs.length === 0) {
|
|
3477
3884
|
context.writer.writeInfo(" No log entries.");
|
|
3478
|
-
|
|
3885
|
+
continue;
|
|
3479
3886
|
}
|
|
3480
3887
|
for (const entry of execution.logs) {
|
|
3481
3888
|
const ts = new Date(entry.timestamp).toLocaleTimeString();
|
|
@@ -3487,7 +3894,6 @@ var jobs = (() => {
|
|
|
3487
3894
|
` ${context.writer.wrapInColor(ts, CliForegroundColor.White)} ${level} ${entry.message}`
|
|
3488
3895
|
);
|
|
3489
3896
|
}
|
|
3490
|
-
return;
|
|
3491
3897
|
} catch (e) {
|
|
3492
3898
|
context.writer.writeError(
|
|
3493
3899
|
`Error on server ${name}: ${e.message}`
|
|
@@ -3496,10 +3902,15 @@ var jobs = (() => {
|
|
|
3496
3902
|
}
|
|
3497
3903
|
}
|
|
3498
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
|
+
*/
|
|
3499
3910
|
async handleEdit(cmd, context) {
|
|
3500
|
-
const nameOrId = (cmd.value ?? "")
|
|
3911
|
+
const nameOrId = joinShellWords(cmd.value ?? "");
|
|
3501
3912
|
if (!nameOrId) {
|
|
3502
|
-
context.writer.writeError("Usage: jobs edit <id|name>");
|
|
3913
|
+
context.writer.writeError("Usage: server jobs edit <id|name>");
|
|
3503
3914
|
return;
|
|
3504
3915
|
}
|
|
3505
3916
|
const services = getServices(context, cmd.args);
|
|
@@ -3507,118 +3918,113 @@ var jobs = (() => {
|
|
|
3507
3918
|
context.writer.writeInfo("No connected servers.");
|
|
3508
3919
|
return;
|
|
3509
3920
|
}
|
|
3510
|
-
|
|
3511
|
-
|
|
3512
|
-
|
|
3513
|
-
|
|
3514
|
-
|
|
3515
|
-
|
|
3516
|
-
|
|
3517
|
-
|
|
3518
|
-
|
|
3519
|
-
|
|
3520
|
-
|
|
3521
|
-
|
|
3522
|
-
|
|
3523
|
-
|
|
3524
|
-
|
|
3525
|
-
|
|
3526
|
-
|
|
3527
|
-
|
|
3528
|
-
|
|
3529
|
-
|
|
3530
|
-
|
|
3531
|
-
|
|
3532
|
-
|
|
3533
|
-
|
|
3534
|
-
|
|
3535
|
-
|
|
3536
|
-
|
|
3537
|
-
|
|
3538
|
-
|
|
3539
|
-
|
|
3540
|
-
|
|
3541
|
-
|
|
3542
|
-
|
|
3543
|
-
|
|
3544
|
-
|
|
3545
|
-
|
|
3546
|
-
|
|
3547
|
-
|
|
3548
|
-
|
|
3549
|
-
|
|
3550
|
-
|
|
3551
|
-
|
|
3552
|
-
|
|
3553
|
-
|
|
3554
|
-
context.writer.writeInfo("Edit cancelled.");
|
|
3555
|
-
return;
|
|
3556
|
-
}
|
|
3557
|
-
if (newSchedule.trim()) {
|
|
3558
|
-
update.schedule = newSchedule.trim();
|
|
3559
|
-
}
|
|
3560
|
-
if (!newSchedule.trim()) {
|
|
3561
|
-
const newInterval = await context.reader.readLine(
|
|
3562
|
-
`Interval (e.g. 30s, 5m) [${job.interval ? `${job.interval}ms` : "none"}]: `
|
|
3563
|
-
);
|
|
3564
|
-
if (newInterval != null && newInterval.trim()) {
|
|
3565
|
-
update.interval = newInterval.trim();
|
|
3566
|
-
}
|
|
3567
|
-
}
|
|
3568
|
-
const newRetries = await context.reader.readLine(
|
|
3569
|
-
`Max retries [${job.maxRetries}]: `
|
|
3570
|
-
);
|
|
3571
|
-
if (newRetries != null && newRetries.trim()) {
|
|
3572
|
-
const parsed = parseInt(newRetries.trim(), 10);
|
|
3573
|
-
if (!isNaN(parsed)) {
|
|
3574
|
-
update.maxRetries = parsed;
|
|
3575
|
-
}
|
|
3576
|
-
}
|
|
3577
|
-
const newTimeout = await context.reader.readLine(
|
|
3578
|
-
`Timeout (e.g. 5m, 1h) [${job.timeout ? `${job.timeout}ms` : "none"}]: `
|
|
3579
|
-
);
|
|
3580
|
-
if (newTimeout != null && newTimeout.trim()) {
|
|
3581
|
-
update.timeout = newTimeout.trim();
|
|
3582
|
-
}
|
|
3583
|
-
const newOverlap = await context.reader.readLine(
|
|
3584
|
-
`Overlap policy (skip/queue/cancel) [${job.overlapPolicy}]: `
|
|
3585
|
-
);
|
|
3586
|
-
if (newOverlap != null && newOverlap.trim() && ["skip", "queue", "cancel"].includes(
|
|
3587
|
-
newOverlap.trim().toLowerCase()
|
|
3588
|
-
)) {
|
|
3589
|
-
update.overlapPolicy = newOverlap.trim().toLowerCase();
|
|
3590
|
-
}
|
|
3591
|
-
if (Object.keys(update).length === 0) {
|
|
3592
|
-
context.writer.writeInfo("No changes made.");
|
|
3593
|
-
return;
|
|
3594
|
-
}
|
|
3595
|
-
const confirm = await context.reader.readConfirm(
|
|
3596
|
-
"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"}]: `
|
|
3597
3965
|
);
|
|
3598
|
-
if (
|
|
3599
|
-
|
|
3600
|
-
|
|
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;
|
|
3601
3975
|
}
|
|
3602
|
-
|
|
3603
|
-
|
|
3604
|
-
|
|
3605
|
-
|
|
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.");
|
|
3606
3991
|
return;
|
|
3607
|
-
} catch (e) {
|
|
3608
|
-
context.writer.writeError(
|
|
3609
|
-
`Error on server ${name}: ${e.message}`
|
|
3610
|
-
);
|
|
3611
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}`);
|
|
3612
4001
|
}
|
|
3613
4002
|
}
|
|
3614
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
|
+
*/
|
|
3615
4009
|
async handleWatch(cmd, context) {
|
|
3616
|
-
const manager = context.services.
|
|
4010
|
+
const manager = context.services.getRequired("cli-server-manager");
|
|
3617
4011
|
if (!manager || !manager.connections) {
|
|
3618
4012
|
context.writer.writeInfo("No connected servers.");
|
|
3619
4013
|
return;
|
|
3620
4014
|
}
|
|
3621
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
|
+
}
|
|
3622
4028
|
context.writer.writeln(
|
|
3623
4029
|
context.writer.wrapInColor(
|
|
3624
4030
|
"Watching job events... (press Ctrl+C to stop)",
|
|
@@ -3626,33 +4032,60 @@ var jobs = (() => {
|
|
|
3626
4032
|
)
|
|
3627
4033
|
);
|
|
3628
4034
|
context.writer.writeln("");
|
|
3629
|
-
const
|
|
3630
|
-
|
|
3631
|
-
|
|
3632
|
-
|
|
3633
|
-
|
|
3634
|
-
|
|
3635
|
-
|
|
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 {
|
|
3636
4047
|
}
|
|
3637
4048
|
};
|
|
3638
|
-
|
|
3639
|
-
|
|
3640
|
-
|
|
3641
|
-
|
|
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;
|
|
3642
4068
|
const config = connection.config;
|
|
3643
4069
|
const baseUrl = config.url.endsWith("/") ? config.url.slice(0, -1) : config.url;
|
|
3644
|
-
const wsUrl = baseUrl.replace(/^https:/, "wss:").replace(/^http:/, "ws:") + "/ws/v1/qcli/events";
|
|
3645
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;
|
|
3646
4078
|
const ws = new WebSocket(wsUrl);
|
|
3647
|
-
|
|
4079
|
+
open.add(ws);
|
|
3648
4080
|
ws.onmessage = (event) => {
|
|
4081
|
+
if (stopped) return;
|
|
3649
4082
|
try {
|
|
3650
4083
|
const data = JSON.parse(event.data);
|
|
3651
4084
|
if (!data.type || !data.type.startsWith("job:")) {
|
|
3652
4085
|
return;
|
|
3653
4086
|
}
|
|
3654
4087
|
const ts = (/* @__PURE__ */ new Date()).toLocaleTimeString();
|
|
3655
|
-
const serverPrefix =
|
|
4088
|
+
const serverPrefix = multiServer ? context.writer.wrapInColor(
|
|
3656
4089
|
`[${serverName}] `,
|
|
3657
4090
|
CliForegroundColor.Cyan
|
|
3658
4091
|
) : "";
|
|
@@ -3680,11 +4113,19 @@ var jobs = (() => {
|
|
|
3680
4113
|
}
|
|
3681
4114
|
};
|
|
3682
4115
|
ws.onerror = () => {
|
|
4116
|
+
if (stopped) return;
|
|
3683
4117
|
context.writer.writeError(
|
|
3684
4118
|
`WebSocket error on server ${serverName}`
|
|
3685
4119
|
);
|
|
3686
4120
|
};
|
|
3687
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
|
+
}
|
|
3688
4129
|
};
|
|
3689
4130
|
} catch (e) {
|
|
3690
4131
|
context.writer.writeError(
|
|
@@ -3692,22 +4133,23 @@ var jobs = (() => {
|
|
|
3692
4133
|
);
|
|
3693
4134
|
}
|
|
3694
4135
|
}
|
|
3695
|
-
|
|
3696
|
-
|
|
3697
|
-
|
|
3698
|
-
|
|
3699
|
-
});
|
|
3700
|
-
if (context.signal) {
|
|
3701
|
-
context.signal.addEventListener("abort", () => {
|
|
3702
|
-
sub.unsubscribe();
|
|
3703
|
-
resolve();
|
|
3704
|
-
});
|
|
3705
|
-
}
|
|
3706
|
-
});
|
|
4136
|
+
if (!stopped && open.size === 0) {
|
|
4137
|
+
stop("closed");
|
|
4138
|
+
}
|
|
4139
|
+
await done;
|
|
3707
4140
|
context.writer.writeln("");
|
|
3708
|
-
context.writer.writeInfo(
|
|
4141
|
+
context.writer.writeInfo(
|
|
4142
|
+
reason === "closed" ? "Stopped watching job events: no server connection left." : "Stopped watching job events."
|
|
4143
|
+
);
|
|
3709
4144
|
}
|
|
3710
4145
|
};
|
|
4146
|
+
var PAST_TENSE = {
|
|
4147
|
+
trigger: "triggered",
|
|
4148
|
+
pause: "paused",
|
|
4149
|
+
resume: "resumed",
|
|
4150
|
+
stop: "stopped",
|
|
4151
|
+
cancel: "cancelled"
|
|
4152
|
+
};
|
|
3711
4153
|
|
|
3712
4154
|
// src/lib/completion/cli-job-name-completion-provider.ts
|
|
3713
4155
|
var JOB_NAME_SUBCOMMANDS = /* @__PURE__ */ new Set([
|
|
@@ -3749,16 +4191,16 @@ var jobs = (() => {
|
|
|
3749
4191
|
}
|
|
3750
4192
|
const lowerPrefix = token.toLowerCase();
|
|
3751
4193
|
try {
|
|
3752
|
-
const manager = this.services.
|
|
4194
|
+
const manager = this.services.getRequired("cli-server-manager");
|
|
3753
4195
|
if (!manager?.connections) {
|
|
3754
4196
|
return [];
|
|
3755
4197
|
}
|
|
3756
4198
|
const names = [];
|
|
3757
|
-
for (const [, connection] of manager.connections) {
|
|
4199
|
+
for (const [name, connection] of manager.connections) {
|
|
3758
4200
|
if (!connection.connected) continue;
|
|
3759
4201
|
const config = connection.config;
|
|
3760
4202
|
const baseUrl = config.url.endsWith("/") ? config.url.slice(0, -1) : config.url;
|
|
3761
|
-
const headers = config.headers
|
|
4203
|
+
const headers = resolveServerHeaders(this.services, name, config.headers);
|
|
3762
4204
|
const service = new CliJobsService(baseUrl, headers);
|
|
3763
4205
|
try {
|
|
3764
4206
|
const jobs = await service.listJobs();
|