@@ -36,7 +36,9 @@ function createDeferred<T>() {
3636 return { promise, resolve, reject } ;
3737}
3838
39- function mockLocalEmbeddingRuntime ( vector = new Float32Array ( [ 2.35 , 3.45 , 0.63 , 4.3 ] ) ) {
39+ function mockLocalEmbeddingRuntime (
40+ vector : ArrayLike < number > = new Float32Array ( [ 2.35 , 3.45 , 0.63 , 4.3 ] ) ,
41+ ) {
4042 const disposeContext = vi . fn ( ) ;
4143 const disposeModel = vi . fn ( ) ;
4244 const disposeLlama = vi . fn ( ) ;
@@ -111,6 +113,26 @@ describe("local embedding provider", () => {
111113 await expect ( provider . embedBatch ( [ "test document" ] ) ) . resolves . toEqual ( [ [ 0.6 , 0.8 ] ] ) ;
112114 } ) ;
113115
116+ it ( "does not read local embedding coordinates past outputDimensionality" , async ( ) => {
117+ mockLocalEmbeddingRuntime ( {
118+ length : 3 ,
119+ 0 : 3 ,
120+ 1 : 4 ,
121+ get 2 ( ) : number {
122+ throw new Error ( "tail coordinate should not be read" ) ;
123+ } ,
124+ } ) ;
125+ const provider = await createLocalEmbeddingProviderInProcess ( {
126+ config : { } as never ,
127+ provider : "local" ,
128+ model : "" ,
129+ fallback : "none" ,
130+ outputDimensionality : 2 ,
131+ } ) ;
132+
133+ await expect ( provider . embedQuery ( "test query" ) ) . resolves . toEqual ( [ 0.6 , 0.8 ] ) ;
134+ } ) ;
135+
114136 it ( "passes default contextSize (4096) to createEmbeddingContext when not configured" , async ( ) => {
115137 const runtime = mockLocalEmbeddingRuntime ( ) ;
116138
0 commit comments