@memberjunction/server 5.24.0 → 5.25.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/agents/skip-sdk.d.ts +12 -0
- package/dist/agents/skip-sdk.d.ts.map +1 -1
- package/dist/agents/skip-sdk.js +70 -1
- package/dist/agents/skip-sdk.js.map +1 -1
- package/dist/generated/generated.d.ts +492 -0
- package/dist/generated/generated.d.ts.map +1 -1
- package/dist/generated/generated.js +2731 -0
- package/dist/generated/generated.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/resolvers/ArtifactFileResolver.d.ts +15 -0
- package/dist/resolvers/ArtifactFileResolver.d.ts.map +1 -0
- package/dist/resolvers/ArtifactFileResolver.js +74 -0
- package/dist/resolvers/ArtifactFileResolver.js.map +1 -0
- package/dist/resolvers/AutotagPipelineResolver.d.ts +13 -0
- package/dist/resolvers/AutotagPipelineResolver.d.ts.map +1 -1
- package/dist/resolvers/AutotagPipelineResolver.js +103 -3
- package/dist/resolvers/AutotagPipelineResolver.js.map +1 -1
- package/dist/resolvers/FileResolver.d.ts.map +1 -1
- package/dist/resolvers/FileResolver.js +12 -32
- package/dist/resolvers/FileResolver.js.map +1 -1
- package/dist/resolvers/GeoResolver.d.ts +58 -0
- package/dist/resolvers/GeoResolver.d.ts.map +1 -0
- package/dist/resolvers/GeoResolver.js +302 -0
- package/dist/resolvers/GeoResolver.js.map +1 -0
- package/dist/resolvers/RunAIAgentResolver.d.ts +13 -1
- package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
- package/dist/resolvers/RunAIAgentResolver.js +115 -20
- package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
- package/dist/resolvers/SearchKnowledgeResolver.d.ts +21 -80
- package/dist/resolvers/SearchKnowledgeResolver.d.ts.map +1 -1
- package/dist/resolvers/SearchKnowledgeResolver.js +129 -604
- package/dist/resolvers/SearchKnowledgeResolver.js.map +1 -1
- package/dist/resolvers/SearchKnowledgeSystemUserResolver.d.ts +19 -0
- package/dist/resolvers/SearchKnowledgeSystemUserResolver.d.ts.map +1 -0
- package/dist/resolvers/SearchKnowledgeSystemUserResolver.js +149 -0
- package/dist/resolvers/SearchKnowledgeSystemUserResolver.js.map +1 -0
- package/package.json +63 -63
- package/src/__tests__/search-knowledge-tags.test.ts +177 -337
- package/src/__tests__/skip-sdk-organic-keys.test.ts +274 -0
- package/src/agents/skip-sdk.ts +83 -2
- package/src/generated/generated.ts +1884 -1
- package/src/index.ts +2 -0
- package/src/resolvers/ArtifactFileResolver.ts +71 -0
- package/src/resolvers/AutotagPipelineResolver.ts +118 -4
- package/src/resolvers/FileResolver.ts +12 -41
- package/src/resolvers/GeoResolver.ts +258 -0
- package/src/resolvers/RunAIAgentResolver.ts +137 -23
- package/src/resolvers/SearchKnowledgeResolver.ts +114 -715
- package/src/resolvers/SearchKnowledgeSystemUserResolver.ts +138 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { Resolver, Mutation, Arg, Ctx, Float } from 'type-graphql';
|
|
2
|
+
import { AppContext } from '../types.js';
|
|
3
|
+
import { LogError } from '@memberjunction/core';
|
|
4
|
+
import { ResolverBase } from '../generic/ResolverBase.js';
|
|
5
|
+
import { RequireSystemUser } from '../directives/RequireSystemUser.js';
|
|
6
|
+
import { SearchEngine, SearchResult as SearchEngineResult, SearchResultItem as SearchEngineResultItem, SearchProviderInfo } from '@memberjunction/search-engine';
|
|
7
|
+
import {
|
|
8
|
+
SearchKnowledgeResult,
|
|
9
|
+
SearchKnowledgeResultItem,
|
|
10
|
+
SearchScoreBreakdown,
|
|
11
|
+
SearchFiltersInput
|
|
12
|
+
} from './SearchKnowledgeResolver.js';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* System-user-only resolver for search operations. Mirrors {@link SearchKnowledgeResolver}
|
|
16
|
+
* but is gated by the `@RequireSystemUser` directive so that server-to-server callers
|
|
17
|
+
* (e.g. Skip-Brain's `RemoteMJUtilities`) can invoke search without a user JWT.
|
|
18
|
+
*
|
|
19
|
+
* Both mutations delegate directly to `SearchEngine.Instance` — the same singleton
|
|
20
|
+
* the user-context resolver uses — so behavior, scoring, and permission filtering
|
|
21
|
+
* are identical.
|
|
22
|
+
*/
|
|
23
|
+
@Resolver()
|
|
24
|
+
export class SearchKnowledgeSystemUserResolver extends ResolverBase {
|
|
25
|
+
|
|
26
|
+
@RequireSystemUser()
|
|
27
|
+
@Mutation(() => SearchKnowledgeResult)
|
|
28
|
+
async SearchKnowledgeAsSystemUser(
|
|
29
|
+
@Arg('query') query: string,
|
|
30
|
+
@Arg('maxResults', () => Float, { nullable: true }) maxResults: number | undefined,
|
|
31
|
+
@Arg('filters', () => SearchFiltersInput, { nullable: true }) filters: SearchFiltersInput | undefined,
|
|
32
|
+
@Arg('minScore', () => Float, { nullable: true }) minScore: number | undefined,
|
|
33
|
+
@Ctx() context: AppContext
|
|
34
|
+
): Promise<SearchKnowledgeResult> {
|
|
35
|
+
const startTime = Date.now();
|
|
36
|
+
try {
|
|
37
|
+
const currentUser = context.userPayload.userRecord;
|
|
38
|
+
if (!currentUser) {
|
|
39
|
+
return this.errorResult('Unable to determine system user', startTime);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const result = await SearchEngine.Instance.Search({
|
|
43
|
+
Query: query,
|
|
44
|
+
MaxResults: maxResults,
|
|
45
|
+
MinScore: minScore,
|
|
46
|
+
Filters: filters ? {
|
|
47
|
+
EntityNames: filters.EntityNames,
|
|
48
|
+
SourceTypes: filters.SourceTypes,
|
|
49
|
+
Tags: filters.Tags
|
|
50
|
+
} : undefined
|
|
51
|
+
}, currentUser);
|
|
52
|
+
|
|
53
|
+
return this.mapSearchResult(result);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
56
|
+
LogError(`SearchKnowledgeAsSystemUser mutation failed: ${msg}`);
|
|
57
|
+
return this.errorResult(msg, startTime);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@RequireSystemUser()
|
|
62
|
+
@Mutation(() => SearchKnowledgeResult)
|
|
63
|
+
async PreviewSearchAsSystemUser(
|
|
64
|
+
@Arg('query') query: string,
|
|
65
|
+
@Arg('maxResults', () => Float, { nullable: true, defaultValue: 8 }) maxResults: number,
|
|
66
|
+
@Ctx() context: AppContext
|
|
67
|
+
): Promise<SearchKnowledgeResult> {
|
|
68
|
+
const startTime = Date.now();
|
|
69
|
+
try {
|
|
70
|
+
const currentUser = context.userPayload.userRecord;
|
|
71
|
+
if (!currentUser) {
|
|
72
|
+
return this.errorResult('Unable to determine system user', startTime);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const result = await SearchEngine.Instance.PreviewSearch(query, maxResults, currentUser);
|
|
76
|
+
|
|
77
|
+
return this.mapSearchResult(result);
|
|
78
|
+
} catch (error) {
|
|
79
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
80
|
+
LogError(`PreviewSearchAsSystemUser mutation failed: ${msg}`);
|
|
81
|
+
return this.errorResult(msg, startTime);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private mapSearchResult(result: SearchEngineResult): SearchKnowledgeResult {
|
|
86
|
+
return {
|
|
87
|
+
Success: result.Success,
|
|
88
|
+
Results: result.Results.map((r: SearchEngineResultItem) => ({
|
|
89
|
+
ID: r.ID,
|
|
90
|
+
EntityName: r.EntityName,
|
|
91
|
+
RecordID: r.RecordID,
|
|
92
|
+
SourceType: r.SourceType,
|
|
93
|
+
ResultType: r.ResultType,
|
|
94
|
+
Title: r.Title,
|
|
95
|
+
Snippet: r.Snippet,
|
|
96
|
+
Score: r.Score,
|
|
97
|
+
ScoreBreakdown: r.ScoreBreakdown as SearchScoreBreakdown,
|
|
98
|
+
Tags: r.Tags || [],
|
|
99
|
+
EntityIcon: r.EntityIcon,
|
|
100
|
+
RecordName: r.RecordName,
|
|
101
|
+
MatchedAt: r.MatchedAt,
|
|
102
|
+
RawMetadata: r.RawMetadata,
|
|
103
|
+
ProviderId: r.ProviderId,
|
|
104
|
+
ProviderLabel: r.ProviderLabel,
|
|
105
|
+
ProviderIcon: r.ProviderIcon,
|
|
106
|
+
})),
|
|
107
|
+
TotalCount: result.TotalCount,
|
|
108
|
+
ElapsedMs: result.ElapsedMs,
|
|
109
|
+
SourceCounts: {
|
|
110
|
+
Vector: result.SourceCounts.Vector,
|
|
111
|
+
FullText: result.SourceCounts.FullText,
|
|
112
|
+
Entity: result.SourceCounts.Entity,
|
|
113
|
+
Storage: result.SourceCounts.Storage,
|
|
114
|
+
},
|
|
115
|
+
Providers: (result.Providers || []).map((p: SearchProviderInfo) => ({
|
|
116
|
+
ID: p.ID,
|
|
117
|
+
Name: p.Name,
|
|
118
|
+
DisplayName: p.DisplayName,
|
|
119
|
+
Icon: p.Icon,
|
|
120
|
+
SourceType: p.SourceType,
|
|
121
|
+
Priority: p.Priority,
|
|
122
|
+
})),
|
|
123
|
+
ErrorMessage: result.ErrorMessage,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
private errorResult(message: string, startTime: number): SearchKnowledgeResult {
|
|
128
|
+
return {
|
|
129
|
+
Success: false,
|
|
130
|
+
Results: [],
|
|
131
|
+
TotalCount: 0,
|
|
132
|
+
ElapsedMs: Date.now() - startTime,
|
|
133
|
+
SourceCounts: { Vector: 0, FullText: 0, Entity: 0, Storage: 0 },
|
|
134
|
+
Providers: [],
|
|
135
|
+
ErrorMessage: message
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|