diff --git a/frontend/angular.json b/frontend/angular.json
index 9b369998..a82b93b8 100644
--- a/frontend/angular.json
+++ b/frontend/angular.json
@@ -56,7 +56,18 @@
"src/styles/styles.scss",
"src/styles/tailwind.scss"
],
- "scripts": []
+ "scripts": [
+ "node_modules/prismjs/prism.js",
+ "node_modules/prismjs/components/prism-csharp.min.js",
+ "node_modules/prismjs/components/prism-bash.min.js",
+ "node_modules/prismjs/components/prism-css.min.js",
+ "node_modules/prismjs/components/prism-hcl.min.js",
+ "node_modules/prismjs/components/prism-javascript.min.js",
+ "node_modules/prismjs/components/prism-json.min.js",
+ "node_modules/prismjs/components/prism-python.min.js",
+ "node_modules/prismjs/components/prism-typescript.min.js",
+ "node_modules/prismjs/components/prism-yaml.min.js"
+ ]
},
"configurations": {
"production": {
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 6c62a45a..2da3ff05 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -1,11 +1,11 @@
{
- "name": "fuse-angular",
+ "name": "@sophia/ui",
"version": "20.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "fuse-angular",
+ "name": "@sophia/ui",
"version": "20.0.0",
"license": "https://themeforest.net/licenses/standard",
"dependencies": {
@@ -26,10 +26,10 @@
"highlight.js": "11.9.0",
"lodash-es": "4.17.21",
"luxon": "3.4.4",
- "ng-apexcharts": "1.11.0",
"ngx-markdown": "^18.1.0",
"ngx-quill": "26.0.1",
"perfect-scrollbar": "1.5.5",
+ "prismjs": "^1.29.0",
"quill": "2.0.2",
"rxjs": "7.8.1",
"tslib": "2.6.2",
@@ -39,6 +39,7 @@
"@angular-devkit/build-angular": "18.0.2",
"@angular/cli": "18.0.2",
"@angular/compiler-cli": "18.0.1",
+ "@ngx-rocket/scripts": "^5.2.3",
"@tailwindcss/typography": "0.5.13",
"@types/chroma-js": "2.4.4",
"@types/crypto-js": "4.2.2",
@@ -4602,6 +4603,121 @@
"webpack": "^5.54.0"
}
},
+ "node_modules/@ngx-rocket/ascii-logo": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@ngx-rocket/ascii-logo/-/ascii-logo-1.1.0.tgz",
+ "integrity": "sha512-iGTX2tIAQmo/z2xiOsTAMxvO4wwHJkmutTzfJ+T/0Ebig54e1L2kgvctFRVHSj86UQUn8duzpuzcJJ4K4NK4jg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@ngx-rocket/scripts": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@ngx-rocket/scripts/-/scripts-5.2.3.tgz",
+ "integrity": "sha512-024H2U1H/07ISfkt/PMXOp3sl3+bWbncsjPVgxzU9eAAkNxkt56Z/Llzy46l6h2fsrGkjiGvUMFKGHWQawCgJg==",
+ "dev": true,
+ "dependencies": {
+ "@ngx-rocket/ascii-logo": "^1.1.0",
+ "chalk": "^4.1.0",
+ "fs-extra": "^10.0.0",
+ "lodash.get": "^4.4.2",
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "ngx-scripts": "bin/ngx-scripts"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@ngx-rocket/scripts/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@ngx-rocket/scripts/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/@ngx-rocket/scripts/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/@ngx-rocket/scripts/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/@ngx-rocket/scripts/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@ngx-rocket/scripts/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@ngx-rocket/scripts/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -11484,6 +11600,12 @@
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
"dev": true
},
+ "node_modules/lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
+ "dev": true
+ },
"node_modules/lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
@@ -12272,20 +12394,6 @@
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true
},
- "node_modules/ng-apexcharts": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/ng-apexcharts/-/ng-apexcharts-1.11.0.tgz",
- "integrity": "sha512-bzZ2qMYpJJ1V/Yfp9eC5y7BuxrlZx4fc9ev9pNHW8qEs5B0yE5yW25WrLhoGTYsfeFZfiADWeAmZkceEiihpFw==",
- "dependencies": {
- "tslib": "^2.0.0"
- },
- "peerDependencies": {
- "@angular/common": "^18.0.1",
- "@angular/core": "^18.0.1",
- "apexcharts": "^3.49.1",
- "rxjs": "^6.5.5 || ^7.4.0"
- }
- },
"node_modules/ngx-markdown": {
"version": "18.1.0",
"resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-18.1.0.tgz",
@@ -13702,7 +13810,6 @@
"version": "1.29.0",
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
"integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
- "optional": true,
"engines": {
"node": ">=6"
}
diff --git a/frontend/package.json b/frontend/package.json
index caa7619a..557c4987 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -35,10 +35,10 @@
"highlight.js": "11.9.0",
"lodash-es": "4.17.21",
"luxon": "3.4.4",
- "ng-apexcharts": "1.11.0",
"ngx-markdown": "^18.1.0",
"ngx-quill": "26.0.1",
"perfect-scrollbar": "1.5.5",
+ "prismjs": "^1.29.0",
"quill": "2.0.2",
"rxjs": "7.8.1",
"tslib": "2.6.2",
@@ -48,6 +48,7 @@
"@angular-devkit/build-angular": "18.0.2",
"@angular/cli": "18.0.2",
"@angular/compiler-cli": "18.0.1",
+ "@ngx-rocket/scripts": "^5.2.3",
"@tailwindcss/typography": "0.5.13",
"@types/chroma-js": "2.4.4",
"@types/crypto-js": "4.2.2",
@@ -75,4 +76,4 @@
"typescript": "5.4.5",
"typescript-eslint": "8.2.0"
}
-}
\ No newline at end of file
+}
diff --git a/frontend/public/images/splash.png b/frontend/public/images/splash.png
new file mode 100644
index 00000000..c74d1f63
Binary files /dev/null and b/frontend/public/images/splash.png differ
diff --git a/frontend/src/app/modules/actions/actions.component.html b/frontend/src/app/modules/actions/actions.component.html
index cbed5be7..576c77e9 100644
--- a/frontend/src/app/modules/actions/actions.component.html
+++ b/frontend/src/app/modules/actions/actions.component.html
@@ -1,22 +1,13 @@
-
+
-
-
-
- Actions
-
-
+
Actions
-
+
+
+
@if (hoveredChatId === chat.id) {
-
+
}
diff --git a/frontend/src/app/modules/admin/apps/chat/chats/chats.component.ts b/frontend/src/app/modules/admin/apps/chat/chats/chats.component.ts
index 017fa8c6..f65c4a04 100644
--- a/frontend/src/app/modules/admin/apps/chat/chats/chats.component.ts
+++ b/frontend/src/app/modules/admin/apps/chat/chats/chats.component.ts
@@ -17,6 +17,7 @@ import { RouterLink, RouterOutlet } from '@angular/router';
import { ChatService } from 'app/modules/admin/apps/chat/chat.service';
import { Chat } from 'app/modules/admin/apps/chat/chat.types';
import { Subject, takeUntil } from 'rxjs';
+import { FuseConfirmationService } from '@fuse/services/confirmation';
@Component({
selector: 'chat-chats',
@@ -49,6 +50,7 @@ export class ChatsComponent implements OnInit, OnDestroy {
constructor(
private _chatService: ChatService,
private _changeDetectorRef: ChangeDetectorRef,
+ private confirmationService: FuseConfirmationService,
) {}
// -----------------------------------------------------------------------------------------------------
@@ -113,6 +115,23 @@ export class ChatsComponent implements OnInit, OnDestroy {
);
}
+ /**
+ * Delete the current chat
+ */
+ deleteChat(event: MouseEvent, chat: Chat): void {
+ // event.stopPropagation();
+ this.confirmationService.open({
+ message: 'Are you sure you want to delete this chat?',
+ }).afterClosed().subscribe((result) => {
+ console.log(result);
+ if(result === 'confirmed') {
+ this._chatService.deleteChat(chat.id).subscribe(() => {
+ // Do we need to handle if it's the currently selected chat?
+ });
+ }
+ });
+ }
+
/**
* Track by function for ngFor loops
*
diff --git a/frontend/src/app/modules/admin/apps/chat/conversation/conversation.component.html b/frontend/src/app/modules/admin/apps/chat/conversation/conversation.component.html
index 335dc367..0798a052 100644
--- a/frontend/src/app/modules/admin/apps/chat/conversation/conversation.component.html
+++ b/frontend/src/app/modules/admin/apps/chat/conversation/conversation.component.html
@@ -115,9 +115,9 @@
@@ -130,9 +130,9 @@
@@ -143,12 +143,41 @@
>
}
+
+
-
+
- >
-
+
+ @if (!message.isMine) {
+
+
+
+ }
@@ -180,22 +209,25 @@
+
+
+
-
diff --git a/frontend/src/app/modules/agents/new-agent/new-agent.component.ts b/frontend/src/app/modules/agents/new-agent/new-agent.component.ts
index 70f03f27..8ec4998e 100644
--- a/frontend/src/app/modules/agents/new-agent/new-agent.component.ts
+++ b/frontend/src/app/modules/agents/new-agent/new-agent.component.ts
@@ -24,6 +24,7 @@ import { LlmService } from "../services/llm.service";
import { map } from "rxjs";
import { MatProgressSpinner } from "@angular/material/progress-spinner";
import { MatCheckboxModule } from "@angular/material/checkbox";
+import {MatCard, MatCardContent} from "@angular/material/card";
interface StartAgentResponse {
data: {
@@ -38,23 +39,25 @@ const defaultType/*: AgentType*/ = 'codegen';
templateUrl: './new-agent.component.html',
encapsulation: ViewEncapsulation.None,
standalone: true,
- imports: [
- MatIconModule,
- FormsModule,
- MatFormFieldModule,
- NgClass,
- MatInputModule,
- TextFieldModule,
- ReactiveFormsModule,
- MatButtonToggleModule,
- MatButtonModule,
- MatSelectModule,
- MatOptionModule,
- MatCheckboxModule,
- MatChipsModule,
- MatDatepickerModule,
- MatProgressSpinner,
- ],
+ imports: [
+ MatIconModule,
+ FormsModule,
+ MatFormFieldModule,
+ NgClass,
+ MatInputModule,
+ TextFieldModule,
+ ReactiveFormsModule,
+ MatButtonToggleModule,
+ MatButtonModule,
+ MatSelectModule,
+ MatOptionModule,
+ MatCheckboxModule,
+ MatChipsModule,
+ MatDatepickerModule,
+ MatProgressSpinner,
+ MatCard,
+ MatCardContent,
+ ],
})
export class NewAgentComponent implements OnInit {
functions: string[] = [];
diff --git a/frontend/src/app/modules/code-review/edit/code-review-edit.component.html b/frontend/src/app/modules/code-review/edit/code-review-edit.component.html
index 57d390cd..5ff8318f 100644
--- a/frontend/src/app/modules/code-review/edit/code-review-edit.component.html
+++ b/frontend/src/app/modules/code-review/edit/code-review-edit.component.html
@@ -1,18 +1,15 @@
-
-
-
-
-
- {{ configId ? 'Edit' : 'Create' }} Code Review Configuration
-
-
+
+
+
+
+
{{ configId ? 'Edit' : 'Create' }} Code Review Configuration
+
-
-
-
+
+
diff --git a/frontend/src/app/modules/code-review/edit/code-review-edit.component.ts b/frontend/src/app/modules/code-review/edit/code-review-edit.component.ts
index 4432cfc6..1f58c16e 100644
--- a/frontend/src/app/modules/code-review/edit/code-review-edit.component.ts
+++ b/frontend/src/app/modules/code-review/edit/code-review-edit.component.ts
@@ -17,22 +17,25 @@ import {MatButtonModule} from "@angular/material/button";
import {MatFormFieldModule} from "@angular/material/form-field";
import {MatIconModule} from "@angular/material/icon";
import {MatInputModule} from "@angular/material/input";
+import {MatCard, MatCardContent} from "@angular/material/card";
@Component({
selector: 'app-code-review-edit',
templateUrl: './code-review-edit.component.html',
standalone: true,
- imports: [
- CommonModule,
- MatSnackBarModule,
- ReactiveFormsModule,
- MatButtonModule,
- MatFormFieldModule,
- MatChipsModule,
- MatIconModule,
- MatFormFieldModule, // Add this line
- MatInputModule, // Add this line
- ],
+ imports: [
+ CommonModule,
+ MatSnackBarModule,
+ ReactiveFormsModule,
+ MatButtonModule,
+ MatFormFieldModule,
+ MatChipsModule,
+ MatIconModule,
+ MatFormFieldModule,
+ MatInputModule,
+ MatCard,
+ MatCardContent,
+ ],
})
export class CodeReviewEditComponent implements OnInit {
editForm: FormGroup;
diff --git a/frontend/src/app/modules/profile/account/account.component.html b/frontend/src/app/modules/profile/account/account.component.html
index 97ad701e..119c817a 100644
--- a/frontend/src/app/modules/profile/account/account.component.html
+++ b/frontend/src/app/modules/profile/account/account.component.html
@@ -55,48 +55,55 @@
LLM API Keys
diff --git a/frontend/src/app/modules/profile/account/account.component.ts b/frontend/src/app/modules/profile/account/account.component.ts
index ede23372..70caebd9 100644
--- a/frontend/src/app/modules/profile/account/account.component.ts
+++ b/frontend/src/app/modules/profile/account/account.component.ts
@@ -64,6 +64,7 @@ export class SettingsAccountComponent implements OnInit {
togetheraiKey: new FormControl(''),
fireworksKey: new FormControl(''),
deepseekKey: new FormControl(''),
+ cerebrasKey: new FormControl(''),
}),
functionConfig: new FormGroup({
GitHub: new FormGroup({
diff --git a/frontend/src/index.html b/frontend/src/index.html
index a4c5e57b..4f56a8d6 100644
--- a/frontend/src/index.html
+++ b/frontend/src/index.html
@@ -44,9 +44,9 @@
-
+
+
+