@outputai/cli 0.1.2-dev.0 → 0.1.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.
Files changed (278) hide show
  1. package/package.json +7 -7
  2. package/dist/api/generated/api.d.ts +0 -820
  3. package/dist/api/generated/api.js +0 -226
  4. package/dist/api/http_client.d.ts +0 -27
  5. package/dist/api/http_client.js +0 -71
  6. package/dist/api/orval_post_process.d.ts +0 -11
  7. package/dist/api/orval_post_process.js +0 -46
  8. package/dist/api/parser.d.ts +0 -17
  9. package/dist/api/parser.js +0 -68
  10. package/dist/assets/config/costs.yml +0 -309
  11. package/dist/assets/docker/docker-compose-dev.yml +0 -146
  12. package/dist/commands/credentials/edit.d.ts +0 -10
  13. package/dist/commands/credentials/edit.js +0 -67
  14. package/dist/commands/credentials/edit.spec.d.ts +0 -1
  15. package/dist/commands/credentials/edit.spec.js +0 -73
  16. package/dist/commands/credentials/get.d.ts +0 -13
  17. package/dist/commands/credentials/get.js +0 -46
  18. package/dist/commands/credentials/get.spec.d.ts +0 -1
  19. package/dist/commands/credentials/get.spec.js +0 -74
  20. package/dist/commands/credentials/init.d.ts +0 -11
  21. package/dist/commands/credentials/init.js +0 -45
  22. package/dist/commands/credentials/init.spec.d.ts +0 -1
  23. package/dist/commands/credentials/init.spec.js +0 -68
  24. package/dist/commands/credentials/show.d.ts +0 -10
  25. package/dist/commands/credentials/show.js +0 -33
  26. package/dist/commands/credentials/show.spec.d.ts +0 -1
  27. package/dist/commands/credentials/show.spec.js +0 -57
  28. package/dist/commands/dev/eject.d.ts +0 -11
  29. package/dist/commands/dev/eject.js +0 -58
  30. package/dist/commands/dev/eject.spec.d.ts +0 -1
  31. package/dist/commands/dev/eject.spec.js +0 -109
  32. package/dist/commands/dev/index.d.ts +0 -13
  33. package/dist/commands/dev/index.js +0 -162
  34. package/dist/commands/dev/index.spec.d.ts +0 -1
  35. package/dist/commands/dev/index.spec.js +0 -239
  36. package/dist/commands/init.d.ts +0 -12
  37. package/dist/commands/init.js +0 -37
  38. package/dist/commands/init.spec.d.ts +0 -1
  39. package/dist/commands/init.spec.js +0 -100
  40. package/dist/commands/update.d.ts +0 -14
  41. package/dist/commands/update.js +0 -120
  42. package/dist/commands/update.spec.d.ts +0 -1
  43. package/dist/commands/update.spec.js +0 -178
  44. package/dist/commands/workflow/cost.d.ts +0 -16
  45. package/dist/commands/workflow/cost.js +0 -71
  46. package/dist/commands/workflow/cost.spec.d.ts +0 -1
  47. package/dist/commands/workflow/cost.spec.js +0 -47
  48. package/dist/commands/workflow/dataset/generate.d.ts +0 -22
  49. package/dist/commands/workflow/dataset/generate.js +0 -143
  50. package/dist/commands/workflow/dataset/list.d.ts +0 -12
  51. package/dist/commands/workflow/dataset/list.js +0 -87
  52. package/dist/commands/workflow/debug.d.ts +0 -16
  53. package/dist/commands/workflow/debug.js +0 -60
  54. package/dist/commands/workflow/debug.spec.d.ts +0 -1
  55. package/dist/commands/workflow/debug.spec.js +0 -34
  56. package/dist/commands/workflow/generate.d.ts +0 -17
  57. package/dist/commands/workflow/generate.js +0 -85
  58. package/dist/commands/workflow/generate.spec.d.ts +0 -1
  59. package/dist/commands/workflow/generate.spec.js +0 -115
  60. package/dist/commands/workflow/list.d.ts +0 -22
  61. package/dist/commands/workflow/list.js +0 -152
  62. package/dist/commands/workflow/list.spec.d.ts +0 -1
  63. package/dist/commands/workflow/list.spec.js +0 -99
  64. package/dist/commands/workflow/plan.d.ts +0 -12
  65. package/dist/commands/workflow/plan.js +0 -66
  66. package/dist/commands/workflow/plan.spec.d.ts +0 -1
  67. package/dist/commands/workflow/plan.spec.js +0 -341
  68. package/dist/commands/workflow/reset.d.ts +0 -14
  69. package/dist/commands/workflow/reset.js +0 -51
  70. package/dist/commands/workflow/result.d.ts +0 -13
  71. package/dist/commands/workflow/result.js +0 -46
  72. package/dist/commands/workflow/result.spec.d.ts +0 -1
  73. package/dist/commands/workflow/result.spec.js +0 -23
  74. package/dist/commands/workflow/run.d.ts +0 -16
  75. package/dist/commands/workflow/run.js +0 -97
  76. package/dist/commands/workflow/run.spec.d.ts +0 -1
  77. package/dist/commands/workflow/run.spec.js +0 -110
  78. package/dist/commands/workflow/runs/list.d.ts +0 -14
  79. package/dist/commands/workflow/runs/list.js +0 -104
  80. package/dist/commands/workflow/start.d.ts +0 -15
  81. package/dist/commands/workflow/start.js +0 -62
  82. package/dist/commands/workflow/start.spec.d.ts +0 -1
  83. package/dist/commands/workflow/start.spec.js +0 -28
  84. package/dist/commands/workflow/status.d.ts +0 -13
  85. package/dist/commands/workflow/status.js +0 -57
  86. package/dist/commands/workflow/status.spec.d.ts +0 -1
  87. package/dist/commands/workflow/status.spec.js +0 -33
  88. package/dist/commands/workflow/stop.d.ts +0 -10
  89. package/dist/commands/workflow/stop.js +0 -31
  90. package/dist/commands/workflow/stop.spec.d.ts +0 -1
  91. package/dist/commands/workflow/stop.spec.js +0 -17
  92. package/dist/commands/workflow/terminate.d.ts +0 -13
  93. package/dist/commands/workflow/terminate.js +0 -39
  94. package/dist/commands/workflow/test_eval.d.ts +0 -20
  95. package/dist/commands/workflow/test_eval.js +0 -151
  96. package/dist/config.d.ts +0 -47
  97. package/dist/config.js +0 -47
  98. package/dist/generated/framework_version.json +0 -3
  99. package/dist/hooks/init.d.ts +0 -3
  100. package/dist/hooks/init.js +0 -30
  101. package/dist/hooks/init.spec.d.ts +0 -1
  102. package/dist/hooks/init.spec.js +0 -54
  103. package/dist/index.d.ts +0 -1
  104. package/dist/index.js +0 -1
  105. package/dist/index.spec.d.ts +0 -1
  106. package/dist/index.spec.js +0 -6
  107. package/dist/services/claude_client.d.ts +0 -30
  108. package/dist/services/claude_client.integration.test.d.ts +0 -1
  109. package/dist/services/claude_client.integration.test.js +0 -43
  110. package/dist/services/claude_client.js +0 -215
  111. package/dist/services/claude_client.spec.d.ts +0 -1
  112. package/dist/services/claude_client.spec.js +0 -145
  113. package/dist/services/coding_agents.d.ts +0 -36
  114. package/dist/services/coding_agents.js +0 -236
  115. package/dist/services/coding_agents.spec.d.ts +0 -1
  116. package/dist/services/coding_agents.spec.js +0 -256
  117. package/dist/services/copy_assets.spec.d.ts +0 -1
  118. package/dist/services/copy_assets.spec.js +0 -22
  119. package/dist/services/cost_calculator.d.ts +0 -18
  120. package/dist/services/cost_calculator.js +0 -359
  121. package/dist/services/cost_calculator.spec.d.ts +0 -1
  122. package/dist/services/cost_calculator.spec.js +0 -540
  123. package/dist/services/credentials_service.d.ts +0 -12
  124. package/dist/services/credentials_service.integration.test.d.ts +0 -1
  125. package/dist/services/credentials_service.integration.test.js +0 -66
  126. package/dist/services/credentials_service.js +0 -64
  127. package/dist/services/credentials_service.spec.d.ts +0 -1
  128. package/dist/services/credentials_service.spec.js +0 -106
  129. package/dist/services/datasets.d.ts +0 -20
  130. package/dist/services/datasets.js +0 -132
  131. package/dist/services/docker.d.ts +0 -38
  132. package/dist/services/docker.js +0 -148
  133. package/dist/services/docker.spec.d.ts +0 -1
  134. package/dist/services/docker.spec.js +0 -124
  135. package/dist/services/env_configurator.d.ts +0 -15
  136. package/dist/services/env_configurator.js +0 -163
  137. package/dist/services/env_configurator.spec.d.ts +0 -1
  138. package/dist/services/env_configurator.spec.js +0 -192
  139. package/dist/services/generate_plan_name@v1.prompt +0 -24
  140. package/dist/services/messages.d.ts +0 -9
  141. package/dist/services/messages.js +0 -338
  142. package/dist/services/messages.spec.d.ts +0 -1
  143. package/dist/services/messages.spec.js +0 -55
  144. package/dist/services/npm_update_service.d.ts +0 -6
  145. package/dist/services/npm_update_service.js +0 -87
  146. package/dist/services/npm_update_service.spec.d.ts +0 -1
  147. package/dist/services/npm_update_service.spec.js +0 -104
  148. package/dist/services/project_scaffold.d.ts +0 -31
  149. package/dist/services/project_scaffold.js +0 -212
  150. package/dist/services/project_scaffold.spec.d.ts +0 -1
  151. package/dist/services/project_scaffold.spec.js +0 -122
  152. package/dist/services/s3_trace_downloader.d.ts +0 -12
  153. package/dist/services/s3_trace_downloader.js +0 -57
  154. package/dist/services/template_processor.d.ts +0 -14
  155. package/dist/services/template_processor.js +0 -57
  156. package/dist/services/trace_reader.d.ts +0 -16
  157. package/dist/services/trace_reader.js +0 -57
  158. package/dist/services/trace_reader.spec.d.ts +0 -1
  159. package/dist/services/trace_reader.spec.js +0 -78
  160. package/dist/services/version_check.d.ts +0 -6
  161. package/dist/services/version_check.js +0 -52
  162. package/dist/services/version_check.spec.d.ts +0 -1
  163. package/dist/services/version_check.spec.js +0 -106
  164. package/dist/services/workflow_builder.d.ts +0 -16
  165. package/dist/services/workflow_builder.js +0 -86
  166. package/dist/services/workflow_builder.spec.d.ts +0 -1
  167. package/dist/services/workflow_builder.spec.js +0 -165
  168. package/dist/services/workflow_generator.d.ts +0 -5
  169. package/dist/services/workflow_generator.js +0 -40
  170. package/dist/services/workflow_generator.spec.d.ts +0 -1
  171. package/dist/services/workflow_generator.spec.js +0 -77
  172. package/dist/services/workflow_planner.d.ts +0 -15
  173. package/dist/services/workflow_planner.js +0 -48
  174. package/dist/services/workflow_planner.spec.d.ts +0 -1
  175. package/dist/services/workflow_planner.spec.js +0 -122
  176. package/dist/services/workflow_runs.d.ts +0 -14
  177. package/dist/services/workflow_runs.js +0 -25
  178. package/dist/templates/agent_instructions/CLAUDE.md.template +0 -19
  179. package/dist/templates/agent_instructions/dotclaude/settings.json.template +0 -29
  180. package/dist/templates/project/.env.example.template +0 -9
  181. package/dist/templates/project/.gitignore.template +0 -35
  182. package/dist/templates/project/README.md.template +0 -100
  183. package/dist/templates/project/config/costs.yml.template +0 -29
  184. package/dist/templates/project/package.json.template +0 -25
  185. package/dist/templates/project/src/clients/jina.ts.template +0 -30
  186. package/dist/templates/project/src/shared/utils/string.ts.template +0 -3
  187. package/dist/templates/project/src/shared/utils/url.ts.template +0 -15
  188. package/dist/templates/project/src/workflows/blog_evaluator/evaluators.ts.template +0 -23
  189. package/dist/templates/project/src/workflows/blog_evaluator/prompts/signal_noise@v1.prompt.template +0 -26
  190. package/dist/templates/project/src/workflows/blog_evaluator/scenarios/paulgraham_hwh.json.template +0 -3
  191. package/dist/templates/project/src/workflows/blog_evaluator/steps.ts.template +0 -27
  192. package/dist/templates/project/src/workflows/blog_evaluator/types.ts.template +0 -30
  193. package/dist/templates/project/src/workflows/blog_evaluator/utils.ts.template +0 -15
  194. package/dist/templates/project/src/workflows/blog_evaluator/workflow.ts.template +0 -27
  195. package/dist/templates/project/tsconfig.json.template +0 -20
  196. package/dist/templates/workflow/README.md.template +0 -216
  197. package/dist/templates/workflow/evaluators.ts.template +0 -21
  198. package/dist/templates/workflow/prompts/example@v1.prompt.template +0 -15
  199. package/dist/templates/workflow/scenarios/test_input.json.template +0 -3
  200. package/dist/templates/workflow/steps.ts.template +0 -20
  201. package/dist/templates/workflow/types.ts.template +0 -13
  202. package/dist/templates/workflow/workflow.ts.template +0 -23
  203. package/dist/test_helpers/mocks.d.ts +0 -38
  204. package/dist/test_helpers/mocks.js +0 -77
  205. package/dist/types/cost.d.ts +0 -149
  206. package/dist/types/cost.js +0 -6
  207. package/dist/types/domain.d.ts +0 -20
  208. package/dist/types/domain.js +0 -4
  209. package/dist/types/errors.d.ts +0 -68
  210. package/dist/types/errors.js +0 -100
  211. package/dist/types/errors.spec.d.ts +0 -1
  212. package/dist/types/errors.spec.js +0 -18
  213. package/dist/types/generator.d.ts +0 -26
  214. package/dist/types/generator.js +0 -1
  215. package/dist/types/trace.d.ts +0 -161
  216. package/dist/types/trace.js +0 -18
  217. package/dist/utils/claude.d.ts +0 -5
  218. package/dist/utils/claude.js +0 -19
  219. package/dist/utils/claude.spec.d.ts +0 -1
  220. package/dist/utils/claude.spec.js +0 -119
  221. package/dist/utils/constants.d.ts +0 -5
  222. package/dist/utils/constants.js +0 -4
  223. package/dist/utils/cost_formatter.d.ts +0 -5
  224. package/dist/utils/cost_formatter.js +0 -218
  225. package/dist/utils/date_formatter.d.ts +0 -23
  226. package/dist/utils/date_formatter.js +0 -49
  227. package/dist/utils/env_loader.d.ts +0 -1
  228. package/dist/utils/env_loader.js +0 -22
  229. package/dist/utils/env_loader.spec.d.ts +0 -1
  230. package/dist/utils/env_loader.spec.js +0 -43
  231. package/dist/utils/error_handler.d.ts +0 -8
  232. package/dist/utils/error_handler.js +0 -71
  233. package/dist/utils/error_utils.d.ts +0 -24
  234. package/dist/utils/error_utils.js +0 -87
  235. package/dist/utils/file_system.d.ts +0 -3
  236. package/dist/utils/file_system.js +0 -33
  237. package/dist/utils/format_workflow_result.d.ts +0 -5
  238. package/dist/utils/format_workflow_result.js +0 -18
  239. package/dist/utils/format_workflow_result.spec.d.ts +0 -1
  240. package/dist/utils/format_workflow_result.spec.js +0 -81
  241. package/dist/utils/framework_version.d.ts +0 -4
  242. package/dist/utils/framework_version.js +0 -4
  243. package/dist/utils/framework_version.spec.d.ts +0 -1
  244. package/dist/utils/framework_version.spec.js +0 -13
  245. package/dist/utils/header_utils.d.ts +0 -12
  246. package/dist/utils/header_utils.js +0 -29
  247. package/dist/utils/header_utils.spec.d.ts +0 -1
  248. package/dist/utils/header_utils.spec.js +0 -52
  249. package/dist/utils/input_parser.d.ts +0 -1
  250. package/dist/utils/input_parser.js +0 -19
  251. package/dist/utils/output_formatter.d.ts +0 -2
  252. package/dist/utils/output_formatter.js +0 -11
  253. package/dist/utils/paths.d.ts +0 -25
  254. package/dist/utils/paths.js +0 -36
  255. package/dist/utils/process.d.ts +0 -4
  256. package/dist/utils/process.js +0 -50
  257. package/dist/utils/resolve_input.d.ts +0 -1
  258. package/dist/utils/resolve_input.js +0 -22
  259. package/dist/utils/scenario_resolver.d.ts +0 -9
  260. package/dist/utils/scenario_resolver.js +0 -93
  261. package/dist/utils/scenario_resolver.spec.d.ts +0 -1
  262. package/dist/utils/scenario_resolver.spec.js +0 -214
  263. package/dist/utils/secret_sanitizer.d.ts +0 -1
  264. package/dist/utils/secret_sanitizer.js +0 -29
  265. package/dist/utils/sleep.d.ts +0 -5
  266. package/dist/utils/sleep.js +0 -5
  267. package/dist/utils/template.d.ts +0 -9
  268. package/dist/utils/template.js +0 -30
  269. package/dist/utils/template.spec.d.ts +0 -1
  270. package/dist/utils/template.spec.js +0 -77
  271. package/dist/utils/trace_extractor.d.ts +0 -27
  272. package/dist/utils/trace_extractor.js +0 -53
  273. package/dist/utils/trace_formatter.d.ts +0 -11
  274. package/dist/utils/trace_formatter.js +0 -402
  275. package/dist/utils/validation.d.ts +0 -13
  276. package/dist/utils/validation.js +0 -25
  277. package/dist/utils/validation.spec.d.ts +0 -1
  278. package/dist/utils/validation.spec.js +0 -140
@@ -1,214 +0,0 @@
1
- import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest';
2
- import { resolveScenarioPath, getScenarioNotFoundMessage, extractWorkflowRelativePath, listScenariosForWorkflow } from './scenario_resolver.js';
3
- import * as fs from 'node:fs';
4
- import * as api from '#api/generated/api.js';
5
- vi.mock('node:fs', () => ({
6
- existsSync: vi.fn(),
7
- readdirSync: vi.fn()
8
- }));
9
- vi.mock('#api/generated/api.js', () => ({
10
- getWorkflowCatalog: vi.fn()
11
- }));
12
- function mockCatalog(workflows) {
13
- vi.mocked(api.getWorkflowCatalog).mockResolvedValue({
14
- data: { workflows },
15
- status: 200,
16
- headers: new Headers()
17
- });
18
- }
19
- function mockCatalogFailure() {
20
- vi.mocked(api.getWorkflowCatalog).mockRejectedValue(new Error('API unavailable'));
21
- }
22
- describe('extractWorkflowRelativePath', () => {
23
- it('should extract relative path from workflow.js path', () => {
24
- expect(extractWorkflowRelativePath('/app/dist/workflows/basic_research/workflow.js'))
25
- .toBe('basic_research');
26
- });
27
- it('should extract nested relative path', () => {
28
- expect(extractWorkflowRelativePath('/app/dist/workflows/viz_examples/01_simple_linear/workflow.js'))
29
- .toBe('viz_examples/01_simple_linear');
30
- });
31
- it('should handle workflow.ts extension', () => {
32
- expect(extractWorkflowRelativePath('/src/workflows/my_flow/workflow.ts'))
33
- .toBe('my_flow');
34
- });
35
- it('should return null for non-matching paths', () => {
36
- expect(extractWorkflowRelativePath('/app/dist/other/workflow.js')).toBeNull();
37
- expect(extractWorkflowRelativePath('/app/dist/workflows/')).toBeNull();
38
- });
39
- });
40
- describe('resolveScenarioPath', () => {
41
- beforeEach(() => {
42
- vi.resetAllMocks();
43
- });
44
- afterEach(() => {
45
- vi.restoreAllMocks();
46
- });
47
- describe('when API returns workflow with path', () => {
48
- it('should resolve scenario using catalog path', async () => {
49
- mockCatalog([{ name: 'my_workflow', path: '/app/dist/workflows/my_workflow/workflow.js' }]);
50
- vi.mocked(fs.existsSync).mockImplementation(path => {
51
- return String(path).includes('src/workflows/my_workflow/scenarios/test_scenario.json');
52
- });
53
- const result = await resolveScenarioPath('my_workflow', 'test_scenario', '/project');
54
- expect(result.found).toBe(true);
55
- expect(result.path).toContain('src/workflows/my_workflow/scenarios/test_scenario.json');
56
- });
57
- it('should resolve when workflow name differs from folder name', async () => {
58
- mockCatalog([{ name: 'simpleLinear', path: '/app/dist/workflows/viz_examples/01_simple_linear/workflow.js' }]);
59
- vi.mocked(fs.existsSync).mockImplementation(path => {
60
- return String(path).includes('src/workflows/viz_examples/01_simple_linear/scenarios/basic.json');
61
- });
62
- const result = await resolveScenarioPath('simpleLinear', 'basic', '/project');
63
- expect(result.found).toBe(true);
64
- expect(result.path).toContain('src/workflows/viz_examples/01_simple_linear/scenarios/basic.json');
65
- });
66
- it('should handle nested workflow directories', async () => {
67
- mockCatalog([{ name: 'deep_flow', path: '/app/dist/workflows/category/sub/deep_flow/workflow.js' }]);
68
- vi.mocked(fs.existsSync).mockImplementation(path => {
69
- return String(path).includes('src/workflows/category/sub/deep_flow/scenarios/test.json');
70
- });
71
- const result = await resolveScenarioPath('deep_flow', 'test', '/project');
72
- expect(result.found).toBe(true);
73
- expect(result.path).toContain('src/workflows/category/sub/deep_flow/scenarios/test.json');
74
- });
75
- it('should return not found when scenario file does not exist', async () => {
76
- mockCatalog([{ name: 'my_workflow', path: '/app/dist/workflows/my_workflow/workflow.js' }]);
77
- vi.mocked(fs.existsSync).mockReturnValue(false);
78
- const result = await resolveScenarioPath('my_workflow', 'missing', '/project');
79
- expect(result.found).toBe(false);
80
- expect(result.searchedPaths.length).toBeGreaterThanOrEqual(2);
81
- });
82
- it('should fall back to convention when catalog path has no scenario but convention does', async () => {
83
- mockCatalog([{ name: 'renamedFlow', path: '/app/dist/workflows/actual_folder/workflow.js' }]);
84
- vi.mocked(fs.existsSync).mockImplementation(path => {
85
- // Not found at catalog-resolved path, but found at convention path
86
- return String(path).includes('src/workflows/renamedFlow/scenarios/test.json');
87
- });
88
- const result = await resolveScenarioPath('renamedFlow', 'test', '/project');
89
- expect(result.found).toBe(true);
90
- expect(result.path).toContain('src/workflows/renamedFlow/scenarios/test.json');
91
- });
92
- });
93
- describe('when API is unavailable', () => {
94
- it('should fall back to convention-based lookup', async () => {
95
- mockCatalogFailure();
96
- vi.mocked(fs.existsSync).mockImplementation(path => {
97
- return String(path).includes('src/workflows/my_workflow/scenarios/test_scenario.json');
98
- });
99
- const result = await resolveScenarioPath('my_workflow', 'test_scenario', '/project');
100
- expect(result.found).toBe(true);
101
- expect(result.path).toContain('src/workflows/my_workflow/scenarios/test_scenario.json');
102
- });
103
- });
104
- describe('when workflow is not in catalog', () => {
105
- it('should fall back to convention-based lookup', async () => {
106
- mockCatalog([{ name: 'other_workflow', path: '/app/dist/workflows/other/workflow.js' }]);
107
- vi.mocked(fs.existsSync).mockImplementation(path => {
108
- return String(path).includes('src/workflows/my_workflow/scenarios/test.json');
109
- });
110
- const result = await resolveScenarioPath('my_workflow', 'test', '/project');
111
- expect(result.found).toBe(true);
112
- expect(result.path).toContain('src/workflows/my_workflow/scenarios/test.json');
113
- });
114
- });
115
- describe('json extension normalization', () => {
116
- it('should handle scenario name with .json extension', async () => {
117
- mockCatalogFailure();
118
- vi.mocked(fs.existsSync).mockImplementation(path => {
119
- return String(path).includes('src/workflows/my_workflow/scenarios/test_scenario.json');
120
- });
121
- const result = await resolveScenarioPath('my_workflow', 'test_scenario.json', '/project');
122
- expect(result.found).toBe(true);
123
- expect(result.path).toContain('test_scenario.json');
124
- expect(result.path).not.toContain('test_scenario.json.json');
125
- });
126
- });
127
- describe('workflows fallback directory', () => {
128
- it('should find scenario in workflows/ fallback path', async () => {
129
- mockCatalogFailure();
130
- vi.mocked(fs.existsSync).mockImplementation(path => {
131
- return String(path).includes('workflows/my_workflow/scenarios/test_scenario.json') &&
132
- !String(path).includes('src/workflows');
133
- });
134
- const result = await resolveScenarioPath('my_workflow', 'test_scenario', '/project');
135
- expect(result.found).toBe(true);
136
- expect(result.path).toContain('workflows/my_workflow/scenarios/test_scenario.json');
137
- });
138
- });
139
- describe('subdirectory scenarios', () => {
140
- it('should support subdirectory paths in scenario name', async () => {
141
- mockCatalogFailure();
142
- vi.mocked(fs.existsSync).mockImplementation(path => {
143
- return String(path).includes('src/workflows/my_workflow/scenarios/complex/deep_test.json');
144
- });
145
- const result = await resolveScenarioPath('my_workflow', 'complex/deep_test', '/project');
146
- expect(result.found).toBe(true);
147
- expect(result.path).toContain('complex/deep_test.json');
148
- });
149
- });
150
- });
151
- describe('listScenariosForWorkflow', () => {
152
- beforeEach(() => {
153
- vi.resetAllMocks();
154
- });
155
- it('should return scenario names from scenarios directory', () => {
156
- vi.mocked(fs.existsSync).mockImplementation(path => String(path).includes('src/workflows/my_workflow/scenarios'));
157
- vi.mocked(fs.readdirSync).mockReturnValue(['basic.json', 'advanced.json', 'README.md']);
158
- const result = listScenariosForWorkflow('my_workflow', undefined, '/project');
159
- expect(result).toEqual(['basic', 'advanced']);
160
- });
161
- it('should use workflowPath from catalog to derive directory', () => {
162
- vi.mocked(fs.existsSync).mockImplementation(path => String(path).includes('src/workflows/viz_examples/01_simple_linear/scenarios'));
163
- vi.mocked(fs.readdirSync).mockReturnValue(['test.json']);
164
- const result = listScenariosForWorkflow('simpleLinear', '/app/dist/workflows/viz_examples/01_simple_linear/workflow.js', '/project');
165
- expect(result).toEqual(['test']);
166
- });
167
- it('should fall back to workflowName when workflowPath is undefined', () => {
168
- vi.mocked(fs.existsSync).mockImplementation(path => String(path).includes('src/workflows/my_workflow/scenarios'));
169
- vi.mocked(fs.readdirSync).mockReturnValue(['scenario_a.json']);
170
- const result = listScenariosForWorkflow('my_workflow', undefined, '/project');
171
- expect(result).toEqual(['scenario_a']);
172
- });
173
- it('should fall back to workflowName when path extraction returns null', () => {
174
- vi.mocked(fs.existsSync).mockImplementation(path => String(path).includes('src/workflows/my_workflow/scenarios'));
175
- vi.mocked(fs.readdirSync).mockReturnValue(['test.json']);
176
- const result = listScenariosForWorkflow('my_workflow', '/invalid/path.js', '/project');
177
- expect(result).toEqual(['test']);
178
- });
179
- it('should return empty array when no scenarios directory exists', () => {
180
- vi.mocked(fs.existsSync).mockReturnValue(false);
181
- const result = listScenariosForWorkflow('my_workflow', undefined, '/project');
182
- expect(result).toEqual([]);
183
- });
184
- it('should try workflows/ fallback when src/workflows/ does not exist', () => {
185
- vi.mocked(fs.existsSync).mockImplementation(path => {
186
- const p = String(path);
187
- return p.includes('workflows/my_workflow/scenarios') && !p.includes('src/workflows');
188
- });
189
- vi.mocked(fs.readdirSync).mockReturnValue(['fallback.json']);
190
- const result = listScenariosForWorkflow('my_workflow', undefined, '/project');
191
- expect(result).toEqual(['fallback']);
192
- });
193
- it('should return empty array for empty scenarios directory', () => {
194
- vi.mocked(fs.existsSync).mockReturnValue(true);
195
- vi.mocked(fs.readdirSync).mockReturnValue([]);
196
- const result = listScenariosForWorkflow('my_workflow', undefined, '/project');
197
- expect(result).toEqual([]);
198
- });
199
- });
200
- describe('getScenarioNotFoundMessage', () => {
201
- it('should return a helpful error message', () => {
202
- const searchedPaths = [
203
- '/project/src/workflows/my_workflow/scenarios/test.json',
204
- '/project/workflows/my_workflow/scenarios/test.json'
205
- ];
206
- const message = getScenarioNotFoundMessage('my_workflow', 'test', searchedPaths);
207
- expect(message).toContain('Scenario \'test\' not found for workflow \'my_workflow\'');
208
- expect(message).toContain('Searched in:');
209
- expect(message).toContain(searchedPaths[0]);
210
- expect(message).toContain(searchedPaths[1]);
211
- expect(message).toContain('Tip:');
212
- expect(message).toContain('--input');
213
- });
214
- });
@@ -1 +0,0 @@
1
- export declare function sanitizeSecrets(value: unknown): unknown;
@@ -1,29 +0,0 @@
1
- import { DeepRedact } from '@hackylabs/deep-redact/index.ts';
2
- const redactor = new DeepRedact({
3
- blacklistedKeys: [
4
- /^(.*_)?(secret|password|passwd|credential|private_key)(_.*)?$/i,
5
- /^(.*_)?(api_key|apikey|access_key|auth_token)(_.*)?$/i
6
- ],
7
- stringTests: [
8
- {
9
- pattern: /sk-[a-zA-Z0-9_-]{20,}/g,
10
- replacer: (value, pattern) => value.replace(pattern, 'sk-***REDACTED***')
11
- },
12
- {
13
- pattern: /AKIA[A-Z0-9]{16}/g,
14
- replacer: (value, pattern) => value.replace(pattern, 'AKIA***REDACTED***')
15
- },
16
- {
17
- pattern: /eyJ[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}\.[a-zA-Z0-9_-]{10,}/g,
18
- replacer: (value, pattern) => value.replace(pattern, '***JWT_REDACTED***')
19
- },
20
- {
21
- pattern: /Bearer\s+[a-zA-Z0-9_.-]{20,}/g,
22
- replacer: (value, pattern) => value.replace(pattern, 'Bearer ***REDACTED***')
23
- }
24
- ],
25
- serialize: false
26
- });
27
- export function sanitizeSecrets(value) {
28
- return redactor.redact(value);
29
- }
@@ -1,5 +0,0 @@
1
- /**
2
- * Resolves after the given delay in milliseconds.
3
- * @param ms - Delay in milliseconds
4
- */
5
- export declare const sleep: (ms: number) => Promise<void>;
@@ -1,5 +0,0 @@
1
- /**
2
- * Resolves after the given delay in milliseconds.
3
- * @param ms - Delay in milliseconds
4
- */
5
- export const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
@@ -1,9 +0,0 @@
1
- /**
2
- * Process a template string with variables
3
- */
4
- export declare function processTemplate(templateContent: string, variables: Record<string, string>): string;
5
- /**
6
- * Prepare template variables from workflow name and description
7
- */
8
- export declare function prepareTemplateVariables(workflowName: string, description: string): Record<string, string>;
9
- export { camelCase, pascalCase } from 'change-case';
@@ -1,30 +0,0 @@
1
- import Handlebars from 'handlebars';
2
- import { camelCase, pascalCase } from 'change-case';
3
- /**
4
- * Create a Handlebars compiler with custom helpers
5
- */
6
- function createCompiler() {
7
- const compiler = Handlebars.create();
8
- compiler.registerHelper('camelCase', (str) => camelCase(str));
9
- compiler.registerHelper('pascalCase', (str) => pascalCase(str));
10
- return compiler;
11
- }
12
- /**
13
- * Process a template string with variables
14
- */
15
- export function processTemplate(templateContent, variables) {
16
- const compiler = createCompiler();
17
- const template = compiler.compile(templateContent);
18
- return template(variables);
19
- }
20
- /**
21
- * Prepare template variables from workflow name and description
22
- */
23
- export function prepareTemplateVariables(workflowName, description) {
24
- return {
25
- workflowName: camelCase(workflowName),
26
- WorkflowName: pascalCase(workflowName),
27
- description: description || `A ${workflowName} workflow`
28
- };
29
- }
30
- export { camelCase, pascalCase } from 'change-case';
@@ -1 +0,0 @@
1
- export {};
@@ -1,77 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { camelCase, pascalCase, processTemplate, prepareTemplateVariables } from './template.js';
3
- describe('Template Utilities', () => {
4
- describe('pascalCase', () => {
5
- it('should convert kebab-case to PascalCase', () => {
6
- expect(pascalCase('my-workflow-name')).toBe('MyWorkflowName');
7
- });
8
- it('should convert snake_case to PascalCase', () => {
9
- expect(pascalCase('my_workflow_name')).toBe('MyWorkflowName');
10
- });
11
- it('should handle single word', () => {
12
- expect(pascalCase('workflow')).toBe('Workflow');
13
- });
14
- it('should handle mixed separators', () => {
15
- expect(pascalCase('my-workflow_name')).toBe('MyWorkflowName');
16
- });
17
- });
18
- describe('camelCase', () => {
19
- it('should convert kebab-case to camelCase', () => {
20
- expect(camelCase('my-workflow-name')).toBe('myWorkflowName');
21
- });
22
- it('should convert snake_case to camelCase', () => {
23
- expect(camelCase('my_workflow_name')).toBe('myWorkflowName');
24
- });
25
- it('should handle single word', () => {
26
- expect(camelCase('workflow')).toBe('workflow');
27
- });
28
- });
29
- describe('processTemplate', () => {
30
- it('should replace single variable', () => {
31
- const template = 'Hello {{name}}!';
32
- const variables = { name: 'World' };
33
- expect(processTemplate(template, variables)).toBe('Hello World!');
34
- });
35
- it('should replace multiple variables', () => {
36
- const template = 'Workflow {{workflowName}} - {{description}}';
37
- const variables = {
38
- workflowName: 'myWorkflow',
39
- description: 'A test workflow'
40
- };
41
- expect(processTemplate(template, variables))
42
- .toBe('Workflow myWorkflow - A test workflow');
43
- });
44
- it('should replace multiple occurrences of same variable', () => {
45
- const template = '{{name}} says hello to {{name}}';
46
- const variables = { name: 'Alice' };
47
- expect(processTemplate(template, variables))
48
- .toBe('Alice says hello to Alice');
49
- });
50
- it('should use Handlebars helpers for case transformations', () => {
51
- const template = '{{camelCase name}} and {{pascalCase name}}';
52
- const variables = { name: 'my-workflow-name' };
53
- expect(processTemplate(template, variables))
54
- .toBe('myWorkflowName and MyWorkflowName');
55
- });
56
- it('should preserve escaped curly braces for Liquid.js examples', () => {
57
- const template = 'Use Liquid: \\{{ variable }} and {% if %}...{% endif %}';
58
- const variables = {};
59
- expect(processTemplate(template, variables))
60
- .toBe('Use Liquid: {{ variable }} and {% if %}...{% endif %}');
61
- });
62
- });
63
- describe('prepareTemplateVariables', () => {
64
- it('should prepare variables from workflow name and description', () => {
65
- const variables = prepareTemplateVariables('my-test-workflow', 'A test workflow for testing');
66
- expect(variables).toEqual({
67
- workflowName: 'myTestWorkflow',
68
- WorkflowName: 'MyTestWorkflow',
69
- description: 'A test workflow for testing'
70
- });
71
- });
72
- it('should provide default description if not provided', () => {
73
- const variables = prepareTemplateVariables('test-workflow', '');
74
- expect(variables.description).toBe('A test-workflow workflow');
75
- });
76
- });
77
- });
@@ -1,27 +0,0 @@
1
- export interface ExtractedDataset {
2
- input: Record<string, unknown>;
3
- output: unknown;
4
- executionTimeMs?: number;
5
- }
6
- interface TraceFile {
7
- input?: unknown;
8
- output?: unknown;
9
- startedAt?: number;
10
- endedAt?: number;
11
- duration?: number;
12
- root?: {
13
- startTime?: number;
14
- endTime?: number;
15
- duration?: number;
16
- };
17
- events?: Array<{
18
- phase: string;
19
- details?: unknown;
20
- }>;
21
- children?: Array<{
22
- input?: unknown;
23
- output?: unknown;
24
- }>;
25
- }
26
- export declare function extractDatasetFromTrace(traceData: TraceFile): ExtractedDataset;
27
- export {};
@@ -1,53 +0,0 @@
1
- function isRecord(value) {
2
- return value !== null && value !== undefined && typeof value === 'object';
3
- }
4
- function unwrapOutput(output) {
5
- if (isRecord(output) && 'output' in output && 'trace' in output) {
6
- return output.output;
7
- }
8
- return output;
9
- }
10
- function findInput(trace) {
11
- if (isRecord(trace.input)) {
12
- return trace.input;
13
- }
14
- const startEvent = trace.events?.find(e => e.phase === 'start');
15
- const eventInput = startEvent?.details?.input;
16
- if (isRecord(eventInput)) {
17
- return eventInput;
18
- }
19
- const childInput = trace.children?.[0]?.input;
20
- return isRecord(childInput) ? childInput : undefined;
21
- }
22
- function findOutput(trace) {
23
- if (trace.output !== undefined) {
24
- return unwrapOutput(trace.output);
25
- }
26
- const endEvent = trace.events ?
27
- [...trace.events].reverse().find(e => e.phase === 'end') :
28
- undefined;
29
- const eventOutput = endEvent?.details?.output;
30
- if (eventOutput !== undefined) {
31
- return unwrapOutput(eventOutput);
32
- }
33
- const childOutput = trace.children?.[0]?.output;
34
- return childOutput !== undefined ? unwrapOutput(childOutput) : undefined;
35
- }
36
- function computeExecutionTime(trace) {
37
- if (trace.startedAt && trace.endedAt) {
38
- return trace.endedAt - trace.startedAt;
39
- }
40
- if (trace.root?.startTime && trace.root?.endTime) {
41
- return trace.root.endTime - trace.root.startTime;
42
- }
43
- return trace.duration ?? trace.root?.duration ?? undefined;
44
- }
45
- export function extractDatasetFromTrace(traceData) {
46
- const input = findInput(traceData);
47
- if (!input) {
48
- throw new Error('Could not extract input from trace data. Trace may be incomplete.');
49
- }
50
- const output = findOutput(traceData);
51
- const executionTimeMs = computeExecutionTime(traceData);
52
- return { input, output, executionTimeMs };
53
- }
@@ -1,11 +0,0 @@
1
- import { formatDuration } from '#utils/date_formatter.js';
2
- export { formatDuration };
3
- export declare function format(traceData: string | object, outputFormat?: 'json' | 'text'): string;
4
- export declare function getSummary(traceData: string | object): {
5
- totalDuration: number;
6
- totalEvents: number;
7
- totalSteps: number;
8
- totalActivities: number;
9
- hasErrors: boolean;
10
- };
11
- export declare function displayDebugTree(node: unknown): string;