@fatagnus/convex-feedback 0.2.7 → 0.2.9

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 (98) hide show
  1. package/README.md +346 -4
  2. package/dist/convex/_generated/api.d.ts +2310 -0
  3. package/dist/convex/_generated/api.d.ts.map +1 -0
  4. package/dist/convex/_generated/api.js +32 -0
  5. package/dist/convex/_generated/api.js.map +1 -0
  6. package/dist/convex/_generated/dataModel.d.ts +46 -0
  7. package/dist/convex/_generated/dataModel.d.ts.map +1 -0
  8. package/dist/convex/_generated/dataModel.js +11 -0
  9. package/dist/convex/_generated/dataModel.js.map +1 -0
  10. package/dist/convex/_generated/server.d.ts +121 -0
  11. package/dist/convex/_generated/server.d.ts.map +1 -0
  12. package/dist/convex/_generated/server.js +78 -0
  13. package/dist/convex/_generated/server.js.map +1 -0
  14. package/dist/convex/agents/bugReportAgent.d.ts +35 -9
  15. package/dist/convex/agents/bugReportAgent.d.ts.map +1 -1
  16. package/dist/convex/agents/bugReportAgent.js +61 -27
  17. package/dist/convex/agents/bugReportAgent.js.map +1 -1
  18. package/dist/convex/agents/feedbackAgent.d.ts +35 -9
  19. package/dist/convex/agents/feedbackAgent.d.ts.map +1 -1
  20. package/dist/convex/agents/feedbackAgent.js +61 -27
  21. package/dist/convex/agents/feedbackAgent.js.map +1 -1
  22. package/dist/convex/agents/feedbackInterviewAgent.d.ts +76 -0
  23. package/dist/convex/agents/feedbackInterviewAgent.d.ts.map +1 -0
  24. package/dist/convex/agents/feedbackInterviewAgent.js +812 -0
  25. package/dist/convex/agents/feedbackInterviewAgent.js.map +1 -0
  26. package/dist/convex/agents/index.d.ts +9 -0
  27. package/dist/convex/agents/index.d.ts.map +1 -0
  28. package/dist/convex/agents/index.js +13 -0
  29. package/dist/convex/agents/index.js.map +1 -0
  30. package/dist/convex/apiKeys.d.ts +56 -0
  31. package/dist/convex/apiKeys.d.ts.map +1 -0
  32. package/dist/convex/apiKeys.js +197 -0
  33. package/dist/convex/apiKeys.js.map +1 -0
  34. package/dist/convex/bugReports.d.ts +131 -11
  35. package/dist/convex/bugReports.d.ts.map +1 -1
  36. package/dist/convex/bugReports.js +138 -10
  37. package/dist/convex/bugReports.js.map +1 -1
  38. package/dist/convex/emails/bugReportEmails.d.ts +31 -2
  39. package/dist/convex/emails/bugReportEmails.d.ts.map +1 -1
  40. package/dist/convex/emails/bugReportEmails.js +6 -3
  41. package/dist/convex/emails/bugReportEmails.js.map +1 -1
  42. package/dist/convex/emails/feedbackEmails.d.ts +31 -2
  43. package/dist/convex/emails/feedbackEmails.d.ts.map +1 -1
  44. package/dist/convex/emails/feedbackEmails.js +6 -3
  45. package/dist/convex/emails/feedbackEmails.js.map +1 -1
  46. package/dist/convex/feedback.d.ts +132 -11
  47. package/dist/convex/feedback.d.ts.map +1 -1
  48. package/dist/convex/feedback.js +146 -9
  49. package/dist/convex/feedback.js.map +1 -1
  50. package/dist/convex/http.d.ts +39 -0
  51. package/dist/convex/http.d.ts.map +1 -0
  52. package/dist/convex/http.js +467 -0
  53. package/dist/convex/http.js.map +1 -0
  54. package/dist/convex/index.d.ts +8 -1
  55. package/dist/convex/index.d.ts.map +1 -1
  56. package/dist/convex/index.js +8 -1
  57. package/dist/convex/index.js.map +1 -1
  58. package/dist/convex/inputRequests.d.ts +118 -0
  59. package/dist/convex/inputRequests.d.ts.map +1 -0
  60. package/dist/convex/inputRequests.js +141 -0
  61. package/dist/convex/inputRequests.js.map +1 -0
  62. package/dist/convex/prompts.d.ts +110 -0
  63. package/dist/convex/prompts.d.ts.map +1 -0
  64. package/dist/convex/prompts.js +403 -0
  65. package/dist/convex/prompts.js.map +1 -0
  66. package/dist/convex/schema.d.ts +310 -54
  67. package/dist/convex/schema.d.ts.map +1 -1
  68. package/dist/convex/schema.js +120 -2
  69. package/dist/convex/schema.js.map +1 -1
  70. package/dist/convex/supportTeams.d.ts +69 -7
  71. package/dist/convex/supportTeams.d.ts.map +1 -1
  72. package/dist/index.d.ts +28 -2
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +25 -2
  75. package/dist/index.js.map +1 -1
  76. package/dist/types.d.ts +35 -0
  77. package/dist/types.d.ts.map +1 -1
  78. package/package.json +12 -5
  79. package/src/convex/_generated/api.ts +1 -0
  80. package/src/convex/agents/feedbackInterviewAgent.ts +6 -12
  81. package/src/convex/apiKeys.test.ts +79 -0
  82. package/src/convex/apiKeys.ts +223 -0
  83. package/src/convex/bugReports.ts +126 -1
  84. package/src/convex/feedback.ts +134 -1
  85. package/src/convex/http.test.ts +76 -0
  86. package/src/convex/http.ts +630 -0
  87. package/src/convex/index.ts +11 -0
  88. package/src/convex/prompts.test.ts +185 -0
  89. package/src/convex/prompts.ts +605 -0
  90. package/src/convex/schema.ts +52 -2
  91. package/src/convex/ticketNumbers.ts +4 -0
  92. package/src/convex/tsconfig.json +24 -0
  93. package/src/index.ts +33 -1
  94. package/src/types.ts +38 -0
  95. package/dist/convex/convex.config.d.ts +0 -3
  96. package/dist/convex/convex.config.d.ts.map +0 -1
  97. package/dist/convex/convex.config.js +0 -6
  98. package/dist/convex/convex.config.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputRequests.d.ts","sourceRoot":"","sources":["../../src/convex/inputRequests.ts"],"names":[],"mappings":"AA0BA;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;uEA+BxB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAQd,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAe9B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;GAuCzB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,MAAM;;gBAkBjB,CAAC"}
@@ -0,0 +1,141 @@
1
+ import { v } from "convex/values";
2
+ import { mutation, query, internalMutation } from "./_generated/server";
3
+ import { inputRequestStatusValidator, inputTypeValidator, inputConfigValidator, } from "./schema";
4
+ // Return validator for input requests
5
+ const inputRequestReturnValidator = v.object({
6
+ _id: v.id("feedbackInputRequests"),
7
+ _creationTime: v.number(),
8
+ threadId: v.string(),
9
+ toolCallId: v.string(),
10
+ status: inputRequestStatusValidator,
11
+ inputType: inputTypeValidator,
12
+ prompt: v.string(),
13
+ config: v.optional(inputConfigValidator),
14
+ response: v.optional(v.string()),
15
+ respondedAt: v.optional(v.number()),
16
+ agentName: v.string(),
17
+ userId: v.optional(v.string()),
18
+ createdAt: v.number(),
19
+ expiresAt: v.optional(v.number()),
20
+ });
21
+ /**
22
+ * Internal mutation to create an input request (called by agent tools)
23
+ */
24
+ export const createRequest = internalMutation({
25
+ args: {
26
+ threadId: v.string(),
27
+ toolCallId: v.string(),
28
+ inputType: inputTypeValidator,
29
+ prompt: v.string(),
30
+ config: v.optional(inputConfigValidator),
31
+ agentName: v.string(),
32
+ userId: v.optional(v.string()),
33
+ expiresInMs: v.optional(v.number()),
34
+ },
35
+ returns: v.id("feedbackInputRequests"),
36
+ handler: async (ctx, args) => {
37
+ const now = Date.now();
38
+ const expiresAt = args.expiresInMs ? now + args.expiresInMs : undefined;
39
+ const requestId = await ctx.db.insert("feedbackInputRequests", {
40
+ threadId: args.threadId,
41
+ toolCallId: args.toolCallId,
42
+ status: "pending",
43
+ inputType: args.inputType,
44
+ prompt: args.prompt,
45
+ config: args.config,
46
+ agentName: args.agentName,
47
+ userId: args.userId,
48
+ createdAt: now,
49
+ expiresAt,
50
+ });
51
+ return requestId;
52
+ },
53
+ });
54
+ /**
55
+ * Get a specific input request by ID
56
+ */
57
+ export const get = query({
58
+ args: {
59
+ requestId: v.id("feedbackInputRequests"),
60
+ },
61
+ returns: v.union(inputRequestReturnValidator, v.null()),
62
+ handler: async (ctx, args) => {
63
+ return await ctx.db.get(args.requestId);
64
+ },
65
+ });
66
+ /**
67
+ * Get the pending input request for a thread
68
+ */
69
+ export const getPendingForThread = query({
70
+ args: {
71
+ threadId: v.string(),
72
+ },
73
+ returns: v.union(inputRequestReturnValidator, v.null()),
74
+ handler: async (ctx, args) => {
75
+ const request = await ctx.db
76
+ .query("feedbackInputRequests")
77
+ .withIndex("by_thread_status", (q) => q.eq("threadId", args.threadId).eq("status", "pending"))
78
+ .first();
79
+ return request;
80
+ },
81
+ });
82
+ /**
83
+ * Submit a response to an input request
84
+ */
85
+ export const submitResponse = mutation({
86
+ args: {
87
+ requestId: v.id("feedbackInputRequests"),
88
+ response: v.string(), // JSON stringified response
89
+ },
90
+ returns: v.object({
91
+ success: v.boolean(),
92
+ threadId: v.string(),
93
+ toolCallId: v.string(),
94
+ }),
95
+ handler: async (ctx, args) => {
96
+ const request = await ctx.db.get(args.requestId);
97
+ if (!request) {
98
+ throw new Error("Input request not found");
99
+ }
100
+ if (request.status !== "pending") {
101
+ throw new Error(`Input request is already ${request.status}`);
102
+ }
103
+ // Check expiration
104
+ if (request.expiresAt && Date.now() > request.expiresAt) {
105
+ await ctx.db.patch(args.requestId, { status: "expired" });
106
+ throw new Error("Input request has expired");
107
+ }
108
+ // Update the request with the response
109
+ await ctx.db.patch(args.requestId, {
110
+ status: "answered",
111
+ response: args.response,
112
+ respondedAt: Date.now(),
113
+ });
114
+ return {
115
+ success: true,
116
+ threadId: request.threadId,
117
+ toolCallId: request.toolCallId,
118
+ };
119
+ },
120
+ });
121
+ /**
122
+ * Cancel a pending input request
123
+ */
124
+ export const cancel = mutation({
125
+ args: {
126
+ requestId: v.id("feedbackInputRequests"),
127
+ },
128
+ returns: v.null(),
129
+ handler: async (ctx, args) => {
130
+ const request = await ctx.db.get(args.requestId);
131
+ if (!request) {
132
+ throw new Error("Input request not found");
133
+ }
134
+ if (request.status !== "pending") {
135
+ throw new Error(`Cannot cancel request with status: ${request.status}`);
136
+ }
137
+ await ctx.db.patch(args.requestId, { status: "cancelled" });
138
+ return null;
139
+ },
140
+ });
141
+ //# sourceMappingURL=inputRequests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputRequests.js","sourceRoot":"","sources":["../../src/convex/inputRequests.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ export type PromptTemplate = "fix" | "implement" | "analyze" | "codebuff";
2
+ export declare const promptTemplateValidator: import("convex/values").VUnion<"fix" | "implement" | "analyze" | "codebuff", [import("convex/values").VLiteral<"fix", "required">, import("convex/values").VLiteral<"implement", "required">, import("convex/values").VLiteral<"analyze", "required">, import("convex/values").VLiteral<"codebuff", "required">], "required", never>;
3
+ /**
4
+ * Generate an AI prompt for a bug report.
5
+ */
6
+ export declare function generateBugPrompt(bug: {
7
+ ticketNumber: string;
8
+ title: string;
9
+ description: string;
10
+ severity: string;
11
+ url: string;
12
+ route?: string;
13
+ browserInfo: string;
14
+ consoleErrors?: string;
15
+ viewportWidth: number;
16
+ viewportHeight: number;
17
+ aiSummary?: string;
18
+ aiRootCauseAnalysis?: string;
19
+ aiReproductionSteps?: string[];
20
+ aiSuggestedFix?: string;
21
+ aiEstimatedEffort?: string;
22
+ createdAt: number;
23
+ }, template: PromptTemplate): string;
24
+ /**
25
+ * Generate an AI prompt for feedback.
26
+ */
27
+ export declare function generateFeedbackPrompt(feedback: {
28
+ ticketNumber: string;
29
+ type: string;
30
+ title: string;
31
+ description: string;
32
+ priority: string;
33
+ url: string;
34
+ route?: string;
35
+ aiSummary?: string;
36
+ aiImpactAnalysis?: string;
37
+ aiActionItems?: string[];
38
+ aiEstimatedEffort?: string;
39
+ createdAt: number;
40
+ }, template: PromptTemplate): string;
41
+ /**
42
+ * Get a bug report by ticket number (internal query).
43
+ */
44
+ export declare const getBugByTicketNumber: import("convex/server").RegisteredQuery<"internal", {
45
+ ticketNumber: string;
46
+ }, Promise<{
47
+ _id: import("convex/values").GenericId<"bugReports">;
48
+ ticketNumber: string;
49
+ title: string;
50
+ description: string;
51
+ severity: "low" | "medium" | "high" | "critical";
52
+ status: "open" | "in-progress" | "resolved" | "closed";
53
+ url: string;
54
+ route: string;
55
+ browserInfo: string;
56
+ consoleErrors: string;
57
+ viewportWidth: number;
58
+ viewportHeight: number;
59
+ networkState: string;
60
+ aiSummary: string;
61
+ aiRootCauseAnalysis: string;
62
+ aiReproductionSteps: string[];
63
+ aiSuggestedFix: string;
64
+ aiEstimatedEffort: "low" | "medium" | "high";
65
+ createdAt: number;
66
+ }>>;
67
+ /**
68
+ * Get feedback by ticket number (internal query).
69
+ */
70
+ export declare const getFeedbackByTicketNumber: import("convex/server").RegisteredQuery<"internal", {
71
+ ticketNumber: string;
72
+ }, Promise<{
73
+ _id: import("convex/values").GenericId<"feedback">;
74
+ ticketNumber: string;
75
+ type: "feature_request" | "change_request" | "general";
76
+ title: string;
77
+ description: string;
78
+ priority: "critical" | "nice_to_have" | "important";
79
+ status: "open" | "under_review" | "planned" | "in_progress" | "completed" | "declined";
80
+ url: string;
81
+ route: string;
82
+ browserInfo: string;
83
+ consoleErrors: string;
84
+ viewportWidth: number;
85
+ viewportHeight: number;
86
+ networkState: string;
87
+ aiSummary: string;
88
+ aiImpactAnalysis: string;
89
+ aiActionItems: string[];
90
+ aiEstimatedEffort: "low" | "medium" | "high";
91
+ createdAt: number;
92
+ }>>;
93
+ /**
94
+ * Public query to get a prompt by ticket number.
95
+ */
96
+ export declare const getPrompt: import("convex/server").RegisteredQuery<"public", {
97
+ template?: "fix" | "implement" | "analyze" | "codebuff";
98
+ ticketNumber: string;
99
+ }, Promise<{
100
+ ticketNumber: string;
101
+ type: "bug";
102
+ template: "fix" | "implement" | "analyze" | "codebuff";
103
+ prompt: string;
104
+ } | {
105
+ ticketNumber: string;
106
+ type: "feedback";
107
+ template: "fix" | "implement" | "analyze" | "codebuff";
108
+ prompt: string;
109
+ }>>;
110
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/convex/prompts.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AAE1E,eAAO,MAAM,uBAAuB,sUAKnC,CAAC;AA2UF;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,QAAQ,EAAE,cAAc,GACvB,MAAM,CAYR;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE;IACR,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB,EACD,QAAQ,EAAE,cAAc,GACvB,MAAM,CAYR;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;GAqC/B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;GAqCpC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;GAgGpB,CAAC"}
@@ -0,0 +1,403 @@
1
+ import { v } from "convex/values";
2
+ import { query, internalQuery } from "./_generated/server";
3
+ import { bugSeverityValidator, bugStatusValidator, feedbackTypeValidator, feedbackPriorityValidator, feedbackStatusValidator, effortValidator, } from "./schema";
4
+ export const promptTemplateValidator = v.union(v.literal("fix"), v.literal("implement"), v.literal("analyze"), v.literal("codebuff"));
5
+ // ===== Bug Report Type =====
6
+ const bugReportDataValidator = v.object({
7
+ _id: v.id("bugReports"),
8
+ ticketNumber: v.string(),
9
+ title: v.string(),
10
+ description: v.string(),
11
+ severity: bugSeverityValidator,
12
+ status: bugStatusValidator,
13
+ url: v.string(),
14
+ route: v.optional(v.string()),
15
+ browserInfo: v.string(),
16
+ consoleErrors: v.optional(v.string()),
17
+ viewportWidth: v.number(),
18
+ viewportHeight: v.number(),
19
+ networkState: v.string(),
20
+ aiSummary: v.optional(v.string()),
21
+ aiRootCauseAnalysis: v.optional(v.string()),
22
+ aiReproductionSteps: v.optional(v.array(v.string())),
23
+ aiSuggestedFix: v.optional(v.string()),
24
+ aiEstimatedEffort: v.optional(effortValidator),
25
+ createdAt: v.number(),
26
+ });
27
+ // ===== Feedback Type =====
28
+ const feedbackDataValidator = v.object({
29
+ _id: v.id("feedback"),
30
+ ticketNumber: v.string(),
31
+ type: feedbackTypeValidator,
32
+ title: v.string(),
33
+ description: v.string(),
34
+ priority: feedbackPriorityValidator,
35
+ status: feedbackStatusValidator,
36
+ url: v.string(),
37
+ route: v.optional(v.string()),
38
+ browserInfo: v.string(),
39
+ consoleErrors: v.optional(v.string()),
40
+ viewportWidth: v.number(),
41
+ viewportHeight: v.number(),
42
+ networkState: v.string(),
43
+ aiSummary: v.optional(v.string()),
44
+ aiImpactAnalysis: v.optional(v.string()),
45
+ aiActionItems: v.optional(v.array(v.string())),
46
+ aiEstimatedEffort: v.optional(effortValidator),
47
+ createdAt: v.number(),
48
+ });
49
+ // ===== Prompt Generation =====
50
+ function formatDate(timestamp) {
51
+ return new Date(timestamp).toISOString().split("T")[0];
52
+ }
53
+ function parseBrowserInfo(browserInfoJson) {
54
+ try {
55
+ return JSON.parse(browserInfoJson);
56
+ }
57
+ catch {
58
+ return { raw: browserInfoJson };
59
+ }
60
+ }
61
+ function parseConsoleErrors(consoleErrorsJson) {
62
+ if (!consoleErrorsJson)
63
+ return [];
64
+ try {
65
+ return JSON.parse(consoleErrorsJson);
66
+ }
67
+ catch {
68
+ return [consoleErrorsJson];
69
+ }
70
+ }
71
+ // ===== Bug Report Prompts =====
72
+ function generateBugFixPrompt(bug) {
73
+ const browserInfo = parseBrowserInfo(bug.browserInfo);
74
+ const consoleErrors = parseConsoleErrors(bug.consoleErrors);
75
+ let prompt = `# Bug Fix Request: ${bug.ticketNumber}
76
+
77
+ ## Issue Summary
78
+ **Title:** ${bug.title}
79
+ **Severity:** ${bug.severity.toUpperCase()}
80
+ **Reported:** ${formatDate(bug.createdAt)}
81
+ **URL:** ${bug.url}${bug.route ? `\n**Route:** ${bug.route}` : ""}
82
+
83
+ ## Description
84
+ ${bug.description}
85
+ `;
86
+ if (bug.aiSummary) {
87
+ prompt += `\n## AI Summary\n${bug.aiSummary}\n`;
88
+ }
89
+ if (bug.aiRootCauseAnalysis) {
90
+ prompt += `\n## Root Cause Analysis\n${bug.aiRootCauseAnalysis}\n`;
91
+ }
92
+ if (bug.aiReproductionSteps && bug.aiReproductionSteps.length > 0) {
93
+ prompt += `\n## Steps to Reproduce\n${bug.aiReproductionSteps.map((s, i) => `${i + 1}. ${s}`).join("\n")}\n`;
94
+ }
95
+ if (bug.aiSuggestedFix) {
96
+ prompt += `\n## Suggested Fix\n${bug.aiSuggestedFix}\n`;
97
+ }
98
+ if (consoleErrors.length > 0) {
99
+ prompt += `\n## Console Errors\n\`\`\`\n${JSON.stringify(consoleErrors, null, 2)}\n\`\`\`\n`;
100
+ }
101
+ prompt += `\n## Environment\n- **Browser:** ${browserInfo.userAgent || "Unknown"}\n- **Viewport:** ${bug.viewportWidth}x${bug.viewportHeight}\n`;
102
+ if (bug.aiEstimatedEffort) {
103
+ prompt += `\n## Estimated Effort: ${bug.aiEstimatedEffort.toUpperCase()}\n`;
104
+ }
105
+ prompt += `\n## Instructions\nPlease fix the bug described above. Focus on:\n1. Identifying the root cause in the codebase\n2. Implementing a fix that addresses the issue\n3. Ensuring the fix doesn't introduce regressions\n4. Adding appropriate error handling if needed\n`;
106
+ return prompt;
107
+ }
108
+ function generateBugAnalyzePrompt(bug) {
109
+ const browserInfo = parseBrowserInfo(bug.browserInfo);
110
+ const consoleErrors = parseConsoleErrors(bug.consoleErrors);
111
+ let prompt = `# Deep Analysis Request: ${bug.ticketNumber}
112
+
113
+ ## Bug Report
114
+ **Title:** ${bug.title}
115
+ **Severity:** ${bug.severity.toUpperCase()}
116
+ **Reported:** ${formatDate(bug.createdAt)}
117
+ **URL:** ${bug.url}${bug.route ? `\n**Route:** ${bug.route}` : ""}
118
+
119
+ ## Description
120
+ ${bug.description}
121
+ `;
122
+ if (consoleErrors.length > 0) {
123
+ prompt += `\n## Console Errors\n\`\`\`json\n${JSON.stringify(consoleErrors, null, 2)}\n\`\`\`\n`;
124
+ }
125
+ prompt += `\n## Environment\n\`\`\`json\n${JSON.stringify(browserInfo, null, 2)}\n\`\`\`\n**Viewport:** ${bug.viewportWidth}x${bug.viewportHeight}\n`;
126
+ prompt += `\n## Analysis Instructions\nPlease perform a deep analysis of this bug report:\n\n1. **Root Cause Analysis**: What is likely causing this issue?\n2. **Impact Assessment**: What parts of the application could be affected?\n3. **Reproduction Steps**: Based on the context, what steps would reproduce this?\n4. **Fix Strategy**: What approach would you recommend to fix this?\n5. **Risk Assessment**: What are the risks of the proposed fix?\n6. **Testing Requirements**: What tests should be added or updated?\n`;
127
+ return prompt;
128
+ }
129
+ function generateBugCodebuffPrompt(bug) {
130
+ const consoleErrors = parseConsoleErrors(bug.consoleErrors);
131
+ let prompt = `Fix bug ${bug.ticketNumber}: ${bug.title}\n\n`;
132
+ prompt += `**Severity:** ${bug.severity}\n`;
133
+ prompt += `**URL:** ${bug.url}\n`;
134
+ if (bug.route)
135
+ prompt += `**Route:** ${bug.route}\n`;
136
+ prompt += `\n${bug.description}\n`;
137
+ if (bug.aiRootCauseAnalysis) {
138
+ prompt += `\n**Root Cause:** ${bug.aiRootCauseAnalysis}\n`;
139
+ }
140
+ if (bug.aiSuggestedFix) {
141
+ prompt += `\n**Suggested Fix:** ${bug.aiSuggestedFix}\n`;
142
+ }
143
+ if (consoleErrors.length > 0) {
144
+ prompt += `\n**Console Errors:**\n\`\`\`\n${JSON.stringify(consoleErrors, null, 2)}\n\`\`\`\n`;
145
+ }
146
+ return prompt;
147
+ }
148
+ // ===== Feedback Prompts =====
149
+ function generateFeedbackImplementPrompt(feedback) {
150
+ const typeLabel = feedback.type.replace("_", " ").replace(/\b\w/g, (l) => l.toUpperCase());
151
+ let prompt = `# Implementation Request: ${feedback.ticketNumber}
152
+
153
+ ## Request Summary
154
+ **Title:** ${feedback.title}
155
+ **Type:** ${typeLabel}
156
+ **Priority:** ${feedback.priority.replace("_", " ").toUpperCase()}
157
+ **Requested:** ${formatDate(feedback.createdAt)}
158
+ **Context URL:** ${feedback.url}${feedback.route ? `\n**Route:** ${feedback.route}` : ""}
159
+
160
+ ## Description
161
+ ${feedback.description}
162
+ `;
163
+ if (feedback.aiSummary) {
164
+ prompt += `\n## Summary\n${feedback.aiSummary}\n`;
165
+ }
166
+ if (feedback.aiImpactAnalysis) {
167
+ prompt += `\n## Impact Analysis\n${feedback.aiImpactAnalysis}\n`;
168
+ }
169
+ if (feedback.aiActionItems && feedback.aiActionItems.length > 0) {
170
+ prompt += `\n## Action Items\n${feedback.aiActionItems.map((item, i) => `${i + 1}. ${item}`).join("\n")}\n`;
171
+ }
172
+ if (feedback.aiEstimatedEffort) {
173
+ prompt += `\n## Estimated Effort: ${feedback.aiEstimatedEffort.toUpperCase()}\n`;
174
+ }
175
+ prompt += `\n## Implementation Instructions\nPlease implement this ${typeLabel.toLowerCase()}. Focus on:\n1. Understanding the user's need and use case\n2. Designing a solution that fits the existing architecture\n3. Implementing the feature with proper error handling\n4. Adding appropriate tests\n5. Updating documentation if needed\n`;
176
+ return prompt;
177
+ }
178
+ function generateFeedbackAnalyzePrompt(feedback) {
179
+ const typeLabel = feedback.type.replace("_", " ").replace(/\b\w/g, (l) => l.toUpperCase());
180
+ let prompt = `# Analysis Request: ${feedback.ticketNumber}
181
+
182
+ ## Feedback Details
183
+ **Title:** ${feedback.title}
184
+ **Type:** ${typeLabel}
185
+ **Priority:** ${feedback.priority.replace("_", " ").toUpperCase()}
186
+ **Submitted:** ${formatDate(feedback.createdAt)}
187
+ **Context URL:** ${feedback.url}${feedback.route ? `\n**Route:** ${feedback.route}` : ""}
188
+
189
+ ## Description
190
+ ${feedback.description}
191
+ `;
192
+ prompt += `\n## Analysis Instructions\nPlease analyze this ${typeLabel.toLowerCase()} and provide:\n\n1. **Feasibility Assessment**: Is this technically feasible? What are the constraints?\n2. **Impact Analysis**: How would this affect the existing system?\n3. **Effort Estimation**: How much work would this require?\n4. **Alternative Approaches**: Are there simpler ways to achieve the user's goal?\n5. **Dependencies**: What other features or systems would this depend on?\n6. **Risks**: What could go wrong with this implementation?\n`;
193
+ return prompt;
194
+ }
195
+ function generateFeedbackCodebuffPrompt(feedback) {
196
+ const typeLabel = feedback.type === "feature_request" ? "feature" : feedback.type === "change_request" ? "change" : "feedback";
197
+ let prompt = `Implement ${typeLabel} ${feedback.ticketNumber}: ${feedback.title}\n\n`;
198
+ prompt += `**Priority:** ${feedback.priority.replace("_", " ")}\n`;
199
+ prompt += `**URL:** ${feedback.url}\n`;
200
+ if (feedback.route)
201
+ prompt += `**Route:** ${feedback.route}\n`;
202
+ prompt += `\n${feedback.description}\n`;
203
+ if (feedback.aiActionItems && feedback.aiActionItems.length > 0) {
204
+ prompt += `\n**Action Items:**\n${feedback.aiActionItems.map((item) => `- ${item}`).join("\n")}\n`;
205
+ }
206
+ return prompt;
207
+ }
208
+ // ===== Public API =====
209
+ /**
210
+ * Generate an AI prompt for a bug report.
211
+ */
212
+ export function generateBugPrompt(bug, template) {
213
+ switch (template) {
214
+ case "fix":
215
+ return generateBugFixPrompt(bug);
216
+ case "analyze":
217
+ return generateBugAnalyzePrompt(bug);
218
+ case "codebuff":
219
+ return generateBugCodebuffPrompt(bug);
220
+ case "implement":
221
+ // For bugs, "implement" falls back to "fix"
222
+ return generateBugFixPrompt(bug);
223
+ }
224
+ }
225
+ /**
226
+ * Generate an AI prompt for feedback.
227
+ */
228
+ export function generateFeedbackPrompt(feedback, template) {
229
+ switch (template) {
230
+ case "implement":
231
+ return generateFeedbackImplementPrompt(feedback);
232
+ case "analyze":
233
+ return generateFeedbackAnalyzePrompt(feedback);
234
+ case "codebuff":
235
+ return generateFeedbackCodebuffPrompt(feedback);
236
+ case "fix":
237
+ // For feedback, "fix" falls back to "implement"
238
+ return generateFeedbackImplementPrompt(feedback);
239
+ }
240
+ }
241
+ /**
242
+ * Get a bug report by ticket number (internal query).
243
+ */
244
+ export const getBugByTicketNumber = internalQuery({
245
+ args: {
246
+ ticketNumber: v.string(),
247
+ },
248
+ returns: v.union(bugReportDataValidator, v.null()),
249
+ handler: async (ctx, args) => {
250
+ const bug = await ctx.db
251
+ .query("bugReports")
252
+ .withIndex("by_ticket_number", (q) => q.eq("ticketNumber", args.ticketNumber))
253
+ .unique();
254
+ if (!bug || !bug.ticketNumber) {
255
+ return null;
256
+ }
257
+ return {
258
+ _id: bug._id,
259
+ ticketNumber: bug.ticketNumber,
260
+ title: bug.title,
261
+ description: bug.description,
262
+ severity: bug.severity,
263
+ status: bug.status,
264
+ url: bug.url,
265
+ route: bug.route,
266
+ browserInfo: bug.browserInfo,
267
+ consoleErrors: bug.consoleErrors,
268
+ viewportWidth: bug.viewportWidth,
269
+ viewportHeight: bug.viewportHeight,
270
+ networkState: bug.networkState,
271
+ aiSummary: bug.aiSummary,
272
+ aiRootCauseAnalysis: bug.aiRootCauseAnalysis,
273
+ aiReproductionSteps: bug.aiReproductionSteps,
274
+ aiSuggestedFix: bug.aiSuggestedFix,
275
+ aiEstimatedEffort: bug.aiEstimatedEffort,
276
+ createdAt: bug.createdAt,
277
+ };
278
+ },
279
+ });
280
+ /**
281
+ * Get feedback by ticket number (internal query).
282
+ */
283
+ export const getFeedbackByTicketNumber = internalQuery({
284
+ args: {
285
+ ticketNumber: v.string(),
286
+ },
287
+ returns: v.union(feedbackDataValidator, v.null()),
288
+ handler: async (ctx, args) => {
289
+ const feedback = await ctx.db
290
+ .query("feedback")
291
+ .withIndex("by_ticket_number", (q) => q.eq("ticketNumber", args.ticketNumber))
292
+ .unique();
293
+ if (!feedback || !feedback.ticketNumber) {
294
+ return null;
295
+ }
296
+ return {
297
+ _id: feedback._id,
298
+ ticketNumber: feedback.ticketNumber,
299
+ type: feedback.type,
300
+ title: feedback.title,
301
+ description: feedback.description,
302
+ priority: feedback.priority,
303
+ status: feedback.status,
304
+ url: feedback.url,
305
+ route: feedback.route,
306
+ browserInfo: feedback.browserInfo,
307
+ consoleErrors: feedback.consoleErrors,
308
+ viewportWidth: feedback.viewportWidth,
309
+ viewportHeight: feedback.viewportHeight,
310
+ networkState: feedback.networkState,
311
+ aiSummary: feedback.aiSummary,
312
+ aiImpactAnalysis: feedback.aiImpactAnalysis,
313
+ aiActionItems: feedback.aiActionItems,
314
+ aiEstimatedEffort: feedback.aiEstimatedEffort,
315
+ createdAt: feedback.createdAt,
316
+ };
317
+ },
318
+ });
319
+ /**
320
+ * Public query to get a prompt by ticket number.
321
+ */
322
+ export const getPrompt = query({
323
+ args: {
324
+ ticketNumber: v.string(),
325
+ template: v.optional(promptTemplateValidator),
326
+ },
327
+ returns: v.union(v.object({
328
+ ticketNumber: v.string(),
329
+ type: v.union(v.literal("bug"), v.literal("feedback")),
330
+ template: promptTemplateValidator,
331
+ prompt: v.string(),
332
+ }), v.null()),
333
+ handler: async (ctx, args) => {
334
+ const ticketNumber = args.ticketNumber.toUpperCase();
335
+ const isBug = ticketNumber.startsWith("BUG-");
336
+ const isFeedback = ticketNumber.startsWith("FB-");
337
+ if (!isBug && !isFeedback) {
338
+ return null;
339
+ }
340
+ if (isBug) {
341
+ const bug = await ctx.db
342
+ .query("bugReports")
343
+ .withIndex("by_ticket_number", (q) => q.eq("ticketNumber", ticketNumber))
344
+ .unique();
345
+ if (!bug || !bug.ticketNumber) {
346
+ return null;
347
+ }
348
+ const template = args.template ?? "fix";
349
+ return {
350
+ ticketNumber: bug.ticketNumber,
351
+ type: "bug",
352
+ template,
353
+ prompt: generateBugPrompt({
354
+ ticketNumber: bug.ticketNumber,
355
+ title: bug.title,
356
+ description: bug.description,
357
+ severity: bug.severity,
358
+ url: bug.url,
359
+ route: bug.route,
360
+ browserInfo: bug.browserInfo,
361
+ consoleErrors: bug.consoleErrors,
362
+ viewportWidth: bug.viewportWidth,
363
+ viewportHeight: bug.viewportHeight,
364
+ aiSummary: bug.aiSummary,
365
+ aiRootCauseAnalysis: bug.aiRootCauseAnalysis,
366
+ aiReproductionSteps: bug.aiReproductionSteps,
367
+ aiSuggestedFix: bug.aiSuggestedFix,
368
+ aiEstimatedEffort: bug.aiEstimatedEffort,
369
+ createdAt: bug.createdAt,
370
+ }, template),
371
+ };
372
+ }
373
+ // Feedback
374
+ const feedback = await ctx.db
375
+ .query("feedback")
376
+ .withIndex("by_ticket_number", (q) => q.eq("ticketNumber", ticketNumber))
377
+ .unique();
378
+ if (!feedback || !feedback.ticketNumber) {
379
+ return null;
380
+ }
381
+ const template = args.template ?? "implement";
382
+ return {
383
+ ticketNumber: feedback.ticketNumber,
384
+ type: "feedback",
385
+ template,
386
+ prompt: generateFeedbackPrompt({
387
+ ticketNumber: feedback.ticketNumber,
388
+ type: feedback.type,
389
+ title: feedback.title,
390
+ description: feedback.description,
391
+ priority: feedback.priority,
392
+ url: feedback.url,
393
+ route: feedback.route,
394
+ aiSummary: feedback.aiSummary,
395
+ aiImpactAnalysis: feedback.aiImpactAnalysis,
396
+ aiActionItems: feedback.aiActionItems,
397
+ aiEstimatedEffort: feedback.aiEstimatedEffort,
398
+ createdAt: feedback.createdAt,
399
+ }, template),
400
+ };
401
+ },
402
+ });
403
+ //# sourceMappingURL=prompts.js.map