@gitlab/duo-ui 15.2.0 → 15.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/components/agentic_chat/agentic_duo_chat.js +1 -1
  3. package/dist/components/agentic_chat/web_agentic_duo_chat.js +6 -1
  4. package/dist/components/chat/components/duo_chat_message/duo_chat_message.js +21 -28
  5. package/dist/components/chat/components/duo_chat_message/markdown_renderer.js +102 -0
  6. package/dist/components/chat/components/duo_chat_message/message_types/message_agent.js +5 -6
  7. package/dist/components/chat/components/duo_chat_message/message_types/message_base.js +27 -14
  8. package/dist/components/chat/components/duo_chat_message/message_types/message_tool_kv_section.js +1 -1
  9. package/dist/components/chat/components/duo_chat_message_tool_approval/components/base_tool_params.js +1 -1
  10. package/dist/components/chat/components/duo_chat_message_tool_approval/components/create_commit_tool_params.js +9 -3
  11. package/dist/components/chat/components/duo_chat_message_tool_approval/components/pre_block.js +11 -6
  12. package/dist/components/chat/components/duo_chat_message_tool_approval/components/tool_params_json_view.js +1 -1
  13. package/dist/components/chat/components/duo_chat_threads/duo_chat_threads.js +9 -2
  14. package/dist/components/chat/components/duo_chat_threads/duo_chat_threads_skeleton.js +48 -0
  15. package/dist/components/chat/duo_chat.js +1 -1
  16. package/dist/components/chat/markdown_renderer.js +31 -5
  17. package/dist/components/chat/mock_data.js +28 -2
  18. package/dist/components/chat/web_duo_chat.js +1 -1
  19. package/dist/components/ui/duo_layout/duo_layout.js +1 -1
  20. package/dist/components.css +1 -1
  21. package/dist/components.css.map +1 -1
  22. package/dist/tailwind.css +1 -1
  23. package/dist/tailwind.css.map +1 -1
  24. package/dist/utils/highlight.js +483 -0
  25. package/package.json +3 -2
  26. package/src/components/agentic_chat/agentic_duo_chat.scss +2 -1
  27. package/src/components/agentic_chat/agentic_duo_chat.vue +1 -1
  28. package/src/components/agentic_chat/web_agentic_duo_chat.vue +8 -1
  29. package/src/components/chat/components/duo_chat_message/duo_chat_message.scss +15 -19
  30. package/src/components/chat/components/duo_chat_message/duo_chat_message.vue +30 -28
  31. package/src/components/chat/components/duo_chat_message/markdown_renderer.vue +71 -0
  32. package/src/components/chat/components/duo_chat_message/message_types/message_agent.vue +8 -8
  33. package/src/components/chat/components/duo_chat_message/message_types/message_base.vue +24 -14
  34. package/src/components/chat/components/duo_chat_message/message_types/message_tool_kv_section.vue +1 -1
  35. package/src/components/chat/components/duo_chat_message_tool_approval/components/base_tool_params.vue +1 -1
  36. package/src/components/chat/components/duo_chat_message_tool_approval/components/create_commit_tool_params.vue +7 -2
  37. package/src/components/chat/components/duo_chat_message_tool_approval/components/pre_block.vue +11 -6
  38. package/src/components/chat/components/duo_chat_message_tool_approval/components/tool_params_json_view.vue +1 -1
  39. package/src/components/chat/components/duo_chat_threads/duo_chat_threads.vue +9 -1
  40. package/src/components/chat/components/duo_chat_threads/duo_chat_threads_skeleton.vue +39 -0
  41. package/src/components/chat/duo_chat.vue +1 -1
  42. package/src/components/chat/markdown_renderer.js +37 -6
  43. package/src/components/chat/mock_data.js +30 -1
  44. package/src/components/chat/web_duo_chat.vue +1 -1
  45. package/src/components/ui/duo_layout/duo_layout.vue +1 -1
  46. package/src/utils/highlight.js +562 -0
  47. package/translations.js +1 -0
  48. package/dist/components/chat/components/duo_chat_message_tool_approval/services/highlight.js +0 -21
  49. package/src/components/chat/components/duo_chat_message_tool_approval/services/highlight.js +0 -18
@@ -91,7 +91,7 @@ export const MOCK_TOOL_MESSAGE = {
91
91
 
92
92
  export const MOCK_AGENT_MESSAGE = {
93
93
  id: '123',
94
- content: `I'll write a simple Python function with comments for you. Here's an example:\n\n<div class="gl-relative markdown-code-block js-markdown-code"><pre><code class="language-python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">factorial</span>(<span class="hljs-params">n</span>):
94
+ contentHtml: `I'll write a simple Python function with comments for you. Here's an example:\n\n<div class="gl-relative markdown-code-block js-markdown-code"><pre><code class="language-python"><span class="hljs-keyword">def</span> <span class="hljs-title function_">factorial</span>(<span class="hljs-params">n</span>):
95
95
  <span class="hljs-string">&quot;&quot;&quot;
96
96
  Calculate the factorial of a non-negative integer.
97
97
 
@@ -118,6 +118,35 @@ export const MOCK_AGENT_MESSAGE = {
118
118
  message_type: MESSAGE_MODEL_ROLES.agent,
119
119
  };
120
120
 
121
+ export const MOCK_AGENT_MESSAGE_WITH_MARKDOWN = {
122
+ status: 'success',
123
+ content:
124
+ "The `GENERATE_SERIES` function in PostgreSQL creates a set of values from a start to an end point, which is incredibly useful for generating sequences, filling gaps in data, or creating test datasets.\n\n#### Basic Syntax\n\n```sql\n-- Generate integers from 1 to 10\nSELECT * FROM GENERATE_SERIES(1, 10);\n\n-- Generate with a step value (every 2)\nSELECT * FROM GENERATE_SERIES(1, 10, 2);\n-- Returns: 1, 3, 5, 7, 9\n```\n\n#### Common Use Cases\n\n**1. Generate date ranges:**\n```sql\n-- Generate all dates in January 2025\nSELECT GENERATE_SERIES(\n '2025-01-01'::timestamp,\n '2025-01-31'::timestamp,\n '1 day'::interval\n) AS date;\n```\n\n**2. Fill missing data gaps:**\n```sql\n-- Find missing IDs in a sequence\nSELECT missing_id\nFROM GENERATE_SERIES(1, 100) AS missing_id\nWHERE missing_id NOT IN (SELECT id FROM your_table);\n```\n\n**3. Create test data:**\n```sql\n-- Generate 1000 rows of test data\nSELECT \n id,\n 'User ' || id AS username,\n NOW() - (id || ' days')::interval AS created_at\nFROM GENERATE_SERIES(1, 1000) AS id;\n```\n\n**4. Time-based aggregations:**\n```sql\n-- Group data by hour, even for hours with no data\nSELECT \n hour_slot,\n COUNT(orders.id) AS order_count\nFROM GENERATE_SERIES(\n '2025-01-01 00:00'::timestamp,\n '2025-01-01 23:00'::timestamp,\n '1 hour'::interval\n) AS hour_slot\nLEFT JOIN orders ON DATE_TRUNC('hour', orders.created_at) = hour_slot\nGROUP BY hour_slot\nORDER BY hour_slot;\n```\n\n**Key points:**\n- Works with integers, bigints, numeric types, and timestamps\n- The step parameter is optional (defaults to 1 for numbers, 1 day for timestamps)\n- For descending sequences, use a negative step: `GENERATE_SERIES(10, 1, -1)`\n- Can be used in `FROM` clauses, joins, or subqueries",
125
+ timestamp: '2025-11-29T13:32:50.545772+00:00',
126
+ tool_info: null,
127
+ message_type: 'agent',
128
+ correlation_id: null,
129
+ message_sub_type: null,
130
+ additional_context: null,
131
+ };
132
+
133
+ export const MOCK_AGENT_MESSAGE_WITH_LONG_CODE_BLOCK = {
134
+ status: 'success',
135
+ content: `
136
+ \`\`\`javascript
137
+ ${Array.from({ length: 500 })
138
+ .map(() => 'console.log("Hello world")')
139
+ .join('\n\n')}
140
+ \`\`\`
141
+ `,
142
+ timestamp: '2025-11-29T13:32:50.545772+00:00',
143
+ tool_info: null,
144
+ message_type: 'agent',
145
+ correlation_id: null,
146
+ message_sub_type: null,
147
+ additional_context: null,
148
+ };
149
+
121
150
  export const MOCK_TOOL_MESSAGE_WITH_LINK = {
122
151
  id: '123',
123
152
  content: "Search for 'duo.*chat.*message' in directory",
@@ -738,7 +738,7 @@ export default {
738
738
  <template>
739
739
  <div
740
740
  id="chat-component"
741
- class="markdown-code-block duo-chat web-only gl-bottom-0 gl-flex gl-max-h-full gl-flex-col"
741
+ class="duo-chat web-only gl-bottom-0 gl-flex gl-max-h-full gl-flex-col"
742
742
  role="complementary"
743
743
  data-testid="chat-component"
744
744
  >
@@ -81,7 +81,7 @@ export default {
81
81
  @resize:end="updateSize"
82
82
  >
83
83
  <aside
84
- class="markdown-code-block duo-chat gl-align-items gl-bottom-0 gl-flex gl-h-full gl-max-h-full gl-flex-row gl-border-subtle"
84
+ class="duo-chat gl-align-items gl-bottom-0 gl-flex gl-h-full gl-max-h-full gl-flex-row gl-border-subtle"
85
85
  >
86
86
  <main
87
87
  class="content flex-none gl-border-r gl-flex gl-h-full gl-min-w-0 gl-grow gl-overflow-y-auto gl-border-subtle"
@@ -0,0 +1,562 @@
1
+ import highlightjs from 'highlight.js/lib/core';
2
+
3
+ export const languageLoaders = {
4
+ '1c': () => import('highlight.js/lib/languages/1c'),
5
+ abnf: () => import('highlight.js/lib/languages/abnf'),
6
+ accesslog: () => import('highlight.js/lib/languages/accesslog'),
7
+ actionscript: () => import('highlight.js/lib/languages/actionscript'),
8
+ ada: () => import('highlight.js/lib/languages/ada'),
9
+ angelscript: () => import('highlight.js/lib/languages/angelscript'),
10
+ apache: () => import('highlight.js/lib/languages/apache'),
11
+ applescript: () => import('highlight.js/lib/languages/applescript'),
12
+ arcade: () => import('highlight.js/lib/languages/arcade'),
13
+ arduino: () => import('highlight.js/lib/languages/arduino'),
14
+ armasm: () => import('highlight.js/lib/languages/armasm'),
15
+ asciidoc: () => import('highlight.js/lib/languages/asciidoc'),
16
+ aspectj: () => import('highlight.js/lib/languages/aspectj'),
17
+ autohotkey: () => import('highlight.js/lib/languages/autohotkey'),
18
+ autoit: () => import('highlight.js/lib/languages/autoit'),
19
+ avrasm: () => import('highlight.js/lib/languages/avrasm'),
20
+ awk: () => import('highlight.js/lib/languages/awk'),
21
+ axapta: () => import('highlight.js/lib/languages/axapta'),
22
+ bash: () => import('highlight.js/lib/languages/bash'),
23
+ basic: () => import('highlight.js/lib/languages/basic'),
24
+ bnf: () => import('highlight.js/lib/languages/bnf'),
25
+ brainfuck: () => import('highlight.js/lib/languages/brainfuck'),
26
+ c: () => import('highlight.js/lib/languages/c'),
27
+ cal: () => import('highlight.js/lib/languages/cal'),
28
+ capnproto: () => import('highlight.js/lib/languages/capnproto'),
29
+ ceylon: () => import('highlight.js/lib/languages/ceylon'),
30
+ clean: () => import('highlight.js/lib/languages/clean'),
31
+ 'clojure-repl': () => import('highlight.js/lib/languages/clojure-repl'),
32
+ clojure: () => import('highlight.js/lib/languages/clojure'),
33
+ cmake: () => import('highlight.js/lib/languages/cmake'),
34
+ coffeescript: () => import('highlight.js/lib/languages/coffeescript'),
35
+ coq: () => import('highlight.js/lib/languages/coq'),
36
+ cos: () => import('highlight.js/lib/languages/cos'),
37
+ cpp: () => import('highlight.js/lib/languages/cpp'),
38
+ crmsh: () => import('highlight.js/lib/languages/crmsh'),
39
+ crystal: () => import('highlight.js/lib/languages/crystal'),
40
+ csharp: () => import('highlight.js/lib/languages/csharp'),
41
+ csp: () => import('highlight.js/lib/languages/csp'),
42
+ css: () => import('highlight.js/lib/languages/css'),
43
+ d: () => import('highlight.js/lib/languages/d'),
44
+ dart: () => import('highlight.js/lib/languages/dart'),
45
+ delphi: () => import('highlight.js/lib/languages/delphi'),
46
+ diff: () => import('highlight.js/lib/languages/diff'),
47
+ django: () => import('highlight.js/lib/languages/django'),
48
+ dns: () => import('highlight.js/lib/languages/dns'),
49
+ dockerfile: () => import('highlight.js/lib/languages/dockerfile'),
50
+ dos: () => import('highlight.js/lib/languages/dos'),
51
+ dsconfig: () => import('highlight.js/lib/languages/dsconfig'),
52
+ dts: () => import('highlight.js/lib/languages/dts'),
53
+ dust: () => import('highlight.js/lib/languages/dust'),
54
+ ebnf: () => import('highlight.js/lib/languages/ebnf'),
55
+ elixir: () => import('highlight.js/lib/languages/elixir'),
56
+ elm: () => import('highlight.js/lib/languages/elm'),
57
+ erb: () => import('highlight.js/lib/languages/erb'),
58
+ 'erlang-repl': () => import('highlight.js/lib/languages/erlang-repl'),
59
+ erlang: () => import('highlight.js/lib/languages/erlang'),
60
+ excel: () => import('highlight.js/lib/languages/excel'),
61
+ fix: () => import('highlight.js/lib/languages/fix'),
62
+ flix: () => import('highlight.js/lib/languages/flix'),
63
+ fortran: () => import('highlight.js/lib/languages/fortran'),
64
+ fsharp: () => import('highlight.js/lib/languages/fsharp'),
65
+ gams: () => import('highlight.js/lib/languages/gams'),
66
+ gauss: () => import('highlight.js/lib/languages/gauss'),
67
+ gcode: () => import('highlight.js/lib/languages/gcode'),
68
+ gherkin: () => import('highlight.js/lib/languages/gherkin'),
69
+ glsl: () => import('highlight.js/lib/languages/glsl'),
70
+ gml: () => import('highlight.js/lib/languages/gml'),
71
+ go: () => import('highlight.js/lib/languages/go'),
72
+ golo: () => import('highlight.js/lib/languages/golo'),
73
+ gradle: () => import('highlight.js/lib/languages/gradle'),
74
+ graphql: () => import('highlight.js/lib/languages/graphql'),
75
+ groovy: () => import('highlight.js/lib/languages/groovy'),
76
+ haml: () => import('highlight.js/lib/languages/haml'),
77
+ handlebars: () => import('highlight.js/lib/languages/handlebars'),
78
+ haskell: () => import('highlight.js/lib/languages/haskell'),
79
+ haxe: () => import('highlight.js/lib/languages/haxe'),
80
+ hsp: () => import('highlight.js/lib/languages/hsp'),
81
+ html: () => import('highlight.js/lib/languages/xml'),
82
+ http: () => import('highlight.js/lib/languages/http'),
83
+ hy: () => import('highlight.js/lib/languages/hy'),
84
+ inform7: () => import('highlight.js/lib/languages/inform7'),
85
+ ini: () => import('highlight.js/lib/languages/ini'),
86
+ irpf90: () => import('highlight.js/lib/languages/irpf90'),
87
+ isbl: () => import('highlight.js/lib/languages/isbl'),
88
+ java: () => import('highlight.js/lib/languages/java'),
89
+ javascript: () => import('highlight.js/lib/languages/javascript'),
90
+ 'jboss-cli': () => import('highlight.js/lib/languages/jboss-cli'),
91
+ json: () => import('highlight.js/lib/languages/json'),
92
+ 'julia-repl': () => import('highlight.js/lib/languages/julia-repl'),
93
+ julia: () => import('highlight.js/lib/languages/julia'),
94
+ kotlin: () => import('highlight.js/lib/languages/kotlin'),
95
+ lasso: () => import('highlight.js/lib/languages/lasso'),
96
+ latex: () => import('highlight.js/lib/languages/latex'),
97
+ ldif: () => import('highlight.js/lib/languages/ldif'),
98
+ leaf: () => import('highlight.js/lib/languages/leaf'),
99
+ less: () => import('highlight.js/lib/languages/less'),
100
+ lisp: () => import('highlight.js/lib/languages/lisp'),
101
+ livecodeserver: () => import('highlight.js/lib/languages/livecodeserver'),
102
+ livescript: () => import('highlight.js/lib/languages/livescript'),
103
+ llvm: () => import('highlight.js/lib/languages/llvm'),
104
+ lsl: () => import('highlight.js/lib/languages/lsl'),
105
+ lua: () => import('highlight.js/lib/languages/lua'),
106
+ makefile: () => import('highlight.js/lib/languages/makefile'),
107
+ markdown: () => import('highlight.js/lib/languages/markdown'),
108
+ mathematica: () => import('highlight.js/lib/languages/mathematica'),
109
+ matlab: () => import('highlight.js/lib/languages/matlab'),
110
+ maxima: () => import('highlight.js/lib/languages/maxima'),
111
+ mel: () => import('highlight.js/lib/languages/mel'),
112
+ mercury: () => import('highlight.js/lib/languages/mercury'),
113
+ mipsasm: () => import('highlight.js/lib/languages/mipsasm'),
114
+ mizar: () => import('highlight.js/lib/languages/mizar'),
115
+ mojolicious: () => import('highlight.js/lib/languages/mojolicious'),
116
+ monkey: () => import('highlight.js/lib/languages/monkey'),
117
+ moonscript: () => import('highlight.js/lib/languages/moonscript'),
118
+ n1ql: () => import('highlight.js/lib/languages/n1ql'),
119
+ nestedtext: () => import('highlight.js/lib/languages/nestedtext'),
120
+ nginx: () => import('highlight.js/lib/languages/nginx'),
121
+ nim: () => import('highlight.js/lib/languages/nim'),
122
+ nix: () => import('highlight.js/lib/languages/nix'),
123
+ 'node-repl': () => import('highlight.js/lib/languages/node-repl'),
124
+ nsis: () => import('highlight.js/lib/languages/nsis'),
125
+ objectivec: () => import('highlight.js/lib/languages/objectivec'),
126
+ ocaml: () => import('highlight.js/lib/languages/ocaml'),
127
+ openscad: () => import('highlight.js/lib/languages/openscad'),
128
+ oxygene: () => import('highlight.js/lib/languages/oxygene'),
129
+ parser3: () => import('highlight.js/lib/languages/parser3'),
130
+ perl: () => import('highlight.js/lib/languages/perl'),
131
+ pf: () => import('highlight.js/lib/languages/pf'),
132
+ pgsql: () => import('highlight.js/lib/languages/pgsql'),
133
+ 'php-template': () => import('highlight.js/lib/languages/php-template'),
134
+ php: () => import('highlight.js/lib/languages/php'),
135
+ plaintext: () => import('highlight.js/lib/languages/plaintext'),
136
+ pony: () => import('highlight.js/lib/languages/pony'),
137
+ powershell: () => import('highlight.js/lib/languages/powershell'),
138
+ processing: () => import('highlight.js/lib/languages/processing'),
139
+ profile: () => import('highlight.js/lib/languages/profile'),
140
+ prolog: () => import('highlight.js/lib/languages/prolog'),
141
+ properties: () => import('highlight.js/lib/languages/properties'),
142
+ protobuf: () => import('highlight.js/lib/languages/protobuf'),
143
+ puppet: () => import('highlight.js/lib/languages/puppet'),
144
+ purebasic: () => import('highlight.js/lib/languages/purebasic'),
145
+ 'python-repl': () => import('highlight.js/lib/languages/python-repl'),
146
+ python: () => import('highlight.js/lib/languages/python'),
147
+ q: () => import('highlight.js/lib/languages/q'),
148
+ qml: () => import('highlight.js/lib/languages/qml'),
149
+ r: () => import('highlight.js/lib/languages/r'),
150
+ reasonml: () => import('highlight.js/lib/languages/reasonml'),
151
+ rib: () => import('highlight.js/lib/languages/rib'),
152
+ roboconf: () => import('highlight.js/lib/languages/roboconf'),
153
+ routeros: () => import('highlight.js/lib/languages/routeros'),
154
+ rsl: () => import('highlight.js/lib/languages/rsl'),
155
+ ruby: () => import('highlight.js/lib/languages/ruby'),
156
+ ruleslanguage: () => import('highlight.js/lib/languages/ruleslanguage'),
157
+ rust: () => import('highlight.js/lib/languages/rust'),
158
+ sas: () => import('highlight.js/lib/languages/sas'),
159
+ scala: () => import('highlight.js/lib/languages/scala'),
160
+ scheme: () => import('highlight.js/lib/languages/scheme'),
161
+ scilab: () => import('highlight.js/lib/languages/scilab'),
162
+ scss: () => import('highlight.js/lib/languages/scss'),
163
+ shell: () => import('highlight.js/lib/languages/shell'),
164
+ smali: () => import('highlight.js/lib/languages/smali'),
165
+ smalltalk: () => import('highlight.js/lib/languages/smalltalk'),
166
+ sml: () => import('highlight.js/lib/languages/sml'),
167
+ sqf: () => import('highlight.js/lib/languages/sqf'),
168
+ sql: () => import('highlight.js/lib/languages/sql'),
169
+ stan: () => import('highlight.js/lib/languages/stan'),
170
+ stata: () => import('highlight.js/lib/languages/stata'),
171
+ step21: () => import('highlight.js/lib/languages/step21'),
172
+ stylus: () => import('highlight.js/lib/languages/stylus'),
173
+ subunit: () => import('highlight.js/lib/languages/subunit'),
174
+ swift: () => import('highlight.js/lib/languages/swift'),
175
+ taggerscript: () => import('highlight.js/lib/languages/taggerscript'),
176
+ tap: () => import('highlight.js/lib/languages/tap'),
177
+ tcl: () => import('highlight.js/lib/languages/tcl'),
178
+ thrift: () => import('highlight.js/lib/languages/thrift'),
179
+ tp: () => import('highlight.js/lib/languages/tp'),
180
+ twig: () => import('highlight.js/lib/languages/twig'),
181
+ typescript: () => import('highlight.js/lib/languages/typescript'),
182
+ vala: () => import('highlight.js/lib/languages/vala'),
183
+ vbnet: () => import('highlight.js/lib/languages/vbnet'),
184
+ 'vbscript-html': () => import('highlight.js/lib/languages/vbscript-html'),
185
+ vbscript: () => import('highlight.js/lib/languages/vbscript'),
186
+ verilog: () => import('highlight.js/lib/languages/verilog'),
187
+ vhdl: () => import('highlight.js/lib/languages/vhdl'),
188
+ vim: () => import('highlight.js/lib/languages/vim'),
189
+ wasm: () => import('highlight.js/lib/languages/wasm'),
190
+ wren: () => import('highlight.js/lib/languages/wren'),
191
+ x86asm: () => import('highlight.js/lib/languages/x86asm'),
192
+ xl: () => import('highlight.js/lib/languages/xl'),
193
+ xml: () => import('highlight.js/lib/languages/xml'),
194
+ xquery: () => import('highlight.js/lib/languages/xquery'),
195
+ yaml: () => import('highlight.js/lib/languages/yaml'),
196
+ zephir: () => import('highlight.js/lib/languages/zephir'),
197
+ };
198
+
199
+ export const fileExtensionToLanguage = {
200
+ // JavaScript/TypeScript
201
+ js: 'javascript',
202
+ mjs: 'javascript',
203
+ cjs: 'javascript',
204
+ jsx: 'javascript',
205
+ ts: 'typescript',
206
+ tsx: 'typescript',
207
+ mts: 'typescript',
208
+ cts: 'typescript',
209
+
210
+ // Web
211
+ html: 'html',
212
+ htm: 'html',
213
+ xml: 'xml',
214
+ svg: 'xml',
215
+ css: 'css',
216
+ scss: 'scss',
217
+ sass: 'scss',
218
+ less: 'less',
219
+
220
+ // Python
221
+ py: 'python',
222
+ pyw: 'python',
223
+ pyi: 'python',
224
+
225
+ // Java/JVM
226
+ java: 'java',
227
+ kt: 'kotlin',
228
+ kts: 'kotlin',
229
+ scala: 'scala',
230
+ groovy: 'groovy',
231
+ gradle: 'gradle',
232
+
233
+ // C/C++
234
+ c: 'c',
235
+ h: 'c',
236
+ cpp: 'cpp',
237
+ cc: 'cpp',
238
+ cxx: 'cpp',
239
+ hpp: 'cpp',
240
+ hh: 'cpp',
241
+ hxx: 'cpp',
242
+
243
+ // C#
244
+ cs: 'csharp',
245
+ csx: 'csharp',
246
+
247
+ // PHP
248
+ php: 'php',
249
+ phtml: 'php',
250
+ php3: 'php',
251
+ php4: 'php',
252
+ php5: 'php',
253
+ phps: 'php',
254
+
255
+ // Ruby
256
+ rb: 'ruby',
257
+ rake: 'ruby',
258
+ gemspec: 'ruby',
259
+
260
+ // Go
261
+ go: 'go',
262
+
263
+ // Rust
264
+ rs: 'rust',
265
+
266
+ // Swift
267
+ swift: 'swift',
268
+
269
+ // Shell
270
+ sh: 'bash',
271
+ bash: 'bash',
272
+ zsh: 'bash',
273
+ fish: 'shell',
274
+ bat: 'dos',
275
+ cmd: 'dos',
276
+ ps1: 'powershell',
277
+
278
+ // Config/Data
279
+ json: 'json',
280
+ yaml: 'yaml',
281
+ yml: 'yaml',
282
+ toml: 'ini',
283
+ ini: 'ini',
284
+ cfg: 'ini',
285
+ conf: 'ini',
286
+ properties: 'properties',
287
+
288
+ // Markdown/Docs
289
+ md: 'markdown',
290
+ markdown: 'markdown',
291
+ adoc: 'asciidoc',
292
+ asciidoc: 'asciidoc',
293
+ rst: 'plaintext',
294
+ tex: 'latex',
295
+
296
+ // SQL
297
+ sql: 'sql',
298
+
299
+ // Perl
300
+ pl: 'perl',
301
+ pm: 'perl',
302
+
303
+ // R
304
+ r: 'r',
305
+ R: 'r',
306
+
307
+ // Lua
308
+ lua: 'lua',
309
+
310
+ // Vim
311
+ vim: 'vim',
312
+
313
+ // Dockerfile
314
+ Dockerfile: 'dockerfile',
315
+ dockerfile: 'dockerfile',
316
+
317
+ // Makefile
318
+ Makefile: 'makefile',
319
+ mk: 'makefile',
320
+
321
+ // Diff/Patch
322
+ diff: 'diff',
323
+ patch: 'diff',
324
+
325
+ // Elixir
326
+ ex: 'elixir',
327
+ exs: 'elixir',
328
+
329
+ // Erlang
330
+ erl: 'erlang',
331
+ hrl: 'erlang',
332
+
333
+ // Haskell
334
+ hs: 'haskell',
335
+ lhs: 'haskell',
336
+
337
+ // Clojure
338
+ clj: 'clojure',
339
+ cljs: 'clojure',
340
+ cljc: 'clojure',
341
+
342
+ // Dart
343
+ dart: 'dart',
344
+
345
+ // F#
346
+ fs: 'fsharp',
347
+ fsi: 'fsharp',
348
+ fsx: 'fsharp',
349
+
350
+ // OCaml
351
+ ml: 'ocaml',
352
+ mli: 'ocaml',
353
+
354
+ // Lisp
355
+ lisp: 'lisp',
356
+ lsp: 'lisp',
357
+
358
+ // Scheme
359
+ scm: 'scheme',
360
+ ss: 'scheme',
361
+
362
+ // Julia
363
+ jl: 'julia',
364
+
365
+ // Nim
366
+ nim: 'nim',
367
+
368
+ // Crystal
369
+ cr: 'crystal',
370
+
371
+ // D
372
+ d: 'd',
373
+
374
+ // Fortran
375
+ f: 'fortran',
376
+ f90: 'fortran',
377
+ f95: 'fortran',
378
+
379
+ // Pascal/Delphi
380
+ pas: 'delphi',
381
+ dpr: 'delphi',
382
+
383
+ // Ada
384
+ ada: 'ada',
385
+ adb: 'ada',
386
+ ads: 'ada',
387
+
388
+ // COBOL
389
+ cob: 'coq',
390
+ cbl: 'coq',
391
+
392
+ // Assembly
393
+ asm: 'x86asm',
394
+ s: 'armasm',
395
+
396
+ // Verilog/VHDL
397
+ v: 'verilog',
398
+ vh: 'verilog',
399
+ vhd: 'vhdl',
400
+ vhdl: 'vhdl',
401
+
402
+ // GraphQL
403
+ graphql: 'graphql',
404
+ gql: 'graphql',
405
+
406
+ // Protobuf
407
+ proto: 'protobuf',
408
+
409
+ // Nginx
410
+ nginx: 'nginx',
411
+
412
+ // Apache
413
+ htaccess: 'apache',
414
+
415
+ // CMake
416
+ 'CMakeLists.txt': 'cmake',
417
+ cmake: 'cmake',
418
+
419
+ // Handlebars
420
+ hbs: 'handlebars',
421
+ handlebars: 'handlebars',
422
+
423
+ // Django
424
+ djhtml: 'django',
425
+
426
+ // ERB
427
+ erb: 'erb',
428
+
429
+ // Haml
430
+ haml: 'haml',
431
+
432
+ // Pug
433
+ pug: 'plaintext',
434
+ jade: 'plaintext',
435
+
436
+ // CoffeeScript
437
+ coffee: 'coffeescript',
438
+
439
+ // Elm
440
+ elm: 'elm',
441
+
442
+ // ReasonML
443
+ re: 'reasonml',
444
+ rei: 'reasonml',
445
+
446
+ // Haxe
447
+ hx: 'haxe',
448
+
449
+ // ActionScript
450
+ as: 'actionscript',
451
+
452
+ // VB.NET
453
+ vb: 'vbnet',
454
+
455
+ // VBScript
456
+ vbs: 'vbscript',
457
+
458
+ // AutoHotkey
459
+ ahk: 'autohotkey',
460
+
461
+ // PowerShell
462
+ psm1: 'powershell',
463
+ psd1: 'powershell',
464
+
465
+ // Puppet
466
+ pp: 'puppet',
467
+
468
+ // Terraform
469
+ tf: 'plaintext',
470
+ tfvars: 'plaintext',
471
+
472
+ // Nix
473
+ nix: 'nix',
474
+
475
+ // Awk
476
+ awk: 'awk',
477
+
478
+ // Tcl
479
+ tcl: 'tcl',
480
+
481
+ // Prolog
482
+ pro: 'prolog',
483
+
484
+ // MATLAB
485
+ m: 'matlab',
486
+
487
+ // Mathematica
488
+ nb: 'mathematica',
489
+ wl: 'mathematica',
490
+
491
+ // SAS
492
+ sas: 'sas',
493
+
494
+ // Stata
495
+ do: 'stata',
496
+ ado: 'stata',
497
+
498
+ // GLSL
499
+ glsl: 'glsl',
500
+ vert: 'glsl',
501
+ frag: 'glsl',
502
+
503
+ // WebAssembly
504
+ wasm: 'wasm',
505
+ wat: 'wasm',
506
+
507
+ // Thrift
508
+ thrift: 'thrift',
509
+
510
+ // Stylus
511
+ styl: 'stylus',
512
+
513
+ // Twig
514
+ twig: 'twig',
515
+
516
+ // Smarty
517
+ tpl: 'plaintext',
518
+
519
+ // Dust
520
+ dust: 'dust',
521
+ };
522
+
523
+ const loadLanguagePackages = async (languages = []) => {
524
+ try {
525
+ await Promise.all(
526
+ languages.map(async (language) => {
527
+ // Check if language is a file extension and map it to the actual language
528
+ const actualLanguage = fileExtensionToLanguage[language] || language;
529
+
530
+ const loader = languageLoaders[actualLanguage];
531
+ if (!highlightjs.listLanguages().includes(actualLanguage) && loader) {
532
+ const languageModule = await loader();
533
+ highlightjs.registerLanguage(actualLanguage, languageModule.default);
534
+ highlightjs.registerAliases([language], { languageName: actualLanguage });
535
+ }
536
+ })
537
+ );
538
+ } catch (e) {
539
+ throw Error('Could not load highlight.js languages for duo chat syntax highlighting');
540
+ }
541
+ };
542
+
543
+ export const highlightElement = async (element, languages) => {
544
+ // eslint-disable-next-line no-console
545
+ await loadLanguagePackages(languages);
546
+
547
+ if (typeof window.requestIdleCallback === 'function') {
548
+ window.requestIdleCallback(() => highlightjs.highlightElement(element), { timeout: 500 });
549
+ } else {
550
+ window.requestAnimationFrame(() => highlightjs.highlightElement(element));
551
+ }
552
+ };
553
+
554
+ export const highlightCode = async (code, languages) => {
555
+ await loadLanguagePackages(languages);
556
+
557
+ const language = languages.pop();
558
+
559
+ return highlightjs.listLanguages().includes(language)
560
+ ? highlightjs.highlight(code, { language }).value
561
+ : code;
562
+ };
package/translations.js CHANGED
@@ -95,6 +95,7 @@ export default {
95
95
  'Clock icon with circular arrow, indicating chat history or time-based functionality',
96
96
  'DuoChat.emptyHistoryCopy': 'Your previous chats will appear here.',
97
97
  'DuoChat.emptyHistoryTitle': 'See your chat history',
98
+ 'DuoChat.loadingThreads': 'Loading chat history...',
98
99
  'DuoChat.openChatLabel': 'Open chat: %{title}',
99
100
  'DuoChat.threadDeleteLabel': 'Delete this chat',
100
101
  'DuoChat.untitledChatTitle': 'Untitled Chat',
@@ -1,21 +0,0 @@
1
- import highlightjs from 'highlight.js/lib/core';
2
- import json from 'highlight.js/lib/languages/json';
3
- import diff from 'highlight.js/lib/languages/diff';
4
- import markdown from 'highlight.js/lib/languages/markdown';
5
-
6
- const highlightElement = element => {
7
- if (!highlightjs.listLanguages().includes('json')) {
8
- highlightjs.registerLanguage('json', json);
9
- highlightjs.registerLanguage('diff', diff);
10
- highlightjs.registerLanguage('markdown', markdown);
11
- }
12
- if (typeof window.requestIdleCallback === 'function') {
13
- window.requestIdleCallback(() => highlightjs.highlightElement(element), {
14
- timeout: 500
15
- });
16
- } else {
17
- window.requestAnimationFrame(() => highlightjs.highlightElement(element));
18
- }
19
- };
20
-
21
- export { highlightElement };
@@ -1,18 +0,0 @@
1
- import highlightjs from 'highlight.js/lib/core';
2
- import json from 'highlight.js/lib/languages/json';
3
- import diff from 'highlight.js/lib/languages/diff';
4
- import markdown from 'highlight.js/lib/languages/markdown';
5
-
6
- export const highlightElement = (element) => {
7
- if (!highlightjs.listLanguages().includes('json')) {
8
- highlightjs.registerLanguage('json', json);
9
- highlightjs.registerLanguage('diff', diff);
10
- highlightjs.registerLanguage('markdown', markdown);
11
- }
12
-
13
- if (typeof window.requestIdleCallback === 'function') {
14
- window.requestIdleCallback(() => highlightjs.highlightElement(element), { timeout: 500 });
15
- } else {
16
- window.requestAnimationFrame(() => highlightjs.highlightElement(element));
17
- }
18
- };