khoj 1.16.1.dev15__py3-none-any.whl

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 (242) hide show
  1. khoj/__init__.py +0 -0
  2. khoj/app/README.md +94 -0
  3. khoj/app/__init__.py +0 -0
  4. khoj/app/asgi.py +16 -0
  5. khoj/app/settings.py +192 -0
  6. khoj/app/urls.py +25 -0
  7. khoj/configure.py +424 -0
  8. khoj/database/__init__.py +0 -0
  9. khoj/database/adapters/__init__.py +1234 -0
  10. khoj/database/admin.py +290 -0
  11. khoj/database/apps.py +6 -0
  12. khoj/database/management/__init__.py +0 -0
  13. khoj/database/management/commands/__init__.py +0 -0
  14. khoj/database/management/commands/change_generated_images_url.py +61 -0
  15. khoj/database/management/commands/convert_images_png_to_webp.py +99 -0
  16. khoj/database/migrations/0001_khojuser.py +98 -0
  17. khoj/database/migrations/0002_googleuser.py +32 -0
  18. khoj/database/migrations/0003_vector_extension.py +10 -0
  19. khoj/database/migrations/0004_content_types_and_more.py +181 -0
  20. khoj/database/migrations/0005_embeddings_corpus_id.py +19 -0
  21. khoj/database/migrations/0006_embeddingsdates.py +33 -0
  22. khoj/database/migrations/0007_add_conversation.py +27 -0
  23. khoj/database/migrations/0008_alter_conversation_conversation_log.py +17 -0
  24. khoj/database/migrations/0009_khojapiuser.py +24 -0
  25. khoj/database/migrations/0010_chatmodeloptions_and_more.py +83 -0
  26. khoj/database/migrations/0010_rename_embeddings_entry_and_more.py +30 -0
  27. khoj/database/migrations/0011_merge_20231102_0138.py +14 -0
  28. khoj/database/migrations/0012_entry_file_source.py +21 -0
  29. khoj/database/migrations/0013_subscription.py +37 -0
  30. khoj/database/migrations/0014_alter_googleuser_picture.py +17 -0
  31. khoj/database/migrations/0015_alter_subscription_user.py +21 -0
  32. khoj/database/migrations/0016_alter_subscription_renewal_date.py +17 -0
  33. khoj/database/migrations/0017_searchmodel.py +32 -0
  34. khoj/database/migrations/0018_searchmodelconfig_delete_searchmodel.py +30 -0
  35. khoj/database/migrations/0019_alter_googleuser_family_name_and_more.py +27 -0
  36. khoj/database/migrations/0020_reflectivequestion.py +36 -0
  37. khoj/database/migrations/0021_speechtotextmodeloptions_and_more.py +42 -0
  38. khoj/database/migrations/0022_texttoimagemodelconfig.py +25 -0
  39. khoj/database/migrations/0023_usersearchmodelconfig.py +33 -0
  40. khoj/database/migrations/0024_alter_entry_embeddings.py +18 -0
  41. khoj/database/migrations/0025_clientapplication_khojuser_phone_number_and_more.py +46 -0
  42. khoj/database/migrations/0025_searchmodelconfig_embeddings_inference_endpoint_and_more.py +22 -0
  43. khoj/database/migrations/0026_searchmodelconfig_cross_encoder_inference_endpoint_and_more.py +22 -0
  44. khoj/database/migrations/0027_merge_20240118_1324.py +13 -0
  45. khoj/database/migrations/0028_khojuser_verified_phone_number.py +17 -0
  46. khoj/database/migrations/0029_userrequests.py +27 -0
  47. khoj/database/migrations/0030_conversation_slug_and_title.py +38 -0
  48. khoj/database/migrations/0031_agent_conversation_agent.py +53 -0
  49. khoj/database/migrations/0031_alter_googleuser_locale.py +30 -0
  50. khoj/database/migrations/0032_merge_20240322_0427.py +14 -0
  51. khoj/database/migrations/0033_rename_tuning_agent_personality.py +17 -0
  52. khoj/database/migrations/0034_alter_chatmodeloptions_chat_model.py +32 -0
  53. khoj/database/migrations/0035_processlock.py +26 -0
  54. khoj/database/migrations/0036_alter_processlock_name.py +19 -0
  55. khoj/database/migrations/0036_delete_offlinechatprocessorconversationconfig.py +15 -0
  56. khoj/database/migrations/0036_publicconversation.py +42 -0
  57. khoj/database/migrations/0037_chatmodeloptions_openai_config_and_more.py +51 -0
  58. khoj/database/migrations/0037_searchmodelconfig_bi_encoder_docs_encode_config_and_more.py +32 -0
  59. khoj/database/migrations/0038_merge_20240425_0857.py +14 -0
  60. khoj/database/migrations/0038_merge_20240426_1640.py +12 -0
  61. khoj/database/migrations/0039_merge_20240501_0301.py +12 -0
  62. khoj/database/migrations/0040_alter_processlock_name.py +26 -0
  63. khoj/database/migrations/0040_merge_20240504_1010.py +14 -0
  64. khoj/database/migrations/0041_merge_20240505_1234.py +14 -0
  65. khoj/database/migrations/0042_serverchatsettings.py +46 -0
  66. khoj/database/migrations/0043_alter_chatmodeloptions_model_type.py +21 -0
  67. khoj/database/migrations/0044_conversation_file_filters.py +17 -0
  68. khoj/database/migrations/0045_fileobject.py +37 -0
  69. khoj/database/migrations/0046_khojuser_email_verification_code_and_more.py +22 -0
  70. khoj/database/migrations/0047_alter_entry_file_type.py +31 -0
  71. khoj/database/migrations/0048_voicemodeloption_uservoicemodelconfig.py +52 -0
  72. khoj/database/migrations/0049_datastore.py +38 -0
  73. khoj/database/migrations/0049_texttoimagemodelconfig_api_key_and_more.py +58 -0
  74. khoj/database/migrations/0050_alter_processlock_name.py +25 -0
  75. khoj/database/migrations/0051_merge_20240702_1220.py +14 -0
  76. khoj/database/migrations/0052_alter_searchmodelconfig_bi_encoder_docs_encode_config_and_more.py +27 -0
  77. khoj/database/migrations/__init__.py +0 -0
  78. khoj/database/models/__init__.py +402 -0
  79. khoj/database/tests.py +3 -0
  80. khoj/interface/email/feedback.html +34 -0
  81. khoj/interface/email/magic_link.html +17 -0
  82. khoj/interface/email/task.html +40 -0
  83. khoj/interface/email/welcome.html +61 -0
  84. khoj/interface/web/404.html +56 -0
  85. khoj/interface/web/agent.html +312 -0
  86. khoj/interface/web/agents.html +276 -0
  87. khoj/interface/web/assets/icons/agents.svg +6 -0
  88. khoj/interface/web/assets/icons/automation.svg +37 -0
  89. khoj/interface/web/assets/icons/cancel.svg +3 -0
  90. khoj/interface/web/assets/icons/chat.svg +24 -0
  91. khoj/interface/web/assets/icons/collapse.svg +17 -0
  92. khoj/interface/web/assets/icons/computer.png +0 -0
  93. khoj/interface/web/assets/icons/confirm-icon.svg +1 -0
  94. khoj/interface/web/assets/icons/copy-button-success.svg +6 -0
  95. khoj/interface/web/assets/icons/copy-button.svg +5 -0
  96. khoj/interface/web/assets/icons/credit-card.png +0 -0
  97. khoj/interface/web/assets/icons/delete.svg +26 -0
  98. khoj/interface/web/assets/icons/docx.svg +7 -0
  99. khoj/interface/web/assets/icons/edit.svg +4 -0
  100. khoj/interface/web/assets/icons/favicon-128x128.ico +0 -0
  101. khoj/interface/web/assets/icons/favicon-128x128.png +0 -0
  102. khoj/interface/web/assets/icons/favicon-256x256.png +0 -0
  103. khoj/interface/web/assets/icons/favicon.icns +0 -0
  104. khoj/interface/web/assets/icons/github.svg +1 -0
  105. khoj/interface/web/assets/icons/key.svg +4 -0
  106. khoj/interface/web/assets/icons/khoj-logo-sideways-200.png +0 -0
  107. khoj/interface/web/assets/icons/khoj-logo-sideways-500.png +0 -0
  108. khoj/interface/web/assets/icons/khoj-logo-sideways.svg +5385 -0
  109. khoj/interface/web/assets/icons/logotype.svg +1 -0
  110. khoj/interface/web/assets/icons/markdown.svg +1 -0
  111. khoj/interface/web/assets/icons/new.svg +23 -0
  112. khoj/interface/web/assets/icons/notion.svg +4 -0
  113. khoj/interface/web/assets/icons/openai-logomark.svg +1 -0
  114. khoj/interface/web/assets/icons/org.svg +1 -0
  115. khoj/interface/web/assets/icons/pdf.svg +23 -0
  116. khoj/interface/web/assets/icons/pencil-edit.svg +5 -0
  117. khoj/interface/web/assets/icons/plaintext.svg +1 -0
  118. khoj/interface/web/assets/icons/question-mark-icon.svg +1 -0
  119. khoj/interface/web/assets/icons/search.svg +25 -0
  120. khoj/interface/web/assets/icons/send.svg +1 -0
  121. khoj/interface/web/assets/icons/share.svg +8 -0
  122. khoj/interface/web/assets/icons/speaker.svg +4 -0
  123. khoj/interface/web/assets/icons/stop-solid.svg +37 -0
  124. khoj/interface/web/assets/icons/sync.svg +4 -0
  125. khoj/interface/web/assets/icons/thumbs-down-svgrepo-com.svg +6 -0
  126. khoj/interface/web/assets/icons/thumbs-up-svgrepo-com.svg +6 -0
  127. khoj/interface/web/assets/icons/user-silhouette.svg +4 -0
  128. khoj/interface/web/assets/icons/voice.svg +8 -0
  129. khoj/interface/web/assets/icons/web.svg +2 -0
  130. khoj/interface/web/assets/icons/whatsapp.svg +17 -0
  131. khoj/interface/web/assets/khoj.css +237 -0
  132. khoj/interface/web/assets/markdown-it.min.js +8476 -0
  133. khoj/interface/web/assets/natural-cron.min.js +1 -0
  134. khoj/interface/web/assets/org.min.js +1823 -0
  135. khoj/interface/web/assets/pico.min.css +5 -0
  136. khoj/interface/web/assets/purify.min.js +3 -0
  137. khoj/interface/web/assets/samples/desktop-browse-draw-sample.png +0 -0
  138. khoj/interface/web/assets/samples/desktop-plain-chat-sample.png +0 -0
  139. khoj/interface/web/assets/samples/desktop-remember-plan-sample.png +0 -0
  140. khoj/interface/web/assets/samples/phone-browse-draw-sample.png +0 -0
  141. khoj/interface/web/assets/samples/phone-plain-chat-sample.png +0 -0
  142. khoj/interface/web/assets/samples/phone-remember-plan-sample.png +0 -0
  143. khoj/interface/web/assets/utils.js +33 -0
  144. khoj/interface/web/base_config.html +445 -0
  145. khoj/interface/web/chat.html +3546 -0
  146. khoj/interface/web/config.html +1011 -0
  147. khoj/interface/web/config_automation.html +1103 -0
  148. khoj/interface/web/content_source_computer_input.html +139 -0
  149. khoj/interface/web/content_source_github_input.html +216 -0
  150. khoj/interface/web/content_source_notion_input.html +94 -0
  151. khoj/interface/web/khoj.webmanifest +51 -0
  152. khoj/interface/web/login.html +219 -0
  153. khoj/interface/web/public_conversation.html +2006 -0
  154. khoj/interface/web/search.html +470 -0
  155. khoj/interface/web/utils.html +48 -0
  156. khoj/main.py +241 -0
  157. khoj/manage.py +22 -0
  158. khoj/migrations/__init__.py +0 -0
  159. khoj/migrations/migrate_offline_chat_default_model.py +69 -0
  160. khoj/migrations/migrate_offline_chat_default_model_2.py +71 -0
  161. khoj/migrations/migrate_offline_chat_schema.py +83 -0
  162. khoj/migrations/migrate_offline_model.py +29 -0
  163. khoj/migrations/migrate_processor_config_openai.py +67 -0
  164. khoj/migrations/migrate_server_pg.py +138 -0
  165. khoj/migrations/migrate_version.py +17 -0
  166. khoj/processor/__init__.py +0 -0
  167. khoj/processor/content/__init__.py +0 -0
  168. khoj/processor/content/docx/__init__.py +0 -0
  169. khoj/processor/content/docx/docx_to_entries.py +110 -0
  170. khoj/processor/content/github/__init__.py +0 -0
  171. khoj/processor/content/github/github_to_entries.py +224 -0
  172. khoj/processor/content/images/__init__.py +0 -0
  173. khoj/processor/content/images/image_to_entries.py +118 -0
  174. khoj/processor/content/markdown/__init__.py +0 -0
  175. khoj/processor/content/markdown/markdown_to_entries.py +165 -0
  176. khoj/processor/content/notion/notion_to_entries.py +260 -0
  177. khoj/processor/content/org_mode/__init__.py +0 -0
  178. khoj/processor/content/org_mode/org_to_entries.py +231 -0
  179. khoj/processor/content/org_mode/orgnode.py +532 -0
  180. khoj/processor/content/pdf/__init__.py +0 -0
  181. khoj/processor/content/pdf/pdf_to_entries.py +116 -0
  182. khoj/processor/content/plaintext/__init__.py +0 -0
  183. khoj/processor/content/plaintext/plaintext_to_entries.py +122 -0
  184. khoj/processor/content/text_to_entries.py +297 -0
  185. khoj/processor/conversation/__init__.py +0 -0
  186. khoj/processor/conversation/anthropic/__init__.py +0 -0
  187. khoj/processor/conversation/anthropic/anthropic_chat.py +206 -0
  188. khoj/processor/conversation/anthropic/utils.py +114 -0
  189. khoj/processor/conversation/offline/__init__.py +0 -0
  190. khoj/processor/conversation/offline/chat_model.py +231 -0
  191. khoj/processor/conversation/offline/utils.py +78 -0
  192. khoj/processor/conversation/offline/whisper.py +15 -0
  193. khoj/processor/conversation/openai/__init__.py +0 -0
  194. khoj/processor/conversation/openai/gpt.py +187 -0
  195. khoj/processor/conversation/openai/utils.py +129 -0
  196. khoj/processor/conversation/openai/whisper.py +13 -0
  197. khoj/processor/conversation/prompts.py +758 -0
  198. khoj/processor/conversation/utils.py +262 -0
  199. khoj/processor/embeddings.py +117 -0
  200. khoj/processor/speech/__init__.py +0 -0
  201. khoj/processor/speech/text_to_speech.py +51 -0
  202. khoj/processor/tools/__init__.py +0 -0
  203. khoj/processor/tools/online_search.py +225 -0
  204. khoj/routers/__init__.py +0 -0
  205. khoj/routers/api.py +626 -0
  206. khoj/routers/api_agents.py +43 -0
  207. khoj/routers/api_chat.py +1180 -0
  208. khoj/routers/api_config.py +434 -0
  209. khoj/routers/api_phone.py +86 -0
  210. khoj/routers/auth.py +181 -0
  211. khoj/routers/email.py +133 -0
  212. khoj/routers/helpers.py +1188 -0
  213. khoj/routers/indexer.py +349 -0
  214. khoj/routers/notion.py +91 -0
  215. khoj/routers/storage.py +35 -0
  216. khoj/routers/subscription.py +104 -0
  217. khoj/routers/twilio.py +36 -0
  218. khoj/routers/web_client.py +471 -0
  219. khoj/search_filter/__init__.py +0 -0
  220. khoj/search_filter/base_filter.py +15 -0
  221. khoj/search_filter/date_filter.py +217 -0
  222. khoj/search_filter/file_filter.py +30 -0
  223. khoj/search_filter/word_filter.py +29 -0
  224. khoj/search_type/__init__.py +0 -0
  225. khoj/search_type/text_search.py +241 -0
  226. khoj/utils/__init__.py +0 -0
  227. khoj/utils/cli.py +93 -0
  228. khoj/utils/config.py +81 -0
  229. khoj/utils/constants.py +24 -0
  230. khoj/utils/fs_syncer.py +249 -0
  231. khoj/utils/helpers.py +418 -0
  232. khoj/utils/initialization.py +146 -0
  233. khoj/utils/jsonl.py +43 -0
  234. khoj/utils/models.py +47 -0
  235. khoj/utils/rawconfig.py +160 -0
  236. khoj/utils/state.py +46 -0
  237. khoj/utils/yaml.py +43 -0
  238. khoj-1.16.1.dev15.dist-info/METADATA +178 -0
  239. khoj-1.16.1.dev15.dist-info/RECORD +242 -0
  240. khoj-1.16.1.dev15.dist-info/WHEEL +4 -0
  241. khoj-1.16.1.dev15.dist-info/entry_points.txt +2 -0
  242. khoj-1.16.1.dev15.dist-info/licenses/LICENSE +661 -0
@@ -0,0 +1,312 @@
1
+ <html>
2
+ <head>
3
+ <meta charset="utf-8">
4
+ <meta name="viewport" content="width=device-width, initial-scale=1.0 maximum-scale=1.0">
5
+ <title>Khoj - Agents</title>
6
+
7
+ <link rel="icon" type="image/png" sizes="128x128" href="/static/assets/icons/favicon-128x128.png?v={{ khoj_version }}">
8
+ <link rel="manifest" href="/static/khoj.webmanifest?v={{ khoj_version }}">
9
+ <link rel="stylesheet" href="/static/assets/khoj.css?v={{ khoj_version }}">
10
+ </head>
11
+ <script type="text/javascript" src="/static/assets/utils.js?v={{ khoj_version }}"></script>
12
+ <body>
13
+ <!--Add Header Logo and Nav Pane-->
14
+ {% import 'utils.html' as utils %}
15
+ {{ utils.heading_pane(user_photo, username, is_active, has_documents) }}
16
+ <div id="agent-metadata-wrapper">
17
+ <div id="agent-metadata">
18
+ <div id="agent-avatar-wrapper">
19
+ <div id="agent-settings-header">Agent Settings</div>
20
+ </div>
21
+ <div class="divider"></div>
22
+ <div id="agent-data-wrapper">
23
+ <div id="agent-avatar-wrapper">
24
+ <img id="agent-avatar" src="{{ agent.avatar }}" alt="Agent Avatar">
25
+ <input type="text" id="agent-name-input" value="{{ agent.name }}" {% if agent.creator_not_self %} disabled {% endif %}>
26
+ </div>
27
+ <div id="agent-instructions">
28
+ Personality
29
+ <button id="toggle-agent-tuning" onclick="toggleAgentTuning()">↓</button>
30
+ </div>
31
+ <div id="agent-tuning">
32
+ <p>{{ agent.personality }}</p>
33
+ </div>
34
+ <div class="divider"></div>
35
+ <div id="agent-public">
36
+ <p>Public</p>
37
+ <label class="switch">
38
+ <input type="checkbox" {% if agent.public %} checked {% endif %} {% if agent.creator_not_self %} disabled {% endif %}>
39
+ <span class="slider round"></span>
40
+ </label>
41
+ </div>
42
+ <p id="agent-creator" style="display: none;">Creator: {{ agent.creator }}</p>
43
+ <p id="agent-managed-by-admin" style="display: none;">ⓘ This agent is managed by the administrator</p>
44
+ <button onclick="openChat('{{ agent.slug }}')">Chat</button>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ <div id="footer">
49
+ <a href="/agents">All Agents</a>
50
+ </div>
51
+ </body>
52
+ <style>
53
+ body {
54
+ background-color: var(--background-color);
55
+ display: grid;
56
+ color: var(--main-text-color);
57
+ text-align: center;
58
+ font-family: var(--font-family);
59
+ font-size: medium;
60
+ font-weight: 300;
61
+ line-height: 1.5em;
62
+ height: 100vh;
63
+ margin: 0;
64
+ grid-template-rows: auto 1fr auto;
65
+ }
66
+
67
+ div#agent-settings-header {
68
+ font-size: 24px;
69
+ font-weight: bold;
70
+ margin-top: auto;
71
+ margin-bottom: auto;
72
+ }
73
+
74
+ div.divider {
75
+ margin-top: 10px;
76
+ margin-bottom: 10px;
77
+ border-bottom: 2px solid var(--main-text-color);
78
+ }
79
+
80
+ div#footer {
81
+ width: auto;
82
+ padding: 10px;
83
+ background-color: var(--background-color);
84
+ border-top: 1px solid var(--main-text-color);
85
+ text-align: left;
86
+ margin-top: 12px;
87
+ margin-bottom: 12px;
88
+ }
89
+
90
+ div#footer a {
91
+ font-size: 18px;
92
+ font-weight: bold;
93
+ color: var(--primary-color);
94
+ }
95
+
96
+ div#agent-data-wrapper button {
97
+ font-size: 24px;
98
+ font-weight: bold;
99
+ padding: 10px;
100
+ border: none;
101
+ border-radius: 8px;
102
+ background-color: var(--summer-sun);
103
+ font: inherit;
104
+ color: var(--main-text-color);
105
+ cursor: pointer;
106
+ transition: background-color 0.3s;
107
+ }
108
+
109
+ div#agent-data-wrapper button:hover {
110
+ background-color: var(--primary-hover);
111
+ box-shadow: 0 0 10px var(--primary-hover);
112
+ }
113
+
114
+ input#agent-name-input {
115
+ font-size: 24px;
116
+ font-weight: bold;
117
+ text-align: left;
118
+ background-color: #EEEEEE;
119
+ color: var(--main-text-color);
120
+ border-radius: 8px;
121
+ padding: 8px;
122
+ border: none;
123
+ }
124
+
125
+ div#agent-instructions {
126
+ font-size: 24px;
127
+ font-weight: bold;
128
+ }
129
+
130
+ #agent-metadata {
131
+ padding: 10px;
132
+ background-color: #f8f9fa;
133
+ border-radius: 5px;
134
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
135
+ text-align: left;
136
+ padding: 20px;
137
+ }
138
+
139
+ #agent-avatar-wrapper {
140
+ margin-right: 10px;
141
+ display: flex;
142
+ flex-direction: row;
143
+ }
144
+
145
+ #agent-avatar {
146
+ width: 50px;
147
+ height: 50px;
148
+ border-radius: 50%;
149
+ object-fit: cover;
150
+ margin-right: 10px;
151
+ }
152
+
153
+ #agent-name {
154
+ font-size: 18px;
155
+ font-weight: bold;
156
+ color: #333;
157
+ }
158
+
159
+ #agent-tuning, #agent-public, #agent-creator, #agent-managed-by-admin {
160
+ font-size: 14px;
161
+ color: #666;
162
+ }
163
+
164
+ #agent-tuning p {
165
+ white-space: pre-line;
166
+ }
167
+
168
+ #agent-metadata p {
169
+ margin: 0;
170
+ padding: 0;
171
+ }
172
+
173
+ #agent-public {
174
+ display: grid;
175
+ grid-template-columns: auto 1fr;
176
+ grid-gap: 12px;
177
+ }
178
+
179
+ .switch {
180
+ position: relative;
181
+ display: inline-block;
182
+ width: 50px;
183
+ height: 24px;
184
+ }
185
+
186
+ .switch input {
187
+ opacity: 0;
188
+ width: 0;
189
+ height: 0;
190
+ }
191
+
192
+ .slider {
193
+ position: absolute;
194
+ cursor: pointer;
195
+ top: 0;
196
+ left: 0;
197
+ right: 0;
198
+ bottom: 0;
199
+ background-color: #ccc;
200
+ -webkit-transition: .4s;
201
+ transition: .4s;
202
+ }
203
+
204
+ .slider:before {
205
+ position: absolute;
206
+ content: "";
207
+ height: 16px;
208
+ width: 16px;
209
+ left: 4px;
210
+ bottom: 4px;
211
+ background-color: white;
212
+ -webkit-transition: .4s;
213
+ transition: .4s;
214
+ }
215
+
216
+ input:checked + .slider {
217
+ background-color: var(--primary-hover);
218
+ }
219
+
220
+ input:focus + .slider {
221
+ box-shadow: 0 0 1px var(--primary-hover);
222
+ }
223
+
224
+ input:checked + .slider:before {
225
+ -webkit-transform: translateX(26px);
226
+ -ms-transform: translateX(26px);
227
+ transform: translateX(26px);
228
+ }
229
+
230
+ div#agent-data-wrapper {
231
+ display: grid;
232
+ grid-template-columns: 1fr;
233
+ grid-gap: 10px;
234
+ text-align: left;
235
+ }
236
+
237
+ /* Rounded sliders */
238
+ .slider.round {
239
+ border-radius: 34px;
240
+ }
241
+
242
+ .slider.round:before {
243
+ border-radius: 50%;
244
+ }
245
+
246
+ div#agent-tuning {
247
+ max-height: 1000px;
248
+ overflow: hidden;
249
+ transition: max-height 0.3s ease-in-out;
250
+ }
251
+
252
+ button#toggle-agent-tuning {
253
+ background-color: var(--primary) !important;
254
+ font-size: small !important;
255
+ }
256
+
257
+ @media only screen and (min-width: 700px) {
258
+ body {
259
+ grid-template-columns: auto min(70vw, 100%) auto;
260
+ }
261
+ body > * {
262
+ grid-column: 2;
263
+ }
264
+ #agent-metadata-wrapper {
265
+ display: block;
266
+ width: min(30vw, 100%);
267
+ margin-left: auto;
268
+ margin-right: auto;
269
+ }
270
+ }
271
+ </style>
272
+ <script>
273
+ async function openChat(agentSlug) {
274
+ let response = await fetch(`/api/chat/sessions?agent_slug=${agentSlug}`, { method: "POST" });
275
+ let data = await response.json();
276
+ if (response.status == 200) {
277
+ window.location.href = "/";
278
+ } else {
279
+ alert("Failed to start chat session");
280
+ }
281
+ }
282
+
283
+ function toggleAgentTuning() {
284
+ var agentTuning = document.getElementById('agent-tuning');
285
+ var toggleButton = document.getElementById('toggle-agent-tuning');
286
+ if (agentTuning.style.maxHeight === '0px') {
287
+ toggleButton.textContent = '↓';
288
+ agentTuning.style.maxHeight = '500px';
289
+ } else {
290
+ toggleButton.textContent = '↑';
291
+ agentTuning.style.maxHeight = '0px';
292
+ }
293
+ }
294
+
295
+ // Show the agent-managed-by-admin paragraph if the agent is managed by the admin
296
+ // compare agent.managed_by_admin as a lowercase string to "true"
297
+ let isManagedByAdmin = "{{ agent.managed_by_admin }}".toLowerCase() === "true";
298
+ if (isManagedByAdmin) {
299
+ document.getElementById("agent-managed-by-admin").style.display = "block";
300
+ } else {
301
+ document.getElementById("agent-creator").style.display = "block";
302
+ }
303
+
304
+ // Resize the input field based on the length of the value
305
+ let input = document.getElementById("agent-name-input");
306
+ input.addEventListener("input", resizeInput);
307
+ resizeInput.call(input);
308
+ function resizeInput() {
309
+ this.style.width = this.value.length + 1 + "ch";
310
+ }
311
+ </script>
312
+ </html>
@@ -0,0 +1,276 @@
1
+ <html>
2
+ <head>
3
+ <meta charset="utf-8">
4
+ <meta name="viewport" content="width=device-width, initial-scale=1.0 maximum-scale=1.0">
5
+ <title>Khoj - Agents</title>
6
+
7
+ <link rel="icon" type="image/png" sizes="128x128" href="/static/assets/icons/favicon-128x128.png?v={{ khoj_version }}">
8
+ <link rel="manifest" href="/static/khoj.webmanifest?v={{ khoj_version }}">
9
+ <link rel="stylesheet" href="/static/assets/khoj.css?v={{ khoj_version }}">
10
+ </head>
11
+ <script type="text/javascript" src="/static/assets/utils.js?v={{ khoj_version }}"></script>
12
+ <body>
13
+ <!--Add Header Logo and Nav Pane-->
14
+ {% import 'utils.html' as utils %}
15
+ {{ utils.heading_pane(user_photo, username, is_active, has_documents) }}
16
+
17
+ <div id="agents-list">
18
+ <div id="agents-header">
19
+ <h1 id="agents-list-title">Chat with an Agent</h1>
20
+ <!-- <div id="create-agent">
21
+ <a href="/agents/create"><svg class="new-convo-button" viewBox="0 0 35 35" fill="#000000" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg">
22
+ <path d="M16 0c-8.836 0-16 7.163-16 16s7.163 16 16 16c8.837 0 16-7.163 16-16s-7.163-16-16-16zM16 30.032c-7.72 0-14-6.312-14-14.032s6.28-14 14-14 14 6.28 14 14-6.28 14.032-14 14.032zM23 15h-6v-6c0-0.552-0.448-1-1-1s-1 0.448-1 1v6h-6c-0.552 0-1 0.448-1 1s0.448 1 1 1h6v6c0 0.552 0.448 1 1 1s1-0.448 1-1v-6h6c0.552 0 1-0.448 1-1s-0.448-1-1-1z"></path>
23
+ </svg></a>
24
+ </div> -->
25
+ </div>
26
+ <div id="agents">
27
+ {% for agent in agents %}
28
+ <div class="agent">
29
+ <a href="/agent/{{ agent.slug }}">
30
+ <div class="agent-avatar">
31
+ <img src="{{ agent.avatar }}" alt="{{ agent.name }}">
32
+ </div>
33
+ </a>
34
+ <div class="agent-info">
35
+ <a href="/agent/{{ agent.slug }}">
36
+ <h2>{{ agent.name }}</h2>
37
+ </a>
38
+ </div>
39
+ <div class="agent-info">
40
+ <button onclick="openChat('{{ agent.slug }}')">
41
+ <img class="send-icon" src="/static/assets/icons/send.svg" alt="Chat">
42
+ </button>
43
+ </div>
44
+ <div class="agent-personality">
45
+ <a href="/agent/{{ agent.slug }}">
46
+ <p>
47
+ {{ agent.personality }}
48
+ </p>
49
+ </a>
50
+ </div>
51
+ </div>
52
+ {% endfor %}
53
+ </div>
54
+ </div>
55
+ <div id="footer">
56
+ <a href="/">Back to Chat</a>
57
+ </div>
58
+ </body>
59
+ <script>
60
+ document.getElementById("agents-nav").classList.add("khoj-nav-selected");
61
+ </script>
62
+ <style>
63
+ body {
64
+ background-color: var(--background-color);
65
+ display: grid;
66
+ color: var(--main-text-color);
67
+ text-align: center;
68
+ font-family: var(--font-family);
69
+ font-size: medium;
70
+ font-weight: 300;
71
+ line-height: 1.5em;
72
+ height: 100vh;
73
+ margin: 0;
74
+ grid-template-rows: auto 1fr auto;
75
+ }
76
+
77
+ h1#agents-list-title {
78
+ margin: 0;
79
+ }
80
+
81
+ .agent-personality p {
82
+ white-space: inherit;
83
+ overflow: hidden;
84
+ height: 100px;
85
+ }
86
+
87
+ div.agent-personality {
88
+ text-align: left;
89
+ grid-column: span 3;
90
+ }
91
+
92
+ div.agent-info {
93
+ font-size: medium;
94
+ }
95
+
96
+ div.agent-info a,
97
+ div.agent-info h2 {
98
+ margin: 0;
99
+ }
100
+
101
+ div.agent img {
102
+ width: 78px;
103
+ height: 78px;
104
+ border-radius: 50%;
105
+ object-fit: cover;
106
+ }
107
+
108
+ div.agent a {
109
+ text-decoration: none;
110
+ color: var(--main-text-color);
111
+ }
112
+
113
+ div#agents-header {
114
+ display: grid;
115
+ grid-template-columns: auto;
116
+ }
117
+
118
+ div#agents-header a,
119
+ div.agent-info button {
120
+ font-size: 24px;
121
+ font-weight: bold;
122
+ padding: 4px;
123
+ border: none;
124
+ border-radius: 8px;
125
+ background-color: var(--summer-sun);
126
+ font: inherit;
127
+ color: var(--main-text-color);
128
+ cursor: pointer;
129
+ transition: background-color 0.3s;
130
+ }
131
+
132
+ div#agents-header a:hover,
133
+ div.agent-info button:hover {
134
+ background-color: var(--primary-hover);
135
+ box-shadow: 0 0 10px var(--primary-hover);
136
+ }
137
+
138
+
139
+ div#footer {
140
+ width: auto;
141
+ padding: 10px;
142
+ background-color: var(--background-color);
143
+ border-top: 1px solid var(--main-text-color);
144
+ text-align: left;
145
+ margin-top: 12px;
146
+ margin-bottom: 12px;
147
+ }
148
+
149
+ div#footer a {
150
+ font-size: 18px;
151
+ font-weight: bold;
152
+ color: var(--primary-color);
153
+ }
154
+
155
+ div.agent {
156
+ display: grid;
157
+ grid-template-columns: auto 1fr auto;
158
+ gap: 20px;
159
+ align-items: center;
160
+ padding: 20px;
161
+ box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
162
+ border-radius: 8px;
163
+ background: linear-gradient(18.48deg,rgba(252, 213, 87, 0.25) 2.76%,rgba(197, 0, 0, 0) 17.23%),linear-gradient(200.6deg,rgba(244, 229, 68, 0.25) 4.13%,rgba(230, 26, 26, 0) 20.54%);
164
+ }
165
+
166
+ div.agent-info {
167
+ text-align: left;
168
+ }
169
+
170
+ div#agents {
171
+ display: grid;
172
+ gap: 20px;
173
+ padding: 20px;
174
+ width: 75%;
175
+ margin-right: auto;
176
+ grid-auto-flow: row;
177
+ grid-template-columns: 1fr 1fr;
178
+ margin-left: auto;
179
+ }
180
+
181
+ svg.new-convo-button {
182
+ width: 20px;
183
+ margin-left: 5px;
184
+ }
185
+
186
+ img.send-icon {
187
+ width: 50px !important;
188
+ height: 50px !important;
189
+ }
190
+
191
+ @media only screen and (min-width: 700px) {
192
+ body {
193
+ grid-template-columns: auto min(70vw, 100%) auto;
194
+ }
195
+ body > * {
196
+ grid-column: 2;
197
+ }
198
+ }
199
+
200
+ @media only screen and (max-width: 700px) {
201
+ div#agents {
202
+ width: 90%;
203
+ margin-right: auto;
204
+ margin-left: auto;
205
+ grid-template-columns: 1fr;
206
+ }
207
+
208
+ }
209
+ .loader {
210
+ width: 48px;
211
+ height: 48px;
212
+ border-radius: 50%;
213
+ display: inline-block;
214
+ border-top: 4px solid var(--primary-color);
215
+ border-right: 4px solid transparent;
216
+ box-sizing: border-box;
217
+ animation: rotation 1s linear infinite;
218
+ }
219
+ .loader::after {
220
+ content: '';
221
+ box-sizing: border-box;
222
+ position: absolute;
223
+ left: 0;
224
+ top: 0;
225
+ width: 48px;
226
+ height: 48px;
227
+ border-radius: 50%;
228
+ border-left: 4px solid var(--summer-sun);
229
+ border-bottom: 4px solid transparent;
230
+ animation: rotation 0.5s linear infinite reverse;
231
+ }
232
+ @keyframes rotation {
233
+ 0% {
234
+ transform: rotate(0deg);
235
+ }
236
+ 100% {
237
+ transform: rotate(360deg);
238
+ }
239
+ }
240
+
241
+ </style>
242
+ <script>
243
+ async function openChat(agentSlug) {
244
+ // Create a loading animation
245
+ let loadingTextEl = document.createElement("div");
246
+ loadingTextEl.textContent = 'Booting your agent...';
247
+
248
+ let loadingAnimationEl = document.createElement("span");
249
+ loadingAnimationEl.className = "loader";
250
+
251
+ let loadingEl = document.createElement("div");
252
+ loadingEl.style.position = "fixed";
253
+ loadingEl.style.top = "0";
254
+ loadingEl.style.right = "0";
255
+ loadingEl.style.bottom = "0";
256
+ loadingEl.style.left = "0";
257
+ loadingEl.style.display = "flex";
258
+ loadingEl.style.justifyContent = "center";
259
+ loadingEl.style.alignItems = "center";
260
+ loadingEl.style.backgroundColor = "rgba(0, 0, 0, 0.5)"; // Semi-transparent black
261
+
262
+ loadingEl.append(loadingTextEl, loadingAnimationEl);
263
+ document.body.appendChild(loadingEl);
264
+
265
+ let response = await fetch(`/api/chat/sessions?agent_slug=${agentSlug}`, { method: "POST" });
266
+ let data = await response.json();
267
+ if (response.status == 200) {
268
+ window.location.href = "/";
269
+ } else if(response.status == 403 || response.status == 401) {
270
+ window.location.href = "/login?next=/agent/" + agentId;
271
+ } else {
272
+ alert("Failed to start chat session");
273
+ }
274
+ }
275
+ </script>
276
+ </html>
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80" fill="none" x="0px" y="0px">
2
+ <!--
3
+ Icon Source: AI by Palash Jain from <a href="https://thenounproject.com/browse/icons/term/ai/" target="_blank" title="AI Icons">Noun Project</a> (CC BY 3.0)
4
+ -->
5
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M42 10C42 8.89543 41.1046 8 40 8C38.8954 8 38 8.89543 38 10V16C38 16.0206 38.0003 16.0411 38.0009 16.0615C24.2142 16.9142 13 26.5663 13 41C13 44.7195 13.7548 47.7715 15.2618 50.2177C16.7767 52.6766 18.9515 54.3606 21.5055 55.5033C26.4785 57.7282 33.156 58 40 58C46.844 58 53.5215 57.7282 58.4945 55.5033C61.0485 54.3606 63.2233 52.6766 64.7382 50.2177C66.2452 47.7715 67 44.7195 67 41C67 26.5663 55.7858 16.9142 41.9991 16.0615C41.9997 16.0411 42 16.0206 42 16V10ZM40 20C27.0708 20 17 28.5112 17 41C17 44.184 17.6443 46.4588 18.6674 48.1196C19.6827 49.7675 21.169 50.9706 23.1391 51.8521C27.2144 53.6754 33.0369 54 40 54C46.9631 54 52.7856 53.6754 56.8609 51.8521C58.831 50.9706 60.3173 49.7675 61.3326 48.1196C62.3557 46.4588 63 44.184 63 41C63 28.5112 52.9292 20 40 20ZM28 32C29.1046 32 30 32.8954 30 34V40C30 41.1046 29.1046 42 28 42C26.8954 42 26 41.1046 26 40V34C26 32.8954 26.8954 32 28 32ZM51 32C52.1046 32 53 32.8954 53 34V40C53 41.1046 52.1046 42 51 42C49.8954 42 49 41.1046 49 40V34C49 32.8954 49.8954 32 51 32ZM19.3598 68.8634C26.0525 67.6396 32.9507 67 40 67C47.0494 67 53.9476 67.6396 60.6403 68.8634C61.7268 69.0621 62.7687 68.3423 62.9674 67.2558C63.1661 66.1692 62.4463 65.1273 61.3598 64.9287C54.4308 63.6616 47.2918 63 40 63C32.7082 63 25.5692 63.6616 18.6403 64.9287C17.5537 65.1273 16.8339 66.1692 17.0326 67.2558C17.2313 68.3423 18.2732 69.0621 19.3598 68.8634Z" fill="black"/>
6
+ </svg>
@@ -0,0 +1,37 @@
1
+ <svg
2
+ width="800px"
3
+ height="800px"
4
+ viewBox="0 0 24 24"
5
+ fill="none"
6
+ version="1.1"
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ xmlns:svg="http://www.w3.org/2000/svg">
9
+ <path
10
+ d="m 19.402765,19.007843 c 1.380497,-1.679442 2.307667,-4.013099 2.307667,-6.330999 C 21.710432,7.2551476 17.193958,2.86 11.622674,2.86 6.0513555,2.86 1.5349153,7.2551476 1.5349153,12.676844 c 0,5.421663 4.5164402,9.816844 10.0877587,9.816844 2.381867,0 4.570922,-0.803307 6.296712,-2.14673 z m -7.780091,1.925408 c -4.3394583,0 -8.6708434,-4.033489 -8.6708434,-8.256407 0,-4.2229187 4.3313851,-8.2564401 8.6708434,-8.2564401 4.339458,0 8.670809,4.2369112 8.670809,8.4598301 0,4.222918 -4.331351,8.053017 -8.670809,8.053017 z"
11
+ fill="#1c274c"
12
+ fill-rule="evenodd"
13
+ clip-rule="evenodd"
14
+ fill-opacity="1"
15
+ stroke-width="1.10519"
16
+ stroke-dasharray="none" />
17
+ <path
18
+ d="m 14.177351,11.200265 0.05184,2.153289"
19
+ stroke="#1c274c"
20
+ stroke-width="1.95702"
21
+ stroke-linecap="round" />
22
+ <path
23
+ d="m 9.271347,11.140946 0.051844,2.153289"
24
+ stroke="#1c274c"
25
+ stroke-width="1.95701"
26
+ stroke-linecap="round" />
27
+ <path
28
+ d="m 13.557051,1.4687179 c -1.779392,0.00605 -3.082184,0.01209 -3.6968064,0.018135"
29
+ stroke="#1c274c"
30
+ stroke-width="1.77333"
31
+ stroke-linecap="round" />
32
+ <path
33
+ d="M 20.342466,5.7144363 19.140447,6.8696139"
34
+ stroke="#1c274c"
35
+ stroke-width="1.95701"
36
+ stroke-linecap="round" />
37
+ </svg>
@@ -0,0 +1,3 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
3
+ <svg width="800px" height="800px" viewBox="0 0 1024 1024" class="icon" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M704 288h-281.6l177.6-202.88a32 32 0 0 0-48.32-42.24l-224 256a30.08 30.08 0 0 0-2.24 3.84 32 32 0 0 0-2.88 4.16v1.92a32 32 0 0 0 0 5.12A32 32 0 0 0 320 320a32 32 0 0 0 0 4.8 32 32 0 0 0 0 5.12v1.92a32 32 0 0 0 2.88 4.16 30.08 30.08 0 0 0 2.24 3.84l224 256a32 32 0 1 0 48.32-42.24L422.4 352H704a224 224 0 0 1 224 224v128a224 224 0 0 1-224 224H320a232 232 0 0 1-28.16-1.6 32 32 0 0 0-35.84 27.84 32 32 0 0 0 27.84 35.52A295.04 295.04 0 0 0 320 992h384a288 288 0 0 0 288-288v-128a288 288 0 0 0-288-288zM103.04 760a32 32 0 0 0-62.08 16A289.92 289.92 0 0 0 140.16 928a32 32 0 0 0 40-49.92 225.6 225.6 0 0 1-77.12-118.08zM64 672a32 32 0 0 0 22.72-9.28 37.12 37.12 0 0 0 6.72-10.56A32 32 0 0 0 96 640a33.6 33.6 0 0 0-9.28-22.72 32 32 0 0 0-10.56-6.72 32 32 0 0 0-34.88 6.72A32 32 0 0 0 32 640a32 32 0 0 0 2.56 12.16 37.12 37.12 0 0 0 6.72 10.56A32 32 0 0 0 64 672z" fill="#231815" /></svg>
@@ -0,0 +1,24 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg"
2
+ width="800px"
3
+ height="800px"
4
+ viewBox="0 0 24 24"
5
+ fill="none"
6
+ version="1.1">
7
+ <path
8
+ d="m 14.024348,9.8497703 0.04627,1.9750167"
9
+ stroke="#1c274c"
10
+ stroke-width="1.77073"
11
+ stroke-linecap="round" />
12
+ <path
13
+ d="m 9.6453624,9.7953624 0.046275,1.9750166"
14
+ stroke="#1c274c"
15
+ stroke-width="1.77072"
16
+ stroke-linecap="round" />
17
+ <path
18
+ d="m 11.90538,2.3619994 c -5.4939109,0 -9.6890976,4.0608185 -9.6890976,9.8578926 0,1.477202 0.2658016,2.542848 0.6989332,3.331408 0.433559,0.789293 1.0740097,1.372483 1.9230615,1.798517 1.7362861,0.87132 4.1946007,1.018626 7.0671029,1.018626 0.317997,0 0.593711,0.167879 0.784844,0.458501 0.166463,0.253124 0.238617,0.552748 0.275566,0.787233 0.07263,0.460801 0.05871,1.030165 0.04785,1.474824 v 4.8e-5 l -2.26e-4,0.0091 c -0.0085,0.348246 -0.01538,0.634247 -0.0085,0.861186 0.105589,-0.07971 0.227925,-0.185287 0.36735,-0.31735 0.348613,-0.330307 0.743513,-0.767362 1.176607,-1.246635 l 0.07837,-0.08673 c 0.452675,-0.500762 0.941688,-1.037938 1.41216,-1.473209 0.453774,-0.419787 0.969948,-0.822472 1.476003,-0.953853 1.323661,-0.343655 2.330132,-0.904027 3.005749,-1.76381 0.658957,-0.838568 1.073167,-2.051868 1.073167,-3.898667 0,-5.7970748 -4.195186,-9.8578946 -9.689097,-9.8578946 z M 0.92440678,12.219892 c 0,-7.0067939 5.05909412,-11.47090892 10.98097322,-11.47090892 5.921878,0 10.980972,4.46411502 10.980972,11.47090892 0,2.172259 -0.497596,3.825405 -1.442862,5.028357 -0.928601,1.181693 -2.218843,1.837914 -3.664937,2.213334 -0.211641,0.05502 -0.53529,0.268579 -0.969874,0.670658 -0.417861,0.386604 -0.865628,0.876836 -1.324566,1.384504 l -0.09131,0.101202 c -0.419252,0.464136 -0.849637,0.94059 -1.239338,1.309807 -0.210187,0.199169 -0.425281,0.383422 -0.635348,0.523424 -0.200911,0.133819 -0.449635,0.263369 -0.716376,0.281474 -0.327812,0.02226 -0.61539,-0.149209 -0.804998,-0.457293 -0.157614,-0.255993 -0.217622,-0.557143 -0.246564,-0.778198 -0.0542,-0.414027 -0.04101,-0.933065 -0.03027,-1.355183 l 0.0024,-0.0922 c 0.01099,-0.463865 0.01489,-0.820507 -0.01611,-1.06842 C 8.9434608,19.975238 6.3139711,19.828758 4.356743,18.84659 3.3355029,18.334136 2.4624526,17.578678 1.8500164,16.463713 1.2372016,15.348029 0.92459928,13.943803 0.92459928,12.219967 Z"
19
+ clip-rule="evenodd"
20
+ stroke-width="0.360886"
21
+ fill="#1c274c"
22
+ fill-rule="evenodd"
23
+ fill-opacity="1" />
24
+ </svg>
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
3
+ <svg width="800px" height="800px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
4
+
5
+ <title>collapse</title>
6
+ <desc>Created with Sketch Beta.</desc>
7
+ <defs>
8
+
9
+ </defs>
10
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
11
+ <g id="Icon-Set" sketch:type="MSLayerGroup" transform="translate(-360.000000, -1191.000000)" fill="#000000">
12
+ <path d="M387.887,1203.04 L381.326,1203.04 L392.014,1192.4 L390.614,1191.01 L379.938,1201.64 L379.969,1195.16 C379.969,1194.61 379.526,1194.17 378.979,1194.17 C378.433,1194.17 377.989,1194.61 377.989,1195.16 L377.989,1204.03 C377.989,1204.32 378.111,1204.56 378.302,1204.72 C378.481,1204.9 378.73,1205.01 379.008,1205.01 L387.887,1205.01 C388.434,1205.01 388.876,1204.57 388.876,1204.03 C388.876,1203.48 388.434,1203.04 387.887,1203.04 L387.887,1203.04 Z M372.992,1208.99 L364.113,1208.99 C363.566,1208.99 363.124,1209.43 363.124,1209.97 C363.124,1210.52 363.566,1210.96 364.113,1210.96 L370.674,1210.96 L359.986,1221.6 L361.386,1222.99 L372.063,1212.36 L372.031,1218.84 C372.031,1219.39 372.474,1219.83 373.021,1219.83 C373.567,1219.83 374.011,1219.39 374.011,1218.84 L374.011,1209.97 C374.011,1209.68 373.889,1209.44 373.697,1209.28 C373.519,1209.1 373.27,1208.99 372.992,1208.99 L372.992,1208.99 Z" id="collapse" sketch:type="MSShapeGroup">
13
+
14
+ </path>
15
+ </g>
16
+ </g>
17
+ </svg>