ultravisor 1.0.21 → 1.0.23
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/docs/_version.json +7 -0
- package/docs/css/docuserve.css +277 -23
- package/docs/features/beacon-authentication.md +24 -31
- package/docs/features/beacon-providers.md +31 -37
- package/docs/features/beacons.md +20 -19
- package/docs/features/case-study-retold-remote.md +28 -28
- package/docs/features/llm-model-setup.md +15 -15
- package/docs/features/llm.md +29 -27
- package/docs/features/platform-cards.md +10 -10
- package/docs/features/reachability-matrix.md +12 -12
- package/docs/features/tasks-content-system.md +32 -32
- package/docs/features/tasks-data-transform.md +64 -64
- package/docs/features/tasks-extension.md +14 -14
- package/docs/features/tasks-file-system.md +94 -94
- package/docs/features/tasks-flow-control.md +38 -38
- package/docs/features/tasks-http-client.md +40 -40
- package/docs/features/tasks-llm.md +58 -58
- package/docs/features/tasks-meadow-api.md +50 -50
- package/docs/features/tasks-user-interaction.md +12 -12
- package/docs/features/tasks.md +20 -20
- package/docs/features/universal-addressing.md +12 -12
- package/docs/index.html +2 -2
- package/docs/retold-catalog.json +30 -1
- package/docs/retold-keyword-index.json +15389 -12741
- package/package.json +4 -3
- package/source/services/Ultravisor-Beacon-Coordinator.cjs +39 -0
- package/source/services/Ultravisor-ExecutionEngine.cjs +15 -2
- package/source/services/Ultravisor-OperationAuditor.cjs +471 -0
- package/source/web_server/Ultravisor-API-Server.cjs +54 -0
- package/test/Ultravisor_tests.js +132 -0
package/test/Ultravisor_tests.js
CHANGED
|
@@ -760,6 +760,138 @@ suite
|
|
|
760
760
|
});
|
|
761
761
|
}
|
|
762
762
|
);
|
|
763
|
+
|
|
764
|
+
test
|
|
765
|
+
(
|
|
766
|
+
'State connection Data.StateKey should override target port name when resolving settings.',
|
|
767
|
+
function()
|
|
768
|
+
{
|
|
769
|
+
// The storyboard — long-form video operation wires
|
|
770
|
+
// a value-input's InputValue state output into a
|
|
771
|
+
// parameter-sweep task's `ParameterSets` setting
|
|
772
|
+
// via an event-trigger target port. The target
|
|
773
|
+
// port name can't match the setting name in that
|
|
774
|
+
// shape, so the connection declares
|
|
775
|
+
// `Data.StateKey: "ParameterSets"` and the engine
|
|
776
|
+
// has to honor it. Without the StateKey override,
|
|
777
|
+
// the value would land on `tmpSettings[<port name>]`
|
|
778
|
+
// and the sweep task's `pResolvedSettings.ParameterSets`
|
|
779
|
+
// would be undefined, causing "ParameterSets must be
|
|
780
|
+
// a JSON array." at runtime.
|
|
781
|
+
let tmpFable = createTestFable();
|
|
782
|
+
let tmpEngine = Object.values(tmpFable.servicesMap['UltravisorExecutionEngine'])[0];
|
|
783
|
+
|
|
784
|
+
let tmpNode = {
|
|
785
|
+
Hash: 'sweep-node',
|
|
786
|
+
Type: 'parameter-sweep',
|
|
787
|
+
Data: {},
|
|
788
|
+
Settings: {},
|
|
789
|
+
Ports:
|
|
790
|
+
[
|
|
791
|
+
{ Direction: 'input', Hash: 'sweep-node-ei-begin', Label: 'BeginSweep', Side: 'left-bottom' }
|
|
792
|
+
]
|
|
793
|
+
};
|
|
794
|
+
|
|
795
|
+
let tmpContext = {
|
|
796
|
+
TaskOutputs: {
|
|
797
|
+
'value-input-node': { InputValue: [ { prompt: 'beat 1' }, { prompt: 'beat 2' } ] }
|
|
798
|
+
},
|
|
799
|
+
_ConnectionMap: {
|
|
800
|
+
stateTargets:
|
|
801
|
+
{
|
|
802
|
+
'sweep-node':
|
|
803
|
+
[
|
|
804
|
+
{
|
|
805
|
+
Hash: 'state-conn',
|
|
806
|
+
ConnectionType: 'state',
|
|
807
|
+
SourceNodeHash: 'value-input-node',
|
|
808
|
+
SourcePortHash: 'value-input-node-so-InputValue',
|
|
809
|
+
TargetNodeHash: 'sweep-node',
|
|
810
|
+
TargetPortHash: 'sweep-node-ei-begin',
|
|
811
|
+
Data: { StateKey: 'ParameterSets' }
|
|
812
|
+
}
|
|
813
|
+
]
|
|
814
|
+
}
|
|
815
|
+
},
|
|
816
|
+
_PortLabelMap:
|
|
817
|
+
{
|
|
818
|
+
'value-input-node-so-InputValue': 'InputValue',
|
|
819
|
+
'sweep-node-ei-begin': 'begin'
|
|
820
|
+
}
|
|
821
|
+
};
|
|
822
|
+
|
|
823
|
+
let tmpResolved = tmpEngine._resolveStateConnections('sweep-node', tmpNode, tmpContext);
|
|
824
|
+
|
|
825
|
+
// The StateKey override routes InputValue into the
|
|
826
|
+
// setting named ParameterSets, not into the target
|
|
827
|
+
// port's label ("begin").
|
|
828
|
+
Expect(Array.isArray(tmpResolved.ParameterSets)).to.equal(true);
|
|
829
|
+
Expect(tmpResolved.ParameterSets.length).to.equal(2);
|
|
830
|
+
Expect(tmpResolved.ParameterSets[0].prompt).to.equal('beat 1');
|
|
831
|
+
// The target port's label-named key should NOT
|
|
832
|
+
// have been populated when StateKey is present.
|
|
833
|
+
Expect(tmpResolved.begin).to.equal(undefined);
|
|
834
|
+
}
|
|
835
|
+
);
|
|
836
|
+
|
|
837
|
+
test
|
|
838
|
+
(
|
|
839
|
+
'State connection without Data.StateKey should still route by target port name.',
|
|
840
|
+
function()
|
|
841
|
+
{
|
|
842
|
+
// Regression guard for the StateKey fallback: when
|
|
843
|
+
// the state connection has no StateKey, the engine
|
|
844
|
+
// must continue to use the target port name as the
|
|
845
|
+
// settings key (backward compatibility for every
|
|
846
|
+
// operation wired the old way, including the
|
|
847
|
+
// template-transform test above).
|
|
848
|
+
let tmpFable = createTestFable();
|
|
849
|
+
let tmpEngine = Object.values(tmpFable.servicesMap['UltravisorExecutionEngine'])[0];
|
|
850
|
+
|
|
851
|
+
let tmpNode = {
|
|
852
|
+
Hash: 'write-node',
|
|
853
|
+
Type: 'write-file',
|
|
854
|
+
Data: {},
|
|
855
|
+
Settings: {},
|
|
856
|
+
Ports:
|
|
857
|
+
[
|
|
858
|
+
{ Direction: 'input', Hash: 'write-node-si-Content', Label: 'Content', Side: 'left-top' }
|
|
859
|
+
]
|
|
860
|
+
};
|
|
861
|
+
|
|
862
|
+
let tmpContext = {
|
|
863
|
+
TaskOutputs: {
|
|
864
|
+
'read-node': { FileContent: 'hello world' }
|
|
865
|
+
},
|
|
866
|
+
_ConnectionMap: {
|
|
867
|
+
stateTargets:
|
|
868
|
+
{
|
|
869
|
+
'write-node':
|
|
870
|
+
[
|
|
871
|
+
{
|
|
872
|
+
Hash: 'legacy-state-conn',
|
|
873
|
+
ConnectionType: 'state',
|
|
874
|
+
SourceNodeHash: 'read-node',
|
|
875
|
+
SourcePortHash: 'read-node-so-FileContent',
|
|
876
|
+
TargetNodeHash: 'write-node',
|
|
877
|
+
TargetPortHash: 'write-node-si-Content'
|
|
878
|
+
// No Data.StateKey — fall through
|
|
879
|
+
}
|
|
880
|
+
]
|
|
881
|
+
}
|
|
882
|
+
},
|
|
883
|
+
_PortLabelMap:
|
|
884
|
+
{
|
|
885
|
+
'read-node-so-FileContent': 'FileContent',
|
|
886
|
+
'write-node-si-Content': 'Content'
|
|
887
|
+
}
|
|
888
|
+
};
|
|
889
|
+
|
|
890
|
+
let tmpResolved = tmpEngine._resolveStateConnections('write-node', tmpNode, tmpContext);
|
|
891
|
+
|
|
892
|
+
Expect(tmpResolved.Content).to.equal('hello world');
|
|
893
|
+
}
|
|
894
|
+
);
|
|
763
895
|
}
|
|
764
896
|
);
|
|
765
897
|
|