@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qodalis/cli-scp",
3
- "version": "2.0.0-beta.13",
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.13"
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.13";
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.13";
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.13";
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":"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","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.13";
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(
@@ -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"]}
@@ -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 = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose));
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 = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose));
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.13";
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(