@qodalis/cli-scp 2.0.0-beta.11 → 2.0.0-beta.12

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.11",
3
+ "version": "2.0.0-beta.12",
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.11"
21
+ "@qodalis/cli-core": "2.0.0-beta.12"
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.11";
21
+ declare const LIBRARY_VERSION = "2.0.0-beta.12";
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.11";
21
+ declare const LIBRARY_VERSION = "2.0.0-beta.12";
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.11";
8
+ var LIBRARY_VERSION = "2.0.0-beta.12";
9
9
  var API_VERSION = 2;
10
10
 
11
11
  // src/lib/interfaces/index.ts
@@ -265,6 +265,7 @@ var CliScpDownloadProcessor = class {
265
265
  }
266
266
  const useBrowserDownload = command.args?.["save"] === true;
267
267
  context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);
268
+ context.setStatusText(`scp: downloading from ${server.name}`);
268
269
  const abortController = new AbortController();
269
270
  const abortSub = context.onAbort.subscribe(() => abortController.abort());
270
271
  try {
@@ -282,10 +283,12 @@ var CliScpDownloadProcessor = class {
282
283
  context.spinner?.show(
283
284
  `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`
284
285
  );
286
+ context.setStatusText(`scp: download ${pct}%`);
285
287
  } else {
286
288
  context.spinner?.show(
287
289
  `Downloading ${remotePath}... ${formatBytes(received)}`
288
290
  );
291
+ context.setStatusText(`scp: download ${formatBytes(received)}`);
289
292
  }
290
293
  },
291
294
  abortController.signal
@@ -444,6 +447,7 @@ var CliScpUploadProcessor = class {
444
447
  context.spinner?.show(
445
448
  `Uploading "${filename}" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`
446
449
  );
450
+ context.setStatusText(`scp: uploading to ${server.name}`);
447
451
  try {
448
452
  await transferService.upload(
449
453
  serverUrl(server),
@@ -718,6 +722,7 @@ var CliScpCommandCommandProcessor = class {
718
722
  }
719
723
  const useBrowserDownload = command.args?.["save"] === true;
720
724
  context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);
725
+ context.setStatusText(`scp: downloading from ${server.name}`);
721
726
  try {
722
727
  let lastProgressUpdate = 0;
723
728
  const { content, size } = await transferService.download(
@@ -733,10 +738,12 @@ var CliScpCommandCommandProcessor = class {
733
738
  context.spinner?.show(
734
739
  `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`
735
740
  );
741
+ context.setStatusText(`scp: download ${pct}%`);
736
742
  } else {
737
743
  context.spinner?.show(
738
744
  `Downloading ${remotePath}... ${formatBytes(received)}`
739
745
  );
746
+ context.setStatusText(`scp: download ${formatBytes(received)}`);
740
747
  }
741
748
  }
742
749
  );
@@ -782,6 +789,7 @@ var CliScpCommandCommandProcessor = class {
782
789
  return;
783
790
  }
784
791
  context.spinner?.show(`Reading local file "${localPath}"...`);
792
+ context.setStatusText(`scp: reading ${localPath}`);
785
793
  try {
786
794
  const content = await fileService.readFile(localPath);
787
795
  if (content === null) {
@@ -793,6 +801,7 @@ var CliScpCommandCommandProcessor = class {
793
801
  context.spinner?.show(
794
802
  `Uploading "${filename}" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`
795
803
  );
804
+ context.setStatusText(`scp: uploading to ${server.name}`);
796
805
  await transferService.upload(
797
806
  serverUrl(server),
798
807
  remotePath,
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"],"mappings":"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","file":"public-api.js","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.11';\nexport const API_VERSION = 2;\n ","export 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?: Record<string, string>): Promise<IScpFileEntry[]>;\n cat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<string>;\n stat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileStat>;\n download(\n serverUrl: string,\n path: string,\n headers?: Record<string, string>,\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?: Record<string, string>,\n ): Promise<void>;\n mkdir(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void>;\n rm(serverUrl: string, path: string, headers?: Record<string, string>): 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.get<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.get<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.get<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\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 } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n }\n },\n abortController.signal,\n );\n context.spinner?.hide();\n\n if (useBrowserDownload) {\n const fileService = context.services.get<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.get<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.get<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.get<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\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.get<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.get<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.get<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.get<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\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 } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n }\n },\n );\n context.spinner?.hide();\n\n const fileService = context.services.get<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.get<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.get<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\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\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 { IScpFileEntry, IScpFileStat, IScpTransferService } from '../interfaces';\n\nexport class ScpTransferService implements IScpTransferService {\n async ls(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileEntry[]> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/ls?path=${encodeURIComponent(path)}`, {\n headers,\n });\n const data = await res.json();\n return data.entries;\n }\n\n async cat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<string> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/cat?path=${encodeURIComponent(path)}`, {\n headers,\n });\n const data = await res.json();\n return data.content;\n }\n\n async stat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileStat> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/stat?path=${encodeURIComponent(path)}`, {\n headers,\n });\n return await res.json();\n }\n\n async download(\n serverUrl: string,\n path: string,\n headers?: Record<string, string>,\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,\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?: Record<string, string>,\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,\n });\n }\n\n async mkdir(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/mkdir`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify({ path }),\n });\n }\n\n async rm(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/rm?path=${encodeURIComponent(path)}`, {\n method: 'DELETE',\n 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":["ICliFileTransferService_TOKEN","DefaultLibraryAuthor","parts","serverUrl"],"mappings":"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","file":"public-api.js","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-beta.12';\nexport const API_VERSION = 2;\n ","export 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?: Record<string, string>): Promise<IScpFileEntry[]>;\n cat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<string>;\n stat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileStat>;\n download(\n serverUrl: string,\n path: string,\n headers?: Record<string, string>,\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?: Record<string, string>,\n ): Promise<void>;\n mkdir(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void>;\n rm(serverUrl: string, path: string, headers?: Record<string, string>): 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.get<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.get<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.get<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.setStatusText(`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.setStatusText(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.setStatusText(`scp: download ${formatBytes(received)}`);\n }\n },\n abortController.signal,\n );\n context.spinner?.hide();\n\n if (useBrowserDownload) {\n const fileService = context.services.get<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.get<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.get<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.get<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.setStatusText(`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.get<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.get<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.get<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.get<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.setStatusText(`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.setStatusText(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.setStatusText(`scp: download ${formatBytes(received)}`);\n }\n },\n );\n context.spinner?.hide();\n\n const fileService = context.services.get<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.get<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.get<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.setStatusText(`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.setStatusText(`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 { IScpFileEntry, IScpFileStat, IScpTransferService } from '../interfaces';\n\nexport class ScpTransferService implements IScpTransferService {\n async ls(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileEntry[]> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/ls?path=${encodeURIComponent(path)}`, {\n headers,\n });\n const data = await res.json();\n return data.entries;\n }\n\n async cat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<string> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/cat?path=${encodeURIComponent(path)}`, {\n headers,\n });\n const data = await res.json();\n return data.content;\n }\n\n async stat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileStat> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/stat?path=${encodeURIComponent(path)}`, {\n headers,\n });\n return await res.json();\n }\n\n async download(\n serverUrl: string,\n path: string,\n headers?: Record<string, string>,\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,\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?: Record<string, string>,\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,\n });\n }\n\n async mkdir(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/mkdir`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify({ path }),\n });\n }\n\n async rm(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/rm?path=${encodeURIComponent(path)}`, {\n method: 'DELETE',\n 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
@@ -3,7 +3,7 @@ import { DefaultLibraryAuthor, ICliFileTransferService_TOKEN } from '@qodalis/cl
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.11";
6
+ var LIBRARY_VERSION = "2.0.0-beta.12";
7
7
  var API_VERSION = 2;
8
8
 
9
9
  // src/lib/interfaces/index.ts
@@ -263,6 +263,7 @@ var CliScpDownloadProcessor = class {
263
263
  }
264
264
  const useBrowserDownload = command.args?.["save"] === true;
265
265
  context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);
266
+ context.setStatusText(`scp: downloading from ${server.name}`);
266
267
  const abortController = new AbortController();
267
268
  const abortSub = context.onAbort.subscribe(() => abortController.abort());
268
269
  try {
@@ -280,10 +281,12 @@ var CliScpDownloadProcessor = class {
280
281
  context.spinner?.show(
281
282
  `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`
282
283
  );
284
+ context.setStatusText(`scp: download ${pct}%`);
283
285
  } else {
284
286
  context.spinner?.show(
285
287
  `Downloading ${remotePath}... ${formatBytes(received)}`
286
288
  );
289
+ context.setStatusText(`scp: download ${formatBytes(received)}`);
287
290
  }
288
291
  },
289
292
  abortController.signal
@@ -442,6 +445,7 @@ var CliScpUploadProcessor = class {
442
445
  context.spinner?.show(
443
446
  `Uploading "${filename}" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`
444
447
  );
448
+ context.setStatusText(`scp: uploading to ${server.name}`);
445
449
  try {
446
450
  await transferService.upload(
447
451
  serverUrl(server),
@@ -716,6 +720,7 @@ var CliScpCommandCommandProcessor = class {
716
720
  }
717
721
  const useBrowserDownload = command.args?.["save"] === true;
718
722
  context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);
723
+ context.setStatusText(`scp: downloading from ${server.name}`);
719
724
  try {
720
725
  let lastProgressUpdate = 0;
721
726
  const { content, size } = await transferService.download(
@@ -731,10 +736,12 @@ var CliScpCommandCommandProcessor = class {
731
736
  context.spinner?.show(
732
737
  `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`
733
738
  );
739
+ context.setStatusText(`scp: download ${pct}%`);
734
740
  } else {
735
741
  context.spinner?.show(
736
742
  `Downloading ${remotePath}... ${formatBytes(received)}`
737
743
  );
744
+ context.setStatusText(`scp: download ${formatBytes(received)}`);
738
745
  }
739
746
  }
740
747
  );
@@ -780,6 +787,7 @@ var CliScpCommandCommandProcessor = class {
780
787
  return;
781
788
  }
782
789
  context.spinner?.show(`Reading local file "${localPath}"...`);
790
+ context.setStatusText(`scp: reading ${localPath}`);
783
791
  try {
784
792
  const content = await fileService.readFile(localPath);
785
793
  if (content === null) {
@@ -791,6 +799,7 @@ var CliScpCommandCommandProcessor = class {
791
799
  context.spinner?.show(
792
800
  `Uploading "${filename}" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`
793
801
  );
802
+ context.setStatusText(`scp: uploading to ${server.name}`);
794
803
  await transferService.upload(
795
804
  serverUrl(server),
796
805
  remotePath,
@@ -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.11';\nexport const API_VERSION = 2;\n ","export 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?: Record<string, string>): Promise<IScpFileEntry[]>;\n cat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<string>;\n stat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileStat>;\n download(\n serverUrl: string,\n path: string,\n headers?: Record<string, string>,\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?: Record<string, string>,\n ): Promise<void>;\n mkdir(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void>;\n rm(serverUrl: string, path: string, headers?: Record<string, string>): 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.get<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.get<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.get<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\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 } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n }\n },\n abortController.signal,\n );\n context.spinner?.hide();\n\n if (useBrowserDownload) {\n const fileService = context.services.get<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.get<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.get<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.get<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\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.get<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.get<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.get<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.get<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\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 } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n }\n },\n );\n context.spinner?.hide();\n\n const fileService = context.services.get<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.get<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.get<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\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\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 { IScpFileEntry, IScpFileStat, IScpTransferService } from '../interfaces';\n\nexport class ScpTransferService implements IScpTransferService {\n async ls(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileEntry[]> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/ls?path=${encodeURIComponent(path)}`, {\n headers,\n });\n const data = await res.json();\n return data.entries;\n }\n\n async cat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<string> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/cat?path=${encodeURIComponent(path)}`, {\n headers,\n });\n const data = await res.json();\n return data.content;\n }\n\n async stat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileStat> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/stat?path=${encodeURIComponent(path)}`, {\n headers,\n });\n return await res.json();\n }\n\n async download(\n serverUrl: string,\n path: string,\n headers?: Record<string, string>,\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,\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?: Record<string, string>,\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,\n });\n }\n\n async mkdir(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/mkdir`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify({ path }),\n });\n }\n\n async rm(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/rm?path=${encodeURIComponent(path)}`, {\n method: 'DELETE',\n 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":["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.12';\nexport const API_VERSION = 2;\n ","export 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?: Record<string, string>): Promise<IScpFileEntry[]>;\n cat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<string>;\n stat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileStat>;\n download(\n serverUrl: string,\n path: string,\n headers?: Record<string, string>,\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?: Record<string, string>,\n ): Promise<void>;\n mkdir(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void>;\n rm(serverUrl: string, path: string, headers?: Record<string, string>): 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.get<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.get<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.get<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.setStatusText(`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.setStatusText(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.setStatusText(`scp: download ${formatBytes(received)}`);\n }\n },\n abortController.signal,\n );\n context.spinner?.hide();\n\n if (useBrowserDownload) {\n const fileService = context.services.get<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.get<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.get<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.get<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.setStatusText(`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.get<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.get<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.get<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.get<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.setStatusText(`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.setStatusText(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.setStatusText(`scp: download ${formatBytes(received)}`);\n }\n },\n );\n context.spinner?.hide();\n\n const fileService = context.services.get<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.get<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.get<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.setStatusText(`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.setStatusText(`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 { IScpFileEntry, IScpFileStat, IScpTransferService } from '../interfaces';\n\nexport class ScpTransferService implements IScpTransferService {\n async ls(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileEntry[]> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/ls?path=${encodeURIComponent(path)}`, {\n headers,\n });\n const data = await res.json();\n return data.entries;\n }\n\n async cat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<string> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/cat?path=${encodeURIComponent(path)}`, {\n headers,\n });\n const data = await res.json();\n return data.content;\n }\n\n async stat(serverUrl: string, path: string, headers?: Record<string, string>): Promise<IScpFileStat> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/stat?path=${encodeURIComponent(path)}`, {\n headers,\n });\n return await res.json();\n }\n\n async download(\n serverUrl: string,\n path: string,\n headers?: Record<string, string>,\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,\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?: Record<string, string>,\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,\n });\n }\n\n async mkdir(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/mkdir`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...headers },\n body: JSON.stringify({ path }),\n });\n }\n\n async rm(serverUrl: string, path: string, headers?: Record<string, string>): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/rm?path=${encodeURIComponent(path)}`, {\n method: 'DELETE',\n 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"]}
@@ -2682,7 +2682,7 @@ var scp = (() => {
2682
2682
  };
2683
2683
 
2684
2684
  // src/lib/version.ts
2685
- var LIBRARY_VERSION = "2.0.0-beta.11";
2685
+ var LIBRARY_VERSION = "2.0.0-beta.12";
2686
2686
  var API_VERSION2 = 2;
2687
2687
 
2688
2688
  // src/lib/interfaces/index.ts
@@ -2944,6 +2944,7 @@ var scp = (() => {
2944
2944
  }
2945
2945
  const useBrowserDownload = command.args?.["save"] === true;
2946
2946
  context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);
2947
+ context.setStatusText(`scp: downloading from ${server.name}`);
2947
2948
  const abortController = new AbortController();
2948
2949
  const abortSub = context.onAbort.subscribe(() => abortController.abort());
2949
2950
  try {
@@ -2961,10 +2962,12 @@ var scp = (() => {
2961
2962
  context.spinner?.show(
2962
2963
  `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`
2963
2964
  );
2965
+ context.setStatusText(`scp: download ${pct}%`);
2964
2966
  } else {
2965
2967
  context.spinner?.show(
2966
2968
  `Downloading ${remotePath}... ${formatBytes(received)}`
2967
2969
  );
2970
+ context.setStatusText(`scp: download ${formatBytes(received)}`);
2968
2971
  }
2969
2972
  },
2970
2973
  abortController.signal
@@ -3125,6 +3128,7 @@ var scp = (() => {
3125
3128
  context.spinner?.show(
3126
3129
  `Uploading "${filename}" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`
3127
3130
  );
3131
+ context.setStatusText(`scp: uploading to ${server.name}`);
3128
3132
  try {
3129
3133
  await transferService.upload(
3130
3134
  serverUrl(server),
@@ -3399,6 +3403,7 @@ var scp = (() => {
3399
3403
  }
3400
3404
  const useBrowserDownload = command.args?.["save"] === true;
3401
3405
  context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);
3406
+ context.setStatusText(`scp: downloading from ${server.name}`);
3402
3407
  try {
3403
3408
  let lastProgressUpdate = 0;
3404
3409
  const { content, size } = await transferService.download(
@@ -3414,10 +3419,12 @@ var scp = (() => {
3414
3419
  context.spinner?.show(
3415
3420
  `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`
3416
3421
  );
3422
+ context.setStatusText(`scp: download ${pct}%`);
3417
3423
  } else {
3418
3424
  context.spinner?.show(
3419
3425
  `Downloading ${remotePath}... ${formatBytes(received)}`
3420
3426
  );
3427
+ context.setStatusText(`scp: download ${formatBytes(received)}`);
3421
3428
  }
3422
3429
  }
3423
3430
  );
@@ -3463,6 +3470,7 @@ var scp = (() => {
3463
3470
  return;
3464
3471
  }
3465
3472
  context.spinner?.show(`Reading local file "${localPath}"...`);
3473
+ context.setStatusText(`scp: reading ${localPath}`);
3466
3474
  try {
3467
3475
  const content = await fileService.readFile(localPath);
3468
3476
  if (content === null) {
@@ -3474,6 +3482,7 @@ var scp = (() => {
3474
3482
  context.spinner?.show(
3475
3483
  `Uploading "${filename}" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`
3476
3484
  );
3485
+ context.setStatusText(`scp: uploading to ${server.name}`);
3477
3486
  await transferService.upload(
3478
3487
  serverUrl(server),
3479
3488
  remotePath,