kpfadnis commited on
Commit
e23b66d
·
1 Parent(s): f0a28d2

chore (maintainance): Update depdencies, copyright and minimal support for chat template.

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. README.md +4 -3
  2. next.config.js +1 -1
  3. notebooks/validate_input_file.ipynb +1 -1
  4. package.json +30 -27
  5. public/app.LICENSE.txt +1 -1
  6. src/app/cookbooks/page.tsx +1 -1
  7. src/app/documentation/page.tsx +1 -1
  8. src/app/examples/[example_id]/layout.tsx +1 -1
  9. src/app/examples/[example_id]/page.tsx +1 -1
  10. src/app/examples/page.tsx +1 -1
  11. src/app/global.scss +1 -1
  12. src/app/layout.tsx +1 -1
  13. src/app/loading.tsx +1 -1
  14. src/app/page.tsx +1 -1
  15. src/app/visualize/layout.tsx +1 -1
  16. src/app/visualize/loading.tsx +1 -1
  17. src/app/visualize/page.tsx +1 -1
  18. src/components/avatar/Avatar.module.scss +37 -0
  19. src/components/avatar/Avatar.tsx +45 -0
  20. src/components/chatline/ChatLine.module.scss +165 -0
  21. src/components/chatline/ChatLine.tsx +271 -0
  22. src/components/comments/AddCommentModal.module.scss +1 -1
  23. src/components/comments/AddCommentModal.tsx +1 -1
  24. src/components/comments/CommentViewer.module.scss +1 -1
  25. src/components/comments/CommentsViewer.tsx +1 -1
  26. src/components/comments/EditCommentModal.tsx +1 -1
  27. src/components/disabled/DisabledTab.module.scss +1 -1
  28. src/components/disabled/DisabledTab.tsx +1 -1
  29. src/components/documents-viewer/DocumentsViewer.module.scss +109 -0
  30. src/components/documents-viewer/DocumentsViewer.tsx +168 -0
  31. src/components/example-tile/ExampleTile.module.scss +1 -1
  32. src/components/example-tile/ExampleTile.tsx +3 -24
  33. src/components/example-tile/SkeletonExampleTile.tsx +1 -1
  34. src/components/expression-builder/ExpressionBuilder.module.scss +1 -1
  35. src/components/expression-builder/ExpressionBuilder.tsx +1 -1
  36. src/components/filters/Filters.module.scss +1 -1
  37. src/components/filters/Filters.tsx +1 -1
  38. src/components/filters/SkeletonFilters.tsx +1 -1
  39. src/components/header/Header.jsx +4 -4
  40. src/components/header/Header.module.scss +1 -1
  41. src/components/notification/Notification.module.scss +1 -1
  42. src/components/notification/Notification.tsx +1 -1
  43. src/components/selectors/AggregatorSelector.tsx +1 -1
  44. src/components/selectors/MetricSelector.tsx +1 -1
  45. src/components/selectors/ModelSelector.tsx +1 -1
  46. src/components/task-tile/SkeletonTaskTile.tsx +1 -1
  47. src/components/task-tile/TaskTile.module.scss +1 -1
  48. src/components/task-tile/TaskTile.tsx +1 -1
  49. src/dataloader.ts +1 -1
  50. src/hooks/useBackButton.ts +8 -7
README.md CHANGED
@@ -219,9 +219,10 @@ Notes:
219
  Notes:
220
 
221
  1. Each task must have a unique `task_id`.
222
- 2. Task type can be of `question_answering`, `conversation`, or of `rag` type.
223
- 3. `input` is an array of utterances. An utterance's speaker could be either `user` or `agent`. Each utterance must have a `text` field.
224
- 4. `contexts` field represents a subset of documents from the `documents` field relevant to the `input` and is available to the generative models.
 
225
  5. `targets` field is an array of expected gold or reference texts.
226
  6. `category` is an optional field that represents the type of task for grouping similar tasks.
227
  7. `filters` is a top-level field (parallel to `tasks`) which specifies an array of fields defined inside `tasks` for filtering tasks during analysis.
 
219
  Notes:
220
 
221
  1. Each task must have a unique `task_id`.
222
+ 2. Task type can be of `rag`, or of `text_generation`, or of `chat` type.
223
+ 3. For `rag` and `text_generation` type task, `input` is an array of utterances. An utterance's speaker could be either `user` or `agent`. Each utterance must have a `text` field.
224
+ 4. For `chat` type task, `input` must be array of messages as defined by OpenAI's chat completion APIs (https://platform.openai.com/docs/api-reference/chat/create#chat-create-messages).
225
+ 4. For `rag` task, `contexts` field represents a subset of documents from the `documents` field relevant to the `input` and is available to the generative models.
226
  5. `targets` field is an array of expected gold or reference texts.
227
  6. `category` is an optional field that represents the type of task for grouping similar tasks.
228
  7. `filters` is a top-level field (parallel to `tasks`) which specifies an array of fields defined inside `tasks` for filtering tasks during analysis.
next.config.js CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
notebooks/validate_input_file.ipynb CHANGED
@@ -196,7 +196,7 @@
196
  " f\"Invalid type: {type(task['task_type'])} for 'task_type' field in {task}\"\n",
197
  " )\n",
198
  "\n",
199
- " if task[\"task_type\"] not in [\"question_answering\", \"conversation\", \"rag\", \"text_generation\", \"json_generation\"]:\n",
200
  " raise ValueError(f\"Invalid task_type: {task['task_type']} in {task}\")\n",
201
  "\n",
202
  " # Validate `contexts` field\n",
 
196
  " f\"Invalid type: {type(task['task_type'])} for 'task_type' field in {task}\"\n",
197
  " )\n",
198
  "\n",
199
+ " if task[\"task_type\"] not in [\"rag\", \"text_generation\", \"json_generation\", \"chat\"]:\n",
200
  " raise ValueError(f\"Invalid task_type: {task['task_type']} in {task}\")\n",
201
  "\n",
202
  " # Validate `contexts` field\n",
package.json CHANGED
@@ -6,12 +6,13 @@
6
  "author": "[email protected]",
7
  "license": "ISC",
8
  "scripts": {
9
- "postinstall": "husky install",
10
  "dev": "next dev",
11
- "build": "next build && node ./scripts/license",
12
  "start": "next start",
13
  "lint": "next lint && stylelint \"**/*.{css,scss}\"",
14
- "format": "prettier --write ."
 
15
  },
16
  "husky": {
17
  "hooks": {
@@ -19,42 +20,44 @@
19
  }
20
  },
21
  "devDependencies": {
22
- "@next/eslint-plugin-next": "^13.4.2",
23
- "@types/node": "18.16.3",
24
  "cross-env": "^7.0.3",
25
- "eslint": "^8.23.0",
26
- "eslint-config-next": "^13.1.6",
27
- "eslint-config-prettier": "^8.8.0",
28
- "husky": "^8.0.3",
29
- "prepend-file": "^2.0.1",
30
- "prettier": "^3.0.3",
31
- "sass": "^1.54.3",
32
- "typescript": "^5.0.4",
33
- "stylelint": "16.2.1",
34
- "stylelint-config-standard-scss": "13.0.0"
35
  },
36
  "dependencies": {
37
- "@carbon/colors": "^11.4.0",
38
- "@carbon/themes": "^11.8.0",
39
- "@carbon/icons-react": "^11.34.1",
40
- "@carbon/pictograms-react": "^11.49.0",
41
- "@carbon/charts": "^1.7.4",
42
- "@carbon/charts-react": "^1.7.4",
43
- "@carbon/react": "^1.17.0",
44
  "d3": "^7.8.4",
45
  "date-fns": "^2.30.0",
46
  "dompurify": "3.1.7",
47
  "html-react-parser": "^5.1.1",
48
- "lodash": "^4.17.4",
49
  "next": "^14.1.1",
50
- "prop-types": "^15.7.2",
51
  "react": "^18.2.0",
52
  "react-dom": "^18.2.0",
53
  "react-intl": "^6.1.0",
54
- "react-markdown": "^8.0.7",
55
  "rehype-raw": "^7.0.0",
56
- "remark-gfm": "^3.0.1",
57
  "statistics.js": "^1.0.0",
58
- "uuid": "^9.0.1"
 
 
 
 
59
  }
60
  }
 
6
  "author": "[email protected]",
7
  "license": "ISC",
8
  "scripts": {
9
+ "postinstall": "husky init",
10
  "dev": "next dev",
11
+ "build": "next build",
12
  "start": "next start",
13
  "lint": "next lint && stylelint \"**/*.{css,scss}\"",
14
+ "format": "prettier --write .",
15
+ "prepare": "husky"
16
  },
17
  "husky": {
18
  "hooks": {
 
20
  }
21
  },
22
  "devDependencies": {
23
+ "@next/eslint-plugin-next": "^15.2.1",
24
+ "@types/node": "^22.13.10",
25
  "cross-env": "^7.0.3",
26
+ "eslint": "^9.22.0",
27
+ "eslint-config-next": "^15.2.1",
28
+ "eslint-config-prettier": "^10.1.1",
29
+ "husky": "^9.1.7",
30
+ "prettier": "^3.5.3",
31
+ "sass": "^1.85.1",
32
+ "typescript": "^5.8.2",
33
+ "stylelint": "^16.15.0",
34
+ "stylelint-config-standard-scss": "^14.0.0"
 
35
  },
36
  "dependencies": {
37
+ "@carbon/colors": "^11.30.0",
38
+ "@carbon/themes": "^11.47.0",
39
+ "@carbon/icons-react": "^11.56.0",
40
+ "@carbon/pictograms-react": "^11.73.0",
41
+ "@carbon/charts": "^1.23.0",
42
+ "@carbon/charts-react": "^1.23.0",
43
+ "@carbon/react": "1.75.0",
44
  "d3": "^7.8.4",
45
  "date-fns": "^2.30.0",
46
  "dompurify": "3.1.7",
47
  "html-react-parser": "^5.1.1",
48
+ "lodash": "^4.17.21",
49
  "next": "^14.1.1",
 
50
  "react": "^18.2.0",
51
  "react-dom": "^18.2.0",
52
  "react-intl": "^6.1.0",
53
+ "react-markdown": "^10.0.0",
54
  "rehype-raw": "^7.0.0",
55
+ "remark-gfm": "^4.0.1",
56
  "statistics.js": "^1.0.0",
57
+ "uuid": "^9.0.1",
58
+ "react-wrap-balancer": "^1.1.1"
59
+ },
60
+ "resolutions": {
61
+ "@carbon/styles": "1.75.0"
62
  }
63
  }
public/app.LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
  /*!
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /*!
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/app/cookbooks/page.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/app/documentation/page.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/app/examples/[example_id]/layout.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/app/examples/[example_id]/page.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/app/examples/page.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/app/global.scss CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/app/layout.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/app/loading.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/app/page.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/app/visualize/layout.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/app/visualize/loading.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/app/visualize/page.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/avatar/Avatar.module.scss ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ **/
18
+
19
+ @use '@carbon/react/scss/spacing' as *;
20
+ @use '@carbon/colors' as *;
21
+
22
+ .wrapper {
23
+ height: 52px;
24
+ width: 52px;
25
+ border-radius: 50%;
26
+ background-color: var(--cds-layer-active-01);
27
+ display: flex;
28
+ align-items: center;
29
+ justify-content: center;
30
+ overflow: hidden;
31
+ object-fit: none;
32
+ }
33
+
34
+ .wrapper img {
35
+ height: 52px;
36
+ width: 52px;
37
+ }
src/components/avatar/Avatar.tsx ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ **/
18
+
19
+ import cx from 'classnames';
20
+ import { User, Compass, Bot, Tools } from '@carbon/icons-react';
21
+
22
+ import classes from './Avatar.module.scss';
23
+
24
+ // ===================================================================================
25
+ // MAIN FUNCTION
26
+ // ===================================================================================
27
+ export default function Avatar({
28
+ role,
29
+ }: {
30
+ role: 'system' | 'developer' | 'user' | 'tool' | 'assistant';
31
+ }) {
32
+ return (
33
+ <div className={cx(classes.wrapper)}>
34
+ {role === 'assistant' ? (
35
+ <Bot width="32px" height="32px" />
36
+ ) : role === 'tool' ? (
37
+ <Tools width="32px" height="32px" />
38
+ ) : role === 'system' || role === 'developer' ? (
39
+ <Compass width="32px" height="32px" />
40
+ ) : (
41
+ <User width="32px" height="32px" />
42
+ )}
43
+ </div>
44
+ );
45
+ }
src/components/chatline/ChatLine.module.scss ADDED
@@ -0,0 +1,165 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ **/
18
+
19
+ @use '@carbon/react/scss/spacing' as *;
20
+ @use '@carbon/colors' as *;
21
+
22
+ .line {
23
+ display: flex;
24
+ flex-direction: row-reverse;
25
+ justify-content: flex-start;
26
+ align-items: flex-end;
27
+ margin-bottom: 1.25rem;
28
+ gap: 24px;
29
+ }
30
+
31
+ .assistantLine {
32
+ justify-content: flex-start;
33
+ flex-direction: row;
34
+ }
35
+
36
+ .latestResponse {
37
+ margin-bottom: 3rem;
38
+ }
39
+
40
+ .baloon {
41
+ display: flex;
42
+ flex-direction: column;
43
+ border-radius: 1rem;
44
+ border-bottom-right-radius: 0;
45
+ background: var(--cds-layer-01);
46
+ width: 80%;
47
+ }
48
+
49
+ .assistantBaloon {
50
+ border-bottom-left-radius: 0;
51
+ border-bottom-right-radius: 1rem;
52
+ }
53
+
54
+ .toolCallBaloon {
55
+ background-color: var(--cds-highlight);
56
+ }
57
+
58
+ .toolResponseBaloon {
59
+ background-color: var(--cds-tag-background-green);
60
+ }
61
+
62
+ .message {
63
+ font-size: 16px;
64
+ line-height: 22px;
65
+ margin: $spacing-04 $spacing-05;
66
+ min-width: 120px;
67
+ }
68
+
69
+ .toolCall {
70
+ display: flex;
71
+ flex-direction: column;
72
+ row-gap: $spacing-03;
73
+ }
74
+
75
+ .toolCall :global(.cds--snippet--multi) {
76
+ min-inline-size: 100%;
77
+ max-inline-size: 100%;
78
+ padding: 0 0 $spacing-03;
79
+ background-color: var(--cds-background);
80
+ }
81
+
82
+ .toolCall :global(.cds--snippet-container) {
83
+ padding: $spacing-03;
84
+ }
85
+
86
+ .toolResponse {
87
+ display: flex;
88
+ flex-direction: column;
89
+ row-gap: $spacing-03;
90
+ }
91
+
92
+ .toolResponse :global(.cds--snippet--multi) {
93
+ max-inline-size: 100%;
94
+ padding: 0 0 $spacing-03;
95
+ background-color: var(--cds-background);
96
+ }
97
+
98
+ .toolResponse :global(.cds--snippet-container) {
99
+ padding: $spacing-03;
100
+ }
101
+
102
+ .viewDocumentsButton {
103
+ border: 1px solid var(--cds-background-inverse);
104
+ border-radius: 50%;
105
+ width: 32px;
106
+ height: 32px;
107
+ margin: -10px auto -16px;
108
+ background: var(--cds-background);
109
+ cursor: pointer;
110
+ display: flex;
111
+ justify-content: center;
112
+ align-items: center;
113
+ }
114
+
115
+ .viewDocumentsIcon {
116
+ color: var(--cds-background-inverse);
117
+ }
118
+
119
+ .toolbar {
120
+ border: none;
121
+ cursor: pointer;
122
+ display: flex;
123
+ justify-content: flex-end;
124
+ margin: 0 $spacing-05;
125
+ align-items: baseline;
126
+ }
127
+
128
+ .btnActive {
129
+ background-color: var(--cds-background-selected);
130
+ }
131
+
132
+ .superscript {
133
+ vertical-align: super;
134
+ font-size: 12px;
135
+ margin-left: $spacing-01;
136
+ }
137
+
138
+ .citations {
139
+ margin: 0 $spacing-05;
140
+ }
141
+
142
+ .feedbackContainer {
143
+ width: 500px;
144
+ display: flex;
145
+ flex-direction: column;
146
+ margin: 0 $spacing-05 $spacing-03;
147
+ align-self: flex-start;
148
+ row-gap: $spacing-03;
149
+ }
150
+
151
+ .feedbackMetricContainer {
152
+ display: flex;
153
+ justify-content: space-between;
154
+ align-items: center;
155
+ }
156
+
157
+ .feedbackMetricDescription {
158
+ display: flex;
159
+ column-gap: $spacing-02;
160
+ }
161
+
162
+ .feedbackMetricValues {
163
+ margin-left: auto;
164
+ align-self: flex-end;
165
+ }
src/components/chatline/ChatLine.tsx ADDED
@@ -0,0 +1,271 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ **/
18
+
19
+ import cx from 'classnames';
20
+ import Balancer from 'react-wrap-balancer';
21
+ import { useState, useEffect, useRef } from 'react';
22
+
23
+ import { CodeSnippet } from '@carbon/react';
24
+
25
+ import { Message, ToolCall, ToolMessage, AssistantMessage } from '@/src/types';
26
+ import Avatar from '@/src/components/avatar/Avatar';
27
+ import DocumentsViewer from '@/src/components/documents-viewer/DocumentsViewer';
28
+
29
+ import classes from './ChatLine.module.scss';
30
+
31
+ // ===================================================================================
32
+ // TYPES
33
+ // ===================================================================================
34
+ interface ChatLineProps {
35
+ messageId: string;
36
+ message: Message;
37
+ latestResponse?: boolean;
38
+ onSelection?: Function;
39
+ focused?: boolean;
40
+ }
41
+
42
+ // ===================================================================================
43
+ // RENDER FUNCTIONS
44
+ // ===================================================================================
45
+ function Tool({ tool }: { tool: ToolCall }) {
46
+ return (
47
+ <div className={cx(classes.message, classes.toolCall)}>
48
+ <span>
49
+ Tool ID: {tool.id}&nbsp;
50
+ {tool.function.name ? <span>({tool.function.name})</span> : null}
51
+ </span>
52
+ {tool.function.arguments ? (
53
+ <CodeSnippet type="multi" hideCopyButton wrapText>
54
+ {JSON.stringify(tool.function.arguments, null, 2)}
55
+ </CodeSnippet>
56
+ ) : null}
57
+ </div>
58
+ );
59
+ }
60
+
61
+ function ToolResponse({
62
+ messageId,
63
+ message,
64
+ onSelection,
65
+ }: {
66
+ messageId: string;
67
+ message: ToolMessage;
68
+ onSelection?: Function;
69
+ }) {
70
+ // Step 1: Initialize state and necessary variables
71
+ const [documentIndex, setDocumentIndex] = useState<number>(0);
72
+
73
+ // Step 2: Render
74
+ return (
75
+ <div className={cx(classes.message, classes.toolResponse)}>
76
+ <span>
77
+ Tool ID: {message.tool_id}&nbsp;
78
+ {message.name ? <span>({message.name})</span> : null}
79
+ </span>
80
+ {message.type === 'documents' && Array.isArray(message.content) ? (
81
+ <DocumentsViewer
82
+ key={`${messageId}__documents--${message.content.length}`}
83
+ id={`${messageId}__documents`}
84
+ documents={message.content}
85
+ documentIndex={documentIndex}
86
+ setDocumentIndex={setDocumentIndex}
87
+ onSelection={onSelection}
88
+ ></DocumentsViewer>
89
+ ) : message.type === 'json' ? (
90
+ <CodeSnippet type="multi" hideCopyButton wrapText>
91
+ {JSON.stringify(message.content, null, 2)}
92
+ </CodeSnippet>
93
+ ) : (
94
+ <Balancer
95
+ className={cx(classes.message, classes.toolMessage)}
96
+ ratio={0.2}
97
+ onMouseDown={() => {
98
+ if (onSelection) {
99
+ onSelection(
100
+ `messages[${messageId.split('--').slice(-1)[0]}].content`,
101
+ );
102
+ }
103
+ }}
104
+ onMouseUp={() => {
105
+ if (onSelection) {
106
+ onSelection(
107
+ `messages[${messageId.split('--').slice(-1)[0]}].content`,
108
+ );
109
+ }
110
+ }}
111
+ >
112
+ {typeof message.content === 'string'
113
+ ? message.content.split('\n').map((line, i) => (
114
+ <span key={i}>
115
+ {line}
116
+ <br />
117
+ </span>
118
+ ))
119
+ : message.content}
120
+ </Balancer>
121
+ )}
122
+ </div>
123
+ );
124
+ }
125
+
126
+ function AssistantResponse({
127
+ messageId,
128
+ message,
129
+ onSelection,
130
+ }: {
131
+ messageId: string;
132
+ message: AssistantMessage;
133
+ onSelection?: Function;
134
+ }) {
135
+ return (
136
+ <div className={classes.assistantResponse}>
137
+ {message.content ? (
138
+ <Balancer
139
+ className={cx(classes.message, classes.assistantMessage)}
140
+ ratio={0.2}
141
+ onMouseDown={() => {
142
+ if (onSelection) {
143
+ onSelection(
144
+ `messages[${messageId.split('--').slice(-1)[0]}].content`,
145
+ );
146
+ }
147
+ }}
148
+ onMouseUp={() => {
149
+ if (onSelection) {
150
+ onSelection(
151
+ `messages[${messageId.split('--').slice(-1)[0]}].content`,
152
+ );
153
+ }
154
+ }}
155
+ >
156
+ {message.content.split('\n').map((line, i) => (
157
+ <span key={i}>
158
+ {line}
159
+ <br />
160
+ </span>
161
+ ))}
162
+ </Balancer>
163
+ ) : null}
164
+ {message.tool_calls
165
+ ? message.tool_calls.map((tool, toolIdx) => {
166
+ return (
167
+ <Tool key={`message-${messageId}__tool-${toolIdx}`} tool={tool} />
168
+ );
169
+ })
170
+ : null}
171
+ </div>
172
+ );
173
+ }
174
+
175
+ // ===================================================================================
176
+ // MAIN FUNCTIONS
177
+ // ===================================================================================
178
+ export default function ChatLine({
179
+ messageId,
180
+ message,
181
+ latestResponse,
182
+ onSelection,
183
+ focused,
184
+ }: ChatLineProps) {
185
+ // Step 1: Initialize state and necessary variables
186
+ const anchorRef = useRef<HTMLDivElement>(null);
187
+
188
+ // Step 2: Run effects
189
+ // Step 2.a: Scroll into view
190
+ useEffect(() => {
191
+ if (anchorRef.current && focused) {
192
+ anchorRef.current.scrollIntoView({
193
+ behavior: 'smooth',
194
+ block: message.role === 'user' ? 'start' : 'center',
195
+ inline: 'center',
196
+ });
197
+ }
198
+ }, [focused, message.role]);
199
+
200
+ // Step 3: Render
201
+ // Step 3.a: Return "null" if message is undefined
202
+ if (!message) {
203
+ return null;
204
+ }
205
+
206
+ // Step 3.b: Render chat line
207
+ return (
208
+ <div
209
+ ref={anchorRef}
210
+ className={cx(classes.line, {
211
+ [classes.assistantLine]: message.role === 'assistant',
212
+ [classes.latestResponse]: latestResponse,
213
+ })}
214
+ >
215
+ <Avatar role={message.role} />
216
+ <div
217
+ className={cx(
218
+ classes.baloon,
219
+ message.role === 'assistant'
220
+ ? //@ts-ignore
221
+ message.tool_calls
222
+ ? classes.toolCallBaloon
223
+ : classes.assistantBaloon
224
+ : message.role === 'tool'
225
+ ? classes.toolResponseBaloon
226
+ : null,
227
+ )}
228
+ >
229
+ {message.role === 'system' ||
230
+ message.role === 'developer' ||
231
+ message.role === 'user' ? (
232
+ <Balancer
233
+ className={cx(classes.message)}
234
+ ratio={0.2}
235
+ onMouseDown={() => {
236
+ if (onSelection) {
237
+ onSelection(
238
+ `messages[${messageId.split('--').slice(-1)[0]}].text`,
239
+ );
240
+ }
241
+ }}
242
+ onMouseUp={() => {
243
+ if (onSelection) {
244
+ onSelection(
245
+ `messages[${messageId.split('--').slice(-1)[0]}].text`,
246
+ );
247
+ }
248
+ }}
249
+ >
250
+ {message.content.split('\n').map((line, i) => (
251
+ <span key={i}>
252
+ {line}
253
+ <br />
254
+ </span>
255
+ ))}
256
+ </Balancer>
257
+ ) : message.role === 'tool' ? (
258
+ //@ts-ignore
259
+ <ToolResponse messageId={messageId} message={message} />
260
+ ) : (
261
+ <AssistantResponse
262
+ messageId={messageId}
263
+ //@ts-ignore
264
+ message={message}
265
+ onSelection={onSelection}
266
+ />
267
+ )}
268
+ </div>
269
+ </div>
270
+ );
271
+ }
src/components/comments/AddCommentModal.module.scss CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/comments/AddCommentModal.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/comments/CommentViewer.module.scss CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/comments/CommentsViewer.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/comments/EditCommentModal.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/disabled/DisabledTab.module.scss CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/disabled/DisabledTab.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/documents-viewer/DocumentsViewer.module.scss ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ **/
18
+
19
+ @use '@carbon/react/scss/spacing' as *;
20
+ @use '@carbon/colors' as *;
21
+
22
+ .documentsViewer {
23
+ display: flex;
24
+ flex-direction: column;
25
+ align-items: center;
26
+ }
27
+
28
+ .container {
29
+ width: 100%;
30
+ display: flex;
31
+ flex-direction: column;
32
+ border: solid 1px var(--cds-border-strong-01);
33
+ margin: 0 $spacing-04 $spacing-03;
34
+ }
35
+
36
+ .toolbar {
37
+ display: flex;
38
+ column-gap: $spacing-02;
39
+ align-items: center;
40
+ }
41
+
42
+ .document {
43
+ padding: $spacing-03;
44
+ height: 350px;
45
+ overflow: scroll;
46
+ background-color: var(--cds-background);
47
+ display: flex;
48
+ flex-direction: column;
49
+ }
50
+
51
+ .document article pre {
52
+ padding: 1%;
53
+ background-color: var(--cds-layer-01);
54
+ }
55
+
56
+ .documentHeader {
57
+ display: flex;
58
+ align-items: center;
59
+ }
60
+
61
+ .documentToolbar {
62
+ margin-left: auto;
63
+ align-self: flex-end;
64
+ }
65
+
66
+ .disclaimers {
67
+ align-self: flex-start;
68
+ margin: $spacing-03 $spacing-05 $spacing-05;
69
+ display: flex;
70
+ flex-direction: column;
71
+ row-gap: $spacing-02;
72
+ }
73
+
74
+ .overlapDisclaimer {
75
+ display: flex;
76
+ align-items: center;
77
+ font-size: 14px;
78
+ color: #6f6f6f;
79
+ }
80
+
81
+ .legendCopiedText {
82
+ color: #f1c21b;
83
+ mix-blend-mode: hard-light;
84
+ }
85
+
86
+ .feedbackContainer {
87
+ width: 95%;
88
+ display: flex;
89
+ flex-direction: column;
90
+ margin: 0 $spacing-05 $spacing-03;
91
+ align-self: flex-start;
92
+ row-gap: $spacing-03;
93
+ }
94
+
95
+ .feedbackMetricContainer {
96
+ display: flex;
97
+ justify-content: space-between;
98
+ align-items: center;
99
+ }
100
+
101
+ .feedbackMetricDescription {
102
+ display: flex;
103
+ column-gap: $spacing-02;
104
+ }
105
+
106
+ .feedbackMetricValues {
107
+ margin-left: auto;
108
+ align-self: flex-end;
109
+ }
src/components/documents-viewer/DocumentsViewer.tsx ADDED
@@ -0,0 +1,168 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ **/
18
+
19
+ 'use client';
20
+
21
+ import { isEmpty } from 'lodash';
22
+
23
+ import { Button } from '@carbon/react';
24
+ import { ChevronLeft, ChevronRight, Link } from '@carbon/icons-react';
25
+ import ReactMarkdown from 'react-markdown';
26
+ import remarkGfm from 'remark-gfm';
27
+ import rehypeRaw from 'rehype-raw';
28
+
29
+ import { ToolMessageDocument } from '@/src/types';
30
+
31
+ import classes from './DocumentsViewer.module.scss';
32
+
33
+ // ===================================================================================
34
+ // TYPES
35
+ // ===================================================================================
36
+ interface Props {
37
+ id: string;
38
+ documents: ToolMessageDocument[];
39
+ documentIndex: number;
40
+ setDocumentIndex: Function;
41
+ onSelection?: Function;
42
+ }
43
+
44
+ // ===================================================================================
45
+ // RENDER FUNCTIONS
46
+ // ===================================================================================
47
+
48
+ function DocumentViewer({
49
+ id,
50
+ document,
51
+ onSelection,
52
+ }: {
53
+ id: string;
54
+ document: ToolMessageDocument;
55
+ onSelection?: Function;
56
+ }) {
57
+ return (
58
+ <div className={classes.document}>
59
+ <div className={classes.documentHeader}>
60
+ <div className={classes.documentToolbar}>
61
+ {document.url ? (
62
+ <Button
63
+ kind="ghost"
64
+ renderIcon={Link}
65
+ iconDescription="Click to open link"
66
+ hasIconOnly
67
+ tooltipAlignment="end"
68
+ tooltipPosition="bottom"
69
+ onClick={() => {
70
+ window.open(document.url, '_blank');
71
+ }}
72
+ ></Button>
73
+ ) : null}
74
+ </div>
75
+ </div>
76
+
77
+ <article
78
+ className={classes.documentContainer}
79
+ onMouseDown={() => {
80
+ if (onSelection) {
81
+ const [segment, documentIdx] = id.split('__documents--');
82
+ onSelection(
83
+ `messages[${segment.split('message--').slice(-1)[0]}].documents[${documentIdx}].text`,
84
+ );
85
+ }
86
+ }}
87
+ onMouseUp={() => {
88
+ if (onSelection) {
89
+ const [segment, documentIdx] = id.split('__documents--');
90
+ onSelection(
91
+ `messages[${segment.split('message--').slice(-1)[0]}].documents[${documentIdx}].text`,
92
+ );
93
+ }
94
+ }}
95
+ >
96
+ <div className={classes.markdown}>
97
+ <ReactMarkdown
98
+ remarkPlugins={[remarkGfm]}
99
+ rehypePlugins={[rehypeRaw]}
100
+ >
101
+ {document.text}
102
+ </ReactMarkdown>
103
+ </div>
104
+ </article>
105
+ </div>
106
+ );
107
+ }
108
+
109
+ // ===================================================================================
110
+ // MAIN FUNCTION
111
+ // ===================================================================================
112
+ export default function DocumentsViewer({
113
+ id,
114
+ documents,
115
+ documentIndex,
116
+ setDocumentIndex,
117
+ onSelection,
118
+ }: Props) {
119
+ // Step 1: Render
120
+ if (isEmpty(documents)) {
121
+ return null;
122
+ } else {
123
+ return (
124
+ <div className={classes.documentsViewer}>
125
+ {documents.length > 1 ? (
126
+ <div className={classes.toolbar}>
127
+ <Button
128
+ id={'document--selector-prev'}
129
+ kind="ghost"
130
+ hasIconOnly
131
+ renderIcon={ChevronLeft}
132
+ iconDescription="Previous document"
133
+ onClick={() => {
134
+ if (documentIndex > 0) {
135
+ setDocumentIndex(documentIndex - 1);
136
+ }
137
+ }}
138
+ disabled={documentIndex === 0}
139
+ />
140
+ <span className={classes.documentIndex}>
141
+ {documentIndex + 1} / {documents.length}
142
+ </span>
143
+ <Button
144
+ id={'document--selector-next'}
145
+ kind="ghost"
146
+ hasIconOnly
147
+ renderIcon={ChevronRight}
148
+ iconDescription="Next document"
149
+ onClick={() => {
150
+ if (documentIndex < documents.length - 1) {
151
+ setDocumentIndex(documentIndex + 1);
152
+ }
153
+ }}
154
+ disabled={documentIndex === documents.length - 1}
155
+ />
156
+ </div>
157
+ ) : null}
158
+ <div className={classes.container}>
159
+ <DocumentViewer
160
+ id={`${id}--${documentIndex}`}
161
+ document={documents[documentIndex]}
162
+ onSelection={onSelection}
163
+ />
164
+ </div>
165
+ </div>
166
+ );
167
+ }
168
+ }
src/components/example-tile/ExampleTile.module.scss CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/example-tile/ExampleTile.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
@@ -24,7 +24,6 @@ import {
24
  TileAboveTheFoldContent,
25
  TileBelowTheFoldContent,
26
  Tag,
27
- Button,
28
  DefinitionTooltip,
29
  Toggletip,
30
  ToggletipButton,
@@ -33,7 +32,7 @@ import {
33
  UnorderedList,
34
  ListItem,
35
  } from '@carbon/react';
36
- import { Microscope, Download, Information } from '@carbon/icons-react';
37
 
38
  import { TileData } from '@/src/types';
39
  import {
@@ -44,15 +43,13 @@ import { calculateDuration } from '@/src/utilities/time';
44
 
45
  import styles from './ExampleTile.module.scss';
46
 
47
- export default function ExperimentTile({
48
  data,
49
  disableNavigation = false,
50
- disableActions = false,
51
  expanded = true,
52
  }: {
53
  data: TileData;
54
  disableNavigation?: boolean;
55
- disableActions?: boolean;
56
  expanded?: boolean;
57
  }) {
58
  const [
@@ -176,24 +173,6 @@ export default function ExperimentTile({
176
  </div>
177
  ) : null}
178
  </div>
179
- {!disableActions && (
180
- <>
181
- <div className={styles.divider}></div>
182
- <div className={styles.actions}>
183
- <Button
184
- id="download-evaluations"
185
- renderIcon={Download}
186
- kind={'ghost'}
187
- iconDescription={'Download evaluations'}
188
- tooltipAlignment={'end'}
189
- tooltipPosition={'bottom'}
190
- disabled
191
- >
192
- Download evaluations
193
- </Button>
194
- </div>
195
- </>
196
- )}
197
  </div>
198
  </TileBelowTheFoldContent>
199
  </ExpandableTile>
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
24
  TileAboveTheFoldContent,
25
  TileBelowTheFoldContent,
26
  Tag,
 
27
  DefinitionTooltip,
28
  Toggletip,
29
  ToggletipButton,
 
32
  UnorderedList,
33
  ListItem,
34
  } from '@carbon/react';
35
+ import { Microscope, Information } from '@carbon/icons-react';
36
 
37
  import { TileData } from '@/src/types';
38
  import {
 
43
 
44
  import styles from './ExampleTile.module.scss';
45
 
46
+ export default function ExampleTile({
47
  data,
48
  disableNavigation = false,
 
49
  expanded = true,
50
  }: {
51
  data: TileData;
52
  disableNavigation?: boolean;
 
53
  expanded?: boolean;
54
  }) {
55
  const [
 
173
  </div>
174
  ) : null}
175
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176
  </div>
177
  </TileBelowTheFoldContent>
178
  </ExpandableTile>
src/components/example-tile/SkeletonExampleTile.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/expression-builder/ExpressionBuilder.module.scss CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/expression-builder/ExpressionBuilder.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/filters/Filters.module.scss CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/filters/Filters.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/filters/SkeletonFilters.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/header/Header.jsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
@@ -58,13 +58,13 @@ export default memo(function HeaderView() {
58
  <HeaderGlobalBar>
59
  <HeaderGlobalAction
60
  aria-label={
61
- theme === 'white' ? 'Switch to dark mode' : 'Switch to light mode'
62
  }
63
  onClick={() => {
64
- theme === 'white' ? set('g100') : set('white');
65
  }}
66
  >
67
- {theme === 'white' ? <Asleep size={20} /> : <Awake size={20} />}
68
  </HeaderGlobalAction>
69
  <HeaderGlobalAction
70
  aria-label="Export"
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
58
  <HeaderGlobalBar>
59
  <HeaderGlobalAction
60
  aria-label={
61
+ theme === 'g10' ? 'Switch to dark mode' : 'Switch to light mode'
62
  }
63
  onClick={() => {
64
+ theme === 'g10' ? set('g90') : set('g10');
65
  }}
66
  >
67
+ {theme === 'g10' ? <Asleep size={20} /> : <Awake size={20} />}
68
  </HeaderGlobalAction>
69
  <HeaderGlobalAction
70
  aria-label="Export"
src/components/header/Header.module.scss CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/notification/Notification.module.scss CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/notification/Notification.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/selectors/AggregatorSelector.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/selectors/MetricSelector.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/selectors/ModelSelector.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/task-tile/SkeletonTaskTile.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/task-tile/TaskTile.module.scss CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/components/task-tile/TaskTile.tsx CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/dataloader.ts CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
src/hooks/useBackButton.ts CHANGED
@@ -1,6 +1,6 @@
1
  /**
2
  *
3
- * Copyright 2023-2024 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
@@ -24,10 +24,13 @@ import { useEffect } from 'react';
24
  *
25
  */
26
  export function useBackButton(warningMessage?: string) {
27
- const BACK_BUTTON_MESSAGE = 'Going back will make you lose the current progress. Are you sure you want to go back?';
 
28
 
29
  const onBackButtonEvent = (e) => {
30
- const leaveThisPage = window.confirm(warningMessage? warningMessage: BACK_BUTTON_MESSAGE);
 
 
31
  if (leaveThisPage) {
32
  // Let user go back
33
  window.history.back();
@@ -44,7 +47,5 @@ export function useBackButton(warningMessage?: string) {
44
  };
45
  }, []);
46
 
47
- return {
48
-
49
- };
50
- }
 
1
  /**
2
  *
3
+ * Copyright 2023-2025 InspectorRAGet Team
4
  *
5
  * Licensed under the Apache License, Version 2.0 (the "License");
6
  * you may not use this file except in compliance with the License.
 
24
  *
25
  */
26
  export function useBackButton(warningMessage?: string) {
27
+ const BACK_BUTTON_MESSAGE =
28
+ 'Going back will make you lose the current progress. Are you sure you want to go back?';
29
 
30
  const onBackButtonEvent = (e) => {
31
+ const leaveThisPage = window.confirm(
32
+ warningMessage ? warningMessage : BACK_BUTTON_MESSAGE,
33
+ );
34
  if (leaveThisPage) {
35
  // Let user go back
36
  window.history.back();
 
47
  };
48
  }, []);
49
 
50
+ return {};
51
+ }