@arke-institute/rhiza 0.1.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 (230) hide show
  1. package/README.md +106 -0
  2. package/dist/__tests__/fixtures/index.d.ts +9 -0
  3. package/dist/__tests__/fixtures/index.d.ts.map +1 -0
  4. package/dist/__tests__/fixtures/index.js +12 -0
  5. package/dist/__tests__/fixtures/index.js.map +1 -0
  6. package/dist/__tests__/fixtures/kladoi/index.d.ts +165 -0
  7. package/dist/__tests__/fixtures/kladoi/index.d.ts.map +1 -0
  8. package/dist/__tests__/fixtures/kladoi/index.js +270 -0
  9. package/dist/__tests__/fixtures/kladoi/index.js.map +1 -0
  10. package/dist/__tests__/fixtures/logs/index.d.ts +19 -0
  11. package/dist/__tests__/fixtures/logs/index.d.ts.map +1 -0
  12. package/dist/__tests__/fixtures/logs/index.js +545 -0
  13. package/dist/__tests__/fixtures/logs/index.js.map +1 -0
  14. package/dist/__tests__/fixtures/mock-client.d.ts +127 -0
  15. package/dist/__tests__/fixtures/mock-client.d.ts.map +1 -0
  16. package/dist/__tests__/fixtures/mock-client.js +415 -0
  17. package/dist/__tests__/fixtures/mock-client.js.map +1 -0
  18. package/dist/__tests__/fixtures/rhizai/index.d.ts +54 -0
  19. package/dist/__tests__/fixtures/rhizai/index.d.ts.map +1 -0
  20. package/dist/__tests__/fixtures/rhizai/index.js +283 -0
  21. package/dist/__tests__/fixtures/rhizai/index.js.map +1 -0
  22. package/dist/__tests__/unit/fixtures.test.d.ts +10 -0
  23. package/dist/__tests__/unit/fixtures.test.d.ts.map +1 -0
  24. package/dist/__tests__/unit/fixtures.test.js +275 -0
  25. package/dist/__tests__/unit/fixtures.test.js.map +1 -0
  26. package/dist/__tests__/unit/handoff/gather.test.d.ts +8 -0
  27. package/dist/__tests__/unit/handoff/gather.test.d.ts.map +1 -0
  28. package/dist/__tests__/unit/handoff/gather.test.js +176 -0
  29. package/dist/__tests__/unit/handoff/gather.test.js.map +1 -0
  30. package/dist/__tests__/unit/handoff/interpret.test.d.ts +9 -0
  31. package/dist/__tests__/unit/handoff/interpret.test.d.ts.map +1 -0
  32. package/dist/__tests__/unit/handoff/interpret.test.js +370 -0
  33. package/dist/__tests__/unit/handoff/interpret.test.js.map +1 -0
  34. package/dist/__tests__/unit/handoff/route.test.d.ts +8 -0
  35. package/dist/__tests__/unit/handoff/route.test.d.ts.map +1 -0
  36. package/dist/__tests__/unit/handoff/route.test.js +271 -0
  37. package/dist/__tests__/unit/handoff/route.test.js.map +1 -0
  38. package/dist/__tests__/unit/handoff/scatter.test.d.ts +7 -0
  39. package/dist/__tests__/unit/handoff/scatter.test.d.ts.map +1 -0
  40. package/dist/__tests__/unit/handoff/scatter.test.js +54 -0
  41. package/dist/__tests__/unit/handoff/scatter.test.js.map +1 -0
  42. package/dist/__tests__/unit/resume.test.d.ts +8 -0
  43. package/dist/__tests__/unit/resume.test.d.ts.map +1 -0
  44. package/dist/__tests__/unit/resume.test.js +134 -0
  45. package/dist/__tests__/unit/resume.test.js.map +1 -0
  46. package/dist/__tests__/unit/status.test.d.ts +8 -0
  47. package/dist/__tests__/unit/status.test.d.ts.map +1 -0
  48. package/dist/__tests__/unit/status.test.js +164 -0
  49. package/dist/__tests__/unit/status.test.js.map +1 -0
  50. package/dist/__tests__/unit/target.test.d.ts +8 -0
  51. package/dist/__tests__/unit/target.test.d.ts.map +1 -0
  52. package/dist/__tests__/unit/target.test.js +116 -0
  53. package/dist/__tests__/unit/target.test.js.map +1 -0
  54. package/dist/__tests__/unit/traverse.test.d.ts +8 -0
  55. package/dist/__tests__/unit/traverse.test.d.ts.map +1 -0
  56. package/dist/__tests__/unit/traverse.test.js +143 -0
  57. package/dist/__tests__/unit/traverse.test.js.map +1 -0
  58. package/dist/__tests__/unit/validation/klados.test.d.ts +16 -0
  59. package/dist/__tests__/unit/validation/klados.test.d.ts.map +1 -0
  60. package/dist/__tests__/unit/validation/klados.test.js +275 -0
  61. package/dist/__tests__/unit/validation/klados.test.js.map +1 -0
  62. package/dist/__tests__/unit/validation/rhiza.test.d.ts +16 -0
  63. package/dist/__tests__/unit/validation/rhiza.test.d.ts.map +1 -0
  64. package/dist/__tests__/unit/validation/rhiza.test.js +612 -0
  65. package/dist/__tests__/unit/validation/rhiza.test.js.map +1 -0
  66. package/dist/__tests__/unit/validation/runtime.test.d.ts +11 -0
  67. package/dist/__tests__/unit/validation/runtime.test.d.ts.map +1 -0
  68. package/dist/__tests__/unit/validation/runtime.test.js +553 -0
  69. package/dist/__tests__/unit/validation/runtime.test.js.map +1 -0
  70. package/dist/__tests__/unit/worker/errors.test.d.ts +2 -0
  71. package/dist/__tests__/unit/worker/errors.test.d.ts.map +1 -0
  72. package/dist/__tests__/unit/worker/errors.test.js +226 -0
  73. package/dist/__tests__/unit/worker/errors.test.js.map +1 -0
  74. package/dist/__tests__/unit/worker/job.test.d.ts +2 -0
  75. package/dist/__tests__/unit/worker/job.test.d.ts.map +1 -0
  76. package/dist/__tests__/unit/worker/job.test.js +233 -0
  77. package/dist/__tests__/unit/worker/job.test.js.map +1 -0
  78. package/dist/client/index.d.ts +10 -0
  79. package/dist/client/index.d.ts.map +1 -0
  80. package/dist/client/index.js +8 -0
  81. package/dist/client/index.js.map +1 -0
  82. package/dist/client/interface.d.ts +142 -0
  83. package/dist/client/interface.d.ts.map +1 -0
  84. package/dist/client/interface.js +8 -0
  85. package/dist/client/interface.js.map +1 -0
  86. package/dist/client/mock.d.ts +95 -0
  87. package/dist/client/mock.d.ts.map +1 -0
  88. package/dist/client/mock.js +795 -0
  89. package/dist/client/mock.js.map +1 -0
  90. package/dist/client/types.d.ts +344 -0
  91. package/dist/client/types.d.ts.map +1 -0
  92. package/dist/client/types.js +8 -0
  93. package/dist/client/types.js.map +1 -0
  94. package/dist/handoff/gather-api.d.ts +60 -0
  95. package/dist/handoff/gather-api.d.ts.map +1 -0
  96. package/dist/handoff/gather-api.js +130 -0
  97. package/dist/handoff/gather-api.js.map +1 -0
  98. package/dist/handoff/gather.d.ts +59 -0
  99. package/dist/handoff/gather.d.ts.map +1 -0
  100. package/dist/handoff/gather.js +134 -0
  101. package/dist/handoff/gather.js.map +1 -0
  102. package/dist/handoff/index.d.ts +19 -0
  103. package/dist/handoff/index.d.ts.map +1 -0
  104. package/dist/handoff/index.js +25 -0
  105. package/dist/handoff/index.js.map +1 -0
  106. package/dist/handoff/interpret.d.ts +79 -0
  107. package/dist/handoff/interpret.d.ts.map +1 -0
  108. package/dist/handoff/interpret.js +197 -0
  109. package/dist/handoff/interpret.js.map +1 -0
  110. package/dist/handoff/invoke.d.ts +82 -0
  111. package/dist/handoff/invoke.d.ts.map +1 -0
  112. package/dist/handoff/invoke.js +196 -0
  113. package/dist/handoff/invoke.js.map +1 -0
  114. package/dist/handoff/route.d.ts +25 -0
  115. package/dist/handoff/route.d.ts.map +1 -0
  116. package/dist/handoff/route.js +65 -0
  117. package/dist/handoff/route.js.map +1 -0
  118. package/dist/handoff/scatter-api.d.ts +62 -0
  119. package/dist/handoff/scatter-api.d.ts.map +1 -0
  120. package/dist/handoff/scatter-api.js +81 -0
  121. package/dist/handoff/scatter-api.js.map +1 -0
  122. package/dist/handoff/scatter.d.ts +19 -0
  123. package/dist/handoff/scatter.d.ts.map +1 -0
  124. package/dist/handoff/scatter.js +27 -0
  125. package/dist/handoff/scatter.js.map +1 -0
  126. package/dist/handoff/target.d.ts +16 -0
  127. package/dist/handoff/target.d.ts.map +1 -0
  128. package/dist/handoff/target.js +51 -0
  129. package/dist/handoff/target.js.map +1 -0
  130. package/dist/index.d.ts +42 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +52 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/logging/index.d.ts +4 -0
  135. package/dist/logging/index.d.ts.map +1 -0
  136. package/dist/logging/index.js +3 -0
  137. package/dist/logging/index.js.map +1 -0
  138. package/dist/logging/logger.d.ts +52 -0
  139. package/dist/logging/logger.d.ts.map +1 -0
  140. package/dist/logging/logger.js +70 -0
  141. package/dist/logging/logger.js.map +1 -0
  142. package/dist/logging/writer.d.ts +63 -0
  143. package/dist/logging/writer.d.ts.map +1 -0
  144. package/dist/logging/writer.js +160 -0
  145. package/dist/logging/writer.js.map +1 -0
  146. package/dist/resume/index.d.ts +77 -0
  147. package/dist/resume/index.d.ts.map +1 -0
  148. package/dist/resume/index.js +110 -0
  149. package/dist/resume/index.js.map +1 -0
  150. package/dist/status/index.d.ts +54 -0
  151. package/dist/status/index.d.ts.map +1 -0
  152. package/dist/status/index.js +107 -0
  153. package/dist/status/index.js.map +1 -0
  154. package/dist/traverse/index.d.ts +53 -0
  155. package/dist/traverse/index.d.ts.map +1 -0
  156. package/dist/traverse/index.js +142 -0
  157. package/dist/traverse/index.js.map +1 -0
  158. package/dist/types/batch.d.ts +53 -0
  159. package/dist/types/batch.d.ts.map +1 -0
  160. package/dist/types/batch.js +2 -0
  161. package/dist/types/batch.js.map +1 -0
  162. package/dist/types/index.d.ts +10 -0
  163. package/dist/types/index.d.ts.map +1 -0
  164. package/dist/types/index.js +2 -0
  165. package/dist/types/index.js.map +1 -0
  166. package/dist/types/klados.d.ts +63 -0
  167. package/dist/types/klados.d.ts.map +1 -0
  168. package/dist/types/klados.js +2 -0
  169. package/dist/types/klados.js.map +1 -0
  170. package/dist/types/log.d.ts +107 -0
  171. package/dist/types/log.d.ts.map +1 -0
  172. package/dist/types/log.js +2 -0
  173. package/dist/types/log.js.map +1 -0
  174. package/dist/types/refs.d.ts +58 -0
  175. package/dist/types/refs.d.ts.map +1 -0
  176. package/dist/types/refs.js +43 -0
  177. package/dist/types/refs.js.map +1 -0
  178. package/dist/types/request.d.ts +69 -0
  179. package/dist/types/request.d.ts.map +1 -0
  180. package/dist/types/request.js +2 -0
  181. package/dist/types/request.js.map +1 -0
  182. package/dist/types/response.d.ts +31 -0
  183. package/dist/types/response.d.ts.map +1 -0
  184. package/dist/types/response.js +2 -0
  185. package/dist/types/response.js.map +1 -0
  186. package/dist/types/rhiza.d.ts +100 -0
  187. package/dist/types/rhiza.d.ts.map +1 -0
  188. package/dist/types/rhiza.js +2 -0
  189. package/dist/types/rhiza.js.map +1 -0
  190. package/dist/types/status.d.ts +84 -0
  191. package/dist/types/status.d.ts.map +1 -0
  192. package/dist/types/status.js +2 -0
  193. package/dist/types/status.js.map +1 -0
  194. package/dist/utils/id.d.ts +15 -0
  195. package/dist/utils/id.d.ts.map +1 -0
  196. package/dist/utils/id.js +25 -0
  197. package/dist/utils/id.js.map +1 -0
  198. package/dist/utils/index.d.ts +2 -0
  199. package/dist/utils/index.d.ts.map +1 -0
  200. package/dist/utils/index.js +2 -0
  201. package/dist/utils/index.js.map +1 -0
  202. package/dist/validation/index.d.ts +9 -0
  203. package/dist/validation/index.d.ts.map +1 -0
  204. package/dist/validation/index.js +9 -0
  205. package/dist/validation/index.js.map +1 -0
  206. package/dist/validation/validate-klados.d.ts +38 -0
  207. package/dist/validation/validate-klados.d.ts.map +1 -0
  208. package/dist/validation/validate-klados.js +139 -0
  209. package/dist/validation/validate-klados.js.map +1 -0
  210. package/dist/validation/validate-rhiza.d.ts +29 -0
  211. package/dist/validation/validate-rhiza.d.ts.map +1 -0
  212. package/dist/validation/validate-rhiza.js +382 -0
  213. package/dist/validation/validate-rhiza.js.map +1 -0
  214. package/dist/validation/validate-runtime.d.ts +28 -0
  215. package/dist/validation/validate-runtime.d.ts.map +1 -0
  216. package/dist/validation/validate-runtime.js +212 -0
  217. package/dist/validation/validate-runtime.js.map +1 -0
  218. package/dist/worker/errors.d.ts +77 -0
  219. package/dist/worker/errors.d.ts.map +1 -0
  220. package/dist/worker/errors.js +143 -0
  221. package/dist/worker/errors.js.map +1 -0
  222. package/dist/worker/index.d.ts +8 -0
  223. package/dist/worker/index.d.ts.map +1 -0
  224. package/dist/worker/index.js +8 -0
  225. package/dist/worker/index.js.map +1 -0
  226. package/dist/worker/job.d.ts +150 -0
  227. package/dist/worker/job.d.ts.map +1 -0
  228. package/dist/worker/job.js +280 -0
  229. package/dist/worker/job.js.map +1 -0
  230. package/package.json +48 -0
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Status Tests
3
+ *
4
+ * Tests for building workflow status from log chains.
5
+ * Status provides an overview of workflow execution progress.
6
+ */
7
+ import { describe, it, expect } from 'vitest';
8
+ import { buildStatusFromLogs } from '../../status';
9
+ import { successfulLinearLogs, successfulScatterGatherLogs, partialErrorLogs, allErrorLogs, mixedErrorLogs, runningWorkflowLogs, singleNodeLogs, } from '../fixtures/logs';
10
+ describe('Status', () => {
11
+ describe('buildStatusFromLogs', () => {
12
+ describe('overall status', () => {
13
+ it('returns done when all leaves done', () => {
14
+ const status = buildStatusFromLogs(successfulLinearLogs);
15
+ expect(status.status).toBe('done');
16
+ });
17
+ it('returns done for scatter-gather when complete', () => {
18
+ const status = buildStatusFromLogs(successfulScatterGatherLogs);
19
+ expect(status.status).toBe('done');
20
+ });
21
+ it('returns error when any leaf error', () => {
22
+ const status = buildStatusFromLogs(partialErrorLogs);
23
+ expect(status.status).toBe('error');
24
+ });
25
+ it('returns error when all leaves are errors', () => {
26
+ const status = buildStatusFromLogs(allErrorLogs);
27
+ expect(status.status).toBe('error');
28
+ });
29
+ it('returns running when any leaf running', () => {
30
+ const status = buildStatusFromLogs(runningWorkflowLogs);
31
+ expect(status.status).toBe('running');
32
+ });
33
+ it('returns done for single node workflow', () => {
34
+ const status = buildStatusFromLogs(singleNodeLogs);
35
+ expect(status.status).toBe('done');
36
+ });
37
+ it('returns unknown for empty logs', () => {
38
+ const status = buildStatusFromLogs([]);
39
+ expect(status.status).toBe('unknown');
40
+ });
41
+ });
42
+ describe('progress counters', () => {
43
+ it('calculates correct totals for linear workflow', () => {
44
+ const status = buildStatusFromLogs(successfulLinearLogs);
45
+ expect(status.progress.total).toBe(3);
46
+ expect(status.progress.done).toBe(3);
47
+ expect(status.progress.error).toBe(0);
48
+ expect(status.progress.running).toBe(0);
49
+ });
50
+ it('calculates correct totals for scatter-gather workflow', () => {
51
+ const status = buildStatusFromLogs(successfulScatterGatherLogs);
52
+ expect(status.progress.total).toBe(5); // producer + 3 workers + aggregator
53
+ expect(status.progress.done).toBe(5);
54
+ });
55
+ it('counts errors correctly', () => {
56
+ const status = buildStatusFromLogs(partialErrorLogs);
57
+ expect(status.progress.error).toBe(1);
58
+ expect(status.progress.done).toBe(3); // producer + 2 successful workers
59
+ });
60
+ it('counts running correctly', () => {
61
+ const status = buildStatusFromLogs(runningWorkflowLogs);
62
+ expect(status.progress.running).toBe(1);
63
+ expect(status.progress.done).toBe(1);
64
+ });
65
+ it('calculates all error types', () => {
66
+ const status = buildStatusFromLogs(allErrorLogs);
67
+ expect(status.progress.error).toBe(3);
68
+ expect(status.progress.done).toBe(1); // Just the producer
69
+ });
70
+ });
71
+ describe('current kladoi', () => {
72
+ it('identifies currently running kladoi', () => {
73
+ const status = buildStatusFromLogs(runningWorkflowLogs);
74
+ expect(status.currentKladoi).toContain('II01klados_b');
75
+ });
76
+ it('returns empty array when nothing running', () => {
77
+ const status = buildStatusFromLogs(successfulLinearLogs);
78
+ expect(status.currentKladoi).toHaveLength(0);
79
+ });
80
+ it('includes all running kladoi', () => {
81
+ // Create logs with multiple running
82
+ const multipleRunning = [
83
+ ...runningWorkflowLogs,
84
+ {
85
+ id: 'log_run_child2',
86
+ type: 'klados_log',
87
+ rhiza_id: 'II01rhiza_linear',
88
+ klados_id: 'II01klados_c',
89
+ job_id: 'job_run_3',
90
+ status: 'running',
91
+ started_at: '2025-01-01T00:01:00Z',
92
+ received: {
93
+ target: 'output_b',
94
+ from_logs: ['log_run_root'],
95
+ },
96
+ },
97
+ ];
98
+ const status = buildStatusFromLogs(multipleRunning);
99
+ expect(status.currentKladoi).toContain('II01klados_b');
100
+ expect(status.currentKladoi).toContain('II01klados_c');
101
+ });
102
+ });
103
+ describe('error summaries', () => {
104
+ it('collects error summaries', () => {
105
+ const status = buildStatusFromLogs(partialErrorLogs);
106
+ expect(status.errors).toBeDefined();
107
+ expect(status.errors).toHaveLength(1);
108
+ });
109
+ it('includes error details', () => {
110
+ const status = buildStatusFromLogs(partialErrorLogs);
111
+ expect(status.errors[0]).toHaveProperty('kladosId');
112
+ expect(status.errors[0]).toHaveProperty('jobId');
113
+ expect(status.errors[0]).toHaveProperty('code');
114
+ expect(status.errors[0]).toHaveProperty('message');
115
+ });
116
+ it('collects multiple errors', () => {
117
+ const status = buildStatusFromLogs(allErrorLogs);
118
+ expect(status.errors).toHaveLength(3);
119
+ });
120
+ it('returns empty array when no errors', () => {
121
+ const status = buildStatusFromLogs(successfulLinearLogs);
122
+ expect(status.errors).toHaveLength(0);
123
+ });
124
+ it('includes retryable flag', () => {
125
+ const status = buildStatusFromLogs(mixedErrorLogs);
126
+ expect(status.errors).toHaveLength(2);
127
+ const retryable = status.errors.filter((e) => e.retryable);
128
+ const nonRetryable = status.errors.filter((e) => !e.retryable);
129
+ expect(retryable.length).toBe(1);
130
+ expect(nonRetryable.length).toBe(1);
131
+ });
132
+ });
133
+ describe('timing information', () => {
134
+ it('includes started_at from earliest log', () => {
135
+ const status = buildStatusFromLogs(successfulLinearLogs);
136
+ expect(status.startedAt).toBe('2025-01-01T00:00:00Z');
137
+ });
138
+ it('includes completed_at from latest log when done', () => {
139
+ const status = buildStatusFromLogs(successfulLinearLogs);
140
+ expect(status.completedAt).toBe('2025-01-01T00:03:00Z');
141
+ });
142
+ it('does not include completed_at when running', () => {
143
+ const status = buildStatusFromLogs(runningWorkflowLogs);
144
+ expect(status.completedAt).toBeUndefined();
145
+ });
146
+ it('includes completed_at when error (workflow terminated)', () => {
147
+ const status = buildStatusFromLogs(partialErrorLogs);
148
+ // Error workflow is still "terminal" even if with error
149
+ expect(status.completedAt).toBeDefined();
150
+ });
151
+ });
152
+ describe('rhiza information', () => {
153
+ it('includes rhiza_id', () => {
154
+ const status = buildStatusFromLogs(successfulLinearLogs);
155
+ expect(status.rhizaId).toBe('II01rhiza_linear');
156
+ });
157
+ it('handles scatter-gather rhiza_id', () => {
158
+ const status = buildStatusFromLogs(successfulScatterGatherLogs);
159
+ expect(status.rhizaId).toBe('II01rhiza_scatter_gather');
160
+ });
161
+ });
162
+ });
163
+ });
164
+ //# sourceMappingURL=status.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/status.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Target Resolution Tests
3
+ *
4
+ * Tests for resolving targets from flow steps using route rules.
5
+ * Pure function - no API calls.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=target.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/target.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Target Resolution Tests
3
+ *
4
+ * Tests for resolving targets from flow steps using route rules.
5
+ * Pure function - no API calls.
6
+ */
7
+ import { describe, it, expect } from 'vitest';
8
+ import { resolveTarget } from '../../handoff/target';
9
+ import { ref } from '../../types';
10
+ describe('Target Resolution', () => {
11
+ describe('resolveTarget', () => {
12
+ describe('without route rules', () => {
13
+ it('returns default target for pass', () => {
14
+ const then = { pass: ref('target_a') };
15
+ const properties = { type: 'File' };
16
+ const result = resolveTarget(then, properties);
17
+ expect(result?.pi).toBe('target_a');
18
+ });
19
+ it('returns default target for scatter', () => {
20
+ const then = { scatter: ref('worker_klados') };
21
+ const properties = { type: 'File' };
22
+ const result = resolveTarget(then, properties);
23
+ expect(result?.pi).toBe('worker_klados');
24
+ });
25
+ it('returns default target for gather', () => {
26
+ const then = { gather: ref('aggregator_klados') };
27
+ const properties = { type: 'Result' };
28
+ const result = resolveTarget(then, properties);
29
+ expect(result?.pi).toBe('aggregator_klados');
30
+ });
31
+ it('returns null for done', () => {
32
+ const then = { done: true };
33
+ const properties = { type: 'File' };
34
+ const result = resolveTarget(then, properties);
35
+ expect(result).toBeNull();
36
+ });
37
+ });
38
+ describe('with route rules', () => {
39
+ it('evaluates route rules in order', () => {
40
+ const then = {
41
+ pass: ref('default_handler'),
42
+ route: [
43
+ { where: { property: 'type', equals: 'pdf' }, target: ref('pdf_handler') },
44
+ { where: { property: 'type', equals: 'image' }, target: ref('image_handler') },
45
+ ],
46
+ };
47
+ const properties = { type: 'pdf' };
48
+ const result = resolveTarget(then, properties);
49
+ expect(result?.pi).toBe('pdf_handler');
50
+ });
51
+ it('returns second rule target when first does not match', () => {
52
+ const then = {
53
+ pass: ref('default_handler'),
54
+ route: [
55
+ { where: { property: 'type', equals: 'pdf' }, target: ref('pdf_handler') },
56
+ { where: { property: 'type', equals: 'image' }, target: ref('image_handler') },
57
+ ],
58
+ };
59
+ const properties = { type: 'image' };
60
+ const result = resolveTarget(then, properties);
61
+ expect(result?.pi).toBe('image_handler');
62
+ });
63
+ it('falls back to default when no rules match', () => {
64
+ const then = {
65
+ pass: ref('default_handler'),
66
+ route: [
67
+ { where: { property: 'type', equals: 'pdf' }, target: ref('pdf_handler') },
68
+ { where: { property: 'type', equals: 'image' }, target: ref('image_handler') },
69
+ ],
70
+ };
71
+ const properties = { type: 'unknown' };
72
+ const result = resolveTarget(then, properties);
73
+ expect(result?.pi).toBe('default_handler');
74
+ });
75
+ it('works with scatter and route rules', () => {
76
+ const then = {
77
+ scatter: ref('default_worker'),
78
+ route: [
79
+ { where: { property: 'priority', equals: 'high' }, target: ref('priority_worker') },
80
+ ],
81
+ };
82
+ const properties = { priority: 'high' };
83
+ const result = resolveTarget(then, properties);
84
+ expect(result?.pi).toBe('priority_worker');
85
+ });
86
+ it('handles complex AND/OR route conditions', () => {
87
+ const then = {
88
+ pass: ref('default_handler'),
89
+ route: [
90
+ {
91
+ where: {
92
+ and: [
93
+ { property: 'type', equals: 'file' },
94
+ { or: [{ property: 'ext', equals: 'jpg' }, { property: 'ext', equals: 'png' }] },
95
+ ],
96
+ },
97
+ target: ref('image_handler'),
98
+ },
99
+ ],
100
+ };
101
+ expect(resolveTarget(then, { type: 'file', ext: 'jpg' })?.pi).toBe('image_handler');
102
+ expect(resolveTarget(then, { type: 'file', ext: 'pdf' })?.pi).toBe('default_handler');
103
+ });
104
+ it('handles empty route array as no routing', () => {
105
+ const then = {
106
+ pass: ref('default_handler'),
107
+ route: [],
108
+ };
109
+ const properties = { type: 'anything' };
110
+ const result = resolveTarget(then, properties);
111
+ expect(result?.pi).toBe('default_handler');
112
+ });
113
+ });
114
+ });
115
+ });
116
+ //# sourceMappingURL=target.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"target.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/target.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Log Chain Traversal Tests
3
+ *
4
+ * Tests for traversing log chains to find leaves, errors, and build trees.
5
+ * Log chains represent the execution history of a workflow.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=traverse.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverse.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/traverse.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Log Chain Traversal Tests
3
+ *
4
+ * Tests for traversing log chains to find leaves, errors, and build trees.
5
+ * Log chains represent the execution history of a workflow.
6
+ */
7
+ import { describe, it, expect } from 'vitest';
8
+ import { findLeaves, findErrorLeaves, buildLogTree, } from '../../traverse';
9
+ import { successfulLinearLogs, successfulScatterGatherLogs, partialErrorLogs, allErrorLogs, mixedErrorLogs, runningWorkflowLogs, singleNodeLogs, } from '../fixtures/logs';
10
+ describe('Log Chain Traversal', () => {
11
+ describe('findLeaves', () => {
12
+ it('finds terminal nodes (no children) in linear chain', () => {
13
+ const leaves = findLeaves(successfulLinearLogs);
14
+ expect(leaves).toHaveLength(1);
15
+ expect(leaves[0].klados_id).toBe('II01klados_c');
16
+ });
17
+ it('finds all leaves in scatter-gather chain', () => {
18
+ const leaves = findLeaves(successfulScatterGatherLogs);
19
+ // Should find the aggregator as the only leaf
20
+ expect(leaves).toHaveLength(1);
21
+ expect(leaves[0].klados_id).toBe('II01klados_aggregator');
22
+ });
23
+ it('finds multiple leaves when workers have errors', () => {
24
+ const leaves = findLeaves(partialErrorLogs);
25
+ // Error leaf + workers that completed + aggregator may not exist
26
+ expect(leaves.length).toBeGreaterThanOrEqual(1);
27
+ });
28
+ it('returns empty for empty log chain', () => {
29
+ const leaves = findLeaves([]);
30
+ expect(leaves).toHaveLength(0);
31
+ });
32
+ it('handles single-node chain', () => {
33
+ const leaves = findLeaves(singleNodeLogs);
34
+ expect(leaves).toHaveLength(1);
35
+ expect(leaves[0].id).toBe('log_single');
36
+ });
37
+ it('finds running logs as leaves', () => {
38
+ const leaves = findLeaves(runningWorkflowLogs);
39
+ // Running logs should be leaves since they haven't produced children yet
40
+ const runningLeaves = leaves.filter((l) => l.status === 'running');
41
+ expect(runningLeaves.length).toBeGreaterThan(0);
42
+ });
43
+ });
44
+ describe('findErrorLeaves', () => {
45
+ it('finds logs with status: error', () => {
46
+ const errorLeaves = findErrorLeaves(partialErrorLogs);
47
+ expect(errorLeaves).toHaveLength(1);
48
+ expect(errorLeaves[0].log.status).toBe('error');
49
+ });
50
+ it('returns empty for successful chain', () => {
51
+ const errorLeaves = findErrorLeaves(successfulLinearLogs);
52
+ expect(errorLeaves).toHaveLength(0);
53
+ });
54
+ it('finds all error leaves when multiple errors', () => {
55
+ const errorLeaves = findErrorLeaves(allErrorLogs);
56
+ expect(errorLeaves).toHaveLength(3);
57
+ errorLeaves.forEach((e) => {
58
+ expect(e.log.status).toBe('error');
59
+ });
60
+ });
61
+ it('marks retryable based on error.retryable', () => {
62
+ const errorLeaves = findErrorLeaves(partialErrorLogs);
63
+ expect(errorLeaves[0].retryable).toBe(true);
64
+ expect(errorLeaves[0].log.error?.retryable).toBe(true);
65
+ });
66
+ it('marks non-retryable errors correctly', () => {
67
+ const errorLeaves = findErrorLeaves(allErrorLogs);
68
+ // Should have at least one non-retryable error
69
+ const nonRetryable = errorLeaves.filter((e) => !e.retryable);
70
+ expect(nonRetryable.length).toBeGreaterThan(0);
71
+ });
72
+ it('builds path from root to error', () => {
73
+ const errorLeaves = findErrorLeaves(partialErrorLogs);
74
+ expect(errorLeaves[0].path).toBeDefined();
75
+ expect(errorLeaves[0].path.length).toBeGreaterThan(0);
76
+ // Path should start with root klados
77
+ expect(errorLeaves[0].path[0]).toBe('II01klados_producer');
78
+ });
79
+ it('includes log entry in error leaf', () => {
80
+ const errorLeaves = findErrorLeaves(partialErrorLogs);
81
+ expect(errorLeaves[0].log).toBeDefined();
82
+ expect(errorLeaves[0].log.id).toBeDefined();
83
+ expect(errorLeaves[0].log.klados_id).toBeDefined();
84
+ });
85
+ });
86
+ describe('buildLogTree', () => {
87
+ it('builds tree from root for linear chain', () => {
88
+ const tree = buildLogTree(successfulLinearLogs);
89
+ expect(tree).not.toBeNull();
90
+ expect(tree.log.klados_id).toBe('II01klados_a');
91
+ expect(tree.children).toHaveLength(1);
92
+ expect(tree.children[0].log.klados_id).toBe('II01klados_b');
93
+ });
94
+ it('builds tree with depth 3 for linear chain', () => {
95
+ const tree = buildLogTree(successfulLinearLogs);
96
+ expect(tree).not.toBeNull();
97
+ expect(tree.children).toHaveLength(1);
98
+ expect(tree.children[0].children).toHaveLength(1);
99
+ expect(tree.children[0].children[0].children).toHaveLength(0);
100
+ });
101
+ it('handles scatter (multiple children)', () => {
102
+ const tree = buildLogTree(successfulScatterGatherLogs);
103
+ expect(tree).not.toBeNull();
104
+ // Root should have 3 children (scattered workers)
105
+ expect(tree.children.length).toBe(3);
106
+ });
107
+ it('returns null for empty logs', () => {
108
+ const tree = buildLogTree([]);
109
+ expect(tree).toBeNull();
110
+ });
111
+ it('handles single node chain', () => {
112
+ const tree = buildLogTree(singleNodeLogs);
113
+ expect(tree).not.toBeNull();
114
+ expect(tree.children).toHaveLength(0);
115
+ });
116
+ it('includes log entry in each node', () => {
117
+ const tree = buildLogTree(successfulLinearLogs);
118
+ expect(tree).not.toBeNull();
119
+ expect(tree.log).toBeDefined();
120
+ expect(tree.log.id).toBeDefined();
121
+ expect(tree.log.status).toBeDefined();
122
+ });
123
+ it('maintains parent-child relationships correctly', () => {
124
+ const tree = buildLogTree(successfulScatterGatherLogs);
125
+ expect(tree).not.toBeNull();
126
+ // Each worker should have the aggregator as child (after gather)
127
+ // or the aggregator is connected to all workers via gather
128
+ const aggregatorLogs = successfulScatterGatherLogs.filter((l) => l.klados_id === 'II01klados_aggregator');
129
+ expect(aggregatorLogs).toHaveLength(1);
130
+ });
131
+ it('handles mixed success/error logs', () => {
132
+ const tree = buildLogTree(mixedErrorLogs);
133
+ expect(tree).not.toBeNull();
134
+ // Tree should still be buildable with errors
135
+ function countNodes(node) {
136
+ return 1 + node.children.reduce((acc, child) => acc + countNodes(child), 0);
137
+ }
138
+ const nodeCount = countNodes(tree);
139
+ expect(nodeCount).toBeGreaterThan(1);
140
+ });
141
+ });
142
+ });
143
+ //# sourceMappingURL=traverse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverse.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/traverse.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Klados Validation Tests
3
+ *
4
+ * Tests for validateKladosProperties() which validates klados entity properties
5
+ * at creation/update time (static validation).
6
+ *
7
+ * Validation Rules:
8
+ * - endpoint: Required, must be valid URL
9
+ * - accepts.types: Required, non-empty array
10
+ * - accepts.cardinality: Must be 'one' or 'many'
11
+ * - produces.types: Required, non-empty array
12
+ * - produces.cardinality: Must be 'one' or 'many'
13
+ * - actions_required: Required, non-empty array
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=klados.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"klados.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/unit/validation/klados.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG"}