@oalacea/daemon 0.5.0 → 0.6.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 (222) hide show
  1. package/LICENSE +23 -23
  2. package/README.md +147 -141
  3. package/bin/Dockerfile +75 -74
  4. package/dist/cli/cli.d.ts +42 -0
  5. package/dist/cli/cli.d.ts.map +1 -0
  6. package/dist/cli/cli.js +89 -0
  7. package/dist/cli/cli.js.map +1 -0
  8. package/dist/cli/commands/detect.command.d.ts +39 -0
  9. package/dist/cli/commands/detect.command.d.ts.map +1 -0
  10. package/dist/cli/commands/detect.command.js +111 -0
  11. package/dist/cli/commands/detect.command.js.map +1 -0
  12. package/dist/cli/commands/index.d.ts +14 -0
  13. package/dist/cli/commands/index.d.ts.map +1 -0
  14. package/dist/cli/commands/index.js +11 -0
  15. package/dist/cli/commands/index.js.map +1 -0
  16. package/dist/cli/commands/init.command.d.ts +41 -0
  17. package/dist/cli/commands/init.command.d.ts.map +1 -0
  18. package/dist/cli/commands/init.command.js +111 -0
  19. package/dist/cli/commands/init.command.js.map +1 -0
  20. package/dist/cli/commands/test.command.d.ts +58 -0
  21. package/dist/cli/commands/test.command.d.ts.map +1 -0
  22. package/dist/cli/commands/test.command.js +180 -0
  23. package/dist/cli/commands/test.command.js.map +1 -0
  24. package/dist/cli/index.d.ts +8 -0
  25. package/dist/cli/index.d.ts.map +1 -0
  26. package/dist/cli/index.js +10 -0
  27. package/dist/cli/index.js.map +1 -0
  28. package/dist/core/config/daemon.config.d.ts +32 -0
  29. package/dist/core/config/daemon.config.d.ts.map +1 -0
  30. package/dist/core/config/daemon.config.js +83 -0
  31. package/dist/core/config/daemon.config.js.map +1 -0
  32. package/dist/core/config/index.d.ts +5 -0
  33. package/dist/core/config/index.d.ts.map +1 -0
  34. package/dist/core/config/index.js +5 -0
  35. package/dist/core/config/index.js.map +1 -0
  36. package/dist/core/constants.d.ts +36 -0
  37. package/dist/core/constants.d.ts.map +1 -0
  38. package/dist/core/constants.js +56 -0
  39. package/dist/core/constants.js.map +1 -0
  40. package/dist/core/types/common.types.d.ts +250 -0
  41. package/dist/core/types/common.types.d.ts.map +1 -0
  42. package/dist/core/types/common.types.js +7 -0
  43. package/dist/core/types/common.types.js.map +1 -0
  44. package/dist/core/types/detection.types.d.ts +232 -0
  45. package/dist/core/types/detection.types.d.ts.map +1 -0
  46. package/dist/core/types/detection.types.js +22 -0
  47. package/dist/core/types/detection.types.js.map +1 -0
  48. package/dist/core/types/docker.types.d.ts +322 -0
  49. package/dist/core/types/docker.types.d.ts.map +1 -0
  50. package/dist/core/types/docker.types.js +7 -0
  51. package/dist/core/types/docker.types.js.map +1 -0
  52. package/dist/core/types/index.d.ts +11 -0
  53. package/dist/core/types/index.d.ts.map +1 -0
  54. package/dist/core/types/index.js +7 -0
  55. package/dist/core/types/index.js.map +1 -0
  56. package/dist/core/types/project.types.d.ts +74 -0
  57. package/dist/core/types/project.types.d.ts.map +1 -0
  58. package/dist/core/types/project.types.js +7 -0
  59. package/dist/core/types/project.types.js.map +1 -0
  60. package/dist/core/types/shared.types.d.ts +118 -0
  61. package/dist/core/types/shared.types.d.ts.map +1 -0
  62. package/dist/core/types/shared.types.js +7 -0
  63. package/dist/core/types/shared.types.js.map +1 -0
  64. package/dist/core/types/test.types.d.ts +230 -0
  65. package/dist/core/types/test.types.d.ts.map +1 -0
  66. package/dist/core/types/test.types.js +7 -0
  67. package/dist/core/types/test.types.js.map +1 -0
  68. package/dist/services/detection/__tests__/framework-detector.test.d.ts +5 -0
  69. package/dist/services/detection/__tests__/framework-detector.test.d.ts.map +1 -0
  70. package/dist/services/detection/__tests__/framework-detector.test.js +52 -0
  71. package/dist/services/detection/__tests__/framework-detector.test.js.map +1 -0
  72. package/dist/services/detection/framework-detector.d.ts +179 -0
  73. package/dist/services/detection/framework-detector.d.ts.map +1 -0
  74. package/dist/services/detection/framework-detector.js +636 -0
  75. package/dist/services/detection/framework-detector.js.map +1 -0
  76. package/dist/services/detection/index.d.ts +10 -0
  77. package/dist/services/detection/index.d.ts.map +1 -0
  78. package/dist/services/detection/index.js +7 -0
  79. package/dist/services/detection/index.js.map +1 -0
  80. package/dist/services/docker/__tests__/docker-manager.test.d.ts +5 -0
  81. package/dist/services/docker/__tests__/docker-manager.test.d.ts.map +1 -0
  82. package/dist/services/docker/__tests__/docker-manager.test.js +67 -0
  83. package/dist/services/docker/__tests__/docker-manager.test.js.map +1 -0
  84. package/dist/services/docker/docker-manager.d.ts +157 -0
  85. package/dist/services/docker/docker-manager.d.ts.map +1 -0
  86. package/dist/services/docker/docker-manager.js +516 -0
  87. package/dist/services/docker/docker-manager.js.map +1 -0
  88. package/dist/services/docker/index.d.ts +9 -0
  89. package/dist/services/docker/index.d.ts.map +1 -0
  90. package/dist/services/docker/index.js +9 -0
  91. package/dist/services/docker/index.js.map +1 -0
  92. package/dist/services/index.d.ts +10 -0
  93. package/dist/services/index.d.ts.map +1 -0
  94. package/dist/services/index.js +8 -0
  95. package/dist/services/index.js.map +1 -0
  96. package/dist/shared/errors/__tests__/base.error.test.d.ts +5 -0
  97. package/dist/shared/errors/__tests__/base.error.test.d.ts.map +1 -0
  98. package/dist/shared/errors/__tests__/base.error.test.js +61 -0
  99. package/dist/shared/errors/__tests__/base.error.test.js.map +1 -0
  100. package/dist/shared/errors/__tests__/command.error.test.d.ts +5 -0
  101. package/dist/shared/errors/__tests__/command.error.test.d.ts.map +1 -0
  102. package/dist/shared/errors/__tests__/command.error.test.js +62 -0
  103. package/dist/shared/errors/__tests__/command.error.test.js.map +1 -0
  104. package/dist/shared/errors/__tests__/file.error.test.d.ts +5 -0
  105. package/dist/shared/errors/__tests__/file.error.test.d.ts.map +1 -0
  106. package/dist/shared/errors/__tests__/file.error.test.js +75 -0
  107. package/dist/shared/errors/__tests__/file.error.test.js.map +1 -0
  108. package/dist/shared/errors/__tests__/index.test.d.ts +5 -0
  109. package/dist/shared/errors/__tests__/index.test.d.ts.map +1 -0
  110. package/dist/shared/errors/__tests__/index.test.js +62 -0
  111. package/dist/shared/errors/__tests__/index.test.js.map +1 -0
  112. package/dist/shared/errors/__tests__/validation.error.test.d.ts +5 -0
  113. package/dist/shared/errors/__tests__/validation.error.test.d.ts.map +1 -0
  114. package/dist/shared/errors/__tests__/validation.error.test.js +79 -0
  115. package/dist/shared/errors/__tests__/validation.error.test.js.map +1 -0
  116. package/dist/shared/errors/base.error.d.ts +54 -0
  117. package/dist/shared/errors/base.error.d.ts.map +1 -0
  118. package/dist/shared/errors/base.error.js +85 -0
  119. package/dist/shared/errors/base.error.js.map +1 -0
  120. package/dist/shared/errors/command.error.d.ts +58 -0
  121. package/dist/shared/errors/command.error.d.ts.map +1 -0
  122. package/dist/shared/errors/command.error.js +102 -0
  123. package/dist/shared/errors/command.error.js.map +1 -0
  124. package/dist/shared/errors/detection.error.d.ts +42 -0
  125. package/dist/shared/errors/detection.error.d.ts.map +1 -0
  126. package/dist/shared/errors/detection.error.js +82 -0
  127. package/dist/shared/errors/detection.error.js.map +1 -0
  128. package/dist/shared/errors/docker.error.d.ts +142 -0
  129. package/dist/shared/errors/docker.error.d.ts.map +1 -0
  130. package/dist/shared/errors/docker.error.js +172 -0
  131. package/dist/shared/errors/docker.error.js.map +1 -0
  132. package/dist/shared/errors/file.error.d.ts +66 -0
  133. package/dist/shared/errors/file.error.d.ts.map +1 -0
  134. package/dist/shared/errors/file.error.js +93 -0
  135. package/dist/shared/errors/file.error.js.map +1 -0
  136. package/dist/shared/errors/index.d.ts +56 -0
  137. package/dist/shared/errors/index.d.ts.map +1 -0
  138. package/dist/shared/errors/index.js +86 -0
  139. package/dist/shared/errors/index.js.map +1 -0
  140. package/dist/shared/errors/validation.error.d.ts +67 -0
  141. package/dist/shared/errors/validation.error.d.ts.map +1 -0
  142. package/dist/shared/errors/validation.error.js +97 -0
  143. package/dist/shared/errors/validation.error.js.map +1 -0
  144. package/dist/shared/templates/index.d.ts +2 -0
  145. package/dist/shared/templates/index.d.ts.map +1 -0
  146. package/dist/shared/templates/index.js +2 -0
  147. package/dist/shared/templates/index.js.map +1 -0
  148. package/dist/shared/templates/prompt-builder.d.ts +2 -0
  149. package/dist/shared/templates/prompt-builder.d.ts.map +1 -0
  150. package/dist/shared/templates/prompt-builder.js +2 -0
  151. package/dist/shared/templates/prompt-builder.js.map +1 -0
  152. package/dist/shared/templates/template-engine.d.ts +2 -0
  153. package/dist/shared/templates/template-engine.d.ts.map +1 -0
  154. package/dist/shared/templates/template-engine.js +2 -0
  155. package/dist/shared/templates/template-engine.js.map +1 -0
  156. package/dist/shared/utils/__tests__/command-executor.test.d.ts +5 -0
  157. package/dist/shared/utils/__tests__/command-executor.test.d.ts.map +1 -0
  158. package/dist/shared/utils/__tests__/command-executor.test.js +45 -0
  159. package/dist/shared/utils/__tests__/command-executor.test.js.map +1 -0
  160. package/dist/shared/utils/__tests__/file-helper.test.d.ts +5 -0
  161. package/dist/shared/utils/__tests__/file-helper.test.d.ts.map +1 -0
  162. package/dist/shared/utils/__tests__/file-helper.test.js +71 -0
  163. package/dist/shared/utils/__tests__/file-helper.test.js.map +1 -0
  164. package/dist/shared/utils/__tests__/logger.test.d.ts +5 -0
  165. package/dist/shared/utils/__tests__/logger.test.d.ts.map +1 -0
  166. package/dist/shared/utils/__tests__/logger.test.js +83 -0
  167. package/dist/shared/utils/__tests__/logger.test.js.map +1 -0
  168. package/dist/shared/utils/command-executer.d.ts +2 -0
  169. package/dist/shared/utils/command-executer.d.ts.map +1 -0
  170. package/dist/shared/utils/command-executer.js +2 -0
  171. package/dist/shared/utils/command-executer.js.map +1 -0
  172. package/dist/shared/utils/command-executor.d.ts +255 -0
  173. package/dist/shared/utils/command-executor.d.ts.map +1 -0
  174. package/dist/shared/utils/command-executor.js +287 -0
  175. package/dist/shared/utils/command-executor.js.map +1 -0
  176. package/dist/shared/utils/file-helper.d.ts +86 -0
  177. package/dist/shared/utils/file-helper.d.ts.map +1 -0
  178. package/dist/shared/utils/file-helper.js +323 -0
  179. package/dist/shared/utils/file-helper.js.map +1 -0
  180. package/dist/shared/utils/index.d.ts +9 -0
  181. package/dist/shared/utils/index.d.ts.map +1 -0
  182. package/dist/shared/utils/index.js +9 -0
  183. package/dist/shared/utils/index.js.map +1 -0
  184. package/dist/shared/utils/logger.d.ts +163 -0
  185. package/dist/shared/utils/logger.d.ts.map +1 -0
  186. package/dist/shared/utils/logger.js +389 -0
  187. package/dist/shared/utils/logger.js.map +1 -0
  188. package/package.json +53 -34
  189. package/prompts/DEPS_EFFICIENCY.md +558 -558
  190. package/prompts/E2E.md +491 -491
  191. package/prompts/EXECUTE.md +1060 -1060
  192. package/prompts/INTEGRATION_API.md +484 -484
  193. package/prompts/INTEGRATION_DB.md +425 -425
  194. package/prompts/PERF_API.md +433 -433
  195. package/prompts/PERF_DB.md +430 -430
  196. package/prompts/PERF_FRONT.md +357 -357
  197. package/prompts/REMEDIATION.md +482 -482
  198. package/prompts/UNIT.md +260 -260
  199. package/templates/README.md +38 -38
  200. package/templates/k6/load-test.js +54 -54
  201. package/templates/playwright/e2e.spec.ts +61 -61
  202. package/templates/vitest/angular-component.test.ts +38 -38
  203. package/templates/vitest/api.test.ts +51 -51
  204. package/templates/vitest/component.test.ts +27 -27
  205. package/templates/vitest/hook.test.ts +36 -36
  206. package/templates/vitest/solid-component.test.ts +34 -34
  207. package/templates/vitest/svelte-component.test.ts +33 -33
  208. package/templates/vitest/vue-component.test.ts +39 -39
  209. package/CHANGELOG.md +0 -38
  210. package/agents/deps-analyzer.js +0 -366
  211. package/agents/detector.js +0 -570
  212. package/agents/fix-engine.js +0 -305
  213. package/agents/lighthouse-scanner.js +0 -405
  214. package/agents/perf-analyzer.js +0 -294
  215. package/agents/perf-front-analyzer.js +0 -229
  216. package/agents/test-generator.js +0 -387
  217. package/agents/test-runner.js +0 -318
  218. package/bin/cli.js +0 -449
  219. package/lib/config.js +0 -250
  220. package/lib/docker.js +0 -207
  221. package/lib/reporter.js +0 -297
  222. package/scripts/dev.js +0 -106
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Tests for DaemonError base class
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { DaemonError } from '../base.error.js';
6
+ describe('DaemonError', () => {
7
+ it('should create error with message and code', () => {
8
+ const error = new DaemonError('Test error', 'TEST_001');
9
+ expect(error).toBeInstanceOf(Error);
10
+ expect(error.message).toBe('Test error');
11
+ expect(error.code).toBe('TEST_001');
12
+ expect(error.name).toBe('DaemonError');
13
+ });
14
+ it('should include context in error', () => {
15
+ const context = { userId: '123', action: 'test' };
16
+ const error = new DaemonError('Test error', 'TEST_002', { context });
17
+ expect(error.context).toEqual(context);
18
+ });
19
+ it('should support cause chaining', () => {
20
+ const originalError = new Error('Original error');
21
+ const error = new DaemonError('Wrapped error', 'TEST_003', { cause: originalError });
22
+ expect(error.cause).toBe(originalError);
23
+ });
24
+ it('should serialize to JSON', () => {
25
+ const context = { key: 'value' };
26
+ const error = new DaemonError('Test error', 'TEST_004', { context });
27
+ const json = error.toJSON();
28
+ expect(json).toMatchObject({
29
+ name: 'DaemonError',
30
+ message: 'Test error',
31
+ code: 'TEST_004',
32
+ context: { key: 'value' },
33
+ });
34
+ expect(json).toHaveProperty('stack');
35
+ });
36
+ it('should check error code', () => {
37
+ const error = new DaemonError('Test error', 'TEST_005');
38
+ expect(error.isErrorCode('TEST_005')).toBe(true);
39
+ expect(error.isErrorCode('TEST_999')).toBe(false);
40
+ });
41
+ it('should check error category', () => {
42
+ const error = new DaemonError('Test error', 'DOCKER_001');
43
+ expect(error.isErrorCategory('DOCKER')).toBe(true);
44
+ expect(error.isErrorCategory('COMMAND')).toBe(false);
45
+ });
46
+ it('should deserialize from JSON', () => {
47
+ const data = {
48
+ name: 'DaemonError',
49
+ message: 'Test error',
50
+ code: 'TEST_006',
51
+ context: { key: 'value' },
52
+ stack: 'Error: Test error\n at test.ts:1',
53
+ };
54
+ const error = DaemonError.fromJSON(data);
55
+ expect(error.name).toBe('DaemonError');
56
+ expect(error.message).toBe('Test error');
57
+ expect(error.code).toBe('TEST_006');
58
+ expect(error.context).toEqual({ key: 'value' });
59
+ });
60
+ });
61
+ //# sourceMappingURL=base.error.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.error.test.js","sourceRoot":"","sources":["../../../../src/shared/errors/__tests__/base.error.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for Command execution errors
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=command.error.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.error.test.d.ts","sourceRoot":"","sources":["../../../../src/shared/errors/__tests__/command.error.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Tests for Command execution errors
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { CommandExecutionError, CommandNotFoundError, CommandTimeoutError, CommandFailedError, InvalidCommandArgumentsError, CommandCancelledError, } from '../command.error.js';
6
+ describe('CommandExecutionError', () => {
7
+ it('should create error with command details', () => {
8
+ const error = new CommandExecutionError('Command failed', 'npm test', 1, 'stdout output', 'stderr output');
9
+ expect(error.command).toBe('npm test');
10
+ expect(error.exitCode).toBe(1);
11
+ expect(error.stdout).toBe('stdout output');
12
+ expect(error.stderr).toBe('stderr output');
13
+ expect(error.code).toBe('COMMAND_001');
14
+ });
15
+ it('should check non-zero exit code', () => {
16
+ const error1 = new CommandExecutionError('Failed', 'cmd', 1, '', '');
17
+ const error2 = new CommandExecutionError('Failed', 'cmd', 0, '', '');
18
+ const error3 = new CommandExecutionError('Failed', 'cmd', null, '', '');
19
+ expect(error1.isNonZeroExit()).toBe(true);
20
+ expect(error2.isNonZeroExit()).toBe(false);
21
+ expect(error3.isNonZeroExit()).toBe(false);
22
+ });
23
+ });
24
+ describe('CommandNotFoundError', () => {
25
+ it('should create error for missing command', () => {
26
+ const error = new CommandNotFoundError('nonexistent');
27
+ expect(error.message).toContain('nonexistent');
28
+ expect(error.command).toBe('nonexistent');
29
+ expect(error.name).toBe('CommandNotFoundError');
30
+ });
31
+ });
32
+ describe('CommandTimeoutError', () => {
33
+ it('should create error with timeout info', () => {
34
+ const error = new CommandTimeoutError('npm test', 5000);
35
+ expect(error.message).toContain('5000ms');
36
+ expect(error.command).toBe('npm test');
37
+ expect(error.name).toBe('CommandTimeoutError');
38
+ });
39
+ });
40
+ describe('CommandFailedError', () => {
41
+ it('should create error for non-zero exit', () => {
42
+ const error = new CommandFailedError('npm test', 1, 'stdout', 'stderr');
43
+ expect(error.message).toContain('exit code 1');
44
+ expect(error.exitCode).toBe(1);
45
+ expect(error.name).toBe('CommandFailedError');
46
+ });
47
+ });
48
+ describe('InvalidCommandArgumentsError', () => {
49
+ it('should create error with reason', () => {
50
+ const error = new InvalidCommandArgumentsError('npm test', 'missing required option');
51
+ expect(error.message).toContain('missing required option');
52
+ expect(error.name).toBe('InvalidCommandArgumentsError');
53
+ });
54
+ });
55
+ describe('CommandCancelledError', () => {
56
+ it('should create cancellation error', () => {
57
+ const error = new CommandCancelledError('npm test');
58
+ expect(error.message).toContain('cancelled');
59
+ expect(error.name).toBe('CommandCancelledError');
60
+ });
61
+ });
62
+ //# sourceMappingURL=command.error.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.error.test.js","sourceRoot":"","sources":["../../../../src/shared/errors/__tests__/command.error.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for File system errors
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=file.error.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.error.test.d.ts","sourceRoot":"","sources":["../../../../src/shared/errors/__tests__/file.error.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Tests for File system errors
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { FileSystemError, FileNotFoundError, FilePermissionError, InvalidJsonError, DirectoryCreationError, FileWriteError, FileReadError, FileCopyError, FileSearchError, } from '../file.error.js';
6
+ describe('FileSystemError', () => {
7
+ it('should create base file system error', () => {
8
+ const error = new FileSystemError('File system error', 'FILE_000');
9
+ expect(error.message).toBe('File system error');
10
+ expect(error.code).toBe('FILE_000');
11
+ });
12
+ });
13
+ describe('FileNotFoundError', () => {
14
+ it('should create error for missing file', () => {
15
+ const error = new FileNotFoundError('/path/to/file.txt');
16
+ expect(error.message).toContain('/path/to/file.txt');
17
+ expect(error.code).toBe('FILE_001');
18
+ expect(error.context.filePath).toBe('/path/to/file.txt');
19
+ });
20
+ });
21
+ describe('FilePermissionError', () => {
22
+ it('should create error for permission denied', () => {
23
+ const error = new FilePermissionError('/protected/file.txt', 'write');
24
+ expect(error.message).toContain('write');
25
+ expect(error.message).toContain('/protected/file.txt');
26
+ expect(error.code).toBe('FILE_002');
27
+ expect(error.context.operation).toBe('write');
28
+ });
29
+ });
30
+ describe('InvalidJsonError', () => {
31
+ it('should create error for JSON parse failure', () => {
32
+ const error = new InvalidJsonError('/config.json', 'Unexpected token');
33
+ expect(error.message).toContain('/config.json');
34
+ expect(error.message).toContain('Unexpected token');
35
+ expect(error.code).toBe('FILE_003');
36
+ });
37
+ });
38
+ describe('DirectoryCreationError', () => {
39
+ it('should create error for directory creation failure', () => {
40
+ const error = new DirectoryCreationError('/new/dir');
41
+ expect(error.message).toContain('/new/dir');
42
+ expect(error.code).toBe('FILE_004');
43
+ });
44
+ });
45
+ describe('FileWriteError', () => {
46
+ it('should create error for write failure', () => {
47
+ const error = new FileWriteError('/output.txt');
48
+ expect(error.message).toContain('/output.txt');
49
+ expect(error.code).toBe('FILE_005');
50
+ });
51
+ });
52
+ describe('FileReadError', () => {
53
+ it('should create error for read failure', () => {
54
+ const error = new FileReadError('/input.txt');
55
+ expect(error.message).toContain('/input.txt');
56
+ expect(error.code).toBe('FILE_006');
57
+ });
58
+ });
59
+ describe('FileCopyError', () => {
60
+ it('should create error for copy failure', () => {
61
+ const error = new FileCopyError('/source.txt', '/dest.txt');
62
+ expect(error.message).toContain('/source.txt');
63
+ expect(error.message).toContain('/dest.txt');
64
+ expect(error.code).toBe('FILE_007');
65
+ });
66
+ });
67
+ describe('FileSearchError', () => {
68
+ it('should create error for search failure', () => {
69
+ const error = new FileSearchError('/project', '*.ts');
70
+ expect(error.message).toContain('*.ts');
71
+ expect(error.message).toContain('/project');
72
+ expect(error.code).toBe('FILE_008');
73
+ });
74
+ });
75
+ //# sourceMappingURL=file.error.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.error.test.js","sourceRoot":"","sources":["../../../../src/shared/errors/__tests__/file.error.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for Error system utilities
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../../src/shared/errors/__tests__/index.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Tests for Error system utilities
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { isDaemonError, isErrorCategory, getErrorMessage, getErrorCode, ErrorCategory, DaemonError, } from '../index.js';
6
+ describe('isDaemonError', () => {
7
+ it('should return true for DaemonError instances', () => {
8
+ const error = new DaemonError('Test', 'TEST_001');
9
+ expect(isDaemonError(error)).toBe(true);
10
+ });
11
+ it('should return false for regular errors', () => {
12
+ const error = new Error('Test');
13
+ expect(isDaemonError(error)).toBe(false);
14
+ });
15
+ it('should return false for non-objects', () => {
16
+ expect(isDaemonError(null)).toBe(false);
17
+ expect(isDaemonError(undefined)).toBe(false);
18
+ expect(isDaemonError('string')).toBe(false);
19
+ expect(isDaemonError(123)).toBe(false);
20
+ });
21
+ });
22
+ describe('isErrorCategory', () => {
23
+ it('should check error category', () => {
24
+ const dockerError = new DaemonError('Docker error', 'DOCKER_001');
25
+ const commandError = new DaemonError('Command error', 'COMMAND_001');
26
+ const plainError = new Error('Plain error');
27
+ expect(isErrorCategory(dockerError, ErrorCategory.DOCKER)).toBe(true);
28
+ expect(isErrorCategory(dockerError, ErrorCategory.COMMAND)).toBe(false);
29
+ expect(isErrorCategory(commandError, ErrorCategory.COMMAND)).toBe(true);
30
+ expect(isErrorCategory(plainError, ErrorCategory.DAEMON)).toBe(false);
31
+ });
32
+ });
33
+ describe('getErrorMessage', () => {
34
+ it('should return message from DaemonError', () => {
35
+ const error = new DaemonError('Test error', 'TEST_001');
36
+ expect(getErrorMessage(error)).toBe('Test error');
37
+ });
38
+ it('should return message from regular Error', () => {
39
+ const error = new Error('Regular error');
40
+ expect(getErrorMessage(error)).toBe('Regular error');
41
+ });
42
+ it('should convert non-errors to string', () => {
43
+ expect(getErrorMessage('string error')).toBe('string error');
44
+ expect(getErrorMessage(123)).toBe('123');
45
+ expect(getErrorMessage(null)).toBe('null');
46
+ });
47
+ });
48
+ describe('getErrorCode', () => {
49
+ it('should return code from DaemonError', () => {
50
+ const error = new DaemonError('Test', 'CUSTOM_123');
51
+ expect(getErrorCode(error)).toBe('CUSTOM_123');
52
+ });
53
+ it('should return UNKNOWN for regular errors', () => {
54
+ const error = new Error('Test');
55
+ expect(getErrorCode(error)).toBe('UNKNOWN');
56
+ });
57
+ it('should return UNKNOWN for non-errors', () => {
58
+ expect(getErrorCode('string')).toBe('UNKNOWN');
59
+ expect(getErrorCode(null)).toBe('UNKNOWN');
60
+ });
61
+ });
62
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../../src/shared/errors/__tests__/index.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,aAAa,EACb,eAAe,EACf,eAAe,EACf,YAAY,EACZ,aAAa,EACb,WAAW,GACZ,MAAM,aAAa,CAAC;AAErB,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAElD,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAClE,MAAM,YAAY,GAAG,IAAI,WAAW,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QAE5C,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtE,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxE,MAAM,CAAC,eAAe,CAAC,YAAY,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAExD,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAEzC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7D,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAEpD,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for Validation errors
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=validation.error.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.error.test.d.ts","sourceRoot":"","sources":["../../../../src/shared/errors/__tests__/validation.error.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Tests for Validation errors
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { ValidationError, SchemaValidationError, RequiredFieldError, InvalidFormatError, ValueOutOfRangeError, ConfigurationValidationError, } from '../validation.error.js';
6
+ describe('ValidationError', () => {
7
+ it('should create error with details', () => {
8
+ const details = [
9
+ { field: 'email', message: 'Invalid email format' },
10
+ { field: 'age', message: 'Must be positive' },
11
+ ];
12
+ const error = new ValidationError('Validation failed', details);
13
+ expect(error.details).toEqual(details);
14
+ expect(error.code).toBe('VALIDATION_001');
15
+ });
16
+ it('should get error messages', () => {
17
+ const details = [
18
+ { field: 'email', message: 'Invalid email' },
19
+ { field: 'age', message: 'Too young' },
20
+ ];
21
+ const error = new ValidationError('Validation failed', details);
22
+ const messages = error.getErrorMessages();
23
+ expect(messages).toEqual(['Invalid email', 'Too young']);
24
+ });
25
+ it('should get field-specific errors', () => {
26
+ const details = [
27
+ { field: 'email', message: 'Invalid email' },
28
+ { field: 'email', message: 'Already taken' },
29
+ { field: 'age', message: 'Too young' },
30
+ ];
31
+ const error = new ValidationError('Validation failed', details);
32
+ const emailErrors = error.getFieldErrors('email');
33
+ expect(emailErrors).toHaveLength(2);
34
+ expect(emailErrors[0].message).toBe('Invalid email');
35
+ });
36
+ });
37
+ describe('SchemaValidationError', () => {
38
+ it('should create error for schema validation', () => {
39
+ const details = [
40
+ { field: 'name', message: 'Required' },
41
+ ];
42
+ const error = new SchemaValidationError('UserSchema', details);
43
+ expect(error.message).toContain('UserSchema');
44
+ expect(error.details).toEqual(details);
45
+ });
46
+ });
47
+ describe('RequiredFieldError', () => {
48
+ it('should create error for missing field', () => {
49
+ const error = new RequiredFieldError('email');
50
+ expect(error.message).toContain('email');
51
+ expect(error.details[0].field).toBe('email');
52
+ });
53
+ });
54
+ describe('InvalidFormatError', () => {
55
+ it('should create error for invalid format', () => {
56
+ const error = new InvalidFormatError('email', 'email', 'invalid-email');
57
+ expect(error.message).toContain('email');
58
+ expect(error.details[0].constraint).toBe('email');
59
+ expect(error.details[0].value).toBe('invalid-email');
60
+ });
61
+ });
62
+ describe('ValueOutOfRangeError', () => {
63
+ it('should create error for out of range value', () => {
64
+ const error = new ValueOutOfRangeError('age', 18, 100, 150);
65
+ expect(error.message).toContain('150');
66
+ expect(error.message).toContain('18-100');
67
+ expect(error.details[0].constraint).toBe('18-100');
68
+ });
69
+ });
70
+ describe('ConfigurationValidationError', () => {
71
+ it('should create error for config validation', () => {
72
+ const details = [
73
+ { field: 'port', message: 'Must be a number' },
74
+ ];
75
+ const error = new ConfigurationValidationError('database.config', details);
76
+ expect(error.message).toContain('database.config');
77
+ });
78
+ });
79
+ //# sourceMappingURL=validation.error.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.error.test.js","sourceRoot":"","sources":["../../../../src/shared/errors/__tests__/validation.error.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * DaemonError - Base class for all Daemon-specific errors.
3
+ *
4
+ * Features:
5
+ * - Proper Error extension (maintains correct prototype chain)
6
+ * - Unique error codes for identification
7
+ * - Cause chaining for error tracing
8
+ * - Serializable for IPC/log transport
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * throw new DaemonError('Something went wrong', 'DAEMON_001', {
13
+ * cause: originalError,
14
+ * context: { projectId: '123' }
15
+ * });
16
+ * ```
17
+ */
18
+ export type ErrorContext = Record<string, unknown>;
19
+ export interface DaemonErrorOptions extends ErrorOptions {
20
+ context?: ErrorContext;
21
+ }
22
+ export declare class DaemonError extends Error {
23
+ /**
24
+ * Unique error code for identification and categorization
25
+ * Format: CATEGORY_### (e.g., DOCKER_001, DETECTION_001)
26
+ */
27
+ readonly code: string;
28
+ /**
29
+ * Additional contextual information about the error
30
+ */
31
+ readonly context: ErrorContext;
32
+ /**
33
+ * The name of the error class
34
+ */
35
+ name: string;
36
+ constructor(message: string, code: string, options?: DaemonErrorOptions);
37
+ /**
38
+ * Convert error to a plain object for serialization (JSON, IPC, logging)
39
+ */
40
+ toJSON(): Record<string, unknown>;
41
+ /**
42
+ * Create a DaemonError from a plain object (deserialization)
43
+ */
44
+ static fromJSON(data: Record<string, unknown>): DaemonError;
45
+ /**
46
+ * Check if this error is of a specific type by code
47
+ */
48
+ isErrorCode(code: string): boolean;
49
+ /**
50
+ * Check if this error matches a code prefix (category)
51
+ */
52
+ isErrorCategory(category: string): boolean;
53
+ }
54
+ //# sourceMappingURL=base.error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.error.d.ts","sourceRoot":"","sources":["../../../src/shared/errors/base.error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnD,MAAM,WAAW,kBAAmB,SAAQ,YAAY;IACtD,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,qBAAa,WAAY,SAAQ,KAAK;IACpC;;;OAGG;IACH,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,SAAgB,OAAO,EAAE,YAAY,CAAC;IAEtC;;OAEG;IACa,IAAI,EAAE,MAAM,CAAC;gBAEjB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB;IAYvE;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAiBjC;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,WAAW;IAc3D;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIlC;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAG3C"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * DaemonError - Base class for all Daemon-specific errors.
3
+ *
4
+ * Features:
5
+ * - Proper Error extension (maintains correct prototype chain)
6
+ * - Unique error codes for identification
7
+ * - Cause chaining for error tracing
8
+ * - Serializable for IPC/log transport
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * throw new DaemonError('Something went wrong', 'DAEMON_001', {
13
+ * cause: originalError,
14
+ * context: { projectId: '123' }
15
+ * });
16
+ * ```
17
+ */
18
+ export class DaemonError extends Error {
19
+ /**
20
+ * Unique error code for identification and categorization
21
+ * Format: CATEGORY_### (e.g., DOCKER_001, DETECTION_001)
22
+ */
23
+ code;
24
+ /**
25
+ * Additional contextual information about the error
26
+ */
27
+ context;
28
+ /**
29
+ * The name of the error class
30
+ */
31
+ name;
32
+ constructor(message, code, options) {
33
+ // Call Error constructor with cause support
34
+ super(message, options);
35
+ // Set the prototype chain correctly for instanceof checks
36
+ Object.setPrototypeOf(this, new.target.prototype);
37
+ this.name = this.constructor.name;
38
+ this.code = code;
39
+ this.context = options?.context ?? {};
40
+ }
41
+ /**
42
+ * Convert error to a plain object for serialization (JSON, IPC, logging)
43
+ */
44
+ toJSON() {
45
+ return {
46
+ name: this.name,
47
+ message: this.message,
48
+ code: this.code,
49
+ context: this.context,
50
+ cause: this.cause instanceof Error
51
+ ? {
52
+ name: this.cause.name,
53
+ message: this.cause.message,
54
+ code: 'code' in this.cause ? this.cause.code : undefined,
55
+ }
56
+ : this.cause,
57
+ stack: this.stack,
58
+ };
59
+ }
60
+ /**
61
+ * Create a DaemonError from a plain object (deserialization)
62
+ */
63
+ static fromJSON(data) {
64
+ const error = new DaemonError(data['message'], data['code'], {
65
+ cause: data['cause'],
66
+ context: data['context'],
67
+ });
68
+ error.name = data['name'];
69
+ error.stack = data['stack'];
70
+ return error;
71
+ }
72
+ /**
73
+ * Check if this error is of a specific type by code
74
+ */
75
+ isErrorCode(code) {
76
+ return this.code === code;
77
+ }
78
+ /**
79
+ * Check if this error matches a code prefix (category)
80
+ */
81
+ isErrorCategory(category) {
82
+ return this.code.startsWith(category);
83
+ }
84
+ }
85
+ //# sourceMappingURL=base.error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.error.js","sourceRoot":"","sources":["../../../src/shared/errors/base.error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC;;;OAGG;IACa,IAAI,CAAS;IAE7B;;OAEG;IACa,OAAO,CAAe;IAEtC;;OAEG;IACa,IAAI,CAAS;IAE7B,YAAY,OAAe,EAAE,IAAY,EAAE,OAA4B;QACrE,4CAA4C;QAC5C,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAExB,0DAA0D;QAC1D,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAElD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,EAAE,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK,YAAY,KAAK;gBAChC,CAAC,CAAC;oBACE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;oBACrB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;oBAC3B,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,IAAI,CAAC,KAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;iBAC1E;gBACH,CAAC,CAAC,IAAI,CAAC,KAAK;YACd,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAA6B;QAC3C,MAAM,KAAK,GAAG,IAAI,WAAW,CAC3B,IAAI,CAAC,SAAS,CAAW,EACzB,IAAI,CAAC,MAAM,CAAW,EACtB;YACE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAiB;YACpC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAiB;SACzC,CACF,CAAC;QACF,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAW,CAAC;QACpC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAW,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAAgB;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Command execution errors.
3
+ *
4
+ * Error codes:
5
+ * - COMMAND_001: Generic command execution error
6
+ * - COMMAND_002: Command not found
7
+ * - COMMAND_003: Command timeout
8
+ * - COMMAND_004: Command returned non-zero exit code
9
+ * - COMMAND_005: Invalid command arguments
10
+ * - COMMAND_006: Command cancelled
11
+ */
12
+ import { DaemonError, type DaemonErrorOptions, type ErrorContext } from './base.error.js';
13
+ /**
14
+ * Base class for all command execution errors
15
+ */
16
+ export declare class CommandExecutionError extends DaemonError {
17
+ readonly command: string;
18
+ readonly exitCode: number | null;
19
+ readonly stdout: string;
20
+ readonly stderr: string;
21
+ constructor(message: string, command: string, exitCode: number | null, stdout: string, stderr: string, options?: DaemonErrorOptions);
22
+ /**
23
+ * Check if the command failed due to a non-zero exit code
24
+ */
25
+ isNonZeroExit(): boolean;
26
+ }
27
+ /**
28
+ * Thrown when a command executable is not found
29
+ */
30
+ export declare class CommandNotFoundError extends CommandExecutionError {
31
+ constructor(command: string, options?: DaemonErrorOptions);
32
+ }
33
+ /**
34
+ * Thrown when a command execution times out
35
+ */
36
+ export declare class CommandTimeoutError extends CommandExecutionError {
37
+ constructor(command: string, timeout: number, options?: DaemonErrorOptions);
38
+ }
39
+ /**
40
+ * Thrown when a command returns a non-zero exit code
41
+ */
42
+ export declare class CommandFailedError extends CommandExecutionError {
43
+ constructor(command: string, exitCode: number, stdout: string, stderr: string, options?: DaemonErrorOptions);
44
+ }
45
+ /**
46
+ * Thrown when command arguments are invalid
47
+ */
48
+ export declare class InvalidCommandArgumentsError extends CommandExecutionError {
49
+ constructor(command: string, reason: string, options?: DaemonErrorOptions);
50
+ }
51
+ /**
52
+ * Thrown when a command is cancelled by the user or system
53
+ */
54
+ export declare class CommandCancelledError extends CommandExecutionError {
55
+ constructor(command: string, options?: DaemonErrorOptions);
56
+ }
57
+ export type { DaemonErrorOptions, ErrorContext };
58
+ //# sourceMappingURL=command.error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.error.d.ts","sourceRoot":"","sources":["../../../src/shared/errors/command.error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE1F;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,SAAgB,OAAO,EAAE,MAAM,CAAC;IAChC,SAAgB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAG7B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,kBAAkB;IAmB9B;;OAEG;IACH,aAAa,IAAI,OAAO;CAGzB;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,qBAAqB;gBACjD,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB;CAW1D;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,qBAAqB;gBAChD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB;CAiB3E;AAED;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,qBAAqB;gBAEzD,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,kBAAkB;CAY/B;AAED;;GAEG;AACH,qBAAa,4BAA6B,SAAQ,qBAAqB;gBACzD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB;CAiB1E;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,qBAAqB;gBAClD,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB;CAW1D;AAGD,YAAY,EAAE,kBAAkB,EAAE,YAAY,EAAE,CAAC"}