@qodalis/cli-scp 2.0.0-beta.13 → 2.0.0-beta.15
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 +1 -1
- package/public-api.d.ts +1 -1
- package/public-api.js +10 -20
- package/public-api.js.map +1 -1
- package/public-api.mjs +11 -21
- package/public-api.mjs.map +1 -1
- package/umd/index.global.js +24 -12
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qodalis/cli-scp",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
3
|
+
"version": "2.0.0-beta.15",
|
|
4
4
|
"description": "SCP-like file transfer between browser and remote servers",
|
|
5
5
|
"author": "Qodalis Solutions",
|
|
6
6
|
"license": "MIT",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"umd": "./umd/index.global.js",
|
|
19
19
|
"unpkg": "./umd/index.global.js",
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@qodalis/cli-core": "2.0.0-beta.
|
|
21
|
+
"@qodalis/cli-core": "2.0.0-beta.15"
|
|
22
22
|
},
|
|
23
23
|
"sideEffects": false,
|
|
24
24
|
"main": "./public-api.js",
|
package/public-api.d.mts
CHANGED
|
@@ -18,7 +18,7 @@ declare class CliScpCommandCommandProcessor implements ICliCommandProcessor {
|
|
|
18
18
|
private doUpload;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
declare const LIBRARY_VERSION = "2.0.0-beta.
|
|
21
|
+
declare const LIBRARY_VERSION = "2.0.0-beta.15";
|
|
22
22
|
declare const API_VERSION = 2;
|
|
23
23
|
|
|
24
24
|
declare const scpModule: ICliModule;
|
package/public-api.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ declare class CliScpCommandCommandProcessor implements ICliCommandProcessor {
|
|
|
18
18
|
private doUpload;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
declare const LIBRARY_VERSION = "2.0.0-beta.
|
|
21
|
+
declare const LIBRARY_VERSION = "2.0.0-beta.15";
|
|
22
22
|
declare const API_VERSION = 2;
|
|
23
23
|
|
|
24
24
|
declare const scpModule: ICliModule;
|
package/public-api.js
CHANGED
|
@@ -5,7 +5,7 @@ var cliCore = require('@qodalis/cli-core');
|
|
|
5
5
|
// src/lib/processors/cli-scp-command-processor.ts
|
|
6
6
|
|
|
7
7
|
// src/lib/version.ts
|
|
8
|
-
var LIBRARY_VERSION = "2.0.0-beta.
|
|
8
|
+
var LIBRARY_VERSION = "2.0.0-beta.15";
|
|
9
9
|
var API_VERSION = 2;
|
|
10
10
|
|
|
11
11
|
// src/lib/interfaces/index.ts
|
|
@@ -64,8 +64,6 @@ function parseServerAndPath(value, context, args) {
|
|
|
64
64
|
}
|
|
65
65
|
return [parts[0], parts.slice(1).join(" ")];
|
|
66
66
|
}
|
|
67
|
-
|
|
68
|
-
// src/lib/processors/cli-scp-ls-processor.ts
|
|
69
67
|
var CliScpLsProcessor = class {
|
|
70
68
|
constructor() {
|
|
71
69
|
this.command = "ls";
|
|
@@ -108,7 +106,7 @@ var CliScpLsProcessor = class {
|
|
|
108
106
|
const entries = await transferService.ls(
|
|
109
107
|
serverUrl(server),
|
|
110
108
|
path,
|
|
111
|
-
server.headers
|
|
109
|
+
cliCore.resolveServerHeaders(context.services, server.name, server.headers)
|
|
112
110
|
);
|
|
113
111
|
context.spinner?.hide();
|
|
114
112
|
if (entries.length === 0) {
|
|
@@ -133,8 +131,6 @@ var CliScpLsProcessor = class {
|
|
|
133
131
|
context.writer.writeln("List files and directories on a remote server.");
|
|
134
132
|
}
|
|
135
133
|
};
|
|
136
|
-
|
|
137
|
-
// src/lib/processors/cli-scp-cat-processor.ts
|
|
138
134
|
var CliScpCatProcessor = class {
|
|
139
135
|
constructor() {
|
|
140
136
|
this.command = "cat";
|
|
@@ -177,7 +173,7 @@ var CliScpCatProcessor = class {
|
|
|
177
173
|
const content = await transferService.cat(
|
|
178
174
|
serverUrl(server),
|
|
179
175
|
path,
|
|
180
|
-
server.headers
|
|
176
|
+
cliCore.resolveServerHeaders(context.services, server.name, server.headers)
|
|
181
177
|
);
|
|
182
178
|
context.spinner?.hide();
|
|
183
179
|
context.writer.writeln(content);
|
|
@@ -273,7 +269,7 @@ var CliScpDownloadProcessor = class {
|
|
|
273
269
|
const { content, size } = await transferService.download(
|
|
274
270
|
serverUrl(server),
|
|
275
271
|
remotePath,
|
|
276
|
-
server.headers,
|
|
272
|
+
cliCore.resolveServerHeaders(context.services, server.name, server.headers),
|
|
277
273
|
(received, total) => {
|
|
278
274
|
const now = Date.now();
|
|
279
275
|
if (now - lastProgressUpdate < 200) return;
|
|
@@ -454,7 +450,7 @@ var CliScpUploadProcessor = class {
|
|
|
454
450
|
remotePath,
|
|
455
451
|
content,
|
|
456
452
|
filename,
|
|
457
|
-
server.headers
|
|
453
|
+
cliCore.resolveServerHeaders(context.services, server.name, server.headers)
|
|
458
454
|
);
|
|
459
455
|
context.spinner?.hide();
|
|
460
456
|
context.writer.writeSuccess(
|
|
@@ -473,8 +469,6 @@ var CliScpUploadProcessor = class {
|
|
|
473
469
|
context.writer.writeln(" scp upload --local <server> <remote-path> Pick from your machine via browser");
|
|
474
470
|
}
|
|
475
471
|
};
|
|
476
|
-
|
|
477
|
-
// src/lib/processors/cli-scp-rm-processor.ts
|
|
478
472
|
var CliScpRmProcessor = class {
|
|
479
473
|
constructor() {
|
|
480
474
|
this.command = "rm";
|
|
@@ -517,7 +511,7 @@ var CliScpRmProcessor = class {
|
|
|
517
511
|
await transferService.rm(
|
|
518
512
|
serverUrl(server),
|
|
519
513
|
path,
|
|
520
|
-
server.headers
|
|
514
|
+
cliCore.resolveServerHeaders(context.services, server.name, server.headers)
|
|
521
515
|
);
|
|
522
516
|
context.spinner?.hide();
|
|
523
517
|
context.writer.writeSuccess(`Deleted: ${server.name}:${path}`);
|
|
@@ -530,8 +524,6 @@ var CliScpRmProcessor = class {
|
|
|
530
524
|
context.writer.writeln("Delete a file on a remote server.");
|
|
531
525
|
}
|
|
532
526
|
};
|
|
533
|
-
|
|
534
|
-
// src/lib/processors/cli-scp-mkdir-processor.ts
|
|
535
527
|
var CliScpMkdirProcessor = class {
|
|
536
528
|
constructor() {
|
|
537
529
|
this.command = "mkdir";
|
|
@@ -574,7 +566,7 @@ var CliScpMkdirProcessor = class {
|
|
|
574
566
|
await transferService.mkdir(
|
|
575
567
|
serverUrl(server),
|
|
576
568
|
path,
|
|
577
|
-
server.headers
|
|
569
|
+
cliCore.resolveServerHeaders(context.services, server.name, server.headers)
|
|
578
570
|
);
|
|
579
571
|
context.spinner?.hide();
|
|
580
572
|
context.writer.writeSuccess(`Created directory: ${server.name}:${path}`);
|
|
@@ -587,8 +579,6 @@ var CliScpMkdirProcessor = class {
|
|
|
587
579
|
context.writer.writeln("Create a directory on a remote server.");
|
|
588
580
|
}
|
|
589
581
|
};
|
|
590
|
-
|
|
591
|
-
// src/lib/processors/cli-scp-stat-processor.ts
|
|
592
582
|
var CliScpStatProcessor = class {
|
|
593
583
|
constructor() {
|
|
594
584
|
this.command = "stat";
|
|
@@ -631,7 +621,7 @@ var CliScpStatProcessor = class {
|
|
|
631
621
|
const stat = await transferService.stat(
|
|
632
622
|
serverUrl(server),
|
|
633
623
|
path,
|
|
634
|
-
server.headers
|
|
624
|
+
cliCore.resolveServerHeaders(context.services, server.name, server.headers)
|
|
635
625
|
);
|
|
636
626
|
context.spinner?.hide();
|
|
637
627
|
const entries = {
|
|
@@ -728,7 +718,7 @@ var CliScpCommandCommandProcessor = class {
|
|
|
728
718
|
const { content, size } = await transferService.download(
|
|
729
719
|
serverUrl(server),
|
|
730
720
|
remotePath,
|
|
731
|
-
server.headers,
|
|
721
|
+
cliCore.resolveServerHeaders(context.services, server.name, server.headers),
|
|
732
722
|
(received, total) => {
|
|
733
723
|
const now = Date.now();
|
|
734
724
|
if (now - lastProgressUpdate < 200) return;
|
|
@@ -807,7 +797,7 @@ var CliScpCommandCommandProcessor = class {
|
|
|
807
797
|
remotePath,
|
|
808
798
|
content,
|
|
809
799
|
filename,
|
|
810
|
-
server.headers
|
|
800
|
+
cliCore.resolveServerHeaders(context.services, server.name, server.headers)
|
|
811
801
|
);
|
|
812
802
|
context.spinner?.hide();
|
|
813
803
|
context.writer.writeSuccess(
|
package/public-api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../packages/plugins/scp/src/lib/version.ts","../../packages/plugins/scp/src/lib/interfaces/index.ts","../../packages/plugins/scp/src/lib/processors/scp-utils.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-ls-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-cat-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-download-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-upload-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-rm-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-mkdir-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-stat-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-command-processor.ts","../../packages/plugins/scp/src/lib/services/scp-transfer.service.ts","../../packages/plugins/scp/src/public-api.ts"],"names":["ICliFileTransferService_TOKEN","DefaultLibraryAuthor","parts","serverUrl","resolveHeaders"],"mappings":";;;;;;;AAEO,IAAM,eAAA,GAAkB;AACxB,IAAM,WAAA,GAAc;;;ACDpB,IAAM,yBAAA,GAA4B,sBAAA;;;ACAlC,SAAS,aAAA,CACZ,YACA,OAAA,EACsB;AACtB,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,EAAS,OAAA;AACjC,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAClC,IAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,oDAAoD,CAAA;AAC9E,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACb,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,QAAQ,CAAC,CAAA;AAAA,IACpB;AACA,IAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,mDAAmD,CAAA;AAC7E,IAAA,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,aAAA,GAAgB,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAC5E,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,WAAA,EAAY,KAAM,UAAA,CAAW,WAAA,EAAa,CAAA;AAClF,EAAA,IAAI,CAAC,MAAA,EAAQ;AACT,IAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,gBAAA,EAAmB,UAAU,CAAA,CAAE,CAAA;AACzD,IAAA,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,aAAA,GAAgB,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAC5E,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,OAAO,MAAA;AACX;AAEO,SAAS,UAAU,MAAA,EAAiC;AACvD,EAAA,OAAO,MAAA,CAAO,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACxC;AAEO,SAAS,YAAY,KAAA,EAAuB;AAC/C,EAAA,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA;AACjC,EAAA,IAAI,KAAA,GAAQ,OAAO,IAAA,EAAM,OAAO,IAAI,KAAA,GAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC5D,EAAA,IAAI,KAAA,GAAQ,IAAA,GAAO,IAAA,GAAO,IAAA,EAAM,OAAO,CAAA,EAAA,CAAI,KAAA,IAAS,IAAA,GAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC5E,EAAA,OAAO,IAAI,KAAA,IAAS,IAAA,GAAO,OAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AACvD;AAWO,SAAS,kBAAA,CACZ,KAAA,EACA,OAAA,EACA,IAAA,EACuB;AAEvB,EAAA,MAAM,SAAA,GAAY,OAAO,QAAQ,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,OAAO,MAAM,CAAA;AAC7B,EAAA,IAAI,aAAa,OAAA,EAAS;AACtB,IAAA,OAAO,CAAC,MAAA,CAAO,SAAS,CAAA,EAAG,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EAC9C;AAGA,EAAA,IAAI,CAAC,KAAA,EAAO,IAAA,EAAK,EAAG;AAChB,IAAA,OAAO,IAAA;AAAA,EACX;AACA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AACtC,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AAElB,IAAA,IAAI,SAAA,IAAa,KAAA,CAAM,MAAA,IAAU,CAAA,EAAG;AAChC,MAAA,OAAO,CAAC,MAAA,CAAO,SAAS,GAAG,KAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,IAC9C;AACA,IAAA,IAAI,OAAA,IAAW,KAAA,CAAM,MAAA,IAAU,CAAA,EAAG;AAC9B,MAAA,OAAO,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,IAAA;AAAA,EACX;AACA,EAAA,OAAO,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,MAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAC9C;;;ACtEO,IAAM,oBAAN,MAA6D;AAAA,EAA7D,WAAA,GAAA;AACH,IAAA,IAAA,CAAA,OAAA,GAAU,IAAA;AACV,IAAA,IAAA,CAAA,WAAA,GAAc,+CAAA;AACd,IAAA,IAAA,CAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,IAAA,CAAA,aAAA,GAAgB,IAAA;AAGhB,IAAA,IAAA,CAAA,UAAA,GAAa;AAAA,MACT;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,aAAA;AAAA,QACb,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACV;AAAA,MACA;AAAA,QACI,IAAA,EAAM,MAAA;AAAA,QACN,WAAA,EAAa,uBAAA;AAAA,QACb,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM;AAAA;AACV,KACJ;AAAA,EAAA;AAAA,EAEA,MAAM,cAAA,CACF,OAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,SAAS,kBAAA,CAAmB,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAI,CAAA;AACtE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACT,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,+BAA+B,CAAA;AACzD,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,CAAC,UAAA,EAAY,IAAI,CAAA,GAAI,MAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,UAAA,EAAY,OAAO,CAAA;AAChD,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,eAAA,GAAkB,QAAQ,QAAA,CAAS,WAAA;AAAA,MACrC;AAAA,KACJ;AAEA,IAAA,IAAI,CAAC,eAAA,EAAiB;AAClB,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,qCAAqC,CAAA;AAC/D,MAAA;AAAA,IACJ;AAEA,IAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,CAAA,QAAA,EAAW,IAAI,CAAA,IAAA,EAAO,MAAA,CAAO,IAAI,CAAA,GAAA,CAAK,CAAA;AAE5D,IAAA,IAAI;AACA,MAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,EAAA;AAAA,QAClC,UAAU,MAAM,CAAA;AAAA,QAChB,IAAA;AAAA,QACA,MAAA,CAAO;AAAA,OACX;AACA,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AAEtB,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtB,QAAA,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AACtD,QAAA;AAAA,MACJ;AAEA,MAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAQ,MAAA,EAAQ,QAAQ,UAAU,CAAA;AACnD,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,KAAS;AAAA,QAC9B,KAAA,CAAM,IAAA;AAAA,QACN,KAAA,CAAM,IAAA;AAAA,QACN,MAAM,IAAA,KAAS,MAAA,GAAS,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA,GAAI,GAAA;AAAA,QAClD,MAAM,QAAA,IAAY;AAAA,OACrB,CAAA;AAED,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,OAAA,EAAS,IAAI,CAAA;AACvC,MAAA,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,QAAA,CAAU,CAAA;AAAA,IACxD,SAAS,GAAA,EAAU;AACf,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AACtB,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAA,IAAW,0BAA0B,CAAA;AAAA,IACvE;AAAA,EACJ;AAAA,EAEA,iBAAiB,OAAA,EAAqC;AAClD,IAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,gDAAgD,CAAA;AAAA,EAC3E;AACJ,CAAA;;;AC/EO,IAAM,qBAAN,MAA8D;AAAA,EAA9D,WAAA,GAAA;AACH,IAAA,IAAA,CAAA,OAAA,GAAU,KAAA;AACV,IAAA,IAAA,CAAA,WAAA,GAAc,mCAAA;AACd,IAAA,IAAA,CAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,IAAA,CAAA,aAAA,GAAgB,IAAA;AAGhB,IAAA,IAAA,CAAA,UAAA,GAAa;AAAA,MACT;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,aAAA;AAAA,QACb,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACV;AAAA,MACA;AAAA,QACI,IAAA,EAAM,MAAA;AAAA,QACN,WAAA,EAAa,kBAAA;AAAA,QACb,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM;AAAA;AACV,KACJ;AAAA,EAAA;AAAA,EAEA,MAAM,cAAA,CACF,OAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,SAAS,kBAAA,CAAmB,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAI,CAAA;AACtE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACT,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,gCAAgC,CAAA;AAC1D,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,CAAC,UAAA,EAAY,IAAI,CAAA,GAAI,MAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,UAAA,EAAY,OAAO,CAAA;AAChD,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,eAAA,GAAkB,QAAQ,QAAA,CAAS,WAAA;AAAA,MACrC;AAAA,KACJ;AAEA,IAAA,IAAI,CAAC,eAAA,EAAiB;AAClB,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,qCAAqC,CAAA;AAC/D,MAAA;AAAA,IACJ;AAEA,IAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,CAAA,QAAA,EAAW,IAAI,CAAA,IAAA,EAAO,MAAA,CAAO,IAAI,CAAA,GAAA,CAAK,CAAA;AAE5D,IAAA,IAAI;AACA,MAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,GAAA;AAAA,QAClC,UAAU,MAAM,CAAA;AAAA,QAChB,IAAA;AAAA,QACA,MAAA,CAAO;AAAA,OACX;AACA,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AAEtB,MAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,OAAO,CAAA;AAAA,IAClC,SAAS,GAAA,EAAU;AACf,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AACtB,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAA,IAAW,qBAAqB,CAAA;AAAA,IAClE;AAAA,EACJ;AAAA,EAEA,iBAAiB,OAAA,EAAqC;AAClD,IAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,wCAAwC,CAAA;AAAA,EACnE;AACJ,CAAA;AC9DO,IAAM,0BAAN,MAAmE;AAAA,EAAnE,WAAA,GAAA;AACH,IAAA,IAAA,CAAA,OAAA,GAAU,UAAA;AACV,IAAA,IAAA,CAAA,OAAA,GAAU,CAAC,KAAK,CAAA;AAChB,IAAA,IAAA,CAAA,WAAA,GAAc,sCAAA;AACd,IAAA,IAAA,CAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,IAAA,CAAA,aAAA,GAAgB,IAAA;AAGhB,IAAA,IAAA,CAAA,UAAA,GAA+C;AAAA,MAC3C;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,aAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACV;AAAA,MACA;AAAA,QACI,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,EAAS,CAAC,MAAM,CAAA;AAAA,QAChB,WAAA,EAAa,kBAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACV;AAAA,MACA;AAAA,QACI,IAAA,EAAM,YAAA;AAAA,QACN,WAAA,EAAa,wBAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACV;AAAA,MACA;AAAA,QACI,IAAA,EAAM,MAAA;AAAA,QACN,WAAA,EAAa,kEAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,IAAA,EAAM;AAAA;AACV,KACJ;AAAA,EAAA;AAAA,EAEA,MAAM,cAAA,CACF,OAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQ,EAAC;AAC9B,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,SAAA;AAGJ,IAAA,IAAI,IAAA,CAAK,QAAQ,CAAA,KAAM,IAAA,CAAK,aAAa,CAAA,IAAK,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI;AACzD,MAAA,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC,CAAA;AAClC,MAAA,UAAA,GAAa,OAAO,IAAA,CAAK,aAAa,CAAA,IAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AACvD,MAAA,SAAA,GAAY,KAAK,YAAY,CAAA,GAAI,OAAO,IAAA,CAAK,YAAY,CAAC,CAAA,GAAI,MAAA;AAAA,IAClE,CAAA,MAAO;AAEH,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAK;AAClC,MAAA,IAAI,CAAC,KAAA,EAAO;AACR,QAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,yDAAyD,CAAA;AACnF,QAAA;AAAA,MACJ;AACA,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAC/B,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AAClB,QAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,yDAAyD,CAAA;AACnF,QAAA;AAAA,MACJ;AACA,MAAA,UAAA,GAAa,MAAM,CAAC,CAAA;AACpB,MAAA,UAAA,GAAa,MAAM,CAAC,CAAA;AACpB,MAAA,SAAA,GAAY,MAAM,CAAC,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,UAAA,EAAY;AAC5B,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,yDAAyD,CAAA;AACnF,MAAA;AAAA,IACJ;AAEA,IAAA,SAAA,GAAY,aAAa,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,UAAA;AAExD,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,UAAA,EAAY,OAAO,CAAA;AAChD,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,eAAA,GAAkB,QAAQ,QAAA,CAAS,WAAA;AAAA,MACrC;AAAA,KACJ;AAEA,IAAA,IAAI,CAAC,eAAA,EAAiB;AAClB,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,qCAAqC,CAAA;AAC/D,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,IAAA,GAAO,MAAM,CAAA,KAAM,IAAA;AAEtD,IAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,CAAA,YAAA,EAAe,UAAU,CAAA,MAAA,EAAS,MAAA,CAAO,IAAI,CAAA,GAAA,CAAK,CAAA;AACxE,IAAA,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAA,sBAAA,EAAyB,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAE5D,IAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAC5C,IAAA,MAAM,WAAW,OAAA,CAAQ,OAAA,CAAQ,UAAU,MAAM,eAAA,CAAgB,OAAO,CAAA;AAExE,IAAA,IAAI;AACA,MAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,MAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,MAAM,eAAA,CAAgB,QAAA;AAAA,QAC5C,UAAU,MAAM,CAAA;AAAA,QAChB,UAAA;AAAA,QACA,MAAA,CAAO,OAAA;AAAA,QACP,CAAC,UAAU,KAAA,KAAU;AACjB,UAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,UAAA,IAAI,GAAA,GAAM,qBAAqB,GAAA,EAAK;AACpC,UAAA,kBAAA,GAAqB,GAAA;AAErB,UAAA,IAAI,QAAQ,CAAA,EAAG;AACX,YAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAO,QAAA,GAAW,QAAS,GAAG,CAAA;AAC/C,YAAA,OAAA,CAAQ,OAAA,EAAS,IAAA;AAAA,cACb,CAAA,YAAA,EAAe,UAAU,CAAA,IAAA,EAAO,GAAG,CAAA,GAAA,EAAM,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,KAAK,CAAC,CAAA,CAAA;AAAA,aACxF;AACA,YAAA,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,UACjD,CAAA,MAAO;AACH,YAAA,OAAA,CAAQ,OAAA,EAAS,IAAA;AAAA,cACb,CAAA,YAAA,EAAe,UAAU,CAAA,IAAA,EAAO,WAAA,CAAY,QAAQ,CAAC,CAAA;AAAA,aACzD;AACA,YAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,CAAA,cAAA,EAAiB,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,UAClE;AAAA,QACJ,CAAA;AAAA,QACA,eAAA,CAAgB;AAAA,OACpB;AACA,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AAEtB,MAAA,IAAI,kBAAA,EAAoB;AACpB,QAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,CAAS,WAAA;AAAA,UACjCA;AAAA,SACJ;AACA,QAAA,IAAI,WAAA,EAAa;AACb,UAAA,WAAA,CAAY,iBAAA,CAAkB,WAAW,OAAO,CAAA;AAChD,UAAA,OAAA,CAAQ,MAAA,CAAO,YAAA;AAAA,YACX,CAAA,WAAA,EAAc,WAAA,CAAY,IAAI,CAAC,6BAA6B,SAAS,CAAA,CAAA;AAAA,WACzE;AAAA,QACJ,CAAA,MAAO;AACH,UAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,2DAA2D,CAAA;AAAA,QACzF;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,CAAS,WAAA;AAAA,UACjCA;AAAA,SACJ;AACA,QAAA,IAAI,WAAA,EAAa;AACb,UAAA,MAAM,WAAA,CAAY,SAAA,CAAU,SAAA,EAAW,OAAO,CAAA;AAC9C,UAAA,OAAA,CAAQ,MAAA,CAAO,YAAA;AAAA,YACX,CAAA,WAAA,EAAc,WAAA,CAAY,IAAI,CAAC,QAAQ,SAAS,CAAA,CAAA;AAAA,WACpD;AAAA,QACJ,CAAA,MAAO;AACH,UAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,sCAAsC,CAAA;AAAA,QACpE;AAAA,MACJ;AAAA,IACJ,SAAS,GAAA,EAAU;AACf,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AACtB,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAA,IAAW,iBAAiB,CAAA;AAAA,IAC9D,CAAA,SAAE;AACE,MAAA,QAAA,CAAS,WAAA,EAAY;AAAA,IACzB;AAAA,EACJ;AAAA,EAEA,iBAAiB,OAAA,EAAqC;AAClD,IAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,uCAAuC,CAAA;AAC9D,IAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,yDAAyD,CAAA;AAChF,IAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,8CAA8C,CAAA;AAAA,EACzE;AACJ,CAAA;ACjKO,IAAM,wBAAN,MAAiE;AAAA,EAAjE,WAAA,GAAA;AACH,IAAA,IAAA,CAAA,OAAA,GAAU,QAAA;AACV,IAAA,IAAA,CAAA,OAAA,GAAU,CAAC,KAAK,CAAA;AAChB,IAAA,IAAA,CAAA,WAAA,GAAc,0EAAA;AACd,IAAA,IAAA,CAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,IAAA,CAAA,aAAA,GAAgB,IAAA;AAGhB,IAAA,IAAA,CAAA,UAAA,GAAa;AAAA,MACT;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,aAAA;AAAA,QACb,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACV;AAAA,MACA;AAAA,QACI,IAAA,EAAM,YAAA;AAAA,QACN,WAAA,EAAa,2CAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACV;AAAA,MACA;AAAA,QACI,IAAA,EAAM,aAAA;AAAA,QACN,WAAA,EAAa,yBAAA;AAAA,QACb,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACV;AAAA,MACA;AAAA,QACI,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,6DAAA;AAAA,QACb,QAAA,EAAU,KAAA;AAAA,QACV,IAAA,EAAM;AAAA;AACV,KACJ;AAAA,EAAA;AAAA,EAEA,MAAM,cAAA,CACF,OAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQ,EAAC;AAC9B,IAAA,MAAM,cAAA,GAAiB,CAAC,CAAC,IAAA,CAAK,OAAO,CAAA;AACrC,IAAA,IAAI,UAAA;AACJ,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,UAAA;AAGJ,IAAA,IAAI,IAAA,CAAK,QAAQ,CAAA,IAAK,IAAA,CAAK,aAAa,CAAA,EAAG;AACvC,MAAA,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAC,CAAA;AAClC,MAAA,SAAA,GAAY,KAAK,YAAY,CAAA,GAAI,OAAO,IAAA,CAAK,YAAY,CAAC,CAAA,GAAI,MAAA;AAC9D,MAAA,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,aAAa,CAAC,CAAA;AAAA,IAC3C,CAAA,MAAO;AAEH,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAK;AAClC,MAAA,IAAI,CAAC,KAAA,EAAO;AACR,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAA;AAAA,UACX,iBACM,kDAAA,GACA;AAAA,SACV;AACA,QAAA;AAAA,MACJ;AACA,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAC/B,MAAA,IAAI,cAAA,EAAgB;AAChB,QAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AAClB,UAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,kDAAkD,CAAA;AAC5E,UAAA;AAAA,QACJ;AACA,QAAA,UAAA,GAAa,MAAM,CAAC,CAAA;AACpB,QAAA,UAAA,GAAa,MAAM,CAAC,CAAA;AAAA,MACxB,CAAA,MAAO;AACH,QAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AAClB,UAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,uDAAuD,CAAA;AACjF,UAAA;AAAA,QACJ;AACA,QAAA,UAAA,GAAa,MAAM,CAAC,CAAA;AACpB,QAAA,SAAA,GAAY,MAAM,CAAC,CAAA;AACnB,QAAA,UAAA,GAAa,MAAM,CAAC,CAAA;AAAA,MACxB;AAAA,IACJ;AAEA,IAAA,IAAI,CAAC,UAAA,IAAe,CAAC,kBAAkB,CAAC,SAAA,IAAc,CAAC,UAAA,EAAY;AAC/D,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA;AAAA,QACX,iBACM,kDAAA,GACA;AAAA,OACV;AACA,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,UAAA,EAAY,OAAO,CAAA;AAChD,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,CAAS,WAAA;AAAA,MACjCA;AAAA,KACJ;AAEA,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,sCAAsC,CAAA;AAChE,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,eAAA,GAAkB,QAAQ,QAAA,CAAS,WAAA;AAAA,MACrC;AAAA,KACJ;AAEA,IAAA,IAAI,CAAC,eAAA,EAAiB;AAClB,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,qCAAqC,CAAA;AAC/D,MAAA;AAAA,IACJ;AAEA,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI,cAAA,EAAgB;AAChB,MAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,iBAAA,EAAkB;AACnD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACT,QAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,mBAAmB,CAAA;AAC1C,QAAA;AAAA,MACJ;AACA,MAAA,OAAA,GAAU,MAAA,CAAO,OAAA;AACjB,MAAA,QAAA,GAAW,MAAA,CAAO,IAAA;AAAA,IACtB,CAAA,MAAO;AACH,MAAA,OAAA,CAAQ,OAAA,EAAS,IAAA,CAAK,CAAA,oBAAA,EAAuB,SAAS,CAAA,IAAA,CAAM,CAAA;AAC5D,MAAA,OAAA,GAAU,MAAM,WAAA,CAAY,QAAA,CAAS,SAAU,CAAA;AAC/C,MAAA,IAAI,YAAY,IAAA,EAAM;AAClB,QAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AACtB,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,sBAAA,EAAyB,SAAS,CAAA,CAAE,CAAA;AAC9D,QAAA;AAAA,MACJ;AACA,MAAA,QAAA,GAAW,SAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,MAAA;AAAA,IAC9C;AAEA,IAAA,OAAA,CAAQ,OAAA,EAAS,IAAA;AAAA,MACb,CAAA,WAAA,EAAc,QAAQ,CAAA,GAAA,EAAM,WAAA,CAAY,OAAA,CAAQ,MAAM,CAAC,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,UAAU,CAAA,GAAA;AAAA,KAC5F;AACA,IAAA,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAA,kBAAA,EAAqB,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAExD,IAAA,IAAI;AACA,MAAA,MAAM,eAAA,CAAgB,MAAA;AAAA,QAClB,UAAU,MAAM,CAAA;AAAA,QAChB,UAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,MAAA,CAAO;AAAA,OACX;AACA,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AAEtB,MAAA,OAAA,CAAQ,MAAA,CAAO,YAAA;AAAA,QACX,CAAA,UAAA,EAAa,QAAQ,CAAA,GAAA,EAAM,WAAA,CAAY,OAAA,CAAQ,MAAM,CAAC,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,UAAU,CAAA;AAAA,OAC3F;AAAA,IACJ,SAAS,GAAA,EAAU;AACf,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AACtB,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAA,IAAW,eAAe,CAAA;AAAA,IAC5D;AAAA,EACJ;AAAA,EAEA,iBAAiB,OAAA,EAAqC;AAClD,IAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,mCAAmC,CAAA;AAC1D,IAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,EAAE,CAAA;AACzB,IAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,QAAQ,CAAA;AAC/B,IAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,oFAAoF,CAAA;AAC3G,IAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,wFAAwF,CAAA;AAAA,EACnH;AACJ,CAAA;;;ACrKO,IAAM,oBAAN,MAA6D;AAAA,EAA7D,WAAA,GAAA;AACH,IAAA,IAAA,CAAA,OAAA,GAAU,IAAA;AACV,IAAA,IAAA,CAAA,WAAA,GAAc,kCAAA;AACd,IAAA,IAAA,CAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,IAAA,CAAA,aAAA,GAAgB,IAAA;AAGhB,IAAA,IAAA,CAAA,UAAA,GAAa;AAAA,MACT;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,aAAA;AAAA,QACb,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACV;AAAA,MACA;AAAA,QACI,IAAA,EAAM,MAAA;AAAA,QACN,WAAA,EAAa,4BAAA;AAAA,QACb,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM;AAAA;AACV,KACJ;AAAA,EAAA;AAAA,EAEA,MAAM,cAAA,CACF,OAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,SAAS,kBAAA,CAAmB,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAI,CAAA;AACtE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACT,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,+BAA+B,CAAA;AACzD,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,CAAC,UAAA,EAAY,IAAI,CAAA,GAAI,MAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,UAAA,EAAY,OAAO,CAAA;AAChD,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,eAAA,GAAkB,QAAQ,QAAA,CAAS,WAAA;AAAA,MACrC;AAAA,KACJ;AAEA,IAAA,IAAI,CAAC,eAAA,EAAiB;AAClB,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,qCAAqC,CAAA;AAC/D,MAAA;AAAA,IACJ;AAEA,IAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,CAAA,SAAA,EAAY,IAAI,CAAA,IAAA,EAAO,MAAA,CAAO,IAAI,CAAA,GAAA,CAAK,CAAA;AAE7D,IAAA,IAAI;AACA,MAAA,MAAM,eAAA,CAAgB,EAAA;AAAA,QAClB,UAAU,MAAM,CAAA;AAAA,QAChB,IAAA;AAAA,QACA,MAAA,CAAO;AAAA,OACX;AACA,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AAEtB,MAAA,OAAA,CAAQ,OAAO,YAAA,CAAa,CAAA,SAAA,EAAY,OAAO,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,IACjE,SAAS,GAAA,EAAU;AACf,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AACtB,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAA,IAAW,uBAAuB,CAAA;AAAA,IACpE;AAAA,EACJ;AAAA,EAEA,iBAAiB,OAAA,EAAqC;AAClD,IAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,mCAAmC,CAAA;AAAA,EAC9D;AACJ,CAAA;;;ACjEO,IAAM,uBAAN,MAAgE;AAAA,EAAhE,WAAA,GAAA;AACH,IAAA,IAAA,CAAA,OAAA,GAAU,OAAA;AACV,IAAA,IAAA,CAAA,WAAA,GAAc,uCAAA;AACd,IAAA,IAAA,CAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,IAAA,CAAA,aAAA,GAAgB,IAAA;AAGhB,IAAA,IAAA,CAAA,UAAA,GAAa;AAAA,MACT;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,aAAA;AAAA,QACb,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACV;AAAA,MACA;AAAA,QACI,IAAA,EAAM,MAAA;AAAA,QACN,WAAA,EAAa,iCAAA;AAAA,QACb,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM;AAAA;AACV,KACJ;AAAA,EAAA;AAAA,EAEA,MAAM,cAAA,CACF,OAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,SAAS,kBAAA,CAAmB,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAI,CAAA;AACtE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACT,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,kCAAkC,CAAA;AAC5D,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,CAAC,UAAA,EAAY,IAAI,CAAA,GAAI,MAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,UAAA,EAAY,OAAO,CAAA;AAChD,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,eAAA,GAAkB,QAAQ,QAAA,CAAS,WAAA;AAAA,MACrC;AAAA,KACJ;AAEA,IAAA,IAAI,CAAC,eAAA,EAAiB;AAClB,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,qCAAqC,CAAA;AAC/D,MAAA;AAAA,IACJ;AAEA,IAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,CAAA,mBAAA,EAAsB,IAAI,CAAA,IAAA,EAAO,MAAA,CAAO,IAAI,CAAA,GAAA,CAAK,CAAA;AAEvE,IAAA,IAAI;AACA,MAAA,MAAM,eAAA,CAAgB,KAAA;AAAA,QAClB,UAAU,MAAM,CAAA;AAAA,QAChB,IAAA;AAAA,QACA,MAAA,CAAO;AAAA,OACX;AACA,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AAEtB,MAAA,OAAA,CAAQ,OAAO,YAAA,CAAa,CAAA,mBAAA,EAAsB,OAAO,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,IAC3E,SAAS,GAAA,EAAU;AACf,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AACtB,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAA,IAAW,4BAA4B,CAAA;AAAA,IACzE;AAAA,EACJ;AAAA,EAEA,iBAAiB,OAAA,EAAqC;AAClD,IAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,wCAAwC,CAAA;AAAA,EACnE;AACJ,CAAA;;;ACjEO,IAAM,sBAAN,MAA+D;AAAA,EAA/D,WAAA,GAAA;AACH,IAAA,IAAA,CAAA,OAAA,GAAU,MAAA;AACV,IAAA,IAAA,CAAA,WAAA,GAAc,uDAAA;AACd,IAAA,IAAA,CAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,IAAA,CAAA,aAAA,GAAgB,IAAA;AAGhB,IAAA,IAAA,CAAA,UAAA,GAAa;AAAA,MACT;AAAA,QACI,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,aAAA;AAAA,QACb,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM;AAAA,OACV;AAAA,MACA;AAAA,QACI,IAAA,EAAM,MAAA;AAAA,QACN,WAAA,EAAa,+BAAA;AAAA,QACb,QAAA,EAAU,IAAA;AAAA,QACV,IAAA,EAAM;AAAA;AACV,KACJ;AAAA,EAAA;AAAA,EAEA,MAAM,cAAA,CACF,OAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,SAAS,kBAAA,CAAmB,OAAA,CAAQ,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAI,CAAA;AACtE,IAAA,IAAI,CAAC,MAAA,EAAQ;AACT,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,iCAAiC,CAAA;AAC3D,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,CAAC,UAAA,EAAY,IAAI,CAAA,GAAI,MAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,UAAA,EAAY,OAAO,CAAA;AAChD,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,eAAA,GAAkB,QAAQ,QAAA,CAAS,WAAA;AAAA,MACrC;AAAA,KACJ;AAEA,IAAA,IAAI,CAAC,eAAA,EAAiB;AAClB,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,qCAAqC,CAAA;AAC/D,MAAA;AAAA,IACJ;AAEA,IAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,CAAA,iBAAA,EAAoB,IAAI,CAAA,IAAA,EAAO,MAAA,CAAO,IAAI,CAAA,GAAA,CAAK,CAAA;AAErE,IAAA,IAAI;AACA,MAAA,MAAM,IAAA,GAAO,MAAM,eAAA,CAAgB,IAAA;AAAA,QAC/B,UAAU,MAAM,CAAA;AAAA,QAChB,IAAA;AAAA,QACA,MAAA,CAAO;AAAA,OACX;AACA,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AAEtB,MAAA,MAAM,OAAA,GAAkC;AAAA,QACpC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AAAA,QAC3B,QAAA,EAAU,KAAK,QAAA,IAAY,GAAA;AAAA,QAC3B,OAAA,EAAS,KAAK,OAAA,IAAW;AAAA,OAC7B;AAEA,MAAA,IAAI,KAAK,WAAA,EAAa;AAClB,QAAA,OAAA,CAAQ,aAAa,IAAI,IAAA,CAAK,WAAA;AAAA,MAClC;AAEA,MAAA,OAAA,CAAQ,MAAA,CAAO,cAAc,OAAO,CAAA;AAAA,IACxC,SAAS,GAAA,EAAU;AACf,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AACtB,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAA,IAAW,yBAAyB,CAAA;AAAA,IACtE;AAAA,EACJ;AAAA,EAEA,iBAAiB,OAAA,EAAqC;AAClD,IAAA,OAAA,CAAQ,MAAA,CAAO,QAAQ,wDAAwD,CAAA;AAAA,EACnF;AACJ,CAAA;;;AClEO,IAAM,gCAAN,MAAoE;AAAA,EAApE,WAAA,GAAA;AACH,IAAA,IAAA,CAAA,OAAA,GAAU,KAAA;AAEV,IAAA,IAAA,CAAA,WAAA,GAAc,2DAAA;AAEd,IAAA,IAAA,CAAA,MAAA,GAASC,4BAAA;AAET,IAAA,IAAA,CAAA,OAAA,GAAU,eAAA;AAEV,IAAA,IAAA,CAAA,QAAA,GAAW,EAAE,IAAA,EAAM,WAAA,EAAM,MAAA,EAAQ,iBAAA,EAAkB;AAEnD,IAAA,IAAA,CAAA,eAAA,GAAkB,IAAA;AAElB,IAAA,IAAA,CAAA,UAAA,GAA0C;AAAA,MACtC,IAAI,iBAAA,EAAkB;AAAA,MACtB,IAAI,kBAAA,EAAmB;AAAA,MACvB,IAAI,uBAAA,EAAwB;AAAA,MAC5B,IAAI,qBAAA,EAAsB;AAAA,MAC1B,IAAI,iBAAA,EAAkB;AAAA,MACtB,IAAI,oBAAA,EAAqB;AAAA,MACzB,IAAI,mBAAA;AAAoB,KAC5B;AAAA,EAAA;AAAA,EAEA,MAAM,cAAA,CACF,OAAA,EACA,OAAA,EACa;AACb,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAK;AAGlC,IAAA,IAAI,KAAA,IAAS,MAAM,QAAA,CAAS,GAAG,KAAK,CAAC,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACxD,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAClC,MAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,WAAA,CAAY,GAAA,EAAK,QAAQ,CAAA;AAGxD,MAAA,IAAI,qBAAqB,EAAA,EAAI;AACzB,QAAA,MAAM,UAAA,GAAa,KAAA,CAAM,SAAA,CAAU,CAAA,EAAG,QAAQ,CAAA;AAC9C,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,SAAA,CAAU,QAAA,GAAW,CAAC,CAAA;AACzC,QAAA,MAAMC,MAAAA,GAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA;AACrC,QAAA,MAAM,UAAA,GAAaA,OAAM,CAAC,CAAA;AAC1B,QAAA,MAAM,SAAA,GAAYA,OAAM,CAAC,CAAA,IAAK,WAAW,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,UAAA;AAE7D,QAAA,IAAI,UAAA,EAAY;AACZ,UAAA,MAAM,KAAK,UAAA,CAAW,UAAA,EAAY,UAAA,EAAY,SAAA,EAAW,SAAS,OAAO,CAAA;AACzE,UAAA;AAAA,QACJ;AAAA,MACJ;AAGA,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAC/B,MAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACnB,QAAA,MAAM,UAAA,GAAa,MAAM,CAAC,CAAA;AAC1B,QAAA,IAAI,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAC1B,UAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,UAAA,MAAM,WAAA,GAAc,UAAA,CAAW,OAAA,CAAQ,GAAG,CAAA;AAC1C,UAAA,MAAM,UAAA,GAAa,UAAA,CAAW,SAAA,CAAU,CAAA,EAAG,WAAW,CAAA;AACtD,UAAA,MAAM,UAAA,GAAa,UAAA,CAAW,SAAA,CAAU,WAAA,GAAc,CAAC,CAAA;AAEvD,UAAA,IAAI,UAAA,EAAY;AACZ,YAAA,MAAM,IAAA,CAAK,QAAA,CAAS,UAAA,EAAY,SAAA,EAAW,YAAY,OAAO,CAAA;AAC9D,YAAA;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAGA,IAAA,OAAA,CAAQ,QAAA,CAAS,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEA,iBAAiB,OAAA,EAAqC;AAClD,IAAA,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,WAAY,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAc,UAAA,CACV,UAAA,EACA,UAAA,EACA,SAAA,EACA,SACA,OAAA,EACa;AACb,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,UAAA,EAAY,OAAO,CAAA;AAChD,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,eAAA,GAAkB,QAAQ,QAAA,CAAS,WAAA;AAAA,MACrC;AAAA,KACJ;AAEA,IAAA,IAAI,CAAC,eAAA,EAAiB;AAClB,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,qCAAqC,CAAA;AAC/D,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,IAAA,GAAO,MAAM,CAAA,KAAM,IAAA;AAEtD,IAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,CAAA,YAAA,EAAe,UAAU,CAAA,MAAA,EAAS,MAAA,CAAO,IAAI,CAAA,GAAA,CAAK,CAAA;AACxE,IAAA,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAA,sBAAA,EAAyB,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAE5D,IAAA,IAAI;AACA,MAAA,IAAI,kBAAA,GAAqB,CAAA;AACzB,MAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,MAAM,eAAA,CAAgB,QAAA;AAAA,QAC5C,UAAU,MAAM,CAAA;AAAA,QAChB,UAAA;AAAA,QACA,MAAA,CAAO,OAAA;AAAA,QACP,CAAC,UAAU,KAAA,KAAU;AACjB,UAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,UAAA,IAAI,GAAA,GAAM,qBAAqB,GAAA,EAAK;AACpC,UAAA,kBAAA,GAAqB,GAAA;AAErB,UAAA,IAAI,QAAQ,CAAA,EAAG;AACX,YAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAO,QAAA,GAAW,QAAS,GAAG,CAAA;AAC/C,YAAA,OAAA,CAAQ,OAAA,EAAS,IAAA;AAAA,cACb,CAAA,YAAA,EAAe,UAAU,CAAA,IAAA,EAAO,GAAG,CAAA,GAAA,EAAM,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAA,EAAI,WAAA,CAAY,KAAK,CAAC,CAAA,CAAA;AAAA,aACxF;AACA,YAAA,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAA,cAAA,EAAiB,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,UACjD,CAAA,MAAO;AACH,YAAA,OAAA,CAAQ,OAAA,EAAS,IAAA;AAAA,cACb,CAAA,YAAA,EAAe,UAAU,CAAA,IAAA,EAAO,WAAA,CAAY,QAAQ,CAAC,CAAA;AAAA,aACzD;AACA,YAAA,OAAA,CAAQ,SAAS,IAAA,CAAK,CAAA,cAAA,EAAiB,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,UAClE;AAAA,QACJ;AAAA,OACJ;AACA,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AAEtB,MAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,CAAS,WAAA;AAAA,QACjCF;AAAA,OACJ;AAEA,MAAA,IAAI,CAAC,WAAA,EAAa;AACd,QAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,sCAAsC,CAAA;AAChE,QAAA;AAAA,MACJ;AAEA,MAAA,IAAI,kBAAA,EAAoB;AACpB,QAAA,WAAA,CAAY,iBAAA,CAAkB,WAAW,OAAO,CAAA;AAChD,QAAA,OAAA,CAAQ,MAAA,CAAO,YAAA;AAAA,UACX,CAAA,WAAA,EAAc,WAAA,CAAY,IAAI,CAAC,6BAA6B,SAAS,CAAA,CAAA;AAAA,SACzE;AAAA,MACJ,CAAA,MAAO;AACH,QAAA,MAAM,WAAA,CAAY,SAAA,CAAU,SAAA,EAAW,OAAO,CAAA;AAC9C,QAAA,OAAA,CAAQ,MAAA,CAAO,YAAA;AAAA,UACX,CAAA,WAAA,EAAc,WAAA,CAAY,IAAI,CAAC,QAAQ,SAAS,CAAA,CAAA;AAAA,SACpD;AAAA,MACJ;AAAA,IACJ,SAAS,GAAA,EAAU;AACf,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AACtB,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAA,IAAW,iBAAiB,CAAA;AAAA,IAC9D;AAAA,EACJ;AAAA,EAEA,MAAc,QAAA,CACV,UAAA,EACA,SAAA,EACA,YACA,OAAA,EACa;AACb,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,UAAA,EAAY,OAAO,CAAA;AAChD,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,CAAS,WAAA;AAAA,MACjCA;AAAA,KACJ;AAEA,IAAA,IAAI,CAAC,WAAA,EAAa;AACd,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,sCAAsC,CAAA;AAChE,MAAA;AAAA,IACJ;AAEA,IAAA,MAAM,eAAA,GAAkB,QAAQ,QAAA,CAAS,WAAA;AAAA,MACrC;AAAA,KACJ;AAEA,IAAA,IAAI,CAAC,eAAA,EAAiB;AAClB,MAAA,OAAA,CAAQ,MAAA,CAAO,WAAW,qCAAqC,CAAA;AAC/D,MAAA;AAAA,IACJ;AAEA,IAAA,OAAA,CAAQ,OAAA,EAAS,IAAA,CAAK,CAAA,oBAAA,EAAuB,SAAS,CAAA,IAAA,CAAM,CAAA;AAC5D,IAAA,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAA,aAAA,EAAgB,SAAS,CAAA,CAAE,CAAA;AAEjD,IAAA,IAAI;AACA,MAAA,MAAM,OAAA,GAAU,MAAM,WAAA,CAAY,QAAA,CAAS,SAAS,CAAA;AACpD,MAAA,IAAI,YAAY,IAAA,EAAM;AAClB,QAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AACtB,QAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,CAAA,sBAAA,EAAyB,SAAS,CAAA,CAAE,CAAA;AAC9D,QAAA;AAAA,MACJ;AAEA,MAAA,MAAM,WAAW,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,MAAA;AAC/C,MAAA,OAAA,CAAQ,OAAA,EAAS,IAAA;AAAA,QACb,CAAA,WAAA,EAAc,QAAQ,CAAA,GAAA,EAAM,WAAA,CAAY,OAAA,CAAQ,MAAM,CAAC,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,UAAU,CAAA,GAAA;AAAA,OAC5F;AACA,MAAA,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,CAAA,kBAAA,EAAqB,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAExD,MAAA,MAAM,eAAA,CAAgB,MAAA;AAAA,QAClB,UAAU,MAAM,CAAA;AAAA,QAChB,UAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,MAAA,CAAO;AAAA,OACX;AACA,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AAEtB,MAAA,OAAA,CAAQ,MAAA,CAAO,YAAA;AAAA,QACX,CAAA,UAAA,EAAa,QAAQ,CAAA,GAAA,EAAM,WAAA,CAAY,OAAA,CAAQ,MAAM,CAAC,CAAA,KAAA,EAAQ,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,UAAU,CAAA;AAAA,OAC3F;AAAA,IACJ,SAAS,GAAA,EAAU;AACf,MAAA,OAAA,CAAQ,SAAS,IAAA,EAAK;AACtB,MAAA,OAAA,CAAQ,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,OAAA,IAAW,eAAe,CAAA;AAAA,IAC5D;AAAA,EACJ;AACJ;ACrOO,IAAM,qBAAN,MAAwD;AAAA,EAC3D,MAAM,EAAA,CAAGG,UAAAA,EAAmB,IAAA,EAAc,OAAA,EAAwD;AAC9F,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,CAAA,EAAGA,UAAS,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MAC1F,OAAA,EAASC,uBAAe,OAAO;AAAA,KAClC,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAAA,EAEA,MAAM,GAAA,CAAID,UAAAA,EAAmB,IAAA,EAAc,OAAA,EAA+C;AACtF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,CAAA,EAAGA,UAAS,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MAC3F,OAAA,EAASC,uBAAe,OAAO;AAAA,KAClC,CAAA;AACD,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EAChB;AAAA,EAEA,MAAM,IAAA,CAAKD,UAAAA,EAAmB,IAAA,EAAc,OAAA,EAAqD;AAC7F,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,CAAA,EAAGA,UAAS,CAAA,uBAAA,EAA0B,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MAC5F,OAAA,EAASC,uBAAe,OAAO;AAAA,KAClC,CAAA;AACD,IAAA,OAAO,MAAM,IAAI,IAAA,EAAK;AAAA,EAC1B;AAAA,EAEA,MAAM,QAAA,CACFD,UAAAA,EACA,IAAA,EACA,OAAA,EACA,YACA,MAAA,EAC0C;AAC1C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,MAAA,CAAO,CAAA,EAAGA,UAAS,CAAA,2BAAA,EAA8B,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MAChG,OAAA,EAASC,uBAAe,OAAO,CAAA;AAAA,MAC/B;AAAA,KACH,CAAA;AAED,IAAA,MAAM,aAAA,GAAgB,SAAS,GAAA,CAAI,OAAA,CAAQ,IAAI,gBAAgB,CAAA,IAAK,KAAK,EAAE,CAAA;AAC3E,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,IAAA,EAAM,SAAA,EAAU;AAEnC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACT,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,KAAK,MAAA,EAAO;AAAA,IAC9C;AAEA,IAAA,MAAM,SAAuB,EAAC;AAC9B,IAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,IAAA,OAAO,IAAA,EAAM;AACT,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA,EAAM;AACV,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,MAAA,aAAA,IAAiB,KAAA,CAAM,MAAA;AACvB,MAAA,UAAA,GAAa,eAAe,aAAa,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,aAAa,CAAA;AAC7C,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AACxB,MAAA,QAAA,CAAS,GAAA,CAAI,OAAO,MAAM,CAAA;AAC1B,MAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,IACpB;AAEA,IAAA,OAAO;AAAA,MACH,OAAA,EAAS,IAAI,WAAA,EAAY,CAAE,OAAO,QAAQ,CAAA;AAAA,MAC1C,IAAA,EAAM;AAAA,KACV;AAAA,EACJ;AAAA,EAEA,MAAM,MAAA,CACFD,UAAAA,EACA,UAAA,EACA,OAAA,EACA,UACA,OAAA,EACa;AACb,IAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,IAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,UAAU,CAAA;AAClC,IAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,IAAI,IAAA,CAAK,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAA;AAErD,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,CAAA,EAAGA,UAAS,CAAA,mBAAA,CAAA,EAAuB;AAAA,MACjD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAASC,uBAAe,OAAO;AAAA,KAClC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,KAAA,CAAMD,UAAAA,EAAmB,IAAA,EAAc,OAAA,EAA6C;AACtF,IAAA,MAAM,IAAA,CAAK,MAAA,CAAO,CAAA,EAAGA,UAAS,CAAA,kBAAA,CAAA,EAAsB;AAAA,MAChD,MAAA,EAAQ,MAAA;AAAA,MACR,SAAS,EAAE,cAAA,EAAgB,oBAAoB,GAAGC,sBAAA,CAAe,OAAO,CAAA,EAAE;AAAA,MAC1E,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,MAAM;AAAA,KAChC,CAAA;AAAA,EACL;AAAA,EAEA,MAAM,EAAA,CAAGD,UAAAA,EAAmB,IAAA,EAAc,OAAA,EAA6C;AACnF,IAAA,MAAM,IAAA,CAAK,OAAO,CAAA,EAAGA,UAAS,wBAAwB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MAC9E,MAAA,EAAQ,QAAA;AAAA,MACR,OAAA,EAASC,uBAAe,OAAO;AAAA,KAClC,CAAA;AAAA,EACL;AAAA,EAEA,MAAc,MAAA,CAAO,GAAA,EAAa,IAAA,EAAuC;AACrE,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,GAAA,EAAK,IAAI,CAAA;AACjC,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI;AACT,MAAA,MAAM,OAAO,MAAM,GAAA,CAAI,MAAK,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5C,MAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AACpB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,IAAA,IAAQ,uCAAwC,CAAA,CAAE,CAAA;AAAA,MAC5F;AACA,MAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AACpB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,WAAA,EAAc,IAAA,IAAQ,kCAAkC,CAAA,CAAE,CAAA;AAAA,MAC9E;AACA,MAAA,MAAM,IAAI,MAAM,CAAA,cAAA,EAAiB,GAAA,CAAI,MAAM,CAAA,GAAA,EAAM,IAAA,IAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAAA,IAC7E;AACA,IAAA,OAAO,GAAA;AAAA,EACX;AACJ,CAAA;;;ACzGO,IAAM,SAAA,GAAwB;AAAA,EACjC,UAAA,EAAY,WAAA;AAAA,EACZ,IAAA,EAAM,kBAAA;AAAA,EACN,UAAA,EAAY,CAAC,IAAI,6BAAA,EAA+B,CAAA;AAAA,EAChD,QAAA,EAAU;AAAA,IACN;AAAA,MACI,OAAA,EAAS,yBAAA;AAAA,MACT,QAAA,EAAU,IAAI,kBAAA;AAAmB;AACrC,GACJ;AAAA,EACA,YAAA,EAAc;AAAA,IACV,EAAA,EAAI,EAAE,qBAAA,EAAuB,oCAAA,EAAqC;AAAA,IAClE,EAAA,EAAI,EAAE,qBAAA,EAAuB,mCAAA,EAAoC;AAAA,IACjE,EAAA,EAAI,EAAE,qBAAA,EAAuB,qCAAA,EAAgC;AAAA,IAC7D,EAAA,EAAI,EAAE,qBAAA,EAAuB,uCAAA,EAAqC;AAAA,IAClE,EAAA,EAAI,EAAE,qBAAA,EAAuB,gCAAA,EAAiC;AAAA,IAC9D,EAAA,EAAI,EAAE,qBAAA,EAAuB,+CAAA,EAAa;AAAA,IAC1C,EAAA,EAAI,EAAE,qBAAA,EAAuB,4CAAA,EAAe;AAAA,IAC5C,EAAA,EAAI,EAAE,qBAAA,EAAuB,0CAAA,EAAa;AAAA,IAC1C,EAAA,EAAI,EAAE,qBAAA,EAAuB,iIAAA,EAA8B;AAAA,IAC3D,EAAA,EAAI,EAAE,qBAAA,EAAuB,qCAAA;AAAiC;AAEtE","file":"public-api.js","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.13';\nexport const API_VERSION = 2;\n ","import { CliHeadersProvider } from '@qodalis/cli-core';\n\nexport const IScpTransferService_TOKEN = 'scp-transfer-service';\n\nexport interface IScpFileEntry {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n permissions?: string;\n}\n\nexport interface IScpFileStat {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n created: string;\n permissions?: string;\n}\n\nexport interface IScpTransferService {\n ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]>;\n cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string>;\n stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat>;\n download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }>;\n upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void>;\n mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n}\n","import { ICliExecutionContext, CliServerConfig } from '@qodalis/cli-core';\n\nexport function resolveServer(\n serverName: string | undefined,\n context: ICliExecutionContext,\n): CliServerConfig | null {\n const servers = context.options?.servers;\n if (!servers || servers.length === 0) {\n context.writer.writeError('No servers configured. Add servers to CLI options.');\n return null;\n }\n\n if (!serverName) {\n if (servers.length === 1) {\n return servers[0];\n }\n context.writer.writeError('Multiple servers configured. Specify server name.');\n context.writer.writeInfo('Available: ' + servers.map(s => s.name).join(', '));\n return null;\n }\n\n const server = servers.find(s => s.name.toLowerCase() === serverName.toLowerCase());\n if (!server) {\n context.writer.writeError(`Unknown server: ${serverName}`);\n context.writer.writeInfo('Available: ' + servers.map(s => s.name).join(', '));\n return null;\n }\n\n return server;\n}\n\nexport function serverUrl(server: CliServerConfig): string {\n return server.url.replace(/\\/+$/, '');\n}\n\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\n/**\n * Parse server and path from either positional args (command.value)\n * or named args (--server, --path).\n *\n * Supports:\n * scp ls node /app (positional)\n * scp ls --server node --path /app (named, space-separated)\n * scp ls --server=\"node\" --path=\"/app\" (named, equals syntax)\n */\nexport function parseServerAndPath(\n value: string | undefined,\n context: ICliExecutionContext,\n args?: Record<string, any>,\n): [string, string] | null {\n // Try named args first (--server, --path)\n const serverArg = args?.['server'];\n const pathArg = args?.['path'];\n if (serverArg && pathArg) {\n return [String(serverArg), String(pathArg)];\n }\n\n // Fall back to positional from command.value\n if (!value?.trim()) {\n return null;\n }\n const parts = value.trim().split(/\\s+/);\n if (parts.length < 2) {\n // If only one positional, maybe server is from --server and path is positional\n if (serverArg && parts.length >= 1) {\n return [String(serverArg), parts.join(' ')];\n }\n if (pathArg && parts.length >= 1) {\n return [parts[0], String(pathArg)];\n }\n return null;\n }\n return [parts[0], parts.slice(1).join(' ')];\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpLsProcessor implements ICliCommandChildProcessor {\n command = 'ls';\n description = 'List files and directories on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp ls <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Listing ${path} on ${server.name}...`);\n\n try {\n const entries = await transferService.ls(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n if (entries.length === 0) {\n context.writer.writeInfo(`Directory is empty: ${path}`);\n return;\n }\n\n const headers = ['Name', 'Type', 'Size', 'Modified'];\n const rows = entries.map(entry => [\n entry.name,\n entry.type,\n entry.type === 'file' ? formatBytes(entry.size) : '-',\n entry.modified || '-',\n ]);\n\n context.writer.writeTable(headers, rows);\n context.writer.writeInfo(`${entries.length} item(s)`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to list directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('List files and directories on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpCatProcessor implements ICliCommandChildProcessor {\n command = 'cat';\n description = 'Display contents of a remote file';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp cat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading ${path} on ${server.name}...`);\n\n try {\n const content = await transferService.cat(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeln(content);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to read file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Display the contents of a remote file.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpDownloadProcessor implements ICliCommandChildProcessor {\n command = 'download';\n aliases = ['get'];\n description = 'Download a file from a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters: ICliCommandParameterDescriptor[] = [\n {\n name: 'server',\n description: 'Server name',\n required: false,\n type: 'string',\n },\n {\n name: 'remote-path',\n aliases: ['path'],\n description: 'Remote file path',\n required: false,\n type: 'string',\n },\n {\n name: 'local-path',\n description: 'Local destination path',\n required: false,\n type: 'string',\n },\n {\n name: 'save',\n description: 'Save directly to browser downloads instead of virtual filesystem',\n required: false,\n type: 'boolean',\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n let serverName: string | undefined;\n let remotePath: string | undefined;\n let localPath: string | undefined;\n\n // Try named args first (--server, --remote-path / --path, --local-path)\n if (args['server'] && (args['remote-path'] || args['path'])) {\n serverName = String(args['server']);\n remotePath = String(args['remote-path'] || args['path']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n } else {\n // Fall back to positional\n const value = command.value?.trim();\n if (!value) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n const parts = value.split(/\\s+/);\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n localPath = parts[2];\n }\n\n if (!serverName || !remotePath) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n\n localPath = localPath || remotePath.split('/').pop() || 'download';\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n const abortController = new AbortController();\n const abortSub = context.onAbort.subscribe(() => abortController.abort());\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n server.headers,\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n abortController.signal,\n );\n context.spinner?.hide();\n\n if (useBrowserDownload) {\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available for browser download.');\n }\n } else {\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available.');\n }\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n } finally {\n abortSub.unsubscribe();\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Download a file from a remote server.');\n context.writer.writeln('Usage: scp download <server> <remote-path> [local-path]');\n context.writer.writeln(' --save Save directly to browser downloads');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpUploadProcessor implements ICliCommandChildProcessor {\n command = 'upload';\n aliases = ['put'];\n description = 'Upload a file to a remote server (use --local to pick from your machine)';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local-path',\n description: 'Local file path (from virtual filesystem)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'remote-path',\n description: 'Remote destination path',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local',\n description: 'Pick a file from your local machine via browser file picker',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n const useLocalPicker = !!args['local'];\n let serverName: string | undefined;\n let localPath: string | undefined;\n let remotePath: string | undefined;\n\n // Try named args first\n if (args['server'] && args['remote-path']) {\n serverName = String(args['server']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n remotePath = String(args['remote-path']);\n } else {\n // Fall back to positional\n const value = command.value?.trim();\n if (!value) {\n context.writer.writeError(\n useLocalPicker\n ? 'Usage: scp upload --local <server> <remote-path>'\n : 'Usage: scp upload <server> <local-path> <remote-path>',\n );\n return;\n }\n const parts = value.split(/\\s+/);\n if (useLocalPicker) {\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp upload --local <server> <remote-path>');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n } else {\n if (parts.length < 3) {\n context.writer.writeError('Usage: scp upload <server> <local-path> <remote-path>');\n return;\n }\n serverName = parts[0];\n localPath = parts[1];\n remotePath = parts[2];\n }\n }\n\n if (!serverName || (!useLocalPicker && !localPath) || !remotePath) {\n context.writer.writeError(\n useLocalPicker\n ? 'Usage: scp upload --local <server> <remote-path>'\n : 'Usage: scp upload <server> <local-path> <remote-path>',\n );\n return;\n }\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n let content: string | null;\n let filename: string;\n\n if (useLocalPicker) {\n const picked = await fileService.uploadFromBrowser();\n if (!picked) {\n context.writer.writeln('Upload cancelled.');\n return;\n }\n content = picked.content;\n filename = picked.name;\n } else {\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n content = await fileService.readFile(localPath!);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n filename = localPath!.split('/').pop() || 'file';\n }\n\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n try {\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Upload a file to a remote server.');\n context.writer.writeln('');\n context.writer.writeln('Usage:');\n context.writer.writeln(' scp upload <server> <local-path> <remote-path> Upload from virtual filesystem');\n context.writer.writeln(' scp upload --local <server> <remote-path> Pick from your machine via browser');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpRmProcessor implements ICliCommandChildProcessor {\n command = 'rm';\n description = 'Delete a file on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path to delete',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp rm <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Deleting ${path} on ${server.name}...`);\n\n try {\n await transferService.rm(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Deleted: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to delete file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Delete a file on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpMkdirProcessor implements ICliCommandChildProcessor {\n command = 'mkdir';\n description = 'Create a directory on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path to create',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp mkdir <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Creating directory ${path} on ${server.name}...`);\n\n try {\n await transferService.mkdir(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Created directory: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to create directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Create a directory on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpStatProcessor implements ICliCommandChildProcessor {\n command = 'stat';\n description = 'Show file or directory information on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file or directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp stat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Getting info for ${path} on ${server.name}...`);\n\n try {\n const stat = await transferService.stat(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n const entries: Record<string, string> = {\n Name: stat.name,\n Type: stat.type,\n Size: formatBytes(stat.size),\n Modified: stat.modified || '-',\n Created: stat.created || '-',\n };\n\n if (stat.permissions) {\n entries['Permissions'] = stat.permissions;\n }\n\n context.writer.writeKeyValue(entries);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to get file info');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Show file or directory information on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\nimport { CliScpLsProcessor } from './cli-scp-ls-processor';\nimport { CliScpCatProcessor } from './cli-scp-cat-processor';\nimport { CliScpDownloadProcessor } from './cli-scp-download-processor';\nimport { CliScpUploadProcessor } from './cli-scp-upload-processor';\nimport { CliScpRmProcessor } from './cli-scp-rm-processor';\nimport { CliScpMkdirProcessor } from './cli-scp-mkdir-processor';\nimport { CliScpStatProcessor } from './cli-scp-stat-processor';\n\nexport class CliScpCommandCommandProcessor implements ICliCommandProcessor {\n command = 'scp';\n\n description = 'SCP-like file transfer between browser and remote servers';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n metadata = { icon: '📁', module: 'file management' };\n\n acceptsRawInput = true;\n\n processors: ICliCommandChildProcessor[] = [\n new CliScpLsProcessor(),\n new CliScpCatProcessor(),\n new CliScpDownloadProcessor(),\n new CliScpUploadProcessor(),\n new CliScpRmProcessor(),\n new CliScpMkdirProcessor(),\n new CliScpStatProcessor(),\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const value = command.value?.trim();\n\n // Shorthand: scp myserver:/remote/path => download\n if (value && value.includes(':') && !value.startsWith('-')) {\n const colonIdx = value.indexOf(':');\n const spaceBeforeColon = value.lastIndexOf(' ', colonIdx);\n\n // If no space before colon, first token is \"server:path\"\n if (spaceBeforeColon === -1) {\n const serverName = value.substring(0, colonIdx);\n const rest = value.substring(colonIdx + 1);\n const parts = rest.trim().split(/\\s+/);\n const remotePath = parts[0];\n const localPath = parts[1] || remotePath.split('/').pop() || 'download';\n\n if (remotePath) {\n await this.doDownload(serverName, remotePath, localPath, command, context);\n return;\n }\n }\n\n // Shorthand upload: scp ./local myserver:/remote\n const parts = value.split(/\\s+/);\n if (parts.length >= 2) {\n const secondPart = parts[1];\n if (secondPart.includes(':')) {\n const localPath = parts[0];\n const srvColonIdx = secondPart.indexOf(':');\n const serverName = secondPart.substring(0, srvColonIdx);\n const remotePath = secondPart.substring(srvColonIdx + 1);\n\n if (remotePath) {\n await this.doUpload(serverName, localPath, remotePath, context);\n return;\n }\n }\n }\n }\n\n // No shorthand matched — show help\n context.executor.showHelp(command, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n }\n\n private async doDownload(\n serverName: string,\n remotePath: string,\n localPath: string,\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n server.headers,\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n );\n context.spinner?.hide();\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n if (useBrowserDownload) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n }\n }\n\n private async doUpload(\n serverName: string,\n localPath: string,\n remotePath: string,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n context.notifier.info(`scp: reading ${localPath}`);\n\n try {\n const content = await fileService.readFile(localPath);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n\n const filename = localPath.split('/').pop() || 'file';\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n}\n","import { CliHeadersProvider, resolveHeaders } from '@qodalis/cli-core';\nimport { IScpFileEntry, IScpFileStat, IScpTransferService } from '../interfaces';\n\nexport class ScpTransferService implements IScpTransferService {\n async ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/ls?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.entries;\n }\n\n async cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/cat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.content;\n }\n\n async stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/stat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n return await res.json();\n }\n\n async download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/download?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n signal,\n });\n\n const contentLength = parseInt(res.headers.get('content-length') || '0', 10);\n const reader = res.body?.getReader();\n\n if (!reader) {\n const text = await res.text();\n return { content: text, size: text.length };\n }\n\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n receivedBytes += value.length;\n onProgress?.(receivedBytes, contentLength);\n }\n\n const combined = new Uint8Array(receivedBytes);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return {\n content: new TextDecoder().decode(combined),\n size: receivedBytes,\n };\n }\n\n async upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void> {\n const formData = new FormData();\n formData.append('path', remotePath);\n formData.append('file', new Blob([content]), filename);\n\n await this._fetch(`${serverUrl}/api/qcli/fs/upload`, {\n method: 'POST',\n body: formData,\n headers: resolveHeaders(headers),\n });\n }\n\n async mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/mkdir`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...resolveHeaders(headers) },\n body: JSON.stringify({ path }),\n });\n }\n\n async rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/rm?path=${encodeURIComponent(path)}`, {\n method: 'DELETE',\n headers: resolveHeaders(headers),\n });\n }\n\n private async _fetch(url: string, init?: RequestInit): Promise<Response> {\n const res = await fetch(url, init);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n if (res.status === 403) {\n throw new Error(`Permission denied: ${body || 'path is not in server\\'s allowed paths'}`);\n }\n if (res.status === 404) {\n throw new Error(`Not found: ${body || 'file or directory does not exist'}`);\n }\n throw new Error(`Server error (${res.status}): ${body || res.statusText}`);\n }\n return res;\n }\n}\n","/*\n * Public API Surface of scp\n */\n\nexport * from './lib/processors/cli-scp-command-processor';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliScpCommandCommandProcessor } from './lib/processors/cli-scp-command-processor';\nimport { ScpTransferService } from './lib/services/scp-transfer.service';\nimport { IScpTransferService_TOKEN } from './lib/interfaces';\nimport { API_VERSION } from './lib/version';\n\nexport const scpModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-scp',\n processors: [new CliScpCommandCommandProcessor()],\n services: [\n {\n provide: IScpTransferService_TOKEN,\n useValue: new ScpTransferService(),\n },\n ],\n translations: {\n es: { 'cli.scp.description': 'Transferencia de archivos tipo SCP' },\n fr: { 'cli.scp.description': 'Transfert de fichiers de type SCP' },\n de: { 'cli.scp.description': 'SCP-ähnliche Dateiübertragung' },\n pt: { 'cli.scp.description': 'Transferência de arquivos tipo SCP' },\n it: { 'cli.scp.description': 'Trasferimento file di tipo SCP' },\n ja: { 'cli.scp.description': 'SCP風ファイル転送' },\n ko: { 'cli.scp.description': 'SCP 방식 파일 전송' },\n zh: { 'cli.scp.description': 'SCP 风格文件传输' },\n ru: { 'cli.scp.description': 'Передача файлов в стиле SCP' },\n ro: { 'cli.scp.description': 'Transfer de fișiere de tip SCP' },\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../packages/plugins/scp/src/lib/version.ts","../../packages/plugins/scp/src/lib/interfaces/index.ts","../../packages/plugins/scp/src/lib/processors/scp-utils.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-ls-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-cat-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-download-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-upload-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-rm-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-mkdir-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-stat-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-command-processor.ts","../../packages/plugins/scp/src/lib/services/scp-transfer.service.ts","../../packages/plugins/scp/src/public-api.ts"],"names":["resolveServerHeaders","ICliFileTransferService_TOKEN","DefaultLibraryAuthor","parts","serverUrl","resolveHeaders"],"mappings":"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","file":"public-api.js","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.15';\nexport const API_VERSION = 2;\n ","import { CliHeadersProvider } from '@qodalis/cli-core';\n\nexport const IScpTransferService_TOKEN = 'scp-transfer-service';\n\nexport interface IScpFileEntry {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n permissions?: string;\n}\n\nexport interface IScpFileStat {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n created: string;\n permissions?: string;\n}\n\nexport interface IScpTransferService {\n ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]>;\n cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string>;\n stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat>;\n download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }>;\n upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void>;\n mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n}\n","import { ICliExecutionContext, CliServerConfig } from '@qodalis/cli-core';\n\nexport function resolveServer(\n serverName: string | undefined,\n context: ICliExecutionContext,\n): CliServerConfig | null {\n const servers = context.options?.servers;\n if (!servers || servers.length === 0) {\n context.writer.writeError('No servers configured. Add servers to CLI options.');\n return null;\n }\n\n if (!serverName) {\n if (servers.length === 1) {\n return servers[0];\n }\n context.writer.writeError('Multiple servers configured. Specify server name.');\n context.writer.writeInfo('Available: ' + servers.map(s => s.name).join(', '));\n return null;\n }\n\n const server = servers.find(s => s.name.toLowerCase() === serverName.toLowerCase());\n if (!server) {\n context.writer.writeError(`Unknown server: ${serverName}`);\n context.writer.writeInfo('Available: ' + servers.map(s => s.name).join(', '));\n return null;\n }\n\n return server;\n}\n\nexport function serverUrl(server: CliServerConfig): string {\n return server.url.replace(/\\/+$/, '');\n}\n\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\n/**\n * Parse server and path from either positional args (command.value)\n * or named args (--server, --path).\n *\n * Supports:\n * scp ls node /app (positional)\n * scp ls --server node --path /app (named, space-separated)\n * scp ls --server=\"node\" --path=\"/app\" (named, equals syntax)\n */\nexport function parseServerAndPath(\n value: string | undefined,\n context: ICliExecutionContext,\n args?: Record<string, any>,\n): [string, string] | null {\n // Try named args first (--server, --path)\n const serverArg = args?.['server'];\n const pathArg = args?.['path'];\n if (serverArg && pathArg) {\n return [String(serverArg), String(pathArg)];\n }\n\n // Fall back to positional from command.value\n if (!value?.trim()) {\n return null;\n }\n const parts = value.trim().split(/\\s+/);\n if (parts.length < 2) {\n // If only one positional, maybe server is from --server and path is positional\n if (serverArg && parts.length >= 1) {\n return [String(serverArg), parts.join(' ')];\n }\n if (pathArg && parts.length >= 1) {\n return [parts[0], String(pathArg)];\n }\n return null;\n }\n return [parts[0], parts.slice(1).join(' ')];\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpLsProcessor implements ICliCommandChildProcessor {\n command = 'ls';\n description = 'List files and directories on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp ls <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Listing ${path} on ${server.name}...`);\n\n try {\n const entries = await transferService.ls(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n if (entries.length === 0) {\n context.writer.writeInfo(`Directory is empty: ${path}`);\n return;\n }\n\n const headers = ['Name', 'Type', 'Size', 'Modified'];\n const rows = entries.map(entry => [\n entry.name,\n entry.type,\n entry.type === 'file' ? formatBytes(entry.size) : '-',\n entry.modified || '-',\n ]);\n\n context.writer.writeTable(headers, rows);\n context.writer.writeInfo(`${entries.length} item(s)`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to list directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('List files and directories on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpCatProcessor implements ICliCommandChildProcessor {\n command = 'cat';\n description = 'Display contents of a remote file';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp cat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading ${path} on ${server.name}...`);\n\n try {\n const content = await transferService.cat(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeln(content);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to read file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Display the contents of a remote file.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpDownloadProcessor implements ICliCommandChildProcessor {\n command = 'download';\n aliases = ['get'];\n description = 'Download a file from a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters: ICliCommandParameterDescriptor[] = [\n {\n name: 'server',\n description: 'Server name',\n required: false,\n type: 'string',\n },\n {\n name: 'remote-path',\n aliases: ['path'],\n description: 'Remote file path',\n required: false,\n type: 'string',\n },\n {\n name: 'local-path',\n description: 'Local destination path',\n required: false,\n type: 'string',\n },\n {\n name: 'save',\n description: 'Save directly to browser downloads instead of virtual filesystem',\n required: false,\n type: 'boolean',\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n let serverName: string | undefined;\n let remotePath: string | undefined;\n let localPath: string | undefined;\n\n // Try named args first (--server, --remote-path / --path, --local-path)\n if (args['server'] && (args['remote-path'] || args['path'])) {\n serverName = String(args['server']);\n remotePath = String(args['remote-path'] || args['path']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n } else {\n // Fall back to positional\n const value = command.value?.trim();\n if (!value) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n const parts = value.split(/\\s+/);\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n localPath = parts[2];\n }\n\n if (!serverName || !remotePath) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n\n localPath = localPath || remotePath.split('/').pop() || 'download';\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n const abortController = new AbortController();\n const abortSub = context.onAbort.subscribe(() => abortController.abort());\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n resolveServerHeaders(context.services, server.name, server.headers),\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n abortController.signal,\n );\n context.spinner?.hide();\n\n if (useBrowserDownload) {\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available for browser download.');\n }\n } else {\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available.');\n }\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n } finally {\n abortSub.unsubscribe();\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Download a file from a remote server.');\n context.writer.writeln('Usage: scp download <server> <remote-path> [local-path]');\n context.writer.writeln(' --save Save directly to browser downloads');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpUploadProcessor implements ICliCommandChildProcessor {\n command = 'upload';\n aliases = ['put'];\n description = 'Upload a file to a remote server (use --local to pick from your machine)';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local-path',\n description: 'Local file path (from virtual filesystem)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'remote-path',\n description: 'Remote destination path',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local',\n description: 'Pick a file from your local machine via browser file picker',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n const useLocalPicker = !!args['local'];\n let serverName: string | undefined;\n let localPath: string | undefined;\n let remotePath: string | undefined;\n\n // Try named args first\n if (args['server'] && args['remote-path']) {\n serverName = String(args['server']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n remotePath = String(args['remote-path']);\n } else {\n // Fall back to positional\n const value = command.value?.trim();\n if (!value) {\n context.writer.writeError(\n useLocalPicker\n ? 'Usage: scp upload --local <server> <remote-path>'\n : 'Usage: scp upload <server> <local-path> <remote-path>',\n );\n return;\n }\n const parts = value.split(/\\s+/);\n if (useLocalPicker) {\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp upload --local <server> <remote-path>');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n } else {\n if (parts.length < 3) {\n context.writer.writeError('Usage: scp upload <server> <local-path> <remote-path>');\n return;\n }\n serverName = parts[0];\n localPath = parts[1];\n remotePath = parts[2];\n }\n }\n\n if (!serverName || (!useLocalPicker && !localPath) || !remotePath) {\n context.writer.writeError(\n useLocalPicker\n ? 'Usage: scp upload --local <server> <remote-path>'\n : 'Usage: scp upload <server> <local-path> <remote-path>',\n );\n return;\n }\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n let content: string | null;\n let filename: string;\n\n if (useLocalPicker) {\n const picked = await fileService.uploadFromBrowser();\n if (!picked) {\n context.writer.writeln('Upload cancelled.');\n return;\n }\n content = picked.content;\n filename = picked.name;\n } else {\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n content = await fileService.readFile(localPath!);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n filename = localPath!.split('/').pop() || 'file';\n }\n\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n try {\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Upload a file to a remote server.');\n context.writer.writeln('');\n context.writer.writeln('Usage:');\n context.writer.writeln(' scp upload <server> <local-path> <remote-path> Upload from virtual filesystem');\n context.writer.writeln(' scp upload --local <server> <remote-path> Pick from your machine via browser');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpRmProcessor implements ICliCommandChildProcessor {\n command = 'rm';\n description = 'Delete a file on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path to delete',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp rm <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Deleting ${path} on ${server.name}...`);\n\n try {\n await transferService.rm(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Deleted: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to delete file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Delete a file on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpMkdirProcessor implements ICliCommandChildProcessor {\n command = 'mkdir';\n description = 'Create a directory on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path to create',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp mkdir <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Creating directory ${path} on ${server.name}...`);\n\n try {\n await transferService.mkdir(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Created directory: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to create directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Create a directory on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpStatProcessor implements ICliCommandChildProcessor {\n command = 'stat';\n description = 'Show file or directory information on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file or directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp stat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Getting info for ${path} on ${server.name}...`);\n\n try {\n const stat = await transferService.stat(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n const entries: Record<string, string> = {\n Name: stat.name,\n Type: stat.type,\n Size: formatBytes(stat.size),\n Modified: stat.modified || '-',\n Created: stat.created || '-',\n };\n\n if (stat.permissions) {\n entries['Permissions'] = stat.permissions;\n }\n\n context.writer.writeKeyValue(entries);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to get file info');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Show file or directory information on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\nimport { CliScpLsProcessor } from './cli-scp-ls-processor';\nimport { CliScpCatProcessor } from './cli-scp-cat-processor';\nimport { CliScpDownloadProcessor } from './cli-scp-download-processor';\nimport { CliScpUploadProcessor } from './cli-scp-upload-processor';\nimport { CliScpRmProcessor } from './cli-scp-rm-processor';\nimport { CliScpMkdirProcessor } from './cli-scp-mkdir-processor';\nimport { CliScpStatProcessor } from './cli-scp-stat-processor';\n\nexport class CliScpCommandCommandProcessor implements ICliCommandProcessor {\n command = 'scp';\n\n description = 'SCP-like file transfer between browser and remote servers';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n metadata = { icon: '📁', module: 'file management' };\n\n acceptsRawInput = true;\n\n processors: ICliCommandChildProcessor[] = [\n new CliScpLsProcessor(),\n new CliScpCatProcessor(),\n new CliScpDownloadProcessor(),\n new CliScpUploadProcessor(),\n new CliScpRmProcessor(),\n new CliScpMkdirProcessor(),\n new CliScpStatProcessor(),\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const value = command.value?.trim();\n\n // Shorthand: scp myserver:/remote/path => download\n if (value && value.includes(':') && !value.startsWith('-')) {\n const colonIdx = value.indexOf(':');\n const spaceBeforeColon = value.lastIndexOf(' ', colonIdx);\n\n // If no space before colon, first token is \"server:path\"\n if (spaceBeforeColon === -1) {\n const serverName = value.substring(0, colonIdx);\n const rest = value.substring(colonIdx + 1);\n const parts = rest.trim().split(/\\s+/);\n const remotePath = parts[0];\n const localPath = parts[1] || remotePath.split('/').pop() || 'download';\n\n if (remotePath) {\n await this.doDownload(serverName, remotePath, localPath, command, context);\n return;\n }\n }\n\n // Shorthand upload: scp ./local myserver:/remote\n const parts = value.split(/\\s+/);\n if (parts.length >= 2) {\n const secondPart = parts[1];\n if (secondPart.includes(':')) {\n const localPath = parts[0];\n const srvColonIdx = secondPart.indexOf(':');\n const serverName = secondPart.substring(0, srvColonIdx);\n const remotePath = secondPart.substring(srvColonIdx + 1);\n\n if (remotePath) {\n await this.doUpload(serverName, localPath, remotePath, context);\n return;\n }\n }\n }\n }\n\n // No shorthand matched — show help\n context.executor.showHelp(command, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n }\n\n private async doDownload(\n serverName: string,\n remotePath: string,\n localPath: string,\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n resolveServerHeaders(context.services, server.name, server.headers),\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n );\n context.spinner?.hide();\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n if (useBrowserDownload) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n }\n }\n\n private async doUpload(\n serverName: string,\n localPath: string,\n remotePath: string,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n context.notifier.info(`scp: reading ${localPath}`);\n\n try {\n const content = await fileService.readFile(localPath);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n\n const filename = localPath.split('/').pop() || 'file';\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n}\n","import { CliHeadersProvider, resolveHeaders } from '@qodalis/cli-core';\nimport { IScpFileEntry, IScpFileStat, IScpTransferService } from '../interfaces';\n\nexport class ScpTransferService implements IScpTransferService {\n async ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/ls?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.entries;\n }\n\n async cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/cat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.content;\n }\n\n async stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/stat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n return await res.json();\n }\n\n async download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/download?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n signal,\n });\n\n const contentLength = parseInt(res.headers.get('content-length') || '0', 10);\n const reader = res.body?.getReader();\n\n if (!reader) {\n const text = await res.text();\n return { content: text, size: text.length };\n }\n\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n receivedBytes += value.length;\n onProgress?.(receivedBytes, contentLength);\n }\n\n const combined = new Uint8Array(receivedBytes);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return {\n content: new TextDecoder().decode(combined),\n size: receivedBytes,\n };\n }\n\n async upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void> {\n const formData = new FormData();\n formData.append('path', remotePath);\n formData.append('file', new Blob([content]), filename);\n\n await this._fetch(`${serverUrl}/api/qcli/fs/upload`, {\n method: 'POST',\n body: formData,\n headers: resolveHeaders(headers),\n });\n }\n\n async mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/mkdir`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...resolveHeaders(headers) },\n body: JSON.stringify({ path }),\n });\n }\n\n async rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/rm?path=${encodeURIComponent(path)}`, {\n method: 'DELETE',\n headers: resolveHeaders(headers),\n });\n }\n\n private async _fetch(url: string, init?: RequestInit): Promise<Response> {\n const res = await fetch(url, init);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n if (res.status === 403) {\n throw new Error(`Permission denied: ${body || 'path is not in server\\'s allowed paths'}`);\n }\n if (res.status === 404) {\n throw new Error(`Not found: ${body || 'file or directory does not exist'}`);\n }\n throw new Error(`Server error (${res.status}): ${body || res.statusText}`);\n }\n return res;\n }\n}\n","/*\n * Public API Surface of scp\n */\n\nexport * from './lib/processors/cli-scp-command-processor';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliScpCommandCommandProcessor } from './lib/processors/cli-scp-command-processor';\nimport { ScpTransferService } from './lib/services/scp-transfer.service';\nimport { IScpTransferService_TOKEN } from './lib/interfaces';\nimport { API_VERSION } from './lib/version';\n\nexport const scpModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-scp',\n processors: [new CliScpCommandCommandProcessor()],\n services: [\n {\n provide: IScpTransferService_TOKEN,\n useValue: new ScpTransferService(),\n },\n ],\n translations: {\n es: { 'cli.scp.description': 'Transferencia de archivos tipo SCP' },\n fr: { 'cli.scp.description': 'Transfert de fichiers de type SCP' },\n de: { 'cli.scp.description': 'SCP-ähnliche Dateiübertragung' },\n pt: { 'cli.scp.description': 'Transferência de arquivos tipo SCP' },\n it: { 'cli.scp.description': 'Trasferimento file di tipo SCP' },\n ja: { 'cli.scp.description': 'SCP風ファイル転送' },\n ko: { 'cli.scp.description': 'SCP 방식 파일 전송' },\n zh: { 'cli.scp.description': 'SCP 风格文件传输' },\n ru: { 'cli.scp.description': 'Передача файлов в стиле SCP' },\n ro: { 'cli.scp.description': 'Transfer de fișiere de tip SCP' },\n },\n};\n"]}
|
package/public-api.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { DefaultLibraryAuthor, ICliFileTransferService_TOKEN, resolveHeaders } from '@qodalis/cli-core';
|
|
1
|
+
import { DefaultLibraryAuthor, resolveServerHeaders, ICliFileTransferService_TOKEN, resolveHeaders } from '@qodalis/cli-core';
|
|
2
2
|
|
|
3
3
|
// src/lib/processors/cli-scp-command-processor.ts
|
|
4
4
|
|
|
5
5
|
// src/lib/version.ts
|
|
6
|
-
var LIBRARY_VERSION = "2.0.0-beta.
|
|
6
|
+
var LIBRARY_VERSION = "2.0.0-beta.15";
|
|
7
7
|
var API_VERSION = 2;
|
|
8
8
|
|
|
9
9
|
// src/lib/interfaces/index.ts
|
|
@@ -62,8 +62,6 @@ function parseServerAndPath(value, context, args) {
|
|
|
62
62
|
}
|
|
63
63
|
return [parts[0], parts.slice(1).join(" ")];
|
|
64
64
|
}
|
|
65
|
-
|
|
66
|
-
// src/lib/processors/cli-scp-ls-processor.ts
|
|
67
65
|
var CliScpLsProcessor = class {
|
|
68
66
|
constructor() {
|
|
69
67
|
this.command = "ls";
|
|
@@ -106,7 +104,7 @@ var CliScpLsProcessor = class {
|
|
|
106
104
|
const entries = await transferService.ls(
|
|
107
105
|
serverUrl(server),
|
|
108
106
|
path,
|
|
109
|
-
server.headers
|
|
107
|
+
resolveServerHeaders(context.services, server.name, server.headers)
|
|
110
108
|
);
|
|
111
109
|
context.spinner?.hide();
|
|
112
110
|
if (entries.length === 0) {
|
|
@@ -131,8 +129,6 @@ var CliScpLsProcessor = class {
|
|
|
131
129
|
context.writer.writeln("List files and directories on a remote server.");
|
|
132
130
|
}
|
|
133
131
|
};
|
|
134
|
-
|
|
135
|
-
// src/lib/processors/cli-scp-cat-processor.ts
|
|
136
132
|
var CliScpCatProcessor = class {
|
|
137
133
|
constructor() {
|
|
138
134
|
this.command = "cat";
|
|
@@ -175,7 +171,7 @@ var CliScpCatProcessor = class {
|
|
|
175
171
|
const content = await transferService.cat(
|
|
176
172
|
serverUrl(server),
|
|
177
173
|
path,
|
|
178
|
-
server.headers
|
|
174
|
+
resolveServerHeaders(context.services, server.name, server.headers)
|
|
179
175
|
);
|
|
180
176
|
context.spinner?.hide();
|
|
181
177
|
context.writer.writeln(content);
|
|
@@ -271,7 +267,7 @@ var CliScpDownloadProcessor = class {
|
|
|
271
267
|
const { content, size } = await transferService.download(
|
|
272
268
|
serverUrl(server),
|
|
273
269
|
remotePath,
|
|
274
|
-
server.headers,
|
|
270
|
+
resolveServerHeaders(context.services, server.name, server.headers),
|
|
275
271
|
(received, total) => {
|
|
276
272
|
const now = Date.now();
|
|
277
273
|
if (now - lastProgressUpdate < 200) return;
|
|
@@ -452,7 +448,7 @@ var CliScpUploadProcessor = class {
|
|
|
452
448
|
remotePath,
|
|
453
449
|
content,
|
|
454
450
|
filename,
|
|
455
|
-
server.headers
|
|
451
|
+
resolveServerHeaders(context.services, server.name, server.headers)
|
|
456
452
|
);
|
|
457
453
|
context.spinner?.hide();
|
|
458
454
|
context.writer.writeSuccess(
|
|
@@ -471,8 +467,6 @@ var CliScpUploadProcessor = class {
|
|
|
471
467
|
context.writer.writeln(" scp upload --local <server> <remote-path> Pick from your machine via browser");
|
|
472
468
|
}
|
|
473
469
|
};
|
|
474
|
-
|
|
475
|
-
// src/lib/processors/cli-scp-rm-processor.ts
|
|
476
470
|
var CliScpRmProcessor = class {
|
|
477
471
|
constructor() {
|
|
478
472
|
this.command = "rm";
|
|
@@ -515,7 +509,7 @@ var CliScpRmProcessor = class {
|
|
|
515
509
|
await transferService.rm(
|
|
516
510
|
serverUrl(server),
|
|
517
511
|
path,
|
|
518
|
-
server.headers
|
|
512
|
+
resolveServerHeaders(context.services, server.name, server.headers)
|
|
519
513
|
);
|
|
520
514
|
context.spinner?.hide();
|
|
521
515
|
context.writer.writeSuccess(`Deleted: ${server.name}:${path}`);
|
|
@@ -528,8 +522,6 @@ var CliScpRmProcessor = class {
|
|
|
528
522
|
context.writer.writeln("Delete a file on a remote server.");
|
|
529
523
|
}
|
|
530
524
|
};
|
|
531
|
-
|
|
532
|
-
// src/lib/processors/cli-scp-mkdir-processor.ts
|
|
533
525
|
var CliScpMkdirProcessor = class {
|
|
534
526
|
constructor() {
|
|
535
527
|
this.command = "mkdir";
|
|
@@ -572,7 +564,7 @@ var CliScpMkdirProcessor = class {
|
|
|
572
564
|
await transferService.mkdir(
|
|
573
565
|
serverUrl(server),
|
|
574
566
|
path,
|
|
575
|
-
server.headers
|
|
567
|
+
resolveServerHeaders(context.services, server.name, server.headers)
|
|
576
568
|
);
|
|
577
569
|
context.spinner?.hide();
|
|
578
570
|
context.writer.writeSuccess(`Created directory: ${server.name}:${path}`);
|
|
@@ -585,8 +577,6 @@ var CliScpMkdirProcessor = class {
|
|
|
585
577
|
context.writer.writeln("Create a directory on a remote server.");
|
|
586
578
|
}
|
|
587
579
|
};
|
|
588
|
-
|
|
589
|
-
// src/lib/processors/cli-scp-stat-processor.ts
|
|
590
580
|
var CliScpStatProcessor = class {
|
|
591
581
|
constructor() {
|
|
592
582
|
this.command = "stat";
|
|
@@ -629,7 +619,7 @@ var CliScpStatProcessor = class {
|
|
|
629
619
|
const stat = await transferService.stat(
|
|
630
620
|
serverUrl(server),
|
|
631
621
|
path,
|
|
632
|
-
server.headers
|
|
622
|
+
resolveServerHeaders(context.services, server.name, server.headers)
|
|
633
623
|
);
|
|
634
624
|
context.spinner?.hide();
|
|
635
625
|
const entries = {
|
|
@@ -726,7 +716,7 @@ var CliScpCommandCommandProcessor = class {
|
|
|
726
716
|
const { content, size } = await transferService.download(
|
|
727
717
|
serverUrl(server),
|
|
728
718
|
remotePath,
|
|
729
|
-
server.headers,
|
|
719
|
+
resolveServerHeaders(context.services, server.name, server.headers),
|
|
730
720
|
(received, total) => {
|
|
731
721
|
const now = Date.now();
|
|
732
722
|
if (now - lastProgressUpdate < 200) return;
|
|
@@ -805,7 +795,7 @@ var CliScpCommandCommandProcessor = class {
|
|
|
805
795
|
remotePath,
|
|
806
796
|
content,
|
|
807
797
|
filename,
|
|
808
|
-
server.headers
|
|
798
|
+
resolveServerHeaders(context.services, server.name, server.headers)
|
|
809
799
|
);
|
|
810
800
|
context.spinner?.hide();
|
|
811
801
|
context.writer.writeSuccess(
|
package/public-api.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../packages/plugins/scp/src/lib/version.ts","../../packages/plugins/scp/src/lib/interfaces/index.ts","../../packages/plugins/scp/src/lib/processors/scp-utils.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-ls-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-cat-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-download-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-upload-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-rm-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-mkdir-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-stat-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-command-processor.ts","../../packages/plugins/scp/src/lib/services/scp-transfer.service.ts","../../packages/plugins/scp/src/public-api.ts"],"names":["ICliFileTransferService_TOKEN","parts","serverUrl"],"mappings":"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","file":"public-api.mjs","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.13';\nexport const API_VERSION = 2;\n ","import { CliHeadersProvider } from '@qodalis/cli-core';\n\nexport const IScpTransferService_TOKEN = 'scp-transfer-service';\n\nexport interface IScpFileEntry {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n permissions?: string;\n}\n\nexport interface IScpFileStat {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n created: string;\n permissions?: string;\n}\n\nexport interface IScpTransferService {\n ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]>;\n cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string>;\n stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat>;\n download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }>;\n upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void>;\n mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n}\n","import { ICliExecutionContext, CliServerConfig } from '@qodalis/cli-core';\n\nexport function resolveServer(\n serverName: string | undefined,\n context: ICliExecutionContext,\n): CliServerConfig | null {\n const servers = context.options?.servers;\n if (!servers || servers.length === 0) {\n context.writer.writeError('No servers configured. Add servers to CLI options.');\n return null;\n }\n\n if (!serverName) {\n if (servers.length === 1) {\n return servers[0];\n }\n context.writer.writeError('Multiple servers configured. Specify server name.');\n context.writer.writeInfo('Available: ' + servers.map(s => s.name).join(', '));\n return null;\n }\n\n const server = servers.find(s => s.name.toLowerCase() === serverName.toLowerCase());\n if (!server) {\n context.writer.writeError(`Unknown server: ${serverName}`);\n context.writer.writeInfo('Available: ' + servers.map(s => s.name).join(', '));\n return null;\n }\n\n return server;\n}\n\nexport function serverUrl(server: CliServerConfig): string {\n return server.url.replace(/\\/+$/, '');\n}\n\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\n/**\n * Parse server and path from either positional args (command.value)\n * or named args (--server, --path).\n *\n * Supports:\n * scp ls node /app (positional)\n * scp ls --server node --path /app (named, space-separated)\n * scp ls --server=\"node\" --path=\"/app\" (named, equals syntax)\n */\nexport function parseServerAndPath(\n value: string | undefined,\n context: ICliExecutionContext,\n args?: Record<string, any>,\n): [string, string] | null {\n // Try named args first (--server, --path)\n const serverArg = args?.['server'];\n const pathArg = args?.['path'];\n if (serverArg && pathArg) {\n return [String(serverArg), String(pathArg)];\n }\n\n // Fall back to positional from command.value\n if (!value?.trim()) {\n return null;\n }\n const parts = value.trim().split(/\\s+/);\n if (parts.length < 2) {\n // If only one positional, maybe server is from --server and path is positional\n if (serverArg && parts.length >= 1) {\n return [String(serverArg), parts.join(' ')];\n }\n if (pathArg && parts.length >= 1) {\n return [parts[0], String(pathArg)];\n }\n return null;\n }\n return [parts[0], parts.slice(1).join(' ')];\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpLsProcessor implements ICliCommandChildProcessor {\n command = 'ls';\n description = 'List files and directories on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp ls <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Listing ${path} on ${server.name}...`);\n\n try {\n const entries = await transferService.ls(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n if (entries.length === 0) {\n context.writer.writeInfo(`Directory is empty: ${path}`);\n return;\n }\n\n const headers = ['Name', 'Type', 'Size', 'Modified'];\n const rows = entries.map(entry => [\n entry.name,\n entry.type,\n entry.type === 'file' ? formatBytes(entry.size) : '-',\n entry.modified || '-',\n ]);\n\n context.writer.writeTable(headers, rows);\n context.writer.writeInfo(`${entries.length} item(s)`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to list directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('List files and directories on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpCatProcessor implements ICliCommandChildProcessor {\n command = 'cat';\n description = 'Display contents of a remote file';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp cat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading ${path} on ${server.name}...`);\n\n try {\n const content = await transferService.cat(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeln(content);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to read file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Display the contents of a remote file.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpDownloadProcessor implements ICliCommandChildProcessor {\n command = 'download';\n aliases = ['get'];\n description = 'Download a file from a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters: ICliCommandParameterDescriptor[] = [\n {\n name: 'server',\n description: 'Server name',\n required: false,\n type: 'string',\n },\n {\n name: 'remote-path',\n aliases: ['path'],\n description: 'Remote file path',\n required: false,\n type: 'string',\n },\n {\n name: 'local-path',\n description: 'Local destination path',\n required: false,\n type: 'string',\n },\n {\n name: 'save',\n description: 'Save directly to browser downloads instead of virtual filesystem',\n required: false,\n type: 'boolean',\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n let serverName: string | undefined;\n let remotePath: string | undefined;\n let localPath: string | undefined;\n\n // Try named args first (--server, --remote-path / --path, --local-path)\n if (args['server'] && (args['remote-path'] || args['path'])) {\n serverName = String(args['server']);\n remotePath = String(args['remote-path'] || args['path']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n } else {\n // Fall back to positional\n const value = command.value?.trim();\n if (!value) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n const parts = value.split(/\\s+/);\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n localPath = parts[2];\n }\n\n if (!serverName || !remotePath) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n\n localPath = localPath || remotePath.split('/').pop() || 'download';\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n const abortController = new AbortController();\n const abortSub = context.onAbort.subscribe(() => abortController.abort());\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n server.headers,\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n abortController.signal,\n );\n context.spinner?.hide();\n\n if (useBrowserDownload) {\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available for browser download.');\n }\n } else {\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available.');\n }\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n } finally {\n abortSub.unsubscribe();\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Download a file from a remote server.');\n context.writer.writeln('Usage: scp download <server> <remote-path> [local-path]');\n context.writer.writeln(' --save Save directly to browser downloads');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpUploadProcessor implements ICliCommandChildProcessor {\n command = 'upload';\n aliases = ['put'];\n description = 'Upload a file to a remote server (use --local to pick from your machine)';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local-path',\n description: 'Local file path (from virtual filesystem)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'remote-path',\n description: 'Remote destination path',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local',\n description: 'Pick a file from your local machine via browser file picker',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n const useLocalPicker = !!args['local'];\n let serverName: string | undefined;\n let localPath: string | undefined;\n let remotePath: string | undefined;\n\n // Try named args first\n if (args['server'] && args['remote-path']) {\n serverName = String(args['server']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n remotePath = String(args['remote-path']);\n } else {\n // Fall back to positional\n const value = command.value?.trim();\n if (!value) {\n context.writer.writeError(\n useLocalPicker\n ? 'Usage: scp upload --local <server> <remote-path>'\n : 'Usage: scp upload <server> <local-path> <remote-path>',\n );\n return;\n }\n const parts = value.split(/\\s+/);\n if (useLocalPicker) {\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp upload --local <server> <remote-path>');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n } else {\n if (parts.length < 3) {\n context.writer.writeError('Usage: scp upload <server> <local-path> <remote-path>');\n return;\n }\n serverName = parts[0];\n localPath = parts[1];\n remotePath = parts[2];\n }\n }\n\n if (!serverName || (!useLocalPicker && !localPath) || !remotePath) {\n context.writer.writeError(\n useLocalPicker\n ? 'Usage: scp upload --local <server> <remote-path>'\n : 'Usage: scp upload <server> <local-path> <remote-path>',\n );\n return;\n }\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n let content: string | null;\n let filename: string;\n\n if (useLocalPicker) {\n const picked = await fileService.uploadFromBrowser();\n if (!picked) {\n context.writer.writeln('Upload cancelled.');\n return;\n }\n content = picked.content;\n filename = picked.name;\n } else {\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n content = await fileService.readFile(localPath!);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n filename = localPath!.split('/').pop() || 'file';\n }\n\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n try {\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Upload a file to a remote server.');\n context.writer.writeln('');\n context.writer.writeln('Usage:');\n context.writer.writeln(' scp upload <server> <local-path> <remote-path> Upload from virtual filesystem');\n context.writer.writeln(' scp upload --local <server> <remote-path> Pick from your machine via browser');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpRmProcessor implements ICliCommandChildProcessor {\n command = 'rm';\n description = 'Delete a file on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path to delete',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp rm <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Deleting ${path} on ${server.name}...`);\n\n try {\n await transferService.rm(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Deleted: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to delete file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Delete a file on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpMkdirProcessor implements ICliCommandChildProcessor {\n command = 'mkdir';\n description = 'Create a directory on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path to create',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp mkdir <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Creating directory ${path} on ${server.name}...`);\n\n try {\n await transferService.mkdir(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Created directory: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to create directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Create a directory on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpStatProcessor implements ICliCommandChildProcessor {\n command = 'stat';\n description = 'Show file or directory information on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file or directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp stat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Getting info for ${path} on ${server.name}...`);\n\n try {\n const stat = await transferService.stat(\n serverUrl(server),\n path,\n server.headers,\n );\n context.spinner?.hide();\n\n const entries: Record<string, string> = {\n Name: stat.name,\n Type: stat.type,\n Size: formatBytes(stat.size),\n Modified: stat.modified || '-',\n Created: stat.created || '-',\n };\n\n if (stat.permissions) {\n entries['Permissions'] = stat.permissions;\n }\n\n context.writer.writeKeyValue(entries);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to get file info');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Show file or directory information on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\nimport { CliScpLsProcessor } from './cli-scp-ls-processor';\nimport { CliScpCatProcessor } from './cli-scp-cat-processor';\nimport { CliScpDownloadProcessor } from './cli-scp-download-processor';\nimport { CliScpUploadProcessor } from './cli-scp-upload-processor';\nimport { CliScpRmProcessor } from './cli-scp-rm-processor';\nimport { CliScpMkdirProcessor } from './cli-scp-mkdir-processor';\nimport { CliScpStatProcessor } from './cli-scp-stat-processor';\n\nexport class CliScpCommandCommandProcessor implements ICliCommandProcessor {\n command = 'scp';\n\n description = 'SCP-like file transfer between browser and remote servers';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n metadata = { icon: '📁', module: 'file management' };\n\n acceptsRawInput = true;\n\n processors: ICliCommandChildProcessor[] = [\n new CliScpLsProcessor(),\n new CliScpCatProcessor(),\n new CliScpDownloadProcessor(),\n new CliScpUploadProcessor(),\n new CliScpRmProcessor(),\n new CliScpMkdirProcessor(),\n new CliScpStatProcessor(),\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const value = command.value?.trim();\n\n // Shorthand: scp myserver:/remote/path => download\n if (value && value.includes(':') && !value.startsWith('-')) {\n const colonIdx = value.indexOf(':');\n const spaceBeforeColon = value.lastIndexOf(' ', colonIdx);\n\n // If no space before colon, first token is \"server:path\"\n if (spaceBeforeColon === -1) {\n const serverName = value.substring(0, colonIdx);\n const rest = value.substring(colonIdx + 1);\n const parts = rest.trim().split(/\\s+/);\n const remotePath = parts[0];\n const localPath = parts[1] || remotePath.split('/').pop() || 'download';\n\n if (remotePath) {\n await this.doDownload(serverName, remotePath, localPath, command, context);\n return;\n }\n }\n\n // Shorthand upload: scp ./local myserver:/remote\n const parts = value.split(/\\s+/);\n if (parts.length >= 2) {\n const secondPart = parts[1];\n if (secondPart.includes(':')) {\n const localPath = parts[0];\n const srvColonIdx = secondPart.indexOf(':');\n const serverName = secondPart.substring(0, srvColonIdx);\n const remotePath = secondPart.substring(srvColonIdx + 1);\n\n if (remotePath) {\n await this.doUpload(serverName, localPath, remotePath, context);\n return;\n }\n }\n }\n }\n\n // No shorthand matched — show help\n context.executor.showHelp(command, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n }\n\n private async doDownload(\n serverName: string,\n remotePath: string,\n localPath: string,\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n server.headers,\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n );\n context.spinner?.hide();\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n if (useBrowserDownload) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n }\n }\n\n private async doUpload(\n serverName: string,\n localPath: string,\n remotePath: string,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n context.notifier.info(`scp: reading ${localPath}`);\n\n try {\n const content = await fileService.readFile(localPath);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n\n const filename = localPath.split('/').pop() || 'file';\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n server.headers,\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n}\n","import { CliHeadersProvider, resolveHeaders } from '@qodalis/cli-core';\nimport { IScpFileEntry, IScpFileStat, IScpTransferService } from '../interfaces';\n\nexport class ScpTransferService implements IScpTransferService {\n async ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/ls?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.entries;\n }\n\n async cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/cat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.content;\n }\n\n async stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/stat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n return await res.json();\n }\n\n async download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/download?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n signal,\n });\n\n const contentLength = parseInt(res.headers.get('content-length') || '0', 10);\n const reader = res.body?.getReader();\n\n if (!reader) {\n const text = await res.text();\n return { content: text, size: text.length };\n }\n\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n receivedBytes += value.length;\n onProgress?.(receivedBytes, contentLength);\n }\n\n const combined = new Uint8Array(receivedBytes);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return {\n content: new TextDecoder().decode(combined),\n size: receivedBytes,\n };\n }\n\n async upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void> {\n const formData = new FormData();\n formData.append('path', remotePath);\n formData.append('file', new Blob([content]), filename);\n\n await this._fetch(`${serverUrl}/api/qcli/fs/upload`, {\n method: 'POST',\n body: formData,\n headers: resolveHeaders(headers),\n });\n }\n\n async mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/mkdir`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...resolveHeaders(headers) },\n body: JSON.stringify({ path }),\n });\n }\n\n async rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/rm?path=${encodeURIComponent(path)}`, {\n method: 'DELETE',\n headers: resolveHeaders(headers),\n });\n }\n\n private async _fetch(url: string, init?: RequestInit): Promise<Response> {\n const res = await fetch(url, init);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n if (res.status === 403) {\n throw new Error(`Permission denied: ${body || 'path is not in server\\'s allowed paths'}`);\n }\n if (res.status === 404) {\n throw new Error(`Not found: ${body || 'file or directory does not exist'}`);\n }\n throw new Error(`Server error (${res.status}): ${body || res.statusText}`);\n }\n return res;\n }\n}\n","/*\n * Public API Surface of scp\n */\n\nexport * from './lib/processors/cli-scp-command-processor';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliScpCommandCommandProcessor } from './lib/processors/cli-scp-command-processor';\nimport { ScpTransferService } from './lib/services/scp-transfer.service';\nimport { IScpTransferService_TOKEN } from './lib/interfaces';\nimport { API_VERSION } from './lib/version';\n\nexport const scpModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-scp',\n processors: [new CliScpCommandCommandProcessor()],\n services: [\n {\n provide: IScpTransferService_TOKEN,\n useValue: new ScpTransferService(),\n },\n ],\n translations: {\n es: { 'cli.scp.description': 'Transferencia de archivos tipo SCP' },\n fr: { 'cli.scp.description': 'Transfert de fichiers de type SCP' },\n de: { 'cli.scp.description': 'SCP-ähnliche Dateiübertragung' },\n pt: { 'cli.scp.description': 'Transferência de arquivos tipo SCP' },\n it: { 'cli.scp.description': 'Trasferimento file di tipo SCP' },\n ja: { 'cli.scp.description': 'SCP風ファイル転送' },\n ko: { 'cli.scp.description': 'SCP 방식 파일 전송' },\n zh: { 'cli.scp.description': 'SCP 风格文件传输' },\n ru: { 'cli.scp.description': 'Передача файлов в стиле SCP' },\n ro: { 'cli.scp.description': 'Transfer de fișiere de tip SCP' },\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../packages/plugins/scp/src/lib/version.ts","../../packages/plugins/scp/src/lib/interfaces/index.ts","../../packages/plugins/scp/src/lib/processors/scp-utils.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-ls-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-cat-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-download-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-upload-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-rm-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-mkdir-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-stat-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-command-processor.ts","../../packages/plugins/scp/src/lib/services/scp-transfer.service.ts","../../packages/plugins/scp/src/public-api.ts"],"names":["resolveServerHeaders","ICliFileTransferService_TOKEN","parts","serverUrl"],"mappings":"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","file":"public-api.mjs","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.15';\nexport const API_VERSION = 2;\n ","import { CliHeadersProvider } from '@qodalis/cli-core';\n\nexport const IScpTransferService_TOKEN = 'scp-transfer-service';\n\nexport interface IScpFileEntry {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n permissions?: string;\n}\n\nexport interface IScpFileStat {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n created: string;\n permissions?: string;\n}\n\nexport interface IScpTransferService {\n ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]>;\n cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string>;\n stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat>;\n download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }>;\n upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void>;\n mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n}\n","import { ICliExecutionContext, CliServerConfig } from '@qodalis/cli-core';\n\nexport function resolveServer(\n serverName: string | undefined,\n context: ICliExecutionContext,\n): CliServerConfig | null {\n const servers = context.options?.servers;\n if (!servers || servers.length === 0) {\n context.writer.writeError('No servers configured. Add servers to CLI options.');\n return null;\n }\n\n if (!serverName) {\n if (servers.length === 1) {\n return servers[0];\n }\n context.writer.writeError('Multiple servers configured. Specify server name.');\n context.writer.writeInfo('Available: ' + servers.map(s => s.name).join(', '));\n return null;\n }\n\n const server = servers.find(s => s.name.toLowerCase() === serverName.toLowerCase());\n if (!server) {\n context.writer.writeError(`Unknown server: ${serverName}`);\n context.writer.writeInfo('Available: ' + servers.map(s => s.name).join(', '));\n return null;\n }\n\n return server;\n}\n\nexport function serverUrl(server: CliServerConfig): string {\n return server.url.replace(/\\/+$/, '');\n}\n\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;\n}\n\n/**\n * Parse server and path from either positional args (command.value)\n * or named args (--server, --path).\n *\n * Supports:\n * scp ls node /app (positional)\n * scp ls --server node --path /app (named, space-separated)\n * scp ls --server=\"node\" --path=\"/app\" (named, equals syntax)\n */\nexport function parseServerAndPath(\n value: string | undefined,\n context: ICliExecutionContext,\n args?: Record<string, any>,\n): [string, string] | null {\n // Try named args first (--server, --path)\n const serverArg = args?.['server'];\n const pathArg = args?.['path'];\n if (serverArg && pathArg) {\n return [String(serverArg), String(pathArg)];\n }\n\n // Fall back to positional from command.value\n if (!value?.trim()) {\n return null;\n }\n const parts = value.trim().split(/\\s+/);\n if (parts.length < 2) {\n // If only one positional, maybe server is from --server and path is positional\n if (serverArg && parts.length >= 1) {\n return [String(serverArg), parts.join(' ')];\n }\n if (pathArg && parts.length >= 1) {\n return [parts[0], String(pathArg)];\n }\n return null;\n }\n return [parts[0], parts.slice(1).join(' ')];\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpLsProcessor implements ICliCommandChildProcessor {\n command = 'ls';\n description = 'List files and directories on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp ls <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Listing ${path} on ${server.name}...`);\n\n try {\n const entries = await transferService.ls(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n if (entries.length === 0) {\n context.writer.writeInfo(`Directory is empty: ${path}`);\n return;\n }\n\n const headers = ['Name', 'Type', 'Size', 'Modified'];\n const rows = entries.map(entry => [\n entry.name,\n entry.type,\n entry.type === 'file' ? formatBytes(entry.size) : '-',\n entry.modified || '-',\n ]);\n\n context.writer.writeTable(headers, rows);\n context.writer.writeInfo(`${entries.length} item(s)`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to list directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('List files and directories on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpCatProcessor implements ICliCommandChildProcessor {\n command = 'cat';\n description = 'Display contents of a remote file';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp cat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading ${path} on ${server.name}...`);\n\n try {\n const content = await transferService.cat(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeln(content);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to read file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Display the contents of a remote file.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpDownloadProcessor implements ICliCommandChildProcessor {\n command = 'download';\n aliases = ['get'];\n description = 'Download a file from a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters: ICliCommandParameterDescriptor[] = [\n {\n name: 'server',\n description: 'Server name',\n required: false,\n type: 'string',\n },\n {\n name: 'remote-path',\n aliases: ['path'],\n description: 'Remote file path',\n required: false,\n type: 'string',\n },\n {\n name: 'local-path',\n description: 'Local destination path',\n required: false,\n type: 'string',\n },\n {\n name: 'save',\n description: 'Save directly to browser downloads instead of virtual filesystem',\n required: false,\n type: 'boolean',\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n let serverName: string | undefined;\n let remotePath: string | undefined;\n let localPath: string | undefined;\n\n // Try named args first (--server, --remote-path / --path, --local-path)\n if (args['server'] && (args['remote-path'] || args['path'])) {\n serverName = String(args['server']);\n remotePath = String(args['remote-path'] || args['path']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n } else {\n // Fall back to positional\n const value = command.value?.trim();\n if (!value) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n const parts = value.split(/\\s+/);\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n localPath = parts[2];\n }\n\n if (!serverName || !remotePath) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n\n localPath = localPath || remotePath.split('/').pop() || 'download';\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n const abortController = new AbortController();\n const abortSub = context.onAbort.subscribe(() => abortController.abort());\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n resolveServerHeaders(context.services, server.name, server.headers),\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n abortController.signal,\n );\n context.spinner?.hide();\n\n if (useBrowserDownload) {\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available for browser download.');\n }\n } else {\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available.');\n }\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n } finally {\n abortSub.unsubscribe();\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Download a file from a remote server.');\n context.writer.writeln('Usage: scp download <server> <remote-path> [local-path]');\n context.writer.writeln(' --save Save directly to browser downloads');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpUploadProcessor implements ICliCommandChildProcessor {\n command = 'upload';\n aliases = ['put'];\n description = 'Upload a file to a remote server (use --local to pick from your machine)';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local-path',\n description: 'Local file path (from virtual filesystem)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'remote-path',\n description: 'Remote destination path',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local',\n description: 'Pick a file from your local machine via browser file picker',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n const useLocalPicker = !!args['local'];\n let serverName: string | undefined;\n let localPath: string | undefined;\n let remotePath: string | undefined;\n\n // Try named args first\n if (args['server'] && args['remote-path']) {\n serverName = String(args['server']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n remotePath = String(args['remote-path']);\n } else {\n // Fall back to positional\n const value = command.value?.trim();\n if (!value) {\n context.writer.writeError(\n useLocalPicker\n ? 'Usage: scp upload --local <server> <remote-path>'\n : 'Usage: scp upload <server> <local-path> <remote-path>',\n );\n return;\n }\n const parts = value.split(/\\s+/);\n if (useLocalPicker) {\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp upload --local <server> <remote-path>');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n } else {\n if (parts.length < 3) {\n context.writer.writeError('Usage: scp upload <server> <local-path> <remote-path>');\n return;\n }\n serverName = parts[0];\n localPath = parts[1];\n remotePath = parts[2];\n }\n }\n\n if (!serverName || (!useLocalPicker && !localPath) || !remotePath) {\n context.writer.writeError(\n useLocalPicker\n ? 'Usage: scp upload --local <server> <remote-path>'\n : 'Usage: scp upload <server> <local-path> <remote-path>',\n );\n return;\n }\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n let content: string | null;\n let filename: string;\n\n if (useLocalPicker) {\n const picked = await fileService.uploadFromBrowser();\n if (!picked) {\n context.writer.writeln('Upload cancelled.');\n return;\n }\n content = picked.content;\n filename = picked.name;\n } else {\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n content = await fileService.readFile(localPath!);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n filename = localPath!.split('/').pop() || 'file';\n }\n\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n try {\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Upload a file to a remote server.');\n context.writer.writeln('');\n context.writer.writeln('Usage:');\n context.writer.writeln(' scp upload <server> <local-path> <remote-path> Upload from virtual filesystem');\n context.writer.writeln(' scp upload --local <server> <remote-path> Pick from your machine via browser');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpRmProcessor implements ICliCommandChildProcessor {\n command = 'rm';\n description = 'Delete a file on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path to delete',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp rm <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Deleting ${path} on ${server.name}...`);\n\n try {\n await transferService.rm(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Deleted: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to delete file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Delete a file on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpMkdirProcessor implements ICliCommandChildProcessor {\n command = 'mkdir';\n description = 'Create a directory on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path to create',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp mkdir <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Creating directory ${path} on ${server.name}...`);\n\n try {\n await transferService.mkdir(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Created directory: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to create directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Create a directory on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpStatProcessor implements ICliCommandChildProcessor {\n command = 'stat';\n description = 'Show file or directory information on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file or directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp stat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Getting info for ${path} on ${server.name}...`);\n\n try {\n const stat = await transferService.stat(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n const entries: Record<string, string> = {\n Name: stat.name,\n Type: stat.type,\n Size: formatBytes(stat.size),\n Modified: stat.modified || '-',\n Created: stat.created || '-',\n };\n\n if (stat.permissions) {\n entries['Permissions'] = stat.permissions;\n }\n\n context.writer.writeKeyValue(entries);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to get file info');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Show file or directory information on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\nimport { CliScpLsProcessor } from './cli-scp-ls-processor';\nimport { CliScpCatProcessor } from './cli-scp-cat-processor';\nimport { CliScpDownloadProcessor } from './cli-scp-download-processor';\nimport { CliScpUploadProcessor } from './cli-scp-upload-processor';\nimport { CliScpRmProcessor } from './cli-scp-rm-processor';\nimport { CliScpMkdirProcessor } from './cli-scp-mkdir-processor';\nimport { CliScpStatProcessor } from './cli-scp-stat-processor';\n\nexport class CliScpCommandCommandProcessor implements ICliCommandProcessor {\n command = 'scp';\n\n description = 'SCP-like file transfer between browser and remote servers';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n metadata = { icon: '📁', module: 'file management' };\n\n acceptsRawInput = true;\n\n processors: ICliCommandChildProcessor[] = [\n new CliScpLsProcessor(),\n new CliScpCatProcessor(),\n new CliScpDownloadProcessor(),\n new CliScpUploadProcessor(),\n new CliScpRmProcessor(),\n new CliScpMkdirProcessor(),\n new CliScpStatProcessor(),\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const value = command.value?.trim();\n\n // Shorthand: scp myserver:/remote/path => download\n if (value && value.includes(':') && !value.startsWith('-')) {\n const colonIdx = value.indexOf(':');\n const spaceBeforeColon = value.lastIndexOf(' ', colonIdx);\n\n // If no space before colon, first token is \"server:path\"\n if (spaceBeforeColon === -1) {\n const serverName = value.substring(0, colonIdx);\n const rest = value.substring(colonIdx + 1);\n const parts = rest.trim().split(/\\s+/);\n const remotePath = parts[0];\n const localPath = parts[1] || remotePath.split('/').pop() || 'download';\n\n if (remotePath) {\n await this.doDownload(serverName, remotePath, localPath, command, context);\n return;\n }\n }\n\n // Shorthand upload: scp ./local myserver:/remote\n const parts = value.split(/\\s+/);\n if (parts.length >= 2) {\n const secondPart = parts[1];\n if (secondPart.includes(':')) {\n const localPath = parts[0];\n const srvColonIdx = secondPart.indexOf(':');\n const serverName = secondPart.substring(0, srvColonIdx);\n const remotePath = secondPart.substring(srvColonIdx + 1);\n\n if (remotePath) {\n await this.doUpload(serverName, localPath, remotePath, context);\n return;\n }\n }\n }\n }\n\n // No shorthand matched — show help\n context.executor.showHelp(command, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n }\n\n private async doDownload(\n serverName: string,\n remotePath: string,\n localPath: string,\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n resolveServerHeaders(context.services, server.name, server.headers),\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n );\n context.spinner?.hide();\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n if (useBrowserDownload) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n }\n }\n\n private async doUpload(\n serverName: string,\n localPath: string,\n remotePath: string,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n context.notifier.info(`scp: reading ${localPath}`);\n\n try {\n const content = await fileService.readFile(localPath);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n\n const filename = localPath.split('/').pop() || 'file';\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n}\n","import { CliHeadersProvider, resolveHeaders } from '@qodalis/cli-core';\nimport { IScpFileEntry, IScpFileStat, IScpTransferService } from '../interfaces';\n\nexport class ScpTransferService implements IScpTransferService {\n async ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/ls?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.entries;\n }\n\n async cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/cat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.content;\n }\n\n async stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/stat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n return await res.json();\n }\n\n async download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/download?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n signal,\n });\n\n const contentLength = parseInt(res.headers.get('content-length') || '0', 10);\n const reader = res.body?.getReader();\n\n if (!reader) {\n const text = await res.text();\n return { content: text, size: text.length };\n }\n\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n receivedBytes += value.length;\n onProgress?.(receivedBytes, contentLength);\n }\n\n const combined = new Uint8Array(receivedBytes);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return {\n content: new TextDecoder().decode(combined),\n size: receivedBytes,\n };\n }\n\n async upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void> {\n const formData = new FormData();\n formData.append('path', remotePath);\n formData.append('file', new Blob([content]), filename);\n\n await this._fetch(`${serverUrl}/api/qcli/fs/upload`, {\n method: 'POST',\n body: formData,\n headers: resolveHeaders(headers),\n });\n }\n\n async mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/mkdir`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...resolveHeaders(headers) },\n body: JSON.stringify({ path }),\n });\n }\n\n async rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/rm?path=${encodeURIComponent(path)}`, {\n method: 'DELETE',\n headers: resolveHeaders(headers),\n });\n }\n\n private async _fetch(url: string, init?: RequestInit): Promise<Response> {\n const res = await fetch(url, init);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n if (res.status === 403) {\n throw new Error(`Permission denied: ${body || 'path is not in server\\'s allowed paths'}`);\n }\n if (res.status === 404) {\n throw new Error(`Not found: ${body || 'file or directory does not exist'}`);\n }\n throw new Error(`Server error (${res.status}): ${body || res.statusText}`);\n }\n return res;\n }\n}\n","/*\n * Public API Surface of scp\n */\n\nexport * from './lib/processors/cli-scp-command-processor';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliScpCommandCommandProcessor } from './lib/processors/cli-scp-command-processor';\nimport { ScpTransferService } from './lib/services/scp-transfer.service';\nimport { IScpTransferService_TOKEN } from './lib/interfaces';\nimport { API_VERSION } from './lib/version';\n\nexport const scpModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-scp',\n processors: [new CliScpCommandCommandProcessor()],\n services: [\n {\n provide: IScpTransferService_TOKEN,\n useValue: new ScpTransferService(),\n },\n ],\n translations: {\n es: { 'cli.scp.description': 'Transferencia de archivos tipo SCP' },\n fr: { 'cli.scp.description': 'Transfert de fichiers de type SCP' },\n de: { 'cli.scp.description': 'SCP-ähnliche Dateiübertragung' },\n pt: { 'cli.scp.description': 'Transferência de arquivos tipo SCP' },\n it: { 'cli.scp.description': 'Trasferimento file di tipo SCP' },\n ja: { 'cli.scp.description': 'SCP風ファイル転送' },\n ko: { 'cli.scp.description': 'SCP 방식 파일 전송' },\n zh: { 'cli.scp.description': 'SCP 风格文件传输' },\n ru: { 'cli.scp.description': 'Передача файлов в стиле SCP' },\n ro: { 'cli.scp.description': 'Transfer de fișiere de tip SCP' },\n },\n};\n"]}
|
package/umd/index.global.js
CHANGED
|
@@ -628,14 +628,14 @@ var scp = (() => {
|
|
|
628
628
|
var require_sort = __commonJS({
|
|
629
629
|
"../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/sort.js"(exports$1, module2) {
|
|
630
630
|
var compareBuild = require_compare_build();
|
|
631
|
-
var sort = (
|
|
631
|
+
var sort = (list2, loose) => list2.sort((a, b) => compareBuild(a, b, loose));
|
|
632
632
|
module2.exports = sort;
|
|
633
633
|
}
|
|
634
634
|
});
|
|
635
635
|
var require_rsort = __commonJS({
|
|
636
636
|
"../../node_modules/.pnpm/semver@7.7.4/node_modules/semver/functions/rsort.js"(exports$1, module2) {
|
|
637
637
|
var compareBuild = require_compare_build();
|
|
638
|
-
var rsort = (
|
|
638
|
+
var rsort = (list2, loose) => list2.sort((a, b) => compareBuild(b, a, loose));
|
|
639
639
|
module2.exports = rsort;
|
|
640
640
|
}
|
|
641
641
|
});
|
|
@@ -1822,10 +1822,22 @@ var scp = (() => {
|
|
|
1822
1822
|
}
|
|
1823
1823
|
});
|
|
1824
1824
|
var ICliFileTransferService_TOKEN = "cli-file-transfer-service";
|
|
1825
|
+
var ICliServerAuthService_TOKEN = "cli-server-auth-service";
|
|
1825
1826
|
function resolveHeaders(provider) {
|
|
1826
1827
|
if (!provider) return {};
|
|
1827
1828
|
return typeof provider === "function" ? provider() : provider;
|
|
1828
1829
|
}
|
|
1830
|
+
function resolveServerHeaders(services, serverName, configHeaders) {
|
|
1831
|
+
if (services) {
|
|
1832
|
+
const authService = services.get(
|
|
1833
|
+
ICliServerAuthService_TOKEN
|
|
1834
|
+
);
|
|
1835
|
+
if (authService) {
|
|
1836
|
+
return authService.getHeaders(serverName, configHeaders);
|
|
1837
|
+
}
|
|
1838
|
+
}
|
|
1839
|
+
return resolveHeaders(configHeaders);
|
|
1840
|
+
}
|
|
1829
1841
|
var DefaultLibraryAuthor = {
|
|
1830
1842
|
name: "Nicolae Lupei",
|
|
1831
1843
|
email: "nicolae.lupei@qodalis.com"
|
|
@@ -2689,7 +2701,7 @@ var scp = (() => {
|
|
|
2689
2701
|
};
|
|
2690
2702
|
|
|
2691
2703
|
// src/lib/version.ts
|
|
2692
|
-
var LIBRARY_VERSION = "2.0.0-beta.
|
|
2704
|
+
var LIBRARY_VERSION = "2.0.0-beta.15";
|
|
2693
2705
|
var API_VERSION2 = 2;
|
|
2694
2706
|
|
|
2695
2707
|
// src/lib/interfaces/index.ts
|
|
@@ -2792,7 +2804,7 @@ var scp = (() => {
|
|
|
2792
2804
|
const entries = await transferService.ls(
|
|
2793
2805
|
serverUrl(server),
|
|
2794
2806
|
path,
|
|
2795
|
-
server.headers
|
|
2807
|
+
resolveServerHeaders(context.services, server.name, server.headers)
|
|
2796
2808
|
);
|
|
2797
2809
|
context.spinner?.hide();
|
|
2798
2810
|
if (entries.length === 0) {
|
|
@@ -2861,7 +2873,7 @@ var scp = (() => {
|
|
|
2861
2873
|
const content = await transferService.cat(
|
|
2862
2874
|
serverUrl(server),
|
|
2863
2875
|
path,
|
|
2864
|
-
server.headers
|
|
2876
|
+
resolveServerHeaders(context.services, server.name, server.headers)
|
|
2865
2877
|
);
|
|
2866
2878
|
context.spinner?.hide();
|
|
2867
2879
|
context.writer.writeln(content);
|
|
@@ -2959,7 +2971,7 @@ var scp = (() => {
|
|
|
2959
2971
|
const { content, size } = await transferService.download(
|
|
2960
2972
|
serverUrl(server),
|
|
2961
2973
|
remotePath,
|
|
2962
|
-
server.headers,
|
|
2974
|
+
resolveServerHeaders(context.services, server.name, server.headers),
|
|
2963
2975
|
(received, total) => {
|
|
2964
2976
|
const now = Date.now();
|
|
2965
2977
|
if (now - lastProgressUpdate < 200) return;
|
|
@@ -3142,7 +3154,7 @@ var scp = (() => {
|
|
|
3142
3154
|
remotePath,
|
|
3143
3155
|
content,
|
|
3144
3156
|
filename,
|
|
3145
|
-
server.headers
|
|
3157
|
+
resolveServerHeaders(context.services, server.name, server.headers)
|
|
3146
3158
|
);
|
|
3147
3159
|
context.spinner?.hide();
|
|
3148
3160
|
context.writer.writeSuccess(
|
|
@@ -3205,7 +3217,7 @@ var scp = (() => {
|
|
|
3205
3217
|
await transferService.rm(
|
|
3206
3218
|
serverUrl(server),
|
|
3207
3219
|
path,
|
|
3208
|
-
server.headers
|
|
3220
|
+
resolveServerHeaders(context.services, server.name, server.headers)
|
|
3209
3221
|
);
|
|
3210
3222
|
context.spinner?.hide();
|
|
3211
3223
|
context.writer.writeSuccess(`Deleted: ${server.name}:${path}`);
|
|
@@ -3262,7 +3274,7 @@ var scp = (() => {
|
|
|
3262
3274
|
await transferService.mkdir(
|
|
3263
3275
|
serverUrl(server),
|
|
3264
3276
|
path,
|
|
3265
|
-
server.headers
|
|
3277
|
+
resolveServerHeaders(context.services, server.name, server.headers)
|
|
3266
3278
|
);
|
|
3267
3279
|
context.spinner?.hide();
|
|
3268
3280
|
context.writer.writeSuccess(`Created directory: ${server.name}:${path}`);
|
|
@@ -3319,7 +3331,7 @@ var scp = (() => {
|
|
|
3319
3331
|
const stat = await transferService.stat(
|
|
3320
3332
|
serverUrl(server),
|
|
3321
3333
|
path,
|
|
3322
|
-
server.headers
|
|
3334
|
+
resolveServerHeaders(context.services, server.name, server.headers)
|
|
3323
3335
|
);
|
|
3324
3336
|
context.spinner?.hide();
|
|
3325
3337
|
const entries = {
|
|
@@ -3416,7 +3428,7 @@ var scp = (() => {
|
|
|
3416
3428
|
const { content, size } = await transferService.download(
|
|
3417
3429
|
serverUrl(server),
|
|
3418
3430
|
remotePath,
|
|
3419
|
-
server.headers,
|
|
3431
|
+
resolveServerHeaders(context.services, server.name, server.headers),
|
|
3420
3432
|
(received, total) => {
|
|
3421
3433
|
const now = Date.now();
|
|
3422
3434
|
if (now - lastProgressUpdate < 200) return;
|
|
@@ -3495,7 +3507,7 @@ var scp = (() => {
|
|
|
3495
3507
|
remotePath,
|
|
3496
3508
|
content,
|
|
3497
3509
|
filename,
|
|
3498
|
-
server.headers
|
|
3510
|
+
resolveServerHeaders(context.services, server.name, server.headers)
|
|
3499
3511
|
);
|
|
3500
3512
|
context.spinner?.hide();
|
|
3501
3513
|
context.writer.writeSuccess(
|