diff --git a/.env-template b/.env-template index c95de2adcc..1bc2c16cf3 100644 --- a/.env-template +++ b/.env-template @@ -13,6 +13,7 @@ WOLFRAM_ALPHA_APP_ID= # CORAL WEB NEXT_PUBLIC_HAS_CUSTOM_LOGO=false +NEXT_PUBLIC_DARK_MODE=false # DEPLOYMENTS # To use the Toolkit, at least one deployment must be setup, the simplest diff --git a/.github/workflows/slack_bot_tests.yml b/.github/workflows/slack_bot_tests.yml index c0ba1f27da..85986e1955 100644 --- a/.github/workflows/slack_bot_tests.yml +++ b/.github/workflows/slack_bot_tests.yml @@ -19,26 +19,21 @@ jobs: uses: actions/checkout@v3 with: fetch-depth: 2 - - uses: pnpm/action-setup@v4 - name: Install pnpm - with: - version: 9 - run_install: false - name: Install Node.js uses: actions/setup-node@v4 with: node-version-file: "src/interfaces/slack_bot/.nvmrc" - cache: "pnpm" - cache-dependency-path: "src/interfaces/slack_bot/pnpm-lock.yaml" + cache: "npm" + cache-dependency-path: "src/interfaces/slack_bot/package-lock.json" - name: Install dependencies with npm shell: bash working-directory: src/interfaces/slack_bot - run: pnpm install --frozen-lockfile + run: npm ci - name: Check slack_bot is formatted - run: pnpm run format + run: npm run format - name: Check slack_bot types - run: pnpm run tsc:check + run: npm run tsc:check - name: Run slack_bot tests - run: pnpm run test + run: npm run test - name: Check slack_bot can build - run: pnpm run build + run: npm run build diff --git a/CODEOWNERS b/CODEOWNERS index df68b7195a..e1092a4c28 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1 +1,2 @@ -* @cohere-ai/toolkit @EugeneLightsOn @malexw @scottmx81 @tianjing-li \ No newline at end of file +* @cohere-ai/toolkit @EugeneLightsOn @malexw @scottmx81 @tianjing-li +src/interfaces/coral_web @tomtobac @abimacarmes @knajjars @misspia-cohere \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index fd9172f06b..b1c3d78440 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -91,6 +91,7 @@ services: NEXT_PUBLIC_FRONTEND_HOSTNAME: ${NEXT_PUBLIC_FRONTEND_HOSTNAME} NEXT_PUBLIC_GOOGLE_DRIVE_CLIENT_ID: ${NEXT_PUBLIC_GOOGLE_DRIVE_CLIENT_ID} NEXT_PUBLIC_GOOGLE_DRIVE_DEVELOPER_KEY: ${NEXT_PUBLIC_GOOGLE_DRIVE_DEVELOPER_KEY} + NEXT_PUBLIC_DARK_MODE: ${NEXT_PUBLIC_DARK_MODE} restart: always networks: - proxynet @@ -120,4 +121,4 @@ volumes: networks: proxynet: - name: custom_network \ No newline at end of file + name: custom_network diff --git a/docs/auth_guide.md b/docs/auth_guide.md index ec234928cd..38e64e7970 100644 --- a/docs/auth_guide.md +++ b/docs/auth_guide.md @@ -12,7 +12,7 @@ This is the current list of implemented Auth strategies: To enable one or more of these strategies, add them to the `ENABLED_AUTH_STRATEGIES` list in the `backend/config/auth.py` file, then add any required environment variables in your `.env` file, and generate a secret key to be used as the `AUTH_SECRET_KEY` environment variable. This is used to encode and decode your access tokens. -For the `AUTH_SECRET_KEY`, if you want to test auth functionality you can use any string value. +Regarding the `AUTH_SECRET_KEY` variable, if you want to test auth any string will suffice. For production use-cases, it is recommended to run the following python commands in a local CLI to generate a random key: ``` @@ -25,6 +25,14 @@ print(secrets.token_hex(32)) When configuring your OAuth apps, make sure to whitelist the Redirect URI to the frontend endpoint, it should look like `/auth/`. For example, your Redirect URI will be `http://localhost:4000/auth/google` if you're running the GoogleOAuth class locally. +## Enabling Proof of Key Code Exchange (PKCE) + +Many OIDC-compliant auth providers also implement PKCE for added protection. This involves generating `code_verifier` and `code_challenge` values in the frontend and using these values to validate that the same entity that initially logged in with the auth provider is the one requesting an access token from an authorization code. + +For more [details click here.](https://oauth.net/2/pkce/) + +To enable the additional PKCE auth flow, you will need to first ensure your auth provider is PKCE-compliant, then set the `PKCE_ENABLED` class attribute in your OIDCConnect auth strategy to `True`. + ## Implementing new Auth strategies To implement a new strategy, refer to the `backend/services/auth/strategies` folder. Auth strategies will need to inherit from one of two base classes, `BaseAuthenticationStrategy` or `BaseOAuthStrategy`. diff --git a/src/backend/alembic/versions/ed17f144f4bf_.py b/src/backend/alembic/versions/ed17f144f4bf_.py index 88931ee278..8dd8a7f055 100644 --- a/src/backend/alembic/versions/ed17f144f4bf_.py +++ b/src/backend/alembic/versions/ed17f144f4bf_.py @@ -1,8 +1,8 @@ """empty message Revision ID: ed17f144f4bf -Revises: 1acff4138b79 -Create Date: 2024-07-10 10:00:50.507812 +Revises: f077676dfd5d +Create Date: 2024-07-16 10:00:50.507812 """ @@ -15,7 +15,7 @@ # revision identifiers, used by Alembic. revision: str = "ed17f144f4bf" -down_revision: Union[str, None] = "1acff4138b79" +down_revision: Union[str, None] = "f077676dfd5d" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None diff --git a/src/backend/alembic/versions/1acff4138b79_.py b/src/backend/alembic/versions/f077676dfd5d_.py similarity index 57% rename from src/backend/alembic/versions/1acff4138b79_.py rename to src/backend/alembic/versions/f077676dfd5d_.py index 2128f56c57..72e3219043 100644 --- a/src/backend/alembic/versions/1acff4138b79_.py +++ b/src/backend/alembic/versions/f077676dfd5d_.py @@ -1,8 +1,8 @@ """empty message -Revision ID: 1acff4138b79 +Revision ID: f077676dfd5d Revises: a48691a80366 -Create Date: 2024-07-09 15:27:44.022554 +Create Date: 2024-07-16 18:05:41.127076 """ @@ -12,7 +12,7 @@ from alembic import op # revision identifiers, used by Alembic. -revision: str = "1acff4138b79" +revision: str = "f077676dfd5d" down_revision: Union[str, None] = "a48691a80366" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None @@ -25,22 +25,45 @@ def upgrade() -> None: "user_id", existing_type=sa.TEXT(), type_=sa.String(), - existing_nullable=False, + nullable=True, ) op.alter_column( "agents", "user_id", existing_type=sa.TEXT(), type_=sa.String(), - existing_nullable=False, + nullable=True, ) op.alter_column( "tool_auth", "user_id", existing_type=sa.TEXT(), type_=sa.String(), - existing_nullable=False, + nullable=True, ) + op.alter_column("citations", "user_id", existing_type=sa.VARCHAR(), nullable=True) + op.alter_column( + "conversations", "user_id", existing_type=sa.VARCHAR(), nullable=True + ) + op.alter_column("documents", "user_id", existing_type=sa.VARCHAR(), nullable=True) + op.alter_column( + "documents", "conversation_id", existing_type=sa.VARCHAR(), nullable=True + ) + op.alter_column("files", "user_id", existing_type=sa.VARCHAR(), nullable=True) + op.alter_column( + "files", "conversation_id", existing_type=sa.VARCHAR(), nullable=True + ) + op.alter_column("messages", "user_id", existing_type=sa.VARCHAR(), nullable=True) + op.alter_column( + "messages", "conversation_id", existing_type=sa.VARCHAR(), nullable=True + ) + op.alter_column( + "snapshot_access", "user_id", existing_type=sa.VARCHAR(), nullable=True + ) + op.alter_column( + "snapshot_links", "user_id", existing_type=sa.VARCHAR(), nullable=True + ) + op.alter_column("snapshots", "user_id", existing_type=sa.VARCHAR(), nullable=True) op.drop_constraint( "documents_conversation_id_fkey", "documents", type_="foreignkey" @@ -118,30 +141,23 @@ def upgrade() -> None: def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### - op.drop_foreign_key( - "snapshot_conversation_id_user_id_fkey", "snapshots", type_="foreignkey" + op.drop_index("conversation_user_id_index", table_name="conversations") + op.drop_constraint("tool_auth_user_id_fkey", "tool_auth", type_="foreignkey") + op.drop_constraint( + "snapshot_links_user_id_fkey", "snapshot_links", type_="foreignkey" ) - op.drop_foreign_key(None, "tool_auth", "users", type_="foreignkey") - op.drop_foreign_key(None, "snapshot_links", "users", type_="foreignkey") - op.drop_foreign_key(None, "snapshot_access", "users", type_="foreignkey") - op.drop_foreign_key( - "message_conversation_id_user_id_fkey", "messages", type_="foreignkey" + op.drop_constraint( + "snapshot_access_user_id_fkey", "snapshot_access", type_="foreignkey" ) - op.drop_foreign_key( - "file_conversation_id_user_id_fkey", "files", type_="foreignkey" + op.drop_constraint( + "message_conversation_id_user_id_fkey", "messages", type_="foreignkey" ) - op.drop_foreign_key( + op.drop_constraint("file_conversation_id_user_id_fkey", "files", type_="foreignkey") + op.drop_constraint( "document_conversation_id_user_id_fkey", "documents", type_="foreignkey" ) - op.drop_foreign_key(None, "conversations", "users", type_="foreignkey") - op.drop_foreign_key(None, "citations", "users", type_="foreignkey") - op.drop_foreign_key(None, "agents", "users", type_="foreignkey") - op.drop_foreign_key(None, "agent_tool_metadata", "users", type_="foreignkey") - - op.drop_index("conversation_user_id_index", table_name="conversations") op.drop_constraint("conversations_pkey", "conversations", type_="primary") op.drop_constraint("conversation_id_user_id", "conversations", type_="unique") - op.create_primary_key("conversations_pkey", "conversations", ["id"]) op.create_foreign_key( "snapshots_conversation_id_fkey", @@ -175,26 +191,102 @@ def downgrade() -> None: ["id"], ondelete="CASCADE", ) - + op.alter_column( + "snapshots", + "user_id", + existing_type=sa.VARCHAR(), + type_=sa.String(), + nullable=False, + ) + op.alter_column( + "snapshot_links", + "user_id", + existing_type=sa.VARCHAR(), + type_=sa.String(), + nullable=False, + ) + op.alter_column( + "snapshot_access", + "user_id", + existing_type=sa.VARCHAR(), + type_=sa.String(), + nullable=False, + ) + op.alter_column( + "messages", + "conversation_id", + existing_type=sa.VARCHAR(), + type_=sa.String(), + nullable=False, + ) + op.alter_column( + "messages", + "user_id", + existing_type=sa.VARCHAR(), + type_=sa.String(), + nullable=False, + ) + op.alter_column( + "files", + "conversation_id", + existing_type=sa.VARCHAR(), + type_=sa.String(), + nullable=False, + ) + op.alter_column( + "files", + "user_id", + existing_type=sa.VARCHAR(), + type_=sa.String(), + nullable=False, + ) + op.alter_column( + "documents", + "conversation_id", + existing_type=sa.VARCHAR(), + type_=sa.String(), + nullable=False, + ) + op.alter_column( + "documents", + "user_id", + existing_type=sa.VARCHAR(), + type_=sa.String(), + nullable=False, + ) + op.alter_column( + "conversations", + "user_id", + existing_type=sa.VARCHAR(), + type_=sa.String(), + nullable=False, + ) + op.alter_column( + "citations", + "user_id", + existing_type=sa.VARCHAR(), + type_=sa.String(), + nullable=False, + ) op.alter_column( "tool_auth", "user_id", - existing_type=sa.String(), - type_=sa.TEXT(), - existing_nullable=False, + existing_type=sa.TEXT(), + type_=sa.String(), + nullable=False, ) op.alter_column( "agents", "user_id", - existing_type=sa.String(), - type_=sa.TEXT(), - existing_nullable=False, + existing_type=sa.TEXT(), + type_=sa.String(), + nullable=False, ) op.alter_column( "agent_tool_metadata", "user_id", - existing_type=sa.String(), - type_=sa.TEXT(), - existing_nullable=False, + existing_type=sa.TEXT(), + type_=sa.String(), + nullable=False, ) # ### end Alembic commands ### diff --git a/src/backend/config/routers.py b/src/backend/config/routers.py index 12ecb56b13..b9ccff9d19 100644 --- a/src/backend/config/routers.py +++ b/src/backend/config/routers.py @@ -21,6 +21,7 @@ class RouterName(StrEnum): TOOL = "tool" USER = "user" AGENT = "agent" + DEFAULT_AGENT = "default_agent" SNAPSHOT = "snapshot" @@ -102,6 +103,16 @@ class RouterName(StrEnum): # Depends(validate_authorization), ], }, + RouterName.DEFAULT_AGENT: { + "default": [ + Depends(get_session), + ], + "auth": [ + Depends(get_session), + # TODO: Add if the router's have to have authorization + # Depends(validate_authorization), + ], + }, RouterName.SNAPSHOT: { "default": [ Depends(get_session), diff --git a/src/backend/database_models/agent.py b/src/backend/database_models/agent.py index e45e101d4e..78f09996a8 100644 --- a/src/backend/database_models/agent.py +++ b/src/backend/database_models/agent.py @@ -29,7 +29,9 @@ class Agent(Base): nullable=False, ) - user_id: Mapped[str] = mapped_column(ForeignKey("users.id", ondelete="CASCADE")) + user_id: Mapped[str] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), nullable=True + ) organization_id: Mapped[Optional[str]] = mapped_column( ForeignKey( "organizations.id", name="agents_organization_id_fkey", ondelete="CASCADE" diff --git a/src/backend/database_models/agent_tool_metadata.py b/src/backend/database_models/agent_tool_metadata.py index d2814e655a..c2203858ab 100644 --- a/src/backend/database_models/agent_tool_metadata.py +++ b/src/backend/database_models/agent_tool_metadata.py @@ -10,7 +10,9 @@ class AgentToolMetadata(Base): __tablename__ = "agent_tool_metadata" - user_id: Mapped[str] = mapped_column(ForeignKey("users.id", ondelete="CASCADE")) + user_id: Mapped[str] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), nullable=True + ) agent_id: Mapped[str] = mapped_column( ForeignKey("agents.id", ondelete="CASCADE"), nullable=False ) diff --git a/src/backend/database_models/citation.py b/src/backend/database_models/citation.py index a9521c3a89..7c87c375c2 100644 --- a/src/backend/database_models/citation.py +++ b/src/backend/database_models/citation.py @@ -19,7 +19,9 @@ class Citation(Base): __tablename__ = "citations" text: Mapped[str] - user_id: Mapped[str] = mapped_column(ForeignKey("users.id", ondelete="CASCADE")) + user_id: Mapped[str] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), nullable=True + ) start: Mapped[int] end: Mapped[int] diff --git a/src/backend/database_models/document.py b/src/backend/database_models/document.py index 71ea025b00..3e1f5f7f77 100644 --- a/src/backend/database_models/document.py +++ b/src/backend/database_models/document.py @@ -8,13 +8,13 @@ class Document(Base): __tablename__ = "documents" text: Mapped[str] - user_id: Mapped[str] = mapped_column(String) + user_id: Mapped[str] = mapped_column(String, nullable=True) title: Mapped[str] = mapped_column(String, nullable=True) url: Mapped[str] = mapped_column(String, nullable=True) fields: Mapped[dict] = mapped_column(JSON, nullable=True) tool_name: Mapped[str] = mapped_column(String, nullable=True) - conversation_id: Mapped[str] = mapped_column(String) + conversation_id: Mapped[str] = mapped_column(String, nullable=True) message_id: Mapped[str] = mapped_column( ForeignKey("messages.id", ondelete="CASCADE") ) diff --git a/src/backend/database_models/file.py b/src/backend/database_models/file.py index fe84febfe9..6565d7b99f 100644 --- a/src/backend/database_models/file.py +++ b/src/backend/database_models/file.py @@ -7,11 +7,11 @@ class File(Base): __tablename__ = "files" - user_id: Mapped[str] = mapped_column(String) + user_id: Mapped[str] = mapped_column(String, nullable=True) message_id: Mapped[str] = mapped_column( ForeignKey("messages.id", ondelete="CASCADE"), nullable=True ) - conversation_id: Mapped[str] = mapped_column(String) + conversation_id: Mapped[str] = mapped_column(String, nullable=True) file_name: Mapped[str] file_path: Mapped[str] diff --git a/src/backend/database_models/message.py b/src/backend/database_models/message.py index 7188311315..30ae5a2b6b 100644 --- a/src/backend/database_models/message.py +++ b/src/backend/database_models/message.py @@ -25,8 +25,8 @@ class Message(Base): text: Mapped[str] - user_id: Mapped[str] = mapped_column(String) - conversation_id: Mapped[str] = mapped_column(String) + user_id: Mapped[str] = mapped_column(String, nullable=True) + conversation_id: Mapped[str] = mapped_column(String, nullable=True) position: Mapped[int] is_active: Mapped[bool] = mapped_column(Boolean, default=True) generation_id: Mapped[str] = mapped_column(String, nullable=True) diff --git a/src/backend/database_models/snapshot.py b/src/backend/database_models/snapshot.py index 447f28b510..0eba127cdd 100644 --- a/src/backend/database_models/snapshot.py +++ b/src/backend/database_models/snapshot.py @@ -10,7 +10,7 @@ class Snapshot(Base): __tablename__ = "snapshots" - user_id: Mapped[str] = mapped_column(String) + user_id: Mapped[str] = mapped_column(String, nullable=True) organization_id: Mapped[Optional[str]] = mapped_column( ForeignKey( "organizations.id", @@ -49,7 +49,9 @@ class SnapshotLink(Base): ForeignKey("snapshots.id", ondelete="CASCADE") ) - user_id: Mapped[str] = mapped_column(ForeignKey("users.id", ondelete="CASCADE")) + user_id: Mapped[str] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), nullable=True + ) __table_args__ = (Index("snapshot_link_snapshot_id", snapshot_id),) @@ -57,7 +59,9 @@ class SnapshotLink(Base): class SnapshotAccess(Base): __tablename__ = "snapshot_access" - user_id: Mapped[str] = mapped_column(ForeignKey("users.id", ondelete="CASCADE")) + user_id: Mapped[str] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), nullable=True + ) snapshot_id: Mapped[str] = mapped_column( ForeignKey("snapshots.id", ondelete="CASCADE") ) diff --git a/src/backend/database_models/tool_auth.py b/src/backend/database_models/tool_auth.py index 2948fa6c0e..6b3ce24505 100644 --- a/src/backend/database_models/tool_auth.py +++ b/src/backend/database_models/tool_auth.py @@ -7,7 +7,9 @@ class ToolAuth(Base): __tablename__ = "tool_auth" - user_id: Mapped[str] = mapped_column(ForeignKey("users.id", ondelete="CASCADE")) + user_id: Mapped[str] = mapped_column( + ForeignKey("users.id", ondelete="CASCADE"), nullable=True + ) tool_id: Mapped[str] = mapped_column(Text, nullable=False) token_type: Mapped[str] = mapped_column(Text, nullable=False) encrypted_access_token: Mapped[bytes] = mapped_column() diff --git a/src/backend/main.py b/src/backend/main.py index d5bb3cbf14..6a53ac4a19 100644 --- a/src/backend/main.py +++ b/src/backend/main.py @@ -13,6 +13,7 @@ is_authentication_enabled, ) from backend.config.routers import ROUTER_DEPENDENCIES +from backend.routers.agent import default_agent_router from backend.routers.agent import router as agent_router from backend.routers.auth import router as auth_router from backend.routers.chat import router as chat_router @@ -45,6 +46,7 @@ def create_app(): deployment_router, experimental_feature_router, agent_router, + default_agent_router, snapshot_router, ] diff --git a/src/backend/routers/agent.py b/src/backend/routers/agent.py index 8a44ad07a7..d33b2e98da 100644 --- a/src/backend/routers/agent.py +++ b/src/backend/routers/agent.py @@ -11,6 +11,7 @@ from backend.routers.utils import ( add_agent_to_request_state, add_agent_tool_metadata_to_request_state, + add_default_agent_to_request_state, add_event_type_to_request_state, add_session_user_to_request_state, ) @@ -26,7 +27,7 @@ UpdateAgent, UpdateAgentToolMetadata, ) -from backend.schemas.metrics import MetricsMessageType +from backend.schemas.metrics import GenericResponseMessage, MetricsMessageType from backend.services.agent import ( raise_db_error, validate_agent_exists, @@ -120,6 +121,20 @@ async def list_agents( raise HTTPException(status_code=500, detail=str(e)) +# simply for logging purposes +default_agent_router = APIRouter( + prefix="/v1/default_agent", +) +default_agent_router.name = RouterName.DEFAULT_AGENT + + +@default_agent_router.get("/", response_model=GenericResponseMessage) +async def get_default_agent(session: DBSessionDep, request: Request): + add_event_type_to_request_state(request, MetricsMessageType.ASSISTANT_ACCESSED) + add_default_agent_to_request_state(request) + return {"message": "OK"} + + @router.get("/{agent_id}", response_model=Agent) async def get_agent_by_id( agent_id: str, session: DBSessionDep, request: Request diff --git a/src/backend/routers/utils.py b/src/backend/routers/utils.py index 9e85cd87c0..3907c502bc 100644 --- a/src/backend/routers/utils.py +++ b/src/backend/routers/utils.py @@ -7,11 +7,26 @@ from backend.schemas.metrics import MetricsAgent, MetricsMessageType, MetricsUser from backend.services.auth.utils import get_header_user_id +DEFAULT_METRICS_AGENT = MetricsAgent( + id="9c300cfd-1506-408b-829d-a6464137a7c1", + version="1", + name="Default Agent", + temperature=0.3, + model="command-r-plus", + deployment="Cohere", + preamble="", + description="default", +) + def add_event_type_to_request_state(request: Request, event_type: MetricsMessageType): request.state.event_type = event_type +def add_default_agent_to_request_state(request: Request): + request.state.agent = DEFAULT_METRICS_AGENT + + def add_agent_to_request_state(request: Request, agent: Agent): request.state.agent = MetricsAgent( id=agent.id, diff --git a/src/backend/schemas/metrics.py b/src/backend/schemas/metrics.py index 4a586bf66a..d9fd3f8b01 100644 --- a/src/backend/schemas/metrics.py +++ b/src/backend/schemas/metrics.py @@ -6,6 +6,10 @@ from pydantic import BaseModel +class GenericResponseMessage(BaseModel): + message: str + + class MetricsMessageType(str, Enum): # users: implemented, has tests USER_CREATED = "user_created" diff --git a/src/backend/services/auth/jwt.py b/src/backend/services/auth/jwt.py index 796846f7f0..ea878f09e1 100644 --- a/src/backend/services/auth/jwt.py +++ b/src/backend/services/auth/jwt.py @@ -12,7 +12,7 @@ class JWTService: ISSUER = "cohere-toolkit" - EXPIRY_HOURS = 12 + EXPIRY_DAYS = 90 ALGORITHM = "HS256" def __init__(self): @@ -39,7 +39,7 @@ def create_and_encode_jwt(self, user: dict) -> str: payload = { "iss": self.ISSUER, "iat": now, - "exp": now + datetime.timedelta(hours=self.EXPIRY_HOURS), + "exp": now + datetime.timedelta(days=self.EXPIRY_DAYS), "jti": str(uuid.uuid4()), "context": user, } diff --git a/src/backend/services/metrics.py b/src/backend/services/metrics.py index ac1d928545..45cc2c35ae 100644 --- a/src/backend/services/metrics.py +++ b/src/backend/services/metrics.py @@ -75,7 +75,7 @@ def get_event_data( try: user_id = get_header_user_id(request) except: - logger.warning(f"Failed to get user id - {endpoint_name}") + logger.warning(f"Failed to get user id from headers") return None agent = self.get_agent(request) diff --git a/src/backend/tests/crud/test_agent.py b/src/backend/tests/crud/test_agent.py index 1f2df7ae59..bf001d2126 100644 --- a/src/backend/tests/crud/test_agent.py +++ b/src/backend/tests/crud/test_agent.py @@ -98,17 +98,6 @@ def test_create_agent_missing_model(session, user): _ = agent_crud.create_agent(session, agent_data) -def test_create_agent_missing_user_id(session): - agent_data = Agent( - name="test", - model="command-r-plus", - deployment=ModelDeploymentName.CoherePlatform, - ) - - with pytest.raises(IntegrityError): - _ = agent_crud.create_agent(session, agent_data) - - def test_create_agent_duplicate_name_version(session, user): _ = get_factory("Agent", session).create( id="1", user_id=user.id, name="test_agent", version=1 diff --git a/src/backend/tests/crud/test_agent_tool_metadata.py b/src/backend/tests/crud/test_agent_tool_metadata.py index 6d0f857c58..5eb33fd4a4 100644 --- a/src/backend/tests/crud/test_agent_tool_metadata.py +++ b/src/backend/tests/crud/test_agent_tool_metadata.py @@ -81,22 +81,6 @@ def test_create_agent_missing_tool_name(session, user): ) -def test_create_agent_missing_user_id(session, user): - agent = get_factory("Agent", session).create( - id="1", name="test_agent", tools=[ToolName.Google_Drive], user_id=user.id - ) - - agent_tool_metadata_data = AgentToolMetadata( - agent_id=agent.id, - tool_name=ToolName.Google_Drive, - artifacts=[mock_artifact_1], - ) - with pytest.raises(IntegrityError): - _ = agent_tool_metadata_crud.create_agent_tool_metadata( - session, agent_tool_metadata_data - ) - - def test_update_agent_tool_metadata(session, user): agent = get_factory("Agent", session).create(user_id=user.id) original_agent_tool_metadata = get_factory("AgentToolMetadata", session).create( diff --git a/src/backend/tests/routers/auth/test_authorization_header.py b/src/backend/tests/routers/auth/test_authorization_header.py index e76da48320..dcb6a45f5a 100644 --- a/src/backend/tests/routers/auth/test_authorization_header.py +++ b/src/backend/tests/routers/auth/test_authorization_header.py @@ -67,7 +67,7 @@ def test_validate_authorization_invalid_token(): def test_validate_authorization_expired_token(): user = {"user_id": "test"} - with freezegun.freeze_time("2024-01-01 00:00:00"): + with freezegun.freeze_time("2023-01-01 00:00:00"): token = JWTService().create_and_encode_jwt(user) request_mock = MagicMock(headers={"Authorization": f"Bearer {token}"}) diff --git a/src/backend/tests/routers/test_agent.py b/src/backend/tests/routers/test_agent.py index d9a58488c4..e612e1f2c3 100644 --- a/src/backend/tests/routers/test_agent.py +++ b/src/backend/tests/routers/test_agent.py @@ -363,6 +363,24 @@ async def test_get_agent_mertic( assert m_args.assistant.name == agent.name +@pytest.mark.asyncio +async def test_get_default_agent_mertic( + session_client: TestClient, session: Session, user +) -> None: + + with patch( + "backend.services.metrics.report_metrics", + return_value=None, + ) as mock_metrics: + response = session_client.get( + f"/v1/default_agent", headers={"User-Id": user.id} + ) + assert response.status_code == 200 + m_args: MetricsData = mock_metrics.await_args.args[0].signal + assert m_args.message_type == MetricsMessageType.ASSISTANT_ACCESSED + assert m_args.assistant.name == "Default Agent" + + def test_get_agent(session_client: TestClient, session: Session, user) -> None: agent = get_factory("Agent", session).create(name="test agent") agent_tool_metadata = get_factory("AgentToolMetadata", session).create( diff --git a/src/interfaces/coral_web/.env.development b/src/interfaces/coral_web/.env.development index 214ab70a42..10450a0484 100644 --- a/src/interfaces/coral_web/.env.development +++ b/src/interfaces/coral_web/.env.development @@ -3,4 +3,5 @@ NEXT_PUBLIC_API_HOSTNAME=http://localhost:8000 NEXT_PUBLIC_FRONTEND_HOSTNAME=http://localhost:4000 NEXT_PUBLIC_HAS_CUSTOM_LOGO=false NEXT_PUBLIC_GOOGLE_DRIVE_CLIENT_ID='client-id' -NEXT_PUBLIC_GOOGLE_DRIVE_DEVELOPER_KEY='developer-key' \ No newline at end of file +NEXT_PUBLIC_GOOGLE_DRIVE_DEVELOPER_KEY='developer-key' +NEXT_PUBLIC_DARK_MODE=false \ No newline at end of file diff --git a/src/interfaces/coral_web/.env.production b/src/interfaces/coral_web/.env.production index 214ab70a42..10450a0484 100644 --- a/src/interfaces/coral_web/.env.production +++ b/src/interfaces/coral_web/.env.production @@ -3,4 +3,5 @@ NEXT_PUBLIC_API_HOSTNAME=http://localhost:8000 NEXT_PUBLIC_FRONTEND_HOSTNAME=http://localhost:4000 NEXT_PUBLIC_HAS_CUSTOM_LOGO=false NEXT_PUBLIC_GOOGLE_DRIVE_CLIENT_ID='client-id' -NEXT_PUBLIC_GOOGLE_DRIVE_DEVELOPER_KEY='developer-key' \ No newline at end of file +NEXT_PUBLIC_GOOGLE_DRIVE_DEVELOPER_KEY='developer-key' +NEXT_PUBLIC_DARK_MODE=false \ No newline at end of file diff --git a/src/interfaces/coral_web/src/assets/lotties/icon-loop-coral-500.json b/src/interfaces/coral_web/src/assets/lotties/icon-loop-coral-500.json deleted file mode 100644 index 7b5a889d51..0000000000 --- a/src/interfaces/coral_web/src/assets/lotties/icon-loop-coral-500.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.9.0","fr":30,"ip":0,"op":90,"w":1400,"h":1400,"nm":"Coral_Icon_v3_Loop","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 4/Coral_Icon_Vector_3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[700,700,0],"ix":2,"l":2},"a":{"a":0,"k":[700,700,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[1,0.466666668653,0.349019616842,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.001,46.336],[0,0],[-52.881,-52.758],[0,0],[62.481,0],[0,0]],"o":[[0,0],[0.001,-74.698],[0,0],[44.232,44.129],[0,0],[-46.336,0]],"v":[[-159.593,68.08],[-159.591,-39.827],[-16.438,-99.22],[115.362,32.275],[65.861,151.979],[-75.695,151.979]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.466666696586,0.349019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[399.763,1016.563],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":81,"op":124,"st":81,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Layer 3/Coral_Icon_Vector_3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[700,700,0],"ix":2,"l":2},"a":{"a":0,"k":[700,700,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[1,0.466666668653,0.349019616842,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.001,-101.737],[0,0],[81.307,81.138],[0,0],[0.009,73.32],[0,0],[-101.744,0],[0,0]],"o":[[0,0],[-0.002,114.866],[0,0],[-51.899,-51.791],[0,0],[-0.012,-101.745],[0,0],[101.737,0]],"v":[[229.967,-196.262],[230.392,208.021],[10.259,299.335],[-148.854,140.554],[-229.931,-54.862],[-230.379,-196.242],[-46.171,-380.474],[45.759,-380.474]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.466666696586,0.349019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[430.687,578.822],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":85,"op":126,"st":85,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 2/Coral_Icon_Vector_3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[700,700,0],"ix":2,"l":2},"a":{"a":0,"k":[700,700,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[1,0.466666668653,0.349019616842,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[93.23,0.005],[0,0],[-0.626,93.457],[0,0],[-53.816,53.941],[0,0],[0,-112.917],[0,0]],"o":[[0,0],[-93.459,-0.005],[0,0],[0.51,-76.194],[0,0],[79.752,-79.938],[0,0],[0,93.23]],"v":[[63.634,373.411],[-63.032,373.404],[-231.82,203.473],[-230.942,72.249],[-146.168,-130.823],[16.109,-293.477],[232.445,-204.016],[232.445,204.609]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.466666696586,0.349019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[974.396,832.325],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":76,"op":121,"st":76,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 2/Coral_Icon_Vector_3 Outlines","sr":0.8,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[700,700,0],"ix":2,"l":2},"a":{"a":0,"k":[700,700,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":52,"s":[{"i":[[21.97,-0.146],[0,0],[0.924,7.703],[0,0],[-16.228,-0.001],[0,0],[-0.537,-11.829],[0,0]],"o":[[0,0],[-30.364,-0.228],[0,0],[0.987,-18.074],[0,0],[23.995,0.153],[0,0],[0.213,13.135]],"v":[[-34.365,372.821],[-64.032,373.404],[-99.82,356.973],[-99.383,349.249],[-66.168,329.677],[-34.641,330.273],[1.141,348.504],[0.891,355.04]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":60,"s":[{"i":[[58.97,0.854],[0,0],[-0.626,93.457],[0,0],[-77.228,0.499],[0,0],[-0.287,-64.329],[0,0]],"o":[[0,0],[-93.459,-0.005],[0,0],[2.487,-37.574],[0,0],[73.495,2.153],[0,0],[-2.287,72.635]],"v":[[-34.365,372.821],[-64.032,373.404],[-231.82,203.473],[-232.883,186.249],[-135.168,135.177],[-22.891,135.523],[68.891,231.004],[68.891,275.04]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":76,"s":[{"i":[[93.23,0.005],[0,0],[-0.626,93.457],[0,0],[-53.816,53.941],[0,0],[0,-112.917],[0,0]],"o":[[0,0],[-93.459,-0.005],[0,0],[0.51,-76.194],[0,0],[79.752,-79.938],[0,0],[0,93.23]],"v":[[63.634,373.411],[-63.032,373.404],[-231.82,203.473],[-230.942,72.249],[-146.168,-130.823],[16.109,-293.477],[232.445,-204.016],[232.445,204.609]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":95.2,"s":[{"i":[[31.003,-0.194],[0,0],[17.524,13.194],[1.486,9.042],[-22.263,21.654],[-25.488,17.774],[-33.066,-43.687],[0.808,-9.043]],"o":[[0,0],[-20.082,0.017],[-9.226,-8.306],[-1.437,-22.415],[0,0],[70.262,-40.476],[22.434,31.813],[0.765,41.549]],"v":[[117.784,-176.107],[40.368,-175.657],[-30.17,-186.519],[-45.166,-209.992],[-11.133,-266.229],[37.592,-311.348],[208.295,-279.012],[232.214,-210.373]],"c":true}]},{"t":99.2,"s":[{"i":[[18.039,-0.235],[0,0],[11.007,0.797],[1.796,10.926],[-16.478,4.499],[-8.998,0.406],[-8.091,-2.308],[0.977,-10.927]],"o":[[0,0],[-4.795,0.022],[-11.007,-0.797],[-1.843,-11.212],[0,0],[13.245,-0.597],[16.884,4.816],[-0.9,10.066]],"v":[[129.065,-290.589],[111.149,-290.346],[87.361,-291.027],[61.808,-306.25],[79.832,-328.573],[98.859,-330.477],[135.445,-328.017],[158.004,-305.891]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.466666668653,0.349019616842,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[974.396,832.325],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":52,"op":76,"st":28,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 3/Coral_Icon_Vector_3 Outlines","sr":0.8,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[700,700,0],"ix":2,"l":2},"a":{"a":0,"k":[700,700,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":61,"s":[{"i":[[7.378,-10.061],[13.172,-8.594],[12.304,-1.908],[3.666,10.373],[-9.382,6.789],[0,0],[-7.517,2.651],[0,0]],"o":[[-5.074,6.918],[-15.834,10.331],[0,0],[-3.424,-9.688],[0,0],[6.817,-3.831],[8.382,-2.957],[13.304,-2.849]],"v":[[197.685,294.738],[175.141,314.521],[127.759,334.335],[109.147,328.054],[120.945,306.388],[139.246,294.759],[166.58,282.026],[184.009,277.026]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":69,"s":[{"i":[[-0.133,-34.394],[0.755,-28.344],[90.72,76.009],[2.444,6.916],[-0.173,37.706],[0,0],[-31.85,-0.515],[0,0]],"o":[[-0.133,22.606],[-13.745,95.656],[0,0],[-19.582,-23.722],[0,0],[1.776,-38.414],[46.15,-0.515],[34.388,0.318]],"v":[[230.446,142.072],[230.058,221.522],[15.593,304.169],[-47.853,241.554],[-68.014,165.472],[-67.963,148.092],[-16.837,93.193],[176.425,93.36]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":85,"s":[{"i":[[0.001,-101.737],[0,0],[80.946,78.158],[0,0],[0.009,73.32],[0,0],[-101.744,0],[0,0]],"o":[[0,0],[-0.002,114.866],[-80.946,-78.158],[-51.899,-51.791],[0,0],[-0.012,-101.745],[0,0],[101.737,0]],"v":[[229.967,-196.262],[230.392,208.021],[10.259,299.335],[-148.854,140.554],[-229.931,-54.862],[-230.379,-196.242],[-46.171,-380.474],[45.759,-380.474]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":94,"s":[{"i":[[-8.093,-82.751],[0,0],[52.009,17.901],[43.655,16.093],[1.233,62.146],[-13.019,38.061],[-72.367,1.029],[0,0]],"o":[[0,0],[1.885,64.729],[-72.991,-19.099],[-43.655,-16.093],[0,0],[26.981,-60.939],[0,0],[99.228,-0.293]],"v":[[225.453,-224.873],[227.314,-22.304],[107.304,34.277],[-165.032,-43.729],[-230.92,-165.969],[-217.668,-265.884],[-55.39,-378.919],[41.527,-380.87]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":102.6,"s":[{"i":[[-15.827,-64.609],[0,0],[24.778,0.428],[0,0],[-8.377,29.226],[-19.221,23.919],[-44.296,2.011],[0,0]],"o":[[0,0],[3.689,16.82],[0,0],[-30.696,-1.911],[0,0],[21.279,-24.581],[0,0],[96.83,-0.573]],"v":[[221.14,-252.213],[224.374,-242.392],[200.035,-219.001],[-180.491,-219.822],[-212.31,-276.048],[-185.966,-318.742],[-64.199,-377.433],[37.483,-381.249]],"c":true}]},{"t":108.2,"s":[{"i":[[-0.154,-11.311],[0,0],[27.804,-0.908],[0,0],[0.494,9.789],[-13.943,6.331],[-26.016,2.651],[0,0]],"o":[[0,0],[-0.078,9.656],[0,0],[-16.333,0.123],[0,0],[13.943,-6.331],[0,0],[22.555,0.125]],"v":[[-11.033,-366.762],[-10.859,-354.728],[-44.741,-334.164],[-99.604,-333.946],[-136.181,-347.862],[-124.379,-362.992],[-67.421,-379.224],[-44.241,-380.697]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.466666668653,0.349019616842,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[431.132,579.619],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":61,"op":85,"st":37,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 4/Coral_Icon_Vector_3 Outlines","sr":0.8,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[700,700,0],"ix":2,"l":2},"a":{"a":0,"k":[700,700,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":57,"s":[{"i":[[0.33,6.629],[0,0],[-10.326,-0.343],[0,0],[15.876,-0.27],[0,0]],"o":[[0,0],[0.078,-4.486],[0,0],[12.124,0.287],[0,0],[-7.818,0.23]],"v":[[36.906,143.308],[37.159,139.423],[51.313,132.53],[70.862,133.15],[70.61,151.957],[51.304,151.957]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":66.6,"s":[{"i":[[0.198,22.512],[0,0],[-27.348,-21.309],[0,0],[44.526,-1.529],[0,0]],"o":[[0,0],[0.047,-32.571],[0,0],[47.574,59.637],[0,0],[-23.225,0.138]],"v":[[-41.694,113.217],[-41.329,-32.277],[24.425,-60.17],[116.662,31.8],[68.711,151.966],[0.504,151.966]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":81,"s":[{"i":[[-0.001,46.336],[0,0],[-52.881,-52.758],[0,0],[62.481,0],[0,0]],"o":[[0,0],[0.001,-74.698],[0,0],[44.232,44.129],[0,0],[-46.336,0]],"v":[[-159.593,68.08],[-159.591,-39.827],[-16.438,-99.22],[115.362,32.275],[65.861,151.979],[-75.695,151.979]],"c":true}]},{"t":104.2,"s":[{"i":[[10.581,-0.072],[-11.14,6.27],[-12.451,0.032],[0,0],[9.376,-0.042],[0,0]],"o":[[-15.67,0.107],[13.078,-7.361],[15.556,-0.04],[11.374,8.537],[0,0],[-14.943,0.083]],"v":[[-107.343,-99.67],[-115.091,-113.702],[-73.812,-123.595],[-39.887,-116.101],[-41.889,-100.021],[-64.446,-99.771]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.466666668653,0.349019616842,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[399.763,1016.563],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":57,"op":81,"st":33,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Layer 5/Coral_Icon_Vector_3 Outlines","sr":0.8,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[700,700,0],"ix":2,"l":2},"a":{"a":0,"k":[700,700,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":67,"s":[{"i":[[-20.05,-12.219],[0,0],[8.637,-7.103],[9.861,4.195],[6.178,4.726],[1.928,3.538]],"o":[[0,0],[16.931,6.552],[0,0],[-9.376,-3.989],[0,0],[-5.572,-11.712]],"v":[[-118.4,81.372],[-98.631,89.851],[-84.587,115.257],[-103.311,115.709],[-135.628,97.927],[-143.878,88.615]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":71.8,"s":[{"i":[[-24.497,-10.947],[0,0],[18.825,-19.889],[44.521,-0.841],[17.337,21.289],[8.979,27.5]],"o":[[0,0],[21.742,5.87],[0,0],[-45.479,-0.091],[0,0],[-4.993,-17.026]],"v":[[-128.898,20.084],[-70.365,38.429],[6.476,93.293],[-63.221,120.745],[-154.036,81.364],[-177.303,40.028]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":79.8,"s":[{"i":[[-45.067,-5.065],[0,0],[32.589,-33.319],[23.634,-16.337],[14.649,77.867],[0.425,19.864]],"o":[[0,0],[43.996,2.714],[0,0],[-59.444,38.718],[0,0],[0.425,-38.636]],"v":[[-96.151,-76.26],[13.912,-67.775],[76.635,22.677],[-9.334,105.241],[-179.099,29.787],[-181.875,-4.96]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":91,"s":[{"i":[[-62.813,0.009],[0,0],[44.464,-44.905],[0,0],[0,101.604],[0,0]],"o":[[0,0],[63.194,-0.009],[0,0],[-71.491,72.199],[0,0],[0,-62.812]],"v":[[-67.9,-159.378],[86.619,-159.398],[137.164,-38.243],[12.939,87.208],[-181.628,7.177],[-181.628,-45.634]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":109.4,"s":[{"i":[[-13.596,1.109],[-13.318,-4.849],[-0.502,-33.07],[0,0],[5.893,34.183],[0,0]],"o":[[15.151,-0.141],[42.926,16.151],[-0.75,33.673],[-20.947,17.569],[0,0],[-3.934,-30.768]],"v":[[64.406,-159.703],[105.373,-156.996],[157.551,-84.278],[130.395,-30.179],[60.919,-61.542],[52.745,-115.827]],"c":true}]},{"t":114.2,"s":[{"i":[[-4.325,1.594],[-6.819,-6.073],[-5.738,-14.603],[0,0],[3.928,4.601],[0,0]],"o":[[4.325,-1.594],[14.067,12.528],[2.26,5.752],[-7.764,3.32],[0,0],[-4.322,-4.587]],"v":[[113.725,-148.128],[130.119,-145.023],[153.414,-113.618],[150.314,-104.917],[132.372,-114.447],[113.872,-134.134]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.466666668653,0.349019616842,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[924.2,398.096],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":67,"op":91,"st":43,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Layer 2/Coral_Icon_Vector_3 Outlines 2","sr":0.8,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[700,700,0],"ix":2,"l":2},"a":{"a":0,"k":[700,700,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":5,"s":[{"i":[[21.97,-0.146],[0,0],[0.924,7.703],[0,0],[-16.228,-0.001],[0,0],[-0.537,-11.829],[0,0]],"o":[[0,0],[-30.364,-0.228],[0,0],[0.987,-18.074],[0,0],[23.995,0.153],[0,0],[0.213,13.135]],"v":[[-34.365,372.821],[-64.032,373.404],[-99.82,356.973],[-99.383,349.249],[-66.168,329.677],[-34.641,330.273],[1.141,348.504],[0.891,355.04]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[58.97,0.854],[0,0],[-0.626,93.457],[0,0],[-77.228,0.499],[0,0],[-0.287,-64.329],[0,0]],"o":[[0,0],[-93.459,-0.005],[0,0],[2.487,-37.574],[0,0],[73.495,2.153],[0,0],[-2.287,72.635]],"v":[[-34.365,372.821],[-64.032,373.404],[-231.82,203.473],[-232.883,186.249],[-135.168,135.177],[-22.891,135.523],[68.891,231.004],[68.891,275.04]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":29,"s":[{"i":[[93.23,0.005],[0,0],[-0.626,93.457],[0,0],[-53.816,53.941],[0,0],[0,-112.917],[0,0]],"o":[[0,0],[-93.459,-0.005],[0,0],[0.51,-76.194],[0,0],[79.752,-79.938],[0,0],[0,93.23]],"v":[[63.634,373.411],[-63.032,373.404],[-231.82,203.473],[-230.942,72.249],[-146.168,-130.823],[16.109,-293.477],[232.445,-204.016],[232.445,204.609]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":48.2,"s":[{"i":[[31.003,-0.194],[0,0],[17.524,13.194],[1.486,9.042],[-22.263,21.654],[-25.488,17.774],[-33.066,-43.687],[0.808,-9.043]],"o":[[0,0],[-20.082,0.017],[-9.226,-8.306],[-1.437,-22.415],[0,0],[70.262,-40.476],[22.434,31.813],[0.765,41.549]],"v":[[117.784,-176.107],[40.368,-175.657],[-30.17,-186.519],[-45.166,-209.992],[-11.133,-266.229],[37.592,-311.348],[208.295,-279.012],[232.214,-210.373]],"c":true}]},{"t":52.2,"s":[{"i":[[18.039,-0.235],[0,0],[11.007,0.797],[1.796,10.926],[-16.478,4.499],[-8.998,0.406],[-8.091,-2.308],[0.977,-10.927]],"o":[[0,0],[-4.795,0.022],[-11.007,-0.797],[-1.843,-11.212],[0,0],[13.245,-0.597],[16.884,4.816],[-0.9,10.066]],"v":[[129.065,-290.589],[111.149,-290.346],[87.361,-291.027],[61.808,-306.25],[79.832,-328.573],[98.859,-330.477],[135.445,-328.017],[158.004,-305.891]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.466666668653,0.349019616842,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[974.396,832.325],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":29,"op":53,"st":-19,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Layer 3/Coral_Icon_Vector_3 Outlines 2","sr":0.8,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[700,700,0],"ix":2,"l":2},"a":{"a":0,"k":[700,700,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[{"i":[[7.378,-10.061],[13.172,-8.594],[12.304,-1.908],[3.666,10.373],[-9.382,6.789],[0,0],[-7.517,2.651],[0,0]],"o":[[-5.074,6.918],[-15.834,10.331],[0,0],[-3.424,-9.688],[0,0],[6.817,-3.831],[8.382,-2.957],[13.304,-2.849]],"v":[[197.685,294.738],[175.141,314.521],[127.759,334.335],[109.147,328.054],[120.945,306.388],[139.246,294.759],[166.58,282.026],[184.009,277.026]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[{"i":[[-0.133,-34.394],[0.755,-28.344],[90.72,76.009],[2.444,6.916],[-0.173,37.706],[0,0],[-31.85,-0.515],[0,0]],"o":[[-0.133,22.606],[-13.745,95.656],[0,0],[-19.582,-23.722],[0,0],[1.776,-38.414],[46.15,-0.515],[34.388,0.318]],"v":[[230.446,142.072],[230.058,221.522],[15.593,304.169],[-47.853,241.554],[-68.014,165.472],[-67.963,148.092],[-16.837,93.193],[176.425,93.36]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[{"i":[[0.001,-101.737],[0,0],[80.946,78.158],[0,0],[0.009,73.32],[0,0],[-101.744,0],[0,0]],"o":[[0,0],[-0.002,114.866],[-80.946,-78.158],[-51.899,-51.791],[0,0],[-0.012,-101.745],[0,0],[101.737,0]],"v":[[229.967,-196.262],[230.392,208.021],[10.259,299.335],[-148.854,140.554],[-229.931,-54.862],[-230.379,-196.242],[-46.171,-380.474],[45.759,-380.474]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[{"i":[[-8.093,-82.751],[0,0],[52.009,17.901],[43.655,16.093],[1.233,62.146],[-13.019,38.061],[-72.367,1.029],[0,0]],"o":[[0,0],[1.885,64.729],[-72.991,-19.099],[-43.655,-16.093],[0,0],[26.981,-60.939],[0,0],[99.228,-0.293]],"v":[[225.453,-224.873],[227.314,-22.304],[107.304,34.277],[-165.032,-43.729],[-230.92,-165.969],[-217.668,-265.884],[-55.39,-378.919],[41.527,-380.87]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":54.6,"s":[{"i":[[-15.827,-64.609],[0,0],[24.778,0.428],[0,0],[-8.377,29.226],[-19.221,23.919],[-44.296,2.011],[0,0]],"o":[[0,0],[3.689,16.82],[0,0],[-30.696,-1.911],[0,0],[21.279,-24.581],[0,0],[96.83,-0.573]],"v":[[221.14,-252.213],[224.374,-242.392],[200.035,-219.001],[-180.491,-219.822],[-212.31,-276.048],[-185.966,-318.742],[-64.199,-377.433],[37.483,-381.249]],"c":true}]},{"t":60.2,"s":[{"i":[[-0.154,-11.311],[0,0],[27.804,-0.908],[0,0],[0.494,9.789],[-13.943,6.331],[-26.016,2.651],[0,0]],"o":[[0,0],[-0.078,9.656],[0,0],[-16.333,0.123],[0,0],[13.943,-6.331],[0,0],[22.555,0.125]],"v":[[-11.033,-366.762],[-10.859,-354.728],[-44.741,-334.164],[-99.604,-333.946],[-136.181,-347.862],[-124.379,-362.992],[-67.421,-379.224],[-44.241,-380.697]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.466666668653,0.349019616842,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[431.132,579.619],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":37,"op":61,"st":-11,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Layer 4/Coral_Icon_Vector_3 Outlines 2","sr":0.8,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[700,700,0],"ix":2,"l":2},"a":{"a":0,"k":[700,700,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":10,"s":[{"i":[[0.33,6.629],[0,0],[-10.326,-0.343],[0,0],[15.876,-0.27],[0,0]],"o":[[0,0],[0.078,-4.486],[0,0],[12.124,0.287],[0,0],[-7.818,0.23]],"v":[[36.906,143.308],[37.159,139.423],[51.313,132.53],[70.862,133.15],[70.61,151.957],[51.304,151.957]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":19.6,"s":[{"i":[[0.198,22.512],[0,0],[-27.348,-21.309],[0,0],[44.526,-1.529],[0,0]],"o":[[0,0],[0.047,-32.571],[0,0],[47.574,59.637],[0,0],[-23.225,0.138]],"v":[[-41.694,113.217],[-41.329,-32.277],[24.425,-60.17],[116.662,31.8],[68.711,151.966],[0.504,151.966]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.333,"y":0},"t":34,"s":[{"i":[[-0.001,46.336],[0,0],[-52.881,-52.758],[0,0],[62.481,0],[0,0]],"o":[[0,0],[0.001,-74.698],[0,0],[44.232,44.129],[0,0],[-46.336,0]],"v":[[-159.593,68.08],[-159.591,-39.827],[-16.438,-99.22],[115.362,32.275],[65.861,151.979],[-75.695,151.979]],"c":true}]},{"t":57.2,"s":[{"i":[[10.581,-0.072],[-11.14,6.27],[-12.451,0.032],[0,0],[9.376,-0.042],[0,0]],"o":[[-15.67,0.107],[13.078,-7.361],[15.556,-0.04],[11.374,8.537],[0,0],[-14.943,0.083]],"v":[[-107.343,-99.67],[-115.091,-113.702],[-73.812,-123.595],[-39.887,-116.101],[-41.889,-100.021],[-64.446,-99.771]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.466666668653,0.349019616842,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[399.763,1016.563],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":34,"op":58,"st":-14,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Layer 5/Coral_Icon_Vector_3 Outlines 2","sr":0.8,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[700,700,0],"ix":2,"l":2},"a":{"a":0,"k":[700,700,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":19,"s":[{"i":[[-20.05,-12.219],[0,0],[8.637,-7.103],[9.861,4.195],[6.178,4.726],[1.928,3.538]],"o":[[0,0],[16.931,6.552],[0,0],[-9.376,-3.989],[0,0],[-5.572,-11.712]],"v":[[-118.4,81.372],[-98.631,89.851],[-84.587,115.257],[-103.311,115.709],[-135.628,97.927],[-143.878,88.615]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23.8,"s":[{"i":[[-24.497,-10.947],[0,0],[18.825,-19.889],[44.521,-0.841],[17.337,21.289],[8.979,27.5]],"o":[[0,0],[21.742,5.87],[0,0],[-45.479,-0.091],[0,0],[-4.993,-17.026]],"v":[[-128.898,20.084],[-70.365,38.429],[6.476,93.293],[-63.221,120.745],[-154.036,81.364],[-177.303,40.028]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":31.8,"s":[{"i":[[-45.067,-5.065],[0,0],[32.589,-33.319],[23.634,-16.337],[14.649,77.867],[0.425,19.864]],"o":[[0,0],[43.996,2.714],[0,0],[-59.444,38.718],[0,0],[0.425,-38.636]],"v":[[-96.151,-76.26],[13.912,-67.775],[76.635,22.677],[-9.334,105.241],[-179.099,29.787],[-181.875,-4.96]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":43,"s":[{"i":[[-62.813,0.009],[0,0],[44.464,-44.905],[0,0],[0,101.604],[0,0]],"o":[[0,0],[63.194,-0.009],[0,0],[-71.491,72.199],[0,0],[0,-62.812]],"v":[[-67.9,-159.378],[86.619,-159.398],[137.164,-38.243],[12.939,87.208],[-181.628,7.177],[-181.628,-45.634]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":61.4,"s":[{"i":[[-13.596,1.109],[-13.318,-4.849],[-0.502,-33.07],[0,0],[5.893,34.183],[0,0]],"o":[[15.151,-0.141],[42.926,16.151],[-0.75,33.673],[-20.947,17.569],[0,0],[-3.934,-30.768]],"v":[[64.406,-159.703],[105.373,-156.996],[157.551,-84.278],[130.395,-30.179],[60.919,-61.542],[52.745,-115.827]],"c":true}]},{"t":66.2,"s":[{"i":[[-4.325,1.594],[-6.819,-6.073],[-5.738,-14.603],[0,0],[3.928,4.601],[0,0]],"o":[[4.325,-1.594],[14.067,12.528],[2.26,5.752],[-7.764,3.32],[0,0],[-4.322,-4.587]],"v":[[113.725,-148.128],[130.119,-145.023],[153.414,-113.618],[150.314,-104.917],[132.372,-114.447],[113.872,-134.134]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.466666668653,0.349019616842,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[924.2,398.096],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":43,"op":67,"st":-5,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Layer 2/Coral_Icon_Vector_3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[700,700,0],"ix":2,"l":2},"a":{"a":0,"k":[700,700,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[1,0.466666668653,0.349019616842,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[93.23,0.005],[0,0],[-0.626,93.457],[0,0],[-53.816,53.941],[0,0],[0,-112.917],[0,0]],"o":[[0,0],[-93.459,-0.005],[0,0],[0.51,-76.194],[0,0],[79.752,-79.938],[0,0],[0,93.23]],"v":[[63.634,373.411],[-63.032,373.404],[-231.82,203.473],[-230.942,72.249],[-146.168,-130.823],[16.109,-293.477],[232.445,-204.016],[232.445,204.609]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.466666696586,0.349019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[974.396,832.325],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-16,"op":29,"st":-16,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Layer 3/Coral_Icon_Vector_3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[700,700,0],"ix":2,"l":2},"a":{"a":0,"k":[700,700,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[1,0.466666668653,0.349019616842,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.001,-101.737],[0,0],[81.307,81.138],[0,0],[0.009,73.32],[0,0],[-101.744,0],[0,0]],"o":[[0,0],[-0.002,114.866],[0,0],[-51.899,-51.791],[0,0],[-0.012,-101.745],[0,0],[101.737,0]],"v":[[229.967,-196.262],[230.392,208.021],[10.259,299.335],[-148.854,140.554],[-229.931,-54.862],[-230.379,-196.242],[-46.171,-380.474],[45.759,-380.474]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.466666696586,0.349019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[430.687,578.822],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-4,"op":37,"st":-4,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Layer 4/Coral_Icon_Vector_3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[700,700,0],"ix":2,"l":2},"a":{"a":0,"k":[700,700,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[1,0.466666668653,0.349019616842,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.001,46.336],[0,0],[-52.881,-52.758],[0,0],[62.481,0],[0,0]],"o":[[0,0],[0.001,-74.698],[0,0],[44.232,44.129],[0,0],[-46.336,0]],"v":[[-159.593,68.08],[-159.591,-39.827],[-16.438,-99.22],[115.362,32.275],[65.861,151.979],[-75.695,151.979]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.466666696586,0.349019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[399.763,1016.563],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-9,"op":34,"st":-9,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Layer 5/Coral_Icon_Vector_3 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[700,700,0],"ix":2,"l":2},"a":{"a":0,"k":[700,700,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":0,"k":[1,0.466666668653,0.349019616842,1],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-62.813,0.009],[0,0],[44.464,-44.905],[0,0],[0,101.604],[0,0]],"o":[[0,0],[63.194,-0.009],[0,0],[-71.491,72.199],[0,0],[0,-62.812]],"v":[[-67.9,-159.378],[86.619,-159.398],[137.164,-38.243],[12.939,87.208],[-181.628,7.177],[-181.628,-45.634]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0.466666696586,0.349019607843,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[924.2,398.096],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":-4,"op":43,"st":-4,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/src/interfaces/coral_web/src/assets/lotties/icon-loop-coral-50.json b/src/interfaces/coral_web/src/assets/lotties/icon-loop-coral-950.json similarity index 100% rename from src/interfaces/coral_web/src/assets/lotties/icon-loop-coral-50.json rename to src/interfaces/coral_web/src/assets/lotties/icon-loop-coral-950.json diff --git a/src/interfaces/coral_web/src/cohere-client/client.ts b/src/interfaces/coral_web/src/cohere-client/client.ts index bdec2a4593..e7a1714429 100644 --- a/src/interfaces/coral_web/src/cohere-client/client.ts +++ b/src/interfaces/coral_web/src/cohere-client/client.ts @@ -266,6 +266,10 @@ export class CohereClient { return this.cohereService.default.getAgentByIdV1AgentsAgentIdGet({ agentId }); } + public getDefaultAgent() { + return this.cohereService.default.getDefaultAgentV1DefaultAgentGet(); + } + public createAgent(requestBody: CreateAgent) { return this.cohereService.default.createAgentV1AgentsPost({ requestBody }); } diff --git a/src/interfaces/coral_web/src/cohere-client/generated/schemas.gen.ts b/src/interfaces/coral_web/src/cohere-client/generated/schemas.gen.ts index e0cf9ee196..9d107ac38f 100644 --- a/src/interfaces/coral_web/src/cohere-client/generated/schemas.gen.ts +++ b/src/interfaces/coral_web/src/cohere-client/generated/schemas.gen.ts @@ -1391,6 +1391,18 @@ export const $GenerateTitle = { title: 'GenerateTitle', } as const; +export const $GenericResponseMessage = { + properties: { + message: { + type: 'string', + title: 'Message', + }, + }, + type: 'object', + required: ['message'], + title: 'GenericResponseMessage', +} as const; + export const $HTTPValidationError = { properties: { detail: { diff --git a/src/interfaces/coral_web/src/cohere-client/generated/services.gen.ts b/src/interfaces/coral_web/src/cohere-client/generated/services.gen.ts index 327547d147..34ec6ca4d8 100644 --- a/src/interfaces/coral_web/src/cohere-client/generated/services.gen.ts +++ b/src/interfaces/coral_web/src/cohere-client/generated/services.gen.ts @@ -39,6 +39,7 @@ import type { GetAgentByIdV1AgentsAgentIdGetResponse, GetConversationV1ConversationsConversationIdGetData, GetConversationV1ConversationsConversationIdGetResponse, + GetDefaultAgentV1DefaultAgentGetResponse, GetSnapshotV1SnapshotsLinkLinkIdGetData, GetSnapshotV1SnapshotsLinkLinkIdGetResponse, GetStrategiesV1AuthStrategiesGetResponse, @@ -1273,6 +1274,18 @@ export class DefaultService { }); } + /** + * Get Default Agent + * @returns GenericResponseMessage Successful Response + * @throws ApiError + */ + public getDefaultAgentV1DefaultAgentGet(): CancelablePromise { + return this.httpRequest.request({ + method: 'GET', + url: '/v1/default_agent/', + }); + } + /** * List Snapshots * List all snapshots. diff --git a/src/interfaces/coral_web/src/cohere-client/generated/types.gen.ts b/src/interfaces/coral_web/src/cohere-client/generated/types.gen.ts index 9c71823940..e40ab589b3 100644 --- a/src/interfaces/coral_web/src/cohere-client/generated/types.gen.ts +++ b/src/interfaces/coral_web/src/cohere-client/generated/types.gen.ts @@ -265,6 +265,10 @@ export type GenerateTitle = { title: string; }; +export type GenericResponseMessage = { + message: string; +}; + export type HTTPValidationError = { detail?: Array; }; @@ -843,6 +847,8 @@ export type DeleteAgentToolMetadataV1AgentsAgentIdToolMetadataAgentToolMetadataI export type DeleteAgentToolMetadataV1AgentsAgentIdToolMetadataAgentToolMetadataIdDeleteResponse = DeleteAgentToolMetadata; +export type GetDefaultAgentV1DefaultAgentGetResponse = GenericResponseMessage; + export type ListSnapshotsV1SnapshotsGetResponse = Array; export type CreateSnapshotV1SnapshotsPostData = { @@ -1387,6 +1393,16 @@ export type $OpenApiTs = { }; }; }; + '/v1/default_agent/': { + get: { + res: { + /** + * Successful Response + */ + 200: GenericResponseMessage; + }; + }; + }; '/v1/snapshots': { get: { res: { diff --git a/src/interfaces/coral_web/src/components/Agents/AgentCard.tsx b/src/interfaces/coral_web/src/components/Agents/AgentCard.tsx index 87c91818e8..abe7e5449c 100644 --- a/src/interfaces/coral_web/src/components/Agents/AgentCard.tsx +++ b/src/interfaces/coral_web/src/components/Agents/AgentCard.tsx @@ -32,10 +32,17 @@ type Props = { */ export const AgentCard: React.FC = ({ name, id, isBaseAgent, isExpanded }) => { const isTouchDevice = getIsTouchDevice(); - const { agentId } = useSlugRoutes(); + const { conversationId } = useSlugRoutes(); const router = useRouter(); - const isActive = isBaseAgent ? router.asPath === '/' && !agentId : agentId === id; + const route = router.asPath; + const isActive = isBaseAgent + ? conversationId + ? route === `/c/${conversationId}` + : route === '/' + : conversationId + ? route === `/a/${id}/c/${conversationId}` + : route === `/a/${id}`; const { open, close } = useContextStore(); const { removeRecentAgentId } = useRecentAgents(); @@ -80,9 +87,9 @@ export const AgentCard: React.FC = ({ name, id, isBaseAgent, isExpanded }
@@ -91,7 +98,7 @@ export const AgentCard: React.FC = ({ name, id, isBaseAgent, isExpanded } 'flex h-8 w-8 flex-shrink-0 items-center justify-center rounded duration-300', id && getCohereColor(id), { - 'bg-secondary-400': isBaseAgent, + 'bg-mushroom-700': isBaseAgent, } )} > diff --git a/src/interfaces/coral_web/src/components/Agents/AgentForm.tsx b/src/interfaces/coral_web/src/components/Agents/AgentForm.tsx index 1e69c19b3a..1e7c290b61 100644 --- a/src/interfaces/coral_web/src/components/Agents/AgentForm.tsx +++ b/src/interfaces/coral_web/src/components/Agents/AgentForm.tsx @@ -81,7 +81,7 @@ export function AgentForm - +