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

๐Ÿ—ƒ๏ธ refactor: refactor the agent config to chat config #2646

Merged
merged 4 commits into from
May 25, 2024

Conversation

arvinxx
Copy link
Contributor

@arvinxx arvinxx commented May 24, 2024

๐Ÿ’ป ๅ˜ๆ›ด็ฑปๅž‹ | Change Type

  • โœจ feat
  • ๐Ÿ› fix
  • โ™ป๏ธ refactor
  • ๐Ÿ’„ style
  • ๐Ÿ”จ chore
  • โšก๏ธ perf
  • ๐Ÿ“ docs

๐Ÿ”€ ๅ˜ๆ›ด่ฏดๆ˜Ž | Description of Change

่ฟ็งป agent config ไธญ็š„ chat ็›ธๅ…ณๅญ—ๆฎตๅˆฐ็‹ฌ็ซ‹็š„ chatConfig ไธญ

๐Ÿ“ ่กฅๅ……ไฟกๆฏ | Additional Information

Summary by CodeRabbit

  • New Features

    • Restructured JSX layout in the DesktopLayout component for improved structure and added placeholder comments for future cloud slot integrations.
    • Introduced a JSON data structure representing sessions, messages, and topics related to PostgreSQL usage guidance.
    • Added a new LobeAgentChatConfig entity and modified the DEFAULT_AGENT_CONFIG declaration to include chatConfig.
  • Enhancements

    • Updated various components to utilize the new updateAgentChatConfig function for improved chat configuration management.
    • Improved session date handling for better accuracy and consistency.
    • Added selectors for accessing chat configuration settings related to an agent for easier retrieval from the store.
  • Bug Fixes

    • Fixed issues with session and agent configuration mappings to ensure correct data types and values.
  • Documentation

    • Added comments and placeholders for future cloud slot integrations in layout components.
  • Tests

    • Added comprehensive test cases to ensure successful migration from version 5 to version 6.

Copy link

vercel bot commented May 24, 2024

The latest updates on your projects. Learn more about Vercel for Git โ†—๏ธŽ

Name Status Preview Comments Updated (UTC)
lobe-chat-community โœ… Ready (Inspect) Visit Preview ๐Ÿ’ฌ Add feedback May 24, 2024 4:54pm

@lobehubbot
Copy link
Member

๐Ÿ‘ @arvinxx

Thank you for raising your pull request and contributing to our Community
Please make sure you have followed our contributing guidelines. We will review it as soon as possible.
If you encounter any problems, please feel free to connect with us.
้žๅธธๆ„Ÿ่ฐขๆ‚จๆๅ‡บๆ‹‰ๅ–่ฏทๆฑ‚ๅนถไธบๆˆ‘ไปฌ็š„็คพๅŒบๅšๅ‡บ่ดก็Œฎ๏ผŒ่ฏท็กฎไฟๆ‚จๅทฒ็ป้ตๅพชไบ†ๆˆ‘ไปฌ็š„่ดก็ŒฎๆŒ‡ๅ—๏ผŒๆˆ‘ไปฌไผšๅฐฝๅฟซๅฎกๆŸฅๅฎƒใ€‚
ๅฆ‚ๆžœๆ‚จ้‡ๅˆฐไปปไฝ•้—ฎ้ข˜๏ผŒ่ฏท้šๆ—ถไธŽๆˆ‘ไปฌ่”็ณปใ€‚

Copy link

coderabbitai bot commented May 24, 2024

Walkthrough

The recent changes focus on enhancing session management and agent configuration functionality in the application. Updates include introducing chat configuration management, migrating settings from version 5 to 6, and improving date handling. New selectors and state management logic support updated agent chat configurations for a more robust system.

Changes

Files/Paths Change Summaries
src/app/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx
src/app/(main)/chat/_layout/Desktop/index.tsx
Date property update in SessionItem component and cloud slot comments added.
src/app/(main)/chat/settings/features/EditPage.tsx
src/app/(main)/welcome/_layout/Desktop.tsx
Added updateAgentChatConfig function, JSX layout restructuring.
src/app/@modal/chat/(.)settings/modal/layout.tsx
src/const/session.ts
Hook returns updateAgentChatConfig, date initialization update.
src/const/settings/agent.ts
src/database/client/core/migrations/migrateSettingsToUser/index.ts
Added LobeAgentChatConfig, function return type update.
src/database/client/core/migrations/migrateSettingsToUser/type.ts
src/database/client/models/session.ts
Interface renaming, date conversion methods.
src/database/client/schemas/session.ts
src/features/AgentSetting/AgentChat/index.tsx
Schema update, dependency modifications.
src/features/AgentSetting/AgentModal/index.tsx
src/features/AgentSetting/StoreUpdater.tsx
Selector update, property addition in StoreUpdater.
src/features/AgentSetting/store/action.ts
src/features/AgentSetting/store/initialState.ts
Interface additions, function signature modifications.
src/features/AgentSetting/store/selectors.ts
src/features/ChatInput/ActionBar/History.tsx
Selector introduction, function reference update.
src/features/Conversation/components/ChatItem/index.tsx
src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json
Function reference update, JSON data structure introduction.
src/migrations/FromV5ToV6/fixtures/session-input-v5.json
src/migrations/FromV5ToV6/fixtures/session-output-v6.json
Export type introduction, session configuration updates.
src/migrations/FromV5ToV6/index.ts
src/migrations/FromV5ToV6/migrations.test.ts
Migration class introduction, test cases addition.
src/migrations/FromV5ToV6/types/v5.ts
src/migrations/FromV5ToV6/types/v6.ts
Interface additions, type introductions.
src/migrations/index.ts
src/services/session/client.test.ts
Migration update, configuration object modification.
src/services/session/client.ts
src/store/agent/slices/chat/action.test.ts
Import addition, method signature update.

A rabbit hops with code so bright,
Through fields of change both day and night.
With dates and configs all in array,
It tweaks the system, paves the way.
For agents chat and sessions new,
The future's clear, the past bids adieu.
๐Ÿ‡โœจ

Tip

New Features and Improvements

Review Settings

Introduced new personality profiles for code reviews. Users can now select between "Chill" and "Assertive" review tones to tailor feedback styles according to their preferences. The "Assertive" profile posts more comments and nitpicks the code more aggressively, while the "Chill" profile is more relaxed and posts fewer comments.

AST-based Instructions

CodeRabbit offers customizing reviews based on the Abstract Syntax Tree (AST) pattern matching. Read more about AST-based instructions in the documentation.

Community-driven AST-based Rules

We are kicking off a community-driven initiative to create and share AST-based rules. Users can now contribute their AST-based rules to detect security vulnerabilities, code smells, and anti-patterns. Please see the ast-grep-essentials repository for more information.

New Static Analysis Tools

We are continually expanding our support for static analysis tools. We have added support for biome, hadolint, and ast-grep. Update the settings in your .coderabbit.yaml file or head over to the settings page to enable or disable the tools you want to use.

Tone Settings

Users can now customize CodeRabbit to review code in the style of their favorite characters or personalities. Here are some of our favorite examples:

  • Mr. T: "You must talk like Mr. T in all your code reviews. I pity the fool who doesn't!"
  • Pirate: "Arr, matey! Ye must talk like a pirate in all yer code reviews. Yarrr!"
  • Snarky: "You must be snarky in all your code reviews. Snark, snark, snark!"

Revamped Settings Page

We have redesigned the settings page for a more intuitive layout, enabling users to find and adjust settings quickly. This change was long overdue; it not only improves the user experience but also allows our development team to add more settings in the future with ease. Going forward, the changes to .coderabbit.yaml will be reflected in the settings page, and vice versa.

Miscellaneous

  • Turn off free summarization: You can switch off free summarization of PRs opened by users not on a paid plan using the enable_free_tier setting.
  • Knowledge-base scope: You can now set the scope of the knowledge base to either the repository (local) or the organization (global) level using the knowledge_base setting. In addition, you can specify Jira project keys and Linear team keys to limit the knowledge base scope for those integrations.
  • High-level summary placement: You can now customize the location of the high-level summary in the PR description using the high_level_summary_placeholder setting (default @coderabbitai summary).
  • Revamped request changes workflow: You can now configure CodeRabbit to auto-approve or request changes on PRs based on the review feedback using the request_changes_workflow setting.

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
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>.
    • Generate unit testing code for this file.
    • 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 generate unit testing code for this file.
    • @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 generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

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 as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger a review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configration 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

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

Outside diff range and nitpick comments (13)
src/database/client/core/migrations/migrateSettingsToUser/type.ts (1)

Line range hint 2-5: Since these imports are only used as types, consider using TypeScript's import type syntax to clarify their usage and potentially optimize bundling.

- import { LobeAgentTTSConfig } from '@/types/agent';
- import { FewShots, LLMParams } from '@/types/llm';
- import { MetaData } from '@/types/meta';
- import { STTServer } from '@/types/settings';
+ import type { LobeAgentTTSConfig } from '@/types/agent';
+ import type { FewShots, LLMParams } from '@/types/llm';
+ import type { MetaData } from '@/types/meta';
+ import type { STTServer } from '@/types/settings';
src/services/session/type.ts (2)

Line range hint 18-18: Specify types explicitly instead of using any to ensure type safety and better maintainability.

- batchCreateSessions(importSessions: LobeSessions): Promise<any>;
- updateSession(id: string, data: Partial<{ group?: SessionGroupId; pinned?: boolean }>): Promise<any>;
- updateSessionConfig(id: string, config: DeepPartial<LobeAgentConfig>, signal?: AbortSignal): Promise<any>;
- updateSessionChatConfig(id: string, config: DeepPartial<LobeAgentChatConfig>, signal?: AbortSignal): Promise<any>;
- removeSession(id: string): Promise<any>;
- removeAllSessions(): Promise<any>;
- batchCreateSessionGroups(groups: SessionGroups): Promise<BatchTaskResult>;
- updateSessionGroup(id: string, data: Partial<SessionGroupItem>): Promise<any>;
- updateSessionGroupOrder(sortMap: { id: string; sort: number }[]): Promise<any>;
- removeSessionGroup(id: string, removeChildren?: boolean): Promise<any>;
+ batchCreateSessions(importSessions: LobeSessions): Promise<BatchTaskResult>;
+ updateSession(id: string, data: Partial<{ group?: SessionGroupId; pinned?: boolean }>): Promise<void>;
+ updateSessionConfig(id: string, config: DeepPartial<LobeAgentConfig>, signal?: AbortSignal): Promise<void>;
+ updateSessionChatConfig(id: string, config: DeepPartial<LobeAgentChatConfig>, signal?: AbortSignal): Promise<void>;
+ removeSession(id: string): Promise<void>;
+ removeAllSessions(): Promise<void>;
+ batchCreateSessionGroups(groups: SessionGroups): Promise<void>;
+ updateSessionGroup(id: string, data: Partial<SessionGroupItem>): Promise<void>;
+ updateSessionGroupOrder(sortMap: { id: string; sort: number }[]): Promise<void>;
+ removeSessionGroup(id: string, removeChildren?: boolean): Promise<void>;

Also applies to: 30-30, 37-37, 42-42, 44-44, 45-45, 56-56, 57-57, 59-59, 60-60


Line range hint 1-14: Since these imports are only used as types, consider using TypeScript's import type syntax to clarify their usage and potentially optimize bundling.

- import { LobeAgentChatConfig, LobeAgentConfig } from '@/types/agent';
- import { BatchTaskResult } from '@/types/service';
- import {
-   ChatSessionList,
-   LobeAgentSession,
-   LobeSessionType,
-   LobeSessions,
-   SessionGroupId,
-   SessionGroupItem,
-   SessionGroups,
- } from '@/types/session';
+ import type { LobeAgentChatConfig, LobeAgentConfig } from '@/types/agent';
+ import type { BatchTaskResult } from '@/types/service';
+ import type {
+   ChatSessionList,
+   LobeAgentSession,
+   LobeSessionType,
+   LobeSessions,
+   SessionGroupId,
+   SessionGroupItem,
+   SessionGroups,
+ } from '@/types/session';
src/store/chat/slices/message/action.ts (5)

Line range hint 298-298: Consider simplifying the double-negation logic for clarity.

- if (!!newTopicId) {
+ if (newTopicId) {

Line range hint 604-604: Avoid using non-null assertions unless absolutely necessary.

Consider checking for null or undefined before using the value.


Line range hint 607-624: This else clause is redundant and can be omitted for cleaner code.

- else
-   set(
-     {
-       abortController: undefined,
-       chatLoadingIds: toggleBooleanList(get().messageLoadingIds, id, loading),
-     },
-     false,
-     action,
-   );

Line range hint 637-637: Simplify the double-negation logic for better readability.

- if (!!streaming) {
+ if (streaming) {

Line range hint 750-750: Use template literals for string concatenation to enhance readability and maintainability.

- const tempId = 'tmp_' + nanoid();
+ const tempId = `tmp_${nanoid()}`;
src/store/chat/slices/message/action.test.ts (5)

Line range hint 3-4: Consider removing unused imports to clean up the code.

- import { act, renderHook, waitFor } from '@testing-library/react';
- import useSWR, { mutate } from 'swr';
- import { Mock, afterEach, beforeEach, describe, expect, it, vi } from 'vitest';

Also applies to: 16-17


Line range hint 51-51: Replace any type with more specific types to enhance type safety.

- const messages = [{ id: 'message-id', content: 'Hello', role: 'user' }] as any;
+ const messages: ChatMessage[] = [{ id: 'message-id', content: 'Hello', role: 'user' }];

Also applies to: 359-359, 402-402, 475-475, 521-522, 539-539, 893-893, 1010-1010, 1037-1037, 1054-1054


Line range hint 1-1054: Consider organizing tests into more granular describe blocks for better readability and maintenance.


Line range hint 1-1054: Optimize the use of async operations in tests where possible to improve test execution speed.


Line range hint 1-1054: Add more inline comments explaining the purpose of complex mocks and test setups to enhance maintainability.

Review Details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits Files that changed from the base of the PR and between 4712849 and dce34ad.
Files selected for processing (44)
  • src/app/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx (1 hunks)
  • src/app/(main)/chat/_layout/Desktop/index.tsx (1 hunks)
  • src/app/(main)/chat/settings/features/EditPage.tsx (2 hunks)
  • src/app/(main)/welcome/_layout/Desktop.tsx (1 hunks)
  • src/app/@modal/chat/(.)settings/modal/layout.tsx (2 hunks)
  • src/const/session.ts (1 hunks)
  • src/const/settings/agent.ts (2 hunks)
  • src/database/client/core/migrations/migrateSettingsToUser/index.ts (1 hunks)
  • src/database/client/core/migrations/migrateSettingsToUser/type.ts (3 hunks)
  • src/database/client/models/session.ts (1 hunks)
  • src/database/client/schemas/session.ts (2 hunks)
  • src/features/AgentSetting/AgentChat/index.tsx (2 hunks)
  • src/features/AgentSetting/AgentModal/index.tsx (2 hunks)
  • src/features/AgentSetting/StoreUpdater.tsx (1 hunks)
  • src/features/AgentSetting/store/action.ts (4 hunks)
  • src/features/AgentSetting/store/initialState.ts (2 hunks)
  • src/features/AgentSetting/store/selectors.ts (1 hunks)
  • src/features/ChatInput/ActionBar/History.tsx (1 hunks)
  • src/features/Conversation/components/ChatItem/index.tsx (2 hunks)
  • src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json (1 hunks)
  • src/migrations/FromV5ToV6/fixtures/session-input-v5.json (1 hunks)
  • src/migrations/FromV5ToV6/fixtures/session-output-v6.json (1 hunks)
  • src/migrations/FromV5ToV6/index.ts (1 hunks)
  • src/migrations/FromV5ToV6/migrations.test.ts (1 hunks)
  • src/migrations/FromV5ToV6/types/v5.ts (1 hunks)
  • src/migrations/FromV5ToV6/types/v6.ts (1 hunks)
  • src/migrations/index.ts (1 hunks)
  • src/services/session/client.test.ts (1 hunks)
  • src/services/session/client.ts (2 hunks)
  • src/services/session/type.ts (2 hunks)
  • src/store/agent/slices/chat/action.ts (4 hunks)
  • src/store/agent/slices/chat/initialState.ts (1 hunks)
  • src/store/agent/slices/chat/selectors.ts (3 hunks)
  • src/store/chat/helpers.test.ts (3 hunks)
  • src/store/chat/helpers.ts (2 hunks)
  • src/store/chat/slices/message/action.test.ts (1 hunks)
  • src/store/chat/slices/message/action.ts (5 hunks)
  • src/store/chat/slices/message/selectors.test.ts (1 hunks)
  • src/store/chat/slices/message/selectors.ts (1 hunks)
  • src/store/session/slices/session/action.test.ts (2 hunks)
  • src/types/agent/index.ts (3 hunks)
  • src/types/session/agentSession.ts (1 hunks)
  • src/types/session/index.ts (1 hunks)
  • src/types/session/sessionGroup.ts (1 hunks)
Files skipped from review due to trivial changes (2)
  • src/app/(main)/chat/@session/features/SessionListContent/List/Item/index.tsx
  • src/migrations/FromV5ToV6/fixtures/from-v1-to-v6-output.json
Additional Context Used
Biome (135)
src/app/(main)/chat/_layout/Desktop/index.tsx (1)

3-4: All these imports are only used as types.

src/app/(main)/welcome/_layout/Desktop.tsx (1)

1-2: All these imports are only used as types.

src/app/@modal/chat/(.)settings/modal/layout.tsx (1)

5-6: Some named imports are only used as types.

src/const/session.ts (1)

2-3: Some named imports are only used as types.

src/const/settings/agent.ts (2)

2-3: All these imports are only used as types.


3-4: All these imports are only used as types.

src/database/client/core/migrations/migrateSettingsToUser/index.ts (1)

1-1: All these imports are only used as types.

src/database/client/core/migrations/migrateSettingsToUser/type.ts (4)

2-3: All these imports are only used as types.


3-4: All these imports are only used as types.


4-5: All these imports are only used as types.


5-6: All these imports are only used as types.

src/database/client/models/session.ts (6)

104-104: Change to an optional chain.


1-1: All these imports are only used as types.


4-5: All these imports are only used as types.


5-6: Some named imports are only used as types.


6-7: All these imports are only used as types.


7-14: Some named imports are only used as types.

src/features/AgentSetting/AgentChat/index.tsx (2)

2-3: Some named imports are only used as types.


41-41: This hook does not specify all of its dependencies: form.setFieldsValue

src/features/AgentSetting/AgentModal/index.tsx (1)

2-3: Some named imports are only used as types.

src/features/AgentSetting/StoreUpdater.tsx (1)

5-6: Some named imports are only used as types.

src/features/AgentSetting/store/action.ts (11)

62-62: Unexpected any. Specify a different type.


63-63: Unexpected any. Specify a different type.


1-1: All these imports are only used as types.


6-7: Some named imports are only used as types.


8-9: All these imports are only used as types.


9-10: All these imports are only used as types.


10-11: All these imports are only used as types.


13-14: All these imports are only used as types.


14-15: Some named imports are only used as types.


15-16: Some named imports are only used as types.


16-17: Some named imports are only used as types.

src/features/AgentSetting/store/initialState.ts (2)

2-3: All these imports are only used as types.


3-4: All these imports are only used as types.

src/features/AgentSetting/store/selectors.ts (2)

1-2: All these imports are only used as types.


3-4: All these imports are only used as types.

src/features/Conversation/components/ChatItem/index.tsx (7)

74-74: The computed expression can be simplified without the use of a string literal.


86-86: This variable implicitly has the any type.


102-102: Unexpected any. Specify a different type.


1-1: Some named imports are only used as types.


3-4: Some named imports are only used as types.


14-15: All these imports are only used as types.


96-96: This hook does not specify all of its dependencies: errorT

src/migrations/FromV5ToV6/index.ts (4)

52-52: Forbidden non-null assertion.


53-53: Forbidden non-null assertion.


2-3: All these imports are only used as types.


3-4: All these imports are only used as types.

src/migrations/FromV5ToV6/migrations.test.ts (3)

16-16: This variable implicitly has the any type.


17-17: Unexpected any. Specify a different type.


2-3: Some named imports are only used as types.

src/migrations/FromV5ToV6/types/v5.ts (2)

1-1: All these imports are only used as types.


1-2: All these imports are only used as types.

src/migrations/FromV5ToV6/types/v6.ts (1)

1-1: All these imports are only used as types.

src/migrations/index.ts (1)

2-3: All these imports are only used as types.

src/services/session/client.test.ts (3)

1-1: Some named imports are only used as types.


4-5: All these imports are only used as types.


5-6: Some named imports are only used as types.

src/services/session/client.ts (4)

1-1: All these imports are only used as types.


7-8: All these imports are only used as types.


8-16: All these imports are only used as types.


17-18: All these imports are only used as types.

src/services/session/type.ts (14)

18-18: Unexpected any. Specify a different type.


30-30: Unexpected any. Specify a different type.


37-37: Unexpected any. Specify a different type.


42-42: Unexpected any. Specify a different type.


44-44: Unexpected any. Specify a different type.


45-45: Unexpected any. Specify a different type.


56-56: Unexpected any. Specify a different type.


57-57: Unexpected any. Specify a different type.


59-59: Unexpected any. Specify a different type.


60-60: Unexpected any. Specify a different type.


1-2: All these imports are only used as types.


3-4: All these imports are only used as types.


4-5: All these imports are only used as types.


5-14: All these imports are only used as types.

src/store/agent/slices/chat/action.ts (6)

2-3: Some named imports are only used as types.


3-4: All these imports are only used as types.


4-5: All these imports are only used as types.


10-11: All these imports are only used as types.


12-13: All these imports are only used as types.


15-16: All these imports are only used as types.

src/store/agent/slices/chat/initialState.ts (2)

1-1: All these imports are only used as types.


3-4: All these imports are only used as types.

src/store/agent/slices/chat/selectors.ts (3)

58-58: This variable implicitly has the any type.


8-9: All these imports are only used as types.


9-10: All these imports are only used as types.

src/store/chat/helpers.test.ts (3)

2-3: Some named imports are only used as types.


3-4: All these imports are only used as types.


4-5: All these imports are only used as types.

src/store/chat/helpers.ts (3)

1-1: All these imports are only used as types.


1-2: All these imports are only used as types.


2-3: All these imports are only used as types.

src/store/chat/slices/message/action.test.ts (12)

51-51: Unexpected any. Specify a different type.


359-359: Unexpected any. Specify a different type.


402-402: Unexpected any. Specify a different type.


475-475: Unexpected any. Specify a different type.


521-522: Unexpected any. Specify a different type.


539-539: Unexpected any. Specify a different type.


893-893: Unexpected any. Specify a different type.


1010-1010: Unexpected any. Specify a different type.


1037-1037: Unexpected any. Specify a different type.


1054-1054: Unexpected any. Specify a different type.


3-4: Some named imports are only used as types.


16-17: All these imports are only used as types.

src/store/chat/slices/message/action.ts (12)

298-298: Avoid redundant double-negation.


604-604: Forbidden non-null assertion.


607-624: This else clause can be omitted because previous branches break early.


637-637: Avoid redundant double-negation.


750-750: Template literals are preferred over string concatenation.


6-7: Some named imports are only used as types.


7-8: All these imports are only used as types.


13-14: Some named imports are only used as types.


20-21: All these imports are only used as types.


21-22: All these imports are only used as types.


22-23: All these imports are only used as types.


27-28: Some named imports are only used as types.

src/store/chat/slices/message/selectors.test.ts (4)

6-7: All these imports are only used as types.


11-12: All these imports are only used as types.


12-13: All these imports are only used as types.


13-14: All these imports are only used as types.

src/store/chat/slices/message/selectors.ts (3)

85-86: Avoid redundant double-negation.


11-12: All these imports are only used as types.


12-13: All these imports are only used as types.

src/store/session/slices/session/action.test.ts (5)

74-74: This variable implicitly has the any type.


94-94: This variable implicitly has the any type.


205-205: Unexpected any. Specify a different type.


208-208: Unexpected any. Specify a different type.


222-222: Unexpected any. Specify a different type.

src/types/agent/index.ts (1)

2-3: All these imports are only used as types.

src/types/session/agentSession.ts (3)

1-1: All these imports are only used as types.


2-3: All these imports are only used as types.


3-4: All these imports are only used as types.

src/types/session/index.ts (2)

1-1: All these imports are only used as types.


1-2: All these imports are only used as types.

src/types/session/sessionGroup.ts (1)

1-1: All these imports are only used as types.

Additional comments not posted (39)
src/types/session/index.ts (2)

1-2: Imports are correctly used as types, aligning with TypeScript best practices.


7-10: The ChatSessionList interface is well-defined and clear.

src/features/AgentSetting/store/selectors.ts (2)

1-4: Imports are correctly used as types, aligning with TypeScript best practices.


6-11: The chatConfig selector is correctly implemented with appropriate fallback to default configuration.

src/database/client/core/migrations/migrateSettingsToUser/index.ts (2)

1-1: Imports are correctly used as types, aligning with TypeScript best practices.


Line range hint 1-14: The migration function from V4 to V5 settings is correctly implemented and handles the transformation appropriately.

src/types/session/sessionGroup.ts (2)

1-1: Imports are correctly used as types, aligning with TypeScript best practices.


3-24: The type definitions for session groups are well-structured and clearly defined.

src/store/agent/slices/chat/initialState.ts (2)

Line range hint 1-4: Imports are correctly used as types, aligning with TypeScript best practices.


12-13: The inclusion of AbortController signals for managing asynchronous updates in the agent chat configuration is a good practice.

src/const/session.ts (2)

Line range hint 1-4: Imports are correctly used as types, aligning with TypeScript best practices.


12-17: The use of new Date() for createdAt and updatedAt in DEFAULT_AGENT_LOBE_SESSION ensures that these fields are properly typed as Date instances.

src/types/session/agentSession.ts (1)

1-35: The type definitions in agentSession.ts are consistent and align with the PR's objectives of refactoring configuration settings.

src/app/(main)/chat/_layout/Desktop/index.tsx (1)

22-24: The addition of cloud slot comments serves as a placeholder for future integrations and does not impact the current functionality.

src/features/AgentSetting/store/initialState.ts (1)

12-12: The addition of onChatConfigChange in the store's initial state aligns with the PR's objectives to manage chat configurations separately. Ensure this new handler integrates well with other components.

Verification successful

The integration of onChatConfigChange appears to be well-implemented across various components in the codebase. Here are the relevant locations:

  • src/features/AgentSetting/StoreUpdater.tsx
  • src/features/AgentSetting/store/action.ts
  • src/app/@modal/chat/(.)settings/modal/layout.tsx
  • src/app/(main)/chat/settings/features/EditPage.tsx

These references indicate that onChatConfigChange is being utilized appropriately within the application.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify integration of `onChatConfigChange` with other components.

# Test: Search for usage of `onChatConfigChange`. Expect: Proper integration with other components.
rg --type typescript $'onChatConfigChange'

Length of output: 76



Script:

#!/bin/bash
# Description: Verify integration of `onChatConfigChange` with other components.

# Test: Search for usage of `onChatConfigChange`. Expect: Proper integration with other components.
rg --type ts $'onChatConfigChange'

Length of output: 804

src/features/AgentSetting/StoreUpdater.tsx (1)

9-21: The update to include onChatConfigChange in StoreUpdater is well-implemented, ensuring that chat configuration changes are reactive and managed centrally.

src/const/settings/agent.ts (1)

15-22: The addition of DEFAULT_AGENT_CHAT_CONFIG and its integration into DEFAULT_AGENT_CONFIG are well-executed, aligning with the PR's objectives to separate chat configuration management.

Verification successful

The DEFAULT_AGENT_CHAT_CONFIG is properly integrated and used in multiple places within the codebase, including selectors and configuration files. This confirms that the new configuration is being utilized as intended.

  • src/features/AgentSetting/store/selectors.ts
  • src/store/agent/slices/chat/selectors.ts
  • src/const/settings/agent.ts
Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify the usage of `DEFAULT_AGENT_CHAT_CONFIG` in the application.

# Test: Search for the usage of `DEFAULT_AGENT_CHAT_CONFIG`. Expect: Proper integration and usage.
rg --type typescript $'DEFAULT_AGENT_CHAT_CONFIG'

Length of output: 83



Script:

#!/bin/bash
# Description: Verify the usage of `DEFAULT_AGENT_CHAT_CONFIG` in the application.

# Test: Search for the usage of `DEFAULT_AGENT_CHAT_CONFIG`. Expect: Proper integration and usage.
rg --type ts 'DEFAULT_AGENT_CHAT_CONFIG'

Length of output: 581

src/app/(main)/welcome/_layout/Desktop.tsx (1)

11-32: The layout structure using Flexbox and GridShowcase is well-implemented for a responsive desktop layout.

src/migrations/FromV5ToV6/types/v5.ts (1)

7-44: The interfaces for session and agent configuration are well-defined and appropriately typed.

src/migrations/index.ts (1)

Line range hint 9-36: The migration management setup with ConfigMigrations and VersionController is correctly implemented and maintains good code organization.

src/app/(main)/chat/settings/features/EditPage.tsx (1)

Line range hint 19-36: The integration of updateAgentChatConfig alongside updateAgentConfig is well-executed, enhancing the modularity and maintainability of chat settings management.

src/migrations/FromV5ToV6/types/v6.ts (1)

16-59: The interfaces for chat configuration and agent/session configuration are well-defined and appropriately typed, supporting the new structure in version 6.

src/database/client/schemas/session.ts (1)

27-27: The integration of AgentChatConfigSchema into AgentSchema is correctly implemented, ensuring robust validation for the new chat configuration.

src/features/ChatInput/ActionBar/History.tsx (1)

15-16: Ensure that the selector currentAgentChatConfig is robust against possible undefined states to prevent runtime errors.

Verification successful

Ensure currentAgentChatConfig handles undefined states.

The implementation of currentAgentChatConfig in src/store/agent/slices/chat/selectors.ts is as follows:

const currentAgentChatConfig = (s: AgentStore): LobeAgentChatConfig =>
  currentAgentConfig(s).chatConfig || DEFAULT_AGENT_CHAT_CONFIG;

This implementation uses a fallback (DEFAULT_AGENT_CHAT_CONFIG) if currentAgentConfig(s).chatConfig is undefined, which ensures robustness against undefined states.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify the implementation of `currentAgentChatConfig` to ensure it handles undefined states gracefully.

# Test: Search for the selector implementation. Expect: Proper handling of undefined states.
ast-grep --lang javascript --pattern $'agentSelectors.currentAgentChatConfig($_)'

Length of output: 82



Script:

#!/bin/bash
# Description: Locate the definition of `currentAgentChatConfig` and review its implementation.

# Search for the definition of `currentAgentChatConfig` in the codebase.
rg 'currentAgentChatConfig' --type js

Length of output: 37



Script:

#!/bin/bash
# Description: Locate the definition of `currentAgentChatConfig` and review its implementation.

# Search for the definition of `currentAgentChatConfig` in the codebase, including both JavaScript and TypeScript files.
rg 'currentAgentChatConfig' --type js --type ts --type tsx

Length of output: 86



Script:

#!/bin/bash
# Description: Locate the definition of `currentAgentChatConfig` and review its implementation.

# Search for the definition of `currentAgentChatConfig` in the codebase, including JavaScript, TypeScript, and TypeScript React files.
rg 'currentAgentChatConfig' --type js --type ts --type tsx

Length of output: 86



Script:

#!/bin/bash
# Description: Locate the definition of `currentAgentChatConfig` and review its implementation.

# Search for the definition of `currentAgentChatConfig` in the codebase without specifying file types.
rg 'currentAgentChatConfig'

Length of output: 809



Script:

#!/bin/bash
# Description: Extract the implementation of `currentAgentChatConfig` from `src/store/agent/slices/chat/selectors.ts`.

# Extract the implementation of `currentAgentChatConfig`.
rg -A 10 'const currentAgentChatConfig' src/store/agent/slices/chat/selectors.ts

Length of output: 457

src/app/@modal/chat/(.)settings/modal/layout.tsx (2)

31-34: Ensure proper handling of updateAgentChatConfig alongside updateAgentConfig.

This addition allows for more granular control over chat configurations, aligning with the PR's objectives to separate chat settings from the main agent configuration.


52-52: Properly handle onChatConfigChange event.

This change ensures that any updates to the chat configuration are properly propagated through the system, which is crucial for maintaining consistency in settings management.

src/store/agent/slices/chat/selectors.ts (1)

22-24: Addition of currentAgentChatConfig selector.

This selector is crucial for accessing the chat configuration from the Redux store, which supports the new structure of separating chat config from the main agent config.

src/features/AgentSetting/AgentModal/index.tsx (1)

21-21: Use of chatConfig selector for enableMaxTokens.

This change aligns with the new structure where chat-related configurations are managed separately, enhancing modularity and maintainability.

src/store/chat/helpers.test.ts (1)

Line range hint 77-104: Proper handling of LobeAgentChatConfig in test scenarios.

These changes ensure that the tests are aligned with the new chat configuration structure, which is crucial for maintaining robustness in the application.

src/features/AgentSetting/AgentChat/index.tsx (2)

27-43: Ensure proper handling of chat configuration settings.

The use of chatConfig selector and the structured handling of its values in the form ensure that the chat settings are managed correctly and are user-friendly.


41-43: Add form.setFieldsValue to the dependency array of useLayoutEffect.

-  }, [config]);
+  }, [config, form.setFieldsValue]);

This change ensures that the effect correctly re-runs when form.setFieldsValue changes, adhering to React's rules of hooks and preventing potential bugs in future re-renders.

Likely invalid or redundant comment.

src/services/session/client.ts (1)

114-121: Addition of updateSessionChatConfig method.

This method allows updating the chat configuration of a session, which is essential for the new structure where chat settings are managed separately.

src/store/chat/slices/message/selectors.ts (1)

105-105: Ensure proper handling of currentAgentChatConfig in the selector.

Verification successful

The currentAgentChatConfig is properly defined and used in the store. Here are the relevant locations:

  • Definition: src/store/agent/slices/chat/selectors.ts
  • Usage:
    • src/store/chat/slices/message/action.ts
    • src/store/chat/slices/message/selectors.ts
    • src/features/ChatInput/ActionBar/History.tsx
    • src/features/Conversation/components/ChatItem/index.tsx
Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify that `currentAgentChatConfig` is properly defined and used in the store.

# Test: Search for the definition and usage of `currentAgentChatConfig`.
rg --type python $'currentAgentChatConfig'

Length of output: 72



Script:

#!/bin/bash
# Description: Verify that `currentAgentChatConfig` is properly defined and used in the store.

# Test: Search for the definition and usage of `currentAgentChatConfig`.
rg --type typescript 'currentAgentChatConfig'

Length of output: 80



Script:

#!/bin/bash
# Description: Verify that `currentAgentChatConfig` is properly defined and used in the store.

# Test: Search for the definition and usage of `currentAgentChatConfig`.
rg 'currentAgentChatConfig'

Length of output: 809

src/store/chat/slices/message/selectors.test.ts (1)

151-154: Ensure historyCount and enableHistoryCount are properly tested.

Verification successful

The test file src/store/chat/slices/message/selectors.test.ts does include tests for the historyCount and enableHistoryCount properties.

  • Line found: it('should slice the messages according to config, assuming historyCount is mocked to 2', async () => {
  • Properties tested: historyCount: 2, enableHistoryCount: true
Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify that the new chat configuration properties are covered by tests.

# Test: Search for tests involving `historyCount` and `enableHistoryCount`.
rg --type python $'historyCount|enableHistoryCount' src/store/chat/slices/message/selectors.test.ts

Length of output: 131



Script:

#!/bin/bash
# Description: Verify that the new chat configuration properties are covered by tests.

# Test: Search for tests involving `historyCount` and `enableHistoryCount`.
rg --type typescript 'historyCount|enableHistoryCount' src/store/chat/slices/message/selectors.test.ts

Length of output: 139



Script:

#!/bin/bash
# Description: Verify that the new chat configuration properties are covered by tests.

# Test: Search for tests involving `historyCount` and `enableHistoryCount`.
rg 'historyCount|enableHistoryCount' src/store/chat/slices/message/selectors.test.ts

Length of output: 265

src/migrations/FromV5ToV6/fixtures/session-input-v5.json (1)

1-81: Ensure the session data structure matches the expected format for version 5.

src/migrations/FromV5ToV6/fixtures/session-output-v6.json (1)

1-85: Ensure the session data structure matches the expected format for version 6.

src/store/chat/slices/message/action.ts (2)

137-137: Ensure proper handling of agent chat configuration retrieval.


246-246: Verify the usage of getAgentChatConfig in the context of sending messages.

Verification successful

The search results show that getAgentChatConfig is defined and used within the same file (src/store/chat/slices/message/action.ts). However, to fully verify its usage in the context of sending messages, we need to examine the surrounding code to understand how agentConfig is utilized.


The extracted context shows that getAgentChatConfig is used to retrieve agentConfig, which is then utilized in the logic for creating messages, including checking conditions for auto-creating topics and handling message creation.

  • The function getAgentChatConfig is defined as:

    const getAgentChatConfig = () => agentSelectors.currentAgentChatConfig(useAgentStore.getState());
  • It is used in the following context:

    const agentConfig = getAgentChatConfig();
    if (!onlyAddUserMessage && !activeTopicId && agentConfig.enableAutoCreateTopic) {
      // logic for auto-creating topics
    }

This confirms that getAgentChatConfig is indeed used in the context of sending messages, specifically for configuring message creation and topic management.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify the usage of `getAgentChatConfig` in the context of sending messages.

# Test: Search for the function usage. Expect: Only occurances of the new signature.
rg --type python $'getAgentChatConfig'

Length of output: 68



Script:

#!/bin/bash
# Description: Verify the usage of `getAgentChatConfig` in the context of sending messages.

# Test: Search for the function usage in TypeScript files.
rg --type typescript 'getAgentChatConfig'

Length of output: 76



Script:

#!/bin/bash
# Description: Verify the usage of `getAgentChatConfig` in the context of sending messages.

# Test: Search for the function usage in TypeScript files.
rg --type ts 'getAgentChatConfig'

Length of output: 257



Script:

#!/bin/bash
# Description: Extract the surrounding code where `getAgentChatConfig` is used to understand its context.

# Extract 20 lines before and after the usage of `getAgentChatConfig` to understand its context.
rg --type ts 'getAgentChatConfig' -A 20 -B 20

Length of output: 6357

src/store/chat/slices/message/action.test.ts (1)

420-423: Ensure the autoCreateTopicThreshold is set correctly in tests to match expected behavior.

@@ -205,7 +205,7 @@ describe('SessionService', () => {
describe('updateSessionConfig', () => {
it('should update the config of a session', async () => {
// Setup
const newConfig = { compressThreshold: 2 } as LobeAgentConfig;
const newConfig = { model: 'abc' } as LobeAgentConfig;
Copy link

Choose a reason for hiding this comment

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

Tip

Codebase Verification

Ensure the new session configuration is properly tested.

The search results show the new configuration being set, but there is no evidence of tests verifying its behavior. Please add tests to ensure the new session configuration is properly validated.

  • src/services/session/client.test.ts: Add tests to verify the behavior of the new session configuration.
Analysis chain

Ensure the new session configuration is properly tested.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify that the new session configuration properties are covered by tests.

# Test: Search for tests involving the new session configuration.
rg --type python $'model: \'abc\'' src/services/session/client.test.ts

Length of output: 106



Script:

#!/bin/bash
# Description: Verify that the new session configuration properties are covered by tests.

# Test: Search for tests involving the new session configuration.
rg --type typescript 'model: '\''abc'\''' src/services/session/client.test.ts

Length of output: 114



Script:

#!/bin/bash
# Description: Verify that the new session configuration properties are covered by tests.

# Test: Search for tests involving the new session configuration.
rg 'model: '\''abc'\''' src/services/session/client.test.ts

Length of output: 122

Comment on lines +2 to +4

import { V5ConfigState, V5Session } from './types/v5';
import { V6ConfigState, V6Session } from './types/v6';
Copy link

Choose a reason for hiding this comment

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

Since these imports are only used as types, consider using TypeScript's import type syntax to clarify their usage and potentially optimize bundling.

- import { V5ConfigState, V5Session } from './types/v5';
- import { V6ConfigState, V6Session } from './types/v6';
+ import type { V5ConfigState, V5Session } from './types/v5';
+ import type { V6ConfigState, V6Session } from './types/v6';

Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
import { V5ConfigState, V5Session } from './types/v5';
import { V6ConfigState, V6Session } from './types/v6';
import type { V5ConfigState, V5Session } from './types/v5';
import type { V6ConfigState, V6Session } from './types/v6';

Comment on lines +1 to +2
import { LobeAgentTTSConfig } from '@/types/agent';
import { FewShots, LLMParams } from '@/types/llm';
Copy link

Choose a reason for hiding this comment

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

Consider using import type for clarity since these imports are only used for type annotations.

- import { LobeAgentTTSConfig } from '@/types/agent';
- import { FewShots, LLMParams } from '@/types/llm';
+ import type { LobeAgentTTSConfig } from '@/types/agent';
+ import type { FewShots, LLMParams } from '@/types/llm';

Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
import { LobeAgentTTSConfig } from '@/types/agent';
import { FewShots, LLMParams } from '@/types/llm';
import type { LobeAgentTTSConfig } from '@/types/agent';
import type { FewShots, LLMParams } from '@/types/llm';

inputTemplate,
},
},
createdAt: createdAt || createAt!,
Copy link

Choose a reason for hiding this comment

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

Avoid using non-null assertions as they can lead to runtime errors if assumptions are incorrect.

- createdAt: createdAt || createAt!,
+ createdAt: createdAt || createAt || new Date(), // Provide a default value if both are undefined

Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
createdAt: createdAt || createAt!,
createdAt: createdAt || createAt || new Date(),

},
},
createdAt: createdAt || createAt!,
updatedAt: updatedAt || updateAt!,
Copy link

Choose a reason for hiding this comment

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

Avoid using non-null assertions as they can lead to runtime errors if assumptions are incorrect.

- updatedAt: updatedAt || updateAt!,
+ updatedAt: updatedAt || updateAt || new Date(), // Provide a default value if both are undefined

Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
updatedAt: updatedAt || updateAt!,
updatedAt: updatedAt || updateAt || new Date(), // Provide a default value if both are undefined

Comment on lines 249 to 252
createdAt: session.createdAt.valueOf(),
group: session.group || SessionDefaultGroup.Default,
pinned: session.pinned ? 1 : 0,
updatedAt: session.updatedAt.valueOf(),
Copy link

Choose a reason for hiding this comment

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

Refactor to use optional chaining for date conversions.

- createdAt: session.createdAt.valueOf(),
- updatedAt: session.updatedAt.valueOf(),
+ createdAt: session.createdAt?.valueOf(),
+ updatedAt: session.updatedAt?.valueOf(),

- createdAt: new Date(session.createdAt),
- updatedAt: new Date(session.updatedAt),
+ createdAt: session.createdAt ? new Date(session.createdAt) : undefined,
+ updatedAt: session.updatedAt ? new Date(session.updatedAt) : undefined,

Also applies to: 259-262

Committable suggestion was skipped due low confidence.

Comment on lines +247 to +253
setChatConfig: (config) => {
const nextConfig = { ...get().config.chatConfig, ...config };

set({ config: { ...get().config, chatConfig: nextConfig } }, false, 'updateChatConfig');

get().onChatConfigChange?.(nextConfig);
},
Copy link

Choose a reason for hiding this comment

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

Refactor setChatConfig to improve readability and reduce complexity.

- const nextConfig = { ...get().config.chatConfig, ...config };
- set({ config: { ...get().config, chatConfig: nextConfig } }, false, 'updateChatConfig');
- get().onChatConfigChange?.(nextConfig);
+ const { config: currentConfig } = get();
+ const updatedChatConfig = { ...currentConfig.chatConfig, ...config };
+ set({ config: { ...currentConfig, chatConfig: updatedChatConfig } }, false, 'updateChatConfig');
+ get().onChatConfigChange?.(updatedChatConfig);

Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
setChatConfig: (config) => {
const nextConfig = { ...get().config.chatConfig, ...config };
set({ config: { ...get().config, chatConfig: nextConfig } }, false, 'updateChatConfig');
get().onChatConfigChange?.(nextConfig);
},
setChatConfig: (config) => {
const { config: currentConfig } = get();
const updatedChatConfig = { ...currentConfig.chatConfig, ...config };
set({ config: { ...currentConfig, chatConfig: updatedChatConfig } }, false, 'updateChatConfig');
get().onChatConfigChange?.(updatedChatConfig);
},

Comment on lines +16 to +17
let migrations;
let versionController: VersionController<any>;
Copy link

Choose a reason for hiding this comment

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

Specify types explicitly instead of using any to ensure type safety and better maintainability.

- let migrations;
- let versionController: VersionController<any>;
+ let migrations: Migration[];
+ let versionController: VersionController<MigrationData>;

Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
let migrations;
let versionController: VersionController<any>;
let migrations: Migration[];
let versionController: VersionController<MigrationData>;

Comment on lines +2 to +3

import { MigrationData, VersionController } from '@/migrations/VersionController';
Copy link

Choose a reason for hiding this comment

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

Since some imports are only used as types, consider using TypeScript's import type syntax to clarify their usage and potentially optimize bundling.

- import { MigrationData, VersionController } from '@/migrations/VersionController';
+ import type { MigrationData, VersionController } from '@/migrations/VersionController';

Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
import { MigrationData, VersionController } from '@/migrations/VersionController';
import type { MigrationData, VersionController } from '@/migrations/VersionController';

@@ -11,7 +11,7 @@ export const getMessageById = (messages: ChatMessage[], id: string) =>

const getSlicedMessagesWithConfig = (
messages: ChatMessage[],
config: LobeAgentConfig,
config: LobeAgentChatConfig,
Copy link

Choose a reason for hiding this comment

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

The implementation of getSlicedMessagesWithConfig correctly uses the new LobeAgentChatConfig. Consider optimizing the function to handle edge cases more efficiently.

-  if (!config.enableHistoryCount || !config.historyCount) return messages;
-  if (config.historyCount <= 0) return [];
+  if (!config.enableHistoryCount || config.historyCount <= 0) return [];

Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
config: LobeAgentChatConfig,
if (!config.enableHistoryCount || config.historyCount <= 0) return [];

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: 2

Outside diff range and nitpick comments (5)
src/store/agent/slices/chat/selectors.test.ts (1)

Line range hint 146-146: Specify a type instead of using any.

- const ttsVoice = agentSelectors.currentAgentTTSVoice(lang)(modifiedStore as any);
+ const ttsVoice = agentSelectors.currentAgentTTSVoice(lang)(modifiedStore as AgentStore);
src/database/client/models/session.ts (1)

Line range hint 1-1: Consider using type-only imports for type-only used imports.

- import { DeepPartial } from 'utility-types';
+ import type { DeepPartial } from 'utility-types';

- import { BaseModel } from '@/database/client/core';
+ import type { BaseModel } from '@/database/client/core';

- import { DBModel } from '@/database/client/core/types/db';
+ import type { DBModel } from '@/database/client/core/types/db';

- import { DB_Session, DB_SessionSchema } from '@/database/client/schemas/session';
+ import type { DB_Session, DB_SessionSchema } from '@/database/client/schemas/session';

- import { LobeAgentConfig } from '@/types/agent';
+ import type { LobeAgentConfig } from '@/types/agent';

Also applies to: 4-5, 5-6, 6-7, 7-14

src/store/agent/slices/chat/action.test.ts (1)

Line range hint 16-16: Specify a type instead of using any.

- vi.spyOn(agentSelectors, 'currentAgentConfig').mockReturnValue({ plugins: [] } as any);
+ vi.spyOn(agentSelectors, 'currentAgentConfig').mockReturnValue({ plugins: [] } as Partial<AgentConfig>);

- vi.spyOn(agentSelectors, 'currentAgentConfig').mockReturnValue({
+ vi.spyOn(agentSelectors, 'currentAgentConfig').mockReturnValue({
    plugins: [pluginId],
  } as Partial<AgentConfig>);

- vi.spyOn(agentSelectors, 'currentAgentConfig').mockReturnValue({ plugins: [] } as any);
+ vi.spyOn(agentSelectors, 'currentAgentConfig').mockReturnValue({ plugins: [] } as Partial<AgentConfig>);

- vi.spyOn(agentSelectors, 'currentAgentConfig').mockReturnValue({ plugins: [] } as any);
+ vi.spyOn(agentSelectors, 'currentAgentConfig').mockReturnValue({ plugins: [] } as Partial<AgentConfig>);

- vi.spyOn(agentSelectors, 'currentAgentConfig').mockReturnValue({
+ vi.spyOn(agentSelectors, 'currentAgentConfig').mockReturnValue({
    plugins: [pluginId],
  } as Partial<AgentConfig>);

- vi.spyOn(agentSelectors, 'currentAgentConfig').mockReturnValue({ plugins: [] } as any);
+ vi.spyOn(agentSelectors, 'currentAgentConfig').mockReturnValue({ plugins: [] } as Partial<AgentConfig>);

- vi.spyOn(agentSelectors, 'currentAgentConfig').mockReturnValue({ plugins: [] } as any);
+ vi.spyOn(agentSelectors, 'currentAgentConfig').mockReturnValue({ plugins: [] } as Partial<AgentConfig>);

- await result.current.internal_updateAgentConfig('test-session-id', { foo: 'bar' } as any);
+ await result.current.internal_updateAgentConfig('test-session-id', { foo: 'bar' } as Partial<AgentConfig>);

- useAgentStore.setState({ activeId: null } as any);
+ useAgentStore.setState({ activeId: null } as string | null);

Also applies to: 46-46, 67-67, 83-83, 151-151, 171-171, 191-191, 242-242, 296-296

src/store/chat/slices/message/action.test.ts (2)

Line range hint 51-51: Replace any type with more specific types to improve type safety.

- files: [{ id: 'file-id', url: 'file-url' }] as any
+ files: [{ id: 'file-id', url: 'file-url' }] as File[]

Also applies to: 362-362, 405-405, 478-478, 524-525, 542-542, 896-896, 1013-1013, 1040-1040, 1057-1057


Line range hint 3-4: Remove unused imports to clean up the code.

- import { act, renderHook, waitFor } from '@testing-library/react';
- import useSWR, { mutate } from 'swr';
- import { Mock, afterEach, beforeEach, describe, expect, it, vi } from 'vitest';

Also applies to: 16-17

Review Details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits Files that changed from the base of the PR and between dce34ad and 87391ad.
Files ignored due to path filters (2)
  • src/store/agent/slices/chat/__snapshots__/selectors.test.ts.snap is excluded by !**/*.snap
  • src/store/user/slices/settings/selectors/__snapshots__/settings.test.ts.snap is excluded by !**/*.snap
Files selected for processing (5)
  • src/database/client/models/session.ts (1 hunks)
  • src/store/agent/slices/chat/action.test.ts (3 hunks)
  • src/store/agent/slices/chat/selectors.test.ts (1 hunks)
  • src/store/chat/slices/message/action.test.ts (4 hunks)
  • src/store/session/slices/session/action.test.ts (3 hunks)
Additional Context Used
Biome (34)
src/database/client/models/session.ts (6)

104-104: Change to an optional chain.


1-1: All these imports are only used as types.


4-5: All these imports are only used as types.


5-6: Some named imports are only used as types.


6-7: All these imports are only used as types.


7-14: Some named imports are only used as types.

src/store/agent/slices/chat/action.test.ts (9)

16-16: Unexpected any. Specify a different type.


46-46: Unexpected any. Specify a different type.


67-67: Unexpected any. Specify a different type.


83-83: Unexpected any. Specify a different type.


151-151: Unexpected any. Specify a different type.


171-171: Unexpected any. Specify a different type.


191-191: Unexpected any. Specify a different type.


242-242: Unexpected any. Specify a different type.


296-296: Unexpected any. Specify a different type.

src/store/agent/slices/chat/selectors.test.ts (2)

146-146: Unexpected any. Specify a different type.


4-5: All these imports are only used as types.

src/store/chat/slices/message/action.test.ts (12)

51-51: Unexpected any. Specify a different type.


362-362: Unexpected any. Specify a different type.


405-405: Unexpected any. Specify a different type.


478-478: Unexpected any. Specify a different type.


524-525: Unexpected any. Specify a different type.


542-542: Unexpected any. Specify a different type.


896-896: Unexpected any. Specify a different type.


1013-1013: Unexpected any. Specify a different type.


1040-1040: Unexpected any. Specify a different type.


1057-1057: Unexpected any. Specify a different type.


3-4: Some named imports are only used as types.


16-17: All these imports are only used as types.

src/store/session/slices/session/action.test.ts (5)

71-71: This variable implicitly has the any type.


91-91: This variable implicitly has the any type.


202-202: Unexpected any. Specify a different type.


205-205: Unexpected any. Specify a different type.


219-219: Unexpected any. Specify a different type.

Additional comments not posted (5)
src/store/agent/slices/chat/selectors.test.ts (1)

4-5: Consider using type-only imports for type-only used imports.

- import { describe, expect, it } from 'vitest';
+ import type { describe, expect, it } from 'vitest';

Likely invalid or redundant comment.

src/store/chat/slices/message/action.test.ts (4)

7-7: Ensure the new DEFAULT_AGENT_CHAT_CONFIG is properly integrated and used in tests.


73-75: Good use of spies to mock currentAgentChatConfig for testing.


423-426: Ensure that the chatConfig settings are correctly applied in the test environment.


455-455: Verify that the autoCreateTopicThreshold and enableAutoCreateTopic are correctly mocked and used in tests.

Verification successful

The search results indicate that autoCreateTopicThreshold and enableAutoCreateTopic are indeed used in the test cases within src/store/chat/slices/message/action.test.ts. Here are some relevant lines from the output:

  • src/store/chat/slices/message/action.test.ts: it('should not auto-create topic if enableAutoCreateTopic is false', async () => {
  • src/store/chat/slices/message/action.test.ts: const autoCreateTopicThreshold = 5;
  • src/store/chat/slices/message/action.test.ts: const enableAutoCreateTopic = false;
  • src/store/chat/slices/message/action.test.ts: autoCreateTopicThreshold,
  • src/store/chat/slices/message/action.test.ts: enableAutoCreateTopic,
  • src/store/chat/slices/message/action.test.ts: { length: autoCreateTopicThreshold + 1 },
  • src/store/chat/slices/message/action.test.ts: it('should not auto-create topic if autoCreateTopicThreshold is not reached', async () => {
  • src/store/chat/slices/message/action.test.ts: const autoCreateTopicThreshold = 5;
  • src/store/chat/slices/message/action.test.ts: const enableAutoCreateTopic = true;
  • src/store/chat/slices/message/action.test.ts: autoCreateTopicThreshold,
  • src/store/chat/slices/message/action.test.ts: enableAutoCreateTopic,
  • src/store/chat/slices/message/action.test.ts: { length: autoCreateTopicThreshold - 3 },

These lines confirm that the autoCreateTopicThreshold and enableAutoCreateTopic settings are correctly mocked and used in the tests.

Scripts Executed

The following scripts were executed for the analysis:


Script:

#!/bin/bash
# Description: Verify that the autoCreateTopic settings are correctly used in tests.

# Test: Search for the usage of autoCreateTopic settings in test cases. Expect: Correct usage in relevant test cases.
rg --type python $'autoCreateTopicThreshold' $'enableAutoCreateTopic'

Length of output: 96



Script:

#!/bin/bash
# Description: Verify that the autoCreateTopic settings are correctly used in tests.

# Test: Search for the usage of autoCreateTopic settings in test cases. Expect: Correct usage in relevant test cases.
rg --type typescript 'autoCreateTopicThreshold|enableAutoCreateTopic'

Length of output: 106



Script:

#!/bin/bash
# Description: Verify that the autoCreateTopic settings are correctly used in tests.

# Test: Search for the usage of autoCreateTopic settings in test cases. Expect: Correct usage in relevant test cases.
rg --type ts 'autoCreateTopicThreshold|enableAutoCreateTopic'

Length of output: 5691

@@ -72,12 +69,14 @@ describe('SessionAction', () => {
let createdSessionId;

await act(async () => {
Copy link

Choose a reason for hiding this comment

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

Ensure proper typing to avoid implicit any type.

- let createdSessionId;
+ let createdSessionId: string;

- let createdSessionId;
+ let createdSessionId: string;

- const updateSessionMock = vi.spyOn(sessionService, 'updateSession');
+ const updateSessionMock: jest.SpyInstance = vi.spyOn(sessionService, 'updateSession');

- const refreshSessionsMock = vi.spyOn(result.current, 'refreshSessions');
+ const refreshSessionsMock: jest.SpyInstance = vi.spyOn(result.current, 'refreshSessions');

- vi.spyOn(sessionSelectors, 'currentSession').mockReturnValue(null as any);
+ vi.spyOn(sessionSelectors, 'currentSession').mockReturnValue(null as Session | null);

Also applies to: 91-91, 202-202, 205-205, 219-219

Committable suggestion was skipped due low confidence.

Comment on lines +249 to +252
createdAt: session.createdAt?.valueOf(),
group: session.group || SessionDefaultGroup.Default,
pinned: session.pinned ? 1 : 0,
updatedAt: session.updatedAt?.valueOf(),
Copy link

Choose a reason for hiding this comment

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

Use optional chaining for date conversions to handle potential undefined values.

- createdAt: session.createdAt?.valueOf(),
- updatedAt: session.updatedAt?.valueOf(),
+ createdAt: session.createdAt ? session.createdAt.valueOf() : undefined,
+ updatedAt: session.updatedAt ? session.updatedAt.valueOf() : undefined,

- createdAt: new Date(session.createdAt),
- updatedAt: new Date(session.updatedAt),
+ createdAt: session.createdAt ? new Date(session.createdAt) : undefined,
+ updatedAt: session.updatedAt ? new Date(session.updatedAt) : undefined,

Also applies to: 259-262

Committable suggestion was skipped due low confidence.

Copy link

codecov bot commented May 24, 2024

Codecov Report

Attention: Patch coverage is 89.19861% with 31 lines in your changes missing coverage. Please review.

Project coverage is 93.75%. Comparing base (1f70305) to head (00cad4a).
Report is 1089 commits behind head on main.

Files with missing lines Patch % Lines
src/store/agent/slices/chat/action.ts 60.78% 20 Missing โš ๏ธ
src/services/session/client.ts 61.11% 7 Missing โš ๏ธ
src/store/chat/slices/message/action.ts 78.94% 4 Missing โš ๏ธ
Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2646      +/-   ##
==========================================
+ Coverage   93.68%   93.75%   +0.07%     
==========================================
  Files         349      352       +3     
  Lines       20403    20434      +31     
  Branches     1576     2447     +871     
==========================================
+ Hits        19114    19158      +44     
+ Misses       1289     1276      -13     

โ˜” View full report in Codecov by Sentry.
๐Ÿ“ข Have feedback on the report? Share it here.

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: 3

Review Details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits Files that changed from the base of the PR and between 87391ad and 00cad4a.
Files ignored due to path filters (1)
  • public/apple-touch-icon.png is excluded by !**/*.png
Files selected for processing (6)
  • src/app/metadata.ts (1 hunks)
  • src/database/client/core/db.ts (4 hunks)
  • src/database/client/schemas/session.ts (2 hunks)
  • src/migrations/FromV5ToV6/index.ts (1 hunks)
  • src/migrations/FromV5ToV6/types/v6.ts (1 hunks)
  • vitest.config.ts (1 hunks)
Files skipped from review as they are similar to previous changes (1)
  • src/database/client/schemas/session.ts
Additional Context Used
Biome (19)
src/app/metadata.ts (1)

1-1: All these imports are only used as types.

src/database/client/core/db.ts (13)

116-116: This variable implicitly has the any type.


162-162: Unexpected any. Specify a different type.


192-192: Forbidden non-null assertion.


207-207: Unexpected any. Specify a different type.


1-1: Some named imports are only used as types.


6-7: All these imports are only used as types.


7-8: All these imports are only used as types.


8-9: All these imports are only used as types.


9-10: All these imports are only used as types.


10-11: All these imports are only used as types.


11-12: All these imports are only used as types.


12-13: All these imports are only used as types.


24-25: Some named imports are only used as types.

src/migrations/FromV5ToV6/index.ts (4)

55-55: Forbidden non-null assertion.


56-56: Forbidden non-null assertion.


2-3: All these imports are only used as types.


3-4: All these imports are only used as types.

src/migrations/FromV5ToV6/types/v6.ts (1)

1-1: All these imports are only used as types.

Additional comments not posted (2)
vitest.config.ts (1)

21-21: Verify the rationale for excluding src/database/client/core/db.ts from test coverage.

src/app/metadata.ts (1)

24-24: The updated icon paths are correct and align with the new directory structure.

@@ -0,0 +1,60 @@
import { FewShots, LLMParams } from '@/types/llm';
Copy link

Choose a reason for hiding this comment

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

Use import type for clarity since these imports are only used for type annotations.

- import { FewShots, LLMParams } from '@/types/llm';
+ import type { FewShots, LLMParams } from '@/types/llm';

Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
import { FewShots, LLMParams } from '@/types/llm';
import type { FewShots, LLMParams } from '@/types/llm';

Comment on lines +55 to +56
createdAt: createdAt || createAt!,
updatedAt: updatedAt || updateAt!,
Copy link

Choose a reason for hiding this comment

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

Avoid using non-null assertions as they can lead to runtime errors if assumptions are incorrect.

- createdAt: createdAt || createAt!,
- updatedAt: updatedAt || updateAt!,
+ createdAt: createdAt || createAt || new Date(), // Provide a default value if both are undefined
+ updatedAt: updatedAt || updateAt || new Date(), // Provide a default value if both are undefined

Committable suggestion

โ€ผ๏ธ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
createdAt: createdAt || createAt!,
updatedAt: updatedAt || updateAt!,
createdAt: createdAt || createAt || new Date(), // Provide a default value if both are undefined
updatedAt: updatedAt || updateAt || new Date(), // Provide a default value if both are undefined

const sessions = trans.table('sessions');
await sessions.toCollection().modify(async (session: DBModel<DB_Session>) => {
if (session.config)
session.config = MigrationAgentChatConfig.migrateChatConfig(session.config as any);
Copy link

Choose a reason for hiding this comment

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

Specify a more precise type instead of any to enhance type safety.

- session.config = MigrationAgentChatConfig.migrateChatConfig(session.config as any);
+ session.config = MigrationAgentChatConfig.migrateChatConfig(session.config as Partial<DB_Session>);

Committable suggestion was skipped due low confidence.

@arvinxx arvinxx merged commit 2f311dc into main May 25, 2024
9 of 10 checks passed
@arvinxx arvinxx deleted the refactor/chat-config branch May 25, 2024 02:09
@lobehubbot
Copy link
Member

โค๏ธ Great PR @arvinxx โค๏ธ

The growth of project is inseparable from user feedback and contribution, thanks for your contribution! If you are interesting with the lobehub developer community, please join our discord and then dm @arvinxx or @canisminor1990. They will invite you to our private developer channel. We are talking about the lobe-chat development or sharing ai newsletter around the world.
้กน็›ฎ็š„ๆˆ้•ฟ็ฆปไธๅผ€็”จๆˆทๅ้ฆˆๅ’Œ่ดก็Œฎ๏ผŒๆ„Ÿ่ฐขๆ‚จ็š„่ดก็Œฎ! ๅฆ‚ๆžœๆ‚จๅฏน LobeHub ๅผ€ๅ‘่€…็คพๅŒบๆ„Ÿๅ…ด่ถฃ๏ผŒ่ฏทๅŠ ๅ…ฅๆˆ‘ไปฌ็š„ discord๏ผŒ็„ถๅŽ็งไฟก @arvinxx ๆˆ– @canisminor1990ใ€‚ไป–ไปฌไผš้‚€่ฏทๆ‚จๅŠ ๅ…ฅๆˆ‘ไปฌ็š„็งๅฏ†ๅผ€ๅ‘่€…้ข‘้“ใ€‚ๆˆ‘ไปฌๅฐ†ไผš่ฎจ่ฎบๅ…ณไบŽ Lobe Chat ็š„ๅผ€ๅ‘๏ผŒๅˆ†ไบซๅ’Œ่ฎจ่ฎบๅ…จ็ƒ่Œƒๅ›ดๅ†…็š„ AI ๆถˆๆฏใ€‚

github-actions bot pushed a commit that referenced this pull request May 25, 2024
### [Version&nbsp;0.161.17](v0.161.16...v0.161.17)
<sup>Released on **2024-05-25**</sup>

#### โ™ป Code Refactoring

- **misc**: Migrate some agent config to `chatConfig`.

<br/>

<details>
<summary><kbd>Improvements and Fixes</kbd></summary>

#### Code refactoring

* **misc**: Migrate some agent config to `chatConfig`, closes [#2646](#2646) ([2f311dc](2f311dc))

</details>

<div align="right">

[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)

</div>
@lobehubbot
Copy link
Member

๐ŸŽ‰ This PR is included in version 0.161.17 ๐ŸŽ‰

The release is available on:

Your semantic-release bot ๐Ÿ“ฆ๐Ÿš€

github-actions bot pushed a commit to bentwnghk/lobe-chat that referenced this pull request May 25, 2024
### [Version&nbsp;1.41.9](v1.41.8...v1.41.9)
<sup>Released on **2024-05-25**</sup>

#### โ™ป Code Refactoring

- **misc**: Migrate some agent config to `chatConfig`.

#### ๐Ÿ› Bug Fixes

- **misc**: Fix bedrock show by default on vercel.

<br/>

<details>
<summary><kbd>Improvements and Fixes</kbd></summary>

#### Code refactoring

* **misc**: Migrate some agent config to `chatConfig`, closes [lobehub#2646](https://github.com/bentwnghk/lobe-chat/issues/2646) ([2f311dc](2f311dc))

#### What's fixed

* **misc**: Fix bedrock show by default on vercel, closes [lobehub#2634](https://github.com/bentwnghk/lobe-chat/issues/2634) ([7ad3af2](7ad3af2))

</details>

<div align="right">

[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)

</div>
ipoly pushed a commit to ipoly/lobe-chat that referenced this pull request Jul 29, 2024
* ๐Ÿ—ƒ๏ธ refactor: refactor the agent config to chat config

* โœ… test: fix test

* ๐Ÿ—ƒ๏ธ refactor: add db migration

* โœ… test: fix test
ipoly pushed a commit to ipoly/lobe-chat that referenced this pull request Jul 29, 2024
### [Version&nbsp;0.161.17](lobehub/lobe-chat@v0.161.16...v0.161.17)
<sup>Released on **2024-05-25**</sup>

#### โ™ป Code Refactoring

- **misc**: Migrate some agent config to `chatConfig`.

<br/>

<details>
<summary><kbd>Improvements and Fixes</kbd></summary>

#### Code refactoring

* **misc**: Migrate some agent config to `chatConfig`, closes [lobehub#2646](lobehub#2646) ([2f311dc](lobehub@2f311dc))

</details>

<div align="right">

[![](https://img.shields.io/badge/-BACK_TO_TOP-151515?style=flat-square)](#readme-top)

</div>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants