@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.
- package/README.md +106 -0
- package/dist/__tests__/fixtures/index.d.ts +9 -0
- package/dist/__tests__/fixtures/index.d.ts.map +1 -0
- package/dist/__tests__/fixtures/index.js +12 -0
- package/dist/__tests__/fixtures/index.js.map +1 -0
- package/dist/__tests__/fixtures/kladoi/index.d.ts +165 -0
- package/dist/__tests__/fixtures/kladoi/index.d.ts.map +1 -0
- package/dist/__tests__/fixtures/kladoi/index.js +270 -0
- package/dist/__tests__/fixtures/kladoi/index.js.map +1 -0
- package/dist/__tests__/fixtures/logs/index.d.ts +19 -0
- package/dist/__tests__/fixtures/logs/index.d.ts.map +1 -0
- package/dist/__tests__/fixtures/logs/index.js +545 -0
- package/dist/__tests__/fixtures/logs/index.js.map +1 -0
- package/dist/__tests__/fixtures/mock-client.d.ts +127 -0
- package/dist/__tests__/fixtures/mock-client.d.ts.map +1 -0
- package/dist/__tests__/fixtures/mock-client.js +415 -0
- package/dist/__tests__/fixtures/mock-client.js.map +1 -0
- package/dist/__tests__/fixtures/rhizai/index.d.ts +54 -0
- package/dist/__tests__/fixtures/rhizai/index.d.ts.map +1 -0
- package/dist/__tests__/fixtures/rhizai/index.js +283 -0
- package/dist/__tests__/fixtures/rhizai/index.js.map +1 -0
- package/dist/__tests__/unit/fixtures.test.d.ts +10 -0
- package/dist/__tests__/unit/fixtures.test.d.ts.map +1 -0
- package/dist/__tests__/unit/fixtures.test.js +275 -0
- package/dist/__tests__/unit/fixtures.test.js.map +1 -0
- package/dist/__tests__/unit/handoff/gather.test.d.ts +8 -0
- package/dist/__tests__/unit/handoff/gather.test.d.ts.map +1 -0
- package/dist/__tests__/unit/handoff/gather.test.js +176 -0
- package/dist/__tests__/unit/handoff/gather.test.js.map +1 -0
- package/dist/__tests__/unit/handoff/interpret.test.d.ts +9 -0
- package/dist/__tests__/unit/handoff/interpret.test.d.ts.map +1 -0
- package/dist/__tests__/unit/handoff/interpret.test.js +370 -0
- package/dist/__tests__/unit/handoff/interpret.test.js.map +1 -0
- package/dist/__tests__/unit/handoff/route.test.d.ts +8 -0
- package/dist/__tests__/unit/handoff/route.test.d.ts.map +1 -0
- package/dist/__tests__/unit/handoff/route.test.js +271 -0
- package/dist/__tests__/unit/handoff/route.test.js.map +1 -0
- package/dist/__tests__/unit/handoff/scatter.test.d.ts +7 -0
- package/dist/__tests__/unit/handoff/scatter.test.d.ts.map +1 -0
- package/dist/__tests__/unit/handoff/scatter.test.js +54 -0
- package/dist/__tests__/unit/handoff/scatter.test.js.map +1 -0
- package/dist/__tests__/unit/resume.test.d.ts +8 -0
- package/dist/__tests__/unit/resume.test.d.ts.map +1 -0
- package/dist/__tests__/unit/resume.test.js +134 -0
- package/dist/__tests__/unit/resume.test.js.map +1 -0
- package/dist/__tests__/unit/status.test.d.ts +8 -0
- package/dist/__tests__/unit/status.test.d.ts.map +1 -0
- package/dist/__tests__/unit/status.test.js +164 -0
- package/dist/__tests__/unit/status.test.js.map +1 -0
- package/dist/__tests__/unit/target.test.d.ts +8 -0
- package/dist/__tests__/unit/target.test.d.ts.map +1 -0
- package/dist/__tests__/unit/target.test.js +116 -0
- package/dist/__tests__/unit/target.test.js.map +1 -0
- package/dist/__tests__/unit/traverse.test.d.ts +8 -0
- package/dist/__tests__/unit/traverse.test.d.ts.map +1 -0
- package/dist/__tests__/unit/traverse.test.js +143 -0
- package/dist/__tests__/unit/traverse.test.js.map +1 -0
- package/dist/__tests__/unit/validation/klados.test.d.ts +16 -0
- package/dist/__tests__/unit/validation/klados.test.d.ts.map +1 -0
- package/dist/__tests__/unit/validation/klados.test.js +275 -0
- package/dist/__tests__/unit/validation/klados.test.js.map +1 -0
- package/dist/__tests__/unit/validation/rhiza.test.d.ts +16 -0
- package/dist/__tests__/unit/validation/rhiza.test.d.ts.map +1 -0
- package/dist/__tests__/unit/validation/rhiza.test.js +612 -0
- package/dist/__tests__/unit/validation/rhiza.test.js.map +1 -0
- package/dist/__tests__/unit/validation/runtime.test.d.ts +11 -0
- package/dist/__tests__/unit/validation/runtime.test.d.ts.map +1 -0
- package/dist/__tests__/unit/validation/runtime.test.js +553 -0
- package/dist/__tests__/unit/validation/runtime.test.js.map +1 -0
- package/dist/__tests__/unit/worker/errors.test.d.ts +2 -0
- package/dist/__tests__/unit/worker/errors.test.d.ts.map +1 -0
- package/dist/__tests__/unit/worker/errors.test.js +226 -0
- package/dist/__tests__/unit/worker/errors.test.js.map +1 -0
- package/dist/__tests__/unit/worker/job.test.d.ts +2 -0
- package/dist/__tests__/unit/worker/job.test.d.ts.map +1 -0
- package/dist/__tests__/unit/worker/job.test.js +233 -0
- package/dist/__tests__/unit/worker/job.test.js.map +1 -0
- package/dist/client/index.d.ts +10 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +8 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/interface.d.ts +142 -0
- package/dist/client/interface.d.ts.map +1 -0
- package/dist/client/interface.js +8 -0
- package/dist/client/interface.js.map +1 -0
- package/dist/client/mock.d.ts +95 -0
- package/dist/client/mock.d.ts.map +1 -0
- package/dist/client/mock.js +795 -0
- package/dist/client/mock.js.map +1 -0
- package/dist/client/types.d.ts +344 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +8 -0
- package/dist/client/types.js.map +1 -0
- package/dist/handoff/gather-api.d.ts +60 -0
- package/dist/handoff/gather-api.d.ts.map +1 -0
- package/dist/handoff/gather-api.js +130 -0
- package/dist/handoff/gather-api.js.map +1 -0
- package/dist/handoff/gather.d.ts +59 -0
- package/dist/handoff/gather.d.ts.map +1 -0
- package/dist/handoff/gather.js +134 -0
- package/dist/handoff/gather.js.map +1 -0
- package/dist/handoff/index.d.ts +19 -0
- package/dist/handoff/index.d.ts.map +1 -0
- package/dist/handoff/index.js +25 -0
- package/dist/handoff/index.js.map +1 -0
- package/dist/handoff/interpret.d.ts +79 -0
- package/dist/handoff/interpret.d.ts.map +1 -0
- package/dist/handoff/interpret.js +197 -0
- package/dist/handoff/interpret.js.map +1 -0
- package/dist/handoff/invoke.d.ts +82 -0
- package/dist/handoff/invoke.d.ts.map +1 -0
- package/dist/handoff/invoke.js +196 -0
- package/dist/handoff/invoke.js.map +1 -0
- package/dist/handoff/route.d.ts +25 -0
- package/dist/handoff/route.d.ts.map +1 -0
- package/dist/handoff/route.js +65 -0
- package/dist/handoff/route.js.map +1 -0
- package/dist/handoff/scatter-api.d.ts +62 -0
- package/dist/handoff/scatter-api.d.ts.map +1 -0
- package/dist/handoff/scatter-api.js +81 -0
- package/dist/handoff/scatter-api.js.map +1 -0
- package/dist/handoff/scatter.d.ts +19 -0
- package/dist/handoff/scatter.d.ts.map +1 -0
- package/dist/handoff/scatter.js +27 -0
- package/dist/handoff/scatter.js.map +1 -0
- package/dist/handoff/target.d.ts +16 -0
- package/dist/handoff/target.d.ts.map +1 -0
- package/dist/handoff/target.js +51 -0
- package/dist/handoff/target.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/index.d.ts +4 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +3 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +52 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +70 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/logging/writer.d.ts +63 -0
- package/dist/logging/writer.d.ts.map +1 -0
- package/dist/logging/writer.js +160 -0
- package/dist/logging/writer.js.map +1 -0
- package/dist/resume/index.d.ts +77 -0
- package/dist/resume/index.d.ts.map +1 -0
- package/dist/resume/index.js +110 -0
- package/dist/resume/index.js.map +1 -0
- package/dist/status/index.d.ts +54 -0
- package/dist/status/index.d.ts.map +1 -0
- package/dist/status/index.js +107 -0
- package/dist/status/index.js.map +1 -0
- package/dist/traverse/index.d.ts +53 -0
- package/dist/traverse/index.d.ts.map +1 -0
- package/dist/traverse/index.js +142 -0
- package/dist/traverse/index.js.map +1 -0
- package/dist/types/batch.d.ts +53 -0
- package/dist/types/batch.d.ts.map +1 -0
- package/dist/types/batch.js +2 -0
- package/dist/types/batch.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/klados.d.ts +63 -0
- package/dist/types/klados.d.ts.map +1 -0
- package/dist/types/klados.js +2 -0
- package/dist/types/klados.js.map +1 -0
- package/dist/types/log.d.ts +107 -0
- package/dist/types/log.d.ts.map +1 -0
- package/dist/types/log.js +2 -0
- package/dist/types/log.js.map +1 -0
- package/dist/types/refs.d.ts +58 -0
- package/dist/types/refs.d.ts.map +1 -0
- package/dist/types/refs.js +43 -0
- package/dist/types/refs.js.map +1 -0
- package/dist/types/request.d.ts +69 -0
- package/dist/types/request.d.ts.map +1 -0
- package/dist/types/request.js +2 -0
- package/dist/types/request.js.map +1 -0
- package/dist/types/response.d.ts +31 -0
- package/dist/types/response.d.ts.map +1 -0
- package/dist/types/response.js +2 -0
- package/dist/types/response.js.map +1 -0
- package/dist/types/rhiza.d.ts +100 -0
- package/dist/types/rhiza.d.ts.map +1 -0
- package/dist/types/rhiza.js +2 -0
- package/dist/types/rhiza.js.map +1 -0
- package/dist/types/status.d.ts +84 -0
- package/dist/types/status.d.ts.map +1 -0
- package/dist/types/status.js +2 -0
- package/dist/types/status.js.map +1 -0
- package/dist/utils/id.d.ts +15 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +25 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/validation/index.d.ts +9 -0
- package/dist/validation/index.d.ts.map +1 -0
- package/dist/validation/index.js +9 -0
- package/dist/validation/index.js.map +1 -0
- package/dist/validation/validate-klados.d.ts +38 -0
- package/dist/validation/validate-klados.d.ts.map +1 -0
- package/dist/validation/validate-klados.js +139 -0
- package/dist/validation/validate-klados.js.map +1 -0
- package/dist/validation/validate-rhiza.d.ts +29 -0
- package/dist/validation/validate-rhiza.d.ts.map +1 -0
- package/dist/validation/validate-rhiza.js +382 -0
- package/dist/validation/validate-rhiza.js.map +1 -0
- package/dist/validation/validate-runtime.d.ts +28 -0
- package/dist/validation/validate-runtime.d.ts.map +1 -0
- package/dist/validation/validate-runtime.js +212 -0
- package/dist/validation/validate-runtime.js.map +1 -0
- package/dist/worker/errors.d.ts +77 -0
- package/dist/worker/errors.d.ts.map +1 -0
- package/dist/worker/errors.js +143 -0
- package/dist/worker/errors.js.map +1 -0
- package/dist/worker/index.d.ts +8 -0
- package/dist/worker/index.d.ts.map +1 -0
- package/dist/worker/index.js +8 -0
- package/dist/worker/index.js.map +1 -0
- package/dist/worker/job.d.ts +150 -0
- package/dist/worker/job.d.ts.map +1 -0
- package/dist/worker/job.js +280 -0
- package/dist/worker/job.js.map +1 -0
- 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":"AAAA;;;;;GAKG;AAyBH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,wBAAwB,CACtC,UAAwD;IAExD,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,8BAA8B;IAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,kCAAkC;YAC3C,KAAK,EAAE,UAAU;SAClB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,qDAAqD;YAC9D,KAAK,EAAE,eAAe;SACvB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,sDAAsD;YAC/D,KAAK,EAAE,gBAAgB;SACxB,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,oCAAoC;YAC7C,KAAK,EAAE,kBAAkB;SAC1B,CAAC,CAAC;QACH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC5C,CAAC;IAED,4EAA4E;IAC5E,sBAAsB;IACtB,4EAA4E;IAE5E,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,kCAAkC;YAC3C,KAAK,EAAE,UAAU;SAClB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACzC,sCAAsC;YACtC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,kCAAkC,GAAG,CAAC,QAAQ,EAAE;oBACzD,KAAK,EAAE,UAAU;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,yBAAyB,UAAU,CAAC,QAAQ,EAAE;gBACvD,KAAK,EAAE,UAAU;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,8BAA8B;IAC9B,4EAA4E;IAE5E,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,IAAI,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,qDAAqD;YAC9D,KAAK,EAAE,eAAe;SACvB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,6CAA6C;YACtD,KAAK,EAAE,qBAAqB;SAC7B,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACrE,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,qDAAqD,UAAU,CAAC,OAAO,CAAC,WAAW,GAAG;YAC/F,KAAK,EAAE,qBAAqB;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,+BAA+B;IAC/B,4EAA4E;IAE5E,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,KAAK,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1E,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,sDAAsD;YAC/D,KAAK,EAAE,gBAAgB;SACxB,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,8CAA8C;YACvD,KAAK,EAAE,sBAAsB;SAC9B,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACtE,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,sDAAsD,UAAU,CAAC,QAAQ,CAAC,WAAW,GAAG;YACjG,KAAK,EAAE,sBAAsB;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,8BAA8B;IAC9B,4EAA4E;IAE5E,IAAI,CAAC,UAAU,CAAC,gBAAgB,IAAI,UAAU,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,oCAAoC;YAC7C,KAAK,EAAE,kBAAkB;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,MAAM;QACN,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -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"}
|