@arke-institute/rhiza 0.4.2 → 0.5.1
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/dist/__tests__/unit/handoff/branching.test.js +10 -10
- package/dist/__tests__/unit/handoff/recurse.test.d.ts +10 -0
- package/dist/__tests__/unit/handoff/recurse.test.d.ts.map +1 -0
- package/dist/__tests__/unit/handoff/recurse.test.js +256 -0
- package/dist/__tests__/unit/handoff/recurse.test.js.map +1 -0
- package/dist/__tests__/unit/validation/rhiza.test.js +266 -1
- package/dist/__tests__/unit/validation/rhiza.test.js.map +1 -1
- package/dist/__tests__/unit/worker/job.test.js +52 -0
- package/dist/__tests__/unit/worker/job.test.js.map +1 -1
- package/dist/handoff/interpret.d.ts +3 -1
- package/dist/handoff/interpret.d.ts.map +1 -1
- package/dist/handoff/interpret.js +107 -28
- package/dist/handoff/interpret.js.map +1 -1
- package/dist/handoff/invoke.d.ts +5 -0
- package/dist/handoff/invoke.d.ts.map +1 -1
- package/dist/handoff/invoke.js +1 -0
- package/dist/handoff/invoke.js.map +1 -1
- package/dist/handoff/target.d.ts.map +1 -1
- package/dist/handoff/target.js +4 -0
- package/dist/handoff/target.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/logging/writer.d.ts.map +1 -1
- package/dist/logging/writer.js +0 -3
- package/dist/logging/writer.js.map +1 -1
- package/dist/registration/collection.d.ts.map +1 -1
- package/dist/registration/collection.js +12 -2
- package/dist/registration/collection.js.map +1 -1
- package/dist/types/log.d.ts +4 -2
- package/dist/types/log.d.ts.map +1 -1
- package/dist/types/refs.d.ts +4 -4
- package/dist/types/refs.js +5 -5
- package/dist/types/refs.js.map +1 -1
- package/dist/types/request.d.ts +7 -0
- package/dist/types/request.d.ts.map +1 -1
- package/dist/types/rhiza.d.ts +5 -1
- package/dist/types/rhiza.d.ts.map +1 -1
- package/dist/validation/index.d.ts +1 -1
- package/dist/validation/index.d.ts.map +1 -1
- package/dist/validation/index.js +1 -1
- package/dist/validation/index.js.map +1 -1
- package/dist/validation/validate-rhiza.d.ts +14 -0
- package/dist/validation/validate-rhiza.d.ts.map +1 -1
- package/dist/validation/validate-rhiza.js +73 -2
- package/dist/validation/validate-rhiza.js.map +1 -1
- package/dist/worker/job.d.ts +5 -0
- package/dist/worker/job.d.ts.map +1 -1
- package/dist/worker/job.js +8 -0
- package/dist/worker/job.js.map +1 -1
- package/package.json +2 -2
|
@@ -60,7 +60,7 @@ describe('Branching Workflows', () => {
|
|
|
60
60
|
const pdfPath = ['router', 'handle_pdf', 'pdf_to_image', 'ocr'];
|
|
61
61
|
const step = getStepFromPath(branchingConvergeFlow, pdfPath);
|
|
62
62
|
expect(step).toBeDefined();
|
|
63
|
-
expect(step.klados.
|
|
63
|
+
expect(step.klados.id).toBe('II01klados_ocr');
|
|
64
64
|
expect(step.then).toEqual({ done: true });
|
|
65
65
|
});
|
|
66
66
|
it('finds correct step for image path', () => {
|
|
@@ -68,7 +68,7 @@ describe('Branching Workflows', () => {
|
|
|
68
68
|
const imagePath = ['router', 'handle_image', 'ocr'];
|
|
69
69
|
const step = getStepFromPath(branchingConvergeFlow, imagePath);
|
|
70
70
|
expect(step).toBeDefined();
|
|
71
|
-
expect(step.klados.
|
|
71
|
+
expect(step.klados.id).toBe('II01klados_ocr');
|
|
72
72
|
expect(step.then).toEqual({ done: true });
|
|
73
73
|
});
|
|
74
74
|
it('same step (ocr) reached via different paths', () => {
|
|
@@ -89,13 +89,13 @@ describe('Branching Workflows', () => {
|
|
|
89
89
|
const pdfPath = ['router', 'handle_pdf', 'pdf_to_image', 'ocr_from_pdf'];
|
|
90
90
|
const step = getStepFromPath(branchingSameKladosFlow, pdfPath);
|
|
91
91
|
expect(step).toBeDefined();
|
|
92
|
-
expect(step.klados.
|
|
92
|
+
expect(step.klados.id).toBe('II01klados_ocr'); // Same klados
|
|
93
93
|
});
|
|
94
94
|
it('finds ocr_from_image step on image path', () => {
|
|
95
95
|
const imagePath = ['router', 'handle_image', 'ocr_from_image'];
|
|
96
96
|
const step = getStepFromPath(branchingSameKladosFlow, imagePath);
|
|
97
97
|
expect(step).toBeDefined();
|
|
98
|
-
expect(step.klados.
|
|
98
|
+
expect(step.klados.id).toBe('II01klados_ocr'); // Same klados
|
|
99
99
|
});
|
|
100
100
|
it('same klados but different steps have different then specs', () => {
|
|
101
101
|
const pdfPath = ['router', 'handle_pdf', 'pdf_to_image', 'ocr_from_pdf'];
|
|
@@ -103,7 +103,7 @@ describe('Branching Workflows', () => {
|
|
|
103
103
|
const pdfStep = getStepFromPath(branchingSameKladosFlow, pdfPath);
|
|
104
104
|
const imageStep = getStepFromPath(branchingSameKladosFlow, imagePath);
|
|
105
105
|
// Same klados ID
|
|
106
|
-
expect(pdfStep.klados.
|
|
106
|
+
expect(pdfStep.klados.id).toBe(imageStep.klados.id);
|
|
107
107
|
// But different step objects (different flow keys)
|
|
108
108
|
expect(pdfStep).not.toBe(imageStep);
|
|
109
109
|
});
|
|
@@ -114,14 +114,14 @@ describe('Branching Workflows', () => {
|
|
|
114
114
|
const normalPath = ['router', 'stamp_a', 'stamp_b', 'stamp_c'];
|
|
115
115
|
const step = getStepFromPath(deepBranchingFlow, normalPath);
|
|
116
116
|
expect(step).toBeDefined();
|
|
117
|
-
expect(step.klados.
|
|
117
|
+
expect(step.klados.id).toBe('II01klados_stamp');
|
|
118
118
|
});
|
|
119
119
|
it('finds stamp_c step via fast track (1 stamp)', () => {
|
|
120
120
|
// Fast path: router → fast_track → stamp_c
|
|
121
121
|
const fastPath = ['router', 'fast_track', 'stamp_c'];
|
|
122
122
|
const step = getStepFromPath(deepBranchingFlow, fastPath);
|
|
123
123
|
expect(step).toBeDefined();
|
|
124
|
-
expect(step.klados.
|
|
124
|
+
expect(step.klados.id).toBe('II01klados_stamp');
|
|
125
125
|
});
|
|
126
126
|
it('same stamp_c step but path shows different history', () => {
|
|
127
127
|
const normalPath = ['router', 'stamp_a', 'stamp_b', 'stamp_c'];
|
|
@@ -143,14 +143,14 @@ describe('Branching Workflows', () => {
|
|
|
143
143
|
const path = ['first_stamp'];
|
|
144
144
|
const step = getStepFromPath(duplicateKladosFlow, path);
|
|
145
145
|
expect(step).toBeDefined();
|
|
146
|
-
expect(step.klados.
|
|
146
|
+
expect(step.klados.id).toBe('II01klados_stamp');
|
|
147
147
|
expect(step.then).toEqual({ pass: 'second_stamp' });
|
|
148
148
|
});
|
|
149
149
|
it('finds second_stamp step at path end', () => {
|
|
150
150
|
const path = ['first_stamp', 'second_stamp'];
|
|
151
151
|
const step = getStepFromPath(duplicateKladosFlow, path);
|
|
152
152
|
expect(step).toBeDefined();
|
|
153
|
-
expect(step.klados.
|
|
153
|
+
expect(step.klados.id).toBe('II01klados_stamp');
|
|
154
154
|
expect(step.then).toEqual({ done: true });
|
|
155
155
|
});
|
|
156
156
|
it('same klados but path determines which step we are on', () => {
|
|
@@ -159,7 +159,7 @@ describe('Branching Workflows', () => {
|
|
|
159
159
|
const step1 = getStepFromPath(duplicateKladosFlow, path1);
|
|
160
160
|
const step2 = getStepFromPath(duplicateKladosFlow, path2);
|
|
161
161
|
// Same klados
|
|
162
|
-
expect(step1.klados.
|
|
162
|
+
expect(step1.klados.id).toBe(step2.klados.id);
|
|
163
163
|
// Different then specs
|
|
164
164
|
expect(step1.then).not.toEqual(step2.then);
|
|
165
165
|
expect('pass' in step1.then).toBe(true);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recurse.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/unit/handoff/recurse.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recurse Handoff Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for recurse handoff functionality:
|
|
5
|
+
* - groupOutputsByTarget with recurse ThenSpec
|
|
6
|
+
* - Route resolution for recurse
|
|
7
|
+
* - Depth tracking behavior
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect } from 'vitest';
|
|
10
|
+
import { groupOutputsByTarget, resolveTarget } from '../../../handoff/target';
|
|
11
|
+
describe('Recurse Handoff', () => {
|
|
12
|
+
describe('resolveTarget with recurse', () => {
|
|
13
|
+
it('resolves to default recurse target when no routes', () => {
|
|
14
|
+
const then = { recurse: 'cluster' };
|
|
15
|
+
const properties = { entity_id: 'ent_1' };
|
|
16
|
+
const target = resolveTarget(then, properties);
|
|
17
|
+
expect(target).toBe('cluster');
|
|
18
|
+
});
|
|
19
|
+
it('resolves to route target when route matches', () => {
|
|
20
|
+
const then = {
|
|
21
|
+
recurse: 'cluster',
|
|
22
|
+
route: [
|
|
23
|
+
{ where: { property: 'should_terminate', equals: true }, target: 'done' },
|
|
24
|
+
],
|
|
25
|
+
};
|
|
26
|
+
const properties = { entity_id: 'ent_1', should_terminate: true };
|
|
27
|
+
const target = resolveTarget(then, properties);
|
|
28
|
+
expect(target).toBe('done');
|
|
29
|
+
});
|
|
30
|
+
it('resolves to default when no route matches', () => {
|
|
31
|
+
const then = {
|
|
32
|
+
recurse: 'cluster',
|
|
33
|
+
route: [
|
|
34
|
+
{ where: { property: 'should_terminate', equals: true }, target: 'done' },
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
const properties = { entity_id: 'ent_1', should_terminate: false };
|
|
38
|
+
const target = resolveTarget(then, properties);
|
|
39
|
+
expect(target).toBe('cluster');
|
|
40
|
+
});
|
|
41
|
+
it('handles recurse with max_depth (max_depth ignored in routing)', () => {
|
|
42
|
+
const then = {
|
|
43
|
+
recurse: 'cluster',
|
|
44
|
+
max_depth: 10,
|
|
45
|
+
};
|
|
46
|
+
const properties = { entity_id: 'ent_1' };
|
|
47
|
+
// max_depth doesn't affect routing - it's handled in handleRecurse
|
|
48
|
+
const target = resolveTarget(then, properties);
|
|
49
|
+
expect(target).toBe('cluster');
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
describe('groupOutputsByTarget with recurse', () => {
|
|
53
|
+
it('groups all outputs to recurse target when no routes', () => {
|
|
54
|
+
const outputs = ['ent_1', 'ent_2', 'ent_3'];
|
|
55
|
+
const then = { recurse: 'cluster' };
|
|
56
|
+
const groups = groupOutputsByTarget(outputs, then);
|
|
57
|
+
expect(groups.size).toBe(1);
|
|
58
|
+
expect(groups.get('cluster')).toHaveLength(3);
|
|
59
|
+
expect(groups.get('cluster')[0].entity_id).toBe('ent_1');
|
|
60
|
+
expect(groups.get('cluster')[1].entity_id).toBe('ent_2');
|
|
61
|
+
expect(groups.get('cluster')[2].entity_id).toBe('ent_3');
|
|
62
|
+
});
|
|
63
|
+
it('routes items to "done" when condition matches', () => {
|
|
64
|
+
const outputs = [
|
|
65
|
+
{ entity_id: 'ent_1', is_root: false },
|
|
66
|
+
{ entity_id: 'ent_2', is_root: true },
|
|
67
|
+
{ entity_id: 'ent_3', is_root: false },
|
|
68
|
+
];
|
|
69
|
+
const then = {
|
|
70
|
+
recurse: 'cluster',
|
|
71
|
+
route: [
|
|
72
|
+
{ where: { property: 'is_root', equals: true }, target: 'done' },
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
const groups = groupOutputsByTarget(outputs, then);
|
|
76
|
+
expect(groups.size).toBe(2);
|
|
77
|
+
expect(groups.get('cluster')).toHaveLength(2);
|
|
78
|
+
expect(groups.get('done')).toHaveLength(1);
|
|
79
|
+
expect(groups.get('done')[0].entity_id).toBe('ent_2');
|
|
80
|
+
});
|
|
81
|
+
it('handles all outputs routed to "done" (termination case)', () => {
|
|
82
|
+
const outputs = [
|
|
83
|
+
{ entity_id: 'ent_1', complete: true },
|
|
84
|
+
{ entity_id: 'ent_2', complete: true },
|
|
85
|
+
];
|
|
86
|
+
const then = {
|
|
87
|
+
recurse: 'cluster',
|
|
88
|
+
route: [
|
|
89
|
+
{ where: { property: 'complete', equals: true }, target: 'done' },
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
const groups = groupOutputsByTarget(outputs, then);
|
|
93
|
+
expect(groups.size).toBe(1);
|
|
94
|
+
expect(groups.get('done')).toHaveLength(2);
|
|
95
|
+
expect(groups.has('cluster')).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
it('handles empty outputs (base case)', () => {
|
|
98
|
+
const outputs = [];
|
|
99
|
+
const then = { recurse: 'cluster', max_depth: 20 };
|
|
100
|
+
const groups = groupOutputsByTarget(outputs, then);
|
|
101
|
+
expect(groups.size).toBe(0);
|
|
102
|
+
});
|
|
103
|
+
it('handles complex routing with AND condition', () => {
|
|
104
|
+
const outputs = [
|
|
105
|
+
{ entity_id: 'ent_1', layer: 3, count: 1 },
|
|
106
|
+
{ entity_id: 'ent_2', layer: 3, count: 5 },
|
|
107
|
+
{ entity_id: 'ent_3', layer: 2, count: 1 },
|
|
108
|
+
];
|
|
109
|
+
const then = {
|
|
110
|
+
recurse: 'cluster',
|
|
111
|
+
route: [
|
|
112
|
+
{
|
|
113
|
+
where: {
|
|
114
|
+
and: [
|
|
115
|
+
{ property: 'layer', equals: 3 },
|
|
116
|
+
{ property: 'count', equals: 1 },
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
target: 'done',
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
};
|
|
123
|
+
const groups = groupOutputsByTarget(outputs, then);
|
|
124
|
+
expect(groups.size).toBe(2);
|
|
125
|
+
expect(groups.get('done')).toHaveLength(1);
|
|
126
|
+
expect(groups.get('done')[0].entity_id).toBe('ent_1');
|
|
127
|
+
expect(groups.get('cluster')).toHaveLength(2);
|
|
128
|
+
});
|
|
129
|
+
it('handles OR condition routing', () => {
|
|
130
|
+
const outputs = [
|
|
131
|
+
{ entity_id: 'ent_1', status: 'complete' },
|
|
132
|
+
{ entity_id: 'ent_2', status: 'error' },
|
|
133
|
+
{ entity_id: 'ent_3', status: 'pending' },
|
|
134
|
+
];
|
|
135
|
+
const then = {
|
|
136
|
+
recurse: 'process',
|
|
137
|
+
route: [
|
|
138
|
+
{
|
|
139
|
+
where: {
|
|
140
|
+
or: [
|
|
141
|
+
{ property: 'status', equals: 'complete' },
|
|
142
|
+
{ property: 'status', equals: 'error' },
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
target: 'done',
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
};
|
|
149
|
+
const groups = groupOutputsByTarget(outputs, then);
|
|
150
|
+
expect(groups.get('done')).toHaveLength(2);
|
|
151
|
+
expect(groups.get('process')).toHaveLength(1);
|
|
152
|
+
expect(groups.get('process')[0].entity_id).toBe('ent_3');
|
|
153
|
+
});
|
|
154
|
+
it('preserves OutputItem properties after grouping', () => {
|
|
155
|
+
const outputs = [
|
|
156
|
+
{ entity_id: 'ent_1', cluster_id: 'c1', member_count: 5 },
|
|
157
|
+
{ entity_id: 'ent_2', cluster_id: 'c2', member_count: 3 },
|
|
158
|
+
];
|
|
159
|
+
const then = { recurse: 'describe' };
|
|
160
|
+
const groups = groupOutputsByTarget(outputs, then);
|
|
161
|
+
const grouped = groups.get('describe');
|
|
162
|
+
expect(grouped[0]).toEqual({ entity_id: 'ent_1', cluster_id: 'c1', member_count: 5 });
|
|
163
|
+
expect(grouped[1]).toEqual({ entity_id: 'ent_2', cluster_id: 'c2', member_count: 3 });
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
describe('recurse routing scenarios', () => {
|
|
167
|
+
describe('knowledge graph clustering', () => {
|
|
168
|
+
it('simulates cluster decision: continue recursion', () => {
|
|
169
|
+
// Multiple cluster leaders returned -> recurse to describe
|
|
170
|
+
const outputs = [
|
|
171
|
+
{ entity_id: 'leader_1', is_leader: true },
|
|
172
|
+
{ entity_id: 'leader_2', is_leader: true },
|
|
173
|
+
{ entity_id: 'leader_3', is_leader: true },
|
|
174
|
+
];
|
|
175
|
+
const then = { recurse: 'cluster' };
|
|
176
|
+
const groups = groupOutputsByTarget(outputs, then);
|
|
177
|
+
// All should go to cluster (for the next iteration)
|
|
178
|
+
expect(groups.get('cluster')).toHaveLength(3);
|
|
179
|
+
});
|
|
180
|
+
it('simulates cluster decision: single root terminates', () => {
|
|
181
|
+
// Single output means we've reached the root
|
|
182
|
+
// In practice, the cluster klados would return empty,
|
|
183
|
+
// but we can also use routing to terminate
|
|
184
|
+
const outputs = [
|
|
185
|
+
{ entity_id: 'root', is_single: true },
|
|
186
|
+
];
|
|
187
|
+
const then = {
|
|
188
|
+
recurse: 'cluster',
|
|
189
|
+
route: [
|
|
190
|
+
{ where: { property: 'is_single', equals: true }, target: 'done' },
|
|
191
|
+
],
|
|
192
|
+
};
|
|
193
|
+
const groups = groupOutputsByTarget(outputs, then);
|
|
194
|
+
expect(groups.get('done')).toHaveLength(1);
|
|
195
|
+
expect(groups.has('cluster')).toBe(false);
|
|
196
|
+
});
|
|
197
|
+
it('simulates mixed routing: some done, some continue', () => {
|
|
198
|
+
// Some entities are already clustered (joiners), others are new leaders
|
|
199
|
+
const outputs = [
|
|
200
|
+
{ entity_id: 'leader_1', action: 'created_leader' },
|
|
201
|
+
{ entity_id: 'joiner_1', action: 'joined_existing' },
|
|
202
|
+
{ entity_id: 'leader_2', action: 'created_leader' },
|
|
203
|
+
{ entity_id: 'joiner_2', action: 'joined_existing' },
|
|
204
|
+
];
|
|
205
|
+
const then = {
|
|
206
|
+
recurse: 'describe',
|
|
207
|
+
route: [
|
|
208
|
+
{ where: { property: 'action', equals: 'joined_existing' }, target: 'done' },
|
|
209
|
+
],
|
|
210
|
+
};
|
|
211
|
+
const groups = groupOutputsByTarget(outputs, then);
|
|
212
|
+
expect(groups.get('describe')).toHaveLength(2);
|
|
213
|
+
expect(groups.get('done')).toHaveLength(2);
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
describe('iterative processing', () => {
|
|
217
|
+
it('routes based on iteration depth property', () => {
|
|
218
|
+
// Items carry their own depth tracking
|
|
219
|
+
const outputs = [
|
|
220
|
+
{ entity_id: 'item_1', iteration: 1 },
|
|
221
|
+
{ entity_id: 'item_2', iteration: 5 },
|
|
222
|
+
{ entity_id: 'item_3', iteration: 10 },
|
|
223
|
+
];
|
|
224
|
+
const then = {
|
|
225
|
+
recurse: 'process',
|
|
226
|
+
max_depth: 100,
|
|
227
|
+
route: [
|
|
228
|
+
{ where: { property: 'iteration', equals: 10 }, target: 'done' },
|
|
229
|
+
],
|
|
230
|
+
};
|
|
231
|
+
const groups = groupOutputsByTarget(outputs, then);
|
|
232
|
+
expect(groups.get('process')).toHaveLength(2);
|
|
233
|
+
expect(groups.get('done')).toHaveLength(1);
|
|
234
|
+
expect(groups.get('done')[0].entity_id).toBe('item_3');
|
|
235
|
+
});
|
|
236
|
+
it('handles convergence check routing', () => {
|
|
237
|
+
// Items with no change should terminate
|
|
238
|
+
const outputs = [
|
|
239
|
+
{ entity_id: 'item_1', changed: true },
|
|
240
|
+
{ entity_id: 'item_2', changed: false },
|
|
241
|
+
{ entity_id: 'item_3', changed: true },
|
|
242
|
+
];
|
|
243
|
+
const then = {
|
|
244
|
+
recurse: 'refine',
|
|
245
|
+
route: [
|
|
246
|
+
{ where: { property: 'changed', equals: false }, target: 'done' },
|
|
247
|
+
],
|
|
248
|
+
};
|
|
249
|
+
const groups = groupOutputsByTarget(outputs, then);
|
|
250
|
+
expect(groups.get('refine')).toHaveLength(2);
|
|
251
|
+
expect(groups.get('done')).toHaveLength(1);
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
//# sourceMappingURL=recurse.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recurse.test.js","sourceRoot":"","sources":["../../../../src/__tests__/unit/handoff/recurse.test.ts"],"names":[],"mappings":"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"}
|