@qodalis/cli-scp 2.0.0-rc.1 → 2.0.0-rc.2

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-rc.1",
3
+ "version": "2.0.0-rc.2",
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-rc.1"
21
+ "@qodalis/cli-core": "2.0.0-rc.2"
22
22
  },
23
23
  "sideEffects": false,
24
24
  "main": "./public-api.js",
package/public-api.d.mts CHANGED
@@ -17,7 +17,7 @@ declare class CliScpCommandCommandProcessor implements ICliCommandProcessor {
17
17
  private doUpload;
18
18
  }
19
19
 
20
- declare const LIBRARY_VERSION = "2.0.0-rc.1";
20
+ declare const LIBRARY_VERSION = "2.0.0-rc.2";
21
21
  declare const API_VERSION = 2;
22
22
 
23
23
  declare const scpModule: ICliModule;
package/public-api.d.ts CHANGED
@@ -17,7 +17,7 @@ declare class CliScpCommandCommandProcessor implements ICliCommandProcessor {
17
17
  private doUpload;
18
18
  }
19
19
 
20
- declare const LIBRARY_VERSION = "2.0.0-rc.1";
20
+ declare const LIBRARY_VERSION = "2.0.0-rc.2";
21
21
  declare const API_VERSION = 2;
22
22
 
23
23
  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-rc.1";
8
+ var LIBRARY_VERSION = "2.0.0-rc.2";
9
9
  var API_VERSION = 2;
10
10
  var IScpTransferService_TOKEN = cliCore.createCliToken("scp-transfer-service");
11
11
  function resolveServer(serverName, context) {
@@ -286,7 +286,7 @@ var CliScpDownloadProcessor = class {
286
286
  );
287
287
  context.spinner?.hide();
288
288
  if (useBrowserDownload) {
289
- const fileService = context.services.getRequired(
289
+ const fileService = context.services.get(
290
290
  cliCore.ICliFileTransferService_TOKEN
291
291
  );
292
292
  if (fileService) {
@@ -298,7 +298,7 @@ var CliScpDownloadProcessor = class {
298
298
  context.writer.writeError("File transfer service not available for browser download.");
299
299
  }
300
300
  } else {
301
- const fileService = context.services.getRequired(
301
+ const fileService = context.services.get(
302
302
  cliCore.ICliFileTransferService_TOKEN
303
303
  );
304
304
  if (fileService) {
@@ -400,7 +400,7 @@ var CliScpUploadProcessor = class {
400
400
  }
401
401
  const server = resolveServer(serverName, context);
402
402
  if (!server) return;
403
- const fileService = context.services.getRequired(
403
+ const fileService = context.services.get(
404
404
  cliCore.ICliFileTransferService_TOKEN
405
405
  );
406
406
  if (!fileService) {
@@ -724,7 +724,7 @@ var CliScpCommandCommandProcessor = class {
724
724
  }
725
725
  );
726
726
  context.spinner?.hide();
727
- const fileService = context.services.getRequired(
727
+ const fileService = context.services.get(
728
728
  cliCore.ICliFileTransferService_TOKEN
729
729
  );
730
730
  if (!fileService) {
@@ -750,7 +750,7 @@ var CliScpCommandCommandProcessor = class {
750
750
  async doUpload(serverName, localPath, remotePath, context) {
751
751
  const server = resolveServer(serverName, context);
752
752
  if (!server) return;
753
- const fileService = context.services.getRequired(
753
+ const fileService = context.services.get(
754
754
  cliCore.ICliFileTransferService_TOKEN
755
755
  );
756
756
  if (!fileService) {
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":["createCliToken","splitShellWords","resolveServerHeaders","ICliFileTransferService_TOKEN","DefaultLibraryAuthor","serverUrl","resolveHeaders"],"mappings":"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","file":"public-api.js","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-rc.1';\nexport const API_VERSION = 2;\n ","import { CliHeadersProvider, createCliToken } from '@qodalis/cli-core';\n\nexport const IScpTransferService_TOKEN =\n createCliToken<IScpTransferService>('scp-transfer-service');\n\nexport interface IScpFileEntry {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n permissions?: string;\n}\n\nexport interface IScpFileStat {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n created: string;\n permissions?: string;\n}\n\nexport interface IScpTransferService {\n ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]>;\n cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string>;\n stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat>;\n download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }>;\n upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void>;\n mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n}\n","import { ICliExecutionContext, CliServerConfig, splitShellWords } 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, split\n * like a shell)\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 // Split like a shell: `\"/my dir\"` is one argument\n const parts = splitShellWords(value ?? '');\n if (parts.length === 0) {\n return null;\n }\n if (parts.length < 2) {\n // If only one positional, maybe server is from --server and path is positional\n if (serverArg && parts.length >= 1) {\n return [String(serverArg), parts.join(' ')];\n }\n if (pathArg && parts.length >= 1) {\n return [parts[0], String(pathArg)];\n }\n return null;\n }\n return [parts[0], parts.slice(1).join(' ')];\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpLsProcessor implements ICliCommandChildProcessor {\n command = 'ls';\n description = 'List files and directories on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp ls <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Listing ${path} on ${server.name}...`);\n\n try {\n const entries = await transferService.ls(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n if (entries.length === 0) {\n context.writer.writeInfo(`Directory is empty: ${path}`);\n return;\n }\n\n const headers = ['Name', 'Type', 'Size', 'Modified'];\n const rows = entries.map(entry => [\n entry.name,\n entry.type,\n entry.type === 'file' ? formatBytes(entry.size) : '-',\n entry.modified || '-',\n ]);\n\n context.writer.writeTable(headers, rows);\n context.writer.writeInfo(`${entries.length} item(s)`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to list directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('List files and directories on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpCatProcessor implements ICliCommandChildProcessor {\n command = 'cat';\n description = 'Display contents of a remote file';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp cat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading ${path} on ${server.name}...`);\n\n try {\n const content = await transferService.cat(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeln(content);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to read file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Display the contents of a remote file.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpDownloadProcessor implements ICliCommandChildProcessor {\n command = 'download';\n aliases = ['get'];\n description = 'Download a file from a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters: ICliCommandParameterDescriptor[] = [\n {\n name: 'server',\n description: 'Server name',\n required: false,\n type: 'string',\n },\n {\n name: 'remote-path',\n aliases: ['path'],\n description: 'Remote file path',\n required: false,\n type: 'string',\n },\n {\n name: 'local-path',\n description: 'Local destination path',\n required: false,\n type: 'string',\n },\n {\n name: 'save',\n description: 'Save directly to browser downloads instead of virtual filesystem',\n required: false,\n type: 'boolean',\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n let serverName: string | undefined;\n let remotePath: string | undefined;\n let localPath: string | undefined;\n\n // Try named args first (--server, --remote-path / --path, --local-path)\n if (args['server'] && (args['remote-path'] || args['path'])) {\n serverName = String(args['server']);\n remotePath = String(args['remote-path'] || args['path']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n } else {\n // Fall back to positional\n const parts = command.positionals ?? [];\n if (parts.length === 0) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n localPath = parts[2];\n }\n\n if (!serverName || !remotePath) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n\n localPath = localPath || remotePath.split('/').pop() || 'download';\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n const abortController = new AbortController();\n const abortSub = context.onAbort.subscribe(() => abortController.abort());\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n resolveServerHeaders(context.services, server.name, server.headers),\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n abortController.signal,\n );\n context.spinner?.hide();\n\n if (useBrowserDownload) {\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available for browser download.');\n }\n } else {\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available.');\n }\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n } finally {\n abortSub.unsubscribe();\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Download a file from a remote server.');\n context.writer.writeln('Usage: scp download <server> <remote-path> [local-path]');\n context.writer.writeln(' --save Save directly to browser downloads');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpUploadProcessor implements ICliCommandChildProcessor {\n command = 'upload';\n aliases = ['put'];\n description = 'Upload a file to a remote server (use --local to pick from your machine)';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local-path',\n description: 'Local file path (from virtual filesystem)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'remote-path',\n description: 'Remote destination path',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local',\n description: 'Pick a file from your local machine via browser file picker',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n const useLocalPicker = !!args['local'];\n let serverName: string | undefined;\n let localPath: string | undefined;\n let remotePath: string | undefined;\n\n // Try named args first\n if (args['server'] && args['remote-path']) {\n serverName = String(args['server']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n remotePath = String(args['remote-path']);\n } else {\n // Fall back to positional\n const parts = command.positionals ?? [];\n if (parts.length === 0) {\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 if (useLocalPicker) {\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp upload --local <server> <remote-path>');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n } else {\n if (parts.length < 3) {\n context.writer.writeError('Usage: scp upload <server> <local-path> <remote-path>');\n return;\n }\n serverName = parts[0];\n localPath = parts[1];\n remotePath = parts[2];\n }\n }\n\n if (!serverName || (!useLocalPicker && !localPath) || !remotePath) {\n context.writer.writeError(\n useLocalPicker\n ? 'Usage: scp upload --local <server> <remote-path>'\n : 'Usage: scp upload <server> <local-path> <remote-path>',\n );\n return;\n }\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n let content: string | null;\n let filename: string;\n\n if (useLocalPicker) {\n const picked = await fileService.uploadFromBrowser();\n if (!picked) {\n context.writer.writeln('Upload cancelled.');\n return;\n }\n content = picked.content;\n filename = picked.name;\n } else {\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n content = await fileService.readFile(localPath!);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n filename = localPath!.split('/').pop() || 'file';\n }\n\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n try {\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Upload a file to a remote server.');\n context.writer.writeln('');\n context.writer.writeln('Usage:');\n context.writer.writeln(' scp upload <server> <local-path> <remote-path> Upload from virtual filesystem');\n context.writer.writeln(' scp upload --local <server> <remote-path> Pick from your machine via browser');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpRmProcessor implements ICliCommandChildProcessor {\n command = 'rm';\n description = 'Delete a file on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path to delete',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp rm <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Deleting ${path} on ${server.name}...`);\n\n try {\n await transferService.rm(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Deleted: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to delete file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Delete a file on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpMkdirProcessor implements ICliCommandChildProcessor {\n command = 'mkdir';\n description = 'Create a directory on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path to create',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp mkdir <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Creating directory ${path} on ${server.name}...`);\n\n try {\n await transferService.mkdir(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Created directory: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to create directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Create a directory on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpStatProcessor implements ICliCommandChildProcessor {\n command = 'stat';\n description = 'Show file or directory information on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file or directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp stat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Getting info for ${path} on ${server.name}...`);\n\n try {\n const stat = await transferService.stat(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n const entries: Record<string, string> = {\n Name: stat.name,\n Type: stat.type,\n Size: formatBytes(stat.size),\n Modified: stat.modified || '-',\n Created: stat.created || '-',\n };\n\n if (stat.permissions) {\n entries['Permissions'] = stat.permissions;\n }\n\n context.writer.writeKeyValue(entries);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to get file info');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Show file or directory information on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\nimport { CliScpLsProcessor } from './cli-scp-ls-processor';\nimport { CliScpCatProcessor } from './cli-scp-cat-processor';\nimport { CliScpDownloadProcessor } from './cli-scp-download-processor';\nimport { CliScpUploadProcessor } from './cli-scp-upload-processor';\nimport { CliScpRmProcessor } from './cli-scp-rm-processor';\nimport { CliScpMkdirProcessor } from './cli-scp-mkdir-processor';\nimport { CliScpStatProcessor } from './cli-scp-stat-processor';\n\nexport class CliScpCommandCommandProcessor implements ICliCommandProcessor {\n command = 'scp';\n\n description = 'SCP-like file transfer between browser and remote servers';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n metadata = { icon: '📁', module: 'file management' };\n\n acceptsRawInput = true;\n\n processors: ICliCommandChildProcessor[] = [\n new CliScpLsProcessor(),\n new CliScpCatProcessor(),\n new CliScpDownloadProcessor(),\n new CliScpUploadProcessor(),\n new CliScpRmProcessor(),\n new CliScpMkdirProcessor(),\n new CliScpStatProcessor(),\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n // Arguments split like a shell: `scp srv:\"/my dir/a.txt\" \"b c.txt\"`\n const [first = '', second] = command.positionals ?? [];\n\n if (first && !first.startsWith('-')) {\n // Shorthand: scp myserver:/remote/path [local] => download\n const colonIdx = first.indexOf(':');\n if (colonIdx !== -1) {\n const serverName = first.substring(0, colonIdx);\n const remotePath = first.substring(colonIdx + 1);\n const localPath = second || 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 if (second?.includes(':')) {\n const srvColonIdx = second.indexOf(':');\n const serverName = second.substring(0, srvColonIdx);\n const remotePath = second.substring(srvColonIdx + 1);\n\n if (remotePath) {\n await this.doUpload(serverName, first, remotePath, context);\n return;\n }\n }\n }\n\n // No shorthand matched — show help\n context.executor.showHelp(command, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n }\n\n private async doDownload(\n serverName: string,\n remotePath: string,\n localPath: string,\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n resolveServerHeaders(context.services, server.name, server.headers),\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n );\n context.spinner?.hide();\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n if (useBrowserDownload) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n }\n }\n\n private async doUpload(\n serverName: string,\n localPath: string,\n remotePath: string,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n context.notifier.info(`scp: reading ${localPath}`);\n\n try {\n const content = await fileService.readFile(localPath);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n\n const filename = localPath.split('/').pop() || 'file';\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n}\n","import { CliHeadersProvider, resolveHeaders } from '@qodalis/cli-core';\nimport { IScpFileEntry, IScpFileStat, IScpTransferService } from '../interfaces';\n\nexport class ScpTransferService implements IScpTransferService {\n async ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/ls?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.entries;\n }\n\n async cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/cat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.content;\n }\n\n async stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/stat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n return await res.json();\n }\n\n async download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/download?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n signal,\n });\n\n const contentLength = parseInt(res.headers.get('content-length') || '0', 10);\n const reader = res.body?.getReader();\n\n if (!reader) {\n const text = await res.text();\n return { content: text, size: text.length };\n }\n\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n receivedBytes += value.length;\n onProgress?.(receivedBytes, contentLength);\n }\n\n const combined = new Uint8Array(receivedBytes);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return {\n content: new TextDecoder().decode(combined),\n size: receivedBytes,\n };\n }\n\n async upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void> {\n const formData = new FormData();\n formData.append('path', remotePath);\n formData.append('file', new Blob([content]), filename);\n\n await this._fetch(`${serverUrl}/api/qcli/fs/upload`, {\n method: 'POST',\n body: formData,\n headers: resolveHeaders(headers),\n });\n }\n\n async mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/mkdir`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...resolveHeaders(headers) },\n body: JSON.stringify({ path }),\n });\n }\n\n async rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/rm?path=${encodeURIComponent(path)}`, {\n method: 'DELETE',\n headers: resolveHeaders(headers),\n });\n }\n\n private async _fetch(url: string, init?: RequestInit): Promise<Response> {\n const res = await fetch(url, init);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n if (res.status === 403) {\n throw new Error(`Permission denied: ${body || 'path is not in server\\'s allowed paths'}`);\n }\n if (res.status === 404) {\n throw new Error(`Not found: ${body || 'file or directory does not exist'}`);\n }\n throw new Error(`Server error (${res.status}): ${body || res.statusText}`);\n }\n return res;\n }\n}\n","/*\n * Public API Surface of scp\n */\n\nexport * from './lib/processors/cli-scp-command-processor';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliScpCommandCommandProcessor } from './lib/processors/cli-scp-command-processor';\nimport { ScpTransferService } from './lib/services/scp-transfer.service';\nimport { IScpTransferService_TOKEN } from './lib/interfaces';\nimport { API_VERSION } from './lib/version';\n\nexport const scpModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-scp',\n processors: [new CliScpCommandCommandProcessor()],\n services: [\n {\n provide: IScpTransferService_TOKEN,\n useValue: new ScpTransferService(),\n },\n ],\n translations: {\n es: { 'cli.scp.description': 'Transferencia de archivos tipo SCP' },\n fr: { 'cli.scp.description': 'Transfert de fichiers de type SCP' },\n de: { 'cli.scp.description': 'SCP-ähnliche Dateiübertragung' },\n pt: { 'cli.scp.description': 'Transferência de arquivos tipo SCP' },\n it: { 'cli.scp.description': 'Trasferimento file di tipo SCP' },\n ja: { 'cli.scp.description': 'SCP風ファイル転送' },\n ko: { 'cli.scp.description': 'SCP 방식 파일 전송' },\n zh: { 'cli.scp.description': 'SCP 风格文件传输' },\n ru: { 'cli.scp.description': 'Передача файлов в стиле SCP' },\n ro: { 'cli.scp.description': 'Transfer de fișiere de tip SCP' },\n },\n};\n"]}
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":["createCliToken","splitShellWords","resolveServerHeaders","ICliFileTransferService_TOKEN","DefaultLibraryAuthor","serverUrl","resolveHeaders"],"mappings":"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","file":"public-api.js","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-rc.2';\nexport const API_VERSION = 2;\n ","import { CliHeadersProvider, createCliToken } from '@qodalis/cli-core';\n\nexport const IScpTransferService_TOKEN =\n createCliToken<IScpTransferService>('scp-transfer-service');\n\nexport interface IScpFileEntry {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n permissions?: string;\n}\n\nexport interface IScpFileStat {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n created: string;\n permissions?: string;\n}\n\nexport interface IScpTransferService {\n ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]>;\n cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string>;\n stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat>;\n download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }>;\n upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void>;\n mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n}\n","import { ICliExecutionContext, CliServerConfig, splitShellWords } 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, split\n * like a shell)\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 // Split like a shell: `\"/my dir\"` is one argument\n const parts = splitShellWords(value ?? '');\n if (parts.length === 0) {\n return null;\n }\n if (parts.length < 2) {\n // If only one positional, maybe server is from --server and path is positional\n if (serverArg && parts.length >= 1) {\n return [String(serverArg), parts.join(' ')];\n }\n if (pathArg && parts.length >= 1) {\n return [parts[0], String(pathArg)];\n }\n return null;\n }\n return [parts[0], parts.slice(1).join(' ')];\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpLsProcessor implements ICliCommandChildProcessor {\n command = 'ls';\n description = 'List files and directories on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp ls <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Listing ${path} on ${server.name}...`);\n\n try {\n const entries = await transferService.ls(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n if (entries.length === 0) {\n context.writer.writeInfo(`Directory is empty: ${path}`);\n return;\n }\n\n const headers = ['Name', 'Type', 'Size', 'Modified'];\n const rows = entries.map(entry => [\n entry.name,\n entry.type,\n entry.type === 'file' ? formatBytes(entry.size) : '-',\n entry.modified || '-',\n ]);\n\n context.writer.writeTable(headers, rows);\n context.writer.writeInfo(`${entries.length} item(s)`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to list directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('List files and directories on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpCatProcessor implements ICliCommandChildProcessor {\n command = 'cat';\n description = 'Display contents of a remote file';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp cat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading ${path} on ${server.name}...`);\n\n try {\n const content = await transferService.cat(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeln(content);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to read file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Display the contents of a remote file.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpDownloadProcessor implements ICliCommandChildProcessor {\n command = 'download';\n aliases = ['get'];\n description = 'Download a file from a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters: ICliCommandParameterDescriptor[] = [\n {\n name: 'server',\n description: 'Server name',\n required: false,\n type: 'string',\n },\n {\n name: 'remote-path',\n aliases: ['path'],\n description: 'Remote file path',\n required: false,\n type: 'string',\n },\n {\n name: 'local-path',\n description: 'Local destination path',\n required: false,\n type: 'string',\n },\n {\n name: 'save',\n description: 'Save directly to browser downloads instead of virtual filesystem',\n required: false,\n type: 'boolean',\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n let serverName: string | undefined;\n let remotePath: string | undefined;\n let localPath: string | undefined;\n\n // Try named args first (--server, --remote-path / --path, --local-path)\n if (args['server'] && (args['remote-path'] || args['path'])) {\n serverName = String(args['server']);\n remotePath = String(args['remote-path'] || args['path']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n } else {\n // Fall back to positional\n const parts = command.positionals ?? [];\n if (parts.length === 0) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n localPath = parts[2];\n }\n\n if (!serverName || !remotePath) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n\n localPath = localPath || remotePath.split('/').pop() || 'download';\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n const abortController = new AbortController();\n const abortSub = context.onAbort.subscribe(() => abortController.abort());\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n resolveServerHeaders(context.services, server.name, server.headers),\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n abortController.signal,\n );\n context.spinner?.hide();\n\n if (useBrowserDownload) {\n const fileService = context.services.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 resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpUploadProcessor implements ICliCommandChildProcessor {\n command = 'upload';\n aliases = ['put'];\n description = 'Upload a file to a remote server (use --local to pick from your machine)';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local-path',\n description: 'Local file path (from virtual filesystem)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'remote-path',\n description: 'Remote destination path',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local',\n description: 'Pick a file from your local machine via browser file picker',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n const useLocalPicker = !!args['local'];\n let serverName: string | undefined;\n let localPath: string | undefined;\n let remotePath: string | undefined;\n\n // Try named args first\n if (args['server'] && args['remote-path']) {\n serverName = String(args['server']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n remotePath = String(args['remote-path']);\n } else {\n // Fall back to positional\n const parts = command.positionals ?? [];\n if (parts.length === 0) {\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 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.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n let content: string | null;\n let filename: string;\n\n if (useLocalPicker) {\n const picked = await fileService.uploadFromBrowser();\n if (!picked) {\n context.writer.writeln('Upload cancelled.');\n return;\n }\n content = picked.content;\n filename = picked.name;\n } else {\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n content = await fileService.readFile(localPath!);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n filename = localPath!.split('/').pop() || 'file';\n }\n\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n try {\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Upload a file to a remote server.');\n context.writer.writeln('');\n context.writer.writeln('Usage:');\n context.writer.writeln(' scp upload <server> <local-path> <remote-path> Upload from virtual filesystem');\n context.writer.writeln(' scp upload --local <server> <remote-path> Pick from your machine via browser');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpRmProcessor implements ICliCommandChildProcessor {\n command = 'rm';\n description = 'Delete a file on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path to delete',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp rm <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Deleting ${path} on ${server.name}...`);\n\n try {\n await transferService.rm(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Deleted: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to delete file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Delete a file on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpMkdirProcessor implements ICliCommandChildProcessor {\n command = 'mkdir';\n description = 'Create a directory on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path to create',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp mkdir <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Creating directory ${path} on ${server.name}...`);\n\n try {\n await transferService.mkdir(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Created directory: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to create directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Create a directory on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpStatProcessor implements ICliCommandChildProcessor {\n command = 'stat';\n description = 'Show file or directory information on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file or directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp stat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Getting info for ${path} on ${server.name}...`);\n\n try {\n const stat = await transferService.stat(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n const entries: Record<string, string> = {\n Name: stat.name,\n Type: stat.type,\n Size: formatBytes(stat.size),\n Modified: stat.modified || '-',\n Created: stat.created || '-',\n };\n\n if (stat.permissions) {\n entries['Permissions'] = stat.permissions;\n }\n\n context.writer.writeKeyValue(entries);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to get file info');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Show file or directory information on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\nimport { CliScpLsProcessor } from './cli-scp-ls-processor';\nimport { CliScpCatProcessor } from './cli-scp-cat-processor';\nimport { CliScpDownloadProcessor } from './cli-scp-download-processor';\nimport { CliScpUploadProcessor } from './cli-scp-upload-processor';\nimport { CliScpRmProcessor } from './cli-scp-rm-processor';\nimport { CliScpMkdirProcessor } from './cli-scp-mkdir-processor';\nimport { CliScpStatProcessor } from './cli-scp-stat-processor';\n\nexport class CliScpCommandCommandProcessor implements ICliCommandProcessor {\n command = 'scp';\n\n description = 'SCP-like file transfer between browser and remote servers';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n metadata = { icon: '📁', module: 'file management' };\n\n acceptsRawInput = true;\n\n processors: ICliCommandChildProcessor[] = [\n new CliScpLsProcessor(),\n new CliScpCatProcessor(),\n new CliScpDownloadProcessor(),\n new CliScpUploadProcessor(),\n new CliScpRmProcessor(),\n new CliScpMkdirProcessor(),\n new CliScpStatProcessor(),\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n // Arguments split like a shell: `scp srv:\"/my dir/a.txt\" \"b c.txt\"`\n const [first = '', second] = command.positionals ?? [];\n\n if (first && !first.startsWith('-')) {\n // Shorthand: scp myserver:/remote/path [local] => download\n const colonIdx = first.indexOf(':');\n if (colonIdx !== -1) {\n const serverName = first.substring(0, colonIdx);\n const remotePath = first.substring(colonIdx + 1);\n const localPath = second || 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 if (second?.includes(':')) {\n const srvColonIdx = second.indexOf(':');\n const serverName = second.substring(0, srvColonIdx);\n const remotePath = second.substring(srvColonIdx + 1);\n\n if (remotePath) {\n await this.doUpload(serverName, first, remotePath, context);\n return;\n }\n }\n }\n\n // No shorthand matched — show help\n context.executor.showHelp(command, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n }\n\n private async doDownload(\n serverName: string,\n remotePath: string,\n localPath: string,\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n resolveServerHeaders(context.services, server.name, server.headers),\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n );\n context.spinner?.hide();\n\n const fileService = context.services.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.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n context.notifier.info(`scp: reading ${localPath}`);\n\n try {\n const content = await fileService.readFile(localPath);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n\n const filename = localPath.split('/').pop() || 'file';\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n}\n","import { CliHeadersProvider, resolveHeaders } from '@qodalis/cli-core';\nimport { IScpFileEntry, IScpFileStat, IScpTransferService } from '../interfaces';\n\nexport class ScpTransferService implements IScpTransferService {\n async ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/ls?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.entries;\n }\n\n async cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/cat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.content;\n }\n\n async stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/stat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n return await res.json();\n }\n\n async download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/download?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n signal,\n });\n\n const contentLength = parseInt(res.headers.get('content-length') || '0', 10);\n const reader = res.body?.getReader();\n\n if (!reader) {\n const text = await res.text();\n return { content: text, size: text.length };\n }\n\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n receivedBytes += value.length;\n onProgress?.(receivedBytes, contentLength);\n }\n\n const combined = new Uint8Array(receivedBytes);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return {\n content: new TextDecoder().decode(combined),\n size: receivedBytes,\n };\n }\n\n async upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void> {\n const formData = new FormData();\n formData.append('path', remotePath);\n formData.append('file', new Blob([content]), filename);\n\n await this._fetch(`${serverUrl}/api/qcli/fs/upload`, {\n method: 'POST',\n body: formData,\n headers: resolveHeaders(headers),\n });\n }\n\n async mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/mkdir`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...resolveHeaders(headers) },\n body: JSON.stringify({ path }),\n });\n }\n\n async rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/rm?path=${encodeURIComponent(path)}`, {\n method: 'DELETE',\n headers: resolveHeaders(headers),\n });\n }\n\n private async _fetch(url: string, init?: RequestInit): Promise<Response> {\n const res = await fetch(url, init);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n if (res.status === 403) {\n throw new Error(`Permission denied: ${body || 'path is not in server\\'s allowed paths'}`);\n }\n if (res.status === 404) {\n throw new Error(`Not found: ${body || 'file or directory does not exist'}`);\n }\n throw new Error(`Server error (${res.status}): ${body || res.statusText}`);\n }\n return res;\n }\n}\n","/*\n * Public API Surface of scp\n */\n\nexport * from './lib/processors/cli-scp-command-processor';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliScpCommandCommandProcessor } from './lib/processors/cli-scp-command-processor';\nimport { ScpTransferService } from './lib/services/scp-transfer.service';\nimport { IScpTransferService_TOKEN } from './lib/interfaces';\nimport { API_VERSION } from './lib/version';\n\nexport const scpModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-scp',\n processors: [new CliScpCommandCommandProcessor()],\n services: [\n {\n provide: IScpTransferService_TOKEN,\n useValue: new ScpTransferService(),\n },\n ],\n translations: {\n es: { 'cli.scp.description': 'Transferencia de archivos tipo SCP' },\n fr: { 'cli.scp.description': 'Transfert de fichiers de type SCP' },\n de: { 'cli.scp.description': 'SCP-ähnliche Dateiübertragung' },\n pt: { 'cli.scp.description': 'Transferência de arquivos tipo SCP' },\n it: { 'cli.scp.description': 'Trasferimento file di tipo SCP' },\n ja: { 'cli.scp.description': 'SCP風ファイル転送' },\n ko: { 'cli.scp.description': 'SCP 방식 파일 전송' },\n zh: { 'cli.scp.description': 'SCP 风格文件传输' },\n ru: { 'cli.scp.description': 'Передача файлов в стиле SCP' },\n ro: { 'cli.scp.description': 'Transfer de fișiere de tip SCP' },\n },\n};\n"]}
package/public-api.mjs CHANGED
@@ -3,7 +3,7 @@ import { createCliToken, DefaultLibraryAuthor, resolveServerHeaders, ICliFileTra
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-rc.1";
6
+ var LIBRARY_VERSION = "2.0.0-rc.2";
7
7
  var API_VERSION = 2;
8
8
  var IScpTransferService_TOKEN = createCliToken("scp-transfer-service");
9
9
  function resolveServer(serverName, context) {
@@ -284,7 +284,7 @@ var CliScpDownloadProcessor = class {
284
284
  );
285
285
  context.spinner?.hide();
286
286
  if (useBrowserDownload) {
287
- const fileService = context.services.getRequired(
287
+ const fileService = context.services.get(
288
288
  ICliFileTransferService_TOKEN
289
289
  );
290
290
  if (fileService) {
@@ -296,7 +296,7 @@ var CliScpDownloadProcessor = class {
296
296
  context.writer.writeError("File transfer service not available for browser download.");
297
297
  }
298
298
  } else {
299
- const fileService = context.services.getRequired(
299
+ const fileService = context.services.get(
300
300
  ICliFileTransferService_TOKEN
301
301
  );
302
302
  if (fileService) {
@@ -398,7 +398,7 @@ var CliScpUploadProcessor = class {
398
398
  }
399
399
  const server = resolveServer(serverName, context);
400
400
  if (!server) return;
401
- const fileService = context.services.getRequired(
401
+ const fileService = context.services.get(
402
402
  ICliFileTransferService_TOKEN
403
403
  );
404
404
  if (!fileService) {
@@ -722,7 +722,7 @@ var CliScpCommandCommandProcessor = class {
722
722
  }
723
723
  );
724
724
  context.spinner?.hide();
725
- const fileService = context.services.getRequired(
725
+ const fileService = context.services.get(
726
726
  ICliFileTransferService_TOKEN
727
727
  );
728
728
  if (!fileService) {
@@ -748,7 +748,7 @@ var CliScpCommandCommandProcessor = class {
748
748
  async doUpload(serverName, localPath, remotePath, context) {
749
749
  const server = resolveServer(serverName, context);
750
750
  if (!server) return;
751
- const fileService = context.services.getRequired(
751
+ const fileService = context.services.get(
752
752
  ICliFileTransferService_TOKEN
753
753
  );
754
754
  if (!fileService) {
@@ -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":["resolveServerHeaders","ICliFileTransferService_TOKEN","serverUrl"],"mappings":"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","file":"public-api.mjs","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-rc.1';\nexport const API_VERSION = 2;\n ","import { CliHeadersProvider, createCliToken } from '@qodalis/cli-core';\n\nexport const IScpTransferService_TOKEN =\n createCliToken<IScpTransferService>('scp-transfer-service');\n\nexport interface IScpFileEntry {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n permissions?: string;\n}\n\nexport interface IScpFileStat {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n created: string;\n permissions?: string;\n}\n\nexport interface IScpTransferService {\n ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]>;\n cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string>;\n stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat>;\n download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }>;\n upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void>;\n mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n}\n","import { ICliExecutionContext, CliServerConfig, splitShellWords } 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, split\n * like a shell)\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 // Split like a shell: `\"/my dir\"` is one argument\n const parts = splitShellWords(value ?? '');\n if (parts.length === 0) {\n return null;\n }\n if (parts.length < 2) {\n // If only one positional, maybe server is from --server and path is positional\n if (serverArg && parts.length >= 1) {\n return [String(serverArg), parts.join(' ')];\n }\n if (pathArg && parts.length >= 1) {\n return [parts[0], String(pathArg)];\n }\n return null;\n }\n return [parts[0], parts.slice(1).join(' ')];\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpLsProcessor implements ICliCommandChildProcessor {\n command = 'ls';\n description = 'List files and directories on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp ls <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Listing ${path} on ${server.name}...`);\n\n try {\n const entries = await transferService.ls(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n if (entries.length === 0) {\n context.writer.writeInfo(`Directory is empty: ${path}`);\n return;\n }\n\n const headers = ['Name', 'Type', 'Size', 'Modified'];\n const rows = entries.map(entry => [\n entry.name,\n entry.type,\n entry.type === 'file' ? formatBytes(entry.size) : '-',\n entry.modified || '-',\n ]);\n\n context.writer.writeTable(headers, rows);\n context.writer.writeInfo(`${entries.length} item(s)`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to list directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('List files and directories on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpCatProcessor implements ICliCommandChildProcessor {\n command = 'cat';\n description = 'Display contents of a remote file';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp cat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading ${path} on ${server.name}...`);\n\n try {\n const content = await transferService.cat(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeln(content);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to read file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Display the contents of a remote file.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpDownloadProcessor implements ICliCommandChildProcessor {\n command = 'download';\n aliases = ['get'];\n description = 'Download a file from a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters: ICliCommandParameterDescriptor[] = [\n {\n name: 'server',\n description: 'Server name',\n required: false,\n type: 'string',\n },\n {\n name: 'remote-path',\n aliases: ['path'],\n description: 'Remote file path',\n required: false,\n type: 'string',\n },\n {\n name: 'local-path',\n description: 'Local destination path',\n required: false,\n type: 'string',\n },\n {\n name: 'save',\n description: 'Save directly to browser downloads instead of virtual filesystem',\n required: false,\n type: 'boolean',\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n let serverName: string | undefined;\n let remotePath: string | undefined;\n let localPath: string | undefined;\n\n // Try named args first (--server, --remote-path / --path, --local-path)\n if (args['server'] && (args['remote-path'] || args['path'])) {\n serverName = String(args['server']);\n remotePath = String(args['remote-path'] || args['path']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n } else {\n // Fall back to positional\n const parts = command.positionals ?? [];\n if (parts.length === 0) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n localPath = parts[2];\n }\n\n if (!serverName || !remotePath) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n\n localPath = localPath || remotePath.split('/').pop() || 'download';\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n const abortController = new AbortController();\n const abortSub = context.onAbort.subscribe(() => abortController.abort());\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n resolveServerHeaders(context.services, server.name, server.headers),\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n abortController.signal,\n );\n context.spinner?.hide();\n\n if (useBrowserDownload) {\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available for browser download.');\n }\n } else {\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n if (fileService) {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n } else {\n context.writer.writeError('File transfer service not available.');\n }\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n } finally {\n abortSub.unsubscribe();\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Download a file from a remote server.');\n context.writer.writeln('Usage: scp download <server> <remote-path> [local-path]');\n context.writer.writeln(' --save Save directly to browser downloads');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpUploadProcessor implements ICliCommandChildProcessor {\n command = 'upload';\n aliases = ['put'];\n description = 'Upload a file to a remote server (use --local to pick from your machine)';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local-path',\n description: 'Local file path (from virtual filesystem)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'remote-path',\n description: 'Remote destination path',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local',\n description: 'Pick a file from your local machine via browser file picker',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n const useLocalPicker = !!args['local'];\n let serverName: string | undefined;\n let localPath: string | undefined;\n let remotePath: string | undefined;\n\n // Try named args first\n if (args['server'] && args['remote-path']) {\n serverName = String(args['server']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n remotePath = String(args['remote-path']);\n } else {\n // Fall back to positional\n const parts = command.positionals ?? [];\n if (parts.length === 0) {\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 if (useLocalPicker) {\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp upload --local <server> <remote-path>');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n } else {\n if (parts.length < 3) {\n context.writer.writeError('Usage: scp upload <server> <local-path> <remote-path>');\n return;\n }\n serverName = parts[0];\n localPath = parts[1];\n remotePath = parts[2];\n }\n }\n\n if (!serverName || (!useLocalPicker && !localPath) || !remotePath) {\n context.writer.writeError(\n useLocalPicker\n ? 'Usage: scp upload --local <server> <remote-path>'\n : 'Usage: scp upload <server> <local-path> <remote-path>',\n );\n return;\n }\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n let content: string | null;\n let filename: string;\n\n if (useLocalPicker) {\n const picked = await fileService.uploadFromBrowser();\n if (!picked) {\n context.writer.writeln('Upload cancelled.');\n return;\n }\n content = picked.content;\n filename = picked.name;\n } else {\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n content = await fileService.readFile(localPath!);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n filename = localPath!.split('/').pop() || 'file';\n }\n\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n try {\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Upload a file to a remote server.');\n context.writer.writeln('');\n context.writer.writeln('Usage:');\n context.writer.writeln(' scp upload <server> <local-path> <remote-path> Upload from virtual filesystem');\n context.writer.writeln(' scp upload --local <server> <remote-path> Pick from your machine via browser');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpRmProcessor implements ICliCommandChildProcessor {\n command = 'rm';\n description = 'Delete a file on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path to delete',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp rm <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Deleting ${path} on ${server.name}...`);\n\n try {\n await transferService.rm(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Deleted: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to delete file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Delete a file on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpMkdirProcessor implements ICliCommandChildProcessor {\n command = 'mkdir';\n description = 'Create a directory on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path to create',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp mkdir <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Creating directory ${path} on ${server.name}...`);\n\n try {\n await transferService.mkdir(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Created directory: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to create directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Create a directory on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpStatProcessor implements ICliCommandChildProcessor {\n command = 'stat';\n description = 'Show file or directory information on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file or directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp stat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Getting info for ${path} on ${server.name}...`);\n\n try {\n const stat = await transferService.stat(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n const entries: Record<string, string> = {\n Name: stat.name,\n Type: stat.type,\n Size: formatBytes(stat.size),\n Modified: stat.modified || '-',\n Created: stat.created || '-',\n };\n\n if (stat.permissions) {\n entries['Permissions'] = stat.permissions;\n }\n\n context.writer.writeKeyValue(entries);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to get file info');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Show file or directory information on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\nimport { CliScpLsProcessor } from './cli-scp-ls-processor';\nimport { CliScpCatProcessor } from './cli-scp-cat-processor';\nimport { CliScpDownloadProcessor } from './cli-scp-download-processor';\nimport { CliScpUploadProcessor } from './cli-scp-upload-processor';\nimport { CliScpRmProcessor } from './cli-scp-rm-processor';\nimport { CliScpMkdirProcessor } from './cli-scp-mkdir-processor';\nimport { CliScpStatProcessor } from './cli-scp-stat-processor';\n\nexport class CliScpCommandCommandProcessor implements ICliCommandProcessor {\n command = 'scp';\n\n description = 'SCP-like file transfer between browser and remote servers';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n metadata = { icon: '📁', module: 'file management' };\n\n acceptsRawInput = true;\n\n processors: ICliCommandChildProcessor[] = [\n new CliScpLsProcessor(),\n new CliScpCatProcessor(),\n new CliScpDownloadProcessor(),\n new CliScpUploadProcessor(),\n new CliScpRmProcessor(),\n new CliScpMkdirProcessor(),\n new CliScpStatProcessor(),\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n // Arguments split like a shell: `scp srv:\"/my dir/a.txt\" \"b c.txt\"`\n const [first = '', second] = command.positionals ?? [];\n\n if (first && !first.startsWith('-')) {\n // Shorthand: scp myserver:/remote/path [local] => download\n const colonIdx = first.indexOf(':');\n if (colonIdx !== -1) {\n const serverName = first.substring(0, colonIdx);\n const remotePath = first.substring(colonIdx + 1);\n const localPath = second || 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 if (second?.includes(':')) {\n const srvColonIdx = second.indexOf(':');\n const serverName = second.substring(0, srvColonIdx);\n const remotePath = second.substring(srvColonIdx + 1);\n\n if (remotePath) {\n await this.doUpload(serverName, first, remotePath, context);\n return;\n }\n }\n }\n\n // No shorthand matched — show help\n context.executor.showHelp(command, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n }\n\n private async doDownload(\n serverName: string,\n remotePath: string,\n localPath: string,\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n resolveServerHeaders(context.services, server.name, server.headers),\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n );\n context.spinner?.hide();\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n if (useBrowserDownload) {\n fileService.downloadToBrowser(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to browser downloads as \"${localPath}\"`,\n );\n } else {\n await fileService.writeFile(localPath, content);\n context.writer.writeSuccess(\n `Downloaded ${formatBytes(size)} to \"${localPath}\"`,\n );\n }\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Download failed');\n }\n }\n\n private async doUpload(\n serverName: string,\n localPath: string,\n remotePath: string,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const fileService = context.services.getRequired<ICliFileTransferService>(\n ICliFileTransferService_TOKEN,\n );\n\n if (!fileService) {\n context.writer.writeError('File transfer service not available.');\n return;\n }\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n context.notifier.info(`scp: reading ${localPath}`);\n\n try {\n const content = await fileService.readFile(localPath);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n\n const filename = localPath.split('/').pop() || 'file';\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n}\n","import { CliHeadersProvider, resolveHeaders } from '@qodalis/cli-core';\nimport { IScpFileEntry, IScpFileStat, IScpTransferService } from '../interfaces';\n\nexport class ScpTransferService implements IScpTransferService {\n async ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/ls?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.entries;\n }\n\n async cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/cat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.content;\n }\n\n async stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/stat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n return await res.json();\n }\n\n async download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/download?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n signal,\n });\n\n const contentLength = parseInt(res.headers.get('content-length') || '0', 10);\n const reader = res.body?.getReader();\n\n if (!reader) {\n const text = await res.text();\n return { content: text, size: text.length };\n }\n\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n receivedBytes += value.length;\n onProgress?.(receivedBytes, contentLength);\n }\n\n const combined = new Uint8Array(receivedBytes);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return {\n content: new TextDecoder().decode(combined),\n size: receivedBytes,\n };\n }\n\n async upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void> {\n const formData = new FormData();\n formData.append('path', remotePath);\n formData.append('file', new Blob([content]), filename);\n\n await this._fetch(`${serverUrl}/api/qcli/fs/upload`, {\n method: 'POST',\n body: formData,\n headers: resolveHeaders(headers),\n });\n }\n\n async mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/mkdir`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...resolveHeaders(headers) },\n body: JSON.stringify({ path }),\n });\n }\n\n async rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/rm?path=${encodeURIComponent(path)}`, {\n method: 'DELETE',\n headers: resolveHeaders(headers),\n });\n }\n\n private async _fetch(url: string, init?: RequestInit): Promise<Response> {\n const res = await fetch(url, init);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n if (res.status === 403) {\n throw new Error(`Permission denied: ${body || 'path is not in server\\'s allowed paths'}`);\n }\n if (res.status === 404) {\n throw new Error(`Not found: ${body || 'file or directory does not exist'}`);\n }\n throw new Error(`Server error (${res.status}): ${body || res.statusText}`);\n }\n return res;\n }\n}\n","/*\n * Public API Surface of scp\n */\n\nexport * from './lib/processors/cli-scp-command-processor';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliScpCommandCommandProcessor } from './lib/processors/cli-scp-command-processor';\nimport { ScpTransferService } from './lib/services/scp-transfer.service';\nimport { IScpTransferService_TOKEN } from './lib/interfaces';\nimport { API_VERSION } from './lib/version';\n\nexport const scpModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-scp',\n processors: [new CliScpCommandCommandProcessor()],\n services: [\n {\n provide: IScpTransferService_TOKEN,\n useValue: new ScpTransferService(),\n },\n ],\n translations: {\n es: { 'cli.scp.description': 'Transferencia de archivos tipo SCP' },\n fr: { 'cli.scp.description': 'Transfert de fichiers de type SCP' },\n de: { 'cli.scp.description': 'SCP-ähnliche Dateiübertragung' },\n pt: { 'cli.scp.description': 'Transferência de arquivos tipo SCP' },\n it: { 'cli.scp.description': 'Trasferimento file di tipo SCP' },\n ja: { 'cli.scp.description': 'SCP風ファイル転送' },\n ko: { 'cli.scp.description': 'SCP 방식 파일 전송' },\n zh: { 'cli.scp.description': 'SCP 风格文件传输' },\n ru: { 'cli.scp.description': 'Передача файлов в стиле SCP' },\n ro: { 'cli.scp.description': 'Transfer de fișiere de tip SCP' },\n },\n};\n"]}
1
+ {"version":3,"sources":["../../packages/plugins/scp/src/lib/version.ts","../../packages/plugins/scp/src/lib/interfaces/index.ts","../../packages/plugins/scp/src/lib/processors/scp-utils.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-ls-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-cat-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-download-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-upload-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-rm-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-mkdir-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-stat-processor.ts","../../packages/plugins/scp/src/lib/processors/cli-scp-command-processor.ts","../../packages/plugins/scp/src/lib/services/scp-transfer.service.ts","../../packages/plugins/scp/src/public-api.ts"],"names":["resolveServerHeaders","ICliFileTransferService_TOKEN","serverUrl"],"mappings":"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","file":"public-api.mjs","sourcesContent":["\n// Automatically generated during build\nexport const LIBRARY_VERSION = '2.0.0-rc.2';\nexport const API_VERSION = 2;\n ","import { CliHeadersProvider, createCliToken } from '@qodalis/cli-core';\n\nexport const IScpTransferService_TOKEN =\n createCliToken<IScpTransferService>('scp-transfer-service');\n\nexport interface IScpFileEntry {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n permissions?: string;\n}\n\nexport interface IScpFileStat {\n name: string;\n type: 'file' | 'directory';\n size: number;\n modified: string;\n created: string;\n permissions?: string;\n}\n\nexport interface IScpTransferService {\n ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]>;\n cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string>;\n stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat>;\n download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }>;\n upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void>;\n mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void>;\n}\n","import { ICliExecutionContext, CliServerConfig, splitShellWords } 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, split\n * like a shell)\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 // Split like a shell: `\"/my dir\"` is one argument\n const parts = splitShellWords(value ?? '');\n if (parts.length === 0) {\n return null;\n }\n if (parts.length < 2) {\n // If only one positional, maybe server is from --server and path is positional\n if (serverArg && parts.length >= 1) {\n return [String(serverArg), parts.join(' ')];\n }\n if (pathArg && parts.length >= 1) {\n return [parts[0], String(pathArg)];\n }\n return null;\n }\n return [parts[0], parts.slice(1).join(' ')];\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpLsProcessor implements ICliCommandChildProcessor {\n command = 'ls';\n description = 'List files and directories on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp ls <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Listing ${path} on ${server.name}...`);\n\n try {\n const entries = await transferService.ls(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n if (entries.length === 0) {\n context.writer.writeInfo(`Directory is empty: ${path}`);\n return;\n }\n\n const headers = ['Name', 'Type', 'Size', 'Modified'];\n const rows = entries.map(entry => [\n entry.name,\n entry.type,\n entry.type === 'file' ? formatBytes(entry.size) : '-',\n entry.modified || '-',\n ]);\n\n context.writer.writeTable(headers, rows);\n context.writer.writeInfo(`${entries.length} item(s)`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to list directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('List files and directories on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpCatProcessor implements ICliCommandChildProcessor {\n command = 'cat';\n description = 'Display contents of a remote file';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp cat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading ${path} on ${server.name}...`);\n\n try {\n const content = await transferService.cat(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeln(content);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to read file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Display the contents of a remote file.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliCommandParameterDescriptor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpDownloadProcessor implements ICliCommandChildProcessor {\n command = 'download';\n aliases = ['get'];\n description = 'Download a file from a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters: ICliCommandParameterDescriptor[] = [\n {\n name: 'server',\n description: 'Server name',\n required: false,\n type: 'string',\n },\n {\n name: 'remote-path',\n aliases: ['path'],\n description: 'Remote file path',\n required: false,\n type: 'string',\n },\n {\n name: 'local-path',\n description: 'Local destination path',\n required: false,\n type: 'string',\n },\n {\n name: 'save',\n description: 'Save directly to browser downloads instead of virtual filesystem',\n required: false,\n type: 'boolean',\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n let serverName: string | undefined;\n let remotePath: string | undefined;\n let localPath: string | undefined;\n\n // Try named args first (--server, --remote-path / --path, --local-path)\n if (args['server'] && (args['remote-path'] || args['path'])) {\n serverName = String(args['server']);\n remotePath = String(args['remote-path'] || args['path']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n } else {\n // Fall back to positional\n const parts = command.positionals ?? [];\n if (parts.length === 0) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n if (parts.length < 2) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n serverName = parts[0];\n remotePath = parts[1];\n localPath = parts[2];\n }\n\n if (!serverName || !remotePath) {\n context.writer.writeError('Usage: scp download <server> <remote-path> [local-path]');\n return;\n }\n\n localPath = localPath || remotePath.split('/').pop() || 'download';\n\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n const abortController = new AbortController();\n const abortSub = context.onAbort.subscribe(() => abortController.abort());\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n resolveServerHeaders(context.services, server.name, server.headers),\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n abortController.signal,\n );\n context.spinner?.hide();\n\n if (useBrowserDownload) {\n const fileService = context.services.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 resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\n\nexport class CliScpUploadProcessor implements ICliCommandChildProcessor {\n command = 'upload';\n aliases = ['put'];\n description = 'Upload a file to a remote server (use --local to pick from your machine)';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local-path',\n description: 'Local file path (from virtual filesystem)',\n required: false,\n type: 'string' as const,\n },\n {\n name: 'remote-path',\n description: 'Remote destination path',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'local',\n description: 'Pick a file from your local machine via browser file picker',\n required: false,\n type: 'boolean' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const args = command.args || {};\n const useLocalPicker = !!args['local'];\n let serverName: string | undefined;\n let localPath: string | undefined;\n let remotePath: string | undefined;\n\n // Try named args first\n if (args['server'] && args['remote-path']) {\n serverName = String(args['server']);\n localPath = args['local-path'] ? String(args['local-path']) : undefined;\n remotePath = String(args['remote-path']);\n } else {\n // Fall back to positional\n const parts = command.positionals ?? [];\n if (parts.length === 0) {\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 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.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n let content: string | null;\n let filename: string;\n\n if (useLocalPicker) {\n const picked = await fileService.uploadFromBrowser();\n if (!picked) {\n context.writer.writeln('Upload cancelled.');\n return;\n }\n content = picked.content;\n filename = picked.name;\n } else {\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n content = await fileService.readFile(localPath!);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n filename = localPath!.split('/').pop() || 'file';\n }\n\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n try {\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Upload a file to a remote server.');\n context.writer.writeln('');\n context.writer.writeln('Usage:');\n context.writer.writeln(' scp upload <server> <local-path> <remote-path> Upload from virtual filesystem');\n context.writer.writeln(' scp upload --local <server> <remote-path> Pick from your machine via browser');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpRmProcessor implements ICliCommandChildProcessor {\n command = 'rm';\n description = 'Delete a file on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file path to delete',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp rm <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Deleting ${path} on ${server.name}...`);\n\n try {\n await transferService.rm(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Deleted: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to delete file');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Delete a file on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, parseServerAndPath } from './scp-utils';\n\nexport class CliScpMkdirProcessor implements ICliCommandChildProcessor {\n command = 'mkdir';\n description = 'Create a directory on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote directory path to create',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp mkdir <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Creating directory ${path} on ${server.name}...`);\n\n try {\n await transferService.mkdir(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(`Created directory: ${server.name}:${path}`);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to create directory');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Create a directory on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes, parseServerAndPath } from './scp-utils';\n\nexport class CliScpStatProcessor implements ICliCommandChildProcessor {\n command = 'stat';\n description = 'Show file or directory information on a remote server';\n acceptsRawInput = true;\n valueRequired = true;\n parent?: ICliCommandProcessor;\n\n parameters = [\n {\n name: 'server',\n description: 'Server name',\n required: true,\n type: 'string' as const,\n },\n {\n name: 'path',\n description: 'Remote file or directory path',\n required: true,\n type: 'string' as const,\n },\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const parsed = parseServerAndPath(command.value, context, command.args);\n if (!parsed) {\n context.writer.writeError('Usage: scp stat <server> <path>');\n return;\n }\n\n const [serverName, path] = parsed;\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Getting info for ${path} on ${server.name}...`);\n\n try {\n const stat = await transferService.stat(\n serverUrl(server),\n path,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n const entries: Record<string, string> = {\n Name: stat.name,\n Type: stat.type,\n Size: formatBytes(stat.size),\n Modified: stat.modified || '-',\n Created: stat.created || '-',\n };\n\n if (stat.permissions) {\n entries['Permissions'] = stat.permissions;\n }\n\n context.writer.writeKeyValue(entries);\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Failed to get file info');\n }\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln('Show file or directory information on a remote server.');\n }\n}\n","import {\n CliProcessCommand,\n DefaultLibraryAuthor,\n ICliCommandProcessor,\n ICliCommandChildProcessor,\n ICliExecutionContext,\n ICliFileTransferService,\n ICliFileTransferService_TOKEN,\n resolveServerHeaders,\n} from '@qodalis/cli-core';\nimport { LIBRARY_VERSION } from '../version';\nimport { IScpTransferService, IScpTransferService_TOKEN } from '../interfaces';\nimport { resolveServer, serverUrl, formatBytes } from './scp-utils';\nimport { CliScpLsProcessor } from './cli-scp-ls-processor';\nimport { CliScpCatProcessor } from './cli-scp-cat-processor';\nimport { CliScpDownloadProcessor } from './cli-scp-download-processor';\nimport { CliScpUploadProcessor } from './cli-scp-upload-processor';\nimport { CliScpRmProcessor } from './cli-scp-rm-processor';\nimport { CliScpMkdirProcessor } from './cli-scp-mkdir-processor';\nimport { CliScpStatProcessor } from './cli-scp-stat-processor';\n\nexport class CliScpCommandCommandProcessor implements ICliCommandProcessor {\n command = 'scp';\n\n description = 'SCP-like file transfer between browser and remote servers';\n\n author = DefaultLibraryAuthor;\n\n version = LIBRARY_VERSION;\n\n metadata = { icon: '📁', module: 'file management' };\n\n acceptsRawInput = true;\n\n processors: ICliCommandChildProcessor[] = [\n new CliScpLsProcessor(),\n new CliScpCatProcessor(),\n new CliScpDownloadProcessor(),\n new CliScpUploadProcessor(),\n new CliScpRmProcessor(),\n new CliScpMkdirProcessor(),\n new CliScpStatProcessor(),\n ];\n\n async processCommand(\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n // Arguments split like a shell: `scp srv:\"/my dir/a.txt\" \"b c.txt\"`\n const [first = '', second] = command.positionals ?? [];\n\n if (first && !first.startsWith('-')) {\n // Shorthand: scp myserver:/remote/path [local] => download\n const colonIdx = first.indexOf(':');\n if (colonIdx !== -1) {\n const serverName = first.substring(0, colonIdx);\n const remotePath = first.substring(colonIdx + 1);\n const localPath = second || 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 if (second?.includes(':')) {\n const srvColonIdx = second.indexOf(':');\n const serverName = second.substring(0, srvColonIdx);\n const remotePath = second.substring(srvColonIdx + 1);\n\n if (remotePath) {\n await this.doUpload(serverName, first, remotePath, context);\n return;\n }\n }\n }\n\n // No shorthand matched — show help\n context.executor.showHelp(command, context);\n }\n\n writeDescription(context: ICliExecutionContext): void {\n context.writer.writeln(this.description!);\n }\n\n private async doDownload(\n serverName: string,\n remotePath: string,\n localPath: string,\n command: CliProcessCommand,\n context: ICliExecutionContext,\n ): Promise<void> {\n const server = resolveServer(serverName, context);\n if (!server) return;\n\n const transferService = context.services.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n const useBrowserDownload = command.args?.['save'] === true;\n\n context.spinner?.show(`Downloading ${remotePath} from ${server.name}...`);\n context.notifier.info(`scp: downloading from ${server.name}`);\n\n try {\n let lastProgressUpdate = 0;\n const { content, size } = await transferService.download(\n serverUrl(server),\n remotePath,\n resolveServerHeaders(context.services, server.name, server.headers),\n (received, total) => {\n const now = Date.now();\n if (now - lastProgressUpdate < 200) return;\n lastProgressUpdate = now;\n\n if (total > 0) {\n const pct = Math.round((received / total) * 100);\n context.spinner?.show(\n `Downloading ${remotePath}... ${pct}% (${formatBytes(received)}/${formatBytes(total)})`,\n );\n context.notifier.info(`scp: download ${pct}%`);\n } else {\n context.spinner?.show(\n `Downloading ${remotePath}... ${formatBytes(received)}`,\n );\n context.notifier.info(`scp: download ${formatBytes(received)}`);\n }\n },\n );\n context.spinner?.hide();\n\n const fileService = context.services.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.getRequired<IScpTransferService>(\n IScpTransferService_TOKEN,\n );\n\n if (!transferService) {\n context.writer.writeError('SCP transfer service not available.');\n return;\n }\n\n context.spinner?.show(`Reading local file \"${localPath}\"...`);\n context.notifier.info(`scp: reading ${localPath}`);\n\n try {\n const content = await fileService.readFile(localPath);\n if (content === null) {\n context.spinner?.hide();\n context.writer.writeError(`Local file not found: ${localPath}`);\n return;\n }\n\n const filename = localPath.split('/').pop() || 'file';\n context.spinner?.show(\n `Uploading \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}...`,\n );\n context.notifier.info(`scp: uploading to ${server.name}`);\n\n await transferService.upload(\n serverUrl(server),\n remotePath,\n content,\n filename,\n resolveServerHeaders(context.services, server.name, server.headers),\n );\n context.spinner?.hide();\n\n context.writer.writeSuccess(\n `Uploaded \"${filename}\" (${formatBytes(content.length)}) to ${server.name}:${remotePath}`,\n );\n } catch (err: any) {\n context.spinner?.hide();\n context.writer.writeError(err.message || 'Upload failed');\n }\n }\n}\n","import { CliHeadersProvider, resolveHeaders } from '@qodalis/cli-core';\nimport { IScpFileEntry, IScpFileStat, IScpTransferService } from '../interfaces';\n\nexport class ScpTransferService implements IScpTransferService {\n async ls(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileEntry[]> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/ls?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.entries;\n }\n\n async cat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<string> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/cat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n const data = await res.json();\n return data.content;\n }\n\n async stat(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<IScpFileStat> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/stat?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n });\n return await res.json();\n }\n\n async download(\n serverUrl: string,\n path: string,\n headers?: CliHeadersProvider,\n onProgress?: (received: number, total: number) => void,\n signal?: AbortSignal,\n ): Promise<{ content: string; size: number }> {\n const res = await this._fetch(`${serverUrl}/api/qcli/fs/download?path=${encodeURIComponent(path)}`, {\n headers: resolveHeaders(headers),\n signal,\n });\n\n const contentLength = parseInt(res.headers.get('content-length') || '0', 10);\n const reader = res.body?.getReader();\n\n if (!reader) {\n const text = await res.text();\n return { content: text, size: text.length };\n }\n\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n receivedBytes += value.length;\n onProgress?.(receivedBytes, contentLength);\n }\n\n const combined = new Uint8Array(receivedBytes);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return {\n content: new TextDecoder().decode(combined),\n size: receivedBytes,\n };\n }\n\n async upload(\n serverUrl: string,\n remotePath: string,\n content: string,\n filename: string,\n headers?: CliHeadersProvider,\n ): Promise<void> {\n const formData = new FormData();\n formData.append('path', remotePath);\n formData.append('file', new Blob([content]), filename);\n\n await this._fetch(`${serverUrl}/api/qcli/fs/upload`, {\n method: 'POST',\n body: formData,\n headers: resolveHeaders(headers),\n });\n }\n\n async mkdir(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/mkdir`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', ...resolveHeaders(headers) },\n body: JSON.stringify({ path }),\n });\n }\n\n async rm(serverUrl: string, path: string, headers?: CliHeadersProvider): Promise<void> {\n await this._fetch(`${serverUrl}/api/qcli/fs/rm?path=${encodeURIComponent(path)}`, {\n method: 'DELETE',\n headers: resolveHeaders(headers),\n });\n }\n\n private async _fetch(url: string, init?: RequestInit): Promise<Response> {\n const res = await fetch(url, init);\n if (!res.ok) {\n const body = await res.text().catch(() => '');\n if (res.status === 403) {\n throw new Error(`Permission denied: ${body || 'path is not in server\\'s allowed paths'}`);\n }\n if (res.status === 404) {\n throw new Error(`Not found: ${body || 'file or directory does not exist'}`);\n }\n throw new Error(`Server error (${res.status}): ${body || res.statusText}`);\n }\n return res;\n }\n}\n","/*\n * Public API Surface of scp\n */\n\nexport * from './lib/processors/cli-scp-command-processor';\nexport * from './lib/version';\n\nimport { ICliModule } from '@qodalis/cli-core';\nimport { CliScpCommandCommandProcessor } from './lib/processors/cli-scp-command-processor';\nimport { ScpTransferService } from './lib/services/scp-transfer.service';\nimport { IScpTransferService_TOKEN } from './lib/interfaces';\nimport { API_VERSION } from './lib/version';\n\nexport const scpModule: ICliModule = {\n apiVersion: API_VERSION,\n name: '@qodalis/cli-scp',\n processors: [new CliScpCommandCommandProcessor()],\n services: [\n {\n provide: IScpTransferService_TOKEN,\n useValue: new ScpTransferService(),\n },\n ],\n translations: {\n es: { 'cli.scp.description': 'Transferencia de archivos tipo SCP' },\n fr: { 'cli.scp.description': 'Transfert de fichiers de type SCP' },\n de: { 'cli.scp.description': 'SCP-ähnliche Dateiübertragung' },\n pt: { 'cli.scp.description': 'Transferência de arquivos tipo SCP' },\n it: { 'cli.scp.description': 'Trasferimento file di tipo SCP' },\n ja: { 'cli.scp.description': 'SCP風ファイル転送' },\n ko: { 'cli.scp.description': 'SCP 방식 파일 전송' },\n zh: { 'cli.scp.description': 'SCP 风格文件传输' },\n ru: { 'cli.scp.description': 'Передача файлов в стиле SCP' },\n ro: { 'cli.scp.description': 'Transfer de fișiere de tip SCP' },\n },\n};\n"]}
@@ -2836,7 +2836,7 @@ var scp = (() => {
2836
2836
  };
2837
2837
 
2838
2838
  // src/lib/version.ts
2839
- var LIBRARY_VERSION = "2.0.0-rc.1";
2839
+ var LIBRARY_VERSION = "2.0.0-rc.2";
2840
2840
  var API_VERSION2 = 2;
2841
2841
 
2842
2842
  // src/lib/interfaces/index.ts
@@ -3127,7 +3127,7 @@ var scp = (() => {
3127
3127
  );
3128
3128
  context.spinner?.hide();
3129
3129
  if (useBrowserDownload) {
3130
- const fileService = context.services.getRequired(
3130
+ const fileService = context.services.get(
3131
3131
  ICliFileTransferService_TOKEN
3132
3132
  );
3133
3133
  if (fileService) {
@@ -3139,7 +3139,7 @@ var scp = (() => {
3139
3139
  context.writer.writeError("File transfer service not available for browser download.");
3140
3140
  }
3141
3141
  } else {
3142
- const fileService = context.services.getRequired(
3142
+ const fileService = context.services.get(
3143
3143
  ICliFileTransferService_TOKEN
3144
3144
  );
3145
3145
  if (fileService) {
@@ -3243,7 +3243,7 @@ var scp = (() => {
3243
3243
  }
3244
3244
  const server = resolveServer(serverName, context);
3245
3245
  if (!server) return;
3246
- const fileService = context.services.getRequired(
3246
+ const fileService = context.services.get(
3247
3247
  ICliFileTransferService_TOKEN
3248
3248
  );
3249
3249
  if (!fileService) {
@@ -3573,7 +3573,7 @@ var scp = (() => {
3573
3573
  }
3574
3574
  );
3575
3575
  context.spinner?.hide();
3576
- const fileService = context.services.getRequired(
3576
+ const fileService = context.services.get(
3577
3577
  ICliFileTransferService_TOKEN
3578
3578
  );
3579
3579
  if (!fileService) {
@@ -3599,7 +3599,7 @@ var scp = (() => {
3599
3599
  async doUpload(serverName, localPath, remotePath, context) {
3600
3600
  const server = resolveServer(serverName, context);
3601
3601
  if (!server) return;
3602
- const fileService = context.services.getRequired(
3602
+ const fileService = context.services.get(
3603
3603
  ICliFileTransferService_TOKEN
3604
3604
  );
3605
3605
  if (!fileService) {