Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New Chat UI and Revision system #17

Open
wants to merge 98 commits into
base: main
Choose a base branch
from
Open

New Chat UI and Revision system #17

wants to merge 98 commits into from

Conversation

codewithcheese
Copy link
Owner

@codewithcheese codewithcheese commented Jul 8, 2024

Summary by CodeRabbit

  • New Features

    • Launched a robust chat service to facilitate interactions with an AI chat API.
    • Created a new chat interface component for better message management and interaction.
    • Introduced a message display component with keyboard shortcut functionality for enhanced user experience.
    • Added a component for revising chat messages, allowing for structured message management.
  • Enhancements

    • Improved textarea component for better integration with existing properties.
    • Refined loading and sorting of chat records to prioritize recent chats.
    • Enhanced user interaction with tooltips in the chat interface.
  • Bug Fixes

    • Fixed issues related to chat revisions and service loading in tests.
    • Resolved navigation logic inconsistencies within chat configuration.
  • Chores

    • Updated project dependencies for improved performance and modern features.
    • Removed legacy CodeMirror components in favor of a streamlined input method.

Copy link

cloudflare-workers-and-pages bot commented Jul 8, 2024

Deploying workbench with  Cloudflare Pages  Cloudflare Pages

Latest commit: 4377984
Status: ✅  Deploy successful!
Preview URL: https://920810b9.baseline-9ao.pages.dev
Branch Preview URL: https://chat-ui.baseline-9ao.pages.dev

View logs

Copy link

@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: 6

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 2a7b3e0 and 8944d9a.

Files selected for processing (9)
  • src/lib/chat-service.svelte.ts (1 hunks)
  • src/routes/(app)/$data.test.ts (9 hunks)
  • src/routes/(app)/$data.ts (3 hunks)
  • src/routes/(app)/chat/[id]/$data.test.ts (5 hunks)
  • src/routes/(app)/chat/[id]/$data.ts (3 hunks)
  • src/routes/(app)/chat/[id]/+layout.ts (2 hunks)
  • src/routes/(app)/chat/[id]/AttachmentControls.svelte (1 hunks)
  • src/routes/(app)/chat/[id]/ChatPage.svelte (1 hunks)
  • src/routes/(app)/chat/[id]/revise/RevisePage.svelte (1 hunks)
Files skipped from review as they are similar to previous changes (4)
  • src/routes/(app)/$data.ts
  • src/routes/(app)/chat/[id]/AttachmentControls.svelte
  • src/routes/(app)/chat/[id]/ChatPage.svelte
  • src/routes/(app)/chat/[id]/revise/RevisePage.svelte
Additional context used
Biome
src/routes/(app)/chat/[id]/$data.test.ts

[error] 11-11: Declarations inside of a import declaration may not have duplicates

a second declaration of createRevision is not allowed

createRevision is first declared here

(parse)

src/lib/chat-service.svelte.ts

[error] 97-97: void is confusing inside a union type.

Unsafe fix: Use undefined instead.

(lint/suspicious/noConfusingVoidType)


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

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 28-28: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)


[error] 230-230: Don't use 'Object' as a type.

Prefer explicitly define the object shape. This type means "any non-nullable value", which is slightly better than 'unknown', but it's still a broad type.

(lint/complexity/noBannedTypes)

Additional comments not posted (30)
src/routes/(app)/chat/[id]/+layout.ts (3)

24-33: Refactor: Use match function for tab determination.

The use of the match function for determining the tab variable improves clarity and potentially performance. Ensure that the match function is correctly implemented and handles all expected route patterns.


55-58: Register revision and handle dependencies.

The code registers the fetched revision and handles dependencies correctly. Ensure that the registerModel function is properly implemented and that dependencies are managed as expected.


50-54: Ensure proper handling of the version parameter.

The code correctly handles the version parameter, fetching the specific revision if provided. Ensure that the getRevision function is robust and handles edge cases, such as invalid versions.

Verification successful

The getRevision function handles the version parameter appropriately.

The function correctly queries the database based on the presence of a version and includes related data. It handles the case where version is null and ensures that no matching revision results in a null return, which is checked by the calling code.

  • src/routes/(app)/chat/[id]/$data.ts: getRevision function implementation
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the robustness of the `getRevision` function.

# Test: Search for the `getRevision` function. Expect: Correct handling of edge cases.
rg --type python -A 10 $'getRevision'

Length of output: 67


Script:

#!/bin/bash
# Description: Verify the robustness of the `getRevision` function.

# Test: Search for the `getRevision` function in TypeScript files. Expect: Correct handling of edge cases.
rg --type ts -A 10 'function getRevision' || rg --type ts -A 10 'const getRevision' || rg --type ts -A 10 'async function getRevision'

Length of output: 811


Script:

#!/bin/bash
# Description: Extract the complete implementation of the `getRevision` function.

# Test: Search for the complete `getRevision` function implementation in TypeScript files.
rg --type ts -A 30 'function getRevision' src/routes/(app)/chat/[id]/$data.ts

Length of output: 214


Script:

#!/bin/bash
# Description: Extract the complete implementation of the `getRevision` function.

# Test: Search for the complete `getRevision` function implementation in TypeScript files.
rg --type ts -A 30 'function getRevision' 'src/routes/(app)/chat/[id]/$data.ts'

Length of output: 873

src/routes/(app)/$data.test.ts (5)

33-34: Update test setup to reflect new schema.

The test setup has been updated to delete entries from the new tables. Ensure that the new table names are correctly used and that the setup correctly prepares the database for tests.


59-79: Update data insertion to reflect new schema.

The data insertion has been updated to use the new table names and structure. Ensure that the data insertion correctly reflects the new schema and that the inserted data is as expected.


117-123: Update query logic to reflect new schema.

The queries have been updated to use the new table names and structure. Ensure that the queries correctly reflect the new schema and that the retrieved data is as expected.


Line range hint 131-136:
Update test cases to reflect new schema.

The test cases have been updated to use the new table names and structure. Ensure that the test cases correctly reflect the new schema and that they are functioning as expected.


Line range hint 148-243:
Update duplication logic to reflect new schema.

The duplication logic has been updated to use the new table names and structure. Ensure that the duplication logic correctly reflects the new schema and that it is functioning as expected.

src/routes/(app)/chat/[id]/$data.ts (7)

22-28: Add new type definitions and utility functions.

The new type definitions and utility functions enhance type safety and clarity. Ensure that they are correctly implemented and used throughout the codebase.


42-57: Transform message object to ChatMessage type.

The toChatMessage function correctly transforms a message object from the RevisionView type into a ChatMessage type. Ensure that all expected cases are handled and that the transformation is correct.


59-78: Retrieve specific revision of chat messages.

The getRevision function correctly retrieves a specific revision of chat messages based on chatId and versioning. Ensure that all expected cases are handled and that the function is robust.


80-96: Retrieve latest revision of chat messages.

The getLatestRevision function correctly retrieves the latest revision of chat messages based on chatId. Ensure that all expected cases are handled and that the function is robust.


122-130: Update chat with partial update object.

The updateChat function correctly updates the chat with the provided partial update object. Ensure that all expected cases are handled and that the function is robust.


155-191: Insert multiple messages in a single transaction.

The appendMessages function correctly inserts multiple messages into the database in a single transaction. Ensure that all expected cases are handled and that the function is robust.


195-243: Create revision with associated messages.

The createRevision function correctly creates a revision with the associated messages. Ensure that all expected cases are handled and that the function is robust.

src/routes/(app)/chat/[id]/$data.test.ts (10)

124-132: LGTM! Comprehensive test case.

The updateChat test case covers the expected scenarios and ensures a chat can be updated correctly.


Line range hint 133-146: LGTM! Comprehensive test case.

The interpolateDocuments test cases cover the expected scenarios and ensure documents are interpolated correctly and errors are handled.


147-157: LGTM! Comprehensive test case.

The loadServices test case covers the expected scenarios and ensures services are loaded correctly with their models.


159-175: LGTM! Comprehensive test case.

The getRevision test case covers the expected scenarios and ensures a specific revision can be retrieved correctly.


177-187: LGTM! Comprehensive test case.

The getLatestRevision test case covers the expected scenarios and ensures the latest revision can be retrieved correctly.


189-198: LGTM! Comprehensive test case.

The getModelService test case covers the expected scenarios and ensures a model with its service can be retrieved correctly.


200-209: LGTM! Comprehensive test case.

The createRevision test case covers the expected scenarios and ensures a new revision can be created correctly.


237-270: LGTM! Comprehensive test case.

The newRevision test case covers the expected scenarios and ensures a new revision with messages can be created correctly.


272-284: LGTM! Comprehensive test case.

The isTab test cases cover the expected scenarios and ensure the function correctly identifies valid and invalid tab values.


286-291: LGTM! Comprehensive test case.

The tabRouteId test case covers the expected scenarios and ensures the function returns the correct route ID for each tab.

src/lib/chat-service.svelte.ts (5)

23-29: Avoid using {} as a type.

Using {} as a type means "any non-nullable value", which is too broad. Prefer explicitly defining the object shape.

Tools
Biome

[error] 28-28: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)


321-333: Add error handling for JSON parsing.

Parsing JSON can throw errors if the data is malformed. Add error handling to manage potential errors.


321-333: Add error handling for JSON parsing.

Parsing JSON can throw errors if the data is malformed. Add error handling to manage potential errors.


487-493: Add error handling and optimize the function.

The triggerRequest function can benefit from additional error handling and optimization.


427-427: Change to an optional chain.

Using an optional chain can simplify the code and avoid potential runtime errors.

src/routes/(app)/chat/[id]/$data.test.ts Outdated Show resolved Hide resolved
src/routes/(app)/chat/[id]/$data.test.ts Outdated Show resolved Hide resolved
src/lib/chat-service.svelte.ts Show resolved Hide resolved
src/lib/chat-service.svelte.ts Outdated Show resolved Hide resolved
src/lib/chat-service.svelte.ts Show resolved Hide resolved
Remove Unused codemirror imports
Update Svelte5 version
Copy link

@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

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 8944d9a and f358204.

Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
Files selected for processing (5)
  • package.json (2 hunks)
  • src/lib/chat-service.svelte.ts (1 hunks)
  • src/routes/(app)/document/Form.svelte (2 hunks)
  • src/routes/(app)/document/new/+page.svelte (2 hunks)
  • test/chat-service/chat-service.test.ts (1 hunks)
Additional context used
Biome
src/lib/chat-service.svelte.ts

[error] 93-93: void is confusing inside a union type.

Unsafe fix: Use undefined instead.

(lint/suspicious/noConfusingVoidType)


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

Unsafe fix: Change to an optional chain.

(lint/complexity/useOptionalChain)


[error] 24-24: Don't use '{}' as a type.

Prefer explicitly define the object shape. '{}' means "any non-nullable value".

(lint/complexity/noBannedTypes)


[error] 226-226: Don't use 'Object' as a type.

Prefer explicitly define the object shape. This type means "any non-nullable value", which is slightly better than 'unknown', but it's still a broad type.

(lint/complexity/noBannedTypes)

Additional comments not posted (12)
src/routes/(app)/document/new/+page.svelte (2)

25-25: LGTM! Verify the return value of the route function.

The modification to use the route helper function may improve routing logic. Ensure that the route function correctly returns the desired route.

Verification successful

Verified: The route function correctly constructs and returns the desired route string.

The modification to use the route helper function in the goto call is appropriate and ensures the correct path is generated.

  • The route function uses resolveRoute to get the base path.
  • It appends query parameters and hash fragments if they exist.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the return value of the `route` function.

# Test: Search for the `route` function return value. Expect: Correct return value.
rg --type js --type ts --type svelte -A 5 $'return'

Length of output: 81


Script:

#!/bin/bash
# Description: Verify the return value of the `route` function.

# Find the definition of the `route` function and inspect its return value.
rg 'function route' --type js --type ts -A 10

Length of output: 895


Script:

#!/bin/bash
# Description: Verify the return value of the `route` function.

# Find the definition of the `route` function and inspect its return value by capturing more lines.
rg 'function route' --type js --type ts -A 20

Length of output: 1510


8-8: LGTM! Verify the implementation of the route function.

The addition of the route import suggests an enhancement in routing logic. Ensure that the route function is correctly implemented and utilized.

Verification successful

Let's correct the file types and re-run the search for the route function implementation.


To ensure the route function is utilized correctly, we need to search for its usage within the codebase.


Let's correct the regex pattern and re-run the search for the usage of the route function.


The route function is correctly implemented and well-tested.

The route function is utilized in various test cases, indicating that it is functioning as expected. The addition of the route import in +page.svelte is appropriate and enhances the routing logic.

  • Verified the implementation in src/lib/route.ts.
  • Verified the usage in test/route.test.ts and test-e2e/test.ts.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the implementation of the `route` function.

# Test: Search for the `route` function implementation. Expect: Correct implementation and usage.
rg --type js --type ts --type svelte -A 5 $'function route'

Length of output: 91


Script:

#!/bin/bash
# Description: Verify the implementation of the `route` function.

# Test: Search for the `route` function implementation. Expect: Correct implementation and usage.
rg --type js --type ts -A 5 $'function route'

Length of output: 680


Script:

#!/bin/bash
# Description: Verify the usage of the `route` function.

# Test: Search for the usage of the `route` function within JavaScript and TypeScript files.
rg --type js --type ts $'route('

Length of output: 96


Script:

#!/bin/bash
# Description: Verify the usage of the `route` function.

# Test: Search for the usage of the `route` function within JavaScript and TypeScript files.
rg --type js --type ts 'route\('

Length of output: 1212

src/routes/(app)/document/Form.svelte (2)

37-37: LGTM! Verify the handling of the content value.

The usage of the Textarea component for binding the content value simplifies the input method. Ensure that the content value is correctly handled and that the user experience is not negatively impacted.

Verification successful

LGTM! Verify the handling of the content value.

The content value is being handled in various parts of the codebase, including initialization, binding, and function calls. Ensure that these usages are correctly implemented and do not introduce any issues. The usage of the Textarea component for binding the content value simplifies the input method and appears to be appropriate.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the handling of the `content` value.

# Test: Search for the handling of the `content` value. Expect: Correct handling and no negative impact on user experience.
rg --type js --type ts --type svelte -A 5 $'content'

Length of output: 82


Script:

#!/bin/bash
# Description: Verify the handling of the `content` value.

# Find all .svelte, .js, and .ts files and search for the handling of the `content` value.
fd -e svelte -e js -e ts -x rg 'content' {}

Length of output: 7584


5-5: LGTM! Verify the implementation of the Textarea component.

The addition of the Textarea import suggests a shift towards a simpler text input method. Ensure that the Textarea component is correctly implemented and utilized.

Verification successful

Let's re-run the verification with an adjusted script to handle svelte files explicitly.


LGTM! The Textarea component is correctly implemented and utilized.

The addition of the Textarea import suggests a shift towards a simpler text input method. The Textarea component is correctly implemented and consistently used across multiple files.

  • src/components/ui/textarea/index.ts
  • src/components/ui/textarea/textarea.svelte
  • src/routes/(app)/document/Form.svelte
  • src/routes/(app)/chat/[id]/MessageInput.svelte
  • src/routes/(app)/chat/[id]/eval/+page.svelte
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the implementation of the `Textarea` component.

# Test: Search for the `Textarea` component implementation. Expect: Correct implementation and usage.
rg --type js --type ts --type svelte -A 5 $'Textarea'

Length of output: 83


Script:

#!/bin/bash
# Description: Verify the implementation of the `Textarea` component.

# Test: Search for the `Textarea` component implementation. Expect: Correct implementation and usage.
rg --type js --type ts -A 5 'Textarea'
rg --glob '*.svelte' -A 5 'Textarea'

Length of output: 5870

package.json (2)

26-26: LGTM! Verify that the removal of dependencies does not negatively impact functionality.

The removal of these dependencies suggests a shift away from using CodeMirror for code editing. Ensure that the removal does not negatively impact the functionality of the application.

Also applies to: 30-31, 35-35, 47-47, 58-61

Verification successful

Let's modify the shell script to search for the removed dependencies in JavaScript and TypeScript files, excluding the unsupported 'svelte' file type.


To ensure comprehensive verification, let's search for the removed dependencies in other relevant file types such as HTML, CSS, or configuration files.


LGTM! The removal of the dependencies does not negatively impact the functionality of the application.

The searches across JavaScript, TypeScript, HTML, CSS, JSON, and YAML files confirmed that there are no remaining usages of the removed dependencies.

  • No instances of @codemirror found.
  • No instances of svelte-codemirror-editor found.
Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify that the removal of dependencies does not negatively impact functionality.

# Test: Search for any remaining usage of the removed dependencies. Expect: No remaining usage.
rg --type js --type ts --type svelte -A 5 $'@codemirror'
rg --type js --type ts --type svelte -A 5 $'svelte-codemirror-editor'

Length of output: 186


Script:

#!/bin/bash
# Description: Verify that the removal of dependencies does not negatively impact functionality.

# Test: Search for any remaining usage of the removed dependencies. Expect: No remaining usage.
rg --type js --type ts -A 5 $'@codemirror'
rg --type js --type ts -A 5 $'svelte-codemirror-editor'

Length of output: 96


Script:

#!/bin/bash
# Description: Verify that the removal of dependencies does not negatively impact functionality.

# Test: Search for any remaining usage of the removed dependencies in other relevant file types. Expect: No remaining usage.
rg --type html --type css --type json --type yaml -A 5 $'@codemirror'
rg --type html --type css --type json --type yaml -A 5 $'svelte-codemirror-editor'

Length of output: 150


26-26: LGTM! Verify the integration and usage of the new dependencies.

The addition of these dependencies suggests enhancements in functionality. Ensure that these dependencies are correctly integrated and utilized.

Also applies to: 30-31, 35-35, 47-47, 58-61

Verification successful

LGTM! Verify the integration and usage of the new dependencies.

The addition of these dependencies suggests enhancements in functionality. Ensure that these dependencies are correctly integrated and utilized.

  • @tailwindcss/typography is correctly integrated and used in tailwind.config.ts.
  • drizzle-kit is correctly integrated and used in drizzle.config.ts.
  • vitest is correctly integrated and used in multiple test files and configurations.

However, the following dependencies were found in the package.json but not in use:

  • @types/lodash
  • @vitest/browser
  • @lexical/history
  • @lexical/plain-text
  • @lexical/text
  • @lexical/utils

Please verify the usage of these dependencies to ensure they are correctly integrated.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the integration and usage of the new dependencies.

# Test: Search for the usage of the new dependencies. Expect: Correct integration and usage.
rg --type js --type ts --type svelte -A 5 $'@tailwindcss/typography'
rg --type js --type ts --type svelte -A 5 $'@types/lodash'
rg --type js --type ts --type svelte -A 5 $'@vitest/browser'
rg --type js --type ts --type svelte -A 5 $'drizzle-kit'
rg --type js --type ts --type svelte -A 5 $'vitest'
rg --type js --type ts --type svelte -A 5 $'@lexical/history'
rg --type js --type ts --type svelte -A 5 $'@lexical/plain-text'
rg --type js --type ts --type svelte -A 5 $'@lexical/text'
rg --type js --type ts --type svelte -A 5 $'@lexical/utils'

Length of output: 813


Script:

#!/bin/bash
# Description: Verify the integration and usage of the new dependencies.

# Test: Search for the usage of the new dependencies in JavaScript and TypeScript files.
rg --type js --type ts -A 5 $'@tailwindcss/typography'
rg --type js --type ts -A 5 $'@types/lodash'
rg --type js --type ts -A 5 $'@vitest/browser'
rg --type js --type ts -A 5 $'drizzle-kit'
rg --type js --type ts -A 5 $'vitest'
rg --type js --type ts -A 5 $'@lexical/history'
rg --type js --type ts -A 5 $'@lexical/plain-text'
rg --type js --type ts -A 5 $'@lexical/text'
rg --type js --type ts -A 5 $'@lexical/utils'

# Verify the presence of the new dependencies in package.json
rg -A 5 '"@tailwindcss/typography"' package.json
rg -A 5 '"@types/lodash"' package.json
rg -A 5 '"@vitest/browser"' package.json
rg -A 5 '"drizzle-kit"' package.json
rg -A 5 '"vitest"' package.json
rg -A 5 '"@lexical/history"' package.json
rg -A 5 '"@lexical/plain-text"' package.json
rg -A 5 '"@lexical/text"' package.json
rg -A 5 '"@lexical/utils"' package.json

Length of output: 8327

test/chat-service/chat-service.test.ts (5)

44-59: Test case should handle errors correctly looks good!

The test case effectively mocks a server error and verifies that the error is handled correctly.


61-80: Test case should abort ongoing requests when stop is called looks good!

The test case correctly verifies that ongoing requests are aborted when the stop method is called.


82-114: Test case should handle multiple attachments of different types in chat request looks good!

The test case effectively verifies that multiple attachments of different types are handled correctly in a chat request.


116-135: Test case should handle empty attachments gracefully in chat request looks good!

The test case correctly verifies that empty attachments are handled gracefully in a chat request.


137-157: Test case should handle attachments with special characters in chat request looks good!

The test case effectively verifies that attachments with special characters are handled correctly in a chat request.

src/lib/chat-service.svelte.ts (1)

26-28: Type ChatMessage looks good!

The type is well-defined and follows best practices.

src/lib/chat-service.svelte.ts Show resolved Hide resolved
src/lib/chat-service.svelte.ts Outdated Show resolved Hide resolved
src/lib/chat-service.svelte.ts Outdated Show resolved Hide resolved
src/lib/chat-service.svelte.ts Show resolved Hide resolved
src/lib/chat-service.svelte.ts Outdated Show resolved Hide resolved
src/lib/chat-service.svelte.ts Outdated Show resolved Hide resolved
src/lib/chat-service.svelte.ts Outdated Show resolved Hide resolved
Copy link

@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

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between f358204 and 806c5ce.

Files selected for processing (3)
  • src/routes/(app)/chat/[id]/MessageCard.svelte (1 hunks)
  • src/routes/(app)/chat/[id]/revise/MessageDivider.svelte (1 hunks)
  • src/routes/(app)/chat/[id]/revise/RevisePage.svelte (1 hunks)
Files skipped from review as they are similar to previous changes (3)
  • src/routes/(app)/chat/[id]/MessageCard.svelte
  • src/routes/(app)/chat/[id]/revise/MessageDivider.svelte
  • src/routes/(app)/chat/[id]/revise/RevisePage.svelte

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.

1 participant