Conversation
ssdeanx
commented
Feb 16, 2026
- Updated AGENTS.md documentation in src/mastra/tools to clarify tool properties and execution context.
- Improved test cases in csv-to-json.tool.test.ts for better type handling and progress event assertions.
- Updated test-results.json to reflect the latest test run metrics.
- Created AI_ELEMENTS_INTEGRATION_TODO.md to outline tasks for integrating AI elements into the chat application.
- Added agent-sandbox.tsx component for a code execution sandbox with file tree and terminal functionalities.
- Introduced agent-workflow.tsx component for visualizing agent workflows with customizable nodes and edges.
- Established lib/AGENTS.md to document the frontend client library layer for AgentStack, detailing hooks, types, and key files.
- Created src/components/ai-elements/AGENTS.md to provide an overview of the AI Elements component library, including categories and usage examples.
- Added ui/AGENTS.md to document the UI component library, outlining categories and usage patterns for better developer guidance.
- Updated AGENTS.md documentation in src/mastra/tools to clarify tool properties and execution context. - Improved test cases in csv-to-json.tool.test.ts for better type handling and progress event assertions. - Updated test-results.json to reflect the latest test run metrics. - Created AI_ELEMENTS_INTEGRATION_TODO.md to outline tasks for integrating AI elements into the chat application. - Added agent-sandbox.tsx component for a code execution sandbox with file tree and terminal functionalities. - Introduced agent-workflow.tsx component for visualizing agent workflows with customizable nodes and edges. - Established lib/AGENTS.md to document the frontend client library layer for AgentStack, detailing hooks, types, and key files. - Created src/components/ai-elements/AGENTS.md to provide an overview of the AI Elements component library, including categories and usage examples. - Added ui/AGENTS.md to document the UI component library, outlining categories and usage patterns for better developer guidance.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Sorry @ssdeanx, your pull request is larger than the review limit of 150000 diff characters
|
🤖 Hi @ssdeanx, I've received your request, and I'm working on it now! You can track my progress in the logs for more details. |
|
Caution Review failedThe pull request is closed. Summary by CodeRabbit
WalkthroughThis PR is a minor version bump from 3.3.0 to 3.4.0 introducing speech input, audio playback, and transcription features to the chat interface. Two new React components (AgentSandbox and AgentWorkflow) are added for interactive UI visualization. Extensive documentation updates detail AI Elements integration status and component catalogs across multiple files. Changes
Sequence DiagramsequenceDiagram
actor User
participant ChatInput as Chat Input
participant Context as Chat Context
participant ChatMessages as Chat Messages
participant AIPackage as AI Package Types
User->>ChatInput: Speak & attach files
ChatInput->>ChatInput: Capture speech (SpeechInput)
ChatInput->>ChatInput: Normalize file attachments
ChatInput->>Context: Submit message + transcribed text + files
Context->>Context: Process UIMessagePart, FileUIPart
Context->>Context: Track token usage (cache read/write)
Context->>ChatMessages: Render message with parts
ChatMessages->>ChatMessages: Detect audio parts (FileUIPart)
ChatMessages->>ChatMessages: Render AudioPlayer (play, volume, time)
ChatMessages->>ChatMessages: Render Transcription segments
ChatMessages->>ChatMessages: Render attachments with previews
ChatMessages->>User: Display message with audio + transcription
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
Suggested reviewers
✨ Finishing touches
🧪 Generate unit tests (beta)
Tip Issue Planner is now in beta. Read the docs and try it out! Share your feedback on Discord. Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.
Summary of ChangesHello @ssdeanx, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request significantly enhances the AI Elements and agent workflow components within the application. It introduces new UI components for interactive code sandboxes and visual workflow management, while also upgrading the chat interface with advanced speech, attachment, and audio capabilities. Furthermore, the project's documentation has been thoroughly revised and expanded to provide clearer guidance on its architecture, development practices, and feature set, reflecting the growing sophistication of the AgentStack framework. Highlights
Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
|
🤖 I'm sorry @ssdeanx, but I was unable to process your request. Please see the logs for more details. |
There was a problem hiding this comment.
Code Review
This pull request significantly enhances the AI Elements library and agent workflow components by adding agent-sandbox and agent-workflow, integrating them into the chat UI, and updating documentation. A critical finding is a high-severity XSS vulnerability in the new AgentSandbox component due to an unsandboxed iframe rendering untrusted content. Further improvements are needed regarding type safety with as unknown as casts, the maintainability of large components, and documentation consistency.
| <iframe | ||
| title="preview" | ||
| srcDoc={sandboxData?.preview ?? ''} | ||
| className="h-full w-full" | ||
| /> |
There was a problem hiding this comment.
The iframe used for the preview tab lacks a sandbox attribute. When rendering potentially untrusted content (such as LLM-generated HTML/JS) via srcDoc, it is critical to use the sandbox attribute to prevent Cross-Site Scripting (XSS) attacks. Without a sandbox, scripts in the iframe can access the parent window's origin, including cookies and local storage. Adding sandbox="allow-scripts" (without allow-same-origin) will ensure the content is treated as being from a unique origin, providing significant protection.
<iframe
title="preview"
srcDoc={sandboxData?.preview ?? ''}
className="h-full w-full"
sandbox="allow-scripts"
/>
| const { attachments, removeAttachment } = | ||
| usePromptInputAttachments() as unknown as { | ||
| attachments: AttachmentLike[] | ||
| removeAttachment: (index: number) => void | ||
| } |
There was a problem hiding this comment.
The use of as unknown as to cast the return value of the usePromptInputAttachments hook is a significant code smell. It completely bypasses TypeScript's type safety and can lead to runtime errors if the hook's return type changes. The types for this hook should be correctly defined and exported to make this unsafe cast unnecessary.
| **Status:** COMPLETED ✓ | ||
| **File:** `app/chat/components/chat-input.tsx` | ||
| **Lines:** ~210 (MicIcon button area) | ||
|
|
||
| **Sub-tasks:** | ||
|
|
||
| - [x] 001a: Import SpeechInput component from '@/src/components/ai-elements/speech-input' | ||
| - [x] 001b: Add useState for speech transcription text (uses existing input state) | ||
| - [x] 001c: Create handleTranscriptionChange callback to append text to input | ||
| - [x] 001d: Replace MicIcon button (lines ~201-211) with SpeechInput component | ||
| - [x] 001e: Add onAudioRecorded callback for MediaRecorder fallback support | ||
| - [x] 001f: Test TypeScript compilation (LSP errors are pre-existing, not from this change) | ||
|
|
||
| **Components to integrate:** | ||
|
|
||
| - SpeechInput (from speech-input.tsx) | ||
| - Uses: onTranscriptionChange, onAudioRecorded, lang props | ||
|
|
||
| --- | ||
|
|
||
| ### TASK 002: Update chat-messages.tsx - Add Attachments Integration | ||
|
|
||
| **Status:** NOT STARTED | ||
| **File:** `app/chat/components/chat-messages.tsx` | ||
| **Lines:** ~895-903 (fileParts rendering) | ||
|
|
||
| **Sub-tasks:** | ||
|
|
||
| - [ ] 002a: Import Attachments components from '@/src/components/ai-elements/attachments' | ||
| - [ ] 002b: Locate current fileParts rendering code (lines 895-903) | ||
| - [ ] 002c: Replace custom Badge-based file rendering with Attachments component | ||
| - [ ] 002d: Map FileUIPart[] to AttachmentData[] format | ||
| - [ ] 002e: Ensure type imports from 'ai' (FileUIPart, isFileUIPart) are used | ||
| - [ ] 002f: Test TypeScript compilation | ||
|
|
||
| **Components to integrate:** | ||
|
|
||
| - Attachments, Attachment, AttachmentPreview, AttachmentInfo, AttachmentRemove (from attachments.tsx) | ||
|
|
||
| --- | ||
|
|
||
| ### TASK 003: Update chat-messages.tsx - Add AudioPlayer Integration | ||
|
|
||
| **Status:** NOT STARTED | ||
| **File:** `app/chat/components/chat-messages.tsx` | ||
|
|
||
| **Sub-tasks:** | ||
|
|
||
| - [ ] 003a: Import AudioPlayer from '@/src/components/ai-elements/audio-player' | ||
| - [ ] 003b: Identify where audio FileUIPart messages are rendered | ||
| - [ ] 003c: Add conditional rendering for audio mediaType files | ||
| - [ ] 003d: Integrate AudioPlayer for audio file parts | ||
| - [ ] 003e: Test TypeScript compilation | ||
|
|
||
| **Components to integrate:** | ||
|
|
||
| - AudioPlayer (from audio-player.tsx) | ||
|
|
||
| --- | ||
|
|
||
| ### TASK 004: Update chat-messages.tsx - Add Transcription Integration | ||
|
|
||
| **Status:** NOT STARTED | ||
| **File:** `app/chat/components/chat-messages.tsx` | ||
|
|
||
| **Sub-tasks:** | ||
|
|
||
| - [ ] 004a: Import Transcription from '@/src/components/ai-elements/transcription' | ||
| - [ ] 004b: Import Experimental_SpeechResult type from 'ai' | ||
| - [ ] 004c: Add Transcription component for speech-to-text display | ||
| - [ ] 004d: Test TypeScript compilation | ||
|
|
||
| **Components to integrate:** | ||
|
|
||
| - Transcription (from transcription.tsx) | ||
|
|
||
| --- | ||
|
|
||
| ### TASK 005: Verify and Leverage 'ai' Package Type Imports | ||
|
|
||
| **Status:** NOT STARTED | ||
| **Files:** `app/chat/components/chat-messages.tsx`, `app/chat/components/chat-input.tsx` | ||
|
|
||
| **Sub-tasks:** | ||
|
|
||
| - [ ] 005a: List all imported types from 'ai' in chat-messages.tsx | ||
| - [ ] 005b: Identify which types are NOT actively used for type narrowing | ||
| - [ ] 005c: Add active type narrowing using isFileUIPart, isTextUIPart, etc. | ||
| - [ ] 005d: Replace any 'as' type assertions with proper type guards | ||
| - [ ] 005e: Verify all unused imports serve a purpose (keep them as requested) | ||
|
|
||
| **Types from 'ai' to leverage:** | ||
|
|
||
| - isFileUIPart, isTextUIPart, isReasoningUIPart, isToolUIPart, isDataUIPart, isStaticToolUIPart | ||
| - FileUIPart, TextUIPart, ReasoningUIPart, ToolUIPart, DataUIPart | ||
|
|
||
| --- | ||
|
|
||
| ## PROGRESS TRACKING | ||
|
|
||
| | Task | Status | File | Started | Completed | | ||
| | ---- | ----------- | ----------------- | ------- | --------- | | ||
| | 001 | NOT STARTED | chat-input.tsx | - | - | |
There was a problem hiding this comment.
| <FileTree | ||
| selectedPath={selectedFile} | ||
| // FileTree may call this with either an event or a path | ||
| onSelect={handleFileSelect as unknown as (eventOrPath: React.SyntheticEvent<HTMLDivElement, Event> | string) => void} |
There was a problem hiding this comment.
The use of as unknown as to cast the handleFileSelect function for the onSelect prop is a code smell that bypasses TypeScript's type safety. This suggests a type mismatch between the FileTree component's prop and the handler function. This should be resolved to prevent potential runtime errors if the types diverge in the future.
onSelect={handleFileSelect}
| language={(() => { | ||
| const l = selectedFileData.language?.toLowerCase().trim() | ||
| if (!(l!)) {return 'js'} | ||
| if (l === 'tsx') {return 'tsx'} | ||
| if (l === 'ts' || l === 'typescript') {return 'ts'} | ||
| if (l === 'js' || l === 'javascript') {return 'js'} | ||
| if (l === 'jsx') {return 'jsx'} | ||
| if (l === 'json') {return 'json'} | ||
| if (l === 'bash' || l === 'sh' || l === 'shell') {return 'bash'} | ||
| if (l === 'html') {return 'html'} | ||
| if (l === 'css') {return 'css'} | ||
| if (l === 'python' || l === 'py') {return 'python'} | ||
| if (l === 'java') {return 'java'} | ||
| if (l === 'c#' || l === 'csharp') {return 'csharp'} | ||
| if (l === 'c++' || l === 'cpp') {return 'cpp'} | ||
| if (l === 'ruby' || l === 'rb') {return 'ruby'} | ||
| if (l === 'go' || l === 'golang') {return 'go'} | ||
| if (l === 'rust') {return 'rust'} | ||
| return 'js' | ||
| })()} |
There was a problem hiding this comment.
This long chain of if statements for language detection is difficult to read and maintain. As more languages are supported, this will become increasingly complex. Refactoring this into a more scalable pattern like a Map or a switch statement would improve readability and make it easier to add new languages.
const getLanguage = (lang: string | undefined): string => {
const l = lang?.toLowerCase().trim();
switch (l) {
case 'tsx': return 'tsx';
case 'ts':
case 'typescript': return 'ts';
case 'js':
case 'javascript': return 'js';
case 'jsx': return 'jsx';
case 'json': return 'json';
case 'bash':
case 'sh':
case 'shell': return 'bash';
case 'html': return 'html';
case 'css': return 'css';
case 'python':
case 'py': return 'python';
case 'java': return 'java';
case 'c#':
case 'csharp': return 'csharp';
case 'c++':
case 'cpp': return 'cpp';
case 'ruby':
case 'rb': return 'ruby';
case 'go':
case 'golang': return 'go';
case 'rust': return 'rust';
default: return 'js';
}
};
// ...
language={getLanguage(selectedFileData.language)}
|
|
||
| // Assert | ||
| expect(result.data).toEqual([ | ||
| expect((result as any).data).toEqual([ |
There was a problem hiding this comment.
Using as any to access result.data in a test bypasses type checking and can hide potential bugs. The return type of csvToJsonTool.execute should be strongly typed so this cast is not needed. If the type is intentionally generic, a more specific type assertion should be used instead of any to maintain type safety within the test.
| expect((result as any).data).toEqual([ | |
| expect((result as { data: unknown }).data).toEqual([ |
There was a problem hiding this comment.
Pull request overview
This pull request significantly enhances the AI Elements integration and agent workflow capabilities in AgentStack. The changes add 52+ AI Elements components to the chat interface, create new visualization components for agent workflows and sandboxes, and comprehensively update documentation across multiple directories.
Changes:
- Adds new AI Elements integration (SpeechInput, Attachments, AudioPlayer, Transcription) to chat components
- Creates two new sophisticated components:
agent-sandbox.tsx(540 lines) andagent-workflow.tsx(138 lines) for code execution and workflow visualization - Updates 8 AGENTS.md documentation files with detailed component catalogs, architecture diagrams, and integration status tracking
- Enhances type imports from the 'ai' package with improved streaming and UI part types
- Improves test handling with better type assertions and progress event testing
- Updates README.md with expanded architecture diagrams, performance metrics, and contribution guidelines (762 new lines)
Reviewed changes
Copilot reviewed 17 out of 19 changed files in this pull request and generated 15 comments.
Show a summary per file
| File | Description |
|---|---|
| ui/AGENTS.md | New documentation cataloging 55+ base UI components with shadcn/ui conventions |
| src/components/ai-elements/AGENTS.md | New documentation for 50+ AI Elements with usage examples and component categories |
| src/components/ai-elements/tools/AGENTS.md | Enhanced tool UI documentation with backend-frontend mapping and mermaid diagrams |
| lib/AGENTS.md | New documentation for frontend client library layer with hooks and API wrappers |
| app/chat/AGENTS.md | Major update (v1.1.0 → v2.0.0) with 52 component integration tracking and completion metrics |
| app/chat/components/agent-sandbox.tsx | New 540-line code sandbox component with file tree, terminal, tests, and schema display |
| app/chat/components/agent-workflow.tsx | New 138-line workflow visualization with customizable nodes and edges using React Flow |
| app/chat/components/chat-input.tsx | Integrates SpeechInput and adds complex file attachment normalization logic |
| app/chat/components/chat-messages.tsx | Adds AudioPlayer, Attachments, and Transcription component integration |
| app/chat/components/agent-tools.tsx | Code formatting improvements for better readability |
| app/chat/providers/chat-context.tsx | Adds InputTokenDetails interface and reorganizes type imports |
| src/mastra/tools/AGENTS.md | Documentation improvements with better formatting and indentation |
| src/mastra/tools/tests/csv-to-json.tool.test.ts | Test improvements with type casting and better indentation |
| tests/test-results/test-results.json | Updated test run timestamp |
| README.md | Massive expansion (600+ lines) with architecture, performance metrics, and contribution guidelines |
| AI_ELEMENTS_INTEGRATION_TODO.md | New tracking document for remaining integration tasks |
| .markdownlint.json | Disabled additional markdown rules (MD026, MD029) |
| .gitignore | Added CONTINUITY session files |
| .sisyphus/ralph-loop.local.md | Deleted Ralph loop configuration file |
| const { attachments, removeAttachment } = | ||
| usePromptInputAttachments() as unknown as { | ||
| attachments: AttachmentLike[] | ||
| removeAttachment: (index: number) => void | ||
| } | ||
|
|
There was a problem hiding this comment.
The type assertion as unknown as bypasses TypeScript's type safety and indicates a potential type mismatch with the usePromptInputAttachments hook. This workaround suggests that either the hook's return type is incorrect or the local AttachmentLike type doesn't match the actual structure. Consider fixing the hook's type definition or using proper type guards instead of forcing the type.
| const { attachments, removeAttachment } = | |
| usePromptInputAttachments() as unknown as { | |
| attachments: AttachmentLike[] | |
| removeAttachment: (index: number) => void | |
| } | |
| const isAttachmentLike = (value: unknown): value is AttachmentLike => { | |
| if (value == null) return true | |
| if (value instanceof File) return true | |
| if (typeof value !== 'object') return false | |
| // { file?: File } | |
| if ('file' in value && (value as { file?: unknown }).file != null) { | |
| if (!((value as { file?: unknown }).file instanceof File)) { | |
| return false | |
| } | |
| } | |
| // { blob?: Blob; name?: string } | |
| if ('blob' in value && (value as { blob?: unknown }).blob != null) { | |
| if (!((value as { blob?: unknown }).blob instanceof Blob)) { | |
| return false | |
| } | |
| } | |
| if ('name' in value && (value as { name?: unknown }).name != null) { | |
| if (typeof (value as { name?: unknown }).name !== 'string') { | |
| return false | |
| } | |
| } | |
| return true | |
| } | |
| const isPromptInputAttachmentsResult = ( | |
| value: unknown, | |
| ): value is { | |
| attachments: AttachmentLike[] | |
| removeAttachment: (index: number) => void | |
| } => { | |
| if ( | |
| !value || | |
| typeof value !== 'object' || | |
| !('attachments' in value) || | |
| !('removeAttachment' in value) | |
| ) { | |
| return false | |
| } | |
| const attachments = (value as { attachments: unknown }).attachments | |
| const removeAttachment = (value as { removeAttachment: unknown }) | |
| .removeAttachment | |
| if (!Array.isArray(attachments)) return false | |
| if (typeof removeAttachment !== 'function') return false | |
| return attachments.every(isAttachmentLike) | |
| } | |
| const hookValue = usePromptInputAttachments() | |
| const { attachments, removeAttachment } = isPromptInputAttachmentsResult( | |
| hookValue, | |
| ) | |
| ? hookValue | |
| : { | |
| attachments: [] as AttachmentLike[], | |
| removeAttachment: (_index: number) => { | |
| // no-op fallback if hook result is not in the expected shape | |
| }, | |
| } |
| fitView | ||
| > | ||
| {showPanel && panelContent && ( | ||
| <Panel position={'top-right' as PanelPosition}> |
There was a problem hiding this comment.
Unnecessary explicit type assertion 'top-right' as PanelPosition. TypeScript should be able to infer this type from the Panel component's position prop. If a type error exists, it suggests a mismatch between the expected type and the literal value, which should be resolved by fixing the type definition rather than forcing it with a cast.
| {t.status} | ||
| </div> | ||
| </div> | ||
| {(Boolean(t.error)) && ( |
There was a problem hiding this comment.
Unnecessary use of Boolean() wrapper. The pattern {(Boolean(t.error)) && ...} can be simplified to {t.error && ...} since JavaScript's truthy/falsy evaluation handles this correctly in JSX.
| {(Boolean(t.error)) && ( | |
| {t.error && ( |
| ## Overview | ||
|
|
||
| The `/chat` route provides a rich AI chat interface built with **AI Elements** (30 components) integrated with **26+ Mastra agents**. Uses `@ai-sdk/react` with `useChat` and `DefaultChatTransport` to stream responses from Mastra's `/chat` route. | ||
| The `/chat` route provides a rich AI chat interface built with **AI Elements** (52 components) integrated with **26+ Mastra agents**. Uses `@ai-sdk/react` with `useChat` and `DefaultChatTransport` to stream responses from Mastra's `/chat` route. |
There was a problem hiding this comment.
Discrepancy between the description text and the actual number of components. Line 7 states "52 components" but the mermaid diagram at line 62-75 only shows 14 AI Elements. If 52 is the total count across all AI Elements in the library, the description should clarify this. Otherwise, update the count to match the actual components used in the chat interface.
| code={selectedFileData.content} | ||
| language={(() => { | ||
| const l = selectedFileData.language?.toLowerCase().trim() | ||
| if (!(l!)) {return 'js'} |
There was a problem hiding this comment.
The negation operator is incorrectly applied to the result of a check. The expression !(l!) evaluates to !true which is false, meaning the condition will never execute. This should be !l to check if the language is falsy.
| if (!(l!)) {return 'js'} | |
| if (!l) {return 'js'} |
|
|
||
| <TestResultsContent> | ||
| {sandboxData?.testSuites?.map((suite) => ( | ||
| <TestSuite key={suite.name} name={''} status={'passed'}> |
There was a problem hiding this comment.
The TestSuite component receives hardcoded props name={''} and status={'passed'} instead of using the actual suite data. The empty string for name and hardcoded 'passed' status don't match the actual suite values (suite.name and suite.status). This will cause incorrect rendering and accessibility issues. Pass the actual values: name={suite.name} and status={suite.status}.
| <TestSuite key={suite.name} name={''} status={'passed'}> | |
| <TestSuite key={suite.name} name={suite.name} status={suite.status}> |
| }: AgentWorkflowProps) => { | ||
| return ( | ||
| <div className={cn('relative h-100 w-full border rounded-lg overflow-hidden bg-background', className)}> | ||
| {(Boolean(title)) && ( |
There was a problem hiding this comment.
The Boolean() wrapper is unnecessary. In JSX conditional rendering, {title && ...} would work directly without explicit boolean conversion. The pattern {(Boolean(title)) && ...} can be simplified to {title && ...}.
| const mockWriter: any = { | ||
| custom: vi.fn(), | ||
| write: vi.fn(), | ||
| } | ||
| const mockSpan: any = { | ||
| update: vi.fn(), | ||
| end: vi.fn(), | ||
| error: vi.fn(), | ||
| } | ||
| const mockTracingContext: any = { |
There was a problem hiding this comment.
Unexpected any. Specify a different type.
| const mockWriter: any = { | |
| custom: vi.fn(), | |
| write: vi.fn(), | |
| } | |
| const mockSpan: any = { | |
| update: vi.fn(), | |
| end: vi.fn(), | |
| error: vi.fn(), | |
| } | |
| const mockTracingContext: any = { | |
| const mockWriter = { | |
| custom: vi.fn(), | |
| write: vi.fn(), | |
| } | |
| const mockSpan = { | |
| update: vi.fn(), | |
| end: vi.fn(), | |
| error: vi.fn(), | |
| } | |
| const mockTracingContext = { |
| custom: vi.fn(), | ||
| write: vi.fn(), | ||
| } | ||
| const mockSpan: any = { |
There was a problem hiding this comment.
Unexpected any. Specify a different type.
| end: vi.fn(), | ||
| error: vi.fn(), | ||
| } | ||
| const mockTracingContext: any = { |
There was a problem hiding this comment.
Unexpected any. Specify a different type.