@fatagnus/convex-feedback 0.1.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 (78) hide show
  1. package/LICENSE +177 -0
  2. package/README.md +382 -0
  3. package/dist/convex/agents/bugReportAgent.d.ts +30 -0
  4. package/dist/convex/agents/bugReportAgent.d.ts.map +1 -0
  5. package/dist/convex/agents/bugReportAgent.js +243 -0
  6. package/dist/convex/agents/bugReportAgent.js.map +1 -0
  7. package/dist/convex/agents/feedbackAgent.d.ts +29 -0
  8. package/dist/convex/agents/feedbackAgent.d.ts.map +1 -0
  9. package/dist/convex/agents/feedbackAgent.js +232 -0
  10. package/dist/convex/agents/feedbackAgent.js.map +1 -0
  11. package/dist/convex/bugReports.d.ts +49 -0
  12. package/dist/convex/bugReports.d.ts.map +1 -0
  13. package/dist/convex/bugReports.js +321 -0
  14. package/dist/convex/bugReports.js.map +1 -0
  15. package/dist/convex/convex.config.d.ts +3 -0
  16. package/dist/convex/convex.config.d.ts.map +1 -0
  17. package/dist/convex/convex.config.js +6 -0
  18. package/dist/convex/convex.config.js.map +1 -0
  19. package/dist/convex/emails/bugReportEmails.d.ts +16 -0
  20. package/dist/convex/emails/bugReportEmails.d.ts.map +1 -0
  21. package/dist/convex/emails/bugReportEmails.js +403 -0
  22. package/dist/convex/emails/bugReportEmails.js.map +1 -0
  23. package/dist/convex/emails/feedbackEmails.d.ts +16 -0
  24. package/dist/convex/emails/feedbackEmails.d.ts.map +1 -0
  25. package/dist/convex/emails/feedbackEmails.js +389 -0
  26. package/dist/convex/emails/feedbackEmails.js.map +1 -0
  27. package/dist/convex/feedback.d.ts +49 -0
  28. package/dist/convex/feedback.d.ts.map +1 -0
  29. package/dist/convex/feedback.js +327 -0
  30. package/dist/convex/feedback.js.map +1 -0
  31. package/dist/convex/index.d.ts +10 -0
  32. package/dist/convex/index.d.ts.map +1 -0
  33. package/dist/convex/index.js +12 -0
  34. package/dist/convex/index.js.map +1 -0
  35. package/dist/convex/schema.d.ts +200 -0
  36. package/dist/convex/schema.d.ts.map +1 -0
  37. package/dist/convex/schema.js +150 -0
  38. package/dist/convex/schema.js.map +1 -0
  39. package/dist/convex/supportTeams.d.ts +29 -0
  40. package/dist/convex/supportTeams.d.ts.map +1 -0
  41. package/dist/convex/supportTeams.js +159 -0
  42. package/dist/convex/supportTeams.js.map +1 -0
  43. package/dist/index.d.ts +70 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +63 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/react/BugReportButton.d.ts +70 -0
  48. package/dist/react/BugReportButton.d.ts.map +1 -0
  49. package/dist/react/BugReportButton.js +371 -0
  50. package/dist/react/BugReportButton.js.map +1 -0
  51. package/dist/react/BugReportContext.d.ts +59 -0
  52. package/dist/react/BugReportContext.d.ts.map +1 -0
  53. package/dist/react/BugReportContext.js +107 -0
  54. package/dist/react/BugReportContext.js.map +1 -0
  55. package/dist/react/index.d.ts +36 -0
  56. package/dist/react/index.d.ts.map +1 -0
  57. package/dist/react/index.js +36 -0
  58. package/dist/react/index.js.map +1 -0
  59. package/dist/types.d.ts +89 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +5 -0
  62. package/dist/types.js.map +1 -0
  63. package/package.json +101 -0
  64. package/src/convex/agents/bugReportAgent.ts +277 -0
  65. package/src/convex/agents/feedbackAgent.ts +264 -0
  66. package/src/convex/bugReports.ts +350 -0
  67. package/src/convex/convex.config.ts +7 -0
  68. package/src/convex/emails/bugReportEmails.ts +479 -0
  69. package/src/convex/emails/feedbackEmails.ts +465 -0
  70. package/src/convex/feedback.ts +356 -0
  71. package/src/convex/index.ts +28 -0
  72. package/src/convex/schema.ts +207 -0
  73. package/src/convex/supportTeams.ts +179 -0
  74. package/src/index.ts +77 -0
  75. package/src/react/BugReportButton.tsx +755 -0
  76. package/src/react/BugReportContext.tsx +146 -0
  77. package/src/react/index.ts +46 -0
  78. package/src/types.ts +93 -0
@@ -0,0 +1,327 @@
1
+ import { v } from "convex/values";
2
+ import { mutation, query, internalMutation } from "./_generated/server";
3
+ import { internal } from "./_generated/api";
4
+ import { feedbackTypeValidator, feedbackPriorityValidator, feedbackStatusValidator, reporterTypeValidator, effortValidator, } from "./schema";
5
+ // Return type for feedback records
6
+ const feedbackReturnValidator = v.object({
7
+ _id: v.id("feedback"),
8
+ _creationTime: v.number(),
9
+ type: feedbackTypeValidator,
10
+ title: v.string(),
11
+ description: v.string(),
12
+ priority: feedbackPriorityValidator,
13
+ status: feedbackStatusValidator,
14
+ isArchived: v.optional(v.boolean()),
15
+ reporterType: reporterTypeValidator,
16
+ reporterId: v.string(),
17
+ reporterEmail: v.string(),
18
+ reporterName: v.string(),
19
+ url: v.string(),
20
+ route: v.optional(v.string()),
21
+ browserInfo: v.string(),
22
+ consoleErrors: v.optional(v.string()),
23
+ screenshotStorageId: v.optional(v.id("_storage")),
24
+ viewportWidth: v.number(),
25
+ viewportHeight: v.number(),
26
+ networkState: v.string(),
27
+ createdAt: v.number(),
28
+ updatedAt: v.number(),
29
+ // AI Analysis fields
30
+ aiSummary: v.optional(v.string()),
31
+ aiImpactAnalysis: v.optional(v.string()),
32
+ aiActionItems: v.optional(v.array(v.string())),
33
+ aiEstimatedEffort: v.optional(effortValidator),
34
+ aiSuggestedPriority: v.optional(feedbackPriorityValidator),
35
+ aiAnalyzedAt: v.optional(v.number()),
36
+ aiThreadId: v.optional(v.string()),
37
+ notificationsSentAt: v.optional(v.number()),
38
+ });
39
+ /**
40
+ * Create new feedback.
41
+ * This mutation is intentionally public (no auth required) because:
42
+ * 1. We want to capture feedback even when auth might be broken
43
+ * 2. The reporter info is passed explicitly from the client
44
+ */
45
+ export const create = mutation({
46
+ args: {
47
+ type: feedbackTypeValidator,
48
+ title: v.string(),
49
+ description: v.string(),
50
+ priority: feedbackPriorityValidator,
51
+ reporterType: reporterTypeValidator,
52
+ reporterId: v.string(),
53
+ reporterEmail: v.string(),
54
+ reporterName: v.string(),
55
+ url: v.string(),
56
+ route: v.optional(v.string()),
57
+ browserInfo: v.string(),
58
+ consoleErrors: v.optional(v.string()),
59
+ screenshotStorageId: v.optional(v.id("_storage")),
60
+ viewportWidth: v.number(),
61
+ viewportHeight: v.number(),
62
+ networkState: v.string(),
63
+ },
64
+ returns: v.id("feedback"),
65
+ handler: async (ctx, args) => {
66
+ const now = Date.now();
67
+ const feedbackId = await ctx.db.insert("feedback", {
68
+ type: args.type,
69
+ title: args.title,
70
+ description: args.description,
71
+ priority: args.priority,
72
+ status: "open",
73
+ reporterType: args.reporterType,
74
+ reporterId: args.reporterId,
75
+ reporterEmail: args.reporterEmail,
76
+ reporterName: args.reporterName,
77
+ url: args.url,
78
+ route: args.route,
79
+ browserInfo: args.browserInfo,
80
+ consoleErrors: args.consoleErrors,
81
+ screenshotStorageId: args.screenshotStorageId,
82
+ viewportWidth: args.viewportWidth,
83
+ viewportHeight: args.viewportHeight,
84
+ networkState: args.networkState,
85
+ createdAt: now,
86
+ updatedAt: now,
87
+ });
88
+ // Schedule AI analysis and email notifications (runs immediately)
89
+ try {
90
+ await ctx.scheduler.runAfter(0, internal.agents.feedbackAgent.processFeedback, {
91
+ feedbackId,
92
+ });
93
+ }
94
+ catch {
95
+ // AI agent not available, continue without analysis
96
+ console.log("AI agent not configured, skipping analysis");
97
+ }
98
+ return feedbackId;
99
+ },
100
+ });
101
+ /**
102
+ * List feedback with optional filters.
103
+ * By default, archived items are excluded unless includeArchived is true.
104
+ */
105
+ export const list = query({
106
+ args: {
107
+ status: v.optional(feedbackStatusValidator),
108
+ type: v.optional(feedbackTypeValidator),
109
+ priority: v.optional(feedbackPriorityValidator),
110
+ includeArchived: v.optional(v.boolean()),
111
+ limit: v.optional(v.number()),
112
+ },
113
+ returns: v.array(feedbackReturnValidator),
114
+ handler: async (ctx, args) => {
115
+ const limit = args.limit ?? 50;
116
+ const includeArchived = args.includeArchived ?? false;
117
+ let results;
118
+ if (args.status) {
119
+ const status = args.status;
120
+ results = await ctx.db
121
+ .query("feedback")
122
+ .withIndex("by_status", (q) => q.eq("status", status))
123
+ .order("desc")
124
+ .take(limit * 2);
125
+ }
126
+ else if (args.type) {
127
+ const type = args.type;
128
+ results = await ctx.db
129
+ .query("feedback")
130
+ .withIndex("by_type", (q) => q.eq("type", type))
131
+ .order("desc")
132
+ .take(limit * 2);
133
+ }
134
+ else if (args.priority) {
135
+ const priority = args.priority;
136
+ results = await ctx.db
137
+ .query("feedback")
138
+ .withIndex("by_priority", (q) => q.eq("priority", priority))
139
+ .order("desc")
140
+ .take(limit * 2);
141
+ }
142
+ else {
143
+ results = await ctx.db
144
+ .query("feedback")
145
+ .withIndex("by_created")
146
+ .order("desc")
147
+ .take(limit * 2);
148
+ }
149
+ // Filter out archived items unless includeArchived is true
150
+ if (!includeArchived) {
151
+ results = results.filter((r) => !r.isArchived);
152
+ }
153
+ return results.slice(0, limit);
154
+ },
155
+ });
156
+ /**
157
+ * Get a single feedback by ID.
158
+ */
159
+ export const get = query({
160
+ args: {
161
+ feedbackId: v.id("feedback"),
162
+ },
163
+ returns: v.union(feedbackReturnValidator, v.null()),
164
+ handler: async (ctx, args) => {
165
+ return await ctx.db.get(args.feedbackId);
166
+ },
167
+ });
168
+ /**
169
+ * Update feedback status.
170
+ */
171
+ export const updateStatus = mutation({
172
+ args: {
173
+ feedbackId: v.id("feedback"),
174
+ status: feedbackStatusValidator,
175
+ },
176
+ returns: v.null(),
177
+ handler: async (ctx, args) => {
178
+ const feedback = await ctx.db.get(args.feedbackId);
179
+ if (!feedback) {
180
+ throw new Error("Feedback not found");
181
+ }
182
+ await ctx.db.patch(args.feedbackId, {
183
+ status: args.status,
184
+ updatedAt: Date.now(),
185
+ });
186
+ return null;
187
+ },
188
+ });
189
+ /**
190
+ * Generate upload URL for screenshot.
191
+ */
192
+ export const generateUploadUrl = mutation({
193
+ args: {},
194
+ returns: v.string(),
195
+ handler: async (ctx) => {
196
+ return await ctx.storage.generateUploadUrl();
197
+ },
198
+ });
199
+ /**
200
+ * Get screenshot URL from storage ID.
201
+ */
202
+ export const getScreenshotUrl = query({
203
+ args: {
204
+ storageId: v.id("_storage"),
205
+ },
206
+ returns: v.union(v.string(), v.null()),
207
+ handler: async (ctx, args) => {
208
+ return await ctx.storage.getUrl(args.storageId);
209
+ },
210
+ });
211
+ /**
212
+ * Archive feedback.
213
+ */
214
+ export const archive = mutation({
215
+ args: {
216
+ feedbackId: v.id("feedback"),
217
+ },
218
+ returns: v.null(),
219
+ handler: async (ctx, args) => {
220
+ const feedback = await ctx.db.get(args.feedbackId);
221
+ if (!feedback) {
222
+ throw new Error("Feedback not found");
223
+ }
224
+ await ctx.db.patch(args.feedbackId, {
225
+ isArchived: true,
226
+ updatedAt: Date.now(),
227
+ });
228
+ return null;
229
+ },
230
+ });
231
+ /**
232
+ * Unarchive feedback.
233
+ */
234
+ export const unarchive = mutation({
235
+ args: {
236
+ feedbackId: v.id("feedback"),
237
+ },
238
+ returns: v.null(),
239
+ handler: async (ctx, args) => {
240
+ const feedback = await ctx.db.get(args.feedbackId);
241
+ if (!feedback) {
242
+ throw new Error("Feedback not found");
243
+ }
244
+ await ctx.db.patch(args.feedbackId, {
245
+ isArchived: false,
246
+ updatedAt: Date.now(),
247
+ });
248
+ return null;
249
+ },
250
+ });
251
+ /**
252
+ * Get AI analysis for a specific feedback.
253
+ */
254
+ export const getAiAnalysis = query({
255
+ args: {
256
+ feedbackId: v.id("feedback"),
257
+ },
258
+ returns: v.union(v.object({
259
+ aiSummary: v.union(v.string(), v.null()),
260
+ aiImpactAnalysis: v.union(v.string(), v.null()),
261
+ aiActionItems: v.union(v.array(v.string()), v.null()),
262
+ aiEstimatedEffort: v.union(effortValidator, v.null()),
263
+ aiSuggestedPriority: v.union(feedbackPriorityValidator, v.null()),
264
+ aiAnalyzedAt: v.union(v.number(), v.null()),
265
+ notificationsSentAt: v.union(v.number(), v.null()),
266
+ }), v.null()),
267
+ handler: async (ctx, args) => {
268
+ const feedback = await ctx.db.get(args.feedbackId);
269
+ if (!feedback) {
270
+ return null;
271
+ }
272
+ return {
273
+ aiSummary: feedback.aiSummary ?? null,
274
+ aiImpactAnalysis: feedback.aiImpactAnalysis ?? null,
275
+ aiActionItems: feedback.aiActionItems ?? null,
276
+ aiEstimatedEffort: feedback.aiEstimatedEffort ?? null,
277
+ aiSuggestedPriority: feedback.aiSuggestedPriority ?? null,
278
+ aiAnalyzedAt: feedback.aiAnalyzedAt ?? null,
279
+ notificationsSentAt: feedback.notificationsSentAt ?? null,
280
+ };
281
+ },
282
+ });
283
+ /**
284
+ * Internal mutation to update feedback with AI analysis results
285
+ */
286
+ export const updateWithAnalysis = internalMutation({
287
+ args: {
288
+ feedbackId: v.id("feedback"),
289
+ aiSummary: v.string(),
290
+ aiImpactAnalysis: v.string(),
291
+ aiActionItems: v.array(v.string()),
292
+ aiEstimatedEffort: effortValidator,
293
+ aiSuggestedPriority: feedbackPriorityValidator,
294
+ aiThreadId: v.string(),
295
+ },
296
+ returns: v.null(),
297
+ handler: async (ctx, args) => {
298
+ await ctx.db.patch(args.feedbackId, {
299
+ aiSummary: args.aiSummary,
300
+ aiImpactAnalysis: args.aiImpactAnalysis,
301
+ aiActionItems: args.aiActionItems,
302
+ aiEstimatedEffort: args.aiEstimatedEffort,
303
+ aiSuggestedPriority: args.aiSuggestedPriority,
304
+ aiThreadId: args.aiThreadId,
305
+ aiAnalyzedAt: Date.now(),
306
+ updatedAt: Date.now(),
307
+ });
308
+ return null;
309
+ },
310
+ });
311
+ /**
312
+ * Internal mutation to mark notifications as sent
313
+ */
314
+ export const markNotificationsSent = internalMutation({
315
+ args: {
316
+ feedbackId: v.id("feedback"),
317
+ },
318
+ returns: v.null(),
319
+ handler: async (ctx, args) => {
320
+ await ctx.db.patch(args.feedbackId, {
321
+ notificationsSentAt: Date.now(),
322
+ updatedAt: Date.now(),
323
+ });
324
+ return null;
325
+ },
326
+ });
327
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/convex/feedback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @convex-dev/feedback - Convex Functions
3
+ *
4
+ * Export all Convex functions for use by the component.
5
+ */
6
+ export * as bugReports from './bugReports';
7
+ export * as feedback from './feedback';
8
+ export * as supportTeams from './supportTeams';
9
+ export { bugSeverityValidator, bugStatusValidator, feedbackTypeValidator, feedbackPriorityValidator, feedbackStatusValidator, reporterTypeValidator, effortValidator, type BugSeverity, type BugStatus, type FeedbackType, type FeedbackPriority, type FeedbackStatus, type ReporterType, type Effort, } from './schema';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/convex/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAC;AAG/C,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,MAAM,GACZ,MAAM,UAAU,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @convex-dev/feedback - Convex Functions
3
+ *
4
+ * Export all Convex functions for use by the component.
5
+ */
6
+ // Re-export all public functions
7
+ export * as bugReports from './bugReports';
8
+ export * as feedback from './feedback';
9
+ export * as supportTeams from './supportTeams';
10
+ // Re-export schema types and validators
11
+ export { bugSeverityValidator, bugStatusValidator, feedbackTypeValidator, feedbackPriorityValidator, feedbackStatusValidator, reporterTypeValidator, effortValidator, } from './schema';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/convex/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iCAAiC;AACjC,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAC;AAE/C,wCAAwC;AACxC,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,GAQhB,MAAM,UAAU,CAAC"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * Bug report severity levels
3
+ */
4
+ export declare const bugSeverityValidator: import("convex/values").VUnion<"low" | "medium" | "high" | "critical", [import("convex/values").VLiteral<"low", "required">, import("convex/values").VLiteral<"medium", "required">, import("convex/values").VLiteral<"high", "required">, import("convex/values").VLiteral<"critical", "required">], "required", never>;
5
+ export type BugSeverity = "low" | "medium" | "high" | "critical";
6
+ /**
7
+ * Bug report status
8
+ */
9
+ export declare const bugStatusValidator: import("convex/values").VUnion<"open" | "in-progress" | "resolved" | "closed", [import("convex/values").VLiteral<"open", "required">, import("convex/values").VLiteral<"in-progress", "required">, import("convex/values").VLiteral<"resolved", "required">, import("convex/values").VLiteral<"closed", "required">], "required", never>;
10
+ export type BugStatus = "open" | "in-progress" | "resolved" | "closed";
11
+ /**
12
+ * Feedback type
13
+ */
14
+ export declare const feedbackTypeValidator: import("convex/values").VUnion<"feature_request" | "change_request" | "general", [import("convex/values").VLiteral<"feature_request", "required">, import("convex/values").VLiteral<"change_request", "required">, import("convex/values").VLiteral<"general", "required">], "required", never>;
15
+ export type FeedbackType = "feature_request" | "change_request" | "general";
16
+ /**
17
+ * Feedback priority
18
+ */
19
+ export declare const feedbackPriorityValidator: import("convex/values").VUnion<"critical" | "nice_to_have" | "important", [import("convex/values").VLiteral<"nice_to_have", "required">, import("convex/values").VLiteral<"important", "required">, import("convex/values").VLiteral<"critical", "required">], "required", never>;
20
+ export type FeedbackPriority = "nice_to_have" | "important" | "critical";
21
+ /**
22
+ * Feedback status
23
+ */
24
+ export declare const feedbackStatusValidator: import("convex/values").VUnion<"open" | "under_review" | "planned" | "in_progress" | "completed" | "declined", [import("convex/values").VLiteral<"open", "required">, import("convex/values").VLiteral<"under_review", "required">, import("convex/values").VLiteral<"planned", "required">, import("convex/values").VLiteral<"in_progress", "required">, import("convex/values").VLiteral<"completed", "required">, import("convex/values").VLiteral<"declined", "required">], "required", never>;
25
+ export type FeedbackStatus = "open" | "under_review" | "planned" | "in_progress" | "completed" | "declined";
26
+ /**
27
+ * Reporter type
28
+ */
29
+ export declare const reporterTypeValidator: import("convex/values").VUnion<"staff" | "customer", [import("convex/values").VLiteral<"staff", "required">, import("convex/values").VLiteral<"customer", "required">], "required", never>;
30
+ export type ReporterType = "staff" | "customer";
31
+ /**
32
+ * Effort estimate
33
+ */
34
+ export declare const effortValidator: import("convex/values").VUnion<"low" | "medium" | "high", [import("convex/values").VLiteral<"low", "required">, import("convex/values").VLiteral<"medium", "required">, import("convex/values").VLiteral<"high", "required">], "required", never>;
35
+ export type Effort = "low" | "medium" | "high";
36
+ declare const _default: import("convex/server").SchemaDefinition<{
37
+ /**
38
+ * Bug Reports - in-app bug reports with diagnostics
39
+ */
40
+ bugReports: import("convex/server").TableDefinition<import("convex/values").VObject<{
41
+ isArchived?: boolean | undefined;
42
+ route?: string | undefined;
43
+ consoleErrors?: string | undefined;
44
+ screenshotStorageId?: import("convex/values").GenericId<"_storage"> | undefined;
45
+ aiSummary?: string | undefined;
46
+ aiRootCauseAnalysis?: string | undefined;
47
+ aiReproductionSteps?: string[] | undefined;
48
+ aiSuggestedFix?: string | undefined;
49
+ aiEstimatedEffort?: "low" | "medium" | "high" | undefined;
50
+ aiSuggestedSeverity?: "low" | "medium" | "high" | "critical" | undefined;
51
+ aiAnalyzedAt?: number | undefined;
52
+ aiThreadId?: string | undefined;
53
+ notificationsSentAt?: number | undefined;
54
+ severity: "low" | "medium" | "high" | "critical";
55
+ status: "open" | "in-progress" | "resolved" | "closed";
56
+ reporterType: "staff" | "customer";
57
+ title: string;
58
+ description: string;
59
+ reporterId: string;
60
+ reporterEmail: string;
61
+ reporterName: string;
62
+ url: string;
63
+ browserInfo: string;
64
+ viewportWidth: number;
65
+ viewportHeight: number;
66
+ networkState: string;
67
+ createdAt: number;
68
+ updatedAt: number;
69
+ }, {
70
+ title: import("convex/values").VString<string, "required">;
71
+ description: import("convex/values").VString<string, "required">;
72
+ severity: import("convex/values").VUnion<"low" | "medium" | "high" | "critical", [import("convex/values").VLiteral<"low", "required">, import("convex/values").VLiteral<"medium", "required">, import("convex/values").VLiteral<"high", "required">, import("convex/values").VLiteral<"critical", "required">], "required", never>;
73
+ status: import("convex/values").VUnion<"open" | "in-progress" | "resolved" | "closed", [import("convex/values").VLiteral<"open", "required">, import("convex/values").VLiteral<"in-progress", "required">, import("convex/values").VLiteral<"resolved", "required">, import("convex/values").VLiteral<"closed", "required">], "required", never>;
74
+ isArchived: import("convex/values").VBoolean<boolean | undefined, "optional">;
75
+ reporterType: import("convex/values").VUnion<"staff" | "customer", [import("convex/values").VLiteral<"staff", "required">, import("convex/values").VLiteral<"customer", "required">], "required", never>;
76
+ reporterId: import("convex/values").VString<string, "required">;
77
+ reporterEmail: import("convex/values").VString<string, "required">;
78
+ reporterName: import("convex/values").VString<string, "required">;
79
+ url: import("convex/values").VString<string, "required">;
80
+ route: import("convex/values").VString<string | undefined, "optional">;
81
+ browserInfo: import("convex/values").VString<string, "required">;
82
+ consoleErrors: import("convex/values").VString<string | undefined, "optional">;
83
+ screenshotStorageId: import("convex/values").VId<import("convex/values").GenericId<"_storage"> | undefined, "optional">;
84
+ viewportWidth: import("convex/values").VFloat64<number, "required">;
85
+ viewportHeight: import("convex/values").VFloat64<number, "required">;
86
+ networkState: import("convex/values").VString<string, "required">;
87
+ aiSummary: import("convex/values").VString<string | undefined, "optional">;
88
+ aiRootCauseAnalysis: import("convex/values").VString<string | undefined, "optional">;
89
+ aiReproductionSteps: import("convex/values").VArray<string[] | undefined, import("convex/values").VString<string, "required">, "optional">;
90
+ aiSuggestedFix: import("convex/values").VString<string | undefined, "optional">;
91
+ aiEstimatedEffort: import("convex/values").VUnion<"low" | "medium" | "high" | undefined, [import("convex/values").VLiteral<"low", "required">, import("convex/values").VLiteral<"medium", "required">, import("convex/values").VLiteral<"high", "required">], "optional", never>;
92
+ aiSuggestedSeverity: import("convex/values").VUnion<"low" | "medium" | "high" | "critical" | undefined, [import("convex/values").VLiteral<"low", "required">, import("convex/values").VLiteral<"medium", "required">, import("convex/values").VLiteral<"high", "required">, import("convex/values").VLiteral<"critical", "required">], "optional", never>;
93
+ aiAnalyzedAt: import("convex/values").VFloat64<number | undefined, "optional">;
94
+ aiThreadId: import("convex/values").VString<string | undefined, "optional">;
95
+ notificationsSentAt: import("convex/values").VFloat64<number | undefined, "optional">;
96
+ createdAt: import("convex/values").VFloat64<number, "required">;
97
+ updatedAt: import("convex/values").VFloat64<number, "required">;
98
+ }, "required", "severity" | "status" | "reporterType" | "title" | "description" | "isArchived" | "reporterId" | "reporterEmail" | "reporterName" | "url" | "route" | "browserInfo" | "consoleErrors" | "screenshotStorageId" | "viewportWidth" | "viewportHeight" | "networkState" | "aiSummary" | "aiRootCauseAnalysis" | "aiReproductionSteps" | "aiSuggestedFix" | "aiEstimatedEffort" | "aiSuggestedSeverity" | "aiAnalyzedAt" | "aiThreadId" | "notificationsSentAt" | "createdAt" | "updatedAt">, {
99
+ by_status: ["status", "_creationTime"];
100
+ by_severity: ["severity", "_creationTime"];
101
+ by_reporter: ["reporterType", "reporterId", "_creationTime"];
102
+ by_created: ["createdAt", "_creationTime"];
103
+ by_archived: ["isArchived", "_creationTime"];
104
+ by_ai_analyzed: ["aiAnalyzedAt", "_creationTime"];
105
+ }, {}, {}>;
106
+ /**
107
+ * Feedback - feature requests, change requests, and general feedback
108
+ */
109
+ feedback: import("convex/server").TableDefinition<import("convex/values").VObject<{
110
+ isArchived?: boolean | undefined;
111
+ route?: string | undefined;
112
+ consoleErrors?: string | undefined;
113
+ screenshotStorageId?: import("convex/values").GenericId<"_storage"> | undefined;
114
+ aiSummary?: string | undefined;
115
+ aiEstimatedEffort?: "low" | "medium" | "high" | undefined;
116
+ aiAnalyzedAt?: number | undefined;
117
+ aiThreadId?: string | undefined;
118
+ notificationsSentAt?: number | undefined;
119
+ aiImpactAnalysis?: string | undefined;
120
+ aiActionItems?: string[] | undefined;
121
+ aiSuggestedPriority?: "critical" | "nice_to_have" | "important" | undefined;
122
+ type: "feature_request" | "change_request" | "general";
123
+ status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "declined";
124
+ reporterType: "staff" | "customer";
125
+ title: string;
126
+ description: string;
127
+ reporterId: string;
128
+ reporterEmail: string;
129
+ reporterName: string;
130
+ url: string;
131
+ browserInfo: string;
132
+ viewportWidth: number;
133
+ viewportHeight: number;
134
+ networkState: string;
135
+ createdAt: number;
136
+ updatedAt: number;
137
+ priority: "critical" | "nice_to_have" | "important";
138
+ }, {
139
+ type: import("convex/values").VUnion<"feature_request" | "change_request" | "general", [import("convex/values").VLiteral<"feature_request", "required">, import("convex/values").VLiteral<"change_request", "required">, import("convex/values").VLiteral<"general", "required">], "required", never>;
140
+ title: import("convex/values").VString<string, "required">;
141
+ description: import("convex/values").VString<string, "required">;
142
+ priority: import("convex/values").VUnion<"critical" | "nice_to_have" | "important", [import("convex/values").VLiteral<"nice_to_have", "required">, import("convex/values").VLiteral<"important", "required">, import("convex/values").VLiteral<"critical", "required">], "required", never>;
143
+ status: import("convex/values").VUnion<"open" | "under_review" | "planned" | "in_progress" | "completed" | "declined", [import("convex/values").VLiteral<"open", "required">, import("convex/values").VLiteral<"under_review", "required">, import("convex/values").VLiteral<"planned", "required">, import("convex/values").VLiteral<"in_progress", "required">, import("convex/values").VLiteral<"completed", "required">, import("convex/values").VLiteral<"declined", "required">], "required", never>;
144
+ isArchived: import("convex/values").VBoolean<boolean | undefined, "optional">;
145
+ reporterType: import("convex/values").VUnion<"staff" | "customer", [import("convex/values").VLiteral<"staff", "required">, import("convex/values").VLiteral<"customer", "required">], "required", never>;
146
+ reporterId: import("convex/values").VString<string, "required">;
147
+ reporterEmail: import("convex/values").VString<string, "required">;
148
+ reporterName: import("convex/values").VString<string, "required">;
149
+ url: import("convex/values").VString<string, "required">;
150
+ route: import("convex/values").VString<string | undefined, "optional">;
151
+ browserInfo: import("convex/values").VString<string, "required">;
152
+ consoleErrors: import("convex/values").VString<string | undefined, "optional">;
153
+ screenshotStorageId: import("convex/values").VId<import("convex/values").GenericId<"_storage"> | undefined, "optional">;
154
+ viewportWidth: import("convex/values").VFloat64<number, "required">;
155
+ viewportHeight: import("convex/values").VFloat64<number, "required">;
156
+ networkState: import("convex/values").VString<string, "required">;
157
+ aiSummary: import("convex/values").VString<string | undefined, "optional">;
158
+ aiImpactAnalysis: import("convex/values").VString<string | undefined, "optional">;
159
+ aiActionItems: import("convex/values").VArray<string[] | undefined, import("convex/values").VString<string, "required">, "optional">;
160
+ aiEstimatedEffort: import("convex/values").VUnion<"low" | "medium" | "high" | undefined, [import("convex/values").VLiteral<"low", "required">, import("convex/values").VLiteral<"medium", "required">, import("convex/values").VLiteral<"high", "required">], "optional", never>;
161
+ aiSuggestedPriority: import("convex/values").VUnion<"critical" | "nice_to_have" | "important" | undefined, [import("convex/values").VLiteral<"nice_to_have", "required">, import("convex/values").VLiteral<"important", "required">, import("convex/values").VLiteral<"critical", "required">], "optional", never>;
162
+ aiAnalyzedAt: import("convex/values").VFloat64<number | undefined, "optional">;
163
+ aiThreadId: import("convex/values").VString<string | undefined, "optional">;
164
+ notificationsSentAt: import("convex/values").VFloat64<number | undefined, "optional">;
165
+ createdAt: import("convex/values").VFloat64<number, "required">;
166
+ updatedAt: import("convex/values").VFloat64<number, "required">;
167
+ }, "required", "type" | "status" | "reporterType" | "title" | "description" | "isArchived" | "reporterId" | "reporterEmail" | "reporterName" | "url" | "route" | "browserInfo" | "consoleErrors" | "screenshotStorageId" | "viewportWidth" | "viewportHeight" | "networkState" | "aiSummary" | "aiEstimatedEffort" | "aiAnalyzedAt" | "aiThreadId" | "notificationsSentAt" | "createdAt" | "updatedAt" | "priority" | "aiImpactAnalysis" | "aiActionItems" | "aiSuggestedPriority">, {
168
+ by_status: ["status", "_creationTime"];
169
+ by_type: ["type", "_creationTime"];
170
+ by_priority: ["priority", "_creationTime"];
171
+ by_reporter: ["reporterType", "reporterId", "_creationTime"];
172
+ by_created: ["createdAt", "_creationTime"];
173
+ by_archived: ["isArchived", "_creationTime"];
174
+ by_ai_analyzed: ["aiAnalyzedAt", "_creationTime"];
175
+ }, {}, {}>;
176
+ /**
177
+ * Support Teams - configure teams for notification routing
178
+ */
179
+ supportTeams: import("convex/server").TableDefinition<import("convex/values").VObject<{
180
+ createdAt: number;
181
+ updatedAt: number;
182
+ teamName: string;
183
+ memberEmails: string[];
184
+ feedbackTypes: ("feature_request" | "change_request" | "general")[];
185
+ bugReportSeverities: ("low" | "medium" | "high" | "critical")[];
186
+ isActive: boolean;
187
+ }, {
188
+ teamName: import("convex/values").VString<string, "required">;
189
+ memberEmails: import("convex/values").VArray<string[], import("convex/values").VString<string, "required">, "required">;
190
+ feedbackTypes: import("convex/values").VArray<("feature_request" | "change_request" | "general")[], import("convex/values").VUnion<"feature_request" | "change_request" | "general", [import("convex/values").VLiteral<"feature_request", "required">, import("convex/values").VLiteral<"change_request", "required">, import("convex/values").VLiteral<"general", "required">], "required", never>, "required">;
191
+ bugReportSeverities: import("convex/values").VArray<("low" | "medium" | "high" | "critical")[], import("convex/values").VUnion<"low" | "medium" | "high" | "critical", [import("convex/values").VLiteral<"low", "required">, import("convex/values").VLiteral<"medium", "required">, import("convex/values").VLiteral<"high", "required">, import("convex/values").VLiteral<"critical", "required">], "required", never>, "required">;
192
+ isActive: import("convex/values").VBoolean<boolean, "required">;
193
+ createdAt: import("convex/values").VFloat64<number, "required">;
194
+ updatedAt: import("convex/values").VFloat64<number, "required">;
195
+ }, "required", "createdAt" | "updatedAt" | "teamName" | "memberEmails" | "feedbackTypes" | "bugReportSeverities" | "isActive">, {
196
+ by_active: ["isActive", "_creationTime"];
197
+ }, {}, {}>;
198
+ }, true>;
199
+ export default _default;
200
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/convex/schema.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,oBAAoB,0TAKhC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,kBAAkB,0UAK9B,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,aAAa,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEvE;;GAEG;AACH,eAAO,MAAM,qBAAqB,iSAIjC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,SAAS,CAAC;AAE5E;;GAEG;AACH,eAAO,MAAM,yBAAyB,mRAIrC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,WAAW,GAAG,UAAU,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,uBAAuB,oeAOnC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,cAAc,GAAG,SAAS,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC;AAE5G;;GAEG;AACH,eAAO,MAAM,qBAAqB,4LAGjC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,UAAU,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,eAAe,mPAI3B,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;;IAK7C;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAgDH;;OAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkDH;;OAEG;;;;;;;;;;;;;;;;;;;;;AAzGL,wBAsHG"}