@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,612 @@
1
+ /**
2
+ * Rhiza Validation Tests
3
+ *
4
+ * Tests for validateRhizaProperties() which validates rhiza entity properties
5
+ * at creation/update time (static validation).
6
+ *
7
+ * Validation Rules:
8
+ * - entry: Required, must be in flow
9
+ * - flow: Required, non-empty
10
+ * - All targets must exist in flow (or be external rhiza IDs)
11
+ * - All paths must terminate (done: true)
12
+ * - No cycles allowed
13
+ * - Route rules must have valid where and target
14
+ */
15
+ import { describe, it, expect } from 'vitest';
16
+ import { validateRhizaProperties } from '../../../validation';
17
+ import { ref } from '../../../types';
18
+ import { linearRhizaProperties, scatterGatherRhizaProperties, conditionalRhizaProperties, complexRoutingRhizaProperties, invalidRhizaProperties, } from '../../fixtures';
19
+ describe('validateRhizaProperties', () => {
20
+ // =========================================================================
21
+ // Valid Cases
22
+ // =========================================================================
23
+ describe('valid rhiza properties', () => {
24
+ it('passes for valid linear flow', () => {
25
+ const result = validateRhizaProperties(linearRhizaProperties);
26
+ expect(result.valid).toBe(true);
27
+ expect(result.errors).toHaveLength(0);
28
+ });
29
+ it('passes for valid scatter-gather flow', () => {
30
+ const result = validateRhizaProperties(scatterGatherRhizaProperties);
31
+ expect(result.valid).toBe(true);
32
+ expect(result.errors).toHaveLength(0);
33
+ });
34
+ it('passes for valid conditional flow with routes', () => {
35
+ const result = validateRhizaProperties(conditionalRhizaProperties);
36
+ expect(result.valid).toBe(true);
37
+ expect(result.errors).toHaveLength(0);
38
+ });
39
+ it('passes for complex routing with AND/OR conditions', () => {
40
+ const result = validateRhizaProperties(complexRoutingRhizaProperties);
41
+ expect(result.valid).toBe(true);
42
+ expect(result.errors).toHaveLength(0);
43
+ });
44
+ it('passes for single klados workflow (entry is terminal)', () => {
45
+ const result = validateRhizaProperties({
46
+ label: 'Single Klados',
47
+ version: '1.0.0',
48
+ entry: ref('II01klados_only', { type: 'klados' }),
49
+ flow: {
50
+ 'II01klados_only': { then: { done: true } },
51
+ },
52
+ status: 'active',
53
+ });
54
+ expect(result.valid).toBe(true);
55
+ expect(result.errors).toHaveLength(0);
56
+ });
57
+ });
58
+ // =========================================================================
59
+ // Entry Validation
60
+ // =========================================================================
61
+ describe('entry validation', () => {
62
+ it('fails when entry klados ID is missing', () => {
63
+ const result = validateRhizaProperties(invalidRhizaProperties.missingEntry);
64
+ expect(result.valid).toBe(false);
65
+ expect(result.errors).toContainEqual(expect.objectContaining({
66
+ code: 'MISSING_ENTRY',
67
+ field: 'entry',
68
+ }));
69
+ });
70
+ it('fails when entry klados ID is not in flow', () => {
71
+ const result = validateRhizaProperties(invalidRhizaProperties.entryNotInFlow);
72
+ expect(result.valid).toBe(false);
73
+ expect(result.errors).toContainEqual(expect.objectContaining({
74
+ code: 'ENTRY_NOT_IN_FLOW',
75
+ field: 'entry',
76
+ }));
77
+ });
78
+ it('fails when entry is empty string', () => {
79
+ const result = validateRhizaProperties({
80
+ label: 'Empty Entry',
81
+ version: '1.0.0',
82
+ entry: ref(''),
83
+ flow: {
84
+ 'II01klados_a': { then: { done: true } },
85
+ },
86
+ status: 'active',
87
+ });
88
+ expect(result.valid).toBe(false);
89
+ expect(result.errors).toContainEqual(expect.objectContaining({
90
+ code: 'MISSING_ENTRY',
91
+ }));
92
+ });
93
+ });
94
+ // =========================================================================
95
+ // Flow Validation
96
+ // =========================================================================
97
+ describe('flow validation', () => {
98
+ it('fails when flow is empty', () => {
99
+ const result = validateRhizaProperties(invalidRhizaProperties.emptyFlow);
100
+ expect(result.valid).toBe(false);
101
+ expect(result.errors).toContainEqual(expect.objectContaining({
102
+ code: 'EMPTY_FLOW',
103
+ field: 'flow',
104
+ }));
105
+ });
106
+ it('fails when flow is missing', () => {
107
+ const result = validateRhizaProperties({
108
+ label: 'Missing Flow',
109
+ version: '1.0.0',
110
+ entry: ref('II01klados_a', { type: 'klados' }),
111
+ status: 'active',
112
+ });
113
+ expect(result.valid).toBe(false);
114
+ expect(result.errors).toContainEqual(expect.objectContaining({
115
+ code: 'EMPTY_FLOW',
116
+ }));
117
+ });
118
+ });
119
+ // =========================================================================
120
+ // Target Validation
121
+ // =========================================================================
122
+ describe('target validation', () => {
123
+ it('fails when target klados ID does not exist in flow', () => {
124
+ const result = validateRhizaProperties(invalidRhizaProperties.targetNotInFlow);
125
+ expect(result.valid).toBe(false);
126
+ expect(result.errors).toContainEqual(expect.objectContaining({
127
+ code: 'INVALID_TARGET',
128
+ }));
129
+ });
130
+ it('fails when scatter target does not exist in flow', () => {
131
+ const result = validateRhizaProperties({
132
+ label: 'Invalid Scatter Target',
133
+ version: '1.0.0',
134
+ entry: ref('II01klados_producer', { type: 'klados' }),
135
+ flow: {
136
+ 'II01klados_producer': { then: { scatter: ref('nonexistent', { type: 'klados' }) } },
137
+ },
138
+ status: 'active',
139
+ });
140
+ expect(result.valid).toBe(false);
141
+ expect(result.errors).toContainEqual(expect.objectContaining({
142
+ code: 'INVALID_TARGET',
143
+ }));
144
+ });
145
+ it('fails when gather target does not exist in flow', () => {
146
+ const result = validateRhizaProperties({
147
+ label: 'Invalid Gather Target',
148
+ version: '1.0.0',
149
+ entry: ref('II01klados_worker', { type: 'klados' }),
150
+ flow: {
151
+ 'II01klados_worker': { then: { gather: ref('nonexistent', { type: 'klados' }) } },
152
+ },
153
+ status: 'active',
154
+ });
155
+ expect(result.valid).toBe(false);
156
+ expect(result.errors).toContainEqual(expect.objectContaining({
157
+ code: 'INVALID_TARGET',
158
+ }));
159
+ });
160
+ });
161
+ // =========================================================================
162
+ // Cycle Detection
163
+ // =========================================================================
164
+ describe('cycle detection', () => {
165
+ it('fails when cycle detected (A -> B -> C -> A)', () => {
166
+ const result = validateRhizaProperties(invalidRhizaProperties.cycleDetected);
167
+ expect(result.valid).toBe(false);
168
+ expect(result.errors).toContainEqual(expect.objectContaining({
169
+ code: 'CYCLE_DETECTED',
170
+ }));
171
+ });
172
+ it('fails when simple cycle (A -> B -> A)', () => {
173
+ const result = validateRhizaProperties({
174
+ label: 'Simple Cycle',
175
+ version: '1.0.0',
176
+ entry: ref('II01klados_a', { type: 'klados' }),
177
+ flow: {
178
+ 'II01klados_a': { then: { pass: ref('II01klados_b', { type: 'klados' }) } },
179
+ 'II01klados_b': { then: { pass: ref('II01klados_a', { type: 'klados' }) } },
180
+ },
181
+ status: 'active',
182
+ });
183
+ expect(result.valid).toBe(false);
184
+ expect(result.errors).toContainEqual(expect.objectContaining({
185
+ code: 'CYCLE_DETECTED',
186
+ }));
187
+ });
188
+ it('fails when self-referencing (A -> A)', () => {
189
+ const result = validateRhizaProperties({
190
+ label: 'Self Reference',
191
+ version: '1.0.0',
192
+ entry: ref('II01klados_a', { type: 'klados' }),
193
+ flow: {
194
+ 'II01klados_a': { then: { pass: ref('II01klados_a', { type: 'klados' }) } },
195
+ },
196
+ status: 'active',
197
+ });
198
+ expect(result.valid).toBe(false);
199
+ expect(result.errors).toContainEqual(expect.objectContaining({
200
+ code: 'CYCLE_DETECTED',
201
+ }));
202
+ });
203
+ it('cycle error message includes the cycle path', () => {
204
+ const result = validateRhizaProperties(invalidRhizaProperties.cycleDetected);
205
+ const cycleError = result.errors.find((e) => e.code === 'CYCLE_DETECTED');
206
+ expect(cycleError?.message).toContain('->');
207
+ });
208
+ });
209
+ // =========================================================================
210
+ // Unreachable Detection
211
+ // =========================================================================
212
+ describe('unreachable detection', () => {
213
+ it('warns about unreachable klados IDs', () => {
214
+ const result = validateRhizaProperties(invalidRhizaProperties.unreachableKlados);
215
+ // Valid but with warning
216
+ expect(result.valid).toBe(true);
217
+ expect(result.warnings).toContainEqual(expect.objectContaining({
218
+ code: 'UNREACHABLE_KLADOS',
219
+ klados_id: 'II01klados_orphan',
220
+ }));
221
+ });
222
+ it('warns about multiple unreachable kladoi', () => {
223
+ const result = validateRhizaProperties({
224
+ label: 'Multiple Orphans',
225
+ version: '1.0.0',
226
+ entry: ref('II01klados_a', { type: 'klados' }),
227
+ flow: {
228
+ 'II01klados_a': { then: { done: true } },
229
+ 'II01klados_orphan1': { then: { done: true } },
230
+ 'II01klados_orphan2': { then: { pass: ref('II01klados_orphan1', { type: 'klados' }) } },
231
+ },
232
+ status: 'active',
233
+ });
234
+ expect(result.valid).toBe(true);
235
+ expect(result.warnings.filter((w) => w.code === 'UNREACHABLE_KLADOS')).toHaveLength(2);
236
+ });
237
+ });
238
+ // =========================================================================
239
+ // Then Spec Validation
240
+ // =========================================================================
241
+ describe('then spec validation', () => {
242
+ it('fails when then spec is missing', () => {
243
+ const result = validateRhizaProperties(invalidRhizaProperties.missingThen);
244
+ expect(result.valid).toBe(false);
245
+ expect(result.errors).toContainEqual(expect.objectContaining({
246
+ code: 'MISSING_THEN',
247
+ }));
248
+ });
249
+ it('fails when then has unknown handoff type', () => {
250
+ const result = validateRhizaProperties(invalidRhizaProperties.invalidHandoff);
251
+ expect(result.valid).toBe(false);
252
+ expect(result.errors).toContainEqual(expect.objectContaining({
253
+ code: 'INVALID_HANDOFF',
254
+ }));
255
+ });
256
+ it('accepts done: true as terminal', () => {
257
+ const result = validateRhizaProperties({
258
+ label: 'Terminal Test',
259
+ version: '1.0.0',
260
+ entry: ref('II01klados_a', { type: 'klados' }),
261
+ flow: {
262
+ 'II01klados_a': { then: { done: true } },
263
+ },
264
+ status: 'active',
265
+ });
266
+ expect(result.valid).toBe(true);
267
+ });
268
+ it('accepts pass handoff', () => {
269
+ const result = validateRhizaProperties({
270
+ label: 'Pass Test',
271
+ version: '1.0.0',
272
+ entry: ref('II01klados_a', { type: 'klados' }),
273
+ flow: {
274
+ 'II01klados_a': { then: { pass: ref('II01klados_b', { type: 'klados' }) } },
275
+ 'II01klados_b': { then: { done: true } },
276
+ },
277
+ status: 'active',
278
+ });
279
+ expect(result.valid).toBe(true);
280
+ });
281
+ it('accepts scatter handoff', () => {
282
+ const result = validateRhizaProperties({
283
+ label: 'Scatter Test',
284
+ version: '1.0.0',
285
+ entry: ref('II01klados_a', { type: 'klados' }),
286
+ flow: {
287
+ 'II01klados_a': { then: { scatter: ref('II01klados_b', { type: 'klados' }) } },
288
+ 'II01klados_b': { then: { done: true } },
289
+ },
290
+ status: 'active',
291
+ });
292
+ expect(result.valid).toBe(true);
293
+ });
294
+ it('accepts gather handoff', () => {
295
+ const result = validateRhizaProperties({
296
+ label: 'Gather Test',
297
+ version: '1.0.0',
298
+ entry: ref('II01klados_a', { type: 'klados' }),
299
+ flow: {
300
+ 'II01klados_a': { then: { gather: ref('II01klados_b', { type: 'klados' }) } },
301
+ 'II01klados_b': { then: { done: true } },
302
+ },
303
+ status: 'active',
304
+ });
305
+ expect(result.valid).toBe(true);
306
+ });
307
+ });
308
+ // =========================================================================
309
+ // Route Rules Validation
310
+ // =========================================================================
311
+ describe('route rules validation', () => {
312
+ it('fails when route rule is missing where condition', () => {
313
+ const result = validateRhizaProperties({
314
+ label: 'Missing Where',
315
+ version: '1.0.0',
316
+ entry: ref('II01klados_a', { type: 'klados' }),
317
+ flow: {
318
+ 'II01klados_a': {
319
+ then: {
320
+ pass: ref('II01klados_b', { type: 'klados' }),
321
+ route: [{ target: ref('II01klados_c', { type: 'klados' }) }],
322
+ },
323
+ },
324
+ 'II01klados_b': { then: { done: true } },
325
+ 'II01klados_c': { then: { done: true } },
326
+ },
327
+ status: 'active',
328
+ });
329
+ expect(result.valid).toBe(false);
330
+ expect(result.errors).toContainEqual(expect.objectContaining({
331
+ code: 'INVALID_ROUTE_RULE',
332
+ }));
333
+ });
334
+ it('fails when route rule is missing target', () => {
335
+ const result = validateRhizaProperties({
336
+ label: 'Missing Target',
337
+ version: '1.0.0',
338
+ entry: ref('II01klados_a', { type: 'klados' }),
339
+ flow: {
340
+ 'II01klados_a': {
341
+ then: {
342
+ pass: ref('II01klados_b', { type: 'klados' }),
343
+ route: [{ where: { property: 'type', equals: 'test' } }],
344
+ },
345
+ },
346
+ 'II01klados_b': { then: { done: true } },
347
+ },
348
+ status: 'active',
349
+ });
350
+ expect(result.valid).toBe(false);
351
+ expect(result.errors).toContainEqual(expect.objectContaining({
352
+ code: 'INVALID_ROUTE_RULE',
353
+ }));
354
+ });
355
+ it('accepts valid route rules with simple where condition', () => {
356
+ const result = validateRhizaProperties({
357
+ label: 'Valid Route',
358
+ version: '1.0.0',
359
+ entry: ref('II01klados_a', { type: 'klados' }),
360
+ flow: {
361
+ 'II01klados_a': {
362
+ then: {
363
+ pass: ref('II01klados_b', { type: 'klados' }),
364
+ route: [
365
+ { where: { property: 'type', equals: 'special' }, target: ref('II01klados_c', { type: 'klados' }) },
366
+ ],
367
+ },
368
+ },
369
+ 'II01klados_b': { then: { done: true } },
370
+ 'II01klados_c': { then: { done: true } },
371
+ },
372
+ status: 'active',
373
+ });
374
+ expect(result.valid).toBe(true);
375
+ });
376
+ it('accepts route rules with AND condition', () => {
377
+ const result = validateRhizaProperties({
378
+ label: 'AND Route',
379
+ version: '1.0.0',
380
+ entry: ref('II01klados_a', { type: 'klados' }),
381
+ flow: {
382
+ 'II01klados_a': {
383
+ then: {
384
+ pass: ref('II01klados_b', { type: 'klados' }),
385
+ route: [
386
+ {
387
+ where: {
388
+ and: [
389
+ { property: 'type', equals: 'file' },
390
+ { property: 'size', equals: 'large' },
391
+ ],
392
+ },
393
+ target: ref('II01klados_c', { type: 'klados' }),
394
+ },
395
+ ],
396
+ },
397
+ },
398
+ 'II01klados_b': { then: { done: true } },
399
+ 'II01klados_c': { then: { done: true } },
400
+ },
401
+ status: 'active',
402
+ });
403
+ expect(result.valid).toBe(true);
404
+ });
405
+ it('accepts route rules with OR condition', () => {
406
+ const result = validateRhizaProperties({
407
+ label: 'OR Route',
408
+ version: '1.0.0',
409
+ entry: ref('II01klados_a', { type: 'klados' }),
410
+ flow: {
411
+ 'II01klados_a': {
412
+ then: {
413
+ pass: ref('II01klados_b', { type: 'klados' }),
414
+ route: [
415
+ {
416
+ where: {
417
+ or: [
418
+ { property: 'type', equals: 'jpeg' },
419
+ { property: 'type', equals: 'png' },
420
+ ],
421
+ },
422
+ target: ref('II01klados_c', { type: 'klados' }),
423
+ },
424
+ ],
425
+ },
426
+ },
427
+ 'II01klados_b': { then: { done: true } },
428
+ 'II01klados_c': { then: { done: true } },
429
+ },
430
+ status: 'active',
431
+ });
432
+ expect(result.valid).toBe(true);
433
+ });
434
+ it('accepts route rules with nested AND/OR conditions', () => {
435
+ const result = validateRhizaProperties({
436
+ label: 'Nested Route',
437
+ version: '1.0.0',
438
+ entry: ref('II01klados_a', { type: 'klados' }),
439
+ flow: {
440
+ 'II01klados_a': {
441
+ then: {
442
+ pass: ref('II01klados_b', { type: 'klados' }),
443
+ route: [
444
+ {
445
+ where: {
446
+ and: [
447
+ { property: 'type', equals: 'file' },
448
+ {
449
+ or: [
450
+ { property: 'format', equals: 'jpeg' },
451
+ { property: 'format', equals: 'png' },
452
+ ],
453
+ },
454
+ ],
455
+ },
456
+ target: ref('II01klados_c', { type: 'klados' }),
457
+ },
458
+ ],
459
+ },
460
+ },
461
+ 'II01klados_b': { then: { done: true } },
462
+ 'II01klados_c': { then: { done: true } },
463
+ },
464
+ status: 'active',
465
+ });
466
+ expect(result.valid).toBe(true);
467
+ });
468
+ it('fails for invalid where condition format', () => {
469
+ const result = validateRhizaProperties({
470
+ label: 'Invalid Where',
471
+ version: '1.0.0',
472
+ entry: ref('II01klados_a', { type: 'klados' }),
473
+ flow: {
474
+ 'II01klados_a': {
475
+ then: {
476
+ pass: ref('II01klados_b', { type: 'klados' }),
477
+ route: [
478
+ {
479
+ where: { invalid: 'condition' },
480
+ target: ref('II01klados_c', { type: 'klados' }),
481
+ },
482
+ ],
483
+ },
484
+ },
485
+ 'II01klados_b': { then: { done: true } },
486
+ 'II01klados_c': { then: { done: true } },
487
+ },
488
+ status: 'active',
489
+ });
490
+ expect(result.valid).toBe(false);
491
+ expect(result.errors).toContainEqual(expect.objectContaining({
492
+ code: 'INVALID_WHERE_CONDITION',
493
+ }));
494
+ });
495
+ it('fails for empty AND array', () => {
496
+ const result = validateRhizaProperties({
497
+ label: 'Empty AND',
498
+ version: '1.0.0',
499
+ entry: ref('II01klados_a', { type: 'klados' }),
500
+ flow: {
501
+ 'II01klados_a': {
502
+ then: {
503
+ pass: ref('II01klados_b', { type: 'klados' }),
504
+ route: [
505
+ {
506
+ where: { and: [] },
507
+ target: ref('II01klados_c', { type: 'klados' }),
508
+ },
509
+ ],
510
+ },
511
+ },
512
+ 'II01klados_b': { then: { done: true } },
513
+ 'II01klados_c': { then: { done: true } },
514
+ },
515
+ status: 'active',
516
+ });
517
+ expect(result.valid).toBe(false);
518
+ expect(result.errors).toContainEqual(expect.objectContaining({
519
+ code: 'INVALID_WHERE_CONDITION',
520
+ }));
521
+ });
522
+ it('fails for empty OR array', () => {
523
+ const result = validateRhizaProperties({
524
+ label: 'Empty OR',
525
+ version: '1.0.0',
526
+ entry: ref('II01klados_a', { type: 'klados' }),
527
+ flow: {
528
+ 'II01klados_a': {
529
+ then: {
530
+ pass: ref('II01klados_b', { type: 'klados' }),
531
+ route: [
532
+ {
533
+ where: { or: [] },
534
+ target: ref('II01klados_c', { type: 'klados' }),
535
+ },
536
+ ],
537
+ },
538
+ },
539
+ 'II01klados_b': { then: { done: true } },
540
+ 'II01klados_c': { then: { done: true } },
541
+ },
542
+ status: 'active',
543
+ });
544
+ expect(result.valid).toBe(false);
545
+ expect(result.errors).toContainEqual(expect.objectContaining({
546
+ code: 'INVALID_WHERE_CONDITION',
547
+ }));
548
+ });
549
+ });
550
+ // =========================================================================
551
+ // Edge Cases
552
+ // =========================================================================
553
+ describe('edge cases', () => {
554
+ it('handles undefined input gracefully', () => {
555
+ const result = validateRhizaProperties(undefined);
556
+ expect(result.valid).toBe(false);
557
+ expect(result.errors.length).toBeGreaterThan(0);
558
+ });
559
+ it('handles null input gracefully', () => {
560
+ const result = validateRhizaProperties(null);
561
+ expect(result.valid).toBe(false);
562
+ expect(result.errors.length).toBeGreaterThan(0);
563
+ });
564
+ it('handles empty object input', () => {
565
+ const result = validateRhizaProperties({});
566
+ expect(result.valid).toBe(false);
567
+ expect(result.errors.length).toBeGreaterThan(0);
568
+ });
569
+ it('handles multiple route rules', () => {
570
+ const result = validateRhizaProperties({
571
+ label: 'Multiple Routes',
572
+ version: '1.0.0',
573
+ entry: ref('II01klados_a', { type: 'klados' }),
574
+ flow: {
575
+ 'II01klados_a': {
576
+ then: {
577
+ pass: ref('II01klados_default', { type: 'klados' }),
578
+ route: [
579
+ { where: { property: 'type', equals: 'pdf' }, target: ref('II01klados_pdf', { type: 'klados' }) },
580
+ { where: { property: 'type', equals: 'image' }, target: ref('II01klados_image', { type: 'klados' }) },
581
+ { where: { property: 'type', equals: 'text' }, target: ref('II01klados_text', { type: 'klados' }) },
582
+ ],
583
+ },
584
+ },
585
+ 'II01klados_default': { then: { done: true } },
586
+ 'II01klados_pdf': { then: { done: true } },
587
+ 'II01klados_image': { then: { done: true } },
588
+ 'II01klados_text': { then: { done: true } },
589
+ },
590
+ status: 'active',
591
+ });
592
+ expect(result.valid).toBe(true);
593
+ });
594
+ it('handles deeply nested workflow', () => {
595
+ const result = validateRhizaProperties({
596
+ label: 'Deep Flow',
597
+ version: '1.0.0',
598
+ entry: ref('II01klados_1', { type: 'klados' }),
599
+ flow: {
600
+ 'II01klados_1': { then: { pass: ref('II01klados_2', { type: 'klados' }) } },
601
+ 'II01klados_2': { then: { pass: ref('II01klados_3', { type: 'klados' }) } },
602
+ 'II01klados_3': { then: { pass: ref('II01klados_4', { type: 'klados' }) } },
603
+ 'II01klados_4': { then: { pass: ref('II01klados_5', { type: 'klados' }) } },
604
+ 'II01klados_5': { then: { done: true } },
605
+ },
606
+ status: 'active',
607
+ });
608
+ expect(result.valid).toBe(true);
609
+ });
610
+ });
611
+ });
612
+ //# sourceMappingURL=rhiza.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rhiza.test.js","sourceRoot":"","sources":["../../../../src/__tests__/unit/validation/rhiza.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Runtime Validation Tests
3
+ *
4
+ * Tests for validateRhizaRuntime() which validates a rhiza at invoke time.
5
+ * This requires loading all targets from the API and checking:
6
+ * - All targets exist (as klados or rhiza) and are active
7
+ * - Cardinality compatibility between producers and consumers
8
+ * - Type compatibility (warnings only)
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=runtime.test.d.ts.map