Skip to content

Conversation

afterrburn
Copy link
Contributor

@afterrburn afterrburn commented Jun 28, 2025

Summary by CodeRabbit

  • New Features

    • Introduced an AI-powered search dialog with chat interface, persistent history, markdown rendering, and source citation links.
    • Added an AI-augmented search API endpoint delivering AI-generated answers and related documents, with fallback to traditional search.
    • Added a custom logo component for branding in the search dialog.
    • Added prompt classification to differentiate simple and complex queries for improved response handling.
    • Implemented a new question-answering system strictly based on retrieved documentation with structured, styled responses.
  • Enhancements

    • Integrated the custom AI search dialog into the main application layout.
    • Improved error handling and user feedback in search functionality.
    • Simplified internal workflows by removing redundant validation steps in file collection.
    • Replaced manual document retrieval with streamlined vector search and document reconstruction.
    • Added environment validation at application startup.
  • Bug Fixes

    • Enhanced robustness of search and document retrieval with improved error messages and fallback mechanisms.
  • Chores

    • Added new dependencies to support AI search dialog and markdown rendering.
    • Removed unused validation scripts and simplified workflows.
    • Updated type definitions to include runtime validation and expanded schemas for answers and prompt classifications.
    • Added environment variable validation and example configuration for agent connection.
    • Updated build scripts and environment ignore rules.
    • Added example environment configuration file for user setup.

Copy link
Contributor

coderabbitai bot commented Jun 28, 2025

Walkthrough

This change removes the file validation step from GitHub workflows and deletes the validation script. It refactors the document QA agent to delegate answering to a new RAG-based function with strict schema validation and error handling. A new prompt classification function is added. The search API is enhanced to integrate AI-generated answers with related documents and fallback logic. A new React AI-powered search dialog and logo component are introduced. Environment variable validation is added, along with updates to dependencies and configuration.

Changes

Files / Groups Change Summary
.github/workflows/sync-docs-full.yml, .github/workflows/sync-docs.yml Removed usage of validate-files.sh from workflows; file collection scripts now write directly to output files.
bin/validate-files.sh Deleted script for validating file paths during workflow execution.
agent-docs/src/agents/doc-qa/index.ts Refactored to delegate QA logic to new answerQuestion function; removed manual vector search and prompt construction logic.
agent-docs/src/agents/doc-qa/prompt.ts Added getPromptType function to classify prompt types using an LLM with detailed criteria.
agent-docs/src/agents/doc-qa/rag.ts New module implementing answerQuestion for retrieval-augmented generation with schema-constrained LLM output and fallback error handling.
agent-docs/src/agents/doc-qa/retriever.ts New module for retrieving relevant documents from vector store and reconstructing full documents.
agent-docs/src/agents/doc-qa/types.ts Replaced plain interface with Zod schemas; added schemas and types for answers, prompt types, and classifications.
agent-docs/src/agents/doc-processing/docs-orchestrator.ts Shortened import path for VECTOR_STORE_NAME.
app/api/search/route.ts Replaced direct search handler with AI-augmented search endpoint calling agent API, integrating AI answer and related docs, with fallback to original search.
app/layout.tsx Injected CustomSearchDialog as the search dialog in the root provider and added environment validation on startup.
components/CustomSearchDialog.tsx New React component implementing an AI-powered interactive search dialog with chat UI, message history, markdown rendering, and source links.
components/CustomSearchDialog/index.tsx Added main dialog component with message list, input, and controls.
components/CustomSearchDialog/MessageList.tsx Added message list component rendering chat messages with markdown and source links.
components/CustomSearchDialog/SearchInput.tsx Added controlled textarea input with auto-resize and send-on-enter functionality.
components/CustomSearchDialog/hooks/useMessages.tsx Added hook managing message state, persistence, search API calls, and error handling.
components/CustomSearchDialog/types.ts Added TypeScript interfaces for messages, search results, and dialog props.
components/CustomSearchDialog.tsx Added proxy export for CustomSearchDialog component.
components/icons/AgentuityLogo.tsx New React component rendering the Agentuity logo as an accessible SVG.
package.json Added dependencies: cmdk, react-markdown, remark-gfm; added scripts for production build and environment validation.
.env.example Added example environment variable configuration file for agent connection and Next.js environment.
.gitignore Updated to ignore .env.local and .env.production files explicitly.
lib/env.ts New module for environment variable validation and agent configuration with detailed logging and usage hints.
wrangler.jsonc Added "vars" property defining "NEXTJS_ENV": "production".

Sequence Diagram(s)

AI-Powered Search Flow

sequenceDiagram
    participant User
    participant CustomSearchDialog
    participant /api/search
    participant Agent API (doc-qa)
    participant Retriever
    participant RAG Answer Generator

    User->>CustomSearchDialog: Enters search query
    CustomSearchDialog->>/api/search: GET /api/search?query=...
    /api/search->>Agent API (doc-qa): POST /agents/doc-qa (with query)
    Agent API (doc-qa)->>Retriever: retrieveRelevantDocs(prompt)
    Retriever->>Retriever: Vector search, reconstruct docs
    Retriever-->>Agent API (doc-qa): Relevant docs
    Agent API (doc-qa)->>RAG Answer Generator: answerQuestion(ctx, prompt)
    RAG Answer Generator-->>Agent API (doc-qa): JSON answer + document paths
    Agent API (doc-qa)-->>/api/search: JSON answer + docs
    /api/search-->>CustomSearchDialog: AI answer + docs
    CustomSearchDialog-->>User: Displays AI answer and sources
Loading

Fallback Search Flow

sequenceDiagram
    participant User
    participant CustomSearchDialog
    participant /api/search
    participant Fumadocs Search

    User->>CustomSearchDialog: Enters search query
    CustomSearchDialog->>/api/search: GET /api/search?query=...
    /api/search->>Fumadocs Search: Fallback search (on agent error)
    Fumadocs Search-->>/api/search: Fallback results
    /api/search-->>CustomSearchDialog: Fallback results with notice
    CustomSearchDialog-->>User: Displays fallback results
Loading

Possibly related PRs

  • Seng/fix gh action #198: Introduced and used validate-files.sh in workflows to validate file paths before processing; this PR removes that validation step, directly affecting the same workflow logic.
  • Create document processor #195: Related changes in GitHub workflows and document synchronization processes involving vector store updates and document processing agents.

Suggested reviewers

  • jhaynie

Poem

In the warren of docs where answers are sought,
A clever new rabbit with AI is brought.
With markdown and chat, and sources in tow,
It hops through your queries—just ask, and you'll know!
🐇✨

No more lost in the weeds,
Just answers and leads!


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2bb0826 and abe37e9.

📒 Files selected for processing (2)
  • .env.example (1 hunks)
  • README.md (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • README.md
  • .env.example
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Workers Builds: docs
✨ Finishing Touches
🧪 Generate Unit Tests
  • Create PR with Unit Tests
  • Post Copyable Unit Tests in Comment
  • Commit Unit Tests in branch srith/enhance-qa-agent

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai auto-generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

cloudflare-workers-and-pages bot commented Jun 28, 2025

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
docs abe37e9 Commit Preview URL Jun 30 2025, 01:50 PM

@coderabbitai coderabbitai bot requested review from jhaynie and rblalock June 28, 2025 15:08
set -euo pipefail
./bin/collect-all-files.sh | \
./bin/validate-files.sh > all-files.txt
./bin/collect-all-files.sh > all-files.txt
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unnecessary because we're exposing this workflow to outsider.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (10)
.github/workflows/sync-docs.yml (1)

18-23: Step label & logic diverge after dropping validate-files.sh

The step is still named “Collect and validate files”, yet the validation phase was removed (validate-files.sh no longer invoked). This can confuse future maintainers and reviewers, and makes it easy to overlook that no safety checks are happening on the file list.

-      - name: Collect and validate files
+      - name: Collect changed files

If you still need basic sanity-checks (e.g. path traversal, size limits), consider adding lightweight validation inside collect-changed-files.sh or a follow-up step.

.github/workflows/sync-docs-full.yml (1)

12-16: Rename step or reinstate validation to avoid misleading workflow docs

Same issue as in the incremental workflow: the label advertises validation that no longer occurs. Either rename the step or add minimal validation logic.

-      - name: Collect and validate files
+      - name: Collect all files

Ensure collect-all-files.sh guards against unexpected entries now that the dedicated validator is gone.

agent-docs/src/agents/doc-qa/prompt.ts (1)

14-60: Well-implemented prompt classification with room for minor improvements.

The function follows Agentuity agent guidelines excellently with proper TypeScript usage, structured error handling, and context.logger usage. The classification criteria are clear and the conservative fallback approach is sound.

Consider these optional enhancements:

  1. Make model configurable:
export async function getPromptType(ctx: AgentContext, input: string, model = 'gpt-4o-mini'): Promise<PromptType> {
    // ...
    const result = await generateObject({
-       model: openai('gpt-4o-mini'),
+       model: openai(model),
  1. Add retry logic for robustness:
// Add retry wrapper around generateObject call
const maxRetries = 2;
for (let attempt = 0; attempt <= maxRetries; attempt++) {
    try {
        const result = await generateObject(/* ... */);
        return result.object.type as PromptType;
    } catch (error) {
        if (attempt === maxRetries) {
            ctx.logger.error('Error classifying prompt after %d attempts, defaulting to Normal: %o', maxRetries + 1, error);
            return 'Normal' as PromptType;
        }
        ctx.logger.warn('Prompt classification attempt %d failed, retrying: %o', attempt + 1, error);
    }
}
agent-docs/src/agents/doc-qa/retriever.ts (1)

17-28: Add validation for metadata structure.

The type checking for vec.metadata.path is good, but consider validating the entire metadata structure for better robustness.

  vectors.forEach(vec => {
    if (!vec.metadata) {
      ctx.logger.warn('Vector missing metadata');
      return;
    }
+   // Validate metadata structure
+   if (typeof vec.metadata !== 'object') {
+     ctx.logger.warn('Vector metadata is not an object');
+     return;
+   }
    const path = typeof vec.metadata.path === 'string' ? vec.metadata.path : undefined;
agent-docs/src/agents/doc-qa/index.ts (1)

21-23: Improve prompt validation.

The current check allows empty strings to pass through. Consider checking for meaningful content.

- if (prompt === undefined || prompt === null) {
+ if (!prompt || !prompt.trim()) {
    return resp.text("How can I help you?");
  }
agent-docs/src/agents/doc-qa/rag.ts (1)

86-94: Consider increasing token limit for complex responses.

The current limit of 2048 tokens might be insufficient for detailed technical documentation answers with code examples and structured formatting.

  const result = await generateObject({
    model: openai('gpt-4o'),
    system: systemPrompt,
    prompt: prompt,
    schema: AnswerSchema,
-   maxTokens: 2048,
+   maxTokens: 4096, // Increased for detailed technical responses
  });
components/CustomSearchDialog.tsx (3)

51-66: Add error boundary for localStorage failures.

The current error handling logs warnings but doesn't provide user feedback when localStorage fails.

Consider adding user-visible feedback for localStorage issues:

  } catch (error) {
    console.warn('Failed to load chat history:', error);
+   // Optionally show a toast notification to user about failed history loading
  }

82-87: Improve input focus timing.

The setTimeout for focusing the input is a workaround that might not be reliable across all browsers and devices.

  useEffect(() => {
    if (open) {
-     setTimeout(() => inputRef.current?.focus(), 100);
+     // Use requestAnimationFrame for more reliable timing
+     requestAnimationFrame(() => {
+       inputRef.current?.focus();
+     });
    }
  }, [open]);

302-318: Add input validation and rate limiting.

Consider adding client-side validation and rate limiting to prevent spam queries.

  <input
    ref={inputRef}
    type="text"
    value={currentInput}
    onChange={(e) => setCurrentInput(e.target.value)}
    onKeyDown={handleKeyDown}
    placeholder="Ask about Agentuity..."
+   maxLength={500} // Prevent extremely long queries
    className="flex-1 px-3 py-2 text-sm border border-gray-200 dark:border-gray-700 rounded-lg focus:outline-none focus:ring-1 focus:ring-gray-300 dark:focus:ring-gray-600 focus:border-transparent bg-white dark:bg-gray-800 text-gray-800 dark:text-gray-200 placeholder-gray-400 dark:placeholder-gray-500 transition-all"
    disabled={loading}
  />
app/api/search/route.ts (1)

119-119: Remove debug logging for production.

Consider removing or conditionally enabling this log:

-    console.log('Returning results:', results.length, 'items');
+    if (process.env.NODE_ENV === 'development') {
+      console.log('Returning results:', results.length, 'items');
+    }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 096e11c and 557fee0.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (14)
  • .github/workflows/sync-docs-full.yml (1 hunks)
  • .github/workflows/sync-docs.yml (1 hunks)
  • agent-docs/src/agents/doc-processing/docs-orchestrator.ts (1 hunks)
  • agent-docs/src/agents/doc-qa/index.ts (1 hunks)
  • agent-docs/src/agents/doc-qa/prompt.ts (1 hunks)
  • agent-docs/src/agents/doc-qa/rag.ts (1 hunks)
  • agent-docs/src/agents/doc-qa/retriever.ts (1 hunks)
  • agent-docs/src/agents/doc-qa/types.ts (1 hunks)
  • app/api/search/route.ts (1 hunks)
  • app/layout.tsx (2 hunks)
  • bin/validate-files.sh (0 hunks)
  • components/CustomSearchDialog.tsx (1 hunks)
  • components/icons/AgentuityLogo.tsx (1 hunks)
  • package.json (2 hunks)
💤 Files with no reviewable changes (1)
  • bin/validate-files.sh
🧰 Additional context used
📓 Path-based instructions (2)
`agent-docs/src/agents/**/*.ts`: Use TypeScript for better type safety and IDE s...

agent-docs/src/agents/**/*.ts: Use TypeScript for better type safety and IDE support.
Import types from '@agentuity/sdk'.
Use structured error handling with try/catch blocks.
Leverage the provided logger (context.logger) for consistent logging.
Use the storage APIs (context.kv and context.vector) for persisting data.
Consider agent communication (response.handoff, context.getAgent) for complex workflows.

📄 Source: CodeRabbit Inference Engine (agent-docs/.cursor/rules/sdk.mdc)

List of files the instruction was applied to:

  • agent-docs/src/agents/doc-processing/docs-orchestrator.ts
  • agent-docs/src/agents/doc-qa/prompt.ts
  • agent-docs/src/agents/doc-qa/retriever.ts
  • agent-docs/src/agents/doc-qa/index.ts
  • agent-docs/src/agents/doc-qa/rag.ts
  • agent-docs/src/agents/doc-qa/types.ts
`agent-docs/**/src/agents/**/index.ts`: Prefer using the `agentuity agent create...

agent-docs/**/src/agents/**/index.ts: Prefer using the agentuity agent create command to create a new Agent.
Prefer loading types from the node modules package @agentuity/sdk in the node_modules folder.
The file should export a default function.
Prefer naming the default function Agent or the name of the Agent based on the context of the Agent description.
All code should be in Typescript format.
Use the provided logger from the AgentContext interface such as ctx.logger.info("my message: %s", "hello").

📄 Source: CodeRabbit Inference Engine (agent-docs/.cursor/rules/agent.mdc)

List of files the instruction was applied to:

  • agent-docs/src/agents/doc-qa/index.ts
🧠 Learnings (12)
📓 Common learnings
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: The `AgentRequest` interface in Agentuity provides helper methods and public variables for handling incoming data to the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentRequest interface provides methods for accessing trigger type, metadata, and request payload in various formats (JSON, text, ArrayBuffer, typed object). Use these methods to robustly handle incoming agent requests.
agent-docs/src/agents/doc-processing/docs-orchestrator.ts (5)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentHandler function type in the Agentuity JavaScript SDK is defined as: (request: AgentRequest, response: AgentResponse, context: AgentContext) => Promise<AgentResponseType>. This pattern should be followed for agent handler implementations in TypeScript.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: The `AgentContext` interface in Agentuity supplies request-specific information and helper methods for accessing AI services such as KeyValue storage and Vector storage.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentContext interface exposes logging (context.logger), key-value storage (context.kv), vector storage (context.vector), remote agent access (context.getAgent), and tracing (context.tracer). Utilize these capabilities for building robust and observable agents.
package.json (2)
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/overview.mdc:0-0
Timestamp: 2025-06-24T02:01:16.849Z
Learning: This documentation app is a NextJS application built on top of Fumadocs, which may influence documentation structure, component usage, and best practices for extending or customizing the documentation site.
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/mdx.mdc:0-0
Timestamp: 2025-06-24T02:01:12.231Z
Learning: In MDX files (*.mdx), React components can be embedded and used within the markdown content.
components/icons/AgentuityLogo.tsx (2)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
app/layout.tsx (2)
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/overview.mdc:0-0
Timestamp: 2025-06-24T02:01:16.849Z
Learning: This documentation app is a NextJS application built on top of Fumadocs, which may influence documentation structure, component usage, and best practices for extending or customizing the documentation site.
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/mdx.mdc:0-0
Timestamp: 2025-06-24T02:01:12.231Z
Learning: In MDX files (*.mdx), React components can be embedded and used within the markdown content.
agent-docs/src/agents/doc-qa/prompt.ts (3)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentHandler function type in the Agentuity JavaScript SDK is defined as: (request: AgentRequest, response: AgentResponse, context: AgentContext) => Promise<AgentResponseType>. This pattern should be followed for agent handler implementations in TypeScript.
agent-docs/src/agents/doc-qa/retriever.ts (2)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
agent-docs/src/agents/doc-qa/index.ts (7)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentHandler function type in the Agentuity JavaScript SDK is defined as: (request: AgentRequest, response: AgentResponse, context: AgentContext) => Promise<AgentResponseType>. This pattern should be followed for agent handler implementations in TypeScript.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentRequest interface provides methods for accessing trigger type, metadata, and request payload in various formats (JSON, text, ArrayBuffer, typed object). Use these methods to robustly handle incoming agent requests.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: The `AgentResponse` interface in Agentuity provides helper methods for responding with various data formats from the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentResponse interface provides methods for creating responses in multiple formats (json, text, binary, html, empty) and for redirecting to another agent with response.handoff. Use these methods to standardize agent responses.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: The `AgentRequest` interface in Agentuity provides helper methods and public variables for handling incoming data to the Agent.
agent-docs/src/agents/doc-qa/rag.ts (3)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentHandler function type in the Agentuity JavaScript SDK is defined as: (request: AgentRequest, response: AgentResponse, context: AgentContext) => Promise<AgentResponseType>. This pattern should be followed for agent handler implementations in TypeScript.
components/CustomSearchDialog.tsx (4)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/overview.mdc:0-0
Timestamp: 2025-06-24T02:01:16.849Z
Learning: This documentation app is a NextJS application built on top of Fumadocs, which may influence documentation structure, component usage, and best practices for extending or customizing the documentation site.
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/mdx.mdc:0-0
Timestamp: 2025-06-24T02:01:12.231Z
Learning: In MDX files (*.mdx), React components can be embedded and used within the markdown content.
app/api/search/route.ts (4)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentHandler function type in the Agentuity JavaScript SDK is defined as: (request: AgentRequest, response: AgentResponse, context: AgentContext) => Promise<AgentResponseType>. This pattern should be followed for agent handler implementations in TypeScript.
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/overview.mdc:0-0
Timestamp: 2025-06-24T02:01:16.849Z
Learning: This documentation app is a NextJS application built on top of Fumadocs, which may influence documentation structure, component usage, and best practices for extending or customizing the documentation site.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
agent-docs/src/agents/doc-qa/types.ts (1)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
🧬 Code Graph Analysis (3)
app/layout.tsx (1)
components/CustomSearchDialog.tsx (1)
  • CustomSearchDialog (42-354)
agent-docs/src/agents/doc-qa/prompt.ts (1)
agent-docs/src/agents/doc-qa/types.ts (2)
  • PromptType (24-24)
  • PromptClassificationSchema (15-19)
components/CustomSearchDialog.tsx (2)
components/icons/AgentuityLogo.tsx (1)
  • AgentuityLogo (6-30)
lib/source.ts (1)
  • source (5-8)
🪛 Biome (1.9.4)
app/api/search/route.ts

[error] 86-86: Change to an optional chain.

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Workers Builds: docs
🔇 Additional comments (22)
package.json (1)

17-17: Dependencies are up-to-date – approved

Verified via npm view that all three packages in package.json match the latest stable releases on npm:

  • cmdk: 1.1.1
  • react-markdown: 10.1.0
  • remark-gfm: 4.0.1

No further version changes are needed; ready to merge.

components/icons/AgentuityLogo.tsx (1)

1-30: Excellent accessible SVG component implementation.

The component follows React and accessibility best practices with proper TypeScript interfaces, ARIA attributes, and flexible styling options.

agent-docs/src/agents/doc-processing/docs-orchestrator.ts (1)

3-3: LGTM: Clean import path correction.

The import path update aligns with the codebase restructuring and maintains consistency with the new QA agent modules.

app/layout.tsx (1)

5-5: Clean integration of AI-powered search dialog.

The CustomSearchDialog integration properly extends the RootProvider configuration without disrupting existing functionality, following Fumadocs patterns correctly.

Also applies to: 86-91

agent-docs/src/agents/doc-qa/retriever.ts (1)

7-11: LGTM: Well-structured function signature and query setup.

The function correctly uses Agentuity SDK types and properly structures the vector search query.

agent-docs/src/agents/doc-qa/index.ts (2)

2-2: LGTM: Proper import of the answerQuestion function.

Clean import from the rag module following the established pattern.


25-26: LGTM: Clean delegation to RAG module.

The simplified flow correctly delegates to the answerQuestion function and returns the structured response.

agent-docs/src/agents/doc-qa/rag.ts (3)

9-10: LGTM: Proper function structure and integration.

The function correctly integrates with the retriever module and follows TypeScript best practices.


12-84: Excellent system prompt design with comprehensive instructions.

The system prompt is well-structured with clear rules, formatting guidelines, and examples. The MDX formatting instructions and JSON output specification are particularly well-thought-out.


95-114: LGTM: Comprehensive error handling with helpful fallback.

The error handling provides a well-formatted fallback response that maintains the expected output structure while giving users actionable guidance.

components/CustomSearchDialog.tsx (3)

1-17: LGTM: Proper imports and setup.

Good use of modern React patterns and appropriate external libraries for the chat interface functionality.


19-40: Well-designed TypeScript interfaces.

The Message and SearchResult interfaces are comprehensive and properly typed for the chat functionality.


227-280: LGTM: Excellent message rendering with proper accessibility.

The message rendering logic is well-structured with proper styling, accessibility features, and responsive design.

agent-docs/src/agents/doc-qa/types.ts (4)

1-6: LGTM: Clean Zod schema for document structure.

The RelevantDocSchema properly defines the expected structure for documents with appropriate string validation.


8-11: LGTM: Well-defined answer schema.

The AnswerSchema correctly captures the expected AI response structure with an answer string and document array.


13-19: Excellent schema design for prompt classification.

The schemas provide proper validation for prompt types and classification results with confidence scoring and reasoning.


21-25: LGTM: Proper type inference pattern.

The exported TypeScript types correctly use Zod's infer utility to generate types from the schemas, enabling both runtime validation and compile-time type checking.

app/api/search/route.ts (5)

8-10: LGTM!

Clean utility function for path-to-URL conversion.


13-29: Well-structured metadata retrieval with proper fallbacks.

Good error handling and fallback logic for missing metadata.


31-37: Clean title formatting logic.

The path-to-title conversion provides good readability.


39-59: Robust snippet generation with smart fallbacks.

Good layered approach to snippet generation with contextual fallbacks.


122-164: Excellent error handling with graceful fallbacks.

The multi-level fallback strategy ensures search functionality remains available even when the AI service is down. Good UX consideration with clear error messages.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (1)
components/CustomSearchDialog.tsx (1)

187-194: Security validation implemented correctly.

The URL validation addresses the security concern from previous reviews by checking for safe URL patterns.

🧹 Nitpick comments (3)
agent-docs/src/agents/doc-qa/index.ts (1)

9-21: Consider simplifying the input parsing logic.

The current implementation is robust but could be streamlined. The type annotations and logic can be cleaner.

- let jsonRequest: any = null;
- let prompt: string;
+ let prompt: string;

  try {
-   jsonRequest = await req.data.json();
-   if (typeof jsonRequest === 'object' && jsonRequest !== null && 'message' in jsonRequest) {
-     prompt = String(jsonRequest.message || '');
-   } else {
-     prompt = JSON.stringify(jsonRequest);
-   }
+   const jsonRequest = await req.data.json();
+   prompt = (typeof jsonRequest === 'object' && jsonRequest?.message) 
+     ? String(jsonRequest.message) 
+     : JSON.stringify(jsonRequest);
  } catch {
    prompt = await req.data.text();
  }
components/CustomSearchDialog.tsx (2)

42-361: Consider component decomposition for better maintainability.

This component handles multiple responsibilities (state management, API calls, UI rendering) and is quite large (320+ lines). Consider extracting some functionality into custom hooks or smaller components.

Consider extracting:

  1. A useSearchHistory custom hook for localStorage management
  2. A useSearchAPI custom hook for the fetch logic
  3. A MessageList component for rendering messages
  4. A SearchInput component for the input area

This would improve readability, testability, and reusability while maintaining the same functionality.


250-254: Consider memoizing ReactMarkdown for performance.

The ReactMarkdown component re-renders on every message update. Consider memoizing it for better performance.

+ import { memo } from 'react';
+
+ const MarkdownContent = memo(({ content }: { content: string }) => (
+   <div className="prose prose-sm max-w-none dark:prose-invert prose-gray text-sm">
+     <ReactMarkdown remarkPlugins={[remarkGfm]}>
+       {content}
+     </ReactMarkdown>
+   </div>
+ ));

  {message.type === 'ai' ? (
-   <div className="prose prose-sm max-w-none dark:prose-invert prose-gray text-sm">
-     <ReactMarkdown remarkPlugins={[remarkGfm]}>
-       {message.content}
-     </ReactMarkdown>
-   </div>
+   <MarkdownContent content={message.content} />
  ) : (
    <p className="text-sm">{message.content}</p>
  )}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 557fee0 and 4c015b7.

📒 Files selected for processing (4)
  • agent-docs/src/agents/doc-qa/index.ts (1 hunks)
  • agent-docs/src/agents/doc-qa/retriever.ts (1 hunks)
  • app/api/search/route.ts (1 hunks)
  • components/CustomSearchDialog.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • agent-docs/src/agents/doc-qa/retriever.ts
  • app/api/search/route.ts
🧰 Additional context used
📓 Path-based instructions (2)
`agent-docs/**/src/agents/**/index.ts`: Prefer using the `agentuity agent create...

agent-docs/**/src/agents/**/index.ts: Prefer using the agentuity agent create command to create a new Agent.
Prefer loading types from the node modules package @agentuity/sdk in the node_modules folder.
The file should export a default function.
Prefer naming the default function Agent or the name of the Agent based on the context of the Agent description.
All code should be in Typescript format.
Use the provided logger from the AgentContext interface such as ctx.logger.info("my message: %s", "hello").

📄 Source: CodeRabbit Inference Engine (agent-docs/.cursor/rules/agent.mdc)

List of files the instruction was applied to:

  • agent-docs/src/agents/doc-qa/index.ts
`agent-docs/src/agents/**/*.ts`: Use TypeScript for better type safety and IDE s...

agent-docs/src/agents/**/*.ts: Use TypeScript for better type safety and IDE support.
Import types from '@agentuity/sdk'.
Use structured error handling with try/catch blocks.
Leverage the provided logger (context.logger) for consistent logging.
Use the storage APIs (context.kv and context.vector) for persisting data.
Consider agent communication (response.handoff, context.getAgent) for complex workflows.

📄 Source: CodeRabbit Inference Engine (agent-docs/.cursor/rules/sdk.mdc)

List of files the instruction was applied to:

  • agent-docs/src/agents/doc-qa/index.ts
🧠 Learnings (3)
📓 Common learnings
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: The `AgentRequest` interface in Agentuity provides helper methods and public variables for handling incoming data to the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentRequest interface provides methods for accessing trigger type, metadata, and request payload in various formats (JSON, text, ArrayBuffer, typed object). Use these methods to robustly handle incoming agent requests.
agent-docs/src/agents/doc-qa/index.ts (7)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentHandler function type in the Agentuity JavaScript SDK is defined as: (request: AgentRequest, response: AgentResponse, context: AgentContext) => Promise<AgentResponseType>. This pattern should be followed for agent handler implementations in TypeScript.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentRequest interface provides methods for accessing trigger type, metadata, and request payload in various formats (JSON, text, ArrayBuffer, typed object). Use these methods to robustly handle incoming agent requests.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: The `AgentResponse` interface in Agentuity provides helper methods for responding with various data formats from the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentResponse interface provides methods for creating responses in multiple formats (json, text, binary, html, empty) and for redirecting to another agent with response.handoff. Use these methods to standardize agent responses.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: The `AgentRequest` interface in Agentuity provides helper methods and public variables for handling incoming data to the Agent.
components/CustomSearchDialog.tsx (4)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentHandler function type in the Agentuity JavaScript SDK is defined as: (request: AgentRequest, response: AgentResponse, context: AgentContext) => Promise<AgentResponseType>. This pattern should be followed for agent handler implementations in TypeScript.
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/overview.mdc:0-0
Timestamp: 2025-06-24T02:01:16.849Z
Learning: This documentation app is a NextJS application built on top of Fumadocs, which may influence documentation structure, component usage, and best practices for extending or customizing the documentation site.
🧬 Code Graph Analysis (1)
components/CustomSearchDialog.tsx (2)
components/icons/AgentuityLogo.tsx (1)
  • AgentuityLogo (6-30)
lib/source.ts (1)
  • source (5-8)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Workers Builds: docs
🔇 Additional comments (3)
components/CustomSearchDialog.tsx (3)

42-47: Well-structured component state.

The state management is clean and follows React best practices with proper TypeScript typing.


51-87: Excellent lifecycle management.

The useEffect hooks properly handle localStorage persistence, auto-scrolling, and focus management with appropriate cleanup and error handling.


108-113: Request timeout implementation looks good.

The AbortController implementation follows the pattern discussed in previous reviews and provides proper timeout handling.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
components/CustomSearchDialog.tsx (1)

196-362: Consider splitting into smaller components for better maintainability.

The UI implementation is comprehensive with good accessibility and styling, but the component is quite large (360+ lines). Consider extracting sub-components for better maintainability:

Consider refactoring into smaller components:

// Extract message rendering
const MessageItem = ({ message, onSourceClick }: { message: Message; onSourceClick: (url: string) => void }) => {
  // Message rendering logic
};

// Extract header
const DialogHeader = ({ onClose }: { onClose: () => void }) => {
  // Header rendering logic
};

// Extract input area
const InputArea = ({ 
  currentInput, 
  setCurrentInput, 
  sendMessage, 
  loading, 
  messages, 
  onRetry, 
  onClear 
}: InputAreaProps) => {
  // Input area rendering logic
};

This would improve readability, testability, and maintainability of the main component.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4c015b7 and 4d76926.

📒 Files selected for processing (1)
  • components/CustomSearchDialog.tsx (1 hunks)
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: The `AgentRequest` interface in Agentuity provides helper methods and public variables for handling incoming data to the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentRequest interface provides methods for accessing trigger type, metadata, and request payload in various formats (JSON, text, ArrayBuffer, typed object). Use these methods to robustly handle incoming agent requests.
components/CustomSearchDialog.tsx (4)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentHandler function type in the Agentuity JavaScript SDK is defined as: (request: AgentRequest, response: AgentResponse, context: AgentContext) => Promise<AgentResponseType>. This pattern should be followed for agent handler implementations in TypeScript.
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/overview.mdc:0-0
Timestamp: 2025-06-24T02:01:16.849Z
Learning: This documentation app is a NextJS application built on top of Fumadocs, which may influence documentation structure, component usage, and best practices for extending or customizing the documentation site.
🧬 Code Graph Analysis (1)
components/CustomSearchDialog.tsx (2)
components/icons/AgentuityLogo.tsx (1)
  • AgentuityLogo (6-30)
lib/source.ts (1)
  • source (5-8)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Workers Builds: docs
🔇 Additional comments (4)
components/CustomSearchDialog.tsx (4)

1-41: Well-structured imports and type definitions.

The imports are comprehensive and the Message and SearchResult interfaces provide good type safety for the chat functionality and API integration.


42-49: Clean state management and ref usage.

The component state is well-organized and the useRef usage for DOM manipulation is appropriate for the auto-scroll and focus functionality.


50-87: Well-implemented effects with proper error handling.

The localStorage persistence logic correctly handles Date object serialization/deserialization, and the UX effects (auto-scroll, focus) enhance the user experience appropriately.


159-194: Well-implemented event handlers with proper security.

The event handlers provide good UX with keyboard shortcuts, and the URL validation in handleSourceClick properly addresses security concerns by validating URL formats before opening them.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
lib/env.ts (1)

37-52: Consider environment-aware logging for production.

The validation function provides helpful console output, but consider making the logging conditional based on environment to avoid cluttering production logs.

 export const validateEnv = (): boolean => {
   try {
     const config = getAgentConfig();
-    console.log('✓ Environment variables validated');
-    console.log('✓ Agent URL:', config.url);
-    console.log('✓ Bearer token:', config.bearerToken ? 'configured' : 'not set');
+    if (process.env.NODE_ENV !== 'production') {
+      console.log('✓ Environment variables validated');
+      console.log('✓ Agent URL:', config.url);
+      console.log('✓ Bearer token:', config.bearerToken ? 'configured' : 'not set');
+    }
     return true;
   } catch (error) {
     console.error('❌ Environment validation failed:', error);
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4d76926 and c3b2a41.

📒 Files selected for processing (7)
  • .env.example (1 hunks)
  • .gitignore (1 hunks)
  • app/api/search/route.ts (1 hunks)
  • app/layout.tsx (2 hunks)
  • lib/env.ts (1 hunks)
  • package.json (2 hunks)
  • wrangler.jsonc (1 hunks)
✅ Files skipped from review due to trivial changes (3)
  • .gitignore
  • wrangler.jsonc
  • .env.example
🚧 Files skipped from review as they are similar to previous changes (2)
  • app/layout.tsx
  • package.json
🧰 Additional context used
🧠 Learnings (3)
📓 Common learnings
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: The `AgentRequest` interface in Agentuity provides helper methods and public variables for handling incoming data to the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentRequest interface provides methods for accessing trigger type, metadata, and request payload in various formats (JSON, text, ArrayBuffer, typed object). Use these methods to robustly handle incoming agent requests.
lib/env.ts (2)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
app/api/search/route.ts (4)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentHandler function type in the Agentuity JavaScript SDK is defined as: (request: AgentRequest, response: AgentResponse, context: AgentContext) => Promise<AgentResponseType>. This pattern should be followed for agent handler implementations in TypeScript.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/overview.mdc:0-0
Timestamp: 2025-06-24T02:01:16.849Z
Learning: This documentation app is a NextJS application built on top of Fumadocs, which may influence documentation structure, component usage, and best practices for extending or customizing the documentation site.
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Workers Builds: docs
🔇 Additional comments (11)
lib/env.ts (3)

5-8: LGTM: Clean interface definition.

The AgentConfig interface is well-defined with appropriate types for URL and optional bearer token.


13-32: LGTM: Robust environment variable validation.

The function correctly validates environment variables with clear error messaging and flexible URL construction. The logic properly handles both AGENT_FULL_URL and AGENT_BASE_URL + AGENT_ID combinations.


58-68: LGTM: Comprehensive type declarations.

The global type declarations properly extend the NodeJS ProcessEnv interface with all required environment variables.

app/api/search/route.ts (8)

9-11: LGTM: Clean URL conversion utility.

The function correctly converts document paths to URLs by removing file extensions and adding leading slash.


14-30: LGTM: Robust metadata extraction with fallback.

The function properly handles errors when extracting document metadata and provides a reasonable fallback title format.


40-60: LGTM: Smart snippet generation with multiple fallbacks.

The function provides intelligent content snippets with proper truncation and multiple fallback strategies when data is unavailable.


71-88: Excellent improvement: Environment-based configuration.

This addresses the previous concern about hardcoded URLs. The code now properly uses environment configuration from getAgentConfig() and includes conditional bearer token authentication.


97-105: Good fix: Optional chaining addressed.

The code now uses data?.answer?.trim() which properly addresses the previous static analysis concern about safe property access.


108-128: LGTM: Robust document processing with deduplication.

The code properly deduplicates documents, handles processing errors gracefully, and generates appropriate metadata for each document reference.


133-175: Excellent error handling and fallback strategy.

The comprehensive fallback mechanism ensures the search functionality remains available even when the AI agent fails, with clear user communication about the fallback state.


62-176: AI agent configuration and fallback logic validated

Environment variable validation (validateEnv in lib/env.ts and invoked in app/layout.tsx), the getAgentConfig implementation, AI error handling in app/api/search/route.ts, and the fallback to defaultSearchHandler are all in place. No further action is needed.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
agent-docs/src/agents/doc-qa/index.ts (1)

27-28: Add logging to improve observability.

While the answerQuestion function handles errors internally (as confirmed by retrieved learnings), the coding guidelines recommend using the provided logger for better observability and debugging.

+ ctx.logger.info("Processing question: %s", prompt);
  const answer = await answerQuestion(ctx, prompt);
+ ctx.logger.info("Generated answer successfully");
  return resp.json(answer);
🧹 Nitpick comments (1)
lib/env.ts (1)

57-66: Remove the unnecessary empty export.

The static analysis tool correctly identified that the empty export on line 66 is unnecessary since the file already has named exports.

Apply this fix:

-export {}; 
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c3b2a41 and 1d04734.

📒 Files selected for processing (2)
  • agent-docs/src/agents/doc-qa/index.ts (1 hunks)
  • lib/env.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
`agent-docs/**/src/agents/**/index.ts`: Prefer using the `agentuity agent create...

agent-docs/**/src/agents/**/index.ts: Prefer using the agentuity agent create command to create a new Agent.
Prefer loading types from the node modules package @agentuity/sdk in the node_modules folder.
The file should export a default function.
Prefer naming the default function Agent or the name of the Agent based on the context of the Agent description.
All code should be in Typescript format.
Use the provided logger from the AgentContext interface such as ctx.logger.info("my message: %s", "hello").

📄 Source: CodeRabbit Inference Engine (agent-docs/.cursor/rules/agent.mdc)

List of files the instruction was applied to:

  • agent-docs/src/agents/doc-qa/index.ts
`agent-docs/src/agents/**/*.ts`: Use TypeScript for better type safety and IDE s...

agent-docs/src/agents/**/*.ts: Use TypeScript for better type safety and IDE support.
Import types from '@agentuity/sdk'.
Use structured error handling with try/catch blocks.
Leverage the provided logger (context.logger) for consistent logging.
Use the storage APIs (context.kv and context.vector) for persisting data.
Consider agent communication (response.handoff, context.getAgent) for complex workflows.

📄 Source: CodeRabbit Inference Engine (agent-docs/.cursor/rules/sdk.mdc)

List of files the instruction was applied to:

  • agent-docs/src/agents/doc-qa/index.ts
🧠 Learnings (3)
📓 Common learnings
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: The `AgentRequest` interface in Agentuity provides helper methods and public variables for handling incoming data to the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentRequest interface provides methods for accessing trigger type, metadata, and request payload in various formats (JSON, text, ArrayBuffer, typed object). Use these methods to robustly handle incoming agent requests.
Learnt from: afterrburn
PR: agentuity/docs#208
File: agent-docs/src/agents/doc-qa/index.ts:27-28
Timestamp: 2025-06-28T18:06:02.296Z
Learning: The answerQuestion function in agent-docs/src/agents/doc-qa/rag.ts handles errors internally by logging them and returning a fallback JSON answer, so it doesn't require external try-catch blocks at the call site.
agent-docs/src/agents/doc-qa/index.ts (8)
Learnt from: afterrburn
PR: agentuity/docs#208
File: agent-docs/src/agents/doc-qa/index.ts:27-28
Timestamp: 2025-06-28T18:06:02.296Z
Learning: The answerQuestion function in agent-docs/src/agents/doc-qa/rag.ts handles errors internally by logging them and returning a fallback JSON answer, so it doesn't require external try-catch blocks at the call site.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentHandler function type in the Agentuity JavaScript SDK is defined as: (request: AgentRequest, response: AgentResponse, context: AgentContext) => Promise<AgentResponseType>. This pattern should be followed for agent handler implementations in TypeScript.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentRequest interface provides methods for accessing trigger type, metadata, and request payload in various formats (JSON, text, ArrayBuffer, typed object). Use these methods to robustly handle incoming agent requests.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: The `AgentResponse` interface in Agentuity provides helper methods for responding with various data formats from the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentResponse interface provides methods for creating responses in multiple formats (json, text, binary, html, empty) and for redirecting to another agent with response.handoff. Use these methods to standardize agent responses.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: The `AgentRequest` interface in Agentuity provides helper methods and public variables for handling incoming data to the Agent.
lib/env.ts (2)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
🪛 Biome (1.9.4)
lib/env.ts

[error] 66-66: This empty export is useless because there's another export or import.

This export makes useless the empty export.

Safe fix: Remove this useless empty export.

(lint/complexity/noUselessEmptyExport)

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Workers Builds: docs
🔇 Additional comments (7)
lib/env.ts (3)

4-7: LGTM! Clean interface design.

The AgentConfig interface is well-designed with appropriate typing - required URL and optional bearer token.


12-31: LGTM! Robust environment validation logic.

The getAgentConfig function implements a flexible configuration approach supporting both full URL and base URL + agent ID modes. The validation logic is sound and error messages are clear and actionable.


36-51: LGTM! Excellent startup validation with helpful logging.

The validateEnv function provides comprehensive validation with user-friendly console output and detailed error guidance. The boolean return value makes it easy to integrate into application startup.

agent-docs/src/agents/doc-qa/index.ts (4)

2-2: LGTM - Clean import statement.

The import follows proper ES module syntax and correctly imports the answerQuestion function from the local RAG module.


9-10: LGTM - Appropriate variable declarations.

The variable declarations properly type the JSON request and prompt variables for the parsing logic.


13-21: LGTM - Robust request parsing implementation.

The parsing logic properly handles JSON extraction with appropriate fallbacks and addresses the previous review feedback about input robustness.


23-25: LGTM - Appropriate empty prompt handling.

The condition correctly uses !prompt.trim() to handle empty or whitespace-only prompts, addressing the previous unreachable condition concern.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (4)
components/CustomSearchDialog.tsx (4)

94-94: Consider using a more reliable focus mechanism.

The hardcoded 100ms setTimeout for focusing the input may not be reliable across different devices or when the dialog animation takes longer than expected.

- setTimeout(() => inputRef.current?.focus(), 100);
+ const timeoutId = setTimeout(() => inputRef.current?.focus(), 150);
+ return () => clearTimeout(timeoutId);

Alternatively, consider using requestAnimationFrame for better timing synchronization with browser rendering.


42-382: Consider breaking down this large component for better maintainability.

This component has grown to 382 lines with multiple responsibilities. Consider extracting some parts into smaller, focused components:

  • MessageList component for rendering the messages (lines 256-308)
  • MessageInput component for the input area (lines 327-377)
  • Custom hooks for message management and localStorage persistence

This would improve testability, reusability, and make the code easier to maintain.


256-307: Extract message rendering into a separate component.

The message rendering logic is complex and could benefit from being extracted into a dedicated MessageItem component. This would improve readability and make it easier to test the message rendering logic independently.

interface MessageItemProps {
  message: Message;
  onSourceClick: (url: string) => void;
}

function MessageItem({ message, onSourceClick }: MessageItemProps) {
  // Extract the current message rendering logic here
}

134-134: Consider adding response content-type validation.

While the response status is validated, consider also validating the content-type to ensure the response is actually JSON before parsing.

+ const contentType = response.headers.get('content-type');
+ if (!contentType?.includes('application/json')) {
+   throw new Error('Invalid response format');
+ }
  const data: SearchResult[] = await response.json();
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1d04734 and a0a2691.

📒 Files selected for processing (2)
  • components/CustomSearchDialog.tsx (1 hunks)
  • lib/env.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • lib/env.ts
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: The `AgentRequest` interface in Agentuity provides helper methods and public variables for handling incoming data to the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentRequest interface provides methods for accessing trigger type, metadata, and request payload in various formats (JSON, text, ArrayBuffer, typed object). Use these methods to robustly handle incoming agent requests.
Learnt from: afterrburn
PR: agentuity/docs#208
File: agent-docs/src/agents/doc-qa/index.ts:27-28
Timestamp: 2025-06-28T18:06:02.296Z
Learning: The answerQuestion function in agent-docs/src/agents/doc-qa/rag.ts handles errors internally by logging them and returning a fallback JSON answer, so it doesn't require external try-catch blocks at the call site.
components/CustomSearchDialog.tsx (5)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
Learnt from: afterrburn
PR: agentuity/docs#208
File: agent-docs/src/agents/doc-qa/index.ts:27-28
Timestamp: 2025-06-28T18:06:02.296Z
Learning: The answerQuestion function in agent-docs/src/agents/doc-qa/rag.ts handles errors internally by logging them and returning a fallback JSON answer, so it doesn't require external try-catch blocks at the call site.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentHandler function type in the Agentuity JavaScript SDK is defined as: (request: AgentRequest, response: AgentResponse, context: AgentContext) => Promise<AgentResponseType>. This pattern should be followed for agent handler implementations in TypeScript.
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/overview.mdc:0-0
Timestamp: 2025-06-24T02:01:16.849Z
Learning: This documentation app is a NextJS application built on top of Fumadocs, which may influence documentation structure, component usage, and best practices for extending or customizing the documentation site.
🧬 Code Graph Analysis (1)
components/CustomSearchDialog.tsx (2)
components/icons/AgentuityLogo.tsx (1)
  • AgentuityLogo (6-30)
lib/source.ts (1)
  • source (5-8)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Workers Builds: docs
🔇 Additional comments (3)
components/CustomSearchDialog.tsx (3)

117-123: Good implementation of AbortController management.

The abort controller implementation properly handles cleanup and prevents overlapping requests. The ref-based approach ensures proper cleanup even if the component unmounts during a request.


207-214: Excellent URL validation implementation.

The URL validation properly restricts to safe patterns and includes appropriate logging for debugging. This addresses the security concerns raised in previous reviews.


60-75: Robust localStorage error handling.

The localStorage operations include proper error handling with console warnings, which is appropriate for this non-critical functionality. The timestamp restoration logic is well-implemented.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (6)
components/CustomSearchDialog/hooks/useMessages.tsx (2)

68-68: Consider reducing the timeout duration for better UX.

A 30-second timeout may feel too long for users expecting near-instant search results. Consider reducing to 10-15 seconds for better perceived performance.

-      const timeoutId = setTimeout(() => controller.abort(), 30000);
+      const timeoutId = setTimeout(() => controller.abort(), 15000);

30-36: Optimize localStorage saves for performance.

Saving to localStorage on every message change could impact performance with large message histories. Consider debouncing or only saving on significant changes.

-  useEffect(() => {
-    try {
-      localStorage.setItem(STORAGE_KEY, JSON.stringify(messages));
-    } catch (error) {
-      console.warn('Failed to save chat history:', error);
-    }
-  }, [messages]);
+  const debouncedSave = useMemo(
+    () => debounce((msgs: Message[]) => {
+      try {
+        localStorage.setItem(STORAGE_KEY, JSON.stringify(msgs));
+      } catch (error) {
+        console.warn('Failed to save chat history:', error);
+      }
+    }, 500),
+    []
+  );
+
+  useEffect(() => {
+    debouncedSave(messages);
+  }, [messages, debouncedSave]);
components/CustomSearchDialog/SearchInput.tsx (1)

57-61: Consider showing hint only when appropriate.

The "Press Enter to send" hint appears whenever there's any input. Consider showing it only when the input is ready to send (trimmed and non-empty).

-          {currentInput.trim() && (
+          {currentInput.trim() && !loading && (
            <div className="absolute right-2 bottom-2 text-xs text-gray-400">
              Press Enter to send
            </div>
          )}
components/CustomSearchDialog/index.tsx (2)

15-15: Remove unused inputRef.

The inputRef is defined but never used since the SearchInput component manages its own ref internally.

-  const inputRef = useRef<HTMLTextAreaElement>(null);

Also remove the focus attempt on line 29:

-      setTimeout(() => inputRef.current?.focus(), 100);

83-86: Consider preserving input on send for better UX.

Clearing the input immediately on send might interfere with user expectations if they want to retry the same query. Consider clearing only on successful response.

The current implementation clears input optimistically. If this behavior is intentional for UX reasons, consider adding this to the useMessages hook instead for better state management.

components/CustomSearchDialog/MessageList.tsx (1)

116-118: Consider consistent locale formatting.

Using toLocaleTimeString() without a specific locale may show inconsistent formatting across users. Consider specifying a locale for consistency.

-          {message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
+          {message.timestamp.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' })}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a0a2691 and 29e0598.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (7)
  • components/CustomSearchDialog.tsx (1 hunks)
  • components/CustomSearchDialog/MessageList.tsx (1 hunks)
  • components/CustomSearchDialog/SearchInput.tsx (1 hunks)
  • components/CustomSearchDialog/hooks/useMessages.tsx (1 hunks)
  • components/CustomSearchDialog/index.tsx (1 hunks)
  • components/CustomSearchDialog/types.ts (1 hunks)
  • package.json (2 hunks)
✅ Files skipped from review due to trivial changes (1)
  • components/CustomSearchDialog/types.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • components/CustomSearchDialog.tsx
  • package.json
🧰 Additional context used
🧠 Learnings (4)
📓 Common learnings
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: The `AgentRequest` interface in Agentuity provides helper methods and public variables for handling incoming data to the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentRequest interface provides methods for accessing trigger type, metadata, and request payload in various formats (JSON, text, ArrayBuffer, typed object). Use these methods to robustly handle incoming agent requests.
Learnt from: afterrburn
PR: agentuity/docs#208
File: agent-docs/src/agents/doc-qa/index.ts:27-28
Timestamp: 2025-06-28T18:06:02.296Z
Learning: The answerQuestion function in agent-docs/src/agents/doc-qa/rag.ts handles errors internally by logging them and returning a fallback JSON answer, so it doesn't require external try-catch blocks at the call site.
components/CustomSearchDialog/MessageList.tsx (2)
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/mdx.mdc:0-0
Timestamp: 2025-06-24T02:01:12.231Z
Learning: In MDX files (*.mdx), React components can be embedded and used within the markdown content.
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/overview.mdc:0-0
Timestamp: 2025-06-24T02:01:16.849Z
Learning: This documentation app is a NextJS application built on top of Fumadocs, which may influence documentation structure, component usage, and best practices for extending or customizing the documentation site.
components/CustomSearchDialog/hooks/useMessages.tsx (1)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
components/CustomSearchDialog/index.tsx (1)
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/overview.mdc:0-0
Timestamp: 2025-06-24T02:01:16.849Z
Learning: This documentation app is a NextJS application built on top of Fumadocs, which may influence documentation structure, component usage, and best practices for extending or customizing the documentation site.
🧬 Code Graph Analysis (4)
components/CustomSearchDialog/MessageList.tsx (2)
components/CustomSearchDialog/types.ts (2)
  • MessageListProps (26-30)
  • Message (3-14)
components/icons/AgentuityLogo.tsx (1)
  • AgentuityLogo (6-30)
components/CustomSearchDialog/hooks/useMessages.tsx (1)
components/CustomSearchDialog/types.ts (2)
  • Message (3-14)
  • SearchResult (16-22)
components/CustomSearchDialog/index.tsx (5)
components/CustomSearchDialog/types.ts (1)
  • CustomSearchDialogProps (24-24)
components/CustomSearchDialog/hooks/useMessages.tsx (1)
  • useMessages (8-157)
components/icons/AgentuityLogo.tsx (1)
  • AgentuityLogo (6-30)
components/CustomSearchDialog/MessageList.tsx (1)
  • MessageList (10-35)
components/CustomSearchDialog/SearchInput.tsx (1)
  • SearchInput (7-74)
components/CustomSearchDialog/SearchInput.tsx (1)
components/CustomSearchDialog/types.ts (1)
  • SearchInputProps (32-37)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Workers Builds: docs
🔇 Additional comments (6)
components/CustomSearchDialog/hooks/useMessages.tsx (1)

140-147: Good URL validation implementation.

The URL validation logic properly checks for relative and absolute URLs while warning about potentially unsafe URLs. This prevents security issues from malicious source URLs.

components/CustomSearchDialog/SearchInput.tsx (1)

10-21: Good auto-resize implementation.

The textarea auto-resize logic is well implemented with a sensible max height constraint and proper height reset before calculating new dimensions.

components/CustomSearchDialog/index.tsx (1)

42-120: Well-structured dialog implementation.

The component properly uses Radix UI Dialog primitives for accessibility, implements proper keyboard shortcuts, and integrates the child components cleanly with appropriate prop passing.

components/CustomSearchDialog/MessageList.tsx (3)

37-51: Excellent empty state and accessibility.

The empty state provides clear guidance to users and the component properly handles the no-messages case with appropriate visual hierarchy.


74-128: Well-implemented message differentiation.

The MessageItem component effectively distinguishes between user and AI messages with appropriate styling, icons, and layout. The source handling integration is clean and functional.


89-93: No sanitization needed for ReactMarkdown usage

ReactMarkdown escapes any raw HTML by default and only parses standard markdown (we’re not using rehype-raw), so there is no risk of HTML/script injection. Since message.content comes from our own AI agent and we haven’t enabled raw HTML parsing, no additional sanitization is required.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
components/CustomSearchDialog/MessageList.tsx (2)

88-93: Consider security implications of markdown rendering.

ReactMarkdown is generally safe, but ensure user input is properly sanitized upstream. The remarkGfm plugin adds GitHub Flavored Markdown support which is appropriate for documentation.

For additional security, consider adding a linkTarget="_blank" and transformLinkUri to control link behavior:

<ReactMarkdown 
  remarkPlugins={[remarkGfm]}
+ linkTarget="_blank"
+ transformLinkUri={(uri) => uri.startsWith('http') ? uri : '#'}
>
  {message.content}
</ReactMarkdown>

116-118: Consider internationalization for timestamp format.

The timestamp formatting uses browser defaults which is good, but consider if you need consistent formatting across different locales.

For consistent formatting regardless of locale:

-{message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}
+{message.timestamp.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' })}
app/api/search/route.ts (1)

131-131: Consider removing debug logging in production.

The console.log statement may not be needed in production environments.

Consider using a proper logging library or environment-based logging:

-console.log('Returning results:', results.length, 'items');
+if (process.env.NODE_ENV === 'development') {
+  console.log('Returning results:', results.length, 'items');
+}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ef9e5c5 and 4e21e6b.

📒 Files selected for processing (4)
  • agent-docs/src/agents/doc-qa/rag.ts (1 hunks)
  • app/api/search/route.ts (1 hunks)
  • components/CustomSearchDialog/MessageList.tsx (1 hunks)
  • components/CustomSearchDialog/index.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • components/CustomSearchDialog/index.tsx
  • agent-docs/src/agents/doc-qa/rag.ts
🧰 Additional context used
🧠 Learnings (3)
📓 Common learnings
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: The `AgentRequest` interface in Agentuity provides helper methods and public variables for handling incoming data to the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentRequest interface provides methods for accessing trigger type, metadata, and request payload in various formats (JSON, text, ArrayBuffer, typed object). Use these methods to robustly handle incoming agent requests.
Learnt from: afterrburn
PR: agentuity/docs#208
File: agent-docs/src/agents/doc-qa/index.ts:27-28
Timestamp: 2025-06-28T18:06:02.296Z
Learning: The answerQuestion function in agent-docs/src/agents/doc-qa/rag.ts handles errors internally by logging them and returning a fallback JSON answer, so it doesn't require external try-catch blocks at the call site.
components/CustomSearchDialog/MessageList.tsx (2)
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/mdx.mdc:0-0
Timestamp: 2025-06-24T02:01:12.231Z
Learning: In MDX files (*.mdx), React components can be embedded and used within the markdown content.
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/overview.mdc:0-0
Timestamp: 2025-06-24T02:01:16.849Z
Learning: This documentation app is a NextJS application built on top of Fumadocs, which may influence documentation structure, component usage, and best practices for extending or customizing the documentation site.
app/api/search/route.ts (7)
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentHandler function type in the Agentuity JavaScript SDK is defined as: (request: AgentRequest, response: AgentResponse, context: AgentContext) => Promise<AgentResponseType>. This pattern should be followed for agent handler implementations in TypeScript.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: When developing Agentuity AI Agents in TypeScript, import types (`AgentRequest`, `AgentResponse`, `AgentContext`) from the `@agentuity/sdk` package to ensure type safety and consistency.
Learnt from: afterrburn
PR: agentuity/docs#208
File: agent-docs/src/agents/doc-qa/index.ts:27-28
Timestamp: 2025-06-28T18:06:02.296Z
Learning: The answerQuestion function in agent-docs/src/agents/doc-qa/rag.ts handles errors internally by logging them and returning a fallback JSON answer, so it doesn't require external try-catch blocks at the call site.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/sdk.mdc:0-0
Timestamp: 2025-06-24T02:01:32.957Z
Learning: The AgentRequest interface provides methods for accessing trigger type, metadata, and request payload in various formats (JSON, text, ArrayBuffer, typed object). Use these methods to robustly handle incoming agent requests.
Learnt from: afterrburn
PR: agentuity/docs#195
File: agent-docs/.editorconfig:0-0
Timestamp: 2025-06-18T04:05:53.918Z
Learning: User afterrburn does not want EditorConfig-related suggestions or fixes for the agent-docs project, as they indicated they "don't care about that file" when referring to .editorconfig.
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/overview.mdc:0-0
Timestamp: 2025-06-24T02:01:16.849Z
Learning: This documentation app is a NextJS application built on top of Fumadocs, which may influence documentation structure, component usage, and best practices for extending or customizing the documentation site.
🧬 Code Graph Analysis (1)
components/CustomSearchDialog/MessageList.tsx (2)
components/CustomSearchDialog/types.ts (2)
  • MessageListProps (26-30)
  • Message (3-14)
components/icons/AgentuityLogo.tsx (1)
  • AgentuityLogo (6-30)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Workers Builds: docs
🔇 Additional comments (8)
components/CustomSearchDialog/MessageList.tsx (2)

13-16: Auto-scroll implementation looks good.

The useEffect properly triggers on message changes and uses smooth scrolling behavior. The optional chaining ensures it won't error if the ref is null.


74-127: Excellent message rendering implementation.

The component properly handles different message types with appropriate styling, markdown rendering for AI messages, and clickable source links. The conditional rendering logic is clean and the accessibility considerations with proper ARIA attributes are well implemented.

app/api/search/route.ts (6)

9-12: Document path to URL conversion looks correct.

The regex properly removes .md/.mdx extensions while preserving any hash fragments. This handles both simple paths and those with anchors.


15-31: Robust metadata extraction with proper error handling.

The function correctly attempts to get page metadata from the source and falls back to a formatted title. The error handling prevents crashes when pages don't exist.


41-61: Smart snippet generation with multiple fallback strategies.

The function tries to use the page description first, then generates a contextual description based on the path structure. The error handling ensures a meaningful snippet is always returned.


72-94: Well-implemented AI agent integration.

The code properly uses environment configuration, handles optional bearer tokens, and includes appropriate error handling for the API call. The fetch configuration is correct.


108-129: Excellent document processing with duplicate handling.

The code properly deduplicates documents using Set, handles errors gracefully when processing individual documents, and generates meaningful metadata for each result.


134-176: Comprehensive fallback strategy with user-friendly messaging.

The error handling is excellent - it falls back to the original search handler when AI fails, provides clear messaging to users about the fallback, and has a final safety net for complete failures. The error messages are informative and user-friendly.

@afterrburn
Copy link
Contributor Author

image

This is what it looks like -- a one turn QA. Next step will likely make it more chat-like.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
README.md (3)

11-17: Clarify project root vs. agent-docs path

If this README already sits inside the agent-docs directory, the first step (cd agent-docs) is redundant and may mislead newcomers who clone only the docs repo. Consider re-phrasing to:

-1. **Navigate to the Agent Directory:**
-   ```bash
-   cd agent-docs
-   ```
+1. **Ensure you are in the `agent-docs` directory**  
+   (skip if this README is already at that path):
+   ```bash
+   cd agent-docs   # only if you cloned the monorepo root
+   ```

20-22: Mention CLI prerequisite for agentuity dev

agentuity dev presupposes the global/PNPM-local CLI is installed (pnpm dlx agentuity@latest dev or similar). Without noting this, users may hit “command not found”.

-2. **Start the Agent:**
-   ```bash
-   agentuity dev
-   ```
+2. **Start the Agent (requires Agentuity CLI):**
+   ```bash
+   # install once, if not already available
+   pnpm dlx agentuity@latest dev   # or: npx agentuity dev
+   ```

24-29: Leverage .env.example and remind about .gitignore

Pointing users to copy the shipped example prevents accidental commits of secrets and matches the new env.ts validation.

-3. **Update `.env.local`:**  
-   Add your agent's URL and ID:
-   ```plaintext
-   AGENT_BASE_URL=YOUR_AGENT_URL
-   AGENT_ID=YOUR_DOC_QA_AGENT_ID
-   ```
+3. **Create your environment file**  
+   ```bash
+   cp .env.example .env.local
+   ```
+   Then edit `.env.local` with your agent details:
+   ```dotenv
+   AGENT_BASE_URL=https://my-agent.example.com
+   AGENT_ID=YOUR_DOC_QA_AGENT_ID
+   ```
+   _(Ensure `.env.local` stays in `.gitignore`.)_
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4e21e6b and 2bb0826.

📒 Files selected for processing (2)
  • .env.example (1 hunks)
  • README.md (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • .env.example
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: afterrburn
PR: agentuity/docs#208
File: agent-docs/src/agents/doc-qa/index.ts:27-28
Timestamp: 2025-06-28T18:06:02.296Z
Learning: The answerQuestion function in agent-docs/src/agents/doc-qa/rag.ts handles errors internally by logging them and returning a fallback JSON answer, so it doesn't require external try-catch blocks at the call site.
README.md (3)
Learnt from: CR
PR: agentuity/docs#0
File: .cursor/rules/overview.mdc:0-0
Timestamp: 2025-06-24T02:01:16.849Z
Learning: This documentation app is a NextJS application built on top of Fumadocs, which may influence documentation structure, component usage, and best practices for extending or customizing the documentation site.
Learnt from: afterrburn
PR: agentuity/docs#195
File: agent-docs/src/agents/doc-processing/docs-processor.ts:7-15
Timestamp: 2025-06-18T04:07:57.583Z
Learning: In the agent-docs project, the ChunkMetadata type requires title and description fields to be mandatory strings rather than optional, indicating that the system ensures these fields are always populated during document processing.
Learnt from: CR
PR: agentuity/docs#0
File: agent-docs/.cursor/rules/agent.mdc:0-0
Timestamp: 2025-06-24T02:01:24.554Z
Learning: In Agentuity AI Agent files (`**/src/agents/**/index.ts`), always use TypeScript and export a default function, preferably named `Agent` or contextually after the Agent.
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Workers Builds: docs

@coderabbitai coderabbitai bot requested a review from rblalock June 30, 2025 13:43
@afterrburn afterrburn requested a review from mcongrove June 30, 2025 13:58
@rblalock
Copy link
Member

Screenshot 2025-06-30 at 3 01 14 PM

Just tried the preview url on this. i assume it's not wired up in preview so no worries on that ... but however this is what it looks like when the agent cant be communicated with.

@afterrburn
Copy link
Contributor Author

Yes - it falls back to the default search result. I forgot to make sure those default links are clickable.

@afterrburn
Copy link
Contributor Author

Looks like the links still work -- we're good. I will merge first thing in the morning tomorrow!

@afterrburn afterrburn merged commit 7ee5cdd into main Jul 1, 2025
2 checks passed
@afterrburn afterrburn deleted the srith/enhance-qa-agent branch July 1, 2025 12:35
@coderabbitai coderabbitai bot mentioned this pull request Sep 5, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants