* feat(askai): add compatibility with algolia mcp search tool [DASH-2294] (#2862) ## Summary Fixes DASH-2294 Add compatibility with the Algolia MCP search tool (`algolia_search_index_${string}`) in AskAI. ## Changes - Add `AlgoliaMCPSearchTool` type to handle the Algolia MCP server search tool - Refactor how number of hits are retrieved in `ToolCall` into a `getNumberOfHits` helper ## Test plan - Added unit tests for modified code ✅ * chore: Update to use tsdown for build system (#2824) * chore: Update to use tsdown for build system * fix: docsearch-react build * fix: lint * fix: glob resolved to incorrect version * chore: migrate to from yarn, lerna and shipjs to bun & changesets (#2827) * chore: add tool-versions file for node and bun versions (#2866) * chore: watch in parallel (#2867) * feat: agent studio feedback integration (#2868) * feat(askai): Split Ask AI modal into own component (#2884) * feat(askai): Split Ask AI modal into own component * refactor(react): share modal utilities * refactor(react): share search box form * refactor(react): extract start screen sections * refactor(react): extract shared modal hooks * fix: lint adapter * refactor(react): reorganize modal files * fix: type error in examples * fix: remove ai modal from adapter for now, fix import paths of react package * feat(askai): Agent Studio core tools (#2886) * feat(askai): Implement dynamic tool calls * move ToolCall to components dir * Converge Agent Studio search tools to same definition, fix client side tools breaking UI state * add examples for custom tools * fix: lint & types * feat(askai): add Agent Studio memory support (#2888) * feat(askai): remove Ask AI transport layer (#2889) * feat(askai): add Agent Studio memory support * refactor(askai): remove Ask AI transport abstraction * feat(askai): Feedback notes and tags (#2890) * feat(askai): add Agent Studio memory support * refactor(askai): remove Ask AI transport abstraction * feat(askai): Feedback notes and tags * fix: bump css bundle size limit * move feedback actions to components * chore: fix deploys for v5 branch * feat(askai): Aggregate MCP search tool calls (#2891) * feat(askai): add Agent Studio memory support * refactor(askai): remove Ask AI transport abstraction * feat(askai): Feedback notes and tags * fix: bump css bundle size limit * move feedback actions to components * feat(askai): Aggregate MCP search tool calls * feat(askai): Allow dynamic indices for Agent Studio (#2893) * feat(v5): UI updates (#2896) * feat(v5): UI updates * fix: css file size * fix: e2e tests * fix: e2e tests * fix: e2e tests * chore: add theme toggle to react demo example * Update sources panel display, update dark theme * fix: lint * fix(askai): address ui review feedback * fix: pin icon positioning * fix(askai): improve a11y and dark-mode shimmer for thinking and error states - add role=alert/status and aria-hidden on error/thinking UI - support dark-mode shimmer gradients via CSS variables - respect prefers-reduced-motion for shimmer - handle null date in useRelativeFormattedDate with fallback translation * feat(v5): Add hit breadcrumbs (#2897) * feat(v5): UI updates * fix: css file size * fix: e2e tests * fix: e2e tests * fix: e2e tests * chore: add theme toggle to react demo example * Update sources panel display, update dark theme * fix: lint * fix(askai): address ui review feedback * fix: pin icon positioning * fix(askai): improve a11y and dark-mode shimmer for thinking and error states - add role=alert/status and aria-hidden on error/thinking UI - support dark-mode shimmer gradients via CSS variables - respect prefers-reduced-motion for shimmer - handle null date in useRelativeFormattedDate with fallback translation * feat(v5): Add hit breadcrumbs * fix: bump css bundle size limit * Fix after conflicts * chore: move CSS building to lightning css (#2898) * feat: Facet filters for search (#2899) * feat(v5): Initial facet filters work * Perf updates, dark theme, facet chips, a11y improvements * fix: bump css bundle size limit * Dedupe facet filters, refetch facets on searchParameters changes * Add chevron flourish * fix(askai): Fix new conversation causing thread depth errors (#2900) * feat(v5): Add hit result badge (#2901) * feat(v5): Add hit result badge * Add background to hit result badge * feat(v5): Add follow up prompt suggestions (#2902) * feat(v5): Add follow up prompt suggestions * fix: bump css bundle size limit * docs(agents): document Cursor Cloud dev environment setup for v5 (Bun) (#2903) Co-authored-by: Cursor Agent <cursoragent@cursor.com> * feat(mcp): setup mcp plugins (#2895) * feat(v5): Add prompt suggestions to keyword search (#2912) * feat(v5): Add prompt suggestions to keyword search * cleanup: Move consistent object to reusable constant * chore(v5): Split Ask AI related CSS into own bundle (#2913) * chore(v5): Split Ask AI related CSS into own bundle * move style.css to include modal and askai * fix: Ensure stage level and watch level scripts use bun runtime (#2915) * fix: Ensure stage level and watch level scripts use bun runtime * chore: move to node@24 update imports * fix: lint * feat(js): Document JS based hybrid mode, fix JS packages (#2916) * feat(js): Document JS based hybrid mode, fix JS packages * update: add model onOpen to docs * feat(cli): add @docsearch/cli for MCP setup and search (#2911) * chore(tsdown): Bump to latest tsdown version (#2918) * chore(tsdown): Bump to latest tsdown version * fix: bump nvmrc node version * fix: cli tsconfig * fix: website build * fix: example build * fix: circleci install bun * fix: lint * fix: circleci install bun * fix: circleci install bun * fix: circleci install bun * refactor(docusaurus-adapter): rework theme config for v5 and modularize SearchPage (#2904) Co-authored-by: Paul Jankowski <8BitTitan@gmail.com> * feat(askai): Move askai related props under root askai (#2919) * feat(askai): Move askai related props under root askai * fix: playwright test case * fix(docusaurus): validate Ask AI options * feat(js): Split JS bundles for search only (#2920) * chore: Move to oxlint and oxfmt (#2923) * chore: Get NPM OIDC token before publishing (#2924) * chore: Enter v5 beta (#2925) * chore: Enter pre release mode for v5 * chore: update release summary * chore: version bump * fix: Remove NPM_ID_TOKEN for release * fix: Try setting blank NPM_TOKEN * fix: Try blank NPM_AUTH_TOKEN * chore: bump node and npm for release job * docs(mcp): add service disclaimer (#2921) * fix: Agent Studio MCP search tool (#2927) * fix: Agent Studio MCP search tool * Add changeset * chore: Update stylelint (#2926) * chore: stylelint update * bun.lock * Add changeset * fix(website): use bare @import for tailwindcss (#2933) Tailwind's build-time `@import` cannot be written with `url()` notation, so `@import url('tailwindcss')` was passed through as a plain CSS import instead of being processed by Tailwind. Also syncs bun.lock with the 5.0.0-beta.0 versions already committed to package.json. * chore: version v5.0.0-beta.1 (#2932) * feat(react): remove deprecated index props (#2936) * feat(mcp): add ChatGPT and Codex DocSearch plugin package (#2938) * fix: cleanup claude * feat: website redesign (#2930) Co-authored-by: Cursor <cursoragent@cursor.com> * fix: lint * fix: crash on the demo (#2940) * feat(docs): Document v5 beta (#2935) * chore(docs): v5 documentation * Writing style clean up * fix: website after conflicts * fix: reported issues on mobile (#2944) * chore: Introduce a11y smoke tests (#2943) * chore: Add Lorris as codeowner (#2946) * fix(askai): Ask AI fixes for v5 (#2945) * fix: General v5 fixes (#2947) - Fix `ref` console error for a `FacetMenu` - Whitespace only search/conversation input does not trigger requests - Fix flash of no results page on search * feat: v5 general improvements (#2948) * feat(v5): General fixes and improvements * add changeset * fix: bundlesize * feat(v5): UI and DX improvements (#2949) * feat: Rename assistantId to agentId * feat: Allow reading default facet values from index searchParameters * feat: Remove indexName prop from Sidepanel, cleanup documentation pages * feat: Move appId and apiKey up into @docsearch/core * feat: Add back nested grouping of search results * add changeset * revert changes to example demo * fix: e2e tests * chore: push git tags on version release (#2951) * chore: release v5.0.0-beta.2 (#2950) * chore: Fix pushing git tags (#2953) * fix(askai): sanitize markdown HTML in v5 (#2954) Backport of #2929.\n\nOriginal commit:681cbfec03Co-authored-by: Vasco Bettencourt <32492444+vascobettencourt@users.noreply.github.com> * fix(v5): stop truncating mobile snippets (#2958) * fix(v5): stop truncating mobile snippets Backport of #2907.\n\nOriginal commit:9ad6d169fe* fix(v5): allow mobile hit text to wrap Completes the v5 adaptation of #2907 by overriding later v5 child-level truncation rules.\n\nOriginal commit:9ad6d169fe* chore(v5): account for mobile wrapping CSS Updates the CSS size budget for the v5 adaptation of #2907.\n\nOriginal commit:9ad6d169fe--------- Co-authored-by: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> * feat(v5): Add new footerAction prop (#2952) * feat(v5): Add new footerAction prop * Resolve PR comments * fix(v5): recognize conversation depth errors (#2957) Backport of #2881.\n\nOriginal commit:f68e52251cCo-authored-by: Felipe Bermudez <felipeberm@gmail.com> * fix(v5): expose Sidepanel search parameter types (#2956) * fix(v5): expose Sidepanel search parameter types Backport of #2906.\n\nOriginal commit:4710d0ca77* Delete sidepanel.test.ts Had a pointless test case in it. --------- Co-authored-by: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> * fix(v5): ignore slash shortcut on focused buttons (#2955) Backport of #2871.\n\nOriginal commit:0e41a78c44Co-authored-by: Sigmabro <122412346+Sigmabrogz@users.noreply.github.com> * fix(agentStudio): agents dynamic mode enabled (#2959) * fix(agentStudio): agents dynamic mode enabled * fix(askai): use string[] for dynamic agentStudio indices * feat(docs): add Ask AI to Agent Studio migration guide (#2931) * feat(docs): add Ask AI to Agent Studio migration guide * feat(docs): agentStudio migrating from askAI * feat(docs): renaming agentId * feat(agentStudio): dynamic mode indices updated * fix: Docusaurus adapter styling, DocSearch website fixes (#2960) * chore: release v5.0.0-beta.3 (#2961) * feat(website): Launch updates (#2964) * fix(website): Fix font loading (#2966) * feat(v5): Back port cost control errors (#2965) * chore: release v5.0.0-beta.4 (#2967) --------- Co-authored-by: Vincent Lemeunier <vincentlemeunier+git@gmail.com> Co-authored-by: Dylan Tientcheu <dylan.tientcheu@algolia.com> Co-authored-by: Lorris Saint-Genez <lorrissaintgenez@gmail.com> Co-authored-by: Cursor Agent <cursoragent@cursor.com> Co-authored-by: Dylan Tientcheu <dylantientcheu@gmail.com> Co-authored-by: Vasco Bettencourt <32492444+vascobettencourt@users.noreply.github.com> Co-authored-by: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Co-authored-by: Felipe Bermudez <felipeberm@gmail.com> Co-authored-by: Sigmabro <122412346+Sigmabrogz@users.noreply.github.com>
243 lines
6.7 KiB
Markdown
243 lines
6.7 KiB
Markdown
# AGENTS.md - DocSearch Development Guide
|
|
|
|
This document provides guidelines for AI agents working on the DocSearch codebase.
|
|
|
|
## Project Overview
|
|
|
|
DocSearch is an Algolia-powered search widget for documentation sites. It's a TypeScript/React monorepo using Bun workspaces.
|
|
|
|
### Packages
|
|
|
|
- `@docsearch/core` - Core logic and hooks
|
|
- `@docsearch/react` - React components
|
|
- `@docsearch/js` - Vanilla JavaScript wrapper
|
|
- `@docsearch/css` - Styles
|
|
- `@docsearch/modal` - Modal component
|
|
- `@docsearch/sidepanel` - Side panel React component
|
|
- `@docsearch/sidepanel-js` - Side panel vanilla JS wrapper
|
|
- `website` - Documentation site (Docusaurus)
|
|
|
|
## Build Commands
|
|
|
|
```bash
|
|
# Install dependencies
|
|
bun install
|
|
|
|
# Build all packages
|
|
bun run build
|
|
|
|
# Build specific package
|
|
bun run --filter @docsearch/react build
|
|
|
|
# Watch mode (all packages)
|
|
bun run watch
|
|
```
|
|
|
|
## Test Commands
|
|
|
|
```bash
|
|
# Run all unit tests
|
|
bun run test
|
|
|
|
# Run a single test file
|
|
bun run test --run packages/docsearch-react/src/__tests__/utils.test.ts
|
|
|
|
# Type checking
|
|
bun run test:types
|
|
|
|
# Bundle size check
|
|
bun run test:size
|
|
```
|
|
|
|
When running tests, prefer to run specific files with the `--run` flag to prevent running with watch mode.
|
|
|
|
## Lint Commands
|
|
|
|
```bash
|
|
# Run oxlint
|
|
bun run lint --format=agent
|
|
|
|
# Perform oxfmt formatting
|
|
bun run fmt
|
|
|
|
# Lint CSS
|
|
bun run lint:css
|
|
```
|
|
|
|
## E2E Testing (Playwright)
|
|
|
|
```bash
|
|
# Run Cypress tests
|
|
bun run pw:run
|
|
|
|
# Run with specific browser
|
|
bun run pw:run:chromium
|
|
bun run pw:run:firefox
|
|
bun run pw:run:webkit
|
|
```
|
|
|
|
## Code Style Guidelines
|
|
|
|
### TypeScript
|
|
|
|
- Use `type` imports for type-only imports: `import type { Foo } from './types'`
|
|
- Prefer interfaces for object shapes, types for unions/primitives
|
|
- Avoid `any`; use `unknown` when type is truly unknown
|
|
|
|
```typescript
|
|
// Good
|
|
export type DocSearchHit = {
|
|
objectID: string;
|
|
content: string | null;
|
|
};
|
|
|
|
// Return type annotation
|
|
function createStorage<TItem>(key: string): StorageInterface<TItem> {
|
|
// ...
|
|
}
|
|
```
|
|
|
|
### Naming Conventions
|
|
|
|
- **Components**: PascalCase (`DocSearchModal.tsx`)
|
|
- **Hooks**: camelCase with `use` prefix (`useDocSearchKeyboardEvents.ts`)
|
|
- **Utilities**: camelCase (`removeHighlightTags.ts`)
|
|
- **Types**: PascalCase (`InternalDocSearchHit`)
|
|
- **Constants**: SCREAMING_SNAKE_CASE (`MAX_QUERY_SIZE`)
|
|
- **CSS classes**: `DocSearch-` prefix
|
|
|
|
### React Components
|
|
|
|
- Use function components with explicit JSX return type
|
|
- Forward refs when needed using `React.forwardRef`
|
|
- Use `React.useCallback` for callbacks passed as props
|
|
- Use `React.useMemo` for expensive computations
|
|
- Prefer destructuring props in function signature
|
|
|
|
### React Component Structure
|
|
|
|
- `src/components/ui/` contains reusable rendering components.
|
|
- Prefer domain-light primitives in `src/components/ui/` when possible.
|
|
- Feature-scoped UI components may live in `src/components/ui/` when their feature scope is explicit in the filename, such as `RecentConversationsResults.tsx`.
|
|
- `src/components/` contains scoped composition components that own feature flow, branching, and state orchestration.
|
|
- Keep AI-specific behavior out of generic UI primitives. If a UI component is AI-specific, make that scope clear in its name.
|
|
|
|
```typescript
|
|
function DocSearchComponent(
|
|
props: DocSearchProps,
|
|
ref: React.ForwardedRef<DocSearchRef>
|
|
): JSX.Element {
|
|
// ...
|
|
}
|
|
|
|
export const DocSearch = React.forwardRef(DocSearchComponent);
|
|
```
|
|
|
|
### Error Handling
|
|
|
|
- Use try-catch for async operations that may fail
|
|
- Check for specific error types when handling errors
|
|
- Fail silently for non-critical localStorage operations
|
|
- Throw descriptive errors for configuration issues
|
|
|
|
```typescript
|
|
try {
|
|
window.localStorage.setItem(key, JSON.stringify(value));
|
|
} catch (error) {
|
|
if (error instanceof DOMException && error.name === 'QuotaExceededError') {
|
|
cleanupDocSearchStorage();
|
|
}
|
|
// Silently fail for other errors
|
|
}
|
|
```
|
|
|
|
### Formatting (oxfmt)
|
|
|
|
- Single quotes for strings
|
|
- Trailing commas (ES5 style)
|
|
- No prose wrapping
|
|
|
|
### CSS (Stylelint)
|
|
|
|
- Selector pattern: `^DocSearch-[A-Za-z0-9-]*$`
|
|
- Max nesting depth: 2 (excluding pseudo-classes)
|
|
- Follow `stylelint-config-standard` and `stylelint-config-sass-guidelines`
|
|
|
|
## Commit Conventions
|
|
|
|
Follow conventional changelog format:
|
|
|
|
```
|
|
type(scope): description
|
|
```
|
|
|
|
Types: `fix`, `feat`, `refactor`, `docs`, `chore`
|
|
|
|
Examples:
|
|
|
|
- `fix(modal): increase default height`
|
|
- `feat(searchbox): add type input property`
|
|
- `chore(deps): update dependency rollup-plugin-babel to v3.0.7`
|
|
|
|
## Testing Patterns
|
|
|
|
Tests use Vitest with Testing Library:
|
|
|
|
```typescript
|
|
import { describe, it, expect, beforeEach } from 'vitest';
|
|
import { render, act, fireEvent, screen } from '@testing-library/react';
|
|
import '@testing-library/jest-dom/vitest';
|
|
|
|
describe('ComponentName', () => {
|
|
it('describes expected behavior', () => {
|
|
// Arrange
|
|
render(<Component />);
|
|
|
|
// Act
|
|
fireEvent.click(screen.getByText('Button'));
|
|
|
|
// Assert
|
|
expect(screen.getByText('Result')).toBeInTheDocument();
|
|
});
|
|
});
|
|
```
|
|
|
|
## File Structure
|
|
|
|
```
|
|
packages/
|
|
docsearch-react/
|
|
src/
|
|
components/ # Scoped React composition components
|
|
ui/ # Reusable rendering components and explicitly scoped UI pieces
|
|
__tests__/ # Test files
|
|
icons/ # Icon components
|
|
types/ # Type definitions
|
|
utils/ # Utility functions
|
|
Sidepanel/ # Sidepanel subcomponents
|
|
DocSearch.tsx # Main component
|
|
index.ts # Public exports
|
|
```
|
|
|
|
## Key Dependencies
|
|
|
|
- `@algolia/autocomplete-core` - Autocomplete engine
|
|
- `algoliasearch` - Algolia search client
|
|
- `ai` / `@ai-sdk/react` - AI/streaming support
|
|
- `marked` - Markdown rendering
|
|
- `rollup` - Build bundling
|
|
- `vitest` - Test runner
|
|
|
|
## Cursor Cloud specific instructions
|
|
|
|
Toolchain is pinned in `.tool-versions`: Node `24.13.1` (managed via `fnm`) and Bun `1.3.10`. These are preinstalled in the Cloud VM and available on `PATH` in new shells; the startup update script only runs `bun install`.
|
|
|
|
Non-obvious caveats:
|
|
|
|
- **To run/demo the widget, use the React playground:** `bun run playground:start` serves at `http://localhost:5173` (Vite). `bun run playground-js:start` serves the vanilla-JS demo. These connect to Algolia's hosted index using public credentials baked into the demo, so **outbound internet is required** for live search results.
|
|
- Run unit tests non-interactively with `bun run test --run` (plain `bun run test` starts Vitest watch mode).
|
|
- `bun run lint:css` reports many pre-existing CSS lint violations in the repo; these are not environment problems.
|
|
|
|
## Documentation
|
|
|
|
- When writing or working on the documentation website (`packages/website`), MUST adhere to the writing guidelines in @packages/website/WRITING_GUIDE.md
|