@memberjunction/server 3.3.0 → 4.0.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 (296) hide show
  1. package/README.md +59 -0
  2. package/dist/agents/skip-agent.d.ts +65 -0
  3. package/dist/agents/skip-agent.d.ts.map +1 -1
  4. package/dist/agents/skip-agent.js +63 -5
  5. package/dist/agents/skip-agent.js.map +1 -1
  6. package/dist/agents/skip-sdk.d.ts +163 -0
  7. package/dist/agents/skip-sdk.d.ts.map +1 -1
  8. package/dist/agents/skip-sdk.js +143 -12
  9. package/dist/agents/skip-sdk.js.map +1 -1
  10. package/dist/apolloServer/TransactionPlugin.d.ts +4 -0
  11. package/dist/apolloServer/TransactionPlugin.d.ts.map +1 -0
  12. package/dist/apolloServer/TransactionPlugin.js +46 -0
  13. package/dist/apolloServer/TransactionPlugin.js.map +1 -0
  14. package/dist/apolloServer/index.d.ts +0 -1
  15. package/dist/apolloServer/index.d.ts.map +1 -1
  16. package/dist/auth/APIKeyScopeAuth.d.ts +82 -0
  17. package/dist/auth/APIKeyScopeAuth.d.ts.map +1 -1
  18. package/dist/auth/APIKeyScopeAuth.js +78 -0
  19. package/dist/auth/APIKeyScopeAuth.js.map +1 -1
  20. package/dist/auth/AuthProviderFactory.d.ts +35 -0
  21. package/dist/auth/AuthProviderFactory.d.ts.map +1 -1
  22. package/dist/auth/AuthProviderFactory.js +51 -4
  23. package/dist/auth/AuthProviderFactory.js.map +1 -1
  24. package/dist/auth/BaseAuthProvider.d.ts +22 -0
  25. package/dist/auth/BaseAuthProvider.d.ts.map +1 -1
  26. package/dist/auth/BaseAuthProvider.js +25 -8
  27. package/dist/auth/BaseAuthProvider.js.map +1 -1
  28. package/dist/auth/IAuthProvider.d.ts +33 -0
  29. package/dist/auth/IAuthProvider.d.ts.map +1 -1
  30. package/dist/auth/__tests__/backward-compatibility.test.d.ts +2 -0
  31. package/dist/auth/__tests__/backward-compatibility.test.d.ts.map +1 -0
  32. package/dist/auth/__tests__/backward-compatibility.test.js +135 -0
  33. package/dist/auth/__tests__/backward-compatibility.test.js.map +1 -0
  34. package/dist/auth/exampleNewUserSubClass.d.ts +5 -1
  35. package/dist/auth/exampleNewUserSubClass.d.ts.map +1 -1
  36. package/dist/auth/exampleNewUserSubClass.js +21 -6
  37. package/dist/auth/exampleNewUserSubClass.js.map +1 -1
  38. package/dist/auth/index.d.ts +14 -0
  39. package/dist/auth/index.d.ts.map +1 -1
  40. package/dist/auth/index.js +35 -22
  41. package/dist/auth/index.js.map +1 -1
  42. package/dist/auth/initializeProviders.d.ts +3 -0
  43. package/dist/auth/initializeProviders.d.ts.map +1 -1
  44. package/dist/auth/initializeProviders.js +6 -0
  45. package/dist/auth/initializeProviders.js.map +1 -1
  46. package/dist/auth/newUsers.js +11 -2
  47. package/dist/auth/newUsers.js.map +1 -1
  48. package/dist/auth/providers/Auth0Provider.d.ts +9 -0
  49. package/dist/auth/providers/Auth0Provider.d.ts.map +1 -1
  50. package/dist/auth/providers/Auth0Provider.js +10 -0
  51. package/dist/auth/providers/Auth0Provider.js.map +1 -1
  52. package/dist/auth/providers/CognitoProvider.d.ts +9 -0
  53. package/dist/auth/providers/CognitoProvider.d.ts.map +1 -1
  54. package/dist/auth/providers/CognitoProvider.js +10 -0
  55. package/dist/auth/providers/CognitoProvider.js.map +1 -1
  56. package/dist/auth/providers/GoogleProvider.d.ts +9 -0
  57. package/dist/auth/providers/GoogleProvider.d.ts.map +1 -1
  58. package/dist/auth/providers/GoogleProvider.js +11 -1
  59. package/dist/auth/providers/GoogleProvider.js.map +1 -1
  60. package/dist/auth/providers/MSALProvider.d.ts +9 -0
  61. package/dist/auth/providers/MSALProvider.d.ts.map +1 -1
  62. package/dist/auth/providers/MSALProvider.js +10 -0
  63. package/dist/auth/providers/MSALProvider.js.map +1 -1
  64. package/dist/auth/providers/OktaProvider.d.ts +9 -0
  65. package/dist/auth/providers/OktaProvider.d.ts.map +1 -1
  66. package/dist/auth/providers/OktaProvider.js +10 -0
  67. package/dist/auth/providers/OktaProvider.js.map +1 -1
  68. package/dist/config.d.ts +12 -0
  69. package/dist/config.d.ts.map +1 -1
  70. package/dist/config.js +44 -10
  71. package/dist/config.js.map +1 -1
  72. package/dist/context.d.ts +8 -1
  73. package/dist/context.d.ts.map +1 -1
  74. package/dist/context.js +26 -4
  75. package/dist/context.js.map +1 -1
  76. package/dist/directives/Public.js +2 -0
  77. package/dist/directives/Public.js.map +1 -1
  78. package/dist/entitySubclasses/entityPermissions.server.d.ts +7 -2
  79. package/dist/entitySubclasses/entityPermissions.server.d.ts.map +1 -1
  80. package/dist/entitySubclasses/entityPermissions.server.js +26 -8
  81. package/dist/entitySubclasses/entityPermissions.server.js.map +1 -1
  82. package/dist/generated/generated.d.ts +954 -2
  83. package/dist/generated/generated.d.ts.map +1 -1
  84. package/dist/generated/generated.js +12183 -14532
  85. package/dist/generated/generated.js.map +1 -1
  86. package/dist/generic/DeleteOptionsInput.d.ts +3 -0
  87. package/dist/generic/DeleteOptionsInput.d.ts.map +1 -1
  88. package/dist/generic/DeleteOptionsInput.js +3 -2
  89. package/dist/generic/DeleteOptionsInput.js.map +1 -1
  90. package/dist/generic/KeyInputOutputTypes.js +0 -6
  91. package/dist/generic/KeyInputOutputTypes.js.map +1 -1
  92. package/dist/generic/KeyValuePairInput.d.ts +4 -0
  93. package/dist/generic/KeyValuePairInput.d.ts.map +1 -1
  94. package/dist/generic/KeyValuePairInput.js +4 -2
  95. package/dist/generic/KeyValuePairInput.js.map +1 -1
  96. package/dist/generic/PushStatusResolver.js +0 -3
  97. package/dist/generic/PushStatusResolver.js.map +1 -1
  98. package/dist/generic/ResolverBase.d.ts +59 -0
  99. package/dist/generic/ResolverBase.d.ts.map +1 -1
  100. package/dist/generic/ResolverBase.js +233 -18
  101. package/dist/generic/ResolverBase.js.map +1 -1
  102. package/dist/generic/RunViewResolver.d.ts +22 -0
  103. package/dist/generic/RunViewResolver.d.ts.map +1 -1
  104. package/dist/generic/RunViewResolver.js +42 -108
  105. package/dist/generic/RunViewResolver.js.map +1 -1
  106. package/dist/index.d.ts +2 -2
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +84 -39
  109. package/dist/index.js.map +1 -1
  110. package/dist/orm.d.ts.map +1 -1
  111. package/dist/orm.js +2 -1
  112. package/dist/orm.js.map +1 -1
  113. package/dist/resolvers/APIKeyResolver.d.ts +76 -1
  114. package/dist/resolvers/APIKeyResolver.d.ts.map +1 -1
  115. package/dist/resolvers/APIKeyResolver.js +53 -11
  116. package/dist/resolvers/APIKeyResolver.js.map +1 -1
  117. package/dist/resolvers/ActionResolver.d.ts +191 -1
  118. package/dist/resolvers/ActionResolver.d.ts.map +1 -1
  119. package/dist/resolvers/ActionResolver.js +156 -22
  120. package/dist/resolvers/ActionResolver.js.map +1 -1
  121. package/dist/resolvers/ColorResolver.js +0 -5
  122. package/dist/resolvers/ColorResolver.js.map +1 -1
  123. package/dist/resolvers/ComponentRegistryResolver.d.ts +65 -0
  124. package/dist/resolvers/ComponentRegistryResolver.d.ts.map +1 -1
  125. package/dist/resolvers/ComponentRegistryResolver.js +118 -40
  126. package/dist/resolvers/ComponentRegistryResolver.js.map +1 -1
  127. package/dist/resolvers/CreateQueryResolver.d.ts +47 -0
  128. package/dist/resolvers/CreateQueryResolver.d.ts.map +1 -1
  129. package/dist/resolvers/CreateQueryResolver.js +92 -116
  130. package/dist/resolvers/CreateQueryResolver.js.map +1 -1
  131. package/dist/resolvers/DatasetResolver.d.ts +5 -4
  132. package/dist/resolvers/DatasetResolver.d.ts.map +1 -1
  133. package/dist/resolvers/DatasetResolver.js +9 -18
  134. package/dist/resolvers/DatasetResolver.js.map +1 -1
  135. package/dist/resolvers/EntityCommunicationsResolver.d.ts +42 -1
  136. package/dist/resolvers/EntityCommunicationsResolver.d.ts.map +1 -1
  137. package/dist/resolvers/EntityCommunicationsResolver.js +5 -37
  138. package/dist/resolvers/EntityCommunicationsResolver.js.map +1 -1
  139. package/dist/resolvers/EntityRecordNameResolver.js +0 -7
  140. package/dist/resolvers/EntityRecordNameResolver.js.map +1 -1
  141. package/dist/resolvers/FileCategoryResolver.js +13 -1
  142. package/dist/resolvers/FileCategoryResolver.js.map +1 -1
  143. package/dist/resolvers/FileResolver.d.ts +16 -0
  144. package/dist/resolvers/FileResolver.d.ts.map +1 -1
  145. package/dist/resolvers/FileResolver.js +59 -74
  146. package/dist/resolvers/FileResolver.js.map +1 -1
  147. package/dist/resolvers/GetDataContextDataResolver.d.ts +20 -2
  148. package/dist/resolvers/GetDataContextDataResolver.d.ts.map +1 -1
  149. package/dist/resolvers/GetDataContextDataResolver.js +27 -12
  150. package/dist/resolvers/GetDataContextDataResolver.js.map +1 -1
  151. package/dist/resolvers/GetDataResolver.d.ts +19 -0
  152. package/dist/resolvers/GetDataResolver.d.ts.map +1 -1
  153. package/dist/resolvers/GetDataResolver.js +35 -35
  154. package/dist/resolvers/GetDataResolver.js.map +1 -1
  155. package/dist/resolvers/InfoResolver.d.ts.map +1 -1
  156. package/dist/resolvers/InfoResolver.js +4 -7
  157. package/dist/resolvers/InfoResolver.js.map +1 -1
  158. package/dist/resolvers/MCPResolver.d.ts +361 -0
  159. package/dist/resolvers/MCPResolver.d.ts.map +1 -0
  160. package/dist/resolvers/MCPResolver.js +1270 -0
  161. package/dist/resolvers/MCPResolver.js.map +1 -0
  162. package/dist/resolvers/MergeRecordsResolver.d.ts +2 -1
  163. package/dist/resolvers/MergeRecordsResolver.d.ts.map +1 -1
  164. package/dist/resolvers/MergeRecordsResolver.js +6 -30
  165. package/dist/resolvers/MergeRecordsResolver.js.map +1 -1
  166. package/dist/resolvers/PotentialDuplicateRecordResolver.d.ts.map +1 -1
  167. package/dist/resolvers/PotentialDuplicateRecordResolver.js +0 -3
  168. package/dist/resolvers/PotentialDuplicateRecordResolver.js.map +1 -1
  169. package/dist/resolvers/QueryResolver.d.ts +22 -1
  170. package/dist/resolvers/QueryResolver.d.ts.map +1 -1
  171. package/dist/resolvers/QueryResolver.js +50 -37
  172. package/dist/resolvers/QueryResolver.js.map +1 -1
  173. package/dist/resolvers/ReportResolver.d.ts +5 -1
  174. package/dist/resolvers/ReportResolver.d.ts.map +1 -1
  175. package/dist/resolvers/ReportResolver.js +13 -11
  176. package/dist/resolvers/ReportResolver.js.map +1 -1
  177. package/dist/resolvers/RunAIAgentResolver.d.ts +54 -0
  178. package/dist/resolvers/RunAIAgentResolver.d.ts.map +1 -1
  179. package/dist/resolvers/RunAIAgentResolver.js +118 -40
  180. package/dist/resolvers/RunAIAgentResolver.js.map +1 -1
  181. package/dist/resolvers/RunAIPromptResolver.d.ts +42 -0
  182. package/dist/resolvers/RunAIPromptResolver.d.ts.map +1 -1
  183. package/dist/resolvers/RunAIPromptResolver.js +98 -22
  184. package/dist/resolvers/RunAIPromptResolver.js.map +1 -1
  185. package/dist/resolvers/RunTemplateResolver.d.ts.map +1 -1
  186. package/dist/resolvers/RunTemplateResolver.js +10 -6
  187. package/dist/resolvers/RunTemplateResolver.js.map +1 -1
  188. package/dist/resolvers/RunTestResolver.d.ts +12 -0
  189. package/dist/resolvers/RunTestResolver.d.ts.map +1 -1
  190. package/dist/resolvers/RunTestResolver.js +35 -21
  191. package/dist/resolvers/RunTestResolver.js.map +1 -1
  192. package/dist/resolvers/SqlLoggingConfigResolver.d.ts +312 -0
  193. package/dist/resolvers/SqlLoggingConfigResolver.d.ts.map +1 -1
  194. package/dist/resolvers/SqlLoggingConfigResolver.js +295 -45
  195. package/dist/resolvers/SqlLoggingConfigResolver.js.map +1 -1
  196. package/dist/resolvers/SyncDataResolver.d.ts +21 -0
  197. package/dist/resolvers/SyncDataResolver.d.ts.map +1 -1
  198. package/dist/resolvers/SyncDataResolver.js +36 -22
  199. package/dist/resolvers/SyncDataResolver.js.map +1 -1
  200. package/dist/resolvers/SyncRolesUsersResolver.d.ts +14 -0
  201. package/dist/resolvers/SyncRolesUsersResolver.d.ts.map +1 -1
  202. package/dist/resolvers/SyncRolesUsersResolver.js +54 -21
  203. package/dist/resolvers/SyncRolesUsersResolver.js.map +1 -1
  204. package/dist/resolvers/TaskResolver.d.ts +13 -0
  205. package/dist/resolvers/TaskResolver.d.ts.map +1 -1
  206. package/dist/resolvers/TaskResolver.js +23 -7
  207. package/dist/resolvers/TaskResolver.js.map +1 -1
  208. package/dist/resolvers/TelemetryResolver.d.ts +22 -0
  209. package/dist/resolvers/TelemetryResolver.d.ts.map +1 -1
  210. package/dist/resolvers/TelemetryResolver.js +45 -79
  211. package/dist/resolvers/TelemetryResolver.js.map +1 -1
  212. package/dist/resolvers/TransactionGroupResolver.js +11 -13
  213. package/dist/resolvers/TransactionGroupResolver.js.map +1 -1
  214. package/dist/resolvers/UserFavoriteResolver.js +3 -12
  215. package/dist/resolvers/UserFavoriteResolver.js.map +1 -1
  216. package/dist/resolvers/UserResolver.d.ts.map +1 -1
  217. package/dist/resolvers/UserResolver.js +14 -0
  218. package/dist/resolvers/UserResolver.js.map +1 -1
  219. package/dist/resolvers/UserViewResolver.js +4 -0
  220. package/dist/resolvers/UserViewResolver.js.map +1 -1
  221. package/dist/resolvers/VersionHistoryResolver.d.ts +39 -0
  222. package/dist/resolvers/VersionHistoryResolver.d.ts.map +1 -0
  223. package/dist/resolvers/VersionHistoryResolver.js +208 -0
  224. package/dist/resolvers/VersionHistoryResolver.js.map +1 -0
  225. package/dist/rest/EntityCRUDHandler.d.ts +19 -0
  226. package/dist/rest/EntityCRUDHandler.d.ts.map +1 -1
  227. package/dist/rest/EntityCRUDHandler.js +55 -0
  228. package/dist/rest/EntityCRUDHandler.js.map +1 -1
  229. package/dist/rest/OAuthCallbackHandler.d.ts +143 -0
  230. package/dist/rest/OAuthCallbackHandler.d.ts.map +1 -0
  231. package/dist/rest/OAuthCallbackHandler.js +634 -0
  232. package/dist/rest/OAuthCallbackHandler.js.map +1 -0
  233. package/dist/rest/RESTEndpointHandler.d.ts +120 -0
  234. package/dist/rest/RESTEndpointHandler.d.ts.map +1 -1
  235. package/dist/rest/RESTEndpointHandler.js +213 -24
  236. package/dist/rest/RESTEndpointHandler.js.map +1 -1
  237. package/dist/rest/ViewOperationsHandler.d.ts +19 -0
  238. package/dist/rest/ViewOperationsHandler.d.ts.map +1 -1
  239. package/dist/rest/ViewOperationsHandler.js +39 -0
  240. package/dist/rest/ViewOperationsHandler.js.map +1 -1
  241. package/dist/rest/index.d.ts +1 -0
  242. package/dist/rest/index.d.ts.map +1 -1
  243. package/dist/rest/index.js +1 -0
  244. package/dist/rest/index.js.map +1 -1
  245. package/dist/rest/setupRESTEndpoints.d.ts +35 -0
  246. package/dist/rest/setupRESTEndpoints.d.ts.map +1 -1
  247. package/dist/rest/setupRESTEndpoints.js +15 -1
  248. package/dist/rest/setupRESTEndpoints.js.map +1 -1
  249. package/dist/services/ScheduledJobsService.d.ts +31 -0
  250. package/dist/services/ScheduledJobsService.d.ts.map +1 -1
  251. package/dist/services/ScheduledJobsService.js +38 -4
  252. package/dist/services/ScheduledJobsService.js.map +1 -1
  253. package/dist/services/TaskOrchestrator.d.ts +73 -0
  254. package/dist/services/TaskOrchestrator.d.ts.map +1 -1
  255. package/dist/services/TaskOrchestrator.js +137 -15
  256. package/dist/services/TaskOrchestrator.js.map +1 -1
  257. package/dist/types.d.ts +14 -0
  258. package/dist/types.d.ts.map +1 -1
  259. package/dist/types.js +0 -13
  260. package/dist/types.js.map +1 -1
  261. package/dist/util.d.ts +37 -1
  262. package/dist/util.d.ts.map +1 -1
  263. package/dist/util.js +55 -8
  264. package/dist/util.js.map +1 -1
  265. package/package.json +79 -77
  266. package/src/auth/BaseAuthProvider.ts +3 -0
  267. package/src/auth/IAuthProvider.ts +5 -0
  268. package/src/auth/exampleNewUserSubClass.ts +1 -5
  269. package/src/config.ts +2 -2
  270. package/src/entitySubclasses/entityPermissions.server.ts +1 -3
  271. package/src/generated/generated.ts +6245 -2558
  272. package/src/generic/ResolverBase.ts +89 -3
  273. package/src/index.ts +71 -64
  274. package/src/resolvers/APIKeyResolver.ts +8 -1
  275. package/src/resolvers/ActionResolver.ts +8 -1
  276. package/src/resolvers/DatasetResolver.ts +11 -4
  277. package/src/resolvers/EntityCommunicationsResolver.ts +5 -1
  278. package/src/resolvers/GetDataContextDataResolver.ts +14 -6
  279. package/src/resolvers/InfoResolver.ts +5 -1
  280. package/src/resolvers/MCPResolver.ts +1380 -0
  281. package/src/resolvers/MergeRecordsResolver.ts +5 -1
  282. package/src/resolvers/PotentialDuplicateRecordResolver.ts +0 -4
  283. package/src/resolvers/QueryResolver.ts +17 -3
  284. package/src/resolvers/ReportResolver.ts +8 -1
  285. package/src/resolvers/RunAIAgentResolver.ts +6 -0
  286. package/src/resolvers/RunAIPromptResolver.ts +10 -1
  287. package/src/resolvers/RunTemplateResolver.ts +4 -1
  288. package/src/resolvers/TaskResolver.ts +3 -0
  289. package/src/resolvers/UserResolver.ts +15 -3
  290. package/src/resolvers/VersionHistoryResolver.ts +177 -0
  291. package/src/rest/OAuthCallbackHandler.ts +766 -0
  292. package/src/rest/RESTEndpointHandler.ts +58 -35
  293. package/src/rest/index.ts +2 -1
  294. package/src/rest/setupRESTEndpoints.ts +13 -12
  295. package/src/resolvers/AskSkipResolver.ts +0 -3446
  296. package/src/scheduler/LearningCycleScheduler.ts +0 -320
@@ -1,58 +1,221 @@
1
+ /**
2
+ * Skip TypeScript SDK
3
+ *
4
+ * A general-purpose SDK for calling the Skip SaaS API.
5
+ * This module provides a clean, reusable interface for integrating with Skip
6
+ * that can eventually be extracted into a standalone npm package.
7
+ */
1
8
  import { SkipAPIResponse, SkipMessage, SkipRequestPhase } from '@memberjunction/skip-types';
2
9
  import { DataContext } from '@memberjunction/data-context';
3
10
  import { UserInfo } from '@memberjunction/core';
4
11
  import mssql from 'mssql';
12
+ /**
13
+ * Configuration options for Skip SDK
14
+ */
5
15
  export interface SkipSDKConfig {
16
+ /**
17
+ * Skip API base URL (e.g., 'https://skip.memberjunction.com')
18
+ */
6
19
  apiUrl?: string;
20
+ /**
21
+ * Skip API key for authentication
22
+ */
7
23
  apiKey?: string;
24
+ /**
25
+ * Organization ID
26
+ */
8
27
  organizationId?: string;
28
+ /**
29
+ * Optional organization context information
30
+ */
9
31
  organizationInfo?: string;
10
32
  }
33
+ /**
34
+ * Options for making a Skip API call
35
+ */
11
36
  export interface SkipCallOptions {
37
+ /**
38
+ * Conversation messages (user/assistant)
39
+ */
12
40
  messages: SkipMessage[];
41
+ /**
42
+ * Conversation ID for tracking
43
+ */
13
44
  conversationId: string;
45
+ /**
46
+ * Data context to provide to Skip
47
+ */
14
48
  dataContext?: DataContext;
49
+ /**
50
+ * Request phase (initial_request, clarify_question_response, etc.)
51
+ */
15
52
  requestPhase?: SkipRequestPhase;
53
+ /**
54
+ * Context user for permissions and metadata
55
+ */
16
56
  contextUser: UserInfo;
57
+ /**
58
+ * Database connection for metadata queries
59
+ */
17
60
  dataSource: mssql.ConnectionPool;
61
+ /**
62
+ * Include entity metadata in request
63
+ */
18
64
  includeEntities?: boolean;
65
+ /**
66
+ * Include saved queries in request
67
+ */
19
68
  includeQueries?: boolean;
69
+ /**
70
+ * Include agent notes in request
71
+ */
20
72
  includeNotes?: boolean;
73
+ /**
74
+ * Include agent requests in request
75
+ */
21
76
  includeRequests?: boolean;
77
+ /**
78
+ * Force refresh of entity metadata cache
79
+ */
22
80
  forceEntityRefresh?: boolean;
81
+ /**
82
+ * Include callback API key and access token for Skip to call back to MJ
83
+ */
23
84
  includeCallbackAuth?: boolean;
85
+ /**
86
+ * Callback for streaming status updates during execution
87
+ */
24
88
  onStatusUpdate?: (message: string, responsePhase?: string) => void;
89
+ /**
90
+ * Optional payload data from a previous response (e.g., PRD in progress).
91
+ * This enables incremental artifact building where structured data accumulates
92
+ * throughout the conversation. When Skip returns a response with a payload,
93
+ * the client should pass that payload back in the next request.
94
+ */
25
95
  payload?: Record<string, any>;
26
96
  }
97
+ /**
98
+ * Result from a Skip API call
99
+ */
27
100
  export interface SkipCallResult {
101
+ /**
102
+ * Whether the call was successful
103
+ */
28
104
  success: boolean;
105
+ /**
106
+ * The final Skip API response
107
+ */
29
108
  response?: SkipAPIResponse;
109
+ /**
110
+ * Response phase (analysis_complete, clarifying_question, status_update)
111
+ */
30
112
  responsePhase?: string;
113
+ /**
114
+ * Error message if failed
115
+ */
31
116
  error?: string;
117
+ /**
118
+ * All streaming responses received (including intermediate status updates)
119
+ */
32
120
  allResponses?: any[];
33
121
  }
122
+ /**
123
+ * Skip TypeScript SDK
124
+ * Provides a clean interface for calling the Skip SaaS API
125
+ */
34
126
  export declare class SkipSDK {
35
127
  private config;
36
128
  private static __skipEntitiesCache$;
37
129
  private static __lastRefreshTime;
38
130
  constructor(config?: SkipSDKConfig);
131
+ /**
132
+ * Call the Skip chat API
133
+ */
39
134
  chat(options: SkipCallOptions): Promise<SkipCallResult>;
135
+ /**
136
+ * Build the Skip API request object
137
+ */
40
138
  private buildSkipRequest;
139
+ /**
140
+ * Build base request with metadata, API keys, and callback auth
141
+ */
41
142
  private buildBaseRequest;
143
+ /**
144
+ * Build entity metadata for Skip
145
+ * Copied from AskSkipResolver.BuildSkipEntities - uses cached metadata with refresh logic
146
+ */
42
147
  private buildEntities;
148
+ /**
149
+ * Build saved queries for Skip
150
+ */
43
151
  private buildQueries;
152
+ /**
153
+ * Recursively build category path for a query
154
+ */
44
155
  private buildQueryCategoryPath;
156
+ /**
157
+ * Build agent notes for Skip
158
+ */
45
159
  private buildAgentNotes;
160
+ /**
161
+ * Build artifacts for a conversation using optimized query
162
+ * Uses GetConversationArtifactsForAgent query which joins through ConversationDetailArtifact
163
+ * to get artifacts that were outputs from Skip agent's conversation details
164
+ */
46
165
  private buildArtifacts;
166
+ /**
167
+ * Build API keys for AI services
168
+ */
47
169
  private buildAPIKeys;
170
+ /**
171
+ * Build HTTP headers for Skip API requests
172
+ */
48
173
  private buildHeaders;
174
+ /**
175
+ * Refreshes the Skip entities cache
176
+ * Rebuilds the entity information that is provided to Skip
177
+ * Copied from AskSkipResolver.refreshSkipEntities
178
+ */
49
179
  private refreshSkipEntities;
180
+ /**
181
+ * Packs information about a single entity for Skip
182
+ * Includes fields, relationships, and sample data
183
+ * Copied from AskSkipResolver.PackSingleSkipEntityInfo
184
+ */
50
185
  private packSingleSkipEntityInfo;
186
+ /**
187
+ * Packs information about a single entity relationship
188
+ * These relationships help Skip understand the data model
189
+ * Copied from AskSkipResolver.PackSingleSkipEntityRelationship
190
+ */
51
191
  private packSingleSkipEntityRelationship;
192
+ /**
193
+ * Packs information about a single entity field
194
+ * Includes metadata and possible values
195
+ * Copied from AskSkipResolver.PackSingleSkipEntityField
196
+ */
52
197
  private packSingleSkipEntityField;
198
+ /**
199
+ * Packs possible values for an entity field
200
+ * These values help Skip understand the domain and valid values for fields
201
+ * Copied from AskSkipResolver.PackFieldPossibleValues
202
+ */
53
203
  private packFieldPossibleValues;
204
+ /**
205
+ * Gets distinct values for a field from the database
206
+ * Used to provide Skip with information about the possible values
207
+ * Copied from AskSkipResolver.GetFieldDistinctValues
208
+ */
54
209
  private getFieldDistinctValues;
210
+ /**
211
+ * Process messages: filter delegation messages and add metadata fields
212
+ * Messages coming in should already have conversationDetailID if they exist in the database
213
+ */
55
214
  private processMessages;
215
+ /**
216
+ * Check if a message is a delegation message that should be filtered out
217
+ * Uses flexible pattern matching to detect variations of delegation messages
218
+ */
56
219
  private isDelegationMessage;
57
220
  }
58
221
  //# sourceMappingURL=skip-sdk.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"skip-sdk.d.ts","sourceRoot":"","sources":["../../src/agents/skip-sdk.ts"],"names":[],"mappings":"AAQA,OAAO,EAEH,eAAe,EACf,WAAW,EAGX,gBAAgB,EAanB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAgG,MAAM,sBAAsB,CAAC;AAM9I,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,MAAM,WAAW,aAAa;IAI1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAKhB,MAAM,CAAC,EAAE,MAAM,CAAC;IAKhB,cAAc,CAAC,EAAE,MAAM,CAAC;IAKxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAKD,MAAM,WAAW,eAAe;IAI5B,QAAQ,EAAE,WAAW,EAAE,CAAC;IAKxB,cAAc,EAAE,MAAM,CAAC;IAKvB,WAAW,CAAC,EAAE,WAAW,CAAC;IAK1B,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAKhC,WAAW,EAAE,QAAQ,CAAC;IAKtB,UAAU,EAAE,KAAK,CAAC,cAAc,CAAC;IAKjC,eAAe,CAAC,EAAE,OAAO,CAAC;IAK1B,cAAc,CAAC,EAAE,OAAO,CAAC;IAKzB,YAAY,CAAC,EAAE,OAAO,CAAC;IAKvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAK1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAK7B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAK9B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAQnE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACjC;AAKD,MAAM,WAAW,cAAc;IAI3B,OAAO,EAAE,OAAO,CAAC;IAKjB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAK3B,aAAa,CAAC,EAAE,MAAM,CAAC;IAKvB,KAAK,CAAC,EAAE,MAAM,CAAC;IAKf,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;CACxB;AAMD,qBAAa,OAAO;IAChB,OAAO,CAAC,MAAM,CAAgB;IAG9B,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAkH;IACrJ,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAa;gBAEjC,MAAM,CAAC,EAAE,aAAa;IAa5B,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;YAmF/C,gBAAgB;YA+DhB,gBAAgB;YAqDhB,aAAa;IAuB3B,OAAO,CAAC,YAAY;IA4DpB,OAAO,CAAC,sBAAsB;YAWhB,eAAe;YAYf,cAAc;IA8G5B,OAAO,CAAC,YAAY;IAgCpB,OAAO,CAAC,YAAY;YAYN,mBAAmB;YAoDnB,wBAAwB;IAkCtC,OAAO,CAAC,gCAAgC;YA4B1B,yBAAyB;YA4CzB,uBAAuB;YA+CvB,sBAAsB;IA2BpC,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,mBAAmB;CAW9B"}
1
+ {"version":3,"file":"skip-sdk.d.ts","sourceRoot":"","sources":["../../src/agents/skip-sdk.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Skip TypeScript SDK
3
+ *
4
+ * A general-purpose SDK for calling the Skip SaaS API.
5
+ * This module provides a clean, reusable interface for integrating with Skip
6
+ * that can eventually be extracted into a standalone npm package.
7
+ */
1
8
  import { SkipResponsePhase } from '@memberjunction/skip-types';
2
9
  import { LogStatus, LogError, Metadata, RunQuery } from '@memberjunction/core';
3
10
  import { sendPostRequest } from '../util.js';
@@ -9,11 +16,16 @@ import mssql from 'mssql';
9
16
  import { registerAccessToken } from '../resolvers/GetDataResolver.js';
10
17
  import { BehaviorSubject } from 'rxjs';
11
18
  import { take } from 'rxjs/operators';
19
+ /**
20
+ * Skip TypeScript SDK
21
+ * Provides a clean interface for calling the Skip SaaS API
22
+ */
12
23
  export class SkipSDK {
13
- config;
14
- static __skipEntitiesCache$ = new BehaviorSubject(null);
15
- static __lastRefreshTime = 0;
24
+ // Static cache for Skip entities (shared across all instances)
25
+ static { this.__skipEntitiesCache$ = new BehaviorSubject(null); }
26
+ static { this.__lastRefreshTime = 0; }
16
27
  constructor(config) {
28
+ // Use provided config or fall back to MJ server config
17
29
  this.config = {
18
30
  apiUrl: config?.apiUrl || configInfo.askSkip?.chatURL,
19
31
  apiKey: config?.apiKey || configInfo.askSkip?.apiKey,
@@ -21,11 +33,20 @@ export class SkipSDK {
21
33
  organizationInfo: config?.organizationInfo || configInfo.askSkip?.organizationInfo
22
34
  };
23
35
  }
36
+ /**
37
+ * Call the Skip chat API
38
+ */
24
39
  async chat(options) {
25
40
  LogStatus(`[SkipSDK] Sending request to Skip API: ${this.config.apiUrl}`);
26
41
  try {
42
+ // Build the Skip API request
27
43
  const skipRequest = await this.buildSkipRequest(options);
28
- const responses = await sendPostRequest(this.config.apiUrl, skipRequest, true, this.buildHeaders(), (streamMessage) => {
44
+ // Call Skip API with streaming support
45
+ const responses = await sendPostRequest(this.config.apiUrl, skipRequest, true, // useCompression
46
+ this.buildHeaders(), (streamMessage) => {
47
+ // Handle streaming status updates
48
+ // Queue messages come as flat objects: {responsePhase: 'queued'|'error', message: '...', error: '...'}
49
+ // Skip API messages come wrapped: {type: 'status_update', value: {responsePhase: '...', messages: [...]}}
29
50
  if (streamMessage.type === 'status_update' && options.onStatusUpdate) {
30
51
  const statusContent = streamMessage.value?.messages?.[0]?.content;
31
52
  const responsePhase = streamMessage.value?.responsePhase;
@@ -34,6 +55,7 @@ export class SkipSDK {
34
55
  }
35
56
  }
36
57
  else if (streamMessage.responsePhase === SkipResponsePhase.queued && options.onStatusUpdate) {
58
+ // Handle queue progress messages
37
59
  const statusContent = streamMessage.message;
38
60
  const responsePhase = streamMessage.responsePhase;
39
61
  if (statusContent) {
@@ -41,12 +63,15 @@ export class SkipSDK {
41
63
  }
42
64
  }
43
65
  else if (streamMessage.responsePhase === 'error') {
66
+ // Queue error messages - log but don't throw (final response will handle error)
67
+ // Note: 'error' is not in SkipResponsePhase enum - it's a queue-specific error state
44
68
  LogError(`[SkipSDK] Queue error: ${streamMessage.error || 'Unknown error'}`);
45
69
  if (options.onStatusUpdate) {
46
70
  options.onStatusUpdate(`Error: ${streamMessage.error || 'Request failed'}`, 'error');
47
71
  }
48
72
  }
49
73
  });
74
+ // The last response is the final one
50
75
  if (responses && responses.length > 0) {
51
76
  const finalResponse = responses[responses.length - 1].value;
52
77
  return {
@@ -65,6 +90,7 @@ export class SkipSDK {
65
90
  }
66
91
  catch (error) {
67
92
  LogError(`[SkipSDK] Error calling Skip API: ${error}`);
93
+ // Provide user-friendly error messages for common failures
68
94
  let userFriendlyError = String(error);
69
95
  const errorStr = String(error).toLowerCase();
70
96
  if (errorStr.includes('stream error') || errorStr.includes('aborted') || errorStr.includes('econnreset')) {
@@ -82,18 +108,25 @@ export class SkipSDK {
82
108
  };
83
109
  }
84
110
  }
111
+ /**
112
+ * Build the Skip API request object
113
+ */
85
114
  async buildSkipRequest(options) {
86
115
  const { messages, conversationId, dataContext, requestPhase = 'initial_request', contextUser, dataSource, includeEntities = true, includeQueries = true, includeNotes = true, includeRequests = false, forceEntityRefresh = false, includeCallbackAuth = true, payload } = options;
116
+ // Build base request with metadata
87
117
  const baseRequest = await this.buildBaseRequest(contextUser, dataSource, includeEntities, includeQueries, includeNotes, includeRequests, forceEntityRefresh, includeCallbackAuth, { conversationId, requestPhase });
118
+ // Build artifacts for this conversation
88
119
  const artifacts = await this.buildArtifacts(contextUser, dataSource, conversationId);
120
+ // Process messages: filter delegation messages and enrich with metadata
89
121
  const processedMessages = this.processMessages(messages);
122
+ // Construct the full Skip API request
90
123
  const request = {
91
124
  messages: processedMessages,
92
125
  conversationID: conversationId,
93
126
  dataContext: dataContext ? CopyScalarsAndArrays(dataContext) : undefined,
94
127
  requestPhase,
95
128
  artifacts,
96
- payload,
129
+ payload, // Pass through payload for incremental artifact building (e.g., PRD in progress)
97
130
  entities: baseRequest.entities || [],
98
131
  queries: baseRequest.queries || [],
99
132
  notes: baseRequest.notes,
@@ -108,10 +141,15 @@ export class SkipSDK {
108
141
  };
109
142
  return request;
110
143
  }
144
+ /**
145
+ * Build base request with metadata, API keys, and callback auth
146
+ */
111
147
  async buildBaseRequest(contextUser, dataSource, includeEntities, includeQueries, includeNotes, includeRequests, forceEntityRefresh, includeCallbackAuth, additionalTokenInfo = {}) {
112
148
  const entities = includeEntities ? await this.buildEntities(dataSource, forceEntityRefresh) : [];
113
149
  const queries = includeQueries ? this.buildQueries() : [];
114
150
  const { notes, noteTypes } = includeNotes ? await this.buildAgentNotes(contextUser) : { notes: [], noteTypes: [] };
151
+ // Note: requests would be built here if includeRequests is true
152
+ // Setup access token for Skip callbacks if needed
115
153
  let accessToken;
116
154
  if (includeCallbackAuth) {
117
155
  const tokenInfo = {
@@ -121,7 +159,8 @@ export class SkipSDK {
121
159
  userID: contextUser.ID,
122
160
  ...additionalTokenInfo
123
161
  };
124
- accessToken = registerAccessToken(undefined, 1000 * 60 * 10, tokenInfo);
162
+ accessToken = registerAccessToken(undefined, 1000 * 60 * 10, // 10 minutes
163
+ tokenInfo);
125
164
  }
126
165
  return {
127
166
  entities,
@@ -137,10 +176,15 @@ export class SkipSDK {
137
176
  callingServerAccessToken: accessToken ? accessToken.Token : undefined
138
177
  };
139
178
  }
179
+ /**
180
+ * Build entity metadata for Skip
181
+ * Copied from AskSkipResolver.BuildSkipEntities - uses cached metadata with refresh logic
182
+ */
140
183
  async buildEntities(dataSource, forceRefresh, refreshIntervalMinutes = 15) {
141
184
  try {
142
185
  const now = Date.now();
143
186
  const cacheExpired = (now - SkipSDK.__lastRefreshTime) > (refreshIntervalMinutes * 60 * 1000);
187
+ // If force refresh is requested OR cache expired OR cache is empty, refresh
144
188
  if (forceRefresh || cacheExpired || SkipSDK.__skipEntitiesCache$.value === null) {
145
189
  LogStatus(`[SkipSDK] Refreshing Skip entities cache (force: ${forceRefresh}, expired: ${cacheExpired})`);
146
190
  const newData = this.refreshSkipEntities(dataSource);
@@ -153,6 +197,9 @@ export class SkipSDK {
153
197
  return [];
154
198
  }
155
199
  }
200
+ /**
201
+ * Build saved queries for Skip
202
+ */
156
203
  buildQueries(status = 'Approved') {
157
204
  const md = new Metadata();
158
205
  const approvedQueries = md.Queries.filter((q) => q.Status === status);
@@ -208,6 +255,9 @@ export class SkipSDK {
208
255
  CacheValidationSQL: q.CacheValidationSQL
209
256
  }));
210
257
  }
258
+ /**
259
+ * Recursively build category path for a query
260
+ */
211
261
  buildQueryCategoryPath(md, categoryID) {
212
262
  const cat = md.QueryCategories.find((c) => c.ID === categoryID);
213
263
  if (!cat)
@@ -217,33 +267,53 @@ export class SkipSDK {
217
267
  const parentPath = this.buildQueryCategoryPath(md, cat.ParentID);
218
268
  return parentPath ? `${parentPath}/${cat.Name}` : cat.Name;
219
269
  }
270
+ /**
271
+ * Build agent notes for Skip
272
+ */
220
273
  async buildAgentNotes(contextUser) {
274
+ // TODO: Implement agent notes building
275
+ // This would query AIAgentNote entities and convert to SkipAPIAgentNote format
276
+ // For now, returning empty arrays
221
277
  return { notes: [], noteTypes: [] };
222
278
  }
279
+ /**
280
+ * Build artifacts for a conversation using optimized query
281
+ * Uses GetConversationArtifactsForAgent query which joins through ConversationDetailArtifact
282
+ * to get artifacts that were outputs from Skip agent's conversation details
283
+ */
223
284
  async buildArtifacts(contextUser, dataSource, conversationId) {
224
285
  try {
225
286
  const rq = new RunQuery();
287
+ // Ensure AIEngine is configured and get Skip agent ID
226
288
  await AIEngine.Instance.Config(false, contextUser);
227
289
  const skipAgent = AIEngine.Instance.GetAgentByName('Skip');
228
290
  const skipAgentId = skipAgent?.ID;
229
291
  if (!skipAgentId) {
230
292
  LogError('[SkipSDK] Skip agent not found in AIEngine');
231
293
  }
294
+ // Use optimized query that replaces 4 RunView calls with 1 query
295
+ // This query includes Configuration field needed for component spec extraction
296
+ // Filter by Skip agent ID to only get artifacts created by Skip (not delegation agents)
232
297
  const result = await rq.RunQuery({
233
298
  QueryName: 'GetConversationArtifactsForAgent',
234
299
  CategoryPath: 'MJ/Conversations',
235
300
  Parameters: {
236
301
  ConversationID: conversationId,
237
- AgentID: skipAgentId
302
+ AgentID: skipAgentId // Filter to only artifacts created by Skip agent
238
303
  }
239
304
  }, contextUser);
240
305
  if (!result.Success || !result.Results || result.Results.length === 0) {
241
306
  return [];
242
307
  }
308
+ // Query returns flat result set: one row per artifact version
309
+ // Group by ArtifactID to build SkipAPIArtifact objects with their versions
243
310
  const artifactMap = new Map();
311
+ // Process each row (represents one version)
244
312
  for (const row of result.Results) {
245
313
  const artifactId = row.ArtifactID;
314
+ // Initialize artifact entry if not exists
246
315
  if (!artifactMap.has(artifactId)) {
316
+ // Map database sharingScope values to SkipAPIArtifact expected values
247
317
  let sharingScope = 'None';
248
318
  const dbSharingScope = (row.SharingScope || '').toLowerCase();
249
319
  if (dbSharingScope === 'always' || dbSharingScope === 'everyone') {
@@ -278,11 +348,12 @@ export class SkipSDK {
278
348
  versions: []
279
349
  });
280
350
  }
351
+ // Add this version to the artifact
281
352
  const entry = artifactMap.get(artifactId);
282
353
  entry.versions.push({
283
354
  id: row.VersionID,
284
355
  artifactId: artifactId,
285
- conversationDetailID: row.ConversationDetailID,
356
+ conversationDetailID: row.ConversationDetailID, // Direct from join table!
286
357
  version: row.Version,
287
358
  configuration: row.Configuration || '',
288
359
  content: row.Content || '',
@@ -291,6 +362,7 @@ export class SkipSDK {
291
362
  updatedAt: new Date(row.VersionUpdatedAt)
292
363
  });
293
364
  }
365
+ // Convert map to SkipAPIArtifact array
294
366
  const artifacts = Array.from(artifactMap.values()).map(entry => ({
295
367
  ...entry.artifact,
296
368
  artifactType: entry.artifactType,
@@ -303,6 +375,9 @@ export class SkipSDK {
303
375
  return [];
304
376
  }
305
377
  }
378
+ /**
379
+ * Build API keys for AI services
380
+ */
306
381
  buildAPIKeys() {
307
382
  return [
308
383
  {
@@ -331,20 +406,30 @@ export class SkipSDK {
331
406
  }
332
407
  ];
333
408
  }
409
+ /**
410
+ * Build HTTP headers for Skip API requests
411
+ */
334
412
  buildHeaders() {
335
413
  return {
336
414
  'x-api-key': this.config.apiKey || '',
337
415
  'Content-Type': 'application/json'
338
416
  };
339
417
  }
418
+ /**
419
+ * Refreshes the Skip entities cache
420
+ * Rebuilds the entity information that is provided to Skip
421
+ * Copied from AskSkipResolver.refreshSkipEntities
422
+ */
340
423
  async refreshSkipEntities(dataSource) {
341
424
  try {
342
425
  const md = new Metadata();
426
+ // Diagnostic logging
343
427
  LogStatus(`[SkipSDK.refreshSkipEntities] Total entities in metadata: ${md.Entities.length}`);
344
428
  LogStatus(`[SkipSDK.refreshSkipEntities] Config excludeSchemas: ${JSON.stringify(configInfo.askSkip?.entitiesToSend?.excludeSchemas)}`);
345
429
  LogStatus(`[SkipSDK.refreshSkipEntities] Config includeEntitiesFromExcludedSchemas: ${JSON.stringify(configInfo.askSkip?.entitiesToSend?.includeEntitiesFromExcludedSchemas)}`);
346
430
  const skipSpecialIncludeEntities = (configInfo.askSkip?.entitiesToSend?.includeEntitiesFromExcludedSchemas ?? [])
347
431
  .map((e) => e.trim().toLowerCase());
432
+ // Get the list of entities
348
433
  const entities = md.Entities.filter((e) => {
349
434
  if (!(configInfo.askSkip?.entitiesToSend?.excludeSchemas ?? []).includes(e.SchemaName) ||
350
435
  skipSpecialIncludeEntities.includes(e.Name.trim().toLowerCase())) {
@@ -354,7 +439,7 @@ export class SkipSDK {
354
439
  return !scopes || scopes.length === 0 || scopes.includes('all') || scopes.includes('ai') || skipSpecialIncludeEntities.includes(e.Name.trim().toLowerCase());
355
440
  }
356
441
  else {
357
- return true;
442
+ return true; // no scope, so include it
358
443
  }
359
444
  }
360
445
  return false;
@@ -363,9 +448,10 @@ export class SkipSDK {
363
448
  if (entities.length === 0) {
364
449
  LogError(`[SkipSDK.refreshSkipEntities] WARNING: No entities passed filtering! This will result in empty Skip entities list.`);
365
450
  }
451
+ // Now we have our list of entities, pack em up
366
452
  const result = await Promise.all(entities.map((e) => this.packSingleSkipEntityInfo(e, dataSource)));
367
453
  LogStatus(`[SkipSDK.refreshSkipEntities] Successfully packed ${result.length} entities for Skip`);
368
- SkipSDK.__lastRefreshTime = Date.now();
454
+ SkipSDK.__lastRefreshTime = Date.now(); // Update last refresh time
369
455
  return result;
370
456
  }
371
457
  catch (e) {
@@ -373,6 +459,11 @@ export class SkipSDK {
373
459
  return [];
374
460
  }
375
461
  }
462
+ /**
463
+ * Packs information about a single entity for Skip
464
+ * Includes fields, relationships, and sample data
465
+ * Copied from AskSkipResolver.PackSingleSkipEntityInfo
466
+ */
376
467
  async packSingleSkipEntityInfo(e, dataSource) {
377
468
  try {
378
469
  const ret = {
@@ -382,6 +473,7 @@ export class SkipSDK {
382
473
  baseView: e.BaseView,
383
474
  description: e.Description,
384
475
  fields: await Promise.all(e.Fields.filter(f => {
476
+ // we want to check the scopes for the field level and make sure it is either All or AI or has both
385
477
  const scopes = f.ScopeDefault?.split(',').map((s) => s.trim().toLowerCase());
386
478
  return !scopes || scopes.length === 0 || scopes.includes('all') || scopes.includes('ai');
387
479
  }).map(f => {
@@ -398,6 +490,11 @@ export class SkipSDK {
398
490
  return null;
399
491
  }
400
492
  }
493
+ /**
494
+ * Packs information about a single entity relationship
495
+ * These relationships help Skip understand the data model
496
+ * Copied from AskSkipResolver.PackSingleSkipEntityRelationship
497
+ */
401
498
  packSingleSkipEntityRelationship(r) {
402
499
  try {
403
500
  return {
@@ -420,6 +517,11 @@ export class SkipSDK {
420
517
  return null;
421
518
  }
422
519
  }
520
+ /**
521
+ * Packs information about a single entity field
522
+ * Includes metadata and possible values
523
+ * Copied from AskSkipResolver.PackSingleSkipEntityField
524
+ */
423
525
  async packSingleSkipEntityField(f, dataSource) {
424
526
  try {
425
527
  return {
@@ -458,23 +560,34 @@ export class SkipSDK {
458
560
  return null;
459
561
  }
460
562
  }
563
+ /**
564
+ * Packs possible values for an entity field
565
+ * These values help Skip understand the domain and valid values for fields
566
+ * Copied from AskSkipResolver.PackFieldPossibleValues
567
+ */
461
568
  async packFieldPossibleValues(f, dataSource) {
462
569
  try {
463
570
  if (f.ValuesToPackWithSchema === 'None') {
464
- return [];
571
+ return []; // don't pack anything
465
572
  }
466
573
  else if (f.ValuesToPackWithSchema === 'All') {
574
+ // wants ALL of the distinct values
467
575
  return await this.getFieldDistinctValues(f, dataSource);
468
576
  }
469
577
  else if (f.ValuesToPackWithSchema === 'Auto') {
578
+ // default setting - pack based on the ValueListType
470
579
  if (f.ValueListTypeEnum === 'List') {
580
+ // simple list of values in the Entity Field Values table
471
581
  return f.EntityFieldValues.map((v) => {
472
582
  return { value: v.Value, displayValue: v.Value };
473
583
  });
474
584
  }
475
585
  else if (f.ValueListTypeEnum === 'ListOrUserEntry') {
586
+ // could be a user provided value, OR the values in the list of possible values.
587
+ // get the distinct list of values from the DB and concat that with the f.EntityFieldValues array - deduped and return
476
588
  const values = await this.getFieldDistinctValues(f, dataSource);
477
589
  if (!values || values.length === 0) {
590
+ // no result, just return the EntityFieldValues
478
591
  return f.EntityFieldValues.map((v) => {
479
592
  return { value: v.Value, displayValue: v.Value };
480
593
  });
@@ -486,13 +599,18 @@ export class SkipSDK {
486
599
  }
487
600
  }
488
601
  }
489
- return [];
602
+ return []; // if we get here, nothing to pack
490
603
  }
491
604
  catch (e) {
492
605
  LogError(`[SkipSDK] packFieldPossibleValues error: ${e}`);
493
606
  return [];
494
607
  }
495
608
  }
609
+ /**
610
+ * Gets distinct values for a field from the database
611
+ * Used to provide Skip with information about the possible values
612
+ * Copied from AskSkipResolver.GetFieldDistinctValues
613
+ */
496
614
  async getFieldDistinctValues(f, dataSource) {
497
615
  try {
498
616
  const sql = `SELECT DISTINCT ${f.Name} FROM ${f.SchemaName}.${f.BaseView}`;
@@ -515,10 +633,18 @@ export class SkipSDK {
515
633
  return [];
516
634
  }
517
635
  }
636
+ /**
637
+ * Process messages: filter delegation messages and add metadata fields
638
+ * Messages coming in should already have conversationDetailID if they exist in the database
639
+ */
518
640
  processMessages(messages) {
641
+ // Filter out delegation messages (administrative messages that shouldn't go to Skip)
519
642
  const filteredMessages = messages.filter(msg => !this.isDelegationMessage(msg.content));
643
+ // Enrich messages with default metadata if not already present
520
644
  return filteredMessages.map(msg => ({
521
645
  ...msg,
646
+ // Add default metadata fields if not already present
647
+ // Messages from DB already have conversationDetailID, temp messages get temp-X
522
648
  hiddenToUser: msg.hiddenToUser ?? false,
523
649
  userRating: msg.userRating ?? null,
524
650
  userFeedback: msg.userFeedback ?? null,
@@ -526,10 +652,15 @@ export class SkipSDK {
526
652
  summaryOfEarlierConveration: msg.summaryOfEarlierConveration ?? null
527
653
  }));
528
654
  }
655
+ /**
656
+ * Check if a message is a delegation message that should be filtered out
657
+ * Uses flexible pattern matching to detect variations of delegation messages
658
+ */
529
659
  isDelegationMessage(content) {
530
660
  if (!content)
531
661
  return false;
532
662
  const lowerContent = content.toLowerCase();
663
+ // Check for both "delegating" or "delegate" AND "skip" in any order
533
664
  const hasDelegatingOrDelegate = lowerContent.includes('delegating') || lowerContent.includes('delegate');
534
665
  const hasSkip = lowerContent.includes('skip');
535
666
  return hasDelegatingOrDelegate && hasSkip;