@memberjunction/server 5.24.0 → 5.26.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.
Files changed (62) hide show
  1. package/dist/agents/skip-sdk.d.ts +12 -0
  2. package/dist/agents/skip-sdk.d.ts.map +1 -1
  3. package/dist/agents/skip-sdk.js +70 -1
  4. package/dist/agents/skip-sdk.js.map +1 -1
  5. package/dist/config.d.ts +70 -0
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +21 -0
  8. package/dist/config.js.map +1 -1
  9. package/dist/generated/generated.d.ts +498 -0
  10. package/dist/generated/generated.d.ts.map +1 -1
  11. package/dist/generated/generated.js +2755 -0
  12. package/dist/generated/generated.js.map +1 -1
  13. package/dist/index.d.ts +3 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +18 -2
  16. package/dist/index.js.map +1 -1
  17. package/dist/resolvers/ArtifactFileResolver.d.ts +15 -0
  18. package/dist/resolvers/ArtifactFileResolver.d.ts.map +1 -0
  19. package/dist/resolvers/ArtifactFileResolver.js +74 -0
  20. package/dist/resolvers/ArtifactFileResolver.js.map +1 -0
  21. package/dist/resolvers/AutotagPipelineResolver.d.ts +13 -0
  22. package/dist/resolvers/AutotagPipelineResolver.d.ts.map +1 -1
  23. package/dist/resolvers/AutotagPipelineResolver.js +103 -3
  24. package/dist/resolvers/AutotagPipelineResolver.js.map +1 -1
  25. package/dist/resolvers/CacheStatsResolver.d.ts +31 -0
  26. package/dist/resolvers/CacheStatsResolver.d.ts.map +1 -0
  27. package/dist/resolvers/CacheStatsResolver.js +181 -0
  28. package/dist/resolvers/CacheStatsResolver.js.map +1 -0
  29. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  30. package/dist/resolvers/FileResolver.js +12 -32
  31. package/dist/resolvers/FileResolver.js.map +1 -1
  32. package/dist/resolvers/GeoResolver.d.ts +58 -0
  33. package/dist/resolvers/GeoResolver.d.ts.map +1 -0
  34. package/dist/resolvers/GeoResolver.js +302 -0
  35. package/dist/resolvers/GeoResolver.js.map +1 -0
  36. package/dist/resolvers/RunAIAgentResolver.d.ts +13 -1
  37. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  38. package/dist/resolvers/RunAIAgentResolver.js +115 -20
  39. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  40. package/dist/resolvers/SearchKnowledgeResolver.d.ts +21 -80
  41. package/dist/resolvers/SearchKnowledgeResolver.d.ts.map +1 -1
  42. package/dist/resolvers/SearchKnowledgeResolver.js +129 -604
  43. package/dist/resolvers/SearchKnowledgeResolver.js.map +1 -1
  44. package/dist/resolvers/SearchKnowledgeSystemUserResolver.d.ts +19 -0
  45. package/dist/resolvers/SearchKnowledgeSystemUserResolver.d.ts.map +1 -0
  46. package/dist/resolvers/SearchKnowledgeSystemUserResolver.js +149 -0
  47. package/dist/resolvers/SearchKnowledgeSystemUserResolver.js.map +1 -0
  48. package/package.json +66 -63
  49. package/src/__tests__/search-knowledge-tags.test.ts +177 -337
  50. package/src/__tests__/skip-sdk-organic-keys.test.ts +274 -0
  51. package/src/agents/skip-sdk.ts +83 -2
  52. package/src/config.ts +24 -0
  53. package/src/generated/generated.ts +1902 -1
  54. package/src/index.ts +18 -2
  55. package/src/resolvers/ArtifactFileResolver.ts +71 -0
  56. package/src/resolvers/AutotagPipelineResolver.ts +118 -4
  57. package/src/resolvers/CacheStatsResolver.ts +142 -0
  58. package/src/resolvers/FileResolver.ts +12 -41
  59. package/src/resolvers/GeoResolver.ts +258 -0
  60. package/src/resolvers/RunAIAgentResolver.ts +137 -23
  61. package/src/resolvers/SearchKnowledgeResolver.ts +114 -715
  62. 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
+ }