ultravisor 1.0.20 → 1.0.22

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 (37) hide show
  1. package/docs/_version.json +7 -0
  2. package/docs/css/docuserve.css +277 -23
  3. package/docs/features/beacon-authentication.md +24 -31
  4. package/docs/features/beacon-providers.md +31 -37
  5. package/docs/features/beacons.md +20 -19
  6. package/docs/features/case-study-retold-remote.md +28 -28
  7. package/docs/features/llm-model-setup.md +15 -15
  8. package/docs/features/llm.md +29 -27
  9. package/docs/features/platform-cards.md +10 -10
  10. package/docs/features/reachability-matrix.md +12 -12
  11. package/docs/features/tasks-content-system.md +32 -32
  12. package/docs/features/tasks-data-transform.md +64 -64
  13. package/docs/features/tasks-extension.md +14 -14
  14. package/docs/features/tasks-file-system.md +94 -94
  15. package/docs/features/tasks-flow-control.md +38 -38
  16. package/docs/features/tasks-http-client.md +40 -40
  17. package/docs/features/tasks-llm.md +58 -58
  18. package/docs/features/tasks-meadow-api.md +50 -50
  19. package/docs/features/tasks-user-interaction.md +12 -12
  20. package/docs/features/tasks.md +20 -20
  21. package/docs/features/universal-addressing.md +12 -12
  22. package/docs/index.html +2 -2
  23. package/docs/retold-catalog.json +30 -1
  24. package/docs/retold-keyword-index.json +15389 -12741
  25. package/package.json +5 -4
  26. package/source/services/Ultravisor-Beacon-Coordinator.cjs +40 -1
  27. package/source/services/Ultravisor-ExecutionEngine.cjs +9 -3
  28. package/source/services/Ultravisor-OperationAuditor.cjs +471 -0
  29. package/source/services/tasks/data-transform/Ultravisor-TaskConfigs-DataTransform.cjs +72 -0
  30. package/source/services/tasks/data-transform/definitions/random-number.json +24 -0
  31. package/source/services/tasks/data-transform/definitions/random-string.json +23 -0
  32. package/source/services/tasks/extension/Ultravisor-TaskConfigs-Extension.cjs +19 -7
  33. package/source/services/tasks/user-interaction/Ultravisor-TaskConfigs-UserInteraction.cjs +30 -2
  34. package/source/services/tasks/user-interaction/Ultravisor-TaskType-ValueInput.cjs +56 -2
  35. package/source/web_server/Ultravisor-API-Server.cjs +70 -0
  36. package/test/Ultravisor-Beacon-Reachability_tests.js +520 -0
  37. package/test/Ultravisor_tests.js +4 -4
@@ -0,0 +1,520 @@
1
+ /**
2
+ * Unit tests for the UltravisorBeaconReachability service, specifically the
3
+ * shared-fs reachability strategy (findSharedFsPeer + resolveStrategy).
4
+ *
5
+ * These tests exist to catch regressions in the logic that decides whether
6
+ * two beacons can skip the HTTP file-transfer layer because they share a
7
+ * filesystem on the same host. The shared-fs optimization is nearly invisible
8
+ * when it works (you just see faster thumbnails) and almost invisible when it
9
+ * silently stops working (you see slower thumbnails and a lot more bandwidth).
10
+ * The only way to catch regressions early is to assert the branch behavior
11
+ * of `findSharedFsPeer` and `resolveStrategy` directly, with mocked coordinator
12
+ * state standing in for a real running Ultravisor.
13
+ *
14
+ * Test layout:
15
+ *
16
+ * findSharedFsPeer
17
+ * - positive match: two beacons, same host, overlapping mount → MATCH
18
+ * - negative: source beacon missing HostID (legacy) → null
19
+ * - negative: source beacon has empty SharedMounts → null
20
+ * - negative: source beacon missing entirely → null
21
+ * - negative: no coordinator service registered → null
22
+ * - negative: only the source beacon exists (no peers) → null
23
+ * - negative: peer on different host → null
24
+ * - negative: peer on same host but no overlapping MountID → null
25
+ * - negative: peer is Offline → null
26
+ * - positive: multiple peers, one matches → MATCH (first match wins)
27
+ *
28
+ * resolveStrategy
29
+ * - local (same beacon) → Strategy: local
30
+ * - shared-fs (same host, overlapping mount) → Strategy: shared-fs + root
31
+ * - direct (different host, reachable matrix) → Strategy: direct
32
+ * - proxy fallback (matrix says unreachable/untested) → Strategy: proxy
33
+ *
34
+ * _findSharedMount
35
+ * - helper-level tests for the pure mount-overlap logic
36
+ */
37
+
38
+ const libPict = require('pict');
39
+ const libUltravisorBeaconReachability = require('../source/services/Ultravisor-Beacon-Reachability.cjs');
40
+
41
+ var Chai = require('chai');
42
+ var Expect = Chai.expect;
43
+
44
+ /**
45
+ * Build a Pict instance with a MOCK BeaconCoordinator and the real
46
+ * Reachability service. The coordinator mock exposes the same two methods
47
+ * (getBeacon, listBeacons) that Reachability consumes, so we can construct
48
+ * arbitrary beacon topologies without spinning up the real coordinator.
49
+ *
50
+ * @param {Object<string, object>} pBeacons - Keyed by BeaconID
51
+ * @returns {{ fable, reachability, coordinator }}
52
+ */
53
+ function _buildTestHarness(pBeacons)
54
+ {
55
+ let tmpFable = new libPict(
56
+ {
57
+ Product: 'Ultravisor-Test-Reachability',
58
+ LogLevel: 5
59
+ });
60
+
61
+ // Mock coordinator — just enough surface area for Reachability to work.
62
+ let tmpMockCoordinator =
63
+ {
64
+ serviceType: 'UltravisorBeaconCoordinator',
65
+ Hash: 'MockCoordinator',
66
+ _Beacons: pBeacons || {},
67
+ getBeacon: function (pBeaconID)
68
+ {
69
+ return this._Beacons[pBeaconID] || null;
70
+ },
71
+ listBeacons: function ()
72
+ {
73
+ return Object.values(this._Beacons);
74
+ },
75
+ setBeacons: function (pNewBeacons)
76
+ {
77
+ this._Beacons = pNewBeacons || {};
78
+ }
79
+ };
80
+
81
+ // Register the mock under the same name Reachability expects.
82
+ if (!tmpFable.servicesMap['UltravisorBeaconCoordinator'])
83
+ {
84
+ tmpFable.servicesMap['UltravisorBeaconCoordinator'] = {};
85
+ }
86
+ tmpFable.servicesMap['UltravisorBeaconCoordinator'][tmpMockCoordinator.Hash] = tmpMockCoordinator;
87
+
88
+ // Instantiate the real Reachability service.
89
+ tmpFable.addAndInstantiateServiceTypeIfNotExists('UltravisorBeaconReachability', libUltravisorBeaconReachability);
90
+ let tmpReachability = Object.values(tmpFable.servicesMap['UltravisorBeaconReachability'])[0];
91
+
92
+ return {
93
+ fable: tmpFable,
94
+ reachability: tmpReachability,
95
+ coordinator: tmpMockCoordinator
96
+ };
97
+ }
98
+
99
+ /**
100
+ * Helper: build a fake beacon record. Anything not specified defaults to the
101
+ * "typical online beacon on host-alpha with one shared mount" shape.
102
+ */
103
+ function _beacon(pOverrides)
104
+ {
105
+ let tmpBase =
106
+ {
107
+ BeaconID: 'bcn-default',
108
+ Name: 'default',
109
+ Status: 'Online',
110
+ HostID: 'host-alpha',
111
+ SharedMounts: [{ MountID: 'mnt-1', Root: '/data' }],
112
+ Contexts: { File: { BasePath: '/data', BaseURL: '/content/' } },
113
+ BindAddresses: [{ IP: '10.0.0.2', Port: 7777, Protocol: 'http' }]
114
+ };
115
+ return Object.assign(tmpBase, pOverrides || {});
116
+ }
117
+
118
+ suite
119
+ (
120
+ 'Ultravisor Beacon Reachability',
121
+ function ()
122
+ {
123
+ // ================================================================
124
+ // findSharedFsPeer
125
+ // ================================================================
126
+ suite
127
+ (
128
+ 'findSharedFsPeer',
129
+ function ()
130
+ {
131
+ test
132
+ (
133
+ 'returns null when the coordinator service is not registered',
134
+ function ()
135
+ {
136
+ let tmpFable = new libPict({ Product: 'Ultravisor-Test-Reachability', LogLevel: 5 });
137
+ // Note: NO coordinator registered — simulate a broken test harness
138
+ tmpFable.addAndInstantiateServiceTypeIfNotExists('UltravisorBeaconReachability', libUltravisorBeaconReachability);
139
+ let tmpReachability = Object.values(tmpFable.servicesMap['UltravisorBeaconReachability'])[0];
140
+
141
+ Expect(tmpReachability.findSharedFsPeer('bcn-whatever')).to.equal(null);
142
+ }
143
+ );
144
+
145
+ test
146
+ (
147
+ 'returns null when the source beacon is not in the coordinator registry',
148
+ function ()
149
+ {
150
+ let tmpHarness = _buildTestHarness({});
151
+ Expect(tmpHarness.reachability.findSharedFsPeer('bcn-ghost')).to.equal(null);
152
+ }
153
+ );
154
+
155
+ test
156
+ (
157
+ 'returns null when the source beacon has no HostID (legacy beacon)',
158
+ function ()
159
+ {
160
+ let tmpHarness = _buildTestHarness(
161
+ {
162
+ 'bcn-legacy': _beacon({ BeaconID: 'bcn-legacy', HostID: null }),
163
+ 'bcn-peer': _beacon({ BeaconID: 'bcn-peer', HostID: 'host-alpha' })
164
+ });
165
+ Expect(tmpHarness.reachability.findSharedFsPeer('bcn-legacy')).to.equal(null);
166
+ }
167
+ );
168
+
169
+ test
170
+ (
171
+ 'returns null when the source beacon has an empty SharedMounts array',
172
+ function ()
173
+ {
174
+ let tmpHarness = _buildTestHarness(
175
+ {
176
+ 'bcn-empty': _beacon({ BeaconID: 'bcn-empty', SharedMounts: [] }),
177
+ 'bcn-peer': _beacon({ BeaconID: 'bcn-peer' })
178
+ });
179
+ Expect(tmpHarness.reachability.findSharedFsPeer('bcn-empty')).to.equal(null);
180
+ }
181
+ );
182
+
183
+ test
184
+ (
185
+ 'returns null when only the source beacon is registered (no peers at all)',
186
+ function ()
187
+ {
188
+ let tmpHarness = _buildTestHarness(
189
+ {
190
+ 'bcn-lonely': _beacon({ BeaconID: 'bcn-lonely' })
191
+ });
192
+ Expect(tmpHarness.reachability.findSharedFsPeer('bcn-lonely')).to.equal(null);
193
+ }
194
+ );
195
+
196
+ test
197
+ (
198
+ 'returns null when the peer is on a different host',
199
+ function ()
200
+ {
201
+ let tmpHarness = _buildTestHarness(
202
+ {
203
+ 'bcn-source': _beacon({ BeaconID: 'bcn-source', HostID: 'host-alpha' }),
204
+ 'bcn-remote': _beacon({ BeaconID: 'bcn-remote', HostID: 'host-beta' })
205
+ });
206
+ Expect(tmpHarness.reachability.findSharedFsPeer('bcn-source')).to.equal(null);
207
+ }
208
+ );
209
+
210
+ test
211
+ (
212
+ 'returns null when the peer shares a host but has no overlapping MountID',
213
+ function ()
214
+ {
215
+ let tmpHarness = _buildTestHarness(
216
+ {
217
+ 'bcn-source': _beacon(
218
+ {
219
+ BeaconID: 'bcn-source',
220
+ SharedMounts: [{ MountID: 'mnt-alpha', Root: '/data-alpha' }]
221
+ }),
222
+ 'bcn-peer': _beacon(
223
+ {
224
+ BeaconID: 'bcn-peer',
225
+ SharedMounts: [{ MountID: 'mnt-beta', Root: '/data-beta' }]
226
+ })
227
+ });
228
+ Expect(tmpHarness.reachability.findSharedFsPeer('bcn-source')).to.equal(null);
229
+ }
230
+ );
231
+
232
+ test
233
+ (
234
+ 'returns null when the only matching peer is Offline',
235
+ function ()
236
+ {
237
+ let tmpHarness = _buildTestHarness(
238
+ {
239
+ 'bcn-source': _beacon({ BeaconID: 'bcn-source' }),
240
+ 'bcn-dead': _beacon({ BeaconID: 'bcn-dead', Status: 'Offline' })
241
+ });
242
+ Expect(tmpHarness.reachability.findSharedFsPeer('bcn-source')).to.equal(null);
243
+ }
244
+ );
245
+
246
+ test
247
+ (
248
+ 'returns a MATCH when a peer shares host and MountID (happy path)',
249
+ function ()
250
+ {
251
+ let tmpHarness = _buildTestHarness(
252
+ {
253
+ 'bcn-retold-remote': _beacon({ BeaconID: 'bcn-retold-remote' }),
254
+ 'bcn-orator-conversion': _beacon({ BeaconID: 'bcn-orator-conversion' })
255
+ });
256
+ let tmpResult = tmpHarness.reachability.findSharedFsPeer('bcn-retold-remote');
257
+ Expect(tmpResult).to.not.equal(null);
258
+ Expect(tmpResult.Peer.BeaconID).to.equal('bcn-orator-conversion');
259
+ Expect(tmpResult.Mount.MountID).to.equal('mnt-1');
260
+ Expect(tmpResult.Mount.Root).to.equal('/data');
261
+ }
262
+ );
263
+
264
+ test
265
+ (
266
+ 'returns the first MATCH when multiple peers share host+mount',
267
+ function ()
268
+ {
269
+ let tmpHarness = _buildTestHarness(
270
+ {
271
+ 'bcn-source': _beacon({ BeaconID: 'bcn-source' }),
272
+ 'bcn-peer-1': _beacon({ BeaconID: 'bcn-peer-1' }),
273
+ 'bcn-peer-2': _beacon({ BeaconID: 'bcn-peer-2' })
274
+ });
275
+ let tmpResult = tmpHarness.reachability.findSharedFsPeer('bcn-source');
276
+ Expect(tmpResult).to.not.equal(null);
277
+ // Whichever peer is first in listBeacons iteration order wins — we
278
+ // don't care which; we just care that SOMETHING matched.
279
+ Expect(['bcn-peer-1', 'bcn-peer-2']).to.include(tmpResult.Peer.BeaconID);
280
+ }
281
+ );
282
+
283
+ test
284
+ (
285
+ 'does not match the source beacon against itself',
286
+ function ()
287
+ {
288
+ let tmpHarness = _buildTestHarness(
289
+ {
290
+ 'bcn-solo': _beacon({ BeaconID: 'bcn-solo' })
291
+ });
292
+ // With only the source beacon in the registry, no match.
293
+ Expect(tmpHarness.reachability.findSharedFsPeer('bcn-solo')).to.equal(null);
294
+ }
295
+ );
296
+
297
+ test
298
+ (
299
+ 'finds a peer when source has multiple mounts and at least one overlaps',
300
+ function ()
301
+ {
302
+ let tmpHarness = _buildTestHarness(
303
+ {
304
+ 'bcn-source': _beacon(
305
+ {
306
+ BeaconID: 'bcn-source',
307
+ SharedMounts: [
308
+ { MountID: 'mnt-content', Root: '/media' },
309
+ { MountID: 'mnt-cache', Root: '/cache' },
310
+ { MountID: 'mnt-config', Root: '/config' }
311
+ ]
312
+ }),
313
+ 'bcn-peer': _beacon(
314
+ {
315
+ BeaconID: 'bcn-peer',
316
+ SharedMounts: [
317
+ { MountID: 'mnt-cache', Root: '/cache' }
318
+ ]
319
+ })
320
+ });
321
+ let tmpResult = tmpHarness.reachability.findSharedFsPeer('bcn-source');
322
+ Expect(tmpResult).to.not.equal(null);
323
+ Expect(tmpResult.Mount.MountID).to.equal('mnt-cache');
324
+ Expect(tmpResult.Mount.Root).to.equal('/cache');
325
+ }
326
+ );
327
+ }
328
+ );
329
+
330
+ // ================================================================
331
+ // resolveStrategy
332
+ // ================================================================
333
+ suite
334
+ (
335
+ 'resolveStrategy',
336
+ function ()
337
+ {
338
+ test
339
+ (
340
+ 'returns Strategy=local when source and requesting beacon are the same',
341
+ function ()
342
+ {
343
+ let tmpHarness = _buildTestHarness(
344
+ {
345
+ 'bcn-only': _beacon({ BeaconID: 'bcn-only' })
346
+ });
347
+ let tmpResult = tmpHarness.reachability.resolveStrategy('bcn-only', 'bcn-only');
348
+ Expect(tmpResult.Strategy).to.equal('local');
349
+ }
350
+ );
351
+
352
+ test
353
+ (
354
+ 'returns Strategy=shared-fs when beacons share host+mount',
355
+ function ()
356
+ {
357
+ let tmpHarness = _buildTestHarness(
358
+ {
359
+ 'bcn-source': _beacon({ BeaconID: 'bcn-source' }),
360
+ 'bcn-consumer': _beacon({ BeaconID: 'bcn-consumer' })
361
+ });
362
+ let tmpResult = tmpHarness.reachability.resolveStrategy('bcn-source', 'bcn-consumer');
363
+ Expect(tmpResult.Strategy).to.equal('shared-fs');
364
+ Expect(tmpResult.SharedMountRoot).to.equal('/data');
365
+ }
366
+ );
367
+
368
+ test
369
+ (
370
+ 'returns Strategy=proxy when beacons are on different hosts and reachability is untested',
371
+ function ()
372
+ {
373
+ let tmpHarness = _buildTestHarness(
374
+ {
375
+ 'bcn-source': _beacon({ BeaconID: 'bcn-source', HostID: 'host-alpha' }),
376
+ 'bcn-remote': _beacon({ BeaconID: 'bcn-remote', HostID: 'host-beta' })
377
+ });
378
+ // Untested matrix → falls through to proxy
379
+ let tmpResult = tmpHarness.reachability.resolveStrategy('bcn-source', 'bcn-remote');
380
+ Expect(tmpResult.Strategy).to.equal('proxy');
381
+ }
382
+ );
383
+
384
+ test
385
+ (
386
+ 'returns Strategy=direct when the matrix says the pair is reachable',
387
+ function ()
388
+ {
389
+ let tmpHarness = _buildTestHarness(
390
+ {
391
+ 'bcn-source': _beacon({ BeaconID: 'bcn-source', HostID: 'host-alpha' }),
392
+ 'bcn-remote': _beacon({ BeaconID: 'bcn-remote', HostID: 'host-beta' })
393
+ });
394
+ // Stub the reachability matrix to say these two CAN reach each other
395
+ tmpHarness.reachability.getReachability = function ()
396
+ {
397
+ return { Status: 'reachable' };
398
+ };
399
+ let tmpResult = tmpHarness.reachability.resolveStrategy('bcn-source', 'bcn-remote');
400
+ Expect(tmpResult.Strategy).to.equal('direct');
401
+ Expect(tmpResult.DirectURL).to.be.a('string');
402
+ }
403
+ );
404
+
405
+ test
406
+ (
407
+ 'returns Strategy=proxy when the source beacon does not exist in the registry',
408
+ function ()
409
+ {
410
+ let tmpHarness = _buildTestHarness(
411
+ {
412
+ 'bcn-requestor': _beacon({ BeaconID: 'bcn-requestor' })
413
+ });
414
+ let tmpResult = tmpHarness.reachability.resolveStrategy('bcn-vanished', 'bcn-requestor');
415
+ Expect(tmpResult.Strategy).to.equal('proxy');
416
+ }
417
+ );
418
+
419
+ test
420
+ (
421
+ 'prefers shared-fs over direct when both are possible',
422
+ function ()
423
+ {
424
+ let tmpHarness = _buildTestHarness(
425
+ {
426
+ 'bcn-source': _beacon({ BeaconID: 'bcn-source' }),
427
+ 'bcn-consumer': _beacon({ BeaconID: 'bcn-consumer' })
428
+ });
429
+ // Even if the matrix says they're reachable via HTTP, shared-fs
430
+ // should still win because it's cheaper.
431
+ tmpHarness.reachability.getReachability = function ()
432
+ {
433
+ return { Status: 'reachable' };
434
+ };
435
+ let tmpResult = tmpHarness.reachability.resolveStrategy('bcn-source', 'bcn-consumer');
436
+ Expect(tmpResult.Strategy).to.equal('shared-fs');
437
+ }
438
+ );
439
+
440
+ test
441
+ (
442
+ 'falls back to direct/proxy when one of the beacons is a legacy (no HostID) beacon',
443
+ function ()
444
+ {
445
+ let tmpHarness = _buildTestHarness(
446
+ {
447
+ 'bcn-legacy': _beacon({ BeaconID: 'bcn-legacy', HostID: null }),
448
+ 'bcn-modern': _beacon({ BeaconID: 'bcn-modern' })
449
+ });
450
+ // A legacy beacon can't participate in shared-fs — should fall
451
+ // through to the matrix-based direct/proxy decision.
452
+ let tmpResult = tmpHarness.reachability.resolveStrategy('bcn-legacy', 'bcn-modern');
453
+ Expect(tmpResult.Strategy).to.not.equal('shared-fs');
454
+ Expect(['direct', 'proxy']).to.include(tmpResult.Strategy);
455
+ }
456
+ );
457
+ }
458
+ );
459
+
460
+ // ================================================================
461
+ // _findSharedMount (helper)
462
+ // ================================================================
463
+ suite
464
+ (
465
+ '_findSharedMount',
466
+ function ()
467
+ {
468
+ test
469
+ (
470
+ 'returns null for empty or missing arrays',
471
+ function ()
472
+ {
473
+ let tmpHarness = _buildTestHarness({});
474
+ let tmpR = tmpHarness.reachability;
475
+ Expect(tmpR._findSharedMount(null, null)).to.equal(null);
476
+ Expect(tmpR._findSharedMount(undefined, undefined)).to.equal(null);
477
+ Expect(tmpR._findSharedMount([], [])).to.equal(null);
478
+ Expect(tmpR._findSharedMount([{ MountID: 'x' }], [])).to.equal(null);
479
+ Expect(tmpR._findSharedMount([], [{ MountID: 'x' }])).to.equal(null);
480
+ }
481
+ );
482
+
483
+ test
484
+ (
485
+ 'returns the first matching mount from the source side',
486
+ function ()
487
+ {
488
+ let tmpHarness = _buildTestHarness({});
489
+ let tmpMatch = tmpHarness.reachability._findSharedMount(
490
+ [
491
+ { MountID: 'a', Root: '/root-a' },
492
+ { MountID: 'b', Root: '/root-b' }
493
+ ],
494
+ [
495
+ { MountID: 'b', Root: '/root-b-as-seen-by-peer' }
496
+ ]);
497
+ Expect(tmpMatch).to.not.equal(null);
498
+ Expect(tmpMatch.MountID).to.equal('b');
499
+ // Source-side root wins — which matters because the dispatcher
500
+ // uses this Root to build the LocalPath for the requesting side.
501
+ Expect(tmpMatch.Root).to.equal('/root-b');
502
+ }
503
+ );
504
+
505
+ test
506
+ (
507
+ 'skips entries that have no MountID',
508
+ function ()
509
+ {
510
+ let tmpHarness = _buildTestHarness({});
511
+ Expect(tmpHarness.reachability._findSharedMount(
512
+ [{ Root: '/a' }, { MountID: 'c', Root: '/c' }],
513
+ [{ MountID: 'c', Root: '/c' }]
514
+ ).MountID).to.equal('c');
515
+ }
516
+ );
517
+ }
518
+ );
519
+ }
520
+ );
@@ -190,7 +190,7 @@ suite
190
190
  Expect(tmpInstance.definition.Hash).to.equal('read-file');
191
191
 
192
192
  let tmpDefs = tmpRegistry.listDefinitions();
193
- Expect(tmpDefs.length).to.equal(54);
193
+ Expect(tmpDefs.length).to.equal(56);
194
194
 
195
195
  // Verify all registered definitions have Capability, Action, and Tier
196
196
  for (let i = 0; i < tmpDefs.length; i++)
@@ -1806,7 +1806,7 @@ suite
1806
1806
  let tmpBuiltInConfigs = require('../source/services/tasks/Ultravisor-BuiltIn-TaskConfigs.cjs');
1807
1807
  let tmpCount = tmpRegistry.registerTaskTypesFromConfigArray(tmpBuiltInConfigs);
1808
1808
 
1809
- Expect(tmpCount).to.equal(54);
1809
+ Expect(tmpCount).to.equal(56);
1810
1810
 
1811
1811
  // Spot-check a few
1812
1812
  Expect(tmpRegistry.hasTaskType('error-message')).to.equal(true);
@@ -1991,7 +1991,7 @@ suite
1991
1991
 
1992
1992
  // Configs already registered by createTestFable — verify all present
1993
1993
  let tmpDefs = tmpRegistry.listDefinitions();
1994
- Expect(tmpDefs.length).to.equal(54);
1994
+ Expect(tmpDefs.length).to.equal(56);
1995
1995
  }
1996
1996
  );
1997
1997
  }
@@ -3877,7 +3877,7 @@ suite
3877
3877
 
3878
3878
  // Verify WaitingTasks has the dispatch node
3879
3879
  Expect(pContext.WaitingTasks['dispatch-1']).to.not.equal(undefined);
3880
- Expect(pContext.WaitingTasks['dispatch-1'].ResumeEventName).to.equal('Complete');
3880
+ Expect(pContext.WaitingTasks['dispatch-1'].ResumeEventName).to.equal('complete');
3881
3881
 
3882
3882
  // Verify a work item was enqueued
3883
3883
  let tmpWorkItems = tmpCoordinator.listWorkItems();