feat: add email-agent kit — AI-powered email verifier and reply drafter#246
feat: add email-agent kit — AI-powered email verifier and reply drafter#246kr1shnaakhurana wants to merge 13 commits into
Conversation
|
Warning Review limit reached
Next review available in: 22 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Repository UI (base), Organization UI (inherited) Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (1)
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 ValidationNew Contributions Detected
Check Results
🎉 All checks passed! This contribution follows the AgentKit structure. |
|
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 |
✅ Action performedReview finished.
|
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)
6-7: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winMission critical: Decrypt the JSON string payloads.
Agent, we have a critical flaw in your intelligence extraction. Headquarters defined
outputSchema: { output: "string" }for the verifier, meaninglamaticClient.executeFlowwill yield a string payload. However, your logic directly attempts to read properties from an object (or skips formatting entirely if it spots a string). This will leave you empty-handed if the payload contains a serialized JSON report.Your mission is to safely
JSON.parse()the string payload before extracting the tactical variables.
kits/email-agent/apps/actions/orchestrate.ts#L6-L7: Attempt toJSON.parse(response)if it's a string inside atry-catchblock. If parsing succeeds, format the object into markdown; if it fails, return the string as-is. This prevents raw JSON strings from leaking into the dashboard UI.kits/email-agent/apps/actions/orchestrate.ts#L101-L101: Apply a similartry-catchparsing step toverifierResponsebefore performing thetypeof === "object"check, ensuringverdict,confidence, andreasonsare properly populated for the replier flow instead of being sent as empty defaults.🤖 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 6 - 7, Parse string payloads with JSON.parse inside try-catch before processing them. In formatVerifierResult, format successfully parsed objects into markdown and return the original string when parsing fails; also apply the same parsing before the typeof check on verifierResponse so verdict, confidence, and reasons are populated. Both affected sites are in kits/email-agent/apps/actions/orchestrate.ts: lines 6-7 and 101.
30-30: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winImport
../../lamatic.confighere.kits/email-agent/apps/actions/orchestrate.tsis still pullingconfigfrom../orchestrate.js; this action file should read the parent kit’s step definitions from../../lamatic.configinstead.🤖 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` at line 30, Update the imports used by verifyEmail in orchestrate.ts to load config from ../../lamatic.config instead of ../orchestrate.js, ensuring the action reads the parent kit’s step definitions.Source: Coding guidelines
🤖 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 6-7: Parse string payloads with JSON.parse inside try-catch before
processing them. In formatVerifierResult, format successfully parsed objects
into markdown and return the original string when parsing fails; also apply the
same parsing before the typeof check on verifierResponse so verdict, confidence,
and reasons are populated. Both affected sites are in
kits/email-agent/apps/actions/orchestrate.ts: lines 6-7 and 101.
- Line 30: Update the imports used by verifyEmail in orchestrate.ts to load
config from ../../lamatic.config instead of ../orchestrate.js, ensuring the
action reads the parent kit’s step definitions.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI (base), Organization UI (inherited)
Review profile: ASSERTIVE
Plan: Pro
Run ID: 8712f67c-d470-4a24-9cd0-b11cad5313cf
📒 Files selected for processing (8)
kits/email-agent/apps/actions/orchestrate.tskits/email-agent/apps/app/page.tsxkits/email-agent/apps/orchestrate.jskits/email-agent/apps/test-api.jskits/email-agent/flows/email-replier.tskits/email-agent/flows/email-verifier.tskits/email-agent/model-configs/email-replier_generate-text.tskits/email-agent/model-configs/email-verifier_generate-text.ts
💤 Files with no reviewable changes (5)
- kits/email-agent/apps/test-api.js
- kits/email-agent/model-configs/email-replier_generate-text.ts
- kits/email-agent/model-configs/email-verifier_generate-text.ts
- kits/email-agent/flows/email-verifier.ts
- kits/email-agent/flows/email-replier.ts
- formatVerifierResult: attempt JSON.parse on string responses
before extracting verdict/confidence/reasons/summary fields;
fall back to raw string if parsing fails, preventing serialised
JSON from leaking into the dashboard UI as plain text.
- replyEmail: apply the same try-catch JSON.parse step on
verifierRaw before the typeof check so verdict, confidence, and
reasons are properly populated for the replier flow instead of
being sent as empty defaults ('', 0, []).
Fixes: outputSchema { output: 'string' } means executeFlow always
yields a JSON string, not a plain object.
|
@coderabbitai resume |
✅ Action performedReviews resumed. |
|
@coderabbitai resume |
✅ Action performedReviews resumed. |
…nd remove redundant verifier call - Replace import from ../orchestrate.js with ../../lamatic.config. Workflow IDs are now resolved via steps[].envKey + process.env, extracted into a getWorkflowId() helper for DRY access. - Remove unnecessary verifier execution from replyEmail. The email-replier flow only uses sender/subject/body in its prompt and ignores verdict/confidence/reasons, so running the verifier as Step 1 was wasteful. replyEmail now calls the replier directly in a single flow execution.
|
@coderabbitai resume |
✅ Action performedReviews resumed. |
|
@coderabbitai review |
✅ Action performedReview finished.
|
|
@coderabbitai resolve |
✅ Action performedComments resolved and changes approved. |
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
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/.gitignoreflow.jsonin this kit; flows are defined in TS):kits/email-agent/flows/email-verifier.tstriggerNode_1(usesadvance_schemaforsender/subject/body) →LLMNode_100(“Verify Email”) →graphqlResponseNode_200(mapsLLMNode_100.output.generatedResponsetooutput)kits/email-agent/flows/email-replier.tstriggerNode_1(usesadvance_schemaforsender/subject/body, with optionalverdict/confidence/reasons) →LLMNode_100(“Draft Reply”) →graphqlResponseNode_200(mapsLLMNode_100.output.generatedResponsetooutput)kits/email-agent/model-configs/email-verifier_generate-text.tskits/email-agent/model-configs/email-replier_generate-text.tskits/email-agent/prompts/email-verifier_generate-text_system.mdkits/email-agent/prompts/email-replier_generate-text_system.mdkits/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(sequential orchestration:verifier→replier, bothmode: "sync", withexpectedOutput: "output")kits/email-agent/apps/actions/orchestrate.tsverifyEmail(...): executes verifier flow and formatsoutputas a Markdown verdict (parses serialized JSON when needed).replyEmail(...): executes verifier first, extractsverdict/confidence/reasonsfrom parsedoutput, then executes replier flow with these values.kits/email-agent/apps/test-api.js(manual GraphQLexecuteWorkflowtester)kits/email-agent/apps/app/layout.tsxkits/email-agent/apps/app/page.tsx(UI with verify vs reply modes, loading/error handling, copy/reset)kits/email-agent/apps/app/globals.css(Tailwind + dark mode tokens)kits/email-agent/apps/components/header.tsxkits/email-agent/apps/components/theme-provider.tsxkits/email-agent/apps/lib/lamatic-client.ts(env validation + Lamatic client)kits/email-agent/apps/lib/utils.ts(cnTailwind class merger)kits/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.tsx