@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.
Files changed (52) hide show
  1. package/dist/__tests__/unit/handoff/branching.test.js +10 -10
  2. package/dist/__tests__/unit/handoff/recurse.test.d.ts +10 -0
  3. package/dist/__tests__/unit/handoff/recurse.test.d.ts.map +1 -0
  4. package/dist/__tests__/unit/handoff/recurse.test.js +256 -0
  5. package/dist/__tests__/unit/handoff/recurse.test.js.map +1 -0
  6. package/dist/__tests__/unit/validation/rhiza.test.js +266 -1
  7. package/dist/__tests__/unit/validation/rhiza.test.js.map +1 -1
  8. package/dist/__tests__/unit/worker/job.test.js +52 -0
  9. package/dist/__tests__/unit/worker/job.test.js.map +1 -1
  10. package/dist/handoff/interpret.d.ts +3 -1
  11. package/dist/handoff/interpret.d.ts.map +1 -1
  12. package/dist/handoff/interpret.js +107 -28
  13. package/dist/handoff/interpret.js.map +1 -1
  14. package/dist/handoff/invoke.d.ts +5 -0
  15. package/dist/handoff/invoke.d.ts.map +1 -1
  16. package/dist/handoff/invoke.js +1 -0
  17. package/dist/handoff/invoke.js.map +1 -1
  18. package/dist/handoff/target.d.ts.map +1 -1
  19. package/dist/handoff/target.js +4 -0
  20. package/dist/handoff/target.js.map +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1 -1
  24. package/dist/index.js.map +1 -1
  25. package/dist/logging/writer.d.ts.map +1 -1
  26. package/dist/logging/writer.js +0 -3
  27. package/dist/logging/writer.js.map +1 -1
  28. package/dist/registration/collection.d.ts.map +1 -1
  29. package/dist/registration/collection.js +12 -2
  30. package/dist/registration/collection.js.map +1 -1
  31. package/dist/types/log.d.ts +4 -2
  32. package/dist/types/log.d.ts.map +1 -1
  33. package/dist/types/refs.d.ts +4 -4
  34. package/dist/types/refs.js +5 -5
  35. package/dist/types/refs.js.map +1 -1
  36. package/dist/types/request.d.ts +7 -0
  37. package/dist/types/request.d.ts.map +1 -1
  38. package/dist/types/rhiza.d.ts +5 -1
  39. package/dist/types/rhiza.d.ts.map +1 -1
  40. package/dist/validation/index.d.ts +1 -1
  41. package/dist/validation/index.d.ts.map +1 -1
  42. package/dist/validation/index.js +1 -1
  43. package/dist/validation/index.js.map +1 -1
  44. package/dist/validation/validate-rhiza.d.ts +14 -0
  45. package/dist/validation/validate-rhiza.d.ts.map +1 -1
  46. package/dist/validation/validate-rhiza.js +73 -2
  47. package/dist/validation/validate-rhiza.js.map +1 -1
  48. package/dist/worker/job.d.ts +5 -0
  49. package/dist/worker/job.d.ts.map +1 -1
  50. package/dist/worker/job.js +8 -0
  51. package/dist/worker/job.js.map +1 -1
  52. 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.pi).toBe('II01klados_ocr');
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.pi).toBe('II01klados_ocr');
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.pi).toBe('II01klados_ocr'); // Same 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.pi).toBe('II01klados_ocr'); // Same 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.pi).toBe(imageStep.klados.pi);
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.pi).toBe('II01klados_stamp');
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.pi).toBe('II01klados_stamp');
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.pi).toBe('II01klados_stamp');
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.pi).toBe('II01klados_stamp');
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.pi).toBe(step2.klados.pi);
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,10 @@
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
+ export {};
10
+ //# sourceMappingURL=recurse.test.d.ts.map
@@ -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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"}