Conversation
WalkthroughThis PR introduces comprehensive sample flows and an agent kit template to the templates/sample directory. The changes add AI Assistant Chatbot and Slack Bot flows with configurations, TypeScript implementations, and YAML definitions, plus an Agentic Reasoning agent kit. Concurrently, template infrastructure files (package.json, root README) are removed or updated. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes
Possibly related PRs
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 inconclusive)
✅ Passed checks (1 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 |
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (3)
templates/sample/samples/flows/AI-Assistant-Chatbot/flow/BrokenHoney-3019.ts (1)
290-302: Consider whether async is necessary for these functions.Both exported functions are marked
asyncbut return synchronous data without anyawaitoperations. This pattern is duplicated across multiple flow files (CrookedZoo.ts, ScarceLifeguard.ts).If this is intentional for API consistency or future-proofing, consider adding a comment explaining the rationale. Otherwise, these could be simplified to synchronous functions.
Example simplification (if async is not needed):
-export async function getNodesAndEdges(): Promise<{ +export function getNodesAndEdges(): { nodes: Record<string, any>[], edges: Record<string, any>[], -}> { +} { return { nodes: flowConfig.nodes, edges: flowConfig.edges, } } -export async function getFlowConfig(): Promise<Record<string, any>> { +export function getFlowConfig(): Record<string, any> { return flowConfig; }Alternatively, if keeping async for consistency, apply the same pattern to all similar files and document the reasoning.
templates/sample/samples/flows/Slack-Bot-on-Website-Data/flow/CrookedZoo.ts (1)
579-591: Functions marked async without async operations.The exported functions
getNodesAndEdges()andgetFlowConfig()are markedasyncbut simply return static data without performing any asynchronous operations. While this is consistent across all flow templates in this PR, consider whether theasynckeyword is necessary or if it's intentionally included for future API compatibility.If no async operations are planned, you can simplify to:
-export async function getNodesAndEdges(): Promise<{ +export function getNodesAndEdges(): { nodes: Record<string, any>[], edges: Record<string, any>[], -}> { +} { return { nodes: flowConfig.nodes, edges: flowConfig.edges, } } -export async function getFlowConfig(): Promise<Record<string, any>> { +export function getFlowConfig(): Record<string, any> { return flowConfig; }However, if the
asyncsignature is required for interface compatibility or future extensibility, the current implementation is acceptable.templates/sample/samples/flows/Slack-Bot-on-Website-Data/flow/ScarceLifeguard.ts (1)
312-324: Code duplication across flow template modules.The exported functions
getNodesAndEdges()andgetFlowConfig()are identical across all flow template TypeScript files (CrookedZoo.ts, ScarceLifeguard.ts, BrokenHoney-3019.ts). While this duplication is acceptable for sample templates that are meant to be self-contained, consider whether these could be abstracted into a shared utility if these templates are meant to be extended or maintained together.For self-contained sample templates, the current approach is reasonable. If these are meant to be a maintained template library, consider extracting to a shared helper:
// shared/flowHelpers.ts export function createFlowHelpers(flowConfig: Record<string, any>) { return { getNodesAndEdges: async () => ({ nodes: flowConfig.nodes, edges: flowConfig.edges, }), getFlowConfig: async () => flowConfig, }; }Then in each file:
const { getNodesAndEdges, getFlowConfig } = createFlowHelpers(flowConfig); export { getNodesAndEdges, getFlowConfig };
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
Disabled knowledge base sources:
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (16)
templates/sample/.env.example(0 hunks)templates/sample/.gitignore(1 hunks)templates/sample/README.md(0 hunks)templates/sample/package.json(0 hunks)templates/sample/samples/flows/AI-Assistant-Chatbot/README.md(1 hunks)templates/sample/samples/flows/AI-Assistant-Chatbot/config/BrokenHoney-3019.json(1 hunks)templates/sample/samples/flows/AI-Assistant-Chatbot/flow/BrokenHoney-3019.ts(1 hunks)templates/sample/samples/flows/AI-Assistant-Chatbot/yaml/BrokenHoney-3019.yaml(1 hunks)templates/sample/samples/flows/Slack-Bot-on-Website-Data/README.md(1 hunks)templates/sample/samples/flows/Slack-Bot-on-Website-Data/config/CrookedZoo.json(1 hunks)templates/sample/samples/flows/Slack-Bot-on-Website-Data/config/ScarceLifeguard.json(1 hunks)templates/sample/samples/flows/Slack-Bot-on-Website-Data/flow/CrookedZoo.ts(1 hunks)templates/sample/samples/flows/Slack-Bot-on-Website-Data/flow/ScarceLifeguard.ts(1 hunks)templates/sample/samples/flows/Slack-Bot-on-Website-Data/metadata.json(1 hunks)templates/sample/samples/flows/Slack-Bot-on-Website-Data/yaml/CrookedZoo.yaml(1 hunks)templates/sample/samples/flows/Slack-Bot-on-Website-Data/yaml/ScarceLifeguard.yaml(1 hunks)
💤 Files with no reviewable changes (3)
- templates/sample/README.md
- templates/sample/package.json
- templates/sample/.env.example
🧰 Additional context used
🧬 Code graph analysis (3)
templates/sample/samples/flows/AI-Assistant-Chatbot/flow/BrokenHoney-3019.ts (2)
templates/sample/samples/flows/Slack-Bot-on-Website-Data/flow/CrookedZoo.ts (2)
getNodesAndEdges(579-587)getFlowConfig(589-591)templates/sample/samples/flows/Slack-Bot-on-Website-Data/flow/ScarceLifeguard.ts (2)
getNodesAndEdges(312-320)getFlowConfig(322-324)
templates/sample/samples/flows/Slack-Bot-on-Website-Data/flow/ScarceLifeguard.ts (2)
templates/sample/samples/flows/AI-Assistant-Chatbot/flow/BrokenHoney-3019.ts (2)
getNodesAndEdges(290-298)getFlowConfig(300-302)templates/sample/samples/flows/Slack-Bot-on-Website-Data/flow/CrookedZoo.ts (2)
getNodesAndEdges(579-587)getFlowConfig(589-591)
templates/sample/samples/flows/Slack-Bot-on-Website-Data/flow/CrookedZoo.ts (2)
templates/sample/samples/flows/AI-Assistant-Chatbot/flow/BrokenHoney-3019.ts (2)
getNodesAndEdges(290-298)getFlowConfig(300-302)templates/sample/samples/flows/Slack-Bot-on-Website-Data/flow/ScarceLifeguard.ts (2)
getNodesAndEdges(312-320)getFlowConfig(322-324)
🔇 Additional comments (10)
templates/sample/samples/flows/Slack-Bot-on-Website-Data/README.md (1)
1-2: LGTM!Clear and concise description of the Slack bot flow functionality.
templates/sample/.gitignore (1)
1-2: LGTM!The ignore patterns correctly exclude the specified directories from version control, aligning with the template restructuring.
templates/sample/samples/flows/AI-Assistant-Chatbot/config/BrokenHoney-3019.json (1)
1-6: LGTM!The configuration metadata is well-structured and complete.
templates/sample/samples/flows/AI-Assistant-Chatbot/README.md (1)
1-2: LGTM!Clear description of the interactive chat widget flow and its functionality.
templates/sample/samples/flows/Slack-Bot-on-Website-Data/config/ScarceLifeguard.json (1)
1-6: LGTM!The Slack Bot configuration is properly structured with appropriate metadata.
templates/sample/samples/flows/AI-Assistant-Chatbot/flow/BrokenHoney-3019.ts (1)
1-288: LGTM!The flow configuration is comprehensive and well-structured, defining a complete AI Assistant Chatbot template with all necessary nodes and edges.
templates/sample/samples/flows/Slack-Bot-on-Website-Data/yaml/ScarceLifeguard.yaml (1)
7-8: Hardcoded Slack channel IDs and credential references in sample template.The YAML contains hardcoded values that users will need to replace:
- Slack channel ID
C08E8M9KWDV(lines 7, 17, 247, 431)- Credential ID
0fc2f9ae-4a22-41e3-b63a-3e7db8902a9e(lines 391, 399)- Credential reference
Slack OAuth(lines 8, 18, 248, 432)Since this is a sample template, ensure that documentation clearly indicates these are placeholder values that must be replaced with the user's actual Slack workspace configuration.
Consider adding a comment block at the top of the YAML file or in the accompanying README to document required replacements:
# Sample Slack RAG Bot Flow Configuration # # REQUIRED CONFIGURATION: # - Replace channelName 'C08E8M9KWDV' with your Slack channel ID # - Configure 'Slack OAuth' credentials in your workspace # - Replace credentialId with your OpenAI API key credential ID # - Update TestDB with your actual vector database nameAlso applies to: 17-18, 247-248, 391-393, 431-432
templates/sample/samples/flows/AI-Assistant-Chatbot/yaml/BrokenHoney-3019.yaml (2)
11-12: Verify image licensing for sample template.The chatbot configuration uses an image from Freepik (
https://img.freepik.com/premium-vector/robot-android-super-hero_111928-7.jpg). Ensure this image can be used in sample templates or consider using a royalty-free alternative, as Freepik premium content may require attribution or licensing.Consider either:
- Verifying the license allows use in open-source samples
- Replacing with a Creative Commons or public domain image
- Using a placeholder URL with documentation for users to replace it
You might also add a comment in the YAML:
imageUrl: >- # Replace with your own bot image URL https://img.freepik.com/premium-vector/robot-android-super-hero_111928-7.jpg?w=826
323-325: Hardcoded credential ID in sample template.The LLM node contains a hardcoded
credentialId: 0fc2f9ae-4a22-41e3-b63a-3e7db8902a9ewhich users will need to replace with their own OpenAI credentials. Ensure documentation clearly indicates this is a placeholder.Consider adding documentation or a comment indicating required configuration changes for users deploying this template.
templates/sample/samples/flows/Slack-Bot-on-Website-Data/yaml/CrookedZoo.yaml (1)
348-348: Hardcoded credential and database references in sample template.This flow template contains several hardcoded references that users need to replace:
FIRECRAWL_API_KEYcredential reference (line 348, 390)- OpenAI credential ID
0fc2f9ae-4a22-41e3-b63a-3e7db8902a9e(line 555)- Vector database name
TestDB(line 619, 635)Ensure accompanying documentation clearly explains these are placeholder values requiring user configuration.
Consider adding a header comment in the YAML documenting required setup:
# Web Scraping and Vectorization Flow # # SETUP REQUIRED: # 1. Configure FIRECRAWL_API_KEY in credentials # 2. Configure OPENAI_KEY credential for embeddings # 3. Create or configure TestDB vector database # 4. Update credentialId values with your actual credential IDsAlso applies to: 555-557, 619-619
| @@ -0,0 +1,6 @@ | |||
| { | |||
| "name" : "Scrapping Websites Indexation", | |||
There was a problem hiding this comment.
Fix typo: "Scrapping" should be "Scraping".
The word "Scrapping" (discarding) should be "Scraping" (extracting data from websites). This matches the same issue in metadata.json.
Apply this diff:
- "name" : "Scrapping Websites Indexation",
+ "name" : "Scraping Websites Indexation",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "name" : "Scrapping Websites Indexation", | |
| "name" : "Scraping Websites Indexation", |
🤖 Prompt for AI Agents
In
templates/sample/samples/flows/Slack-Bot-on-Website-Data/config/CrookedZoo.json
around line 2, the "name" value contains a typo: change "Scrapping Websites
Indexation" to "Scraping Websites Indexation". Make the exact string replacement
on that line (and if present, apply the same correction in metadata.json to keep
names consistent).
| @@ -0,0 +1,591 @@ | |||
| const flowConfig = { | |||
| "id": "f5dfbdf8-0e08-40f9-9ff2-1091399afc51", | |||
| "name": "Scrapping Websites Indexation", | |||
There was a problem hiding this comment.
Fix typo in flow name.
Line 3 contains "Scrapping" which should be "Scraping". This typo appears in the flow configuration name.
Apply this diff to fix the typo:
- "name": "Scrapping Websites Indexation",
+ "name": "Scraping Websites Indexation",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "name": "Scrapping Websites Indexation", | |
| "name": "Scraping Websites Indexation", |
🤖 Prompt for AI Agents
In templates/sample/samples/flows/Slack-Bot-on-Website-Data/flow/CrookedZoo.ts
around line 3, the flow "name" contains a typo "Scrapping Websites Indexation";
update the value to "Scraping Websites Indexation" by replacing "Scrapping" with
"Scraping" in the JSON/object literal so the flow name is corrected.
| nodeType: graphqlNode | ||
| nodeName: API Request | ||
| values: | ||
| responeType: realtime |
There was a problem hiding this comment.
Fix typo in configuration property name.
The property name responeType is misspelled and should be responseType. This typo appears in both the main values section (line 6) and the Config A section (line 16).
Apply this diff:
values:
- responeType: realtime
+ responseType: realtime
advance_schema: |-
{
"urls": "[string]"
}
modes: {}
allConfigs:
Config A:
nodeName: API Request
- responeType: realtime
+ responseType: realtimeAlso applies to: 16-16
🤖 Prompt for AI Agents
In templates/sample/samples/flows/Slack-Bot-on-Website-Data/yaml/CrookedZoo.yaml
around lines 6 and 16, the configuration property name "responeType" is
misspelled; update both occurrences to "responseType" so the config key is
correct in the main values section (line 6) and the Config A section (line 16).
There was a problem hiding this comment.
Actionable comments posted: 30
🧹 Nitpick comments (23)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/avatar.tsx (3)
8-22: Add ref forwarding for proper component composition.The
Avatarcomponent should useReact.forwardRefto allow refs to be attached to the underlying Radix primitive. This is a standard pattern for reusable UI components and may be needed for accessibility features, animations, or DOM measurements.Apply this diff to add ref forwarding:
-function Avatar({ +const Avatar = React.forwardRef< + React.ElementRef<typeof AvatarPrimitive.Root>, + React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root> +>(({ className, ...props -}: React.ComponentProps<typeof AvatarPrimitive.Root>) { +}, ref) => { return ( <AvatarPrimitive.Root + ref={ref} data-slot="avatar" className={cn( "relative flex size-8 shrink-0 overflow-hidden rounded-full", className )} {...props} /> ) -} +}) +Avatar.displayName = "Avatar"
24-35: Add ref forwarding for proper component composition.The
AvatarImagecomponent should useReact.forwardRefto allow refs to be attached to the underlying Radix primitive.Apply this diff to add ref forwarding:
-function AvatarImage({ +const AvatarImage = React.forwardRef< + React.ElementRef<typeof AvatarPrimitive.Image>, + React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image> +>(({ className, ...props -}: React.ComponentProps<typeof AvatarPrimitive.Image>) { +}, ref) => { return ( <AvatarPrimitive.Image + ref={ref} data-slot="avatar-image" className={cn("aspect-square size-full", className)} {...props} /> ) -} +}) +AvatarImage.displayName = "AvatarImage"
37-51: Add ref forwarding for proper component composition.The
AvatarFallbackcomponent should useReact.forwardRefto allow refs to be attached to the underlying Radix primitive.Apply this diff to add ref forwarding:
-function AvatarFallback({ +const AvatarFallback = React.forwardRef< + React.ElementRef<typeof AvatarPrimitive.Fallback>, + React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback> +>(({ className, ...props -}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) { +}, ref) => { return ( <AvatarPrimitive.Fallback + ref={ref} data-slot="avatar-fallback" className={cn( "bg-muted flex size-full items-center justify-center rounded-full", className )} {...props} /> ) -} +}) +AvatarFallback.displayName = "AvatarFallback"templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/carousel.tsx (1)
113-114: Simplify redundant orientation logic.The fallback check for
opts?.axisis unnecessary since theaxisoption is already set based on theorientationparameter at lines 56-57. The orientation will always have a value from the parameter.Apply this diff to simplify:
orientation: - orientation || (opts?.axis === "y" ? "vertical" : "horizontal"), + orientation,templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/collapsible.tsx (1)
5-31: Consider simplifying the parameter destructuring pattern.All three wrapper functions use
{ ...props }as the parameter destructuring, which immediately spreads all parameters into thepropsobject. This pattern is functionally equivalent to just usingpropsdirectly without destructuring. Consider simplifying for clarity:Example for one function (apply similarly to all three):
-function Collapsible({ - ...props -}: React.ComponentProps<typeof CollapsiblePrimitive.Root>) { +function Collapsible( + props: React.ComponentProps<typeof CollapsiblePrimitive.Root> +) { return <CollapsiblePrimitive.Root data-slot="collapsible" {...props} /> }templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/chart.tsx (1)
235-239: Consider locale-aware formatting options.The
toLocaleString()call without parameters uses the browser's default locale, which may not match the application's configured locale. Consider accepting a locale parameter or using a formatter function from the config.-{item.value && ( - <span className="text-foreground font-mono font-medium tabular-nums"> - {item.value.toLocaleString()} - </span> -)} +{item.value && ( + <span className="text-foreground font-mono font-medium tabular-nums"> + {typeof item.value === 'number' ? item.value.toLocaleString() : item.value} + </span> +)}templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/aspect-ratio.tsx (1)
5-7: Consider simplifying the parameter destructuring.The
{ ...props }destructuring pattern is valid but unnecessarily verbose. Since you're accepting all props without extracting specific ones, the conventional approach is to use the parameter directly.Apply this diff for cleaner code:
-function AspectRatio({ - ...props -}: React.ComponentProps<typeof AspectRatioPrimitive.Root>) { +function AspectRatio(props: React.ComponentProps<typeof AspectRatioPrimitive.Root>) { return <AspectRatioPrimitive.Root data-slot="aspect-ratio" {...props} /> }templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/use-mobile.tsx (1)
5-19: Potential hydration mismatch with mobile detection.The hook initializes
isMobileasundefinedand returns!!isMobile(which coerces undefined to false). During SSR, this will always returnfalse, but on the client's first render before the effect runs, it may not match the actual viewport state, potentially causing a hydration mismatch warning.Consider initializing with a safe default or using a more explicit SSR-safe pattern:
export function useIsMobile() { - const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined) + const [isMobile, setIsMobile] = React.useState<boolean>(false) React.useEffect(() => { const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`) const onChange = () => { setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) } mql.addEventListener("change", onChange) setIsMobile(window.innerWidth < MOBILE_BREAKPOINT) return () => mql.removeEventListener("change", onChange) }, []) - return !!isMobile + return isMobile }templates/sample/samples/agentKit/Agentic-Reasoning/scripts/deploy.sh (1)
1-6: Consider adding basic error handling.The script lacks error handling, which could lead to confusing failures if
npm installfails butnpm run devis attempted anyway.Consider adding basic error checks:
#!/bin/bash +set -e # Exit on any error npm install # Run the dev server npm run devAlternatively, for more verbose feedback:
#!/bin/bash echo "Installing dependencies..." if ! npm install; then echo "Error: npm install failed" exit 1 fi echo "Starting development server..." npm run devtemplates/sample/samples/agentKit/Agentic-Reasoning/.env.example (1)
1-1: Remove unnecessary quotes and add trailing newline.The placeholder value doesn't need quotes in a
.env.examplefile, and the file should end with a newline per POSIX standards.Apply this diff:
-LAMATIC_CONFIG_REASONING="your_lamatic_config_reasoning_key" +LAMATIC_CONFIG_REASONING=your_lamatic_config_reasoning_key +templates/sample/samples/agentKit/Agentic-Reasoning/hooks/use-mobile.ts (1)
6-18: Consider SSR/hydration implications.The initial state is
undefined, and the actual value is set synchronously inuseEffect. During SSR, the hook returnsfalse(via!!undefined), but on the client it may immediately becometrue, potentially causing a hydration mismatch warning in Next.js.Consider initializing with a safer default or documenting this behavior.
templates/sample/samples/agentKit/Agentic-Reasoning/package.json (1)
46-46: Pin versions for deterministic builds.Using
"latest"for@vercel/analytics,geist, andreact-markdownwill cause non-deterministic builds, as different installations may pull different versions. This can lead to unexpected breakages and makes debugging harder.Consider pinning to specific versions or using caret ranges (e.g.,
^1.2.3) for predictable dependency resolution.Also applies to: 53-53, 63-63
templates/sample/samples/agentKit/Agentic-Reasoning/lib/lamatic-client.ts (2)
2-2: Remove unused import.The
fsimport is not used anywhere in this file.Apply this diff:
import { Lamatic } from "lamatic"; -import fs from "fs";
10-10: Consider error handling for malformed config.If the base64-encoded config is malformed or the JSON is invalid,
JSON.parsewill throw an uncaught exception. Consider wrapping this in a try-catch with a more informative error message.Example:
let config; try { config = JSON.parse(Buffer.from(process.env.LAMATIC_CONFIG_REASONING, "base64").toString("utf8")); } catch (error) { throw new Error( "Failed to parse LAMATIC_CONFIG_REASONING. Ensure it contains valid base64-encoded JSON." ); }templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/BillowySalesman.ts (1)
256-268: Consider removing unnecessary async declarations.Both
getNodesAndEdges()andgetFlowConfig()are marked asasyncbut only return synchronous in-memory data without performing any async operations. While this pattern is consistent with other flow files in the codebase (EnoughHouse.ts, FancyApplication.ts), the async markers are technically unnecessary.If this pattern is intentional for API consistency or future-proofing, consider adding a comment explaining the rationale. Otherwise, the functions could be simplified to:
-export async function getNodesAndEdges(): Promise<{ +export function getNodesAndEdges(): { nodes: Record<string, any>[], edges: Record<string, any>[], -}> { +} { return { nodes: flowConfig.nodes, edges: flowConfig.edges, } } -export async function getFlowConfig(): Promise<Record<string, any>> { +export function getFlowConfig(): Record<string, any> { return flowConfig; }templates/sample/samples/agentKit/Agentic-Reasoning/app/layout.tsx (1)
9-13: Consider removing or updating the generator metadata field.The
generator: "v0.app"field appears to be boilerplate from a code generation tool. Consider whether this metadata is necessary for your production application or if it should be updated to reflect your actual generator/framework.export const metadata: Metadata = { title: "Agent Kit Reasoning", description: "AI-powered search and chat interface by Lamatic.ai", - generator: "v0.app", }templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/FancyApplication.ts (1)
423-435: Consider making functions synchronous and improving type safety.Both exported functions are declared
asyncbut immediately return static data without any asynchronous operations. Additionally, usingRecord<string, any>loses type safety.-export async function getNodesAndEdges(): Promise<{ +export function getNodesAndEdges(): { nodes: Record<string, any>[], edges: Record<string, any>[], -}> { +} { return { nodes: flowConfig.nodes, edges: flowConfig.edges, } } -export async function getFlowConfig(): Promise<Record<string, any>> { +export function getFlowConfig(): Record<string, any> { return flowConfig; }Additionally, consider defining proper TypeScript interfaces for your flow configuration to improve type safety:
interface FlowNode { id: string; data: Record<string, any>; type: string; position: { x: number; y: number }; // ... other fields } interface FlowEdge { id: string; source: string; target: string; // ... other fields } interface FlowConfig { id: string; name: string; nodes: FlowNode[]; edges: FlowEdge[]; status: string; created_at: string; }templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/EnoughHouse.ts (1)
256-268: Consider making functions synchronous and improving type safety.Same as in FancyApplication.ts, both functions are unnecessarily async and use loose typing. Note that this pattern is duplicated across multiple flow files (FancyApplication.ts, BillowySalesman.ts, and this file).
Consider:
- Removing
async/Promisesince no async operations occur- Defining proper TypeScript interfaces for flow configuration
- Extracting this pattern to a shared utility to reduce duplication
-export async function getNodesAndEdges(): Promise<{ +export function getNodesAndEdges(): { nodes: Record<string, any>[], edges: Record<string, any>[], -}> { +} { return { nodes: flowConfig.nodes, edges: flowConfig.edges, } } -export async function getFlowConfig(): Promise<Record<string, any>> { +export function getFlowConfig(): Record<string, any> { return flowConfig; }templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/pagination.tsx (1)
102-117: Specify explicit value foraria-hiddenattribute.At line 108, the
aria-hiddenattribute is used as a boolean without an explicit value. While React will convert this toaria-hidden="true", it's better practice to be explicit for clarity and consistency.Apply this diff:
function PaginationEllipsis({ className, ...props }: React.ComponentProps<"span">) { return ( <span - aria-hidden + aria-hidden="true" data-slot="pagination-ellipsis" className={cn("flex size-9 items-center justify-center", className)} {...props} > <MoreHorizontalIcon className="size-4" /> <span className="sr-only">More pages</span> </span> ) }templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/dialog.tsx (1)
9-143: Forward refs to preserve Radix compatibility.These wrapper components are plain functions, so any
refpassed in by consumers is lost. Radix primitives rely on refs for focus management and TypeScript expects the ref to stay available; today, downstream code can no longer do something as simple asconst triggerRef = React.useRef(null); <DialogTrigger ref={triggerRef} … />. Please wrap each Radix-facing component inReact.forwardRef(and setdisplayName) so the underlying primitive keeps its ref surface, e.g.:- function DialogTrigger({ - ...props - }: React.ComponentProps<typeof DialogPrimitive.Trigger>) { - return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} /> - } + const DialogTrigger = React.forwardRef< + React.ElementRef<typeof DialogPrimitive.Trigger>, + React.ComponentPropsWithoutRef<typeof DialogPrimitive.Trigger> + >((props, ref) => ( + <DialogPrimitive.Trigger + ref={ref} + data-slot="dialog-trigger" + {...props} + /> + )) + DialogTrigger.displayName = DialogPrimitive.Trigger.displayNameApply the same pattern to the other wrappers here.
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/select.tsx (1)
9-185: Forward refs so Select consumers keep control surfaces.Every wrapper (
SelectTrigger,SelectContent,SelectItem, etc.) currently swallows refs because they’re plain functions. Consumers can no longer grab DOM nodes (e.g., focusing a trigger programmatically or integrating with form libraries that rely on refs), and TypeScript will complain when arefis passed. Please wrap each Radix wrapper inReact.forwardRef(plusdisplayName) so refs propagate through, following the same pattern Radix/shadcn components use.templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/menubar.tsx (1)
9-276: Restore ref forwarding on Menubar primitives.Wrapping the Radix menubar primitives in plain functions removes their
refsurface, which breaks patterns like focusing triggers/items or integrating with libraries that rely on refs. Please convert these wrappers toReact.forwardRefcomponents (and setdisplayName) so they behave like the original Radix exports.templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/context-menu.tsx (1)
9-252: Forward refs through the Context Menu wrappers.Similar to the other UI modules, these wrappers drop the
refsupport that Radix provides. Downstream code can no longer attach refs to items/triggers (useful for focus management or imperative positioning). Please switch the wrappers toReact.forwardRefwith matchingdisplayNamevalues so the public API remains fully compatible with the Radix primitives.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
Disabled knowledge base sources:
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
⛔ Files ignored due to path filters (3)
templates/sample/samples/agentKit/Agentic-Reasoning/app/icon.pngis excluded by!**/*.pngtemplates/sample/samples/agentKit/Agentic-Reasoning/public/lamatic-logo.pngis excluded by!**/*.pngtemplates/sample/samples/agentKit/Agentic-Reasoning/public/placeholder.svgis excluded by!**/*.svg
📒 Files selected for processing (80)
templates/sample/.gitignore(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/.env.example(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/.gitignore(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/.npmrc(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/LICENSE(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/README.md(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/actions/orchestrate.ts(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/app/globals.css(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/app/layout.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/app/page.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components.json(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/theme-provider.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/accordion.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/alert-dialog.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/alert.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/aspect-ratio.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/avatar.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/badge.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/breadcrumb.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/button.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/calendar.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/card.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/carousel.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/chart.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/checkbox.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/collapsible.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/command.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/context-menu.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/dialog.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/drawer.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/dropdown-menu.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/form.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/hover-card.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/input-otp.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/input.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/label.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/menubar.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/navigation-menu.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/pagination.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/popover.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/progress.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/radio-group.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/resizable.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/scroll-area.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/select.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/separator.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/sheet.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/sidebar.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/skeleton.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/slider.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/sonner.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/switch.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/table.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/tabs.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/textarea.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/toast.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/toaster.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/toggle-group.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/toggle.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/tooltip.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/use-mobile.tsx(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/use-toast.ts(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/hooks/use-mobile.ts(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/hooks/use-toast.ts(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/README.md(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/config/kit_config.json(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/BillowySalesman.ts(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/EnoughHouse.ts(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/FancyApplication.ts(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/yaml/BillowySalesman.yaml(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/yaml/EnoughHouse.yaml(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/yaml/FancyApplication.yaml(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lib/lamatic-client.ts(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/next.config.mjs(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/package.json(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/postcss.config.mjs(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/scripts/deploy.sh(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/styles/globals.css(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/tsconfig.json(1 hunks)
✅ Files skipped from review due to trivial changes (5)
- templates/sample/samples/agentKit/Agentic-Reasoning/tsconfig.json
- templates/sample/samples/agentKit/Agentic-Reasoning/.npmrc
- templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/README.md
- templates/sample/samples/agentKit/Agentic-Reasoning/LICENSE
- templates/sample/samples/agentKit/Agentic-Reasoning/.gitignore
🚧 Files skipped from review as they are similar to previous changes (1)
- templates/sample/.gitignore
🧰 Additional context used
🧬 Code graph analysis (55)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/label.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/progress.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/card.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/switch.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/hooks/use-mobile.ts (1)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/use-mobile.tsx (1)
useIsMobile(5-19)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/scroll-area.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/slider.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/checkbox.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/calendar.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/toggle-group.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/radio-group.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/separator.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/EnoughHouse.ts (2)
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/BillowySalesman.ts (2)
getNodesAndEdges(256-264)getFlowConfig(266-268)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/FancyApplication.ts (2)
getNodesAndEdges(423-431)getFlowConfig(433-435)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/button.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/badge.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/navigation-menu.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/tooltip.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/textarea.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/accordion.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/toggle.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/table.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/toast.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/command.tsx (2)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/dialog.tsx (5)
Dialog(133-133)DialogHeader(138-138)DialogTitle(141-141)DialogDescription(136-136)DialogContent(135-135)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/popover.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/tabs.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/hooks/use-toast.ts (1)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/toast.tsx (3)
ToastProps(120-120)ToastActionElement(121-121)Toast(124-124)
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/FancyApplication.ts (2)
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/BillowySalesman.ts (2)
getNodesAndEdges(256-264)getFlowConfig(266-268)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/EnoughHouse.ts (2)
getNodesAndEdges(256-264)getFlowConfig(266-268)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/sonner.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/toaster.tsx (1)
Toaster(13-35)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/breadcrumb.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/actions/orchestrate.ts (2)
templates/assistant/grammar-extension/sidepanel.js (1)
query(107-122)templates/sample/samples/agentKit/Agentic-Reasoning/lib/lamatic-client.ts (1)
lamaticClient(12-16)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/input.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/app/page.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/actions/orchestrate.ts (1)
orchestratePipelineStep(33-131)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/toaster.tsx (3)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/use-toast.ts (1)
useToast(194-194)templates/sample/samples/agentKit/Agentic-Reasoning/hooks/use-toast.ts (1)
useToast(194-194)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/toast.tsx (6)
ToastProvider(122-122)Toast(124-124)ToastTitle(125-125)ToastDescription(126-126)ToastClose(127-127)ToastViewport(123-123)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/alert.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/carousel.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/skeleton.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/sheet.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/drawer.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/select.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/dialog.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/input-otp.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/use-mobile.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/hooks/use-mobile.ts (1)
useIsMobile(5-19)
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/BillowySalesman.ts (2)
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/EnoughHouse.ts (2)
getNodesAndEdges(256-264)getFlowConfig(266-268)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/FancyApplication.ts (2)
getNodesAndEdges(423-431)getFlowConfig(433-435)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/hover-card.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/avatar.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/menubar.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/use-toast.ts (1)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/toast.tsx (3)
ToastProps(120-120)ToastActionElement(121-121)Toast(124-124)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/alert-dialog.tsx (2)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/button.tsx (1)
buttonVariants(59-59)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/context-menu.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/dropdown-menu.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/chart.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/sidebar.tsx (8)
templates/sample/samples/agentKit/Agentic-Reasoning/hooks/use-mobile.ts (1)
useIsMobile(5-19)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/tooltip.tsx (4)
TooltipProvider(61-61)TooltipContent(61-61)Tooltip(61-61)TooltipTrigger(61-61)templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/sheet.tsx (5)
Sheet(131-131)SheetContent(134-134)SheetHeader(135-135)SheetTitle(137-137)SheetDescription(138-138)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/button.tsx (1)
Button(59-59)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/input.tsx (1)
Input(21-21)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/separator.tsx (1)
Separator(28-28)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/skeleton.tsx (1)
Skeleton(13-13)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/form.tsx (2)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/label.tsx (1)
Label(24-24)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/resizable.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/pagination.tsx (1)
templates/sample/samples/agentKit/Agentic-Reasoning/lib/utils.ts (1)
cn(4-6)
🪛 ast-grep (0.39.7)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/chart.tsx
[warning] 82-82: Usage of dangerouslySetInnerHTML detected. This bypasses React's built-in XSS protection. Always sanitize HTML content using libraries like DOMPurify before injecting it into the DOM to prevent XSS attacks.
Context: dangerouslySetInnerHTML
Note: [CWE-79] Improper Neutralization of Input During Web Page Generation [REFERENCES]
- https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml
- https://cwe.mitre.org/data/definitions/79.html
(react-unsafe-html-injection)
🪛 Biome (2.1.2)
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/config/kit_config.json
[error] 7-7: expected , but instead found "metadata"
Remove "metadata"
(parse)
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/chart.tsx
[error] 83-83: Avoid passing content using the dangerouslySetInnerHTML prop.
Setting content using code can expose users to cross-site scripting (XSS) attacks
(lint/security/noDangerouslySetInnerHtml)
🪛 dotenv-linter (4.0.0)
templates/sample/samples/agentKit/Agentic-Reasoning/.env.example
[warning] 1-1: [EndingBlankLine] No blank line at the end of the file
(EndingBlankLine)
[warning] 1-1: [QuoteCharacter] The value has quote characters (', ")
(QuoteCharacter)
🪛 markdownlint-cli2 (0.18.1)
templates/sample/samples/agentKit/Agentic-Reasoning/README.md
24-24: Bare URL used
(MD034, no-bare-urls)
77-77: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
| const resData = await lamaticClient.executeFlow(flow.workflowId, inputs); | ||
| console.log(`[v0] ${step} raw response:`, resData); | ||
|
|
||
| const output: Record<string, any> = {}; | ||
|
|
||
| // Always capture steps if present | ||
| if (resData?.result?.steps) { | ||
| output.steps = resData.result.steps; | ||
| } | ||
|
|
||
| if (step === "step2" && resData?.result?.research) { | ||
| output.research = resData.result.research; | ||
| } | ||
|
|
||
| // Store declared outputs | ||
| for (const key of Object.keys(flow.outputSchema)) { | ||
| if (resData?.result && resData.result[key] !== undefined) { | ||
| output[key] = resData.result[key]; | ||
| } | ||
| } | ||
|
|
||
| console.log(`[v0] ${step} completed:`, output); | ||
|
|
||
| return { | ||
| success: true, | ||
| stepId: step, | ||
| stepName: flow.name, | ||
| data: output, | ||
| }; | ||
| } catch (error) { |
There was a problem hiding this comment.
Handle failed Lamatic executions before marking the step successful.
Right now any resolved executeFlow call is treated as a success, even when Lamatic replies with a failure status or no result. That produces “successful” pipeline steps with empty outputs, and the rest of the orchestration runs on garbage data. Please gate success on Lamatic reporting a successful status and a populated result, and surface a proper error otherwise. Apply the same guard to the other call sites (orchestratePipelineStepByStep and orchestratePipeline) so the whole pipeline halts when Lamatic fails.
- const resData = await lamaticClient.executeFlow(flow.workflowId, inputs);
- console.log(`[v0] ${step} raw response:`, resData);
-
- const output: Record<string, any> = {};
+ const resData = await lamaticClient.executeFlow(flow.workflowId, inputs);
+ console.log(`[v0] ${step} raw response:`, resData);
+
+ if (
+ !resData ||
+ typeof resData.status !== "string" ||
+ resData.status.toUpperCase() !== "SUCCESS" ||
+ !resData.result
+ ) {
+ throw new Error(
+ resData?.error ??
+ `Flow ${flow.name} returned status ${resData?.status ?? "UNKNOWN"}`
+ );
+ }
+
+ const output: Record<string, any> = {};📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| const resData = await lamaticClient.executeFlow(flow.workflowId, inputs); | |
| console.log(`[v0] ${step} raw response:`, resData); | |
| const output: Record<string, any> = {}; | |
| // Always capture steps if present | |
| if (resData?.result?.steps) { | |
| output.steps = resData.result.steps; | |
| } | |
| if (step === "step2" && resData?.result?.research) { | |
| output.research = resData.result.research; | |
| } | |
| // Store declared outputs | |
| for (const key of Object.keys(flow.outputSchema)) { | |
| if (resData?.result && resData.result[key] !== undefined) { | |
| output[key] = resData.result[key]; | |
| } | |
| } | |
| console.log(`[v0] ${step} completed:`, output); | |
| return { | |
| success: true, | |
| stepId: step, | |
| stepName: flow.name, | |
| data: output, | |
| }; | |
| } catch (error) { | |
| const resData = await lamaticClient.executeFlow(flow.workflowId, inputs); | |
| console.log(`[v0] ${step} raw response:`, resData); | |
| if ( | |
| !resData || | |
| typeof resData.status !== "string" || | |
| resData.status.toUpperCase() !== "SUCCESS" || | |
| !resData.result | |
| ) { | |
| throw new Error( | |
| resData?.error ?? | |
| `Flow ${flow.name} returned status ${resData?.status ?? "UNKNOWN"}` | |
| ); | |
| } | |
| const output: Record<string, any> = {}; | |
| // Always capture steps if present | |
| if (resData?.result?.steps) { | |
| output.steps = resData.result.steps; | |
| } | |
| if (step === "step2" && resData?.result?.research) { | |
| output.research = resData.result.research; | |
| } | |
| // Store declared outputs | |
| for (const key of Object.keys(flow.outputSchema)) { | |
| if (resData?.result && resData.result[key] !== undefined) { | |
| output[key] = resData.result[key]; | |
| } | |
| } | |
| console.log(`[v0] ${step} completed:`, output); | |
| return { | |
| success: true, | |
| stepId: step, | |
| stepName: flow.name, | |
| data: output, | |
| }; | |
| } catch (error) { |
| @@ -0,0 +1,125 @@ | |||
| @import 'tailwindcss'; | |||
| @import 'tw-animate-css'; | |||
There was a problem hiding this comment.
🧩 Analysis chain
Verify the animation package name.
The import @import 'tw-animate-css' on line 2 uses a non-standard package name. Confirm this is the correct package—common alternatives are tailwindcss-animate (for Tailwind v3) or animations built into Tailwind v4+.
🌐 Web query:
What is the correct package name for Tailwind CSS animations?
💡 Result:
The package name is tailwindcss-animate — install with: npm install -D tailwindcss-animate. [1][2]
Sources:
[1] jsDelivr package info for tailwindcss-animate.
[2] Reddit thread showing installation/use of tailwindcss-animate.
Update animation package import to use correct package name.
The correct package name for Tailwind CSS animations is tailwindcss-animate. Change the import from @import 'tw-animate-css' to use the correct package:
@import 'tailwindcss-animate';🤖 Prompt for AI Agents
In templates/sample/samples/agentKit/Agentic-Reasoning/app/globals.css around
line 2, the stylesheet imports the wrong animation package ('tw-animate-css');
replace that import with the correct Tailwind animations package by updating the
import statement to reference 'tailwindcss-animate' so the proper package is
loaded.
| --destructive: oklch(0.577 0.245 27.325); | ||
| --destructive-foreground: oklch(0.577 0.245 27.325); |
There was a problem hiding this comment.
Critical: Identical destructive foreground and background colors will cause contrast failure.
In the light theme, both --destructive and --destructive-foreground are set to oklch(0.577 0.245 27.325), making destructive UI elements unreadable. The dark theme correctly uses different values (oklch(0.396 0.141 25.723) and oklch(0.637 0.237 25.331)).
Apply this diff to fix the contrast issue in the light theme:
- --destructive: oklch(0.577 0.245 27.325);
- --destructive-foreground: oklch(0.577 0.245 27.325);
+ --destructive: oklch(0.577 0.245 27.325);
+ --destructive-foreground: oklch(0.985 0 0);Alternatively, ensure the foreground is a contrasting color (e.g., white or light gray like oklch(0.985 0 0) to match the pattern used for other semantic colors).
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| --destructive: oklch(0.577 0.245 27.325); | |
| --destructive-foreground: oklch(0.577 0.245 27.325); | |
| --destructive: oklch(0.577 0.245 27.325); | |
| --destructive-foreground: oklch(0.985 0 0); |
🤖 Prompt for AI Agents
In templates/sample/samples/agentKit/Agentic-Reasoning/app/globals.css around
lines 21-22, the light-theme CSS sets both --destructive and
--destructive-foreground to the identical value causing contrast failure; change
--destructive-foreground to a contrasting value (for example use a light
foreground like oklch(0.985 0 0) or another higher-lightness oklch value
consistent with other semantic foregrounds) so destructive text/icons meet
contrast requirements while leaving --destructive as the current background
color.
| <Button variant="ghost" size="sm" className="text-xs text-muted-foreground"> | ||
| Show all | ||
| </Button> |
There was a problem hiding this comment.
Non-functional "Show all" button.
The "Show all" button at line 456 has no onClick handler and appears to be a placeholder. Users clicking this button will see no response, which could be confusing.
Consider either removing this button or implementing the expand/collapse functionality for references. Would you like me to suggest an implementation for toggling the visibility of all references?
| function Accordion({ | ||
| ...props | ||
| }: React.ComponentProps<typeof AccordionPrimitive.Root>) { | ||
| return <AccordionPrimitive.Root data-slot="accordion" {...props} /> | ||
| } | ||
|
|
||
| function AccordionItem({ | ||
| className, | ||
| ...props | ||
| }: React.ComponentProps<typeof AccordionPrimitive.Item>) { | ||
| return ( | ||
| <AccordionPrimitive.Item | ||
| data-slot="accordion-item" | ||
| className={cn("border-b last:border-b-0", className)} | ||
| {...props} | ||
| /> | ||
| ) | ||
| } | ||
|
|
||
| function AccordionTrigger({ | ||
| className, | ||
| children, | ||
| ...props | ||
| }: React.ComponentProps<typeof AccordionPrimitive.Trigger>) { | ||
| return ( | ||
| <AccordionPrimitive.Header className="flex"> | ||
| <AccordionPrimitive.Trigger | ||
| data-slot="accordion-trigger" | ||
| className={cn( | ||
| "focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180", | ||
| className | ||
| )} | ||
| {...props} | ||
| > | ||
| {children} | ||
| <ChevronDownIcon className="text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200" /> | ||
| </AccordionPrimitive.Trigger> | ||
| </AccordionPrimitive.Header> | ||
| ) | ||
| } | ||
|
|
||
| function AccordionContent({ | ||
| className, | ||
| children, | ||
| ...props | ||
| }: React.ComponentProps<typeof AccordionPrimitive.Content>) { | ||
| return ( | ||
| <AccordionPrimitive.Content | ||
| data-slot="accordion-content" | ||
| className="data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm" | ||
| {...props} | ||
| > | ||
| <div className={cn("pt-0 pb-4", className)}>{children}</div> | ||
| </AccordionPrimitive.Content> |
There was a problem hiding this comment.
Forward refs and className must flow to Radix primitives
Refs are currently swallowed for every wrapper here, which breaks focus management and other Radix behaviors, and AccordionContent strips consumers’ className from the content element. Please forward the refs and merge the className on the content node.
-function Accordion({
- ...props
-}: React.ComponentProps<typeof AccordionPrimitive.Root>) {
- return <AccordionPrimitive.Root data-slot="accordion" {...props} />
-}
-
-function AccordionItem({
- className,
- ...props
-}: React.ComponentProps<typeof AccordionPrimitive.Item>) {
- return (
- <AccordionPrimitive.Item
- data-slot="accordion-item"
- className={cn("border-b last:border-b-0", className)}
- {...props}
- />
- )
-}
-
-function AccordionTrigger({
- className,
- children,
- ...props
-}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {
- return (
- <AccordionPrimitive.Header className="flex">
- <AccordionPrimitive.Trigger
- data-slot="accordion-trigger"
- className={cn(
- "focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180",
- className
- )}
- {...props}
- >
- {children}
- <ChevronDownIcon className="text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200" />
- </AccordionPrimitive.Trigger>
- </AccordionPrimitive.Header>
- )
-}
-
-function AccordionContent({
- className,
- children,
- ...props
-}: React.ComponentProps<typeof AccordionPrimitive.Content>) {
- return (
- <AccordionPrimitive.Content
- data-slot="accordion-content"
- className="data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm"
- {...props}
- >
- <div className={cn("pt-0 pb-4", className)}>{children}</div>
- </AccordionPrimitive.Content>
- )
-}
+const Accordion = React.forwardRef<
+ React.ElementRef<typeof AccordionPrimitive.Root>,
+ React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Root>
+>(({ ...props }, ref) => (
+ <AccordionPrimitive.Root ref={ref} data-slot="accordion" {...props} />
+))
+Accordion.displayName = AccordionPrimitive.Root.displayName
+
+const AccordionItem = React.forwardRef<
+ React.ElementRef<typeof AccordionPrimitive.Item>,
+ React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>
+>(({ className, ...props }, ref) => (
+ <AccordionPrimitive.Item
+ ref={ref}
+ data-slot="accordion-item"
+ className={cn("border-b last:border-b-0", className)}
+ {...props}
+ />
+))
+AccordionItem.displayName = AccordionPrimitive.Item.displayName
+
+const AccordionTrigger = React.forwardRef<
+ React.ElementRef<typeof AccordionPrimitive.Trigger>,
+ React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>
+>(({ className, children, ...props }, ref) => (
+ <AccordionPrimitive.Header className="flex">
+ <AccordionPrimitive.Trigger
+ ref={ref}
+ data-slot="accordion-trigger"
+ className={cn(
+ "focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180",
+ className
+ )}
+ {...props}
+ >
+ {children}
+ <ChevronDownIcon className="text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200" />
+ </AccordionPrimitive.Trigger>
+ </AccordionPrimitive.Header>
+))
+AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName
+
+const AccordionContent = React.forwardRef<
+ React.ElementRef<typeof AccordionPrimitive.Content>,
+ React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>
+>(({ className, children, ...props }, ref) => (
+ <AccordionPrimitive.Content
+ ref={ref}
+ data-slot="accordion-content"
+ className={cn(
+ "data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm",
+ className
+ )}
+ {...props}
+ >
+ <div className="pt-0 pb-4">{children}</div>
+ </AccordionPrimitive.Content>
+))
+AccordionContent.displayName = AccordionPrimitive.Content.displayName📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| function Accordion({ | |
| ...props | |
| }: React.ComponentProps<typeof AccordionPrimitive.Root>) { | |
| return <AccordionPrimitive.Root data-slot="accordion" {...props} /> | |
| } | |
| function AccordionItem({ | |
| className, | |
| ...props | |
| }: React.ComponentProps<typeof AccordionPrimitive.Item>) { | |
| return ( | |
| <AccordionPrimitive.Item | |
| data-slot="accordion-item" | |
| className={cn("border-b last:border-b-0", className)} | |
| {...props} | |
| /> | |
| ) | |
| } | |
| function AccordionTrigger({ | |
| className, | |
| children, | |
| ...props | |
| }: React.ComponentProps<typeof AccordionPrimitive.Trigger>) { | |
| return ( | |
| <AccordionPrimitive.Header className="flex"> | |
| <AccordionPrimitive.Trigger | |
| data-slot="accordion-trigger" | |
| className={cn( | |
| "focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180", | |
| className | |
| )} | |
| {...props} | |
| > | |
| {children} | |
| <ChevronDownIcon className="text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200" /> | |
| </AccordionPrimitive.Trigger> | |
| </AccordionPrimitive.Header> | |
| ) | |
| } | |
| function AccordionContent({ | |
| className, | |
| children, | |
| ...props | |
| }: React.ComponentProps<typeof AccordionPrimitive.Content>) { | |
| return ( | |
| <AccordionPrimitive.Content | |
| data-slot="accordion-content" | |
| className="data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm" | |
| {...props} | |
| > | |
| <div className={cn("pt-0 pb-4", className)}>{children}</div> | |
| </AccordionPrimitive.Content> | |
| const Accordion = React.forwardRef< | |
| React.ElementRef<typeof AccordionPrimitive.Root>, | |
| React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Root> | |
| >(({ ...props }, ref) => ( | |
| <AccordionPrimitive.Root ref={ref} data-slot="accordion" {...props} /> | |
| )) | |
| Accordion.displayName = AccordionPrimitive.Root.displayName | |
| const AccordionItem = React.forwardRef< | |
| React.ElementRef<typeof AccordionPrimitive.Item>, | |
| React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item> | |
| >(({ className, ...props }, ref) => ( | |
| <AccordionPrimitive.Item | |
| ref={ref} | |
| data-slot="accordion-item" | |
| className={cn("border-b last:border-b-0", className)} | |
| {...props} | |
| /> | |
| )) | |
| AccordionItem.displayName = AccordionPrimitive.Item.displayName | |
| const AccordionTrigger = React.forwardRef< | |
| React.ElementRef<typeof AccordionPrimitive.Trigger>, | |
| React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger> | |
| >(({ className, children, ...props }, ref) => ( | |
| <AccordionPrimitive.Header className="flex"> | |
| <AccordionPrimitive.Trigger | |
| ref={ref} | |
| data-slot="accordion-trigger" | |
| className={cn( | |
| "focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180", | |
| className | |
| )} | |
| {...props} | |
| > | |
| {children} | |
| <ChevronDownIcon className="text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200" /> | |
| </AccordionPrimitive.Trigger> | |
| </AccordionPrimitive.Header> | |
| )) | |
| AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName | |
| const AccordionContent = React.forwardRef< | |
| React.ElementRef<typeof AccordionPrimitive.Content>, | |
| React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content> | |
| >(({ className, children, ...props }, ref) => ( | |
| <AccordionPrimitive.Content | |
| ref={ref} | |
| data-slot="accordion-content" | |
| className={cn( | |
| "data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm", | |
| className | |
| )} | |
| {...props} | |
| > | |
| <div className="pt-0 pb-4">{children}</div> | |
| </AccordionPrimitive.Content> | |
| )) | |
| AccordionContent.displayName = AccordionPrimitive.Content.displayName |
🤖 Prompt for AI Agents
In
templates/sample/samples/agentKit/Agentic-Reasoning/components/ui/accordion.tsx
around lines 9 to 62, the wrapper components swallow refs and AccordionContent
doesn't merge consumer className into the inner content node; convert each
wrapper to use React.forwardRef with the proper typing (e.g.,
React.forwardRef<HTMLDivElement, React.ComponentPropsWithoutRef<typeof
AccordionPrimitive.Root>> or ComponentPropsWithRef for the corresponding Radix
primitive), accept ref as the second parameter and pass it through to the
underlying AccordionPrimitive element via the ref prop, and for AccordionContent
merge the consumer className with the existing classes using cn before applying
to the primitive (so consumers’ className flows to the content div).
| code: |- | ||
| const researchArray = {{forLoopEndNode_366.output.loopOutput}}; | ||
|
|
||
| const research = researchArray.flatMap((searchEntry) => { | ||
| return searchEntry.webSearchNode_441.output.output.organic; | ||
| }); | ||
|
|
||
| const links = research.map((item) => item.link); | ||
|
|
||
| output = { | ||
| research: research, | ||
| links: links | ||
| }; |
There was a problem hiding this comment.
Guard against missing organic search results.
When Serper returns no organic array (or a request fails), researchArray.flatMap(...) yields [undefined], and research.map((item) => item.link) throws Cannot read properties of undefined. The entire flow crashes instead of returning an empty payload. Please defensively default to empty arrays and only collect valid links before mapping.
Apply this diff to harden the node:
-const researchArray = {{forLoopEndNode_366.output.loopOutput}};
-
-const research = researchArray.flatMap((searchEntry) => {
- return searchEntry.webSearchNode_441.output.output.organic;
-});
-
-const links = research.map((item) => item.link);
-
-output = {
- research: research,
- links: links
-};
+const loopOutput = {{forLoopEndNode_366.output.loopOutput}} ?? [];
+const researchArray = Array.isArray(loopOutput) ? loopOutput : [];
+
+const research = researchArray.flatMap((searchEntry) => {
+ return searchEntry?.webSearchNode_441?.output?.output?.organic ?? [];
+});
+
+const links = research
+ .map((item) => item?.link)
+ .filter(Boolean);
+
+output = {
+ research,
+ links
+};📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| code: |- | |
| const researchArray = {{forLoopEndNode_366.output.loopOutput}}; | |
| const research = researchArray.flatMap((searchEntry) => { | |
| return searchEntry.webSearchNode_441.output.output.organic; | |
| }); | |
| const links = research.map((item) => item.link); | |
| output = { | |
| research: research, | |
| links: links | |
| }; | |
| code: |- | |
| const loopOutput = {{forLoopEndNode_366.output.loopOutput}} ?? []; | |
| const researchArray = Array.isArray(loopOutput) ? loopOutput : []; | |
| const research = researchArray.flatMap((searchEntry) => { | |
| return searchEntry?.webSearchNode_441?.output?.output?.organic ?? []; | |
| }); | |
| const links = research | |
| .map((item) => item?.link) | |
| .filter(Boolean); | |
| output = { | |
| research, | |
| links | |
| }; |
🤖 Prompt for AI Agents
In
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/yaml/FancyApplication.yaml
around lines 586 to 598, the code assumes every searchEntry has a
webSearchNode_441.output.output.organic array which can be missing and causes
researchArray.flatMap(...) to produce undefined and later research.map(...) to
throw; update the logic to default missing values to empty arrays (e.g., coerce
researchArray to an array, for each entry guard into
webSearchNode_441?.output?.output?.organic || []), use flatMap (or map+flat)
over those safe arrays, then filter out any falsy entries before mapping links
so you only collect valid items and return empty research/links arrays when
results are absent or failed.
| const nextConfig = { | ||
| eslint: { | ||
| ignoreDuringBuilds: true, | ||
| }, | ||
| typescript: { | ||
| ignoreBuildErrors: true, | ||
| }, | ||
| images: { | ||
| unoptimized: true, | ||
| }, | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
Verify the intent to ignore TypeScript and ESLint errors.
This configuration disables:
- ESLint checks during builds
- TypeScript error checking during builds
- Next.js image optimization
While these settings can ease initial development in a sample/template, they also:
- Hide potential bugs and type safety issues
- Bypass important guardrails
- May teach developers to ignore warnings
- Disable performance optimizations
Please confirm these settings are intentional for this sample template. If they're temporary workarounds, consider:
- Fixing the underlying TypeScript/ESLint errors instead
- Adding a comment explaining why these are disabled
- Documenting that these should be re-enabled for production use
🏁 Script executed:
#!/bin/bash
# Check for TypeScript errors in the project
npx tsc --noEmit
# Check for ESLint errors
npx eslint . --ext .ts,.tsxLength of output: 1215
I need to investigate the project structure and documentation for this sample to understand the intent behind these settings.
---
🏁 Script executed:
```shell
#!/bin/bash
# Check the full next.config.mjs file with context
cat templates/sample/samples/agentKit/Agentic-Reasoning/next.config.mjs
# Look for README or documentation in this sample directory
find templates/sample/samples/agentKit/Agentic-Reasoning -type f -name "README*" -o -name "readme*" -o -name "*.md"
# Check package.json in the sample directory
cat templates/sample/samples/agentKit/Agentic-Reasoning/package.json 2>/dev/null || echo "No package.json found"
# Check for any tsconfig or eslint config files in this directory
find templates/sample/samples/agentKit/Agentic-Reasoning -type f \( -name "tsconfig*" -o -name ".eslintrc*" -o -name "eslint.config*" \)
Length of output: 3031
---
🏁 Script executed:
```shell
#!/bin/bash
# Read the main README to understand project purpose
cat templates/sample/samples/agentKit/Agentic-Reasoning/README.md
# Also check tsconfig.json to see if there are config issues
cat templates/sample/samples/agentKit/Agentic-Reasoning/tsconfig.json
# Check if eslint.config.js or similar exists in parent directories
find templates/sample/samples/agentKit -maxdepth 3 -type f \( -name "eslint.config*" -o -name ".eslintrc*" \) 2>/dev/null | head -20
Length of output: 3914
Configure ESLint properly and address underlying TypeScript/linting errors instead of masking them.
This is a production-deployed project (Vercel, live demo), not a minimal template. The configuration contradicts the codebase:
tsconfig.jsonenablesstrict: true— showing intent for type safety- No ESLint config file exists (missing
eslint.config.js) - The
package.jsondefines alintscript that cannot run without ESLint config - README provides no justification for disabling checks
The current configuration masks real issues. Recommended actions:
- Create
eslint.config.jsto enable linting (or remove thelintscript if not needed) - Run
tsc --noEmitandnpm run lintto identify and fix actual errors - If errors must remain temporarily, add inline comments explaining why in
next.config.mjs
🤖 Prompt for AI Agents
In templates/sample/samples/agentKit/Agentic-Reasoning/next.config.mjs (lines
2-12) the Next config is silencing ESLint and TypeScript build errors which
contradicts the repo's intent to use strict typing and has no ESLint config;
create a proper eslint.config.js at the repo root (or remove/adjust the lint
script in package.json), re-enable TypeScript/ESLint checks by removing
ignoreBuildErrors/ignoreDuringBuilds, run tsc --noEmit and npm run lint to fix
the reported issues, and if you must temporarily suppress specific problems add
targeted inline comments in next.config.mjs explaining why each suppression
exists and include links/tickets for follow-up.
| "repository": { | ||
| "type": "git", | ||
| "url": "https://github.com/Lamatic/agent-kit-reasoning" | ||
| }, |
There was a problem hiding this comment.
Update repository URL to match the actual repository.
The repository URL points to https://github.com/Lamatic/agent-kit-reasoning, but this code is part of the AgentKit repository. This mismatch could confuse contributors and package consumers.
Apply this diff:
"repository": {
"type": "git",
- "url": "https://github.com/Lamatic/agent-kit-reasoning"
+ "url": "https://github.com/Lamatic/AgentKit"
},📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "repository": { | |
| "type": "git", | |
| "url": "https://github.com/Lamatic/agent-kit-reasoning" | |
| }, | |
| "repository": { | |
| "type": "git", | |
| "url": "https://github.com/Lamatic/AgentKit" | |
| }, |
🤖 Prompt for AI Agents
In templates/sample/samples/agentKit/Agentic-Reasoning/package.json around lines
4 to 7, the repository.url currently points to
"https://github.com/Lamatic/agent-kit-reasoning" which is incorrect for this
AgentKit project; update the URL to the correct AgentKit repository URL (replace
with the official AgentKit repo, e.g., https://github.com/AgentKit/AgentKit or
the specific Agentic-Reasoning repo under the AgentKit organization) so the
package metadata accurately reflects the project's repository.
| ``` | ||
| /actions | ||
| └── orchestrate.ts # Handles orchestration logic | ||
| /app | ||
| └── page.tsx # Main chat UI | ||
| /lib | ||
| └── lamatic-client.ts # Lamatic API client | ||
| /package.json # Dependencies & scripts | ||
| ``` | ||
|
|
There was a problem hiding this comment.
Add language identifier to code fence.
The static analysis tool correctly flags that the code fence is missing a language identifier.
Apply this diff:
-```
+```text
/actions
└── orchestrate.ts # Handles orchestration logic
/app
└── page.tsx # Main chat UI
/lib
└── lamatic-client.ts # Lamatic API client
/package.json # Dependencies & scripts
<details>
<summary>🧰 Tools</summary>
<details>
<summary>🪛 markdownlint-cli2 (0.18.1)</summary>
77-77: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
</details>
</details>
<details>
<summary>🤖 Prompt for AI Agents</summary>
In templates/sample/samples/agentKit/Agentic-Reasoning/README.md around lines 77
to 86, the markdown code fence lacks a language identifier; update the fenced
block to use text as the opening fence (and keep as the closing fence) so
the example is explicitly marked as plain text; simply replace the current opener withtext and leave the content and closing fence unchanged.
</details>
<!-- This is an auto-generated comment by CodeRabbit -->
| --destructive: oklch(0.577 0.245 27.325); | ||
| --destructive-foreground: oklch(0.577 0.245 27.325); |
There was a problem hiding this comment.
🧩 Analysis chain
Verify destructive foreground color.
The --destructive-foreground uses the same oklch value as --destructive (oklch(0.577 0.245 27.325)), which would result in poor contrast. Typically, a foreground color should provide sufficient contrast against its background for readability and accessibility.
Consider using a light color for the foreground. For example:
--destructive: oklch(0.577 0.245 27.325);
- --destructive-foreground: oklch(0.577 0.245 27.325);
+ --destructive-foreground: oklch(0.985 0 0);I'll help verify this review comment by examining the file and understanding the color contrast implications.
🏁 Script executed:
#!/bin/bash
# Locate the globals.css file and examine lines 21-22
fd -t f "globals.css" | head -20Length of output: 686
🏁 Script executed:
#!/bin/bash
# Search for the specific file path mentioned in the review
cat "templates/sample/samples/agentKit/Agentic-Reasoning/styles/globals.css" 2>/dev/null | head -30Length of output: 963
🏁 Script executed:
#!/bin/bash
# More flexible search in case the path differs
find . -name "globals.css" -type f 2>/dev/null | grep -i agenticLength of output: 237
🏁 Script executed:
#!/bin/bash
# Search for oklch color definitions in CSS files
rg -n "destructive" --type css 2>/dev/null | head -20Length of output: 2051
🏁 Script executed:
#!/bin/bash
# Get context around destructive color definitions
rg -C5 "destructive-foreground" --type css 2>/dev/nullLength of output: 42763
🌐 Web query:
oklch color contrast accessibility WCAG same color foreground background
💡 Result:
Short answer: WCAG contrast is defined using relative luminance in the sRGB colorspace, so contrast must be calculated from sRGB values (not directly from OKLCH). If foreground and background are the exact same color the contrast ratio is 1:1 and will fail WCAG for any readable text. Use OKLCH for designing (it’s perceptually uniform) but convert the OKLCH colors to sRGB (and ensure they are in‑gamut) before computing WCAG contrast or using a WCAG checker. [1][2][3]
Sources:
- WCAG 2.2 / relative luminance and contrast calculation (sRGB). [1]
- MDN guidance: CSS includes oklch, but WCAG contrast is based on sRGB relative luminance. [2]
- Modern contrast tools that accept OKLCH convert to sRGB / warn about gamut when checking WCAG ratios. [3]
Fix destructive color contrast in light mode across multiple files.
The review comment is valid. Using identical oklch values for --destructive and --destructive-foreground results in a 1:1 contrast ratio, which fails WCAG accessibility standards. The dark mode variants correctly use different values, establishing the intended pattern. This affects the following files, where the light mode :root theme has identical destructive colors:
templates/sample/samples/agentKit/Agentic-Reasoning/styles/globals.css(lines 21–22)templates/sample/samples/agentKit/Agentic-Reasoning/app/globals.css(lines 21–22)templates/embed/sheets/styles/globals.css(lines 21–22)templates/embed/sheets/app/globals.css(lines 21–22)templates/embed/chat/styles/globals.css(lines 21–22)templates/embed/chat/app/globals.css(lines 21–22)templates/embed/search/styles/globals.css(lines 21–22)templates/embed/search/app/global.css(lines 21–22)templates/automation/hiring/styles/globals.css(lines 21–22)templates/automation/hiring/app/globals.css(lines 21–22)templates/agentic/reasoning/styles/globals.css(lines 21–22)templates/agentic/reasoning/app/globals.css(lines 21–22)templates/special/halloween-costume-generator/styles/globals.css(lines 21–22)templates/special/halloween-costume-generator/app/globals.css(lines 22–23)
Apply the suggested fix: change --destructive-foreground to a light color like oklch(0.985 0 0) in the light mode section of each file.
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (6)
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/yaml/BillowySalesman.yaml (1)
9-10: Fix trigger configuration key typos.Keys
responeTypeandretry_deplayare misspelled, so the trigger will ignore the intended settings. Please rename them toresponseTypeandretry_delay.Apply this diff:
- responeType: realtime - retry_deplay: '0' + responseType: realtime + retry_delay: '0'templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/config/kit_config.json (2)
6-7: Restore valid JSON by adding the missing comma.Without the comma after the
demoURLentry the JSON fails to parse, breaking kit loading.Apply this diff:
- "demoURL" : "https://agent-kit-reasoning.vercel.app" + "demoURL" : "https://agent-kit-reasoning.vercel.app",
11-11: Correct the slug typo.
resoning-kitshould bereasoning-kitto keep URLs and identifiers consistent.Apply this diff:
- "slug" : "resoning-kit", + "slug" : "reasoning-kit",templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/yaml/EnoughHouse.yaml (1)
6-6: Fix typo in configuration key (duplicate of prior feedback).Both line 6 and line 27 contain the misspelled configuration key
responeType, which should beresponseType.Apply this diff to fix both occurrences:
- responeType: realtime + responseType: realtimeAlso applies to: 27-27
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/yaml/FancyApplication.yaml (2)
6-6: Fix typo in configuration key (duplicate of prior feedback).Both line 6 and line 16 contain the misspelled configuration key
responeType, which should beresponseType.Apply this diff to fix both occurrences:
- responeType: realtime + responseType: realtimeAlso applies to: 16-16
586-598: Guard against missing organic search results (duplicate—still blocking).This code assumes
webSearchNode_441.output.output.organicalways exists. When Serper returns missing or failed results,flatMap()yieldsundefined, and the subsequent.map((item) => item.link)crashes withCannot read properties of undefined. The flow crashes instead of gracefully returning empty research/links.This issue was flagged in the prior review and remains unfixed. It is critical for production reliability.
Apply this defensive diff:
-const researchArray = {{forLoopEndNode_366.output.loopOutput}}; - -const research = researchArray.flatMap((searchEntry) => { - return searchEntry.webSearchNode_441.output.output.organic; -}); - -const links = research.map((item) => item.link); - -output = { - research: research, - links: links -}; +const loopOutput = {{forLoopEndNode_366.output.loopOutput}} ?? []; +const researchArray = Array.isArray(loopOutput) ? loopOutput : []; + +const research = researchArray.flatMap((searchEntry) => { + return searchEntry?.webSearchNode_441?.output?.output?.organic ?? []; +}); + +const links = research + .map((item) => item?.link) + .filter(Boolean); + +output = { + research, + links +};
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
Disabled knowledge base sources:
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (10)
templates/sample/.gitignore(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/.gitignore(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/README.md(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/config/kit_config.json(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/BillowySalesman.ts(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/EnoughHouse.ts(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/FancyApplication.ts(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/yaml/BillowySalesman.yaml(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/yaml/EnoughHouse.yaml(1 hunks)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/yaml/FancyApplication.yaml(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
- templates/sample/samples/agentKit/Agentic-Reasoning/.gitignore
- templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/EnoughHouse.ts
- templates/sample/.gitignore
🧰 Additional context used
🧬 Code graph analysis (2)
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/BillowySalesman.ts (2)
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/EnoughHouse.ts (2)
getNodesAndEdges(256-264)getFlowConfig(266-268)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/FancyApplication.ts (2)
getNodesAndEdges(423-431)getFlowConfig(433-435)
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/FancyApplication.ts (2)
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/BillowySalesman.ts (2)
getNodesAndEdges(256-264)getFlowConfig(266-268)templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/EnoughHouse.ts (2)
getNodesAndEdges(256-264)getFlowConfig(266-268)
🪛 Biome (2.1.2)
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/config/kit_config.json
[error] 7-7: expected , but instead found "metadata"
Remove "metadata"
(parse)
| "responeType": "realtime", | ||
| "retry_deplay": "0", | ||
| "advance_schema": "{\n \"query\": \"string\",\n \"history\": [\n {\n \"role\": \"string\",\n \"message\": \"string\"\n }\n ]\n}" |
There was a problem hiding this comment.
Correct trigger value key names.
responeType and retry_deplay are misspelled, so the flow won’t honor the intended response settings. Rename them to responseType and retry_delay.
Apply this diff:
- "responeType": "realtime",
- "retry_deplay": "0",
+ "responseType": "realtime",
+ "retry_delay": "0",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "responeType": "realtime", | |
| "retry_deplay": "0", | |
| "advance_schema": "{\n \"query\": \"string\",\n \"history\": [\n {\n \"role\": \"string\",\n \"message\": \"string\"\n }\n ]\n}" | |
| "responseType": "realtime", | |
| "retry_delay": "0", | |
| "advance_schema": "{\n \"query\": \"string\",\n \"history\": [\n {\n \"role\": \"string\",\n \"message\": \"string\"\n }\n ]\n}" |
🤖 Prompt for AI Agents
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/BillowySalesman.ts
lines 135-137: the trigger configuration has misspelled keys "responeType" and
"retry_deplay"; rename them to "responseType" and "retry_delay" respectively so
the flow honors response settings, keeping the values unchanged and preserving
surrounding JSON/string formatting.
| "id": "triggerNode_1", | ||
| "nodeName": "API Request", | ||
| "responeType": "realtime", | ||
| "advance_schema": "{\n \"steps\": \"string\"\n}" |
There was a problem hiding this comment.
Fix typo in responseType.
responeType is misspelled, so the trigger response mode won’t be set. Please rename it to responseType.
Apply this diff:
- "responeType": "realtime",
+ "responseType": "realtime",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "id": "triggerNode_1", | |
| "nodeName": "API Request", | |
| "responeType": "realtime", | |
| "advance_schema": "{\n \"steps\": \"string\"\n}" | |
| "id": "triggerNode_1", | |
| "nodeName": "API Request", | |
| "responseType": "realtime", | |
| "advance_schema": "{\n \"steps\": \"string\"\n}" |
🤖 Prompt for AI Agents
In
templates/sample/samples/agentKit/Agentic-Reasoning/lamatic/flow/FancyApplication.ts
around lines 130 to 133, the JSON for the trigger node has a misspelled key
"responeType" which prevents the trigger response mode from being set; rename
the key to "responseType" (keeping the value "realtime") so the trigger uses the
correct property name.
Summary by CodeRabbit
Release Notes
New Features
Documentation
Chores