@silasfmartins/testhub 1.0.0

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.
Files changed (296) hide show
  1. package/.github/copilot-instructions.md +520 -0
  2. package/biome.json +37 -0
  3. package/dist/index.d.ts +45 -0
  4. package/dist/index.js +169 -0
  5. package/dist/scripts/consumer-postinstall.d.ts +15 -0
  6. package/dist/scripts/consumer-postinstall.js +785 -0
  7. package/dist/scripts/generate-docs.d.ts +16 -0
  8. package/dist/scripts/generate-docs.js +1363 -0
  9. package/dist/scripts/generate-index.d.ts +2 -0
  10. package/dist/scripts/generate-index.js +314 -0
  11. package/dist/scripts/init-api.d.ts +2 -0
  12. package/dist/scripts/init-api.js +525 -0
  13. package/dist/scripts/init-banco.d.ts +2 -0
  14. package/dist/scripts/init-banco.js +347 -0
  15. package/dist/scripts/init-frontend.d.ts +2 -0
  16. package/dist/scripts/init-frontend.js +627 -0
  17. package/dist/scripts/init-mobile.d.ts +2 -0
  18. package/dist/scripts/init-mobile.js +481 -0
  19. package/dist/scripts/init-scenarios.d.ts +2 -0
  20. package/dist/scripts/init-scenarios.js +846 -0
  21. package/dist/scripts/init-ssh.d.ts +2 -0
  22. package/dist/scripts/init-ssh.js +639 -0
  23. package/dist/scripts/package-versions.d.ts +57 -0
  24. package/dist/scripts/package-versions.js +768 -0
  25. package/dist/scripts/postinstall.d.ts +1 -0
  26. package/dist/scripts/postinstall.js +527 -0
  27. package/dist/scripts/robust-build.d.ts +7 -0
  28. package/dist/scripts/robust-build.js +88 -0
  29. package/dist/scripts/setup-local-packages.d.ts +31 -0
  30. package/dist/scripts/setup-local-packages.js +237 -0
  31. package/dist/scripts/smart-override.d.ts +2 -0
  32. package/dist/scripts/smart-override.js +1360 -0
  33. package/dist/scripts/sync-configs.d.ts +27 -0
  34. package/dist/scripts/sync-configs.js +248 -0
  35. package/dist/scripts/test-biome-parse.d.ts +5 -0
  36. package/dist/scripts/test-biome-parse.js +84 -0
  37. package/dist/scripts/ultracite-setup.d.ts +4 -0
  38. package/dist/scripts/ultracite-setup.js +310 -0
  39. package/dist/scripts/update-all-init-scripts.d.ts +2 -0
  40. package/dist/scripts/update-all-init-scripts.js +52 -0
  41. package/dist/scripts/update-biome-schema.d.ts +15 -0
  42. package/dist/scripts/update-biome-schema.js +124 -0
  43. package/dist/src/AutoCoreFacade.d.ts +145 -0
  44. package/dist/src/AutoCoreFacade.js +217 -0
  45. package/dist/src/api/ApiActions.d.ts +297 -0
  46. package/dist/src/api/ApiActions.js +1905 -0
  47. package/dist/src/api/Certificate.d.ts +60 -0
  48. package/dist/src/api/Certificate.js +79 -0
  49. package/dist/src/api/JsonResponse.d.ts +116 -0
  50. package/dist/src/api/JsonResponse.js +206 -0
  51. package/dist/src/appium/DeviceFarmViewer.d.ts +79 -0
  52. package/dist/src/appium/DeviceFarmViewer.js +1083 -0
  53. package/dist/src/appium/MobileActions.d.ts +347 -0
  54. package/dist/src/appium/MobileActions.js +1632 -0
  55. package/dist/src/appium/MobileConnection.d.ts +160 -0
  56. package/dist/src/appium/MobileConnection.js +772 -0
  57. package/dist/src/config/envLoader.d.ts +123 -0
  58. package/dist/src/config/envLoader.js +361 -0
  59. package/dist/src/config/jest-safe-setup.d.ts +19 -0
  60. package/dist/src/config/jest-safe-setup.js +369 -0
  61. package/dist/src/config/timeouts.d.ts +32 -0
  62. package/dist/src/config/timeouts.js +38 -0
  63. package/dist/src/desktop/DesktopActions.d.ts +46 -0
  64. package/dist/src/desktop/DesktopActions.js +398 -0
  65. package/dist/src/desktop/DesktopConnection.d.ts +32 -0
  66. package/dist/src/desktop/DesktopConnection.js +84 -0
  67. package/dist/src/domain/entities/TestExecution.d.ts +117 -0
  68. package/dist/src/domain/entities/TestExecution.js +150 -0
  69. package/dist/src/domain/entities/TestReport.d.ts +114 -0
  70. package/dist/src/domain/entities/TestReport.js +179 -0
  71. package/dist/src/domain/repositories/ITestRepository.d.ts +196 -0
  72. package/dist/src/domain/repositories/ITestRepository.js +14 -0
  73. package/dist/src/domain/schemas/ValidationSchemas.d.ts +159 -0
  74. package/dist/src/domain/schemas/ValidationSchemas.js +181 -0
  75. package/dist/src/functions/errors/BaseError.d.ts +78 -0
  76. package/dist/src/functions/errors/BaseError.js +245 -0
  77. package/dist/src/functions/errors/ConfigurationError.d.ts +16 -0
  78. package/dist/src/functions/errors/ConfigurationError.js +48 -0
  79. package/dist/src/functions/errors/ErrorCatalog.d.ts +148 -0
  80. package/dist/src/functions/errors/ErrorCatalog.js +157 -0
  81. package/dist/src/functions/errors/GlobalErrorHandler.d.ts +101 -0
  82. package/dist/src/functions/errors/GlobalErrorHandler.js +281 -0
  83. package/dist/src/functions/errors/IntegrationError.d.ts +17 -0
  84. package/dist/src/functions/errors/IntegrationError.js +51 -0
  85. package/dist/src/functions/errors/SecurityError.d.ts +14 -0
  86. package/dist/src/functions/errors/SecurityError.js +42 -0
  87. package/dist/src/functions/errors/SystemError.d.ts +12 -0
  88. package/dist/src/functions/errors/SystemError.js +36 -0
  89. package/dist/src/functions/errors/ValidationError.d.ts +14 -0
  90. package/dist/src/functions/errors/ValidationError.js +61 -0
  91. package/dist/src/functions/errors/index.d.ts +12 -0
  92. package/dist/src/functions/errors/index.js +13 -0
  93. package/dist/src/global-setup.d.ts +1 -0
  94. package/dist/src/global-setup.js +1037 -0
  95. package/dist/src/helpers/BancoActions.d.ts +188 -0
  96. package/dist/src/helpers/BancoActions.js +581 -0
  97. package/dist/src/helpers/EnviromentHelper.d.ts +17 -0
  98. package/dist/src/helpers/EnviromentHelper.js +66 -0
  99. package/dist/src/helpers/ParallelExecutionHelper.d.ts +183 -0
  100. package/dist/src/helpers/ParallelExecutionHelper.js +375 -0
  101. package/dist/src/helpers/SyncSignal.d.ts +15 -0
  102. package/dist/src/helpers/SyncSignal.js +44 -0
  103. package/dist/src/hubdocs/CategoryDetector.d.ts +83 -0
  104. package/dist/src/hubdocs/CategoryDetector.js +401 -0
  105. package/dist/src/hubdocs/DirectStatementInterceptor.d.ts +54 -0
  106. package/dist/src/hubdocs/DirectStatementInterceptor.js +243 -0
  107. package/dist/src/hubdocs/ExecutionTracker.d.ts +107 -0
  108. package/dist/src/hubdocs/ExecutionTracker.js +702 -0
  109. package/dist/src/hubdocs/HubDocs.d.ts +395 -0
  110. package/dist/src/hubdocs/HubDocs.js +3586 -0
  111. package/dist/src/hubdocs/StatementMethodFilter.d.ts +71 -0
  112. package/dist/src/hubdocs/StatementMethodFilter.js +618 -0
  113. package/dist/src/hubdocs/StatementTracker.d.ts +417 -0
  114. package/dist/src/hubdocs/StatementTracker.js +2419 -0
  115. package/dist/src/hubdocs/SwaggerGenerator.d.ts +59 -0
  116. package/dist/src/hubdocs/SwaggerGenerator.js +405 -0
  117. package/dist/src/hubdocs/index.d.ts +9 -0
  118. package/dist/src/hubdocs/index.js +9 -0
  119. package/dist/src/hubdocs/types.d.ts +114 -0
  120. package/dist/src/hubdocs/types.js +5 -0
  121. package/dist/src/infrastructure/DependencyContainer.d.ts +142 -0
  122. package/dist/src/infrastructure/DependencyContainer.js +250 -0
  123. package/dist/src/infrastructure/adapters/AppiumAdapter.d.ts +168 -0
  124. package/dist/src/infrastructure/adapters/AppiumAdapter.js +468 -0
  125. package/dist/src/infrastructure/adapters/OracleAdapter.d.ts +150 -0
  126. package/dist/src/infrastructure/adapters/OracleAdapter.js +388 -0
  127. package/dist/src/infrastructure/adapters/PlaywrightAdapter.d.ts +192 -0
  128. package/dist/src/infrastructure/adapters/PlaywrightAdapter.js +382 -0
  129. package/dist/src/infrastructure/adapters/SSHAdapter.d.ts +141 -0
  130. package/dist/src/infrastructure/adapters/SSHAdapter.js +428 -0
  131. package/dist/src/interfaces.d.ts +501 -0
  132. package/dist/src/interfaces.js +25 -0
  133. package/dist/src/internal/fakes/__fake-actions__.d.ts +17 -0
  134. package/dist/src/internal/fakes/__fake-actions__.js +21 -0
  135. package/dist/src/internal/fakes/__forbidden__.d.ts +10 -0
  136. package/dist/src/internal/fakes/__forbidden__.js +18 -0
  137. package/dist/src/internal/fakes/__honeypot__.d.ts +15 -0
  138. package/dist/src/internal/fakes/__honeypot__.js +24 -0
  139. package/dist/src/octane/OctaneReporter.d.ts +13 -0
  140. package/dist/src/octane/OctaneReporter.js +61 -0
  141. package/dist/src/playwright/CryptoActions.d.ts +20 -0
  142. package/dist/src/playwright/CryptoActions.js +75 -0
  143. package/dist/src/playwright/EnhancedWebActions.d.ts +7 -0
  144. package/dist/src/playwright/EnhancedWebActions.js +65 -0
  145. package/dist/src/playwright/WebActions.d.ts +1599 -0
  146. package/dist/src/playwright/WebActions.js +11788 -0
  147. package/dist/src/playwright/actions/ActionTimeline.d.ts +36 -0
  148. package/dist/src/playwright/actions/ActionTimeline.js +101 -0
  149. package/dist/src/playwright/actions/RecoveryQueue.d.ts +82 -0
  150. package/dist/src/playwright/actions/RecoveryQueue.js +130 -0
  151. package/dist/src/playwright/actions/SelectorCache.d.ts +53 -0
  152. package/dist/src/playwright/actions/SelectorCache.js +96 -0
  153. package/dist/src/playwright/actions/index.d.ts +13 -0
  154. package/dist/src/playwright/actions/index.js +14 -0
  155. package/dist/src/playwright/actions/types.d.ts +147 -0
  156. package/dist/src/playwright/actions/types.js +5 -0
  157. package/dist/src/playwright/fixtures.d.ts +112 -0
  158. package/dist/src/playwright/fixtures.js +718 -0
  159. package/dist/src/playwright/network-logs-reporter.d.ts +7 -0
  160. package/dist/src/playwright/network-logs-reporter.js +66 -0
  161. package/dist/src/playwright/registerRecoveryWrappers.d.ts +1 -0
  162. package/dist/src/playwright/registerRecoveryWrappers.js +54 -0
  163. package/dist/src/security/BuildSecurity.d.ts +12 -0
  164. package/dist/src/security/BuildSecurity.js +138 -0
  165. package/dist/src/security/EulaProtection.d.ts +70 -0
  166. package/dist/src/security/EulaProtection.js +155 -0
  167. package/dist/src/security/HoneypotManager.d.ts +46 -0
  168. package/dist/src/security/HoneypotManager.js +234 -0
  169. package/dist/src/security/KeysManager.d.ts +36 -0
  170. package/dist/src/security/KeysManager.js +158 -0
  171. package/dist/src/security/ProofOfWorkIntegration.d.ts +64 -0
  172. package/dist/src/security/ProofOfWorkIntegration.js +206 -0
  173. package/dist/src/security/SecurityValidation.d.ts +21 -0
  174. package/dist/src/security/SecurityValidation.js +163 -0
  175. package/dist/src/security/SourceMapProtection.d.ts +55 -0
  176. package/dist/src/security/SourceMapProtection.js +220 -0
  177. package/dist/src/security/protector.d.ts +1 -0
  178. package/dist/src/security/protector.js +97 -0
  179. package/dist/src/ssh/SSHActions.d.ts +262 -0
  180. package/dist/src/ssh/SSHActions.js +790 -0
  181. package/dist/src/ssh/SSHClient.d.ts +99 -0
  182. package/dist/src/ssh/SSHClient.js +409 -0
  183. package/dist/src/statements/BaseStatement.d.ts +38 -0
  184. package/dist/src/statements/BaseStatement.js +78 -0
  185. package/dist/src/testContext/AuthStateManager.d.ts +93 -0
  186. package/dist/src/testContext/AuthStateManager.js +256 -0
  187. package/dist/src/testContext/CoverageManager.d.ts +198 -0
  188. package/dist/src/testContext/CoverageManager.js +917 -0
  189. package/dist/src/testContext/TestAnnotations.d.ts +476 -0
  190. package/dist/src/testContext/TestAnnotations.js +2647 -0
  191. package/dist/src/testContext/TestContext.d.ts +138 -0
  192. package/dist/src/testContext/TestContext.js +369 -0
  193. package/dist/src/testContext/UnifiedHtmlGenerator.d.ts +7 -0
  194. package/dist/src/testContext/UnifiedHtmlGenerator.js +264 -0
  195. package/dist/src/testContext/UnifiedReportManager.d.ts +211 -0
  196. package/dist/src/testContext/UnifiedReportManager.js +1206 -0
  197. package/dist/src/testhub/DynamicConfigManager.d.ts +121 -0
  198. package/dist/src/testhub/DynamicConfigManager.js +320 -0
  199. package/dist/src/testhub/SystemsManager.d.ts +119 -0
  200. package/dist/src/testhub/SystemsManager.js +365 -0
  201. package/dist/src/testhub/TestHubClient.d.ts +335 -0
  202. package/dist/src/testhub/TestHubClient.js +1215 -0
  203. package/dist/src/testhub/TestHubReporter.d.ts +62 -0
  204. package/dist/src/testhub/TestHubReporter.js +576 -0
  205. package/dist/src/testhub/TestHubVars.d.ts +116 -0
  206. package/dist/src/testhub/TestHubVars.js +273 -0
  207. package/dist/src/utils/ActionInterceptor.d.ts +59 -0
  208. package/dist/src/utils/ActionInterceptor.js +741 -0
  209. package/dist/src/utils/ArtifactsCompressor.d.ts +43 -0
  210. package/dist/src/utils/ArtifactsCompressor.js +181 -0
  211. package/dist/src/utils/AutoLogsFinal.d.ts +47 -0
  212. package/dist/src/utils/AutoLogsFinal.js +148 -0
  213. package/dist/src/utils/CodeGenSession.d.ts +114 -0
  214. package/dist/src/utils/CodeGenSession.js +264 -0
  215. package/dist/src/utils/ConfigLogger.d.ts +133 -0
  216. package/dist/src/utils/ConfigLogger.js +611 -0
  217. package/dist/src/utils/CustomReporter.d.ts +22 -0
  218. package/dist/src/utils/CustomReporter.js +352 -0
  219. package/dist/src/utils/DataStore.d.ts +171 -0
  220. package/dist/src/utils/DataStore.js +484 -0
  221. package/dist/src/utils/DatabaseInterceptor.d.ts +19 -0
  222. package/dist/src/utils/DatabaseInterceptor.js +295 -0
  223. package/dist/src/utils/DateHelper.d.ts +16 -0
  224. package/dist/src/utils/DateHelper.js +120 -0
  225. package/dist/src/utils/DateValidator.d.ts +4 -0
  226. package/dist/src/utils/DateValidator.js +51 -0
  227. package/dist/src/utils/DocumentGenerator.d.ts +35 -0
  228. package/dist/src/utils/DocumentGenerator.js +129 -0
  229. package/dist/src/utils/EvidenceCapture.d.ts +90 -0
  230. package/dist/src/utils/EvidenceCapture.js +600 -0
  231. package/dist/src/utils/EvidenceReportGenerator.d.ts +70 -0
  232. package/dist/src/utils/EvidenceReportGenerator.js +799 -0
  233. package/dist/src/utils/FrameManagementUtil.d.ts +42 -0
  234. package/dist/src/utils/FrameManagementUtil.js +75 -0
  235. package/dist/src/utils/GlobalStatementsInterceptor.d.ts +1 -0
  236. package/dist/src/utils/GlobalStatementsInterceptor.js +1 -0
  237. package/dist/src/utils/HTMLTemplate.d.ts +1 -0
  238. package/dist/src/utils/HTMLTemplate.js +1034 -0
  239. package/dist/src/utils/InterceptacaoMagica.d.ts +23 -0
  240. package/dist/src/utils/InterceptacaoMagica.js +365 -0
  241. package/dist/src/utils/LogSanitizer.d.ts +35 -0
  242. package/dist/src/utils/LogSanitizer.js +110 -0
  243. package/dist/src/utils/Logger.d.ts +65 -0
  244. package/dist/src/utils/Logger.js +284 -0
  245. package/dist/src/utils/McpLocalClient.d.ts +141 -0
  246. package/dist/src/utils/McpLocalClient.js +871 -0
  247. package/dist/src/utils/PDFEvidenceGenerator.d.ts +20 -0
  248. package/dist/src/utils/PDFEvidenceGenerator.js +156 -0
  249. package/dist/src/utils/SpecFileAnalyzer.d.ts +35 -0
  250. package/dist/src/utils/SpecFileAnalyzer.js +209 -0
  251. package/dist/src/utils/StatementInterceptor.d.ts +18 -0
  252. package/dist/src/utils/StatementInterceptor.js +87 -0
  253. package/dist/src/utils/StatementLogger.d.ts +33 -0
  254. package/dist/src/utils/StatementLogger.js +113 -0
  255. package/dist/src/utils/StatementsInterceptor.d.ts +1 -0
  256. package/dist/src/utils/StatementsInterceptor.js +1 -0
  257. package/dist/src/utils/TeamsFlushHook.d.ts +17 -0
  258. package/dist/src/utils/TeamsFlushHook.js +168 -0
  259. package/dist/src/utils/TerminalLogCapture.d.ts +158 -0
  260. package/dist/src/utils/TerminalLogCapture.js +531 -0
  261. package/dist/src/utils/TestMethodLogger.d.ts +70 -0
  262. package/dist/src/utils/TestMethodLogger.js +95 -0
  263. package/dist/src/utils/UnifiedTeardown.d.ts +4 -0
  264. package/dist/src/utils/UnifiedTeardown.js +400 -0
  265. package/dist/src/utils/XPathCatalog.d.ts +152 -0
  266. package/dist/src/utils/XPathCatalog.js +350 -0
  267. package/dist/src/utils/generators.d.ts +90 -0
  268. package/dist/src/utils/generators.js +167 -0
  269. package/dist/src/utils/testRecovery/ResilientPlaywright.d.ts +152 -0
  270. package/dist/src/utils/testRecovery/ResilientPlaywright.js +715 -0
  271. package/dist/src/utils/testRecovery/TestRecoveryClient.d.ts +801 -0
  272. package/dist/src/utils/testRecovery/TestRecoveryClient.js +1415 -0
  273. package/dist/src/utils/testRecovery/autoFixCode.d.ts +65 -0
  274. package/dist/src/utils/testRecovery/autoFixCode.js +32 -0
  275. package/dist/vitest.config.d.ts +2 -0
  276. package/dist/vitest.config.js +59 -0
  277. package/dist/wdio.conf.d.ts +1 -0
  278. package/dist/wdio.conf.js +420 -0
  279. package/package.json +137 -0
  280. package/protect-loader.mjs +643 -0
  281. package/scripts/consumer-postinstall.ts +975 -0
  282. package/scripts/generate-index.ts +343 -0
  283. package/scripts/init-api.ts +613 -0
  284. package/scripts/init-banco.ts +437 -0
  285. package/scripts/init-frontend.ts +727 -0
  286. package/scripts/init-mobile.ts +558 -0
  287. package/scripts/init-scenarios.ts +925 -0
  288. package/scripts/init-ssh.ts +734 -0
  289. package/scripts/package-versions.ts +978 -0
  290. package/scripts/postinstall.ts +605 -0
  291. package/scripts/smart-override.ts +1675 -0
  292. package/scripts/sync-configs.ts +302 -0
  293. package/scripts/ultracite-setup.ts +370 -0
  294. package/src/types/globals.d.ts +48 -0
  295. package/tsconfig.json +29 -0
  296. package/types/autocore-sync-signal.d.ts +10 -0
@@ -0,0 +1,428 @@
1
+ /**
2
+ * @fileoverview Adaptador SSH para execução remota seguindo padrões DDD
3
+ * @module Infrastructure/Adapters
4
+ */
5
+ import { Client } from 'ssh2';
6
+ import { SchemaValidator, SSHCredentialsSchema, } from '../../domain/schemas/ValidationSchemas.js';
7
+ import { IntegrationError } from '../../functions/errors/IntegrationError.js';
8
+ import { ValidationError } from '../../functions/errors/ValidationError.js';
9
+ /**
10
+ * Adaptador que integra node-ssh com a arquitetura do AutoCore
11
+ * Implementa a interface ISSHClient usando node-ssh
12
+ */
13
+ export class SSHAdapter {
14
+ ssh = null;
15
+ connected = false;
16
+ connectionInfo = null;
17
+ constructor() {
18
+ // Lazy loading da biblioteca node-ssh
19
+ }
20
+ /**
21
+ * Conecta ao servidor SSH
22
+ */
23
+ async connect(credentials) {
24
+ try {
25
+ // Validação usando Zod
26
+ const validCredentials = SchemaValidator.validate(SSHCredentialsSchema, credentials);
27
+ // Lazy loading da biblioteca SSH
28
+ if (!this.ssh) {
29
+ try {
30
+ // Usar ssh2 em vez de node-ssh
31
+ this.ssh = new Client();
32
+ }
33
+ catch (error) {
34
+ // Fallback para implementação mock se ssh2 não estiver disponível
35
+ this.ssh = {
36
+ connect: async () => {
37
+ throw new Error('ssh2 não instalado');
38
+ },
39
+ dispose: async () => { },
40
+ execCommand: async () => ({
41
+ code: 1,
42
+ stdout: '',
43
+ stderr: 'node-ssh não instalado',
44
+ }),
45
+ putFile: async () => {
46
+ throw new Error('node-ssh não instalado');
47
+ },
48
+ getFile: async () => {
49
+ throw new Error('node-ssh não instalado');
50
+ },
51
+ };
52
+ }
53
+ }
54
+ // Preparar configuração de conexão
55
+ const config = {
56
+ host: validCredentials.host,
57
+ port: validCredentials.port,
58
+ username: validCredentials.username,
59
+ readyTimeout: 30_000,
60
+ keepaliveInterval: 15_000,
61
+ algorithms: {
62
+ kex: [
63
+ 'diffie-hellman-group-exchange-sha256',
64
+ 'diffie-hellman-group14-sha256',
65
+ 'diffie-hellman-group14-sha1',
66
+ 'diffie-hellman-group1-sha1',
67
+ 'ecdh-sha2-nistp256',
68
+ 'ecdh-sha2-nistp384',
69
+ 'ecdh-sha2-nistp521',
70
+ ],
71
+ cipher: [
72
+ 'aes128-ctr',
73
+ 'aes192-ctr',
74
+ 'aes256-ctr',
75
+ 'aes128-gcm',
76
+ 'aes256-gcm',
77
+ 'aes128-cbc',
78
+ 'aes192-cbc',
79
+ 'aes256-cbc',
80
+ ],
81
+ hmac: ['hmac-sha2-256', 'hmac-sha2-512', 'hmac-sha1'],
82
+ },
83
+ };
84
+ // Adicionar autenticação
85
+ if (validCredentials.privateKey) {
86
+ config.privateKey = validCredentials.privateKey;
87
+ if (validCredentials.passphrase) {
88
+ config.passphrase = validCredentials.passphrase;
89
+ }
90
+ }
91
+ else if (validCredentials.password) {
92
+ config.password = validCredentials.password;
93
+ }
94
+ else {
95
+ throw ValidationError.missingRequiredParameter('password or privateKey');
96
+ }
97
+ await this.ssh.connect(config);
98
+ this.connected = true;
99
+ this.connectionInfo = validCredentials;
100
+ }
101
+ catch (error) {
102
+ const err = error;
103
+ this.connected = false;
104
+ this.connectionInfo = null;
105
+ throw IntegrationError.sshConnectionFailed(credentials.host, err);
106
+ }
107
+ }
108
+ /**
109
+ * Desconecta do servidor SSH
110
+ */
111
+ async disconnect() {
112
+ try {
113
+ if (this.ssh && this.connected) {
114
+ this.ssh.end();
115
+ }
116
+ }
117
+ finally {
118
+ this.connected = false;
119
+ this.connectionInfo = null;
120
+ this.ssh = null;
121
+ }
122
+ }
123
+ /**
124
+ * Verifica se está conectado
125
+ */
126
+ isConnected() {
127
+ return this.connected && !!this.ssh;
128
+ }
129
+ /**
130
+ * Executa comando no servidor remoto
131
+ */
132
+ async executeCommand(command, options = {}) {
133
+ if (!this.isConnected()) {
134
+ throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
135
+ }
136
+ if (!command.trim()) {
137
+ throw ValidationError.missingRequiredParameter('command');
138
+ }
139
+ const startTime = new Date();
140
+ try {
141
+ const execOptions = {
142
+ execOptions: {},
143
+ };
144
+ if (options.cwd) {
145
+ // Prefixar comando com mudança de diretório
146
+ command = `cd ${options.cwd} && ${command}`;
147
+ }
148
+ if (options.timeout) {
149
+ execOptions.execOptions.timeout = options.timeout;
150
+ }
151
+ const result = await this.ssh.execCommand(command, execOptions);
152
+ return {
153
+ success: result.code === 0,
154
+ stdout: result.stdout || '',
155
+ stderr: result.stderr || '',
156
+ exitCode: result.code || 0,
157
+ command,
158
+ timestamp: startTime,
159
+ };
160
+ }
161
+ catch (error) {
162
+ const err = error;
163
+ throw IntegrationError.webOperationFailed('executeCommand', `Falha ao executar comando: ${command}`, err);
164
+ }
165
+ }
166
+ /**
167
+ * Faz upload de arquivo para o servidor
168
+ */
169
+ async uploadFile(localPath, remotePath) {
170
+ if (!this.isConnected()) {
171
+ throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
172
+ }
173
+ if (!(localPath.trim() && remotePath.trim())) {
174
+ throw ValidationError.missingRequiredParameter('localPath and remotePath');
175
+ }
176
+ try {
177
+ await this.ssh.putFile(localPath, remotePath);
178
+ }
179
+ catch (error) {
180
+ const err = error;
181
+ throw IntegrationError.fileSystemError('upload', `${localPath} -> ${remotePath}`, err);
182
+ }
183
+ }
184
+ /**
185
+ * Faz download de arquivo do servidor
186
+ */
187
+ async downloadFile(remotePath, localPath) {
188
+ if (!this.isConnected()) {
189
+ throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
190
+ }
191
+ if (!(localPath.trim() && remotePath.trim())) {
192
+ throw ValidationError.missingRequiredParameter('localPath and remotePath');
193
+ }
194
+ try {
195
+ await this.ssh.getFile(localPath, remotePath);
196
+ }
197
+ catch (error) {
198
+ const err = error;
199
+ throw IntegrationError.fileSystemError('download', `${remotePath} -> ${localPath}`, err);
200
+ }
201
+ }
202
+ /**
203
+ * Cria diretório no servidor
204
+ */
205
+ async createDirectory(remotePath, recursive = true) {
206
+ if (!this.isConnected()) {
207
+ throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
208
+ }
209
+ if (!remotePath.trim()) {
210
+ throw ValidationError.missingRequiredParameter('remotePath');
211
+ }
212
+ try {
213
+ const command = recursive
214
+ ? `mkdir -p "${remotePath}"`
215
+ : `mkdir "${remotePath}"`;
216
+ const result = await this.executeCommand(command);
217
+ if (!result.success) {
218
+ throw new Error(`Falha ao criar diretório: ${result.stderr}`);
219
+ }
220
+ }
221
+ catch (error) {
222
+ const err = error;
223
+ throw IntegrationError.fileSystemError('createDirectory', remotePath, err);
224
+ }
225
+ }
226
+ /**
227
+ * Remove arquivo do servidor
228
+ */
229
+ async removeFile(remotePath) {
230
+ if (!this.isConnected()) {
231
+ throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
232
+ }
233
+ if (!remotePath.trim()) {
234
+ throw ValidationError.missingRequiredParameter('remotePath');
235
+ }
236
+ try {
237
+ const result = await this.executeCommand(`rm -f "${remotePath}"`);
238
+ if (!result.success) {
239
+ throw new Error(`Falha ao remover arquivo: ${result.stderr}`);
240
+ }
241
+ }
242
+ catch (error) {
243
+ const err = error;
244
+ throw IntegrationError.fileSystemError('removeFile', remotePath, err);
245
+ }
246
+ }
247
+ /**
248
+ * Remove diretório do servidor
249
+ */
250
+ async removeDirectory(remotePath, recursive = false) {
251
+ if (!this.isConnected()) {
252
+ throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
253
+ }
254
+ if (!remotePath.trim()) {
255
+ throw ValidationError.missingRequiredParameter('remotePath');
256
+ }
257
+ try {
258
+ const command = recursive
259
+ ? `rm -rf "${remotePath}"`
260
+ : `rmdir "${remotePath}"`;
261
+ const result = await this.executeCommand(command);
262
+ if (!result.success) {
263
+ throw new Error(`Falha ao remover diretório: ${result.stderr}`);
264
+ }
265
+ }
266
+ catch (error) {
267
+ const err = error;
268
+ throw IntegrationError.fileSystemError('removeDirectory', remotePath, err);
269
+ }
270
+ }
271
+ /**
272
+ * Verifica se arquivo existe no servidor
273
+ */
274
+ async fileExists(remotePath) {
275
+ if (!this.isConnected()) {
276
+ throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
277
+ }
278
+ if (!remotePath.trim()) {
279
+ throw ValidationError.missingRequiredParameter('remotePath');
280
+ }
281
+ try {
282
+ const result = await this.executeCommand(`test -e "${remotePath}" && echo "exists"`);
283
+ return result.success && result.stdout.includes('exists');
284
+ }
285
+ catch (error) {
286
+ return false;
287
+ }
288
+ }
289
+ /**
290
+ * Obtém informações de arquivo/diretório
291
+ */
292
+ async getFileInfo(remotePath) {
293
+ if (!this.isConnected()) {
294
+ throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
295
+ }
296
+ if (!remotePath.trim()) {
297
+ throw ValidationError.missingRequiredParameter('remotePath');
298
+ }
299
+ try {
300
+ const result = await this.executeCommand(`stat -c "%s %Y %F" "${remotePath}"`);
301
+ if (!result.success) {
302
+ throw new Error(`Arquivo não encontrado: ${remotePath}`);
303
+ }
304
+ const parts = result.stdout.trim().split(' ');
305
+ if (parts.length < 3) {
306
+ throw new Error('Formato inválido de stat');
307
+ }
308
+ const size = Number.parseInt(parts[0], 10);
309
+ const modifiedTimestamp = Number.parseInt(parts[1], 10);
310
+ const fileType = parts.slice(2).join(' ');
311
+ return {
312
+ size: isNaN(size) ? 0 : size,
313
+ modified: new Date(modifiedTimestamp * 1000),
314
+ isDirectory: fileType.includes('directory'),
315
+ };
316
+ }
317
+ catch (error) {
318
+ const err = error;
319
+ throw IntegrationError.fileSystemError('getFileInfo', remotePath, err);
320
+ }
321
+ }
322
+ /**
323
+ * Lista conteúdo de diretório
324
+ */
325
+ async listDirectory(remotePath) {
326
+ if (!this.isConnected()) {
327
+ throw ValidationError.invalidConfiguration('ssh', 'SSH não está conectado');
328
+ }
329
+ if (!remotePath.trim()) {
330
+ throw ValidationError.missingRequiredParameter('remotePath');
331
+ }
332
+ try {
333
+ const result = await this.executeCommand(`ls -1 "${remotePath}"`);
334
+ if (!result.success) {
335
+ throw new Error(`Falha ao listar diretório: ${result.stderr}`);
336
+ }
337
+ return result.stdout
338
+ .split('\n')
339
+ .map((line) => line.trim())
340
+ .filter((line) => line.length > 0);
341
+ }
342
+ catch (error) {
343
+ const err = error;
344
+ throw IntegrationError.fileSystemError('listDirectory', remotePath, err);
345
+ }
346
+ }
347
+ /**
348
+ * Obtém informações da conexão atual
349
+ */
350
+ getConnectionInfo() {
351
+ return this.connectionInfo;
352
+ }
353
+ /**
354
+ * Obtém a instância do NodeSSH
355
+ * Para casos onde é necessário acessar funcionalidades específicas
356
+ */
357
+ getSSHClient() {
358
+ return this.ssh;
359
+ }
360
+ /**
361
+ * Executa múltiplos comandos em sequência
362
+ */
363
+ async executeCommandSequence(commands, options = {}) {
364
+ if (!commands || commands.length === 0) {
365
+ throw ValidationError.missingRequiredParameter('commands');
366
+ }
367
+ const results = [];
368
+ const stopOnError = options.stopOnError !== false;
369
+ for (const command of commands) {
370
+ try {
371
+ const result = await this.executeCommand(command, options);
372
+ results.push(result);
373
+ if (stopOnError && !result.success) {
374
+ break;
375
+ }
376
+ }
377
+ catch (error) {
378
+ const errorResult = {
379
+ success: false,
380
+ stdout: '',
381
+ stderr: error.message,
382
+ exitCode: -1,
383
+ command,
384
+ timestamp: new Date(),
385
+ };
386
+ results.push(errorResult);
387
+ if (stopOnError) {
388
+ break;
389
+ }
390
+ }
391
+ }
392
+ return results;
393
+ }
394
+ /**
395
+ * Executa script local no servidor remoto
396
+ */
397
+ async executeScript(scriptContent, options = {}) {
398
+ if (!scriptContent.trim()) {
399
+ throw ValidationError.missingRequiredParameter('scriptContent');
400
+ }
401
+ const interpreter = options.interpreter || 'bash';
402
+ const args = options.args ? options.args.join(' ') : '';
403
+ const tempFile = `/tmp/autocore_script_${Date.now()}.sh`;
404
+ try {
405
+ // Upload do script
406
+ const fs = await import('fs/promises');
407
+ const localTempFile = `./temp_script_${Date.now()}.sh`;
408
+ await fs.writeFile(localTempFile, scriptContent);
409
+ await this.uploadFile(localTempFile, tempFile);
410
+ await fs.unlink(localTempFile);
411
+ // Tornar executável e executar
412
+ await this.executeCommand(`chmod +x "${tempFile}"`);
413
+ const result = await this.executeCommand(`${interpreter} "${tempFile}" ${args}`, options);
414
+ // Limpar arquivo temporário
415
+ await this.removeFile(tempFile);
416
+ return result;
417
+ }
418
+ catch (error) {
419
+ // Tentar limpar arquivo temporário em caso de erro
420
+ try {
421
+ await this.removeFile(tempFile);
422
+ }
423
+ catch { }
424
+ const err = error;
425
+ throw IntegrationError.webOperationFailed('executeScript', 'Falha ao executar script remoto', err);
426
+ }
427
+ }
428
+ }