@memberjunction/search-engine 5.48.0 → 5.50.0
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/generic/EntitySearchProvider.d.ts +17 -3
- package/dist/generic/EntitySearchProvider.d.ts.map +1 -1
- package/dist/generic/EntitySearchProvider.js +23 -6
- package/dist/generic/EntitySearchProvider.js.map +1 -1
- package/dist/generic/ExternalHitMapper.d.ts +48 -0
- package/dist/generic/ExternalHitMapper.d.ts.map +1 -0
- package/dist/generic/ExternalHitMapper.js +88 -0
- package/dist/generic/ExternalHitMapper.js.map +1 -0
- package/dist/generic/FullTextSearchProvider.d.ts +9 -1
- package/dist/generic/FullTextSearchProvider.d.ts.map +1 -1
- package/dist/generic/FullTextSearchProvider.js +11 -3
- package/dist/generic/FullTextSearchProvider.js.map +1 -1
- package/dist/generic/ScopeDimensionResolver.d.ts +146 -0
- package/dist/generic/ScopeDimensionResolver.d.ts.map +1 -0
- package/dist/generic/ScopeDimensionResolver.js +464 -0
- package/dist/generic/ScopeDimensionResolver.js.map +1 -0
- package/dist/generic/ScopeExplanation.d.ts +141 -0
- package/dist/generic/ScopeExplanation.d.ts.map +1 -0
- package/dist/generic/ScopeExplanation.js +72 -0
- package/dist/generic/ScopeExplanation.js.map +1 -0
- package/dist/generic/ScopeFilterGuard.d.ts +127 -0
- package/dist/generic/ScopeFilterGuard.d.ts.map +1 -0
- package/dist/generic/ScopeFilterGuard.js +290 -0
- package/dist/generic/ScopeFilterGuard.js.map +1 -0
- package/dist/generic/ScopeTemplateRenderer.d.ts +12 -2
- package/dist/generic/ScopeTemplateRenderer.d.ts.map +1 -1
- package/dist/generic/ScopeTemplateRenderer.js +25 -5
- package/dist/generic/ScopeTemplateRenderer.js.map +1 -1
- package/dist/generic/ScopeValueEscaper.d.ts +112 -0
- package/dist/generic/ScopeValueEscaper.d.ts.map +1 -0
- package/dist/generic/ScopeValueEscaper.js +152 -0
- package/dist/generic/ScopeValueEscaper.js.map +1 -0
- package/dist/generic/SearchEngine.d.ts +188 -8
- package/dist/generic/SearchEngine.d.ts.map +1 -1
- package/dist/generic/SearchEngine.js +600 -35
- package/dist/generic/SearchEngine.js.map +1 -1
- package/dist/generic/VectorSearchProvider.d.ts +25 -1
- package/dist/generic/VectorSearchProvider.d.ts.map +1 -1
- package/dist/generic/VectorSearchProvider.js +81 -33
- package/dist/generic/VectorSearchProvider.js.map +1 -1
- package/dist/generic/search.types.d.ts +160 -0
- package/dist/generic/search.types.d.ts.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/permissions/SearchScopePermissionResolver.d.ts +37 -2
- package/dist/permissions/SearchScopePermissionResolver.d.ts.map +1 -1
- package/dist/permissions/SearchScopePermissionResolver.js +74 -2
- package/dist/permissions/SearchScopePermissionResolver.js.map +1 -1
- package/dist/providers/AzureAISearchProvider.d.ts.map +1 -1
- package/dist/providers/AzureAISearchProvider.js +24 -6
- package/dist/providers/AzureAISearchProvider.js.map +1 -1
- package/dist/providers/ElasticsearchSearchProvider.d.ts.map +1 -1
- package/dist/providers/ElasticsearchSearchProvider.js +17 -5
- package/dist/providers/ElasticsearchSearchProvider.js.map +1 -1
- package/dist/providers/OpenSearchSearchProvider.d.ts.map +1 -1
- package/dist/providers/OpenSearchSearchProvider.js +16 -5
- package/dist/providers/OpenSearchSearchProvider.js.map +1 -1
- package/dist/providers/TypesenseSearchProvider.d.ts.map +1 -1
- package/dist/providers/TypesenseSearchProvider.js +17 -6
- package/dist/providers/TypesenseSearchProvider.js.map +1 -1
- package/package.json +8 -8
|
@@ -102,6 +102,16 @@ export interface SearchParams {
|
|
|
102
102
|
* lookup separately via the resolver caller.
|
|
103
103
|
*/
|
|
104
104
|
AIAgentID?: string | null;
|
|
105
|
+
/**
|
|
106
|
+
* Optional ID of the AI Skill active for this search. Stamped onto the SearchExecutionLog
|
|
107
|
+
* row alongside `AIAgentID`.
|
|
108
|
+
*
|
|
109
|
+
* A skill is a search principal in its own right — activating one can reach a scope the
|
|
110
|
+
* user's own roles do not grant — so a log that records only the agent cannot reconstruct
|
|
111
|
+
* why a scope was reachable. Pass-through only: the engine does not resolve entitlement
|
|
112
|
+
* itself, the caller that selects scopes does.
|
|
113
|
+
*/
|
|
114
|
+
AISkillID?: string | null;
|
|
105
115
|
}
|
|
106
116
|
/**
|
|
107
117
|
* Runtime multi-tenant context that flows through every provider so a single
|
|
@@ -135,6 +145,156 @@ export interface SearchContext {
|
|
|
135
145
|
* `SearchContextConfig.dimensions[].inheritanceMode`, not on the runtime value.
|
|
136
146
|
*/
|
|
137
147
|
export type SecondaryScopeValue = string | number | boolean | string[];
|
|
148
|
+
/** Who may author a dimension's value at run time. */
|
|
149
|
+
export type ScopeDimensionTrust =
|
|
150
|
+
/** Accepted from the caller, then grammar-validated. Narrowing only. Default. */
|
|
151
|
+
'CallerSupplied'
|
|
152
|
+
/** Derived by the engine. Caller-supplied values for this key are DISCARDED. */
|
|
153
|
+
| 'ServerDerived';
|
|
154
|
+
/** Value grammar. The engine REJECTS a value that fails its declared grammar. */
|
|
155
|
+
export type ScopeDimensionValueType = 'uuid' | 'uuid[]' | 'enum' | 'int' | 'iso-date' | 'bool' | 'freetext';
|
|
156
|
+
/** Lattice used when a caller may only NARROW a server-derived dimension. */
|
|
157
|
+
export type ScopeDimensionValueDomain = 'scalar' | 'set' | 'opaque';
|
|
158
|
+
/** One declared dimension of a scope's Search Context. */
|
|
159
|
+
export interface ScopeSecondaryDimension {
|
|
160
|
+
/** Key as it appears in `SearchContext.SecondaryScopes`. */
|
|
161
|
+
name: string;
|
|
162
|
+
/**
|
|
163
|
+
* True when this dimension participates in the ACCESS BOUND. Acts as a profile:
|
|
164
|
+
* implies `trust: 'ServerDerived'`, fail-closed resolution, and forbids `freetext`.
|
|
165
|
+
*/
|
|
166
|
+
restricts?: boolean;
|
|
167
|
+
trust?: ScopeDimensionTrust;
|
|
168
|
+
valueType?: ScopeDimensionValueType;
|
|
169
|
+
/** Required when `valueType === 'enum'`. */
|
|
170
|
+
enumValues?: string[];
|
|
171
|
+
valueDomain?: ScopeDimensionValueDomain;
|
|
172
|
+
/**
|
|
173
|
+
* `MJ: Queries` row that derives this dimension's value. Run as the acting user, so its
|
|
174
|
+
* `MJ: Query Permissions` gate the derivation. Bound parameters: PrimaryScopeRecordID,
|
|
175
|
+
* UserID, AgentID.
|
|
176
|
+
*/
|
|
177
|
+
expansionQueryID?: string;
|
|
178
|
+
/** Names a ServerDerived dimension this one may only narrow (never widen). */
|
|
179
|
+
narrowingOf?: string;
|
|
180
|
+
required?: boolean;
|
|
181
|
+
defaultValue?: SecondaryScopeValue | null;
|
|
182
|
+
/**
|
|
183
|
+
* Required acknowledgment when a RESTRICTING dimension declares `inheritanceMode: 'cascading'`.
|
|
184
|
+
*
|
|
185
|
+
* `cascading` means "content that lacks this dimension applies to everyone" — permissive, and
|
|
186
|
+
* therefore the wrong posture for a boundary. It is occasionally what an author genuinely wants
|
|
187
|
+
* (untagged legacy content that should stay visible while it is being backfilled), so it is not
|
|
188
|
+
* forbidden — but it must be deliberate rather than a default someone inherited, and it must be
|
|
189
|
+
* greppable. Setting this to true is that acknowledgment; without it the scope refuses to load.
|
|
190
|
+
*/
|
|
191
|
+
acknowledgeCascadingOnBoundary?: boolean;
|
|
192
|
+
/**
|
|
193
|
+
* Marks this dimension as **advisory** (§5.12 supersession): it may only ever cause content to
|
|
194
|
+
* be REMOVED from an already-entitled set, never added.
|
|
195
|
+
*
|
|
196
|
+
* The consequence is a deliberately inverted failure posture. A boundary fails CLOSED — if it
|
|
197
|
+
* cannot be resolved the search is refused. An advisory dimension fails **SOFT** — if it cannot
|
|
198
|
+
* be resolved it is simply dropped and the search proceeds, because the worst case is that a
|
|
199
|
+
* superseded corpus stays in the results. Getting a boundary wrong leaks data; getting this
|
|
200
|
+
* wrong makes relevance worse.
|
|
201
|
+
*
|
|
202
|
+
* `advisory` and `restricts` are mutually exclusive; declaring both is a contradiction and is
|
|
203
|
+
* rejected at load.
|
|
204
|
+
*/
|
|
205
|
+
advisory?: boolean;
|
|
206
|
+
/**
|
|
207
|
+
* Ordered supersession rules — **first match wins**. Only meaningful on an `advisory` dimension.
|
|
208
|
+
*
|
|
209
|
+
* This is where "invoking skill A+B adds C and removes B" lives. The ordered logic derives a
|
|
210
|
+
* KEY from whichever dimension combination is active; the scope's filter then excludes whatever
|
|
211
|
+
* that key maps to, via a guarded `AND NOT EXISTS (…)` clause. The rules stay data rather than
|
|
212
|
+
* code, and because the clause can only subtract from an already-bounded set, a wrong rule
|
|
213
|
+
* degrades relevance instead of granting access — which is exactly why this needs none of the
|
|
214
|
+
* grammar, positive-assertion or fail-closed machinery a boundary requires.
|
|
215
|
+
*/
|
|
216
|
+
supersededByRules?: ScopeSupersessionRule[];
|
|
217
|
+
inheritanceMode?: 'cascading' | 'strict';
|
|
218
|
+
description?: string;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* One ordered supersession rule (§5.12).
|
|
222
|
+
*
|
|
223
|
+
* Fires when EVERY entry in `when` matches the already-resolved dimensions; publishes `key`.
|
|
224
|
+
* Matching is deliberately forgiving in one direction: a resolved value that is an ARRAY matches when
|
|
225
|
+
* it *contains* the expected value, so "the Exam Writer skill is among the active skills" is
|
|
226
|
+
* expressible without the author having to know whether the dimension is scalar or set. String
|
|
227
|
+
* comparison is case-insensitive because UUID casing is not consistent anywhere in MJ, and a rule
|
|
228
|
+
* that silently never fires because of letter case would be near-impossible to debug.
|
|
229
|
+
*/
|
|
230
|
+
export interface ScopeSupersessionRule {
|
|
231
|
+
/** Dimension name → value that must match. All entries must match for the rule to fire. */
|
|
232
|
+
when: Record<string, SecondaryScopeValue>;
|
|
233
|
+
/** The supersession key published when this rule fires. */
|
|
234
|
+
key: string;
|
|
235
|
+
/** Optional human-readable reason, surfaced in provenance so the decision explains itself. */
|
|
236
|
+
because?: string;
|
|
237
|
+
}
|
|
238
|
+
/** Parsed `SearchScope.SearchContextConfig`. A null/absent config leaves behavior unchanged. */
|
|
239
|
+
export interface ScopeSearchContextConfig {
|
|
240
|
+
dimensions: ScopeSecondaryDimension[];
|
|
241
|
+
defaultInheritanceMode?: 'cascading' | 'strict';
|
|
242
|
+
allowSecondaryOnly?: boolean;
|
|
243
|
+
/** When true, a caller key that is not declared REJECTS the search. */
|
|
244
|
+
strictValidation?: boolean;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Where a resolved dimension's value actually came from.
|
|
248
|
+
*
|
|
249
|
+
* This is the audit answer to "who decided this?", and it is the difference between a bound
|
|
250
|
+
* that carries an access decision and one that merely looks like it does. `CallerSupplied`
|
|
251
|
+
* means an outside party — possibly an LLM writing a tool call — chose the value; that is
|
|
252
|
+
* fine for a search refinement and unacceptable for an access bound. `ServerDerived` means
|
|
253
|
+
* the engine computed it and no caller could influence it. `DiscardedCaller` records an
|
|
254
|
+
* attempt that was thrown away, which is exactly the event a security review wants to find.
|
|
255
|
+
*/
|
|
256
|
+
export type DimensionProvenance =
|
|
257
|
+
/** Caller supplied it, the dimension trusts callers, and it passed grammar validation. */
|
|
258
|
+
'CallerSupplied'
|
|
259
|
+
/** The engine derived it (an approved expansion query); no caller input was used. */
|
|
260
|
+
| 'ServerDerived'
|
|
261
|
+
/** Nobody supplied it; the declaration's `defaultValue` filled in. */
|
|
262
|
+
| 'Default'
|
|
263
|
+
/** The caller supplied a value for a ServerDerived dimension and it was thrown away. */
|
|
264
|
+
| 'DiscardedCaller'
|
|
265
|
+
/** The caller narrowed within a server-derived bound and the meet survived. */
|
|
266
|
+
| 'Narrowed'
|
|
267
|
+
/** Declared but unresolved — not supplied, not derivable, not required. */
|
|
268
|
+
| 'Absent'
|
|
269
|
+
/** Produced by an ordered advisory rule (§5.12 supersession) rather than by a caller or a query. */
|
|
270
|
+
| 'RuleDerived';
|
|
271
|
+
/**
|
|
272
|
+
* Principals a dimension's expansion query may bind.
|
|
273
|
+
*
|
|
274
|
+
* Declared once and shared so the real search path and the `ExplainScope` dry run cannot drift:
|
|
275
|
+
* a preview computed from different principals than the search would use is worse than no
|
|
276
|
+
* preview, because it is confidently wrong.
|
|
277
|
+
*/
|
|
278
|
+
export interface ScopePrincipals {
|
|
279
|
+
AgentID?: string | null;
|
|
280
|
+
SkillID?: string | null;
|
|
281
|
+
}
|
|
282
|
+
/** One dimension's resolved value together with the provenance that makes it auditable. */
|
|
283
|
+
export interface DimensionExplanation {
|
|
284
|
+
Name: string;
|
|
285
|
+
/** The resolved value, or null when the dimension came out `Absent`. */
|
|
286
|
+
Value: SecondaryScopeValue | null;
|
|
287
|
+
Provenance: DimensionProvenance;
|
|
288
|
+
/** True when this dimension narrows what the search may reach (an access bound). */
|
|
289
|
+
Restricts: boolean;
|
|
290
|
+
/**
|
|
291
|
+
* The inheritance mode actually ENFORCED, after defaulting. A restricting dimension with no
|
|
292
|
+
* explicit mode resolves to `strict`; a non-restricting one to `cascading`.
|
|
293
|
+
*/
|
|
294
|
+
InheritanceMode?: 'cascading' | 'strict';
|
|
295
|
+
/** Extra human-readable detail — what was discarded, which query derived it, and so on. */
|
|
296
|
+
Note?: string;
|
|
297
|
+
}
|
|
138
298
|
/**
|
|
139
299
|
* Per-provider fusion weights. Keys are the `SearchSource` values.
|
|
140
300
|
* Weights > 1 amplify a provider's contribution; weights < 1 dampen it.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.types.d.ts","sourceRoot":"","sources":["../../src/generic/search.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;AAExE;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC;AAEjF;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,4BAA4B;IAC5B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IACzB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yCAAyC;IACzC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,uBAAuB,CAAC;IAChD;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,aAAa;IAC1B,yGAAyG;IACzG,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,6DAA6D;IAC7D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,8FAA8F;IAC9F,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CACzD;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"search.types.d.ts","sourceRoot":"","sources":["../../src/generic/search.types.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,6 +10,10 @@ export * from './generic/SearchEngine.js';
|
|
|
10
10
|
export * from './generic/BaseReRanker.js';
|
|
11
11
|
export * from './generic/NoopReRanker.js';
|
|
12
12
|
export * from './generic/ScopeTemplateRenderer.js';
|
|
13
|
+
export * from './generic/ScopeFilterGuard.js';
|
|
14
|
+
export * from './generic/ScopeValueEscaper.js';
|
|
15
|
+
export * from './generic/ScopeDimensionResolver.js';
|
|
16
|
+
export * from './generic/ScopeExplanation.js';
|
|
13
17
|
export * from './permissions/SearchScopePermissionResolver.js';
|
|
14
18
|
export * from './rerankers/CohereReRanker.js';
|
|
15
19
|
export * from './rerankers/VoyageReRanker.js';
|
|
@@ -20,4 +24,5 @@ export * from './providers/ElasticsearchSearchProvider.js';
|
|
|
20
24
|
export * from './providers/TypesenseSearchProvider.js';
|
|
21
25
|
export * from './providers/AzureAISearchProvider.js';
|
|
22
26
|
export * from './providers/OpenSearchSearchProvider.js';
|
|
27
|
+
export * from './generic/ExternalHitMapper.js';
|
|
23
28
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAChD,cAAc,6CAA6C,CAAC;AAI5D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAKhD,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6CAA6C,CAAC;AAI5D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAKhD,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,6BAA6B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -10,6 +10,10 @@ export * from './generic/SearchEngine.js';
|
|
|
10
10
|
export * from './generic/BaseReRanker.js';
|
|
11
11
|
export * from './generic/NoopReRanker.js';
|
|
12
12
|
export * from './generic/ScopeTemplateRenderer.js';
|
|
13
|
+
export * from './generic/ScopeFilterGuard.js';
|
|
14
|
+
export * from './generic/ScopeValueEscaper.js';
|
|
15
|
+
export * from './generic/ScopeDimensionResolver.js';
|
|
16
|
+
export * from './generic/ScopeExplanation.js';
|
|
13
17
|
export * from './permissions/SearchScopePermissionResolver.js';
|
|
14
18
|
// Phase 2D real rerankers — exported here so consumers' module evaluation runs the
|
|
15
19
|
// `@RegisterClass` decorators and ClassFactory can resolve them by DriverClass at runtime.
|
|
@@ -25,4 +29,5 @@ export * from './providers/ElasticsearchSearchProvider.js';
|
|
|
25
29
|
export * from './providers/TypesenseSearchProvider.js';
|
|
26
30
|
export * from './providers/AzureAISearchProvider.js';
|
|
27
31
|
export * from './providers/OpenSearchSearchProvider.js';
|
|
32
|
+
export * from './generic/ExternalHitMapper.js';
|
|
28
33
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAChD,cAAc,6CAA6C,CAAC;AAE5D,mFAAmF;AACnF,2FAA2F;AAC3F,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAEhD,kFAAkF;AAClF,kFAAkF;AAClF,sEAAsE;AACtE,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,iCAAiC,CAAC;AAChD,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAChD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6CAA6C,CAAC;AAE5D,mFAAmF;AACnF,2FAA2F;AAC3F,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,iCAAiC,CAAC;AAEhD,kFAAkF;AAClF,kFAAkF;AAClF,sEAAsE;AACtE,cAAc,yCAAyC,CAAC;AACxD,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,6BAA6B,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { UserInfo } from '@memberjunction/core';
|
|
2
|
-
import type { MJSearchScopePermissionEntity, MJAIAgentEntity } from '@memberjunction/core-entities';
|
|
2
|
+
import type { MJSearchScopePermissionEntity, MJAIAgentEntity, MJAISkillEntity } from '@memberjunction/core-entities';
|
|
3
3
|
/**
|
|
4
4
|
* Permission level granted on a SearchScope. None is an explicit deny that
|
|
5
5
|
* overrides role grants for that scope/principal pair. The resolver collapses
|
|
@@ -10,7 +10,7 @@ export type SearchScopePermissionLevel = 'None' | 'Read' | 'Search' | 'Manage';
|
|
|
10
10
|
* Where the resolver picked up the effective permission. Used for audit
|
|
11
11
|
* logging and explanatory error messages.
|
|
12
12
|
*/
|
|
13
|
-
export type SearchScopePermissionSource = 'DirectGrant' | 'RoleGrant' | 'AgentUnscopedAll' | 'AgentNone' | 'AgentAssignedNotListed' | 'NoGrant';
|
|
13
|
+
export type SearchScopePermissionSource = 'DirectGrant' | 'RoleGrant' | 'AgentUnscopedAll' | 'AgentNone' | 'AgentAssignedNotListed' | 'SkillUnscopedAll' | 'SkillNone' | 'SkillAssignedNotListed' | 'NoGrant';
|
|
14
14
|
export interface EffectivePermission {
|
|
15
15
|
/** True when the principal can at least read the scope's metadata. */
|
|
16
16
|
readonly Allowed: boolean;
|
|
@@ -51,6 +51,19 @@ export interface ResolvePermissionInput {
|
|
|
51
51
|
* fallback paths.
|
|
52
52
|
*/
|
|
53
53
|
Agent: MJAIAgentEntity | null;
|
|
54
|
+
/**
|
|
55
|
+
* The skill on whose behalf the search runs, or null. A skill is a PRINCIPAL in exactly the
|
|
56
|
+
* same sense an agent is: `AISkill.SearchScopeAccess` plus `MJ: AI Skill Search Scopes` rows
|
|
57
|
+
* let activating a skill reach a scope the user's own roles do not grant. Optional so every
|
|
58
|
+
* existing caller compiles and behaves unchanged.
|
|
59
|
+
*/
|
|
60
|
+
Skill?: MJAISkillEntity | null;
|
|
61
|
+
/**
|
|
62
|
+
* Tenant this search is running for (`SearchContext.PrimaryScopeRecordID`). When supplied, a
|
|
63
|
+
* grant that carries its own `PrimaryScopeRecordID` applies only to that tenant. Grants with a
|
|
64
|
+
* NULL tenant continue to apply everywhere, so existing rows are unaffected.
|
|
65
|
+
*/
|
|
66
|
+
PrimaryScopeRecordID?: string | null;
|
|
54
67
|
/**
|
|
55
68
|
* Optional ContextUser for RunView calls. Server-side code must always
|
|
56
69
|
* pass this to enforce data isolation; it is the same UserInfo as `User`
|
|
@@ -89,6 +102,28 @@ export declare class SearchScopePermissionResolver {
|
|
|
89
102
|
* UUIDsEqual to remain case-insensitive across SQL Server / PostgreSQL.
|
|
90
103
|
*/
|
|
91
104
|
ResolveEffectivePermission(input: ResolvePermissionInput): Promise<EffectivePermission>;
|
|
105
|
+
/**
|
|
106
|
+
* Keep only grants that are in force at this moment and apply to this tenant.
|
|
107
|
+
*
|
|
108
|
+
* Both dimensions are additive: a row that leaves `StartAt`/`EndAt`/`PrimaryScopeRecordID`
|
|
109
|
+
* NULL is always in force and applies to every tenant, which is exactly how every row
|
|
110
|
+
* behaved before those columns existed.
|
|
111
|
+
*/
|
|
112
|
+
protected applicableGrants(rows: MJSearchScopePermissionEntity[], primaryScopeRecordID: string | null, now?: Date): MJSearchScopePermissionEntity[];
|
|
113
|
+
/** A grant with no window is always in force; otherwise `now` must fall inside it. */
|
|
114
|
+
protected isGrantInWindow(row: MJSearchScopePermissionEntity, now: Date): boolean;
|
|
115
|
+
/**
|
|
116
|
+
* A grant with a NULL tenant applies everywhere. A tenant-scoped grant applies ONLY to that
|
|
117
|
+
* tenant — and, notably, does not apply when the search supplies no tenant at all, because
|
|
118
|
+
* "this grant is for org A" cannot be honoured by an untenanted search.
|
|
119
|
+
*/
|
|
120
|
+
protected isGrantForTenant(row: MJSearchScopePermissionEntity, primaryScopeRecordID: string | null): boolean;
|
|
121
|
+
/**
|
|
122
|
+
* Whether the scope is in the skill's assigned-scope list via `__mj.AISkillSearchScope`.
|
|
123
|
+
* Mirrors `isScopeAssignedToAgent`, including honouring Status and the optional time window
|
|
124
|
+
* (which the agent table also has). Fails closed on an unreadable table.
|
|
125
|
+
*/
|
|
126
|
+
protected isScopeAssignedToSkill(skillID: string, searchScopeID: string, contextUser: UserInfo): Promise<boolean>;
|
|
92
127
|
/**
|
|
93
128
|
* Checks whether the given scope is in the agent's assigned-scope list
|
|
94
129
|
* via __mj.AIAgentSearchScope. Used to enforce the SearchScopeAccess='Assigned'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchScopePermissionResolver.d.ts","sourceRoot":"","sources":["../../src/permissions/SearchScopePermissionResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,KAAK,EAAE,6BAA6B,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"SearchScopePermissionResolver.d.ts","sourceRoot":"","sources":["../../src/permissions/SearchScopePermissionResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,KAAK,EAAE,6BAA6B,EAAE,eAAe,EAAE,eAAe,EAA8B,MAAM,+BAA+B,CAAC;AAEjJ;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE/E;;;GAGG;AACH,MAAM,MAAM,2BAA2B,GACjC,aAAa,GACb,WAAW,GACX,kBAAkB,GAClB,WAAW,GACX,wBAAwB,GACxB,kBAAkB,GAClB,WAAW,GACX,wBAAwB,GACxB,SAAS,CAAC;AAEhB,MAAM,WAAW,mBAAmB;IAChC,sEAAsE;IACtE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,KAAK,EAAE,0BAA0B,CAAC;IAC3C,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,2BAA2B,CAAC;IAC7C,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;;;;;;OAQG;IACH,cAAc,IAAI,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACnC;;;;OAIG;IACH,IAAI,EAAE,QAAQ,CAAC;IACf,wCAAwC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC;;;;OAIG;IACH,WAAW,CAAC,EAAE,QAAQ,CAAC;CAC1B;AAmBD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,6BAA6B;IACtC;;;OAGG;IACU,0BAA0B,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA6FpG;;;;;;OAMG;IACH,SAAS,CAAC,gBAAgB,CACtB,IAAI,EAAE,6BAA6B,EAAE,EACrC,oBAAoB,EAAE,MAAM,GAAG,IAAI,EACnC,GAAG,GAAE,IAAiB,GACvB,6BAA6B,EAAE;IAIlC,sFAAsF;IACtF,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,6BAA6B,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO;IAMjF;;;;OAIG;IACH,SAAS,CAAC,gBAAgB,CAAC,GAAG,EAAE,6BAA6B,EAAE,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO;IAM5G;;;;OAIG;cACa,sBAAsB,CAClC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,OAAO,CAAC;IAmBnB;;;;;OAKG;cACa,sBAAsB,CAClC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,OAAO,CAAC;IAmBnB;;;;OAIG;cACa,uBAAuB,CACnC,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,QAAQ,GACtB,OAAO,CAAC,6BAA6B,EAAE,CAAC;IAqB3C,8EAA8E;IAC9E,OAAO,CAAC,WAAW;CActB;AAID,eAAO,MAAM,oCAAoC,+BAAsC,CAAC"}
|
|
@@ -47,6 +47,7 @@ export class SearchScopePermissionResolver {
|
|
|
47
47
|
*/
|
|
48
48
|
async ResolveEffectivePermission(input) {
|
|
49
49
|
const { User, SearchScopeID, Agent } = input;
|
|
50
|
+
const Skill = input.Skill ?? null;
|
|
50
51
|
const contextUser = input.ContextUser ?? User;
|
|
51
52
|
// Step 1: agent-side explicit deny short-circuits everything.
|
|
52
53
|
if (Agent && Agent.SearchScopeAccess === 'None') {
|
|
@@ -64,10 +65,26 @@ export class SearchScopePermissionResolver {
|
|
|
64
65
|
// Falls through to user/role checks; Assigned restricts but does
|
|
65
66
|
// not grant — the user must still have a per-scope grant.
|
|
66
67
|
}
|
|
68
|
+
// Step 1c/1d: the SAME two rules for a SKILL principal. Deliberately identical in shape
|
|
69
|
+
// to the agent rules above so the two principals stay interchangeable — a reader who
|
|
70
|
+
// understands the agent path already understands this one.
|
|
71
|
+
if (Skill && Skill.SearchScopeAccess === 'None') {
|
|
72
|
+
return this.buildResult(false, 'None', 'SkillNone', `Skill '${Skill.Name}' has SearchScopeAccess='None'; refused without consulting per-scope grants.`);
|
|
73
|
+
}
|
|
74
|
+
if (Skill && Skill.SearchScopeAccess === 'Assigned') {
|
|
75
|
+
const isListed = await this.isScopeAssignedToSkill(Skill.ID, SearchScopeID, contextUser);
|
|
76
|
+
if (!isListed) {
|
|
77
|
+
return this.buildResult(false, 'None', 'SkillAssignedNotListed', `Skill '${Skill.Name}' has SearchScopeAccess='Assigned' and this scope is not in its assigned scope list; refused with ACCESS_DENIED.`);
|
|
78
|
+
}
|
|
79
|
+
// Restricts but does not grant — the user still needs a per-scope grant below.
|
|
80
|
+
}
|
|
67
81
|
// Load all SearchScopePermission rows for this scope. We pull the
|
|
68
82
|
// whole set (typically small per scope) and filter in JS so we can
|
|
69
83
|
// apply the user-direct-None short-circuit deterministically.
|
|
70
|
-
const
|
|
84
|
+
const allRows = await this.loadPermissionsForScope(SearchScopeID, contextUser);
|
|
85
|
+
// Narrow to grants that are in force RIGHT NOW and apply to THIS tenant. Both filters
|
|
86
|
+
// are no-ops for a row that leaves the new columns NULL, which is every pre-existing row.
|
|
87
|
+
const rows = this.applicableGrants(allRows, input.PrimaryScopeRecordID ?? null);
|
|
71
88
|
// Step 2: direct grant for this user (highest priority).
|
|
72
89
|
const userGrants = rows.filter(r => r.UserID && UUIDsEqual(r.UserID, User.ID));
|
|
73
90
|
if (userGrants.length > 0) {
|
|
@@ -92,8 +109,63 @@ export class SearchScopePermissionResolver {
|
|
|
92
109
|
if (Agent && Agent.SearchScopeAccess === 'All') {
|
|
93
110
|
return this.buildResult(true, 'Search', 'AgentUnscopedAll', `Agent '${Agent.Name}' has SearchScopeAccess='All'; granting 'Search' as a fallback for this scope.`);
|
|
94
111
|
}
|
|
112
|
+
// Step 4b: skill fallback, mirroring the agent's 'All'.
|
|
113
|
+
if (Skill && Skill.SearchScopeAccess === 'All') {
|
|
114
|
+
return this.buildResult(true, 'Search', 'SkillUnscopedAll', `Skill '${Skill.Name}' has SearchScopeAccess='All'; granting 'Search' as a fallback for this scope.`);
|
|
115
|
+
}
|
|
95
116
|
// Step 5: no grant.
|
|
96
|
-
return this.buildResult(false, 'None', 'NoGrant', `User '${User.Name}' has no direct grant, no qualifying role grant, and no agent-side fallback for this scope.`);
|
|
117
|
+
return this.buildResult(false, 'None', 'NoGrant', `User '${User.Name}' has no direct grant, no qualifying role grant, and no agent- or skill-side fallback for this scope.`);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Keep only grants that are in force at this moment and apply to this tenant.
|
|
121
|
+
*
|
|
122
|
+
* Both dimensions are additive: a row that leaves `StartAt`/`EndAt`/`PrimaryScopeRecordID`
|
|
123
|
+
* NULL is always in force and applies to every tenant, which is exactly how every row
|
|
124
|
+
* behaved before those columns existed.
|
|
125
|
+
*/
|
|
126
|
+
applicableGrants(rows, primaryScopeRecordID, now = new Date()) {
|
|
127
|
+
return rows.filter((r) => this.isGrantInWindow(r, now) && this.isGrantForTenant(r, primaryScopeRecordID));
|
|
128
|
+
}
|
|
129
|
+
/** A grant with no window is always in force; otherwise `now` must fall inside it. */
|
|
130
|
+
isGrantInWindow(row, now) {
|
|
131
|
+
if (row.StartAt && new Date(row.StartAt) > now)
|
|
132
|
+
return false;
|
|
133
|
+
if (row.EndAt && new Date(row.EndAt) < now)
|
|
134
|
+
return false;
|
|
135
|
+
return true;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* A grant with a NULL tenant applies everywhere. A tenant-scoped grant applies ONLY to that
|
|
139
|
+
* tenant — and, notably, does not apply when the search supplies no tenant at all, because
|
|
140
|
+
* "this grant is for org A" cannot be honoured by an untenanted search.
|
|
141
|
+
*/
|
|
142
|
+
isGrantForTenant(row, primaryScopeRecordID) {
|
|
143
|
+
if (!row.PrimaryScopeRecordID)
|
|
144
|
+
return true;
|
|
145
|
+
if (!primaryScopeRecordID)
|
|
146
|
+
return false;
|
|
147
|
+
return UUIDsEqual(row.PrimaryScopeRecordID, primaryScopeRecordID);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Whether the scope is in the skill's assigned-scope list via `__mj.AISkillSearchScope`.
|
|
151
|
+
* Mirrors `isScopeAssignedToAgent`, including honouring Status and the optional time window
|
|
152
|
+
* (which the agent table also has). Fails closed on an unreadable table.
|
|
153
|
+
*/
|
|
154
|
+
async isScopeAssignedToSkill(skillID, searchScopeID, contextUser) {
|
|
155
|
+
const rv = new RunView();
|
|
156
|
+
const result = await rv.RunView({
|
|
157
|
+
EntityName: 'MJ: AI Skill Search Scopes',
|
|
158
|
+
ExtraFilter: `SkillID='${skillID}' AND SearchScopeID='${searchScopeID}' AND Status='Active'`,
|
|
159
|
+
ResultType: 'simple',
|
|
160
|
+
// Same reasoning as loadPermissionsForScope: a permission decision must never read
|
|
161
|
+
// a stale cache.
|
|
162
|
+
BypassCache: true,
|
|
163
|
+
}, contextUser);
|
|
164
|
+
if (!result.Success) {
|
|
165
|
+
throw new Error(`SearchScopePermissionResolver: failed to check skill scope assignment for skill ${skillID}: ${result.ErrorMessage}`);
|
|
166
|
+
}
|
|
167
|
+
const now = new Date();
|
|
168
|
+
return (result.Results ?? []).some((r) => (!r.StartAt || new Date(r.StartAt) <= now) && (!r.EndAt || new Date(r.EndAt) >= now));
|
|
97
169
|
}
|
|
98
170
|
/**
|
|
99
171
|
* Checks whether the given scope is in the agent's assigned-scope list
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchScopePermissionResolver.js","sourceRoot":"","sources":["../../src/permissions/SearchScopePermissionResolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,OAAO,EAAY,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"SearchScopePermissionResolver.js","sourceRoot":"","sources":["../../src/permissions/SearchScopePermissionResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AzureAISearchProvider.d.ts","sourceRoot":"","sources":["../../src/providers/AzureAISearchProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"AzureAISearchProvider.d.ts","sourceRoot":"","sources":["../../src/providers/AzureAISearchProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAY,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEtF,OAAO,EACH,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EACnB,MAAM,yBAAyB,CAAC;AAqBjC,qBACa,qBAAsB,SAAQ,kBAAkB;IACzD,SAAgB,UAAU,EAAE,YAAY,CAAc;IAEtD,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,SAAS,CAAS;IAEJ,UAAU,CAAC,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAS9E,iBAAiB,CAAC,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB9D,WAAW,IAAI,OAAO;IAIzB,MAAM,CACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,YAAY,EAAE,QAAQ,EACtB,gBAAgB,CAAC,EAAE,gBAAgB,GACpC,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAwG9B,wEAAwE;IACxE,OAAO,CAAC,eAAe;CAS1B;AAED,oCAAoC;AACpC,wBAAgB,yBAAyB,IAAI,IAAI,CAGhD"}
|
|
@@ -27,6 +27,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
27
27
|
import { LogError } from '@memberjunction/core';
|
|
28
28
|
import { RegisterClass } from '@memberjunction/global';
|
|
29
29
|
import { BaseSearchProvider } from '../generic/ISearchProvider.js';
|
|
30
|
+
import { CheckScopeStringFilter } from '../generic/ScopeFilterGuard.js';
|
|
31
|
+
import { ExtractChunkProvenance, HasChunkProvenance, ResolveHitID, ResolveHitSnippet, ResolveHitTitle } from '../generic/ExternalHitMapper.js';
|
|
30
32
|
let AzureAISearchProvider = class AzureAISearchProvider extends BaseSearchProvider {
|
|
31
33
|
constructor() {
|
|
32
34
|
super(...arguments);
|
|
@@ -103,8 +105,18 @@ let AzureAISearchProvider = class AzureAISearchProvider extends BaseSearchProvid
|
|
|
103
105
|
if (this.parsedConfig?.defaultSearchFields) {
|
|
104
106
|
body.searchFields = this.parsedConfig.defaultSearchFields;
|
|
105
107
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
+
// Permission / tenant push-down for this lane lives ENTIRELY in the scope's
|
|
109
|
+
// MetadataFilter (see the file header), so if one was authored but cannot be
|
|
110
|
+
// applied we must NOT query — an unfiltered Azure request would read the whole
|
|
111
|
+
// index. Fail this index closed instead.
|
|
112
|
+
const filterCheck = CheckScopeStringFilter(idx.MetadataFilter);
|
|
113
|
+
if (filterCheck.Status === 'unusable') {
|
|
114
|
+
LogError(`AzureAISearchProvider: skipping index "${idx.ExternalIndexName}" — its scope MetadataFilter cannot be applied (${filterCheck.Reason}). ` +
|
|
115
|
+
`The index is NOT queried, because this lane's tenant/permission push-down lives entirely in that filter.`);
|
|
116
|
+
return { index: idx.ExternalIndexName, hits: [] };
|
|
117
|
+
}
|
|
118
|
+
if (filterCheck.Status === 'usable') {
|
|
119
|
+
body.filter = filterCheck.Value;
|
|
108
120
|
}
|
|
109
121
|
try {
|
|
110
122
|
const response = await fetch(url, {
|
|
@@ -135,9 +147,10 @@ let AzureAISearchProvider = class AzureAISearchProvider extends BaseSearchProvid
|
|
|
135
147
|
.sort((a, b) => b.hit['@search.score'] - a.hit['@search.score'])
|
|
136
148
|
.slice(0, topK)
|
|
137
149
|
.map((m) => {
|
|
138
|
-
const id =
|
|
139
|
-
const title =
|
|
140
|
-
const snippet =
|
|
150
|
+
const id = ResolveHitID(m.hit, '');
|
|
151
|
+
const title = ResolveHitTitle(m.hit, id);
|
|
152
|
+
const snippet = ResolveHitSnippet(m.hit);
|
|
153
|
+
const provenance = ExtractChunkProvenance(m.hit);
|
|
141
154
|
const normalized = m.hit['@search.score'] / topScore;
|
|
142
155
|
return {
|
|
143
156
|
ID: `azs-${m.index}-${id}`,
|
|
@@ -153,7 +166,12 @@ let AzureAISearchProvider = class AzureAISearchProvider extends BaseSearchProvid
|
|
|
153
166
|
MatchedAt: new Date(),
|
|
154
167
|
EntityIcon: 'fa-solid fa-cloud',
|
|
155
168
|
RecordName: title.slice(0, 200),
|
|
156
|
-
RawMetadata: JSON.stringify({
|
|
169
|
+
RawMetadata: JSON.stringify({
|
|
170
|
+
index: m.index,
|
|
171
|
+
id,
|
|
172
|
+
_rawScore: m.hit['@search.score'],
|
|
173
|
+
...(HasChunkProvenance(provenance) ? { chunk: provenance } : {}),
|
|
174
|
+
}),
|
|
157
175
|
};
|
|
158
176
|
});
|
|
159
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AzureAISearchProvider.js","sourceRoot":"","sources":["../../src/providers/AzureAISearchProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;;;;;AAEH,OAAO,EAAE,QAAQ,EAAY,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAwB,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"AzureAISearchProvider.js","sourceRoot":"","sources":["../../src/providers/AzureAISearchProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ElasticsearchSearchProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ElasticsearchSearchProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAuB,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"ElasticsearchSearchProvider.d.ts","sourceRoot":"","sources":["../../src/providers/ElasticsearchSearchProvider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAuB,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAErE,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEtF,OAAO,EACH,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EACnB,MAAM,yBAAyB,CAAC;AA+DjC,qBACa,2BAA4B,SAAQ,kBAAkB;IAC/D,SAAgB,UAAU,EAAE,YAAY,CAAc;IAEtD,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAA4C;IAE1C,UAAU,CAAC,MAAM,EAAE,oBAAoB,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B9E,iBAAiB,CAAC,YAAY,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAe9D,WAAW,IAAI,OAAO;IAIzB,MAAM,CACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,GAAG,SAAS,EACnC,YAAY,EAAE,QAAQ,EACtB,gBAAgB,CAAC,EAAE,gBAAgB,GACpC,OAAO,CAAC,gBAAgB,EAAE,CAAC;CA6FjC;AAED,oCAAoC;AACpC,wBAAgB,+BAA+B,IAAI,IAAI,CAGtD;AAED,mFAAmF;AACnF,wBAAgB,wCAAwC,IAAI,IAAI,CAE/D"}
|
|
@@ -32,6 +32,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
32
32
|
import { LogError } from '@memberjunction/core';
|
|
33
33
|
import { RegisterClass } from '@memberjunction/global';
|
|
34
34
|
import { BaseSearchProvider } from '../generic/ISearchProvider.js';
|
|
35
|
+
import { CheckScopeObjectFilter } from '../generic/ScopeFilterGuard.js';
|
|
36
|
+
import { ExtractChunkProvenance, HasChunkProvenance, ResolveHitSnippet, ResolveHitTitle } from '../generic/ExternalHitMapper.js';
|
|
35
37
|
/**
|
|
36
38
|
* Lazy-loader for the Elasticsearch SDK. Memoized so the dynamic import cost is
|
|
37
39
|
* paid once per process even when many SearchProvider records reference the
|
|
@@ -132,8 +134,17 @@ let ElasticsearchSearchProvider = class ElasticsearchSearchProvider extends Base
|
|
|
132
134
|
for (const idx of scopeConstraints?.ExternalIndexes ?? []) {
|
|
133
135
|
if (idx.IndexType !== 'Elasticsearch')
|
|
134
136
|
continue;
|
|
135
|
-
|
|
136
|
-
|
|
137
|
+
const filterCheck = CheckScopeObjectFilter(idx.MetadataFilter);
|
|
138
|
+
if (filterCheck.Status === 'unusable') {
|
|
139
|
+
// All target indexes share ONE request here, so an inapplicable filter would
|
|
140
|
+
// under-filter the entire lane. Fail the lane closed rather than pushing down
|
|
141
|
+
// less restriction than the scope author declared.
|
|
142
|
+
LogError(`ElasticsearchSearchProvider: aborting search — index "${idx.ExternalIndexName}" has a scope MetadataFilter that cannot be applied (${filterCheck.Reason}). ` +
|
|
143
|
+
`No query is issued, because this lane composes one request across indexes and would otherwise run under-filtered.`);
|
|
144
|
+
return [];
|
|
145
|
+
}
|
|
146
|
+
if (filterCheck.Status === 'usable') {
|
|
147
|
+
filterClauses.push(filterCheck.Value);
|
|
137
148
|
}
|
|
138
149
|
}
|
|
139
150
|
const queryBody = {
|
|
@@ -157,8 +168,9 @@ let ElasticsearchSearchProvider = class ElasticsearchSearchProvider extends Base
|
|
|
157
168
|
const topScore = Math.max(1, hits[0]?._score ?? 1);
|
|
158
169
|
return hits.map((hit, idx) => {
|
|
159
170
|
const src = hit._source ?? {};
|
|
160
|
-
const title = src
|
|
161
|
-
const snippet = src
|
|
171
|
+
const title = ResolveHitTitle(src, hit._id, defaultField);
|
|
172
|
+
const snippet = ResolveHitSnippet(src, defaultField);
|
|
173
|
+
const provenance = ExtractChunkProvenance(src);
|
|
162
174
|
return {
|
|
163
175
|
ID: `es-${hit._index}-${hit._id}`,
|
|
164
176
|
EntityName: hit._index,
|
|
@@ -173,7 +185,7 @@ let ElasticsearchSearchProvider = class ElasticsearchSearchProvider extends Base
|
|
|
173
185
|
MatchedAt: new Date(),
|
|
174
186
|
EntityIcon: 'fa-solid fa-database',
|
|
175
187
|
RecordName: title.slice(0, 200),
|
|
176
|
-
RawMetadata: JSON.stringify({ _index: hit._index, _id: hit._id, _rank: idx, _rawScore: hit._score }),
|
|
188
|
+
RawMetadata: JSON.stringify({ _index: hit._index, _id: hit._id, _rank: idx, _rawScore: hit._score, ...(HasChunkProvenance(provenance) ? { chunk: provenance } : {}) }),
|
|
177
189
|
};
|
|
178
190
|
});
|
|
179
191
|
}
|