@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,139 @@
1
+ /**
2
+ * Klados Validation
3
+ *
4
+ * Validates klados entity properties at creation/update time (static validation).
5
+ * This ensures klados definitions are well-formed before they can be activated.
6
+ */
7
+ /**
8
+ * Validate klados properties (static validation)
9
+ *
10
+ * Checks:
11
+ * - endpoint: Required, must be valid URL
12
+ * - accepts.types: Required, non-empty array
13
+ * - accepts.cardinality: Must be 'one' or 'many'
14
+ * - produces.types: Required, non-empty array
15
+ * - produces.cardinality: Must be 'one' or 'many'
16
+ * - actions_required: Required, non-empty array
17
+ */
18
+ export function validateKladosProperties(properties) {
19
+ const errors = [];
20
+ const warnings = [];
21
+ // Handle null/undefined input
22
+ if (!properties) {
23
+ errors.push({
24
+ code: 'MISSING_ENDPOINT',
25
+ message: 'Klados must have an endpoint URL',
26
+ field: 'endpoint',
27
+ });
28
+ errors.push({
29
+ code: 'EMPTY_ACCEPTS_TYPES',
30
+ message: 'accepts.types must be non-empty (use ["*"] for any)',
31
+ field: 'accepts.types',
32
+ });
33
+ errors.push({
34
+ code: 'EMPTY_PRODUCES_TYPES',
35
+ message: 'produces.types must be non-empty (use ["*"] for any)',
36
+ field: 'produces.types',
37
+ });
38
+ errors.push({
39
+ code: 'EMPTY_ACTIONS',
40
+ message: 'actions_required must be non-empty',
41
+ field: 'actions_required',
42
+ });
43
+ return { valid: false, errors, warnings };
44
+ }
45
+ // =========================================================================
46
+ // Endpoint Validation
47
+ // =========================================================================
48
+ if (!properties.endpoint) {
49
+ errors.push({
50
+ code: 'MISSING_ENDPOINT',
51
+ message: 'Klados must have an endpoint URL',
52
+ field: 'endpoint',
53
+ });
54
+ }
55
+ else {
56
+ try {
57
+ const url = new URL(properties.endpoint);
58
+ // Only allow http and https protocols
59
+ if (!['http:', 'https:'].includes(url.protocol)) {
60
+ errors.push({
61
+ code: 'INVALID_ENDPOINT',
62
+ message: `Invalid endpoint URL protocol: ${url.protocol}`,
63
+ field: 'endpoint',
64
+ });
65
+ }
66
+ }
67
+ catch {
68
+ errors.push({
69
+ code: 'INVALID_ENDPOINT',
70
+ message: `Invalid endpoint URL: ${properties.endpoint}`,
71
+ field: 'endpoint',
72
+ });
73
+ }
74
+ }
75
+ // =========================================================================
76
+ // Accepts Contract Validation
77
+ // =========================================================================
78
+ if (!properties.accepts?.types || properties.accepts.types.length === 0) {
79
+ errors.push({
80
+ code: 'EMPTY_ACCEPTS_TYPES',
81
+ message: 'accepts.types must be non-empty (use ["*"] for any)',
82
+ field: 'accepts.types',
83
+ });
84
+ }
85
+ if (!properties.accepts?.cardinality) {
86
+ errors.push({
87
+ code: 'INVALID_CARDINALITY',
88
+ message: 'accepts.cardinality must be "one" or "many"',
89
+ field: 'accepts.cardinality',
90
+ });
91
+ }
92
+ else if (!['one', 'many'].includes(properties.accepts.cardinality)) {
93
+ errors.push({
94
+ code: 'INVALID_CARDINALITY',
95
+ message: `accepts.cardinality must be "one" or "many", got "${properties.accepts.cardinality}"`,
96
+ field: 'accepts.cardinality',
97
+ });
98
+ }
99
+ // =========================================================================
100
+ // Produces Contract Validation
101
+ // =========================================================================
102
+ if (!properties.produces?.types || properties.produces.types.length === 0) {
103
+ errors.push({
104
+ code: 'EMPTY_PRODUCES_TYPES',
105
+ message: 'produces.types must be non-empty (use ["*"] for any)',
106
+ field: 'produces.types',
107
+ });
108
+ }
109
+ if (!properties.produces?.cardinality) {
110
+ errors.push({
111
+ code: 'INVALID_CARDINALITY',
112
+ message: 'produces.cardinality must be "one" or "many"',
113
+ field: 'produces.cardinality',
114
+ });
115
+ }
116
+ else if (!['one', 'many'].includes(properties.produces.cardinality)) {
117
+ errors.push({
118
+ code: 'INVALID_CARDINALITY',
119
+ message: `produces.cardinality must be "one" or "many", got "${properties.produces.cardinality}"`,
120
+ field: 'produces.cardinality',
121
+ });
122
+ }
123
+ // =========================================================================
124
+ // Actions Required Validation
125
+ // =========================================================================
126
+ if (!properties.actions_required || properties.actions_required.length === 0) {
127
+ errors.push({
128
+ code: 'EMPTY_ACTIONS',
129
+ message: 'actions_required must be non-empty',
130
+ field: 'actions_required',
131
+ });
132
+ }
133
+ return {
134
+ valid: errors.length === 0,
135
+ errors,
136
+ warnings,
137
+ };
138
+ }
139
+ //# sourceMappingURL=validate-klados.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-klados.js","sourceRoot":"","sources":["../../src/validation/validate-klados.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Rhiza Validation
3
+ *
4
+ * Validates rhiza entity properties at creation/update time (static validation).
5
+ * This ensures rhiza definitions are structurally correct.
6
+ */
7
+ import type { RhizaProperties } from '../types';
8
+ import type { ValidationResult } from './validate-klados';
9
+ /**
10
+ * Validate rhiza properties (static validation)
11
+ *
12
+ * Checks:
13
+ * - entry: Required, must be in flow
14
+ * - flow: Required, non-empty
15
+ * - All targets in flow must exist
16
+ * - All paths must terminate (done: true or external rhiza)
17
+ * - No cycles allowed
18
+ * - Route rules must have where and target
19
+ */
20
+ export declare function validateRhizaProperties(properties: Partial<RhizaProperties> | null | undefined): ValidationResult;
21
+ declare module './validate-klados' {
22
+ interface ValidationWarning {
23
+ klados_id?: string;
24
+ }
25
+ interface ValidationError {
26
+ klados_id?: string;
27
+ }
28
+ }
29
+ //# sourceMappingURL=validate-rhiza.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-rhiza.d.ts","sourceRoot":"","sources":["../../src/validation/validate-rhiza.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAA4D,MAAM,UAAU,CAAC;AAE1G,OAAO,KAAK,EAAE,gBAAgB,EAAsC,MAAM,mBAAmB,CAAC;AAE9F;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,GAAG,SAAS,GACtD,gBAAgB,CA6FlB;AAuVD,OAAO,QAAQ,mBAAmB,CAAC;IACjC,UAAU,iBAAiB;QACzB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;IACD,UAAU,eAAe;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;CACF"}
@@ -0,0 +1,382 @@
1
+ /**
2
+ * Rhiza Validation
3
+ *
4
+ * Validates rhiza entity properties at creation/update time (static validation).
5
+ * This ensures rhiza definitions are structurally correct.
6
+ */
7
+ import { isEntityRef } from '../types';
8
+ /**
9
+ * Validate rhiza properties (static validation)
10
+ *
11
+ * Checks:
12
+ * - entry: Required, must be in flow
13
+ * - flow: Required, non-empty
14
+ * - All targets in flow must exist
15
+ * - All paths must terminate (done: true or external rhiza)
16
+ * - No cycles allowed
17
+ * - Route rules must have where and target
18
+ */
19
+ export function validateRhizaProperties(properties) {
20
+ const errors = [];
21
+ const warnings = [];
22
+ // Handle null/undefined input
23
+ if (!properties) {
24
+ errors.push({
25
+ code: 'MISSING_ENTRY',
26
+ message: 'Rhiza must have an entry klados ID',
27
+ field: 'entry',
28
+ });
29
+ errors.push({
30
+ code: 'EMPTY_FLOW',
31
+ message: 'Rhiza must have at least one flow step',
32
+ field: 'flow',
33
+ });
34
+ return { valid: false, errors, warnings };
35
+ }
36
+ // Entry required and must be valid EntityRef
37
+ if (!properties.entry) {
38
+ errors.push({
39
+ code: 'MISSING_ENTRY',
40
+ message: 'Rhiza must have an entry klados reference',
41
+ field: 'entry',
42
+ });
43
+ }
44
+ else if (!isEntityRef(properties.entry)) {
45
+ errors.push({
46
+ code: 'INVALID_ENTRY',
47
+ message: 'Rhiza entry must be an EntityRef with a pi field',
48
+ field: 'entry',
49
+ });
50
+ }
51
+ else if (!properties.entry.pi) {
52
+ errors.push({
53
+ code: 'MISSING_ENTRY',
54
+ message: 'Rhiza entry reference must have a non-empty pi field',
55
+ field: 'entry',
56
+ });
57
+ }
58
+ // Flow required
59
+ if (!properties.flow || Object.keys(properties.flow).length === 0) {
60
+ errors.push({
61
+ code: 'EMPTY_FLOW',
62
+ message: 'Rhiza must have at least one flow step',
63
+ field: 'flow',
64
+ });
65
+ return { valid: false, errors, warnings };
66
+ }
67
+ // Entry must be in flow (extract pi from EntityRef)
68
+ const entryId = isEntityRef(properties.entry) ? properties.entry.pi : null;
69
+ if (entryId && !properties.flow[entryId]) {
70
+ errors.push({
71
+ code: 'ENTRY_NOT_IN_FLOW',
72
+ message: `Entry klados '${entryId}' is not in flow`,
73
+ field: 'entry',
74
+ });
75
+ }
76
+ // Validate each flow step
77
+ for (const [kladosId, step] of Object.entries(properties.flow)) {
78
+ validateFlowStep(kladosId, step, properties.flow, errors, warnings);
79
+ }
80
+ // Check all paths terminate (also detects cycles)
81
+ if (entryId && properties.flow[entryId]) {
82
+ const terminationResult = validateAllPathsTerminate(entryId, properties.flow);
83
+ errors.push(...terminationResult.errors);
84
+ }
85
+ // Check for unreachable kladoi
86
+ if (entryId && properties.flow[entryId]) {
87
+ const reachable = findReachableIds(entryId, properties.flow);
88
+ for (const kladosId of Object.keys(properties.flow)) {
89
+ if (!reachable.has(kladosId)) {
90
+ warnings.push({
91
+ code: 'UNREACHABLE_KLADOS',
92
+ message: `Klados '${kladosId}' is not reachable from entry`,
93
+ klados_id: kladosId,
94
+ });
95
+ }
96
+ }
97
+ }
98
+ return {
99
+ valid: errors.length === 0,
100
+ errors,
101
+ warnings,
102
+ };
103
+ }
104
+ /**
105
+ * Validate a single flow step
106
+ */
107
+ function validateFlowStep(kladosId, step, flow, errors, warnings) {
108
+ if (!step.then) {
109
+ errors.push({
110
+ code: 'MISSING_THEN',
111
+ message: `Flow step for '${kladosId}' is missing 'then' specification`,
112
+ klados_id: kladosId,
113
+ });
114
+ return;
115
+ }
116
+ validateThen(kladosId, step.then, flow, errors, warnings);
117
+ }
118
+ /**
119
+ * Validate a then spec
120
+ */
121
+ function validateThen(kladosId, then, flow, errors, warnings) {
122
+ if ('done' in then) {
123
+ // Terminal - valid
124
+ return;
125
+ }
126
+ if ('pass' in then) {
127
+ validateTarget(kladosId, 'pass', then.pass, flow, errors);
128
+ if (then.route) {
129
+ validateRouteRules(kladosId, then.route, flow, errors, warnings);
130
+ }
131
+ return;
132
+ }
133
+ if ('scatter' in then) {
134
+ validateTarget(kladosId, 'scatter', then.scatter, flow, errors);
135
+ if (then.route) {
136
+ validateRouteRules(kladosId, then.route, flow, errors, warnings);
137
+ }
138
+ return;
139
+ }
140
+ if ('gather' in then) {
141
+ validateTarget(kladosId, 'gather', then.gather, flow, errors);
142
+ if (then.route) {
143
+ validateRouteRules(kladosId, then.route, flow, errors, warnings);
144
+ }
145
+ return;
146
+ }
147
+ errors.push({
148
+ code: 'INVALID_HANDOFF',
149
+ message: `Unknown handoff type in '${kladosId}': ${JSON.stringify(then)}`,
150
+ klados_id: kladosId,
151
+ });
152
+ }
153
+ /**
154
+ * Validate route rules on a handoff
155
+ */
156
+ function validateRouteRules(kladosId, routes, _flow, errors, _warnings) {
157
+ for (let i = 0; i < routes.length; i++) {
158
+ const rule = routes[i];
159
+ if (!rule.where) {
160
+ errors.push({
161
+ code: 'INVALID_ROUTE_RULE',
162
+ message: `Route rule ${i} in '${kladosId}' is missing 'where' condition`,
163
+ klados_id: kladosId,
164
+ });
165
+ }
166
+ else {
167
+ validateWhereCondition(kladosId, rule.where, i, errors);
168
+ }
169
+ if (!rule.target) {
170
+ errors.push({
171
+ code: 'INVALID_ROUTE_RULE',
172
+ message: `Route rule ${i} in '${kladosId}' is missing 'target'`,
173
+ klados_id: kladosId,
174
+ });
175
+ }
176
+ else if (!isEntityRef(rule.target)) {
177
+ errors.push({
178
+ code: 'INVALID_TARGET',
179
+ message: `Route rule ${i} target in '${kladosId}' must be an EntityRef with a pi field`,
180
+ klados_id: kladosId,
181
+ });
182
+ }
183
+ }
184
+ }
185
+ /**
186
+ * Validate a where condition (recursive for AND/OR)
187
+ */
188
+ function validateWhereCondition(kladosId, where, ruleIndex, errors) {
189
+ if ('property' in where && 'equals' in where) {
190
+ // WhereEquals - valid
191
+ if (typeof where.property !== 'string') {
192
+ errors.push({
193
+ code: 'INVALID_WHERE_CONDITION',
194
+ message: `Route rule ${ruleIndex} in '${kladosId}': 'property' must be a string`,
195
+ klados_id: kladosId,
196
+ });
197
+ }
198
+ return;
199
+ }
200
+ if ('and' in where) {
201
+ // WhereAnd
202
+ if (!Array.isArray(where.and) || where.and.length === 0) {
203
+ errors.push({
204
+ code: 'INVALID_WHERE_CONDITION',
205
+ message: `Route rule ${ruleIndex} in '${kladosId}': 'and' must be a non-empty array`,
206
+ klados_id: kladosId,
207
+ });
208
+ return;
209
+ }
210
+ for (const condition of where.and) {
211
+ validateWhereCondition(kladosId, condition, ruleIndex, errors);
212
+ }
213
+ return;
214
+ }
215
+ if ('or' in where) {
216
+ // WhereOr
217
+ if (!Array.isArray(where.or) || where.or.length === 0) {
218
+ errors.push({
219
+ code: 'INVALID_WHERE_CONDITION',
220
+ message: `Route rule ${ruleIndex} in '${kladosId}': 'or' must be a non-empty array`,
221
+ klados_id: kladosId,
222
+ });
223
+ return;
224
+ }
225
+ for (const condition of where.or) {
226
+ validateWhereCondition(kladosId, condition, ruleIndex, errors);
227
+ }
228
+ return;
229
+ }
230
+ errors.push({
231
+ code: 'INVALID_WHERE_CONDITION',
232
+ message: `Route rule ${ruleIndex} in '${kladosId}': invalid where condition format`,
233
+ klados_id: kladosId,
234
+ });
235
+ }
236
+ /**
237
+ * Validate a target reference
238
+ *
239
+ * Note: This only validates that the target is in the flow for static validation.
240
+ * External targets (rhiza IDs) are validated at runtime.
241
+ */
242
+ function validateTarget(sourceKladosId, handoffType, target, flow, errors) {
243
+ if (!target || !isEntityRef(target)) {
244
+ errors.push({
245
+ code: 'INVALID_TARGET',
246
+ message: `Invalid target in '${sourceKladosId}' ${handoffType}: must be an EntityRef with a pi field`,
247
+ klados_id: sourceKladosId,
248
+ field: `then.${handoffType}`,
249
+ });
250
+ return;
251
+ }
252
+ const targetId = target.pi;
253
+ // Target must be in flow (for static validation)
254
+ // At runtime, targets not in flow are resolved as rhiza IDs
255
+ if (!flow[targetId]) {
256
+ errors.push({
257
+ code: 'INVALID_TARGET',
258
+ message: `Target '${targetId}' in '${sourceKladosId}' is not in flow`,
259
+ klados_id: sourceKladosId,
260
+ field: `then.${handoffType}`,
261
+ });
262
+ }
263
+ }
264
+ /**
265
+ * Validate all paths terminate
266
+ *
267
+ * Traverses all possible paths from entry and ensures each ends in:
268
+ * - done: true (terminal)
269
+ * - A target not in flow (assumed to be a rhiza, validated at runtime)
270
+ *
271
+ * Also detects cycles during traversal.
272
+ */
273
+ function validateAllPathsTerminate(entry, flow) {
274
+ const errors = [];
275
+ function traverse(current, path) {
276
+ // Cycle detection
277
+ if (path.includes(current)) {
278
+ const cycleStart = path.indexOf(current);
279
+ const cycle = [...path.slice(cycleStart), current];
280
+ errors.push({
281
+ code: 'CYCLE_DETECTED',
282
+ message: `Cycle detected: ${cycle.join(' -> ')}`,
283
+ });
284
+ return;
285
+ }
286
+ const step = flow[current];
287
+ if (!step || !step.then) {
288
+ // Not in flow - assumed to be rhiza target (valid termination)
289
+ return;
290
+ }
291
+ const then = step.then;
292
+ const newPath = [...path, current];
293
+ if ('done' in then) {
294
+ // Terminal - valid
295
+ return;
296
+ }
297
+ // Get all possible targets (including route alternatives)
298
+ const targets = extractAllTargets(then);
299
+ if (targets.length === 0) {
300
+ errors.push({
301
+ code: 'UNTERMINATED_PATH',
302
+ message: `Path ending at '${current}' has no valid target`,
303
+ klados_id: current,
304
+ });
305
+ return;
306
+ }
307
+ for (const target of targets) {
308
+ if (!flow[target]) {
309
+ // Target not in flow - assumed to be rhiza (valid termination)
310
+ continue;
311
+ }
312
+ traverse(target, newPath);
313
+ }
314
+ }
315
+ traverse(entry, []);
316
+ return { errors };
317
+ }
318
+ /**
319
+ * Extract all possible targets from a ThenSpec (including route alternatives)
320
+ * Returns the pi (ID) strings from EntityRefs
321
+ */
322
+ function extractAllTargets(then) {
323
+ const targets = [];
324
+ if ('done' in then) {
325
+ return [];
326
+ }
327
+ if ('pass' in then) {
328
+ if (isEntityRef(then.pass))
329
+ targets.push(then.pass.pi);
330
+ if (then.route) {
331
+ for (const rule of then.route) {
332
+ if (isEntityRef(rule.target))
333
+ targets.push(rule.target.pi);
334
+ }
335
+ }
336
+ }
337
+ if ('scatter' in then) {
338
+ if (isEntityRef(then.scatter))
339
+ targets.push(then.scatter.pi);
340
+ if (then.route) {
341
+ for (const rule of then.route) {
342
+ if (isEntityRef(rule.target))
343
+ targets.push(rule.target.pi);
344
+ }
345
+ }
346
+ }
347
+ if ('gather' in then) {
348
+ if (isEntityRef(then.gather))
349
+ targets.push(then.gather.pi);
350
+ if (then.route) {
351
+ for (const rule of then.route) {
352
+ if (isEntityRef(rule.target))
353
+ targets.push(rule.target.pi);
354
+ }
355
+ }
356
+ }
357
+ return targets;
358
+ }
359
+ /**
360
+ * Find all IDs reachable from entry
361
+ */
362
+ function findReachableIds(entry, flow) {
363
+ const reachable = new Set();
364
+ const queue = [entry];
365
+ while (queue.length > 0) {
366
+ const current = queue.shift();
367
+ if (reachable.has(current))
368
+ continue;
369
+ reachable.add(current);
370
+ const step = flow[current];
371
+ if (!step || !step.then)
372
+ continue;
373
+ const targets = extractAllTargets(step.then);
374
+ for (const target of targets) {
375
+ if (!reachable.has(target) && flow[target]) {
376
+ queue.push(target);
377
+ }
378
+ }
379
+ }
380
+ return reachable;
381
+ }
382
+ //# sourceMappingURL=validate-rhiza.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-rhiza.js","sourceRoot":"","sources":["../../src/validation/validate-rhiza.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Runtime Validation
3
+ *
4
+ * Validates a rhiza at invoke time by loading all targets and checking:
5
+ * - All targets exist (as klados or rhiza) and are active
6
+ * - Cardinality compatibility
7
+ * - Type compatibility (warnings)
8
+ */
9
+ import type { KladosEntity, RhizaEntity, RhizaProperties } from '../types';
10
+ import type { ValidationError, ValidationWarning } from './validate-klados';
11
+ import type { MockArkeClient } from '../__tests__/fixtures/mock-client';
12
+ export interface RuntimeValidationResult {
13
+ valid: boolean;
14
+ errors: ValidationError[];
15
+ warnings: ValidationWarning[];
16
+ kladoi: Map<string, KladosEntity>;
17
+ rhizai: Map<string, RhizaEntity>;
18
+ }
19
+ /**
20
+ * Validate a rhiza at runtime
21
+ *
22
+ * This loads all targets and validates:
23
+ * 1. All targets exist (as klados or rhiza) and are active
24
+ * 2. Cardinality compatibility
25
+ * 3. Type compatibility (warnings)
26
+ */
27
+ export declare function validateRhizaRuntime(client: MockArkeClient, properties: RhizaProperties): Promise<RuntimeValidationResult>;
28
+ //# sourceMappingURL=validate-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-runtime.d.ts","sourceRoot":"","sources":["../../src/validation/validate-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAY,MAAM,UAAU,CAAC;AACrF,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAExE,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CAClC;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC,uBAAuB,CAAC,CA4ClC"}