@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.
- package/README.md +346 -4
- package/dist/convex/_generated/api.d.ts +2310 -0
- package/dist/convex/_generated/api.d.ts.map +1 -0
- package/dist/convex/_generated/api.js +32 -0
- package/dist/convex/_generated/api.js.map +1 -0
- package/dist/convex/_generated/dataModel.d.ts +46 -0
- package/dist/convex/_generated/dataModel.d.ts.map +1 -0
- package/dist/convex/_generated/dataModel.js +11 -0
- package/dist/convex/_generated/dataModel.js.map +1 -0
- package/dist/convex/_generated/server.d.ts +121 -0
- package/dist/convex/_generated/server.d.ts.map +1 -0
- package/dist/convex/_generated/server.js +78 -0
- package/dist/convex/_generated/server.js.map +1 -0
- package/dist/convex/agents/bugReportAgent.d.ts +35 -9
- package/dist/convex/agents/bugReportAgent.d.ts.map +1 -1
- package/dist/convex/agents/bugReportAgent.js +61 -27
- package/dist/convex/agents/bugReportAgent.js.map +1 -1
- package/dist/convex/agents/feedbackAgent.d.ts +35 -9
- package/dist/convex/agents/feedbackAgent.d.ts.map +1 -1
- package/dist/convex/agents/feedbackAgent.js +61 -27
- package/dist/convex/agents/feedbackAgent.js.map +1 -1
- package/dist/convex/agents/feedbackInterviewAgent.d.ts +76 -0
- package/dist/convex/agents/feedbackInterviewAgent.d.ts.map +1 -0
- package/dist/convex/agents/feedbackInterviewAgent.js +812 -0
- package/dist/convex/agents/feedbackInterviewAgent.js.map +1 -0
- package/dist/convex/agents/index.d.ts +9 -0
- package/dist/convex/agents/index.d.ts.map +1 -0
- package/dist/convex/agents/index.js +13 -0
- package/dist/convex/agents/index.js.map +1 -0
- package/dist/convex/apiKeys.d.ts +56 -0
- package/dist/convex/apiKeys.d.ts.map +1 -0
- package/dist/convex/apiKeys.js +197 -0
- package/dist/convex/apiKeys.js.map +1 -0
- package/dist/convex/bugReports.d.ts +131 -11
- package/dist/convex/bugReports.d.ts.map +1 -1
- package/dist/convex/bugReports.js +138 -10
- package/dist/convex/bugReports.js.map +1 -1
- package/dist/convex/emails/bugReportEmails.d.ts +31 -2
- package/dist/convex/emails/bugReportEmails.d.ts.map +1 -1
- package/dist/convex/emails/bugReportEmails.js +6 -3
- package/dist/convex/emails/bugReportEmails.js.map +1 -1
- package/dist/convex/emails/feedbackEmails.d.ts +31 -2
- package/dist/convex/emails/feedbackEmails.d.ts.map +1 -1
- package/dist/convex/emails/feedbackEmails.js +6 -3
- package/dist/convex/emails/feedbackEmails.js.map +1 -1
- package/dist/convex/feedback.d.ts +132 -11
- package/dist/convex/feedback.d.ts.map +1 -1
- package/dist/convex/feedback.js +146 -9
- package/dist/convex/feedback.js.map +1 -1
- package/dist/convex/http.d.ts +39 -0
- package/dist/convex/http.d.ts.map +1 -0
- package/dist/convex/http.js +467 -0
- package/dist/convex/http.js.map +1 -0
- package/dist/convex/index.d.ts +8 -1
- package/dist/convex/index.d.ts.map +1 -1
- package/dist/convex/index.js +8 -1
- package/dist/convex/index.js.map +1 -1
- package/dist/convex/inputRequests.d.ts +118 -0
- package/dist/convex/inputRequests.d.ts.map +1 -0
- package/dist/convex/inputRequests.js +141 -0
- package/dist/convex/inputRequests.js.map +1 -0
- package/dist/convex/prompts.d.ts +110 -0
- package/dist/convex/prompts.d.ts.map +1 -0
- package/dist/convex/prompts.js +403 -0
- package/dist/convex/prompts.js.map +1 -0
- package/dist/convex/schema.d.ts +310 -54
- package/dist/convex/schema.d.ts.map +1 -1
- package/dist/convex/schema.js +120 -2
- package/dist/convex/schema.js.map +1 -1
- package/dist/convex/supportTeams.d.ts +69 -7
- package/dist/convex/supportTeams.d.ts.map +1 -1
- package/dist/index.d.ts +28 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -2
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +35 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +12 -5
- package/src/convex/_generated/api.ts +1 -0
- package/src/convex/agents/feedbackInterviewAgent.ts +6 -12
- package/src/convex/apiKeys.test.ts +79 -0
- package/src/convex/apiKeys.ts +223 -0
- package/src/convex/bugReports.ts +126 -1
- package/src/convex/feedback.ts +134 -1
- package/src/convex/http.test.ts +76 -0
- package/src/convex/http.ts +630 -0
- package/src/convex/index.ts +11 -0
- package/src/convex/prompts.test.ts +185 -0
- package/src/convex/prompts.ts +605 -0
- package/src/convex/schema.ts +52 -2
- package/src/convex/ticketNumbers.ts +4 -0
- package/src/convex/tsconfig.json +24 -0
- package/src/index.ts +33 -1
- package/src/types.ts +38 -0
- package/dist/convex/convex.config.d.ts +0 -3
- package/dist/convex/convex.config.d.ts.map +0 -1
- package/dist/convex/convex.config.js +0 -6
- package/dist/convex/convex.config.js.map +0 -1
|
@@ -15,29 +15,22 @@ import { v } from "convex/values";
|
|
|
15
15
|
import { Agent, createThread } from "@convex-dev/agent";
|
|
16
16
|
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
|
17
17
|
import { components, internal } from "../_generated/api";
|
|
18
|
-
import { internalAction, internalQuery } from "../_generated/server";
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
}
|
|
18
|
+
import { action, internalAction, internalQuery } from "../_generated/server";
|
|
19
|
+
// Helper to create OpenRouter provider dynamically
|
|
20
|
+
// This is created dynamically because Convex components don't inherit parent env vars
|
|
21
|
+
function createOpenRouterProvider(apiKey) {
|
|
22
|
+
return createOpenAICompatible({
|
|
23
|
+
name: "openrouter",
|
|
24
|
+
baseURL: "https://openrouter.ai/api/v1",
|
|
25
|
+
headers: {
|
|
26
|
+
Authorization: `Bearer ${apiKey}`,
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
}
|
|
27
30
|
// Agent name constant
|
|
28
31
|
const AGENT_NAME = "Bug Report Analyst";
|
|
29
|
-
//
|
|
30
|
-
|
|
31
|
-
// ============================================================================
|
|
32
|
-
/**
|
|
33
|
-
* Bug Report Analysis Agent
|
|
34
|
-
*
|
|
35
|
-
* Analyzes bug report submissions and generates comprehensive analysis.
|
|
36
|
-
*/
|
|
37
|
-
export const bugReportAgent = new Agent(components.agent, {
|
|
38
|
-
name: AGENT_NAME,
|
|
39
|
-
languageModel: openrouter.languageModel("anthropic/claude-sonnet-4"),
|
|
40
|
-
instructions: `You are the Bug Report Analyst, an AI assistant that analyzes bug report submissions.
|
|
32
|
+
// Agent instructions (shared between dynamic agent instances)
|
|
33
|
+
const BUG_REPORT_AGENT_INSTRUCTIONS = `You are the Bug Report Analyst, an AI assistant that analyzes bug report submissions.
|
|
41
34
|
|
|
42
35
|
When given a bug report, you will:
|
|
43
36
|
1. **Summarize** the bug in 2-3 clear sentences
|
|
@@ -67,10 +60,7 @@ Always respond in the following JSON format:
|
|
|
67
60
|
- Reproduction steps should be specific and actionable
|
|
68
61
|
- Suggested fix should be practical and implementable
|
|
69
62
|
- Effort estimation should account for investigation, fix, testing, and deployment
|
|
70
|
-
- Severity should reflect user impact and business criticality
|
|
71
|
-
tools: {},
|
|
72
|
-
maxSteps: 3,
|
|
73
|
-
});
|
|
63
|
+
- Severity should reflect user impact and business criticality`;
|
|
74
64
|
// ============================================================================
|
|
75
65
|
// Internal Queries
|
|
76
66
|
// ============================================================================
|
|
@@ -120,20 +110,27 @@ export const getBugReportForAnalysis = internalQuery({
|
|
|
120
110
|
export const processBugReport = internalAction({
|
|
121
111
|
args: {
|
|
122
112
|
bugReportId: v.id("bugReports"),
|
|
113
|
+
// Optional API keys - passed from parent app since components don't inherit env vars
|
|
114
|
+
openRouterApiKey: v.optional(v.string()),
|
|
115
|
+
resendApiKey: v.optional(v.string()),
|
|
116
|
+
resendFromEmail: v.optional(v.string()),
|
|
123
117
|
},
|
|
124
118
|
returns: v.object({
|
|
125
119
|
success: v.boolean(),
|
|
126
120
|
error: v.optional(v.string()),
|
|
127
121
|
}),
|
|
128
122
|
handler: async (ctx, args) => {
|
|
129
|
-
// Check if OpenRouter API key is configured
|
|
130
|
-
|
|
123
|
+
// Check if OpenRouter API key is configured - prefer args (from parent app), fallback to env
|
|
124
|
+
const apiKey = args.openRouterApiKey || process.env.OPENROUTER_API_KEY;
|
|
125
|
+
if (!apiKey) {
|
|
131
126
|
console.log("OPENROUTER_API_KEY not configured, skipping AI analysis");
|
|
132
127
|
// Still try to send notifications without AI analysis
|
|
133
128
|
try {
|
|
134
129
|
await ctx.runAction(internal.emails.bugReportEmails.sendBugReportNotifications, {
|
|
135
130
|
reportId: args.bugReportId,
|
|
136
131
|
analysis: null,
|
|
132
|
+
resendApiKey: args.resendApiKey,
|
|
133
|
+
resendFromEmail: args.resendFromEmail,
|
|
137
134
|
});
|
|
138
135
|
}
|
|
139
136
|
catch {
|
|
@@ -152,6 +149,16 @@ export const processBugReport = internalAction({
|
|
|
152
149
|
const threadId = await createThread(ctx, components.agent, {
|
|
153
150
|
title: `Bug Report Analysis: ${bugReport.title}`,
|
|
154
151
|
});
|
|
152
|
+
// Create OpenRouter provider dynamically with the API key
|
|
153
|
+
const openrouter = createOpenRouterProvider(apiKey);
|
|
154
|
+
// Create agent dynamically to ensure API key is available at runtime
|
|
155
|
+
const bugReportAgent = new Agent(components.agent, {
|
|
156
|
+
name: AGENT_NAME,
|
|
157
|
+
languageModel: openrouter.languageModel("anthropic/claude-sonnet-4"),
|
|
158
|
+
instructions: BUG_REPORT_AGENT_INSTRUCTIONS,
|
|
159
|
+
tools: {},
|
|
160
|
+
maxSteps: 3,
|
|
161
|
+
});
|
|
155
162
|
// Build the prompt for analysis
|
|
156
163
|
const consoleErrorsSection = bugReport.consoleErrors
|
|
157
164
|
? `**Console Errors:** ${bugReport.consoleErrors}`
|
|
@@ -228,6 +235,8 @@ Provide your analysis in the JSON format specified.`;
|
|
|
228
235
|
suggestedFix: analysis.suggestedFix,
|
|
229
236
|
estimatedEffort: analysis.estimatedEffort,
|
|
230
237
|
},
|
|
238
|
+
resendApiKey: args.resendApiKey,
|
|
239
|
+
resendFromEmail: args.resendFromEmail,
|
|
231
240
|
});
|
|
232
241
|
// Mark notifications as sent
|
|
233
242
|
await ctx.runMutation(internal.bugReports.markNotificationsSent, {
|
|
@@ -240,4 +249,29 @@ Provide your analysis in the JSON format specified.`;
|
|
|
240
249
|
return { success: true };
|
|
241
250
|
},
|
|
242
251
|
});
|
|
252
|
+
/**
|
|
253
|
+
* Public wrapper for processBugReport that can be called from parent app.
|
|
254
|
+
* Accepts optional API keys since Convex components don't inherit parent env vars.
|
|
255
|
+
*/
|
|
256
|
+
export const processBugReportPublic = action({
|
|
257
|
+
args: {
|
|
258
|
+
bugReportId: v.id("bugReports"),
|
|
259
|
+
openRouterApiKey: v.optional(v.string()),
|
|
260
|
+
resendApiKey: v.optional(v.string()),
|
|
261
|
+
resendFromEmail: v.optional(v.string()),
|
|
262
|
+
},
|
|
263
|
+
returns: v.object({
|
|
264
|
+
success: v.boolean(),
|
|
265
|
+
error: v.optional(v.string()),
|
|
266
|
+
}),
|
|
267
|
+
handler: async (ctx, args) => {
|
|
268
|
+
// Delegate to the internal action
|
|
269
|
+
return await ctx.runAction(internal.agents.bugReportAgent.processBugReport, {
|
|
270
|
+
bugReportId: args.bugReportId,
|
|
271
|
+
openRouterApiKey: args.openRouterApiKey,
|
|
272
|
+
resendApiKey: args.resendApiKey,
|
|
273
|
+
resendFromEmail: args.resendFromEmail,
|
|
274
|
+
});
|
|
275
|
+
},
|
|
276
|
+
});
|
|
243
277
|
//# sourceMappingURL=bugReportAgent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bugReportAgent.js","sourceRoot":"","sources":["../../../src/convex/agents/bugReportAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"bugReportAgent.js","sourceRoot":"","sources":["../../../src/convex/agents/bugReportAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,20 +10,46 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Triggers email notifications to the reporter and assigned team.
|
|
12
12
|
*/
|
|
13
|
-
import { Agent } from "@convex-dev/agent";
|
|
14
|
-
/**
|
|
15
|
-
* Feedback Analysis Agent
|
|
16
|
-
*
|
|
17
|
-
* Analyzes feedback submissions and generates comprehensive reports.
|
|
18
|
-
*/
|
|
19
|
-
export declare const feedbackAgent: Agent<object, {}>;
|
|
20
13
|
/**
|
|
21
14
|
* Get feedback by ID for analysis
|
|
22
15
|
*/
|
|
23
|
-
export declare const getFeedbackForAnalysis:
|
|
16
|
+
export declare const getFeedbackForAnalysis: import("convex/server").RegisteredQuery<"internal", {
|
|
17
|
+
feedbackId: import("convex/values").GenericId<"feedback">;
|
|
18
|
+
}, Promise<{
|
|
19
|
+
_id: import("convex/values").GenericId<"feedback">;
|
|
20
|
+
type: "feature_request" | "change_request" | "general";
|
|
21
|
+
title: string;
|
|
22
|
+
description: string;
|
|
23
|
+
priority: "critical" | "nice_to_have" | "important";
|
|
24
|
+
reporterName: string;
|
|
25
|
+
reporterEmail: string;
|
|
26
|
+
url: string;
|
|
27
|
+
browserInfo: string;
|
|
28
|
+
}>>;
|
|
24
29
|
/**
|
|
25
30
|
* Analyze feedback using AI and send notifications.
|
|
26
31
|
* This is the main entry point triggered after feedback creation.
|
|
27
32
|
*/
|
|
28
|
-
export declare const processFeedback:
|
|
33
|
+
export declare const processFeedback: import("convex/server").RegisteredAction<"internal", {
|
|
34
|
+
openRouterApiKey?: string;
|
|
35
|
+
resendApiKey?: string;
|
|
36
|
+
resendFromEmail?: string;
|
|
37
|
+
feedbackId: import("convex/values").GenericId<"feedback">;
|
|
38
|
+
}, Promise<{
|
|
39
|
+
success: boolean;
|
|
40
|
+
error?: string;
|
|
41
|
+
}>>;
|
|
42
|
+
/**
|
|
43
|
+
* Public wrapper for processFeedback that can be called from parent app.
|
|
44
|
+
* Accepts optional API keys since Convex components don't inherit parent env vars.
|
|
45
|
+
*/
|
|
46
|
+
export declare const processFeedbackPublic: import("convex/server").RegisteredAction<"public", {
|
|
47
|
+
openRouterApiKey?: string;
|
|
48
|
+
resendApiKey?: string;
|
|
49
|
+
resendFromEmail?: string;
|
|
50
|
+
feedbackId: import("convex/values").GenericId<"feedback">;
|
|
51
|
+
}, Promise<{
|
|
52
|
+
success: boolean;
|
|
53
|
+
error?: string;
|
|
54
|
+
}>>;
|
|
29
55
|
//# sourceMappingURL=feedbackAgent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedbackAgent.d.ts","sourceRoot":"","sources":["../../../src/convex/agents/feedbackAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"feedbackAgent.d.ts","sourceRoot":"","sources":["../../../src/convex/agents/feedbackAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA0DH;;GAEG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;GAmCjC,CAAC;AAMH;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;aAYqB,OAAO;YAAU,MAAM;GA8ItE,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,qBAAqB;;;;;;aAWe,OAAO;YAAU,MAAM;GAStE,CAAC"}
|
|
@@ -14,29 +14,22 @@ import { v } from "convex/values";
|
|
|
14
14
|
import { Agent, createThread } from "@convex-dev/agent";
|
|
15
15
|
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
|
16
16
|
import { components, internal } from "../_generated/api";
|
|
17
|
-
import { internalAction, internalQuery } from "../_generated/server";
|
|
18
|
-
//
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
17
|
+
import { action, internalAction, internalQuery } from "../_generated/server";
|
|
18
|
+
// Helper to create OpenRouter provider dynamically
|
|
19
|
+
// This is created dynamically because Convex components don't inherit parent env vars
|
|
20
|
+
function createOpenRouterProvider(apiKey) {
|
|
21
|
+
return createOpenAICompatible({
|
|
22
|
+
name: "openrouter",
|
|
23
|
+
baseURL: "https://openrouter.ai/api/v1",
|
|
24
|
+
headers: {
|
|
25
|
+
Authorization: `Bearer ${apiKey}`,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
}
|
|
26
29
|
// Agent name constant
|
|
27
30
|
const AGENT_NAME = "Feedback Analyst";
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
// ============================================================================
|
|
31
|
-
/**
|
|
32
|
-
* Feedback Analysis Agent
|
|
33
|
-
*
|
|
34
|
-
* Analyzes feedback submissions and generates comprehensive reports.
|
|
35
|
-
*/
|
|
36
|
-
export const feedbackAgent = new Agent(components.agent, {
|
|
37
|
-
name: AGENT_NAME,
|
|
38
|
-
languageModel: openrouter.languageModel("anthropic/claude-sonnet-4"),
|
|
39
|
-
instructions: `You are the Feedback Analyst, an AI assistant that analyzes user feedback submissions.
|
|
31
|
+
// Agent instructions (shared between dynamic agent instances)
|
|
32
|
+
const FEEDBACK_AGENT_INSTRUCTIONS = `You are the Feedback Analyst, an AI assistant that analyzes user feedback submissions.
|
|
40
33
|
|
|
41
34
|
When given feedback, you will:
|
|
42
35
|
1. **Summarize** the feedback in 2-3 clear sentences
|
|
@@ -63,10 +56,7 @@ Always respond in the following JSON format:
|
|
|
63
56
|
- Consider both technical and business impact
|
|
64
57
|
- Action items should be specific and actionable
|
|
65
58
|
- Effort estimation should account for development, testing, and deployment
|
|
66
|
-
- Priority should reflect urgency and user impact
|
|
67
|
-
tools: {},
|
|
68
|
-
maxSteps: 3,
|
|
69
|
-
});
|
|
59
|
+
- Priority should reflect urgency and user impact`;
|
|
70
60
|
// ============================================================================
|
|
71
61
|
// Internal Queries
|
|
72
62
|
// ============================================================================
|
|
@@ -116,20 +106,27 @@ export const getFeedbackForAnalysis = internalQuery({
|
|
|
116
106
|
export const processFeedback = internalAction({
|
|
117
107
|
args: {
|
|
118
108
|
feedbackId: v.id("feedback"),
|
|
109
|
+
// Optional API keys - passed from parent app since components don't inherit env vars
|
|
110
|
+
openRouterApiKey: v.optional(v.string()),
|
|
111
|
+
resendApiKey: v.optional(v.string()),
|
|
112
|
+
resendFromEmail: v.optional(v.string()),
|
|
119
113
|
},
|
|
120
114
|
returns: v.object({
|
|
121
115
|
success: v.boolean(),
|
|
122
116
|
error: v.optional(v.string()),
|
|
123
117
|
}),
|
|
124
118
|
handler: async (ctx, args) => {
|
|
125
|
-
// Check if OpenRouter API key is configured
|
|
126
|
-
|
|
119
|
+
// Check if OpenRouter API key is configured - prefer args (from parent app), fallback to env
|
|
120
|
+
const apiKey = args.openRouterApiKey || process.env.OPENROUTER_API_KEY;
|
|
121
|
+
if (!apiKey) {
|
|
127
122
|
console.log("OPENROUTER_API_KEY not configured, skipping AI analysis");
|
|
128
123
|
// Still try to send notifications without AI analysis
|
|
129
124
|
try {
|
|
130
125
|
await ctx.runAction(internal.emails.feedbackEmails.sendFeedbackNotifications, {
|
|
131
126
|
feedbackId: args.feedbackId,
|
|
132
127
|
analysis: null,
|
|
128
|
+
resendApiKey: args.resendApiKey,
|
|
129
|
+
resendFromEmail: args.resendFromEmail,
|
|
133
130
|
});
|
|
134
131
|
}
|
|
135
132
|
catch {
|
|
@@ -148,6 +145,16 @@ export const processFeedback = internalAction({
|
|
|
148
145
|
const threadId = await createThread(ctx, components.agent, {
|
|
149
146
|
title: `Feedback Analysis: ${feedback.title}`,
|
|
150
147
|
});
|
|
148
|
+
// Create OpenRouter provider dynamically with the API key
|
|
149
|
+
const openrouter = createOpenRouterProvider(apiKey);
|
|
150
|
+
// Create agent dynamically to ensure API key is available at runtime
|
|
151
|
+
const feedbackAgent = new Agent(components.agent, {
|
|
152
|
+
name: AGENT_NAME,
|
|
153
|
+
languageModel: openrouter.languageModel("anthropic/claude-sonnet-4"),
|
|
154
|
+
instructions: FEEDBACK_AGENT_INSTRUCTIONS,
|
|
155
|
+
tools: {},
|
|
156
|
+
maxSteps: 3,
|
|
157
|
+
});
|
|
151
158
|
// Build the prompt for analysis
|
|
152
159
|
const analysisPrompt = `Please analyze the following feedback submission:
|
|
153
160
|
|
|
@@ -217,6 +224,8 @@ Provide your analysis in the JSON format specified.`;
|
|
|
217
224
|
estimatedEffort: analysis.estimatedEffort,
|
|
218
225
|
suggestedPriority: analysis.suggestedPriority,
|
|
219
226
|
},
|
|
227
|
+
resendApiKey: args.resendApiKey,
|
|
228
|
+
resendFromEmail: args.resendFromEmail,
|
|
220
229
|
});
|
|
221
230
|
// Mark notifications as sent
|
|
222
231
|
await ctx.runMutation(internal.feedback.markNotificationsSent, {
|
|
@@ -229,4 +238,29 @@ Provide your analysis in the JSON format specified.`;
|
|
|
229
238
|
return { success: true };
|
|
230
239
|
},
|
|
231
240
|
});
|
|
241
|
+
/**
|
|
242
|
+
* Public wrapper for processFeedback that can be called from parent app.
|
|
243
|
+
* Accepts optional API keys since Convex components don't inherit parent env vars.
|
|
244
|
+
*/
|
|
245
|
+
export const processFeedbackPublic = action({
|
|
246
|
+
args: {
|
|
247
|
+
feedbackId: v.id("feedback"),
|
|
248
|
+
openRouterApiKey: v.optional(v.string()),
|
|
249
|
+
resendApiKey: v.optional(v.string()),
|
|
250
|
+
resendFromEmail: v.optional(v.string()),
|
|
251
|
+
},
|
|
252
|
+
returns: v.object({
|
|
253
|
+
success: v.boolean(),
|
|
254
|
+
error: v.optional(v.string()),
|
|
255
|
+
}),
|
|
256
|
+
handler: async (ctx, args) => {
|
|
257
|
+
// Delegate to the internal action
|
|
258
|
+
return await ctx.runAction(internal.agents.feedbackAgent.processFeedback, {
|
|
259
|
+
feedbackId: args.feedbackId,
|
|
260
|
+
openRouterApiKey: args.openRouterApiKey,
|
|
261
|
+
resendApiKey: args.resendApiKey,
|
|
262
|
+
resendFromEmail: args.resendFromEmail,
|
|
263
|
+
});
|
|
264
|
+
},
|
|
265
|
+
});
|
|
232
266
|
//# sourceMappingURL=feedbackAgent.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedbackAgent.js","sourceRoot":"","sources":["../../../src/convex/agents/feedbackAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"feedbackAgent.js","sourceRoot":"","sources":["../../../src/convex/agents/feedbackAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feedback Interview Agent
|
|
3
|
+
*
|
|
4
|
+
* Conducts AI-powered interviews to help users articulate bug reports
|
|
5
|
+
* and feedback through a conversational experience.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Context-aware questions based on app information
|
|
9
|
+
* - Human-in-the-loop input collection
|
|
10
|
+
* - Generates well-structured reports from conversations
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Create an interview session
|
|
14
|
+
*/
|
|
15
|
+
export declare const createSession: import("convex/server").RegisteredMutation<"internal", {
|
|
16
|
+
context?: string;
|
|
17
|
+
reporterType: "staff" | "customer";
|
|
18
|
+
reporterId: string;
|
|
19
|
+
reporterEmail: string;
|
|
20
|
+
reporterName: string;
|
|
21
|
+
threadId: string;
|
|
22
|
+
reportType: "bug" | "feedback";
|
|
23
|
+
}, Promise<import("convex/values").GenericId<"interviewSessions">>>;
|
|
24
|
+
/**
|
|
25
|
+
* Update an interview session with generated report
|
|
26
|
+
*/
|
|
27
|
+
export declare const updateSession: import("convex/server").RegisteredMutation<"internal", {
|
|
28
|
+
generatedTitle?: string;
|
|
29
|
+
generatedDescription?: string;
|
|
30
|
+
generatedSeverity?: "low" | "medium" | "high" | "critical";
|
|
31
|
+
generatedFeedbackType?: "feature_request" | "change_request" | "general";
|
|
32
|
+
generatedPriority?: "critical" | "nice_to_have" | "important";
|
|
33
|
+
generatedFeatureArea?: string;
|
|
34
|
+
generatedReproSteps?: string[];
|
|
35
|
+
isComplete?: boolean;
|
|
36
|
+
sessionId: import("convex/values").GenericId<"interviewSessions">;
|
|
37
|
+
}, Promise<any>>;
|
|
38
|
+
/**
|
|
39
|
+
* Get an interview session by thread ID
|
|
40
|
+
*/
|
|
41
|
+
export declare const getSessionByThread: import("convex/server").RegisteredQuery<"public", {
|
|
42
|
+
threadId: string;
|
|
43
|
+
}, Promise<{
|
|
44
|
+
_id: import("convex/values").GenericId<"interviewSessions">;
|
|
45
|
+
_creationTime: number;
|
|
46
|
+
context?: string;
|
|
47
|
+
generatedTitle?: string;
|
|
48
|
+
generatedDescription?: string;
|
|
49
|
+
generatedSeverity?: "low" | "medium" | "high" | "critical";
|
|
50
|
+
generatedFeedbackType?: "feature_request" | "change_request" | "general";
|
|
51
|
+
generatedPriority?: "critical" | "nice_to_have" | "important";
|
|
52
|
+
generatedFeatureArea?: string;
|
|
53
|
+
generatedReproSteps?: string[];
|
|
54
|
+
reporterType: "staff" | "customer";
|
|
55
|
+
reporterId: string;
|
|
56
|
+
reporterEmail: string;
|
|
57
|
+
reporterName: string;
|
|
58
|
+
createdAt: number;
|
|
59
|
+
updatedAt: number;
|
|
60
|
+
threadId: string;
|
|
61
|
+
reportType: "bug" | "feedback";
|
|
62
|
+
isComplete: boolean;
|
|
63
|
+
}>>;
|
|
64
|
+
/**
|
|
65
|
+
* Start a bug report interview
|
|
66
|
+
*/
|
|
67
|
+
export declare const startBugInterview: any;
|
|
68
|
+
/**
|
|
69
|
+
* Start a feedback interview
|
|
70
|
+
*/
|
|
71
|
+
export declare const startFeedbackInterview: any;
|
|
72
|
+
/**
|
|
73
|
+
* Continue the interview after user provides input
|
|
74
|
+
*/
|
|
75
|
+
export declare const continueInterview: any;
|
|
76
|
+
//# sourceMappingURL=feedbackInterviewAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feedbackInterviewAgent.d.ts","sourceRoot":"","sources":["../../../src/convex/agents/feedbackInterviewAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAmOH;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;mEA0BxB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;gBAkCxB,CAAC;AAMH;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;GA+C7B,CAAC;AA4JH;;GAEG;AACH,eAAO,MAAM,iBAAiB,KA4H5B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,sBAAsB,KA4HjC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,iBAAiB,KAsK5B,CAAC"}
|