feat: add email-agent kit — AI-powered email verifier and reply drafter#246
Conversation
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI (base), Organization UI (inherited) Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (1)
Disabled knowledge base sources:
WalkthroughChangesThe Email Agent kit adds Lamatic verifier and replier workflows, credentialed execution, a Next.js dashboard for submitting emails and viewing results, and setup documentation and configuration. ChangesEmail Agent
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
:robot_face: AgentKit Structural ValidationNo contribution files detected in this PR. |
|
Caution Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted. Error details |
There was a problem hiding this comment.
Actionable comments posted: 12
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
kits/email-agent/constitutions/default.md (1)
1-18: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueUpdate the template generator to resolve formatting warnings.
Good morning, Agent. Our analysts have intercepted several MD022 (blanks-around-headings) warnings within this document. Based on learnings, this file is auto-generated from a template. Your mission, should you choose to accept it, is to infiltrate the template/source level and ensure blank lines are added after headings so all future kits inherit the corrected formatting rather than patching just this file.
This message will self-destruct in five seconds.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@kits/email-agent/constitutions/default.md` around lines 1 - 18, Update the source template used to generate the default constitution, rather than editing the generated default.md directly, and ensure every heading in the generated output has a blank line after it to satisfy MD022. Preserve the existing heading content and generation behavior.Source: Learnings
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@kits/email-agent/apps/actions/orchestrate.ts`:
- Around line 55-57: Update the result extraction in
kits/email-agent/apps/actions/orchestrate.ts at lines 55-57 to use
resData?.result?.output, at line 101 to use verifierRes?.result?.output if that
reconnaissance step remains, and at lines 118-119 to use
replierRes?.result?.output; preserve the surrounding missing-report handling.
- Line 4: Update the import in orchestrate.ts to use ../../lamatic.config
instead of ../orchestrate.js, ensuring the action reads step definitions from
the parent kit’s configuration.
- Around line 83-115: Remove the verifier workflow lookup, validation,
execution, response extraction, and summary-generation logic from replyEmail.
Start directly with the replier execution using only the configured
replierFlow.workflowId and the supported sender, subject, and body payload
fields; also remove the unused summary and email variables and related logging.
In `@kits/email-agent/apps/app/layout.tsx`:
- Around line 6-23: Update RootLayout to apply both initialized font variables,
_geist and _geistMono, to the body className alongside the existing font-sans
and antialiased classes, ensuring the loaded typography assets are injected into
the document.
In `@kits/email-agent/apps/app/page.tsx`:
- Around line 18-20: Replace the sender, subject, and body useState form
management with react-hook-form’s useForm configured with zodResolver and a zod
schema. Update the form fields and submission flow to use the form registration,
validation, and errors while preserving the existing form behavior.
In `@kits/email-agent/apps/components/ui/button.tsx`:
- Around line 39-58: Add React.forwardRef and displayName to Button in
kits/email-agent/apps/components/ui/button.tsx:39-58, forwarding the ref to the
selected button or Slot component; wrap Card, CardHeader, CardTitle,
CardDescription, CardAction, CardContent, and CardFooter similarly in
kits/email-agent/apps/components/ui/card.tsx:5-82; wrap Label in
kits/email-agent/apps/components/ui/label.tsx:8-22, forwarding each ref to its
underlying element and exposing the corresponding displayName.
In `@kits/email-agent/apps/components/ui/input.tsx`:
- Around line 5-19: Wrap the exposed Input component in React.forwardRef while
preserving its props and className handling; apply the same ref-forwarding
pattern to Textarea in kits/email-agent/apps/components/ui/textarea.tsx (lines
5-16) and SelectTrigger plus the other exposed Select subcomponents in
kits/email-agent/apps/components/ui/select.tsx (lines 27-51). Ensure each
forwarded ref targets its underlying DOM element and existing behavior remains
unchanged.
In `@kits/email-agent/apps/next.config.mjs`:
- Around line 3-5: Remove the ignoreBuildErrors setting from the Next.js
typescript configuration so builds perform normal TypeScript verification.
Update the visible typescript configuration block in next.config.mjs without
adding another bypass or changing unrelated build settings.
In `@kits/email-agent/apps/package.json`:
- Around line 53-61: Pin the lamatic and react-markdown dependencies in
package.json to specific stable versions instead of the latest tag, preserving
the existing dependency declarations and using versions compatible with the
application.
- Line 46: Remove the autoprefixer dependency entry from the package manifest,
leaving the remaining dependencies unchanged. Do not add or modify PostCSS
configuration, since the existing setup does not reference autoprefixer.
In `@kits/email-agent/apps/test-api.js`:
- Around line 3-5: Remove the unused config import from test-api.js and update
its execution directive to invoke Node with the built-in --env-file option
targeting .env.local, while preserving the script entry point.
In `@kits/email-agent/apps/tsconfig.json`:
- Around line 36-39: Remove the two redundant malformed Windows-style
".next\\dev/types/**/*.ts" entries from the tsconfig include list, leaving the
single valid forward-slash ".next/dev/types/**/*.ts" directive unchanged.
---
Outside diff comments:
In `@kits/email-agent/constitutions/default.md`:
- Around line 1-18: Update the source template used to generate the default
constitution, rather than editing the generated default.md directly, and ensure
every heading in the generated output has a blank line after it to satisfy
MD022. Preserve the existing heading content and generation behavior.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI (base), Organization UI (inherited)
Review profile: ASSERTIVE
Plan: Pro
Run ID: 16e57db4-06b5-4795-ad74-905eea0112a6
⛔ Files ignored due to path filters (1)
kits/email-agent/apps/package-lock.jsonis excluded by!**/package-lock.json
📒 Files selected for processing (35)
kits/email-agent/.gitignorekits/email-agent/README.mdkits/email-agent/agent.mdkits/email-agent/apps/.env.examplekits/email-agent/apps/.gitignorekits/email-agent/apps/actions/orchestrate.tskits/email-agent/apps/app/globals.csskits/email-agent/apps/app/layout.tsxkits/email-agent/apps/app/page.tsxkits/email-agent/apps/components.jsonkits/email-agent/apps/components/header.tsxkits/email-agent/apps/components/theme-provider.tsxkits/email-agent/apps/components/ui/button.tsxkits/email-agent/apps/components/ui/card.tsxkits/email-agent/apps/components/ui/input.tsxkits/email-agent/apps/components/ui/label.tsxkits/email-agent/apps/components/ui/select.tsxkits/email-agent/apps/components/ui/textarea.tsxkits/email-agent/apps/lib/lamatic-client.tskits/email-agent/apps/lib/utils.tskits/email-agent/apps/next-env.d.tskits/email-agent/apps/next.config.mjskits/email-agent/apps/orchestrate.jskits/email-agent/apps/package.jsonkits/email-agent/apps/postcss.config.mjskits/email-agent/apps/test-api.jskits/email-agent/apps/tsconfig.jsonkits/email-agent/constitutions/default.mdkits/email-agent/flows/email-replier.tskits/email-agent/flows/email-verifier.tskits/email-agent/lamatic.config.tskits/email-agent/model-configs/email-replier_generate-text.tskits/email-agent/model-configs/email-verifier_generate-text.tskits/email-agent/prompts/email-replier_generate-text_system.mdkits/email-agent/prompts/email-verifier_generate-text_system.md
…gified JSON schemas for Lamatic parser compatibility
|
@kr1shnaakhurana please fix the comments above |
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
kits/email-agent/flows/email-replier.ts (1)
67-80: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winMission: route the verifier payload into the reply draft.
kits/email-agent/flows/email-replier.ts:67-80still only acceptssender,subject, andbody, andkits/email-agent/apps/actions/orchestrate.tsonly forwardssummary, soverdict,confidence, andreasonsnever reach the reply prompt. Thread those fields through both stages.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@kits/email-agent/flows/email-replier.ts` around lines 67 - 80, Extend the `inputs` definition in `email-replier.ts` to accept the verifier fields `verdict`, `confidence`, and `reasons` alongside the existing email fields, then update the forwarding logic in `orchestrate.ts` to pass those values into the reply draft flow rather than forwarding only `summary`.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@kits/email-agent/flows/email-replier.ts`:
- Around line 67-80: Extend the `inputs` definition in `email-replier.ts` to
accept the verifier fields `verdict`, `confidence`, and `reasons` alongside the
existing email fields, then update the forwarding logic in `orchestrate.ts` to
pass those values into the reply draft flow rather than forwarding only
`summary`.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI (base), Organization UI (inherited)
Review profile: ASSERTIVE
Plan: Pro
Run ID: e01dfd7c-6c84-4595-a5ce-2d5f7062c53a
📒 Files selected for processing (7)
kits/email-agent/apps/app/page.tsxkits/email-agent/apps/components/header.tsxkits/email-agent/apps/next-env.d.tskits/email-agent/apps/test-api.jskits/email-agent/apps/tsconfig.jsonkits/email-agent/flows/email-replier.tskits/email-agent/flows/email-verifier.ts
…ns) through to email-replier
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
kits/email-agent/apps/orchestrate.js (1)
4-38: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueAlign orchestrator configuration with flow specifications.
Agent, intel indicates our orchestrator config is out of sync with the updated flow definitions:
- The
outputkey is the correct extraction target for both flows, notresponse. UpdateexpectedOutputandoutputSchemato match.- The
replierflow no longer utilizes thesummaryandinputSchemato prevent smuggling ghost variables.🕵️ Proposed mission patch
verifier: { name: "Email Verifier", workflowId: process.env.EMAIL_VERIFIER_FLOW_ID, description: "Verifies and analyzes email sender, subject, and content.", mode: "sync", - expectedOutput: "response", + expectedOutput: "output", inputSchema: { sender: "string", subject: "string", body: "string" }, outputSchema: { - response: "string" + output: "string" } }, replier: { name: "Email Replier", workflowId: process.env.EMAIL_REPLIER_FLOW_ID, description: "Generates context-aware reply drafts to inbound emails.", mode: "sync", - expectedOutput: "response", + expectedOutput: "output", inputSchema: { sender: "string", subject: "string", body: "string", - summary: "string", - email: "string", // combined string: {{email}} in prompt verdict: "string", confidence: "number", reasons: "array" }, outputSchema: { - response: "string" + output: "string" } }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@kits/email-agent/apps/orchestrate.js` around lines 4 - 38, Update both the verifier and replier configurations to use output as the expectedOutput value and outputSchema key instead of response. In the replier inputSchema, remove the obsolete summary and email fields while preserving all remaining inputs.kits/email-agent/apps/actions/orchestrate.ts (1)
100-134: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueAbort transmission of ghost variables.
Agent, our latest intel confirms that the
email-replierflow has evolved and no longer utilizes thesummaryand🕵️ Proposed mission patch
- // Extract verifier payload fields — if object, pull individual fields; else use as-is + // Extract verifier payload fields const verifierResponse = verifierRes?.result?.response let verdict = "" let confidence = 0 let reasons: string[] = [] - let summary = "" if (typeof verifierResponse === "object" && verifierResponse !== null) { const r = verifierResponse as { verdict?: string confidence?: number reasons?: string[] - summary?: string } verdict = r.verdict ?? "" confidence = r.confidence ?? 0 reasons = r.reasons ?? [] - summary = r.summary ?? "" - } else { - summary = String(verifierResponse ?? "") } - // Step 2: Run replier — generate-reply prompt uses {{email}} single variable - const emailText = `From: ${sender}\nSubject: ${subject}\n\n${body}` - console.log("[Email Agent] Step 2 — Running replier with email:", emailText) + // Step 2: Run replier + console.log("[Email Agent] Step 2 — Running replier...") const replierRes = await lamaticClient.executeFlow(replierFlow.workflowId, { sender, subject, body, - summary, - email: emailText, // matches {{email}} in generate-reply_llmnode-934_user_1.md verdict, confidence, reasons, })🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@kits/email-agent/apps/actions/orchestrate.ts` around lines 100 - 134, Remove the unused summary extraction and emailText construction from the orchestration flow, including the summary and email fields passed to replierFlow.executeFlow. Keep the verifier fields verdict, confidence, and reasons, along with sender, subject, and body, unchanged in the replier payload.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@kits/email-agent/apps/actions/orchestrate.ts`:
- Around line 100-134: Remove the unused summary extraction and emailText
construction from the orchestration flow, including the summary and email fields
passed to replierFlow.executeFlow. Keep the verifier fields verdict, confidence,
and reasons, along with sender, subject, and body, unchanged in the replier
payload.
In `@kits/email-agent/apps/orchestrate.js`:
- Around line 4-38: Update both the verifier and replier configurations to use
output as the expectedOutput value and outputSchema key instead of response. In
the replier inputSchema, remove the obsolete summary and email fields while
preserving all remaining inputs.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI (base), Organization UI (inherited)
Review profile: ASSERTIVE
Plan: Pro
Run ID: a384d8d9-1145-4cfa-a2a5-31e6e44d2aaf
📒 Files selected for processing (3)
kits/email-agent/apps/actions/orchestrate.tskits/email-agent/apps/orchestrate.jskits/email-agent/flows/email-replier.ts
…er inputs, and strip comments from codebase
f1b9490 to
4f5b594
Compare
|
I’ve gone through all the review comments and fixed everything I could find. Pushed the latest changes as well. If I’ve missed anything specific, just let me know and I’ll update it. |
|
@coderabbitai review |
|
@coderabbitai resume |
✅ Action performedReviews resumed. |
|
@coderabbitai review |
✅ Action performedReview finished.
|
|
@coderabbitai resolve |
✅ Action performedComments resolved and changes approved. |
|
@amanintech @d-pamneja I've completed all the requested changes in my PR. Kindly review and approve it if everything looks good. |
|
Hi @kr1shnaakhurana! 👋 Before this PR can be reviewed by maintainers, please resolve all comments and requested changes from the CodeRabbit automated review. Steps to follow:
This helps keep the review process efficient for everyone. Thank you! 🙏 |
|
heyy, i have done all the things and now coderabbit also approved my repo |
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@kits/email-agent/apps/actions/orchestrate.ts`:
- Around line 91-98: Update replyEmail to execute the email-verifier flow before
email-replier, extract its verdict, confidence, and reasons output, and include
those values alongside sender, subject, and body in the replierRes payload. Use
the existing workflow ID and Lamatic execution patterns in orchestrate.ts,
preserving the replier flow invocation after verification completes.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI (base), Organization UI (inherited)
Review profile: ASSERTIVE
Plan: Pro
Run ID: 4d950072-cca2-4273-bc3d-ff6d9b925af3
📒 Files selected for processing (1)
kits/email-agent/apps/actions/orchestrate.ts
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
kits/email-agent/apps/actions/orchestrate.ts (2)
19-27: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick winMission update: Defend against void intel.
Agent, if the LLM hallucinates and returns exactly
"null",JSON.parsewill evaluate it to a literalnull. Attempting to readr.verdictimmediately after will trigger a fatalTypeErrorand crash the extraction process. Your mission is to secure this vector by providing a safe fallback.🕵️ Proposed mission patch
- const r = parsed as { + const r = (parsed || {}) as { verdict?: string confidence?: number reasons?: string[] summary?: string } const verdictEmoji = r.verdict === "legit" ? "✅" : r.verdict === "suspicious" ? "⚠️" : "🚫"🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@kits/email-agent/apps/actions/orchestrate.ts` around lines 19 - 27, Guard the parsed result before accessing r.verdict in the verdictEmoji logic: when JSON.parse returns null, use an empty object fallback so property reads remain safe. Preserve the existing emoji mapping for legit, suspicious, and all other verdict values.
35-37: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick winMission update: Fortify array extraction against unpredictable intel.
Agent, LLM outputs are notoriously unstable and might return a string instead of the expected array for the
reasonsfield. Blindly trusting this intel shares a single root cause across operations and will lead to fatal exceptions or compromised payloads. Your mission, should you choose to accept it, is to defend the extraction withArray.isArray().
kits/email-agent/apps/actions/orchestrate.ts#L35-L37: Update the template string to useArray.isArray(r.reasons) ? r.reasons : []before calling.map().kits/email-agent/apps/actions/orchestrate.ts#L131-L133: Update the assignment to usefinalReasons = Array.isArray(parsedResponse?.reasons) ? parsedResponse.reasons : [].🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@kits/email-agent/apps/actions/orchestrate.ts` around lines 35 - 37, Guard both reasons extraction sites in kits/email-agent/apps/actions/orchestrate.ts:35-37 and kits/email-agent/apps/actions/orchestrate.ts:131-133 with Array.isArray(). In the template rendering, map only r.reasons when it is an array, otherwise use []; in the finalReasons assignment, use parsedResponse.reasons only when it is an array, otherwise assign [].
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@kits/email-agent/apps/actions/orchestrate.ts`:
- Around line 19-27: Guard the parsed result before accessing r.verdict in the
verdictEmoji logic: when JSON.parse returns null, use an empty object fallback
so property reads remain safe. Preserve the existing emoji mapping for legit,
suspicious, and all other verdict values.
- Around line 35-37: Guard both reasons extraction sites in
kits/email-agent/apps/actions/orchestrate.ts:35-37 and
kits/email-agent/apps/actions/orchestrate.ts:131-133 with Array.isArray(). In
the template rendering, map only r.reasons when it is an array, otherwise use
[]; in the finalReasons assignment, use parsedResponse.reasons only when it is
an array, otherwise assign [].
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI (base), Organization UI (inherited)
Review profile: ASSERTIVE
Plan: Pro
Run ID: 7c0b09d9-4030-4ece-9f04-90bb4ab2729c
📒 Files selected for processing (1)
kits/email-agent/apps/actions/orchestrate.ts
|
@akshatvirmani done |
|
@coderabbitai review |
✅ Action performedReview finished.
|
|
/validate |
|
📡 Running Studio validation — results will appear here shortly. |
Studio Runtime Validation (Phase 2)✅ Studio validation passed. The kit loaded successfully in Lamatic Studio. This PR is ready for final review and merge. |
Summary
Adds the Email Agent kit — an AI-powered email workspace built on Lamatic with two flows:
What's Included
lamatic.config.ts— Kit metadataflows/— Verifier + replier flow definitionsprompts/— LLM system promptsapps/— Next.js 16 dashboard (verify + reply modes, dark mode, shadcn/ui)How It Works
User inputs email → Verifier flow → verdict JSON → (for reply) Replier flow → draft reply
sender,subject,body, runs an LLM to produce a structured legitimacy analysis, and returns it as Markdown.verdict,confidence,reasons)—running verification first when those fields aren’t provided.kits/email-agent/lamatic.config.tskits/email-agent/README.mdkits/email-agent/agent.mdkits/email-agent/constitutions/default.mdkits/email-agent/.env.examplekits/email-agent/.gitignorekits/email-agent/prompts/email-verifier_generate-text_system.mdkits/email-agent/prompts/email-replier_generate-text_system.mdkits/email-agent/model-configs/email-verifier_generate-text.tskits/email-agent/model-configs/email-replier_generate-text.tsflow.jsonin this kit):kits/email-agent/flows/email-verifier.tstriggerNode→dynamicNode(LLM) →dynamicNode(GraphQL response)defaultEdge+responseEdgesender/subject/bodyto the LLM (“Verify Email”); LLM output is mapped into responseoutput.kits/email-agent/flows/email-replier.tstriggerNode→dynamicNode(LLM) →dynamicNode(GraphQL response)defaultEdge+responseEdgesender/subject/bodyplus optionalverdict/confidence/reasons; LLM (“Draft Reply”) injects a “Verification Audit”; LLM output is mapped into responseoutput.kits/email-agent/apps/.env.examplekits/email-agent/apps/.gitignorekits/email-agent/apps/package.jsonkits/email-agent/apps/package-lock.jsonkits/email-agent/apps/tsconfig.jsonkits/email-agent/apps/next-env.d.tskits/email-agent/apps/next.config.mjskits/email-agent/apps/postcss.config.mjskits/email-agent/apps/components.jsonkits/email-agent/apps/orchestrate.js(sequentialverifier→replierorchestration;mode: "sync", expectsoutput)kits/email-agent/apps/actions/orchestrate.ts(verifyEmail,replyEmail; formats/parses verifier output; reuses verification inputs when provided)kits/email-agent/apps/test-api.js(manual GraphQLexecuteWorkflowtester for the verifier)kits/email-agent/apps/app/layout.tsxkits/email-agent/apps/app/page.tsx(verify/reply UI, loading/error handling, copy/reset, Markdown rendering for verification)kits/email-agent/apps/app/globals.css(Tailwind light/dark design tokens)kits/email-agent/apps/components/header.tsxkits/email-agent/apps/components/theme-provider.tsxkits/email-agent/apps/components/ui/button.tsxkits/email-agent/apps/components/ui/card.tsxkits/email-agent/apps/components/ui/input.tsxkits/email-agent/apps/components/ui/label.tsxkits/email-agent/apps/components/ui/select.tsxkits/email-agent/apps/components/ui/textarea.tsxkits/email-agent/apps/lib/lamatic-client.ts(env validation +lamaticClient)kits/email-agent/apps/lib/utils.ts(cnTailwind class merger)