khoros-aurora-sdk 26.1.2 → 26.2.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.
@@ -1 +1 @@
1
- * @lithiumtech/eng-khoros-community-dev
1
+ * @lithiumtech/eng-khoros-community-admin
@@ -1,12 +1,11 @@
1
1
  # This workflow will publish a package to NPM Packages when a release is created
2
- # Uses OIDC Trusted Publishing - no npm token required
3
- # Setup: Configure trusted publisher at https://www.npmjs.com/package/khoros-aurora-sdk/access
4
2
 
5
3
  name: Node.js Package
6
4
 
7
5
  on:
8
6
  release:
9
7
  types: [created, edited]
8
+ workflow_dispatch:
10
9
 
11
10
  jobs:
12
11
  publish-npm:
@@ -18,14 +17,9 @@ jobs:
18
17
  - uses: actions/checkout@v4
19
18
  - uses: actions/setup-node@v4
20
19
  with:
21
- node-version: '22.x'
20
+ node-version: '24.x'
22
21
  registry-url: https://registry.npmjs.org/
23
- - name: Upgrade npm for OIDC support
24
- run: npm install -g npm@latest
25
- - name: Verify npm version
26
- run: npm --version
27
22
  - name: Publish to npm
28
- # Note: --provenance requires public repo, removed for internal/private repos
29
23
  run: |
30
24
  if [[ "${{ github.event.release.prerelease }}" == "true" ]]; then
31
25
  npm publish --access public --tag pre
package/CHANGELOG.md CHANGED
@@ -1,12 +1,5 @@
1
1
  ### CHANGE LOG
2
2
 
3
- **26.1.0-pre.2**
4
-
5
- - Fixed ESLint resolver interface compatibility issue that caused build failures in CI environments
6
- - Updated `eslint-import-resolver-typescript` from 3.6.3 to 3.8.1
7
- - Resolves compatibility issue with `eslint-plugin-import@2.32.0`
8
- - Fixes error: "EslintPluginImportResolveError: Error while loading rule 'import/no-cycle': typescript with invalid interface loaded as resolver"
9
-
10
3
  **25.4.0-rc.2**
11
4
 
12
5
  - Added the following bootstrap components:
package/build-hash.txt CHANGED
@@ -1 +1 @@
1
- 80958f1
1
+ dfcfbdc
@@ -0,0 +1,317 @@
1
+ # AI Moderation Dashboard GraphQL Schema
2
+ # Provides queries for the AI moderation insights dashboard
3
+
4
+ extend type Query {
5
+ """
6
+ Get comprehensive AI moderation dashboard data for a time range.
7
+ Returns summary statistics, accuracy metrics, daily trends, and provider comparison.
8
+ """
9
+ aiModerationDashboard(
10
+ "Start time (epoch milliseconds)"
11
+ startTime: Long!
12
+
13
+ "End time (epoch milliseconds)"
14
+ endTime: Long!
15
+
16
+ "Optional: Filter by specific provider"
17
+ provider: String
18
+ ): AIModerationDashboard!
19
+
20
+ """
21
+ Get recommendations for improving AI moderation accuracy.
22
+ Analyzes recent data and suggests threshold adjustments, provider changes, etc.
23
+ """
24
+ aiModerationRecommendations(
25
+ "Lookback period in days (default: 30)"
26
+ lookbackDays: Int
27
+ ): AIModerationRecommendations!
28
+ }
29
+
30
+ extend type Mutation {
31
+ """
32
+ Manually trigger AI moderation metrics aggregation.
33
+ Runs the aggregation service immediately and resets the timer.
34
+ Admin-only operation.
35
+ """
36
+ refreshAIModerationMetrics: AIModerationMetricsRefreshResult!
37
+ }
38
+
39
+ """
40
+ Result of manual metrics refresh operation.
41
+ """
42
+ type AIModerationMetricsRefreshResult {
43
+ "Whether the refresh was successful"
44
+ success: Boolean!
45
+
46
+ "Number of hour buckets processed"
47
+ hoursProcessed: Int!
48
+
49
+ "Timestamp when refresh completed (epoch ms)"
50
+ completedAt: Long!
51
+
52
+ "Message describing the result"
53
+ message: String!
54
+ }
55
+
56
+ """
57
+ Complete dashboard data including summary, metrics, trends, and comparisons.
58
+ """
59
+ type AIModerationDashboard {
60
+ "Overall summary statistics for the time range"
61
+ summary: AIModerationDashboardSummary!
62
+
63
+ "Hourly accuracy metrics (precision, recall, F1, etc.)"
64
+ accuracyMetrics: [AIModerationAccuracyMetric!]!
65
+
66
+ "Daily aggregated statistics"
67
+ dailyStats: [AIModerationDailyStats!]!
68
+
69
+ "Provider performance comparison"
70
+ providerComparison: [AIModerationProviderStats!]!
71
+
72
+ "Time range for this data"
73
+ timeRange: TimeRange!
74
+ }
75
+
76
+ """
77
+ Summary statistics aggregated across the entire time range.
78
+ """
79
+ type AIModerationDashboardSummary {
80
+ "Total AI moderation requests processed"
81
+ totalRequests: Int!
82
+
83
+ "Total human feedback records (ground truth)"
84
+ totalFeedback: Int!
85
+
86
+ "Overall accuracy (0.0 - 1.0)"
87
+ overallAccuracy: Float
88
+
89
+ "Average precision across all hours"
90
+ avgPrecision: Float
91
+
92
+ "Average recall across all hours"
93
+ avgRecall: Float
94
+
95
+ "Average F1 score"
96
+ avgF1Score: Float
97
+
98
+ "Average moderation latency (ms)"
99
+ avgLatencyMs: Int
100
+
101
+ "95th percentile latency (ms)"
102
+ p95LatencyMs: Int
103
+
104
+ "Total errors"
105
+ totalErrors: Int
106
+
107
+ "Error rate (0.0 - 1.0)"
108
+ errorRate: Float
109
+
110
+ "Total cost in USD (V1_5)"
111
+ totalCostUsd: Float
112
+
113
+ "Average cost per request in USD"
114
+ avgCostPerRequest: Float
115
+ }
116
+
117
+ """
118
+ Hourly accuracy metrics with confusion matrix and calculated scores.
119
+ """
120
+ type AIModerationAccuracyMetric {
121
+ "Time bucket (ISO 8601 datetime)"
122
+ timeBucket: String!
123
+
124
+ "AI provider name"
125
+ provider: String!
126
+
127
+ "Total AI verdicts in this hour"
128
+ totalVerdicts: Int!
129
+
130
+ "Total human feedback received"
131
+ totalFeedback: Int!
132
+
133
+ "True positives (AI rejected, human confirmed)"
134
+ truePositives: Int!
135
+
136
+ "False positives (AI rejected, human approved)"
137
+ falsePositives: Int!
138
+
139
+ "True negatives (AI approved, human confirmed)"
140
+ trueNegatives: Int!
141
+
142
+ "False negatives (AI approved, human rejected)"
143
+ falseNegatives: Int!
144
+
145
+ "Precision score (0.0 - 1.0)"
146
+ precision: Float
147
+
148
+ "Recall score (0.0 - 1.0)"
149
+ recall: Float
150
+
151
+ "F1 score (0.0 - 1.0)"
152
+ f1Score: Float
153
+
154
+ "Accuracy score (0.0 - 1.0)"
155
+ accuracy: Float
156
+
157
+ "Average latency (ms)"
158
+ avgLatencyMs: Int
159
+
160
+ "Median latency (ms)"
161
+ p50LatencyMs: Int
162
+
163
+ "95th percentile latency (ms)"
164
+ p95LatencyMs: Int
165
+
166
+ "99th percentile latency (ms)"
167
+ p99LatencyMs: Int
168
+ }
169
+
170
+ """
171
+ Daily aggregated statistics for trend analysis.
172
+ """
173
+ type AIModerationDailyStats {
174
+ "Date (YYYY-MM-DD)"
175
+ date: String!
176
+
177
+ "Total requests on this day"
178
+ totalRequests: Int!
179
+
180
+ "Number rejected"
181
+ rejectedCount: Int!
182
+
183
+ "Number accepted"
184
+ acceptedCount: Int!
185
+
186
+ "Average confidence score"
187
+ avgConfidence: Float
188
+
189
+ "Average latency (ms)"
190
+ avgLatencyMs: Int
191
+
192
+ "Total errors"
193
+ errorCount: Int
194
+ }
195
+
196
+ """
197
+ Provider performance comparison statistics.
198
+ """
199
+ type AIModerationProviderStats {
200
+ "Provider name (OPENAI, ANTHROPIC, etc.)"
201
+ provider: String!
202
+
203
+ "Total requests processed"
204
+ totalRequests: Int!
205
+
206
+ "Total feedback received"
207
+ totalFeedback: Int!
208
+
209
+ "Overall accuracy (0.0 - 1.0)"
210
+ overallAccuracy: Float
211
+
212
+ "Overall precision (0.0 - 1.0)"
213
+ overallPrecision: Float
214
+
215
+ "Overall recall (0.0 - 1.0)"
216
+ overallRecall: Float
217
+
218
+ "Average latency (ms)"
219
+ avgLatencyMs: Int
220
+
221
+ "95th percentile latency (ms)"
222
+ p95LatencyMs: Int
223
+
224
+ "Error rate (0.0 - 1.0)"
225
+ errorRate: Float
226
+
227
+ "Total tokens consumed"
228
+ totalTokens: Long
229
+
230
+ "Average tokens per request"
231
+ avgTokensPerRequest: Int
232
+
233
+ "Total cost in USD (V1_5)"
234
+ totalCostUsd: Float
235
+
236
+ "Average cost per request in USD"
237
+ avgCostPerRequest: Float
238
+
239
+ "Cost per accurate verdict (V1_5)"
240
+ costPerAccurateVerdict: Float
241
+ }
242
+
243
+ # Note: Using existing TimeRange type from metricSchema.graphqls
244
+
245
+ """
246
+ Recommendations for improving AI moderation.
247
+ """
248
+ type AIModerationRecommendations {
249
+ "List of actionable recommendations"
250
+ recommendations: [AIModerationRecommendation!]!
251
+
252
+ "Analysis metadata"
253
+ analysis: RecommendationAnalysis!
254
+ }
255
+
256
+ """
257
+ Individual recommendation with priority and expected impact.
258
+ """
259
+ type AIModerationRecommendation {
260
+ "Unique recommendation ID"
261
+ id: String!
262
+
263
+ "Recommendation type (THRESHOLD, PROVIDER, ERROR_INVESTIGATION, etc.)"
264
+ type: RecommendationType!
265
+
266
+ "Priority level"
267
+ priority: RecommendationPriority!
268
+
269
+ "Title (short description)"
270
+ title: String!
271
+
272
+ "Detailed description and rationale"
273
+ description: String!
274
+
275
+ "Expected impact description"
276
+ expectedImpact: String
277
+
278
+ "Supporting data/metrics"
279
+ supportingData: JSON
280
+ }
281
+
282
+ """
283
+ Analysis metadata for recommendations.
284
+ """
285
+ type RecommendationAnalysis {
286
+ "Analysis timestamp (epoch ms)"
287
+ timestamp: Long!
288
+
289
+ "Lookback period (days)"
290
+ lookbackDays: Int!
291
+
292
+ "Sample size (total requests analyzed)"
293
+ sampleSize: Int!
294
+
295
+ "Confidence level (HIGH, MEDIUM, LOW)"
296
+ confidence: String!
297
+ }
298
+
299
+ """
300
+ Recommendation type enum.
301
+ """
302
+ enum RecommendationType {
303
+ THRESHOLD_ADJUSTMENT
304
+ PROVIDER_SWITCH
305
+ ERROR_INVESTIGATION
306
+ PERFORMANCE_TUNING
307
+ COST_OPTIMIZATION
308
+ }
309
+
310
+ """
311
+ Recommendation priority enum.
312
+ """
313
+ enum RecommendationPriority {
314
+ HIGH
315
+ MEDIUM
316
+ LOW
317
+ }
@@ -0,0 +1,144 @@
1
+ extend type Query {
2
+ """
3
+ Fetches a paginated list of AI Answer logs for transparency and debugging.
4
+ Logs all /clmsearch endpoint invocations.
5
+ """
6
+ aiAnswerLogs(
7
+ "Constraints to filter the AI answer logs."
8
+ constraints: AiAnswerLogConstraints
9
+
10
+ "The number of results to return (first N)."
11
+ first: Int
12
+
13
+ "The cursor to return results after."
14
+ after: String
15
+
16
+ "The number of results to return (last N)."
17
+ last: Int
18
+
19
+ "The cursor to return results before."
20
+ before: String
21
+ ): AiAnswerLogConnection!
22
+ }
23
+
24
+ """
25
+ Defines an AI Answer log entry from the /clmsearch endpoint.
26
+ """
27
+ type AiAnswerLog {
28
+ "Unique identifier for this log entry."
29
+ id: ID!
30
+
31
+ "The original search query text."
32
+ queryText: String!
33
+
34
+ "UID of the original community message that triggered the search."
35
+ messageUid: Int
36
+
37
+ "Subject/title of the original message."
38
+ messageSubject: String
39
+
40
+ "Board display ID for URL construction."
41
+ boardId: String
42
+
43
+ "UID of the AI-generated reply message."
44
+ answerMessageUid: Int
45
+
46
+ "Whether the query was classified as a valid question."
47
+ isQuery: Boolean!
48
+
49
+ "Whether an AI answer was successfully generated."
50
+ aiAnswerGenerated: Boolean!
51
+
52
+ "Whether an Expert Recommendation Card was generated."
53
+ expertCardGenerated: Boolean!
54
+
55
+ "The calculated answer confidence score (0.0-1.0)."
56
+ confidenceScore: Float
57
+
58
+ "The confidence threshold setting at the time of query (0.0-1.0)."
59
+ confidenceThreshold: Float
60
+
61
+ "Score distribution factor (0.0-1.0) - measures consistency across top-K results (40% weight)."
62
+ scoreDistribution: Float
63
+
64
+ "Author authority factor (0.0-1.0) - measures expertise of citation authors (25% weight)."
65
+ authorAuthority: Float
66
+
67
+ "Temporal recency factor (0.0-1.0) - measures age of cited content (15% weight)."
68
+ temporalRecency: Float
69
+
70
+ "Answer quality factor (0.0-1.0) - measures citation usage and verification (20% weight)."
71
+ answerQuality: Float
72
+
73
+ "Number of citations provided to the LLM for answer generation."
74
+ citationsProvided: Int
75
+
76
+ "Number of citations actually referenced in the generated answer."
77
+ citationsUsed: Int
78
+
79
+ "Citation coverage ratio (0.0-1.0) - citations used divided by citations provided."
80
+ citationCoverage: Float
81
+
82
+ "Reasons why AI answer was not generated (can be multiple)."
83
+ noAnswerReasons: [String!]
84
+
85
+ "When this query was processed."
86
+ processedAt: DateTime!
87
+
88
+ "Embedding model used for query vectorization (format: provider|model)."
89
+ embeddingModel: String
90
+
91
+ "Generation model used for answer creation (format: provider|model)."
92
+ generationModel: String
93
+ }
94
+
95
+ """
96
+ Connection object for paginated AI Answer log results.
97
+ """
98
+ type AiAnswerLogConnection {
99
+ "Total count of results across all pages."
100
+ totalCount: Int!
101
+
102
+ "Pagination information."
103
+ pageInfo: PageInfo!
104
+
105
+ "The log entries."
106
+ edges: [AiAnswerLogEdge!]!
107
+ }
108
+
109
+ """
110
+ Edge type for AI Answer log results with cursor.
111
+ """
112
+ type AiAnswerLogEdge implements Edge {
113
+ "Cursor for pagination."
114
+ cursor: String
115
+
116
+ "The AI Answer log entry."
117
+ node: AiAnswerLog!
118
+ }
119
+
120
+ """
121
+ Constraints for filtering AI Answer logs.
122
+ """
123
+ input AiAnswerLogConstraints {
124
+ "Filter by date range."
125
+ dateRange: DateTimeGtLtConstraint
126
+
127
+ "Filter by whether query was classified as a question."
128
+ isQuery: Boolean
129
+
130
+ "Filter by whether AI answer was generated."
131
+ aiAnswerGenerated: Boolean
132
+
133
+ "Filter by whether expert card was generated."
134
+ expertCardGenerated: Boolean
135
+
136
+ "Filter by specific no-answer reasons (matches any in the list)."
137
+ noAnswerReasons: [String!]
138
+
139
+ "Filter by minimum confidence score (0.0-1.0)."
140
+ confidenceScoreMin: Float
141
+
142
+ "Filter by maximum confidence score (0.0-1.0)."
143
+ confidenceScoreMax: Float
144
+ }
@@ -360,6 +360,7 @@ enum ModerationStatus {
360
360
  MARKED_UNDECIDED
361
361
  MARKED_APPROVED
362
362
  MARKED_REJECTED
363
+ APPEALED
363
364
  }
364
365
 
365
366
  """