├── volume ├── contexts │ └── ROOT │ │ ├── lucene-index │ │ ├── write.lock │ │ ├── _v.si │ │ ├── _15.fdm │ │ ├── _15.fdt │ │ ├── _15.fdx │ │ ├── _15.fnm │ │ ├── _15.kdd │ │ ├── _15.kdi │ │ ├── _15.kdm │ │ ├── _15.nvd │ │ ├── _15.nvm │ │ ├── _15.si │ │ ├── _16.cfe │ │ ├── _16.cfs │ │ ├── _16.si │ │ ├── _17.cfe │ │ ├── _17.cfs │ │ ├── _17.si │ │ ├── _18.cfe │ │ ├── _18.cfs │ │ ├── _18.si │ │ ├── _19.cfe │ │ ├── _19.cfs │ │ ├── _19.si │ │ ├── _1a.cfe │ │ ├── _1a.cfs │ │ ├── _1a.si │ │ ├── _1b.cfe │ │ ├── _1b.cfs │ │ ├── _1b.si │ │ ├── _1c.cfe │ │ ├── _1c.cfs │ │ ├── _1c.si │ │ ├── _v.fdm │ │ ├── _v.fdt │ │ ├── _v.fdx │ │ ├── _v.fnm │ │ ├── _v.kdd │ │ ├── _v.kdi │ │ ├── _v.kdm │ │ ├── _v.nvd │ │ ├── _v.nvm │ │ ├── segments_1a │ │ ├── _v_Lucene99_0.doc │ │ ├── _v_Lucene99_0.pos │ │ ├── _v_Lucene99_0.tim │ │ ├── _v_Lucene99_0.tip │ │ ├── _v_Lucene99_0.tmd │ │ ├── _15_Lucene99_0.doc │ │ ├── _15_Lucene99_0.pos │ │ ├── _15_Lucene99_0.tim │ │ ├── _15_Lucene99_0.tip │ │ └── _15_Lucene99_0.tmd │ │ ├── lucene-autocomplete │ │ ├── write.lock │ │ ├── _0.si │ │ ├── _0.cfe │ │ ├── _0.cfs │ │ └── segments_1 │ │ ├── taxonomy.txt │ │ ├── users.xml │ │ ├── questions-answers │ │ ├── b8a72b31-252f-4c02-a0a8-94d83605c760 │ │ │ └── qa.xml │ │ ├── a7f7f0be-3b27-4acb-bcf9-4dc4c13048c2 │ │ │ └── qa.xml │ │ ├── f5b3938d-b512-4b04-8d69-5aad58fcaf46 │ │ │ └── qa.xml │ │ ├── 969ed753-c72d-4340-9e8f-898e433de879 │ │ │ └── qa.xml │ │ ├── 77fac2bf-e8d4-48f7-875f-4e17f8c7ea1d │ │ │ └── qa.xml │ │ ├── f07de5d0-194a-4a28-bfe7-966e2395772f │ │ │ └── qa.xml │ │ ├── 01bc9f1e-ece5-4fa7-b851-17d8e40f0bb5 │ │ │ └── qa.xml │ │ ├── 627d5f01-9bc0-426f-aef0-3674f69e0bd9 │ │ │ └── qa.xml │ │ ├── 892ecad9-c664-4c34-9ad7-1fb7faca3022 │ │ │ └── qa.xml │ │ ├── ef6261bd-78ee-4f04-b00d-ca496ef87b62 │ │ │ └── qa.xml │ │ ├── d42d8e7b-2e11-41f2-b6b1-b056e837bef9 │ │ │ └── qa.xml │ │ ├── 7270028c-890d-4b20-a16a-a0cba7c61c1b │ │ │ └── qa.xml │ │ ├── b35836dc-f276-4bc7-b9bb-eadee2774473 │ │ │ └── qa.xml │ │ ├── 52fb2907-45b0-4785-8379-5c0b3f44bf1e │ │ │ └── qa.xml │ │ ├── ad7c1da7-22a3-4995-adeb-0cf4236d98a1 │ │ │ └── qa.xml │ │ ├── 1083c42c-826b-4767-9e9a-d3b6f542529f │ │ │ └── qa.xml │ │ ├── 43be6f19-0167-4b12-95a9-9005b2fa0814 │ │ │ └── qa.xml │ │ ├── 3a14f0b4-0fec-44f7-9451-722c846ece0a │ │ │ └── qa.xml │ │ ├── 7da390ac-8e57-4d46-a9de-fe469f29f7c8 │ │ │ └── qa.xml │ │ ├── 7d2befa1-d75b-4a75-aaa3-d171ac2f319b │ │ │ └── qa.xml │ │ ├── c157dfde-ecda-41aa-8b33-26a16708465f │ │ │ └── qa.xml │ │ ├── 9f6044e9-b11f-47c6-a74a-da880410bd55 │ │ │ └── qa.xml │ │ ├── c414a536-5e6c-4149-b829-e375145507e4 │ │ │ └── qa.xml │ │ ├── fb8648a7-0574-490a-b153-40fc9f7d4f53 │ │ │ └── qa.xml │ │ ├── 77ab9e70-0885-49cf-b05e-753786c45c9d │ │ │ └── qa.xml │ │ ├── beb5ce56-f4b9-419d-af09-d5edbd188f49 │ │ │ └── qa.xml │ │ ├── e758807e-0eb1-4755-9cfe-deee4f707a02 │ │ │ └── qa.xml │ │ ├── e51b809c-62f9-4236-88ef-afaa51bbb277 │ │ │ └── qa.xml │ │ ├── a001ea6f-51a5-4c2c-89a2-25d982b54765 │ │ │ └── qa.xml │ │ ├── ad2f8819-3d1a-4f37-966b-0fae8be7f81c │ │ │ └── qa.xml │ │ ├── 53b4861a-71ef-43f1-b3e1-7187e77007a4 │ │ │ └── qa.xml │ │ ├── 39830ea9-2cf1-4211-8e20-1d2ca7cde920 │ │ │ └── qa.xml │ │ ├── 78cd8644-d3b9-451d-9ff5-d8af14f2d997 │ │ │ └── qa.xml │ │ ├── 36277e09-62d9-4549-a649-b08bed5841df │ │ │ └── qa.xml │ │ ├── b0d23ef0-1e6a-4687-ac06-96f71eb13e5f │ │ │ └── qa.xml │ │ ├── 9eaf4cd0-781c-4dea-9aa2-0f794863cffe │ │ │ └── qa.xml │ │ ├── 2d039616-12a8-4b82-a439-a389eaed18a9 │ │ │ └── qa.xml │ │ ├── 49d445a9-3000-427a-9f66-4cbcb022faa6 │ │ │ └── qa.xml │ │ ├── d34e0f3c-ca27-4a54-b22d-ac8bc22d1b6b │ │ │ └── qa.xml │ │ └── 597178eb-112a-40c0-893d-b643a4f08447 │ │ │ └── qa.xml │ │ ├── webhooks.xml │ │ └── webhooks-deliveries.xml ├── askkatie-h2-v1.mv.db ├── benchmarks │ ├── 230302_164322 │ │ ├── 230302_164322.pdf │ │ ├── accuracy_vs_time_scatter.png │ │ ├── accuracy_precision_recall_bar.png │ │ └── info.json │ └── 231005_210106 │ │ ├── accuracy_vs_time_scatter.png │ │ ├── accuracy_precision_recall_bar.png │ │ └── info.json ├── iam │ ├── c0646e06-16f3-4c41-a7a0-2d1dbc10a67d │ │ ├── selfie.jpg │ │ └── domains.xml │ └── users.xml ├── config │ ├── slack-apps.json │ └── jwt │ │ └── README.md ├── learning-coach │ ├── users │ │ ├── anonymous │ │ │ └── conversation-starters.xml │ │ └── c0646e06-16f3-4c41-a7a0-2d1dbc10a67d │ │ │ ├── lectures │ │ │ ├── alternative-crops │ │ │ │ └── meta.json │ │ │ ├── international-environmental-politics │ │ │ │ └── meta.json │ │ │ ├── socioeconomics-of-agriculture │ │ │ │ └── meta.json │ │ │ ├── evaluation-of-agricultural-policies │ │ │ │ └── meta.json │ │ │ ├── risk-analysis-and-risk-management-in-agriculture │ │ │ │ └── meta.json │ │ │ └── entwicklungspsychologie_teil_1 │ │ │ │ └── meta.json │ │ │ └── conversation-starters.xml │ └── conversation-starter-prompts │ │ └── 191aae92-a23a-4e98-b618-58818a8751f2.json ├── benchmark-config.json ├── datasets │ └── README.md └── models │ └── features.json ├── .gitignore ├── src ├── main │ ├── resources │ │ ├── google │ │ │ └── README.txt │ │ ├── discord │ │ │ └── commands │ │ │ │ ├── ping.json │ │ │ │ ├── invite.json │ │ │ │ └── ask.json │ │ ├── db │ │ │ └── migration │ │ │ │ ├── V28_2__alter_question_table.sql │ │ │ │ ├── V28_3__alter_question_table.sql │ │ │ │ ├── V28_1__alter_question_table.sql │ │ │ │ ├── V8__alter_question_table.sql │ │ │ │ ├── V21_1__alter_table_channel_slack.sql │ │ │ │ ├── V24_1__add_email_to_analytics_table.sql │ │ │ │ ├── V27_2__alter_question_table.sql │ │ │ │ ├── V22_1__alter_question_table.sql │ │ │ │ ├── V27_1__alter_table_channel_slack.sql │ │ │ │ ├── V5__alter_question_table.sql │ │ │ │ ├── V17__alter_slack_domain_table.sql │ │ │ │ ├── V20_3__alter_table_slack_team_katie_domain.sql │ │ │ │ ├── V15__add_channel-request-uuid_to_resubmitted_question_table.sql │ │ │ │ ├── V18_1__alter_resubmitted_question_table.sql │ │ │ │ ├── V27_3__alter_msteams_channel_table.sql │ │ │ │ ├── V26_1__resize_question_field.sql │ │ │ │ ├── V14__add_channel_webhook_table.sql │ │ │ │ ├── V6__alter_resubmitted_question_table.sql │ │ │ │ ├── V19_1__add_channel_slack_table.sql │ │ │ │ ├── V19_2__add_channel_email_table.sql │ │ │ │ ├── V9__add_channeltype_to_resubmitted_question_table.sql │ │ │ │ ├── V16_2__add_channel_type_and_id_to_analytics_table.sql │ │ │ │ ├── V20_2__alter_table_slack_team_katie_domain.sql │ │ │ │ ├── V7__remove_answer_from_resubmitted_question_table.sql │ │ │ │ ├── V13__add_matrix_table.sql │ │ │ │ ├── V11__remove_trained_rating_feedback_from_resubmitted_question_table.sql │ │ │ │ ├── V3__add_msteams_table.sql │ │ │ │ ├── V23_1__add_table_domain_tag_name.sql │ │ │ │ ├── V12__add_channel_matrix_table.sql │ │ │ │ ├── V20_1__add_table_slack_team_token_katie_user_id.sql │ │ │ │ ├── V16__add_analytics_table.sql │ │ │ │ ├── V4__alter_question_table.sql │ │ │ │ ├── V19_3__alter_question_table.sql │ │ │ │ ├── V19_4__alter_channel_matrix_table.sql │ │ │ │ ├── V25_2__add_channel_discord_table.sql │ │ │ │ ├── V25_1__add_discord_table.sql │ │ │ │ └── V10__add_channel_msteams_table.sql │ │ ├── opennlp │ │ │ ├── de-sent.bin │ │ │ └── en-sent.bin │ │ ├── jmeter │ │ │ └── README.txt │ │ ├── application-prod.properties │ │ ├── templates │ │ │ ├── notify-user-about-shared-information_en.ftl │ │ │ ├── notify-user-about-shared-information_de.ftl │ │ │ ├── notify-user-about-updated-shared-information_en.ftl │ │ │ ├── notify-user-about-updated-shared-information_de.ftl │ │ │ ├── notify-user-containing-shared-information_en.ftl │ │ │ ├── question-resubmitted_webhook_en.ftl │ │ │ ├── question-resubmitted_matrix_en.ftl │ │ │ ├── notify-members-re-invitation-request_en.ftl │ │ │ ├── question-resubmitted_fcm_token_en.ftl │ │ │ ├── no_answer_to_question_en.ftl │ │ │ ├── qna-needs-approval_email_en.ftl │ │ │ ├── question-resubmitted_email_en.ftl │ │ │ ├── question-resubmitted_unknown_en.ftl │ │ │ ├── question-resubmitted_msteams_en.ftl │ │ │ ├── question-resubmitted_slack_channel_en.ftl │ │ │ ├── answer-to-question_email_en.ftl │ │ │ └── answer-to-question_email_de.ftl │ │ ├── mcp-servers-config-v2.json │ │ ├── log4j2.xml │ │ ├── banner.txt │ │ └── mcp-servers-config.json │ ├── webapp │ │ ├── Katie.zip │ │ ├── inuit.png │ │ ├── favicon.ico │ │ ├── paris2017_w400.jpg │ │ ├── Katie-Poster-A0.pdf │ │ ├── OpenSans-Regular.woff │ │ ├── OpenSans-Regular.woff2 │ │ ├── OpenSans-SemiBold.woff │ │ ├── OpenSans-SemiBold.woff2 │ │ ├── assets │ │ │ ├── img │ │ │ │ ├── michael.png │ │ │ │ ├── add_to_slack.png │ │ │ │ ├── background_01_1.png │ │ │ │ ├── background_20211007.png │ │ │ │ ├── relevant_technologies.png │ │ │ │ ├── icon │ │ │ │ │ ├── warning_amber_black_24dp.svg │ │ │ │ │ ├── close_FILL0_wght500_GRAD0_opsz24.svg │ │ │ │ │ ├── arrow_back_black_24dp.svg │ │ │ │ │ ├── delete_black_24dp.svg │ │ │ │ │ ├── star_purple500_black_24dp.svg │ │ │ │ │ ├── info_black_24dp.svg │ │ │ │ │ ├── question_answer_black_18dp.svg │ │ │ │ │ ├── question_answer_grey_18dp.svg │ │ │ │ │ ├── check_circle_outline_black_24dp.svg │ │ │ │ │ ├── check_circle_outline_green_24dp.svg │ │ │ │ │ ├── edit_black_24dp.svg │ │ │ │ │ ├── star_border_purple500_black_24dp.svg │ │ │ │ │ ├── lock_open_black_18dp.svg │ │ │ │ │ ├── qna.svg │ │ │ │ │ ├── search_black_18dp.svg │ │ │ │ │ ├── faq.svg │ │ │ │ │ ├── search_grey_18dp.svg │ │ │ │ │ ├── thumb_up_black_18dp.svg │ │ │ │ │ ├── thumb_up_black_24dp.svg │ │ │ │ │ ├── thumb_up_grey_18dp.svg │ │ │ │ │ ├── thumb_down_black_18dp.svg │ │ │ │ │ ├── thumb_down_black_24dp.svg │ │ │ │ │ ├── thumb_down_grey_18dp.svg │ │ │ │ │ ├── lock_black_18dp.svg │ │ │ │ │ ├── lock_black_24dp.svg │ │ │ │ │ ├── format_list_bulleted_black_18dp.svg │ │ │ │ │ ├── format_list_bulleted_grey_18dp.svg │ │ │ │ │ ├── analytics_grey_18dp.svg │ │ │ │ │ ├── analytics_black_18dp.svg │ │ │ │ │ ├── group_black_18dp.svg │ │ │ │ │ ├── group_grey_18dp.svg │ │ │ │ │ ├── account_circle_grey_36dp.svg │ │ │ │ │ ├── search_FILL0_wght500_GRAD0_opsz40.svg │ │ │ │ │ └── lock_icon.svg │ │ │ │ ├── at_sign.svg │ │ │ │ ├── dots-three-vertical.svg │ │ │ │ ├── chevron-down.svg │ │ │ │ ├── chevron-up.svg │ │ │ │ ├── toggle-on-solid.svg │ │ │ │ ├── TOPdesk_RGB_Logomark.svg │ │ │ │ ├── toggle-off-solid.svg │ │ │ │ ├── arrow_icon.svg │ │ │ │ ├── eye_icon.svg │ │ │ │ └── globe_icon.svg │ │ │ ├── Content │ │ │ │ └── images │ │ │ │ │ ├── Sbb-logo.svg.png │ │ │ │ │ └── logo │ │ │ │ │ └── inuit.png │ │ │ ├── fonts │ │ │ │ ├── Regular │ │ │ │ │ ├── OpenSans-Regular.woff │ │ │ │ │ └── OpenSans-Regular.woff2 │ │ │ │ └── SemiBold │ │ │ │ │ ├── OpenSans-SemiBold.woff │ │ │ │ │ └── OpenSans-SemiBold.woff2 │ │ │ ├── font-awesome-4.6.1 │ │ │ │ ├── fonts │ │ │ │ │ ├── FontAwesome.otf │ │ │ │ │ ├── fontawesome-webfont.eot │ │ │ │ │ ├── fontawesome-webfont.ttf │ │ │ │ │ ├── fontawesome-webfont.woff │ │ │ │ │ └── fontawesome-webfont.woff2 │ │ │ │ ├── less │ │ │ │ │ ├── screen-reader.less │ │ │ │ │ ├── fixed-width.less │ │ │ │ │ ├── larger.less │ │ │ │ │ ├── list.less │ │ │ │ │ ├── core.less │ │ │ │ │ ├── stacked.less │ │ │ │ │ ├── font-awesome.less │ │ │ │ │ ├── bordered-pulled.less │ │ │ │ │ ├── rotated-flipped.less │ │ │ │ │ └── path.less │ │ │ │ └── scss │ │ │ │ │ ├── _fixed-width.scss │ │ │ │ │ ├── _screen-reader.scss │ │ │ │ │ ├── _larger.scss │ │ │ │ │ ├── _list.scss │ │ │ │ │ ├── _core.scss │ │ │ │ │ ├── font-awesome.scss │ │ │ │ │ ├── _stacked.scss │ │ │ │ │ ├── _bordered-pulled.scss │ │ │ │ │ ├── _rotated-flipped.scss │ │ │ │ │ └── _path.scss │ │ │ ├── scripts │ │ │ │ └── accordion.js │ │ │ └── scss │ │ │ │ └── modules │ │ │ │ └── _fonts.scss │ │ ├── Katie-Azure-Overview_0_0_1.png │ │ ├── Katie-Azure-Overview_0_0_1.vsdx │ │ ├── ms-teams-app │ │ │ ├── Katie_Icon_32x32.png │ │ │ └── Katie_Icon_192x192.png │ │ ├── META-INF │ │ │ └── context.xml │ │ ├── tinymce │ │ │ ├── skins │ │ │ │ └── ui │ │ │ │ │ ├── oxide │ │ │ │ │ ├── fonts │ │ │ │ │ │ └── tinymce-mobile.woff │ │ │ │ │ ├── content.mobile.min.css │ │ │ │ │ └── skin.shadowdom.min.css │ │ │ │ │ └── oxide-dark │ │ │ │ │ ├── fonts │ │ │ │ │ └── tinymce-mobile.woff │ │ │ │ │ ├── content.mobile.min.css │ │ │ │ │ └── skin.shadowdom.min.css │ │ │ ├── plugins │ │ │ │ ├── hr │ │ │ │ │ ├── index.js │ │ │ │ │ └── plugin.min.js │ │ │ │ ├── toc │ │ │ │ │ └── index.js │ │ │ │ ├── code │ │ │ │ │ └── index.js │ │ │ │ ├── help │ │ │ │ │ └── index.js │ │ │ │ ├── link │ │ │ │ │ └── index.js │ │ │ │ ├── save │ │ │ │ │ └── index.js │ │ │ │ ├── anchor │ │ │ │ │ └── index.js │ │ │ │ ├── bbcode │ │ │ │ │ └── index.js │ │ │ │ ├── image │ │ │ │ │ └── index.js │ │ │ │ ├── lists │ │ │ │ │ └── index.js │ │ │ │ ├── media │ │ │ │ │ └── index.js │ │ │ │ ├── paste │ │ │ │ │ └── index.js │ │ │ │ ├── print │ │ │ │ │ ├── index.js │ │ │ │ │ └── plugin.min.js │ │ │ │ ├── table │ │ │ │ │ └── index.js │ │ │ │ ├── advlist │ │ │ │ │ └── index.js │ │ │ │ ├── charmap │ │ │ │ │ └── index.js │ │ │ │ ├── preview │ │ │ │ │ └── index.js │ │ │ │ ├── autolink │ │ │ │ │ └── index.js │ │ │ │ ├── autosave │ │ │ │ │ └── index.js │ │ │ │ ├── fullpage │ │ │ │ │ └── index.js │ │ │ │ ├── tabfocus │ │ │ │ │ └── index.js │ │ │ │ ├── template │ │ │ │ │ └── index.js │ │ │ │ ├── emoticons │ │ │ │ │ └── index.js │ │ │ │ ├── importcss │ │ │ │ │ └── index.js │ │ │ │ ├── pagebreak │ │ │ │ │ └── index.js │ │ │ │ ├── quickbars │ │ │ │ │ └── index.js │ │ │ │ ├── textcolor │ │ │ │ │ ├── index.js │ │ │ │ │ ├── plugin.min.js │ │ │ │ │ └── plugin.js │ │ │ │ ├── wordcount │ │ │ │ │ └── index.js │ │ │ │ ├── autoresize │ │ │ │ │ └── index.js │ │ │ │ ├── codesample │ │ │ │ │ └── index.js │ │ │ │ ├── colorpicker │ │ │ │ │ ├── index.js │ │ │ │ │ ├── plugin.min.js │ │ │ │ │ └── plugin.js │ │ │ │ ├── contextmenu │ │ │ │ │ ├── index.js │ │ │ │ │ ├── plugin.min.js │ │ │ │ │ └── plugin.js │ │ │ │ ├── fullscreen │ │ │ │ │ └── index.js │ │ │ │ ├── imagetools │ │ │ │ │ └── index.js │ │ │ │ ├── nonbreaking │ │ │ │ │ └── index.js │ │ │ │ ├── noneditable │ │ │ │ │ └── index.js │ │ │ │ ├── textpattern │ │ │ │ │ └── index.js │ │ │ │ ├── visualchars │ │ │ │ │ └── index.js │ │ │ │ ├── legacyoutput │ │ │ │ │ └── index.js │ │ │ │ ├── spellchecker │ │ │ │ │ └── index.js │ │ │ │ ├── visualblocks │ │ │ │ │ └── index.js │ │ │ │ ├── searchreplace │ │ │ │ │ └── index.js │ │ │ │ ├── directionality │ │ │ │ │ └── index.js │ │ │ │ └── insertdatetime │ │ │ │ │ └── index.js │ │ │ ├── themes │ │ │ │ ├── mobile │ │ │ │ │ └── index.js │ │ │ │ └── silver │ │ │ │ │ └── index.js │ │ │ ├── icons │ │ │ │ └── default │ │ │ │ │ └── index.js │ │ │ ├── bower.json │ │ │ └── package.json │ │ ├── .well-known │ │ │ ├── apple-app-site-association │ │ │ └── assetlinks.json │ │ ├── chevron-down.svg │ │ ├── chevron-up.svg │ │ ├── test-nonce.js │ │ └── read-answer.html │ └── java │ │ └── com │ │ └── wyona │ │ └── katie │ │ ├── models │ │ ├── Role.java │ │ ├── QnAExtractorImpl.java │ │ ├── HostFrontend.java │ │ ├── ReRankImpl.java │ │ ├── faq │ │ │ └── TopicVisibility.java │ │ ├── Ownership.java │ │ ├── QuestionClassificationImpl.java │ │ ├── TextSplitterImpl.java │ │ ├── msteams │ │ │ ├── ChannelId.java │ │ │ ├── ConnectStatus.java │ │ │ ├── MicrosoftAdaptiveCardBodyItem.java │ │ │ ├── MicrosoftTeam.java │ │ │ ├── MicrosoftTenant.java │ │ │ └── MicrosoftChannel.java │ │ ├── DomainProperty.java │ │ ├── BackgroundProcessStatusType.java │ │ ├── ClassificationImpl.java │ │ ├── Language.java │ │ ├── NerImpl.java │ │ ├── WordEmbeddingImpl.java │ │ ├── slack │ │ │ ├── ConnectStatus.java │ │ │ ├── JWTClaims.java │ │ │ ├── SlackNodeInputValue.java │ │ │ ├── SlackNodeSelectValue.java │ │ │ ├── SlackViewState.java │ │ │ ├── SlackNodeEmail.java │ │ │ ├── SlackNodeChannelId.java │ │ │ ├── SlackNodeDomainId.java │ │ │ ├── SlackNodeBetteranswer.java │ │ │ ├── SlackNodeRelevanturl.java │ │ │ └── SlackNodeAskedquestion.java │ │ ├── insights │ │ │ ├── Interval.java │ │ │ ├── EventType.java │ │ │ ├── Event.java │ │ │ └── LanguagePageviews.java │ │ ├── WebhookPayload.java │ │ ├── WebhookTriggerEvent.java │ │ ├── CompletionImpl.java │ │ ├── EmbeddingValueType.java │ │ ├── QnAType.java │ │ ├── Vector.java │ │ ├── EmbeddingType.java │ │ ├── ChannelType.java │ │ ├── RoleDomain.java │ │ ├── EmbeddingsImpl.java │ │ ├── Emoji.java │ │ ├── PermissionStatus.java │ │ ├── DefaultValues.java │ │ ├── DetectDuplicatedQuestionImpl.java │ │ ├── KnowledgeSourceConnector.java │ │ ├── ModerationStatus.java │ │ ├── Question.java │ │ ├── ChannelAction.java │ │ ├── BenchmarkConfiguration.java │ │ ├── QuestionSentence.java │ │ ├── StatusResubmittedQuestion.java │ │ ├── TextEmbedding.java │ │ ├── learningcoach │ │ │ └── Suggestion.java │ │ ├── SuggestedQuestions.java │ │ ├── QnAReference.java │ │ ├── PushNotificationResponse.java │ │ └── ChosenSuggestion.java │ │ ├── answers │ │ ├── StringUtil.java │ │ ├── Time.java │ │ └── JinaAIOfficeHours.java │ │ ├── exceptions │ │ └── UserAlreadyMemberException.java │ │ ├── handlers │ │ ├── NERHandler.java │ │ ├── qc │ │ │ ├── ClassificationHandler.java │ │ │ └── QuestionClassifier.java │ │ ├── ReRankProvider.java │ │ └── DoNotAnalyzeNERImpl.java │ │ ├── firebase │ │ └── NotificationParameter.java │ │ ├── services │ │ ├── AnswerFromTextService.java │ │ ├── QnAsFromWebpageService.java │ │ └── AnswerFromTextServiceMockImpl.java │ │ ├── integrations │ │ └── discord │ │ │ └── commands │ │ │ └── SlashCommand.java │ │ └── config │ │ └── SpringAIChatClientsConfig.java └── test │ └── db │ └── README.txt ├── env └── docker │ └── run │ └── README.txt ├── pull-down-up.sh ├── Dockerfile └── migrate-h2database-to-version2.sql /volume/contexts/ROOT/lucene-index/write.lock: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-autocomplete/write.lock: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | target 3 | askkatie-webapp.iml 4 | -------------------------------------------------------------------------------- /src/main/resources/google/README.txt: -------------------------------------------------------------------------------- 1 | Google credentials 2 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/taxonomy.txt: -------------------------------------------------------------------------------- 1 | birthdate 2 | birthplace 3 | renovation 4 | -------------------------------------------------------------------------------- /src/main/webapp/Katie.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/Katie.zip -------------------------------------------------------------------------------- /src/main/webapp/inuit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/inuit.png -------------------------------------------------------------------------------- /src/main/webapp/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/favicon.ico -------------------------------------------------------------------------------- /volume/askkatie-h2-v1.mv.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/askkatie-h2-v1.mv.db -------------------------------------------------------------------------------- /src/main/resources/discord/commands/ping.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ping", 3 | "description": "Ping pong!" 4 | } 5 | -------------------------------------------------------------------------------- /src/main/webapp/paris2017_w400.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/paris2017_w400.jpg -------------------------------------------------------------------------------- /src/main/webapp/Katie-Poster-A0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/Katie-Poster-A0.pdf -------------------------------------------------------------------------------- /src/main/resources/db/migration/V28_2__alter_question_table.sql: -------------------------------------------------------------------------------- 1 | /* Add new column */ 2 | alter table QUESTION add SCORE double; 3 | -------------------------------------------------------------------------------- /src/main/resources/opennlp/de-sent.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/resources/opennlp/de-sent.bin -------------------------------------------------------------------------------- /src/main/resources/opennlp/en-sent.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/resources/opennlp/en-sent.bin -------------------------------------------------------------------------------- /src/main/webapp/OpenSans-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/OpenSans-Regular.woff -------------------------------------------------------------------------------- /src/main/webapp/OpenSans-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/OpenSans-Regular.woff2 -------------------------------------------------------------------------------- /src/main/webapp/OpenSans-SemiBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/OpenSans-SemiBold.woff -------------------------------------------------------------------------------- /src/main/webapp/OpenSans-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/OpenSans-SemiBold.woff2 -------------------------------------------------------------------------------- /src/main/webapp/assets/img/michael.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/img/michael.png -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_v.si: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_v.si -------------------------------------------------------------------------------- /src/main/resources/discord/commands/invite.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "invite", 3 | "description": "Invite Katie to channel" 4 | } 5 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_15.fdm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_15.fdm -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_15.fdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_15.fdt -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_15.fdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_15.fdx -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_15.fnm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_15.fnm -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_15.kdd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_15.kdd -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_15.kdi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_15.kdi -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_15.kdm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_15.kdm -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_15.nvd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_15.nvd -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_15.nvm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_15.nvm -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_15.si: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_15.si -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_16.cfe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_16.cfe -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_16.cfs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_16.cfs -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_16.si: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_16.si -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_17.cfe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_17.cfe -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_17.cfs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_17.cfs -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_17.si: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_17.si -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_18.cfe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_18.cfe -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_18.cfs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_18.cfs -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_18.si: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_18.si -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_19.cfe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_19.cfe -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_19.cfs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_19.cfs -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_19.si: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_19.si -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_1a.cfe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_1a.cfe -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_1a.cfs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_1a.cfs -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_1a.si: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_1a.si -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_1b.cfe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_1b.cfe -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_1b.cfs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_1b.cfs -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_1b.si: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_1b.si -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_1c.cfe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_1c.cfe -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_1c.cfs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_1c.cfs -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_1c.si: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_1c.si -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_v.fdm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_v.fdm -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_v.fdt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_v.fdt -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_v.fdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_v.fdx -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_v.fnm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_v.fnm -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_v.kdd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_v.kdd -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_v.kdi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_v.kdi -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_v.kdm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_v.kdm -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_v.nvd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_v.nvd -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_v.nvm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_v.nvm -------------------------------------------------------------------------------- /src/main/resources/db/migration/V28_3__alter_question_table.sql: -------------------------------------------------------------------------------- 1 | /* Add new column */ 2 | alter table QUESTION add SCORE_THRESHOLD double; 3 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/add_to_slack.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/img/add_to_slack.png -------------------------------------------------------------------------------- /src/main/resources/db/migration/V28_1__alter_question_table.sql: -------------------------------------------------------------------------------- 1 | /* Add new column */ 2 | alter table QUESTION add CLASSIFICATIONS varchar(100); 3 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V8__alter_question_table.sql: -------------------------------------------------------------------------------- 1 | -- add new column EMAIL_FROM 2 | ALTER TABLE QUESTION add EMAIL_FROM varchar(250); 3 | -------------------------------------------------------------------------------- /src/main/webapp/Katie-Azure-Overview_0_0_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/Katie-Azure-Overview_0_0_1.png -------------------------------------------------------------------------------- /src/main/webapp/assets/img/background_01_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/img/background_01_1.png -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-autocomplete/_0.si: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-autocomplete/_0.si -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/segments_1a: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/segments_1a -------------------------------------------------------------------------------- /src/main/resources/db/migration/V21_1__alter_table_channel_slack.sql: -------------------------------------------------------------------------------- 1 | /* Add new column */ 2 | alter table CHANNEL_SLACK add SLACK_MSG_TS varchar(50); 3 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V24_1__add_email_to_analytics_table.sql: -------------------------------------------------------------------------------- 1 | /* add new column EMAIL */ 2 | alter table ANALYTICS add EMAIL varchar(100); 3 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V27_2__alter_question_table.sql: -------------------------------------------------------------------------------- 1 | /* Add new column */ 2 | alter table QUESTION add CLIENT_MESSAGE_ID varchar(100); 3 | -------------------------------------------------------------------------------- /src/main/webapp/Katie-Azure-Overview_0_0_1.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/Katie-Azure-Overview_0_0_1.vsdx -------------------------------------------------------------------------------- /src/main/webapp/ms-teams-app/Katie_Icon_32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/ms-teams-app/Katie_Icon_32x32.png -------------------------------------------------------------------------------- /volume/benchmarks/230302_164322/230302_164322.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/benchmarks/230302_164322/230302_164322.pdf -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-autocomplete/_0.cfe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-autocomplete/_0.cfe -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-autocomplete/_0.cfs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-autocomplete/_0.cfs -------------------------------------------------------------------------------- /src/main/resources/db/migration/V22_1__alter_question_table.sql: -------------------------------------------------------------------------------- 1 | -- add new column OFFSET_RESULTS 2 | alter table QUESTION add OFFSET_RESULTS smallint; 3 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V27_1__alter_table_channel_slack.sql: -------------------------------------------------------------------------------- 1 | /* Add new column */ 2 | alter table CHANNEL_SLACK add SLACK_TEAM_ID varchar(50); 3 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/background_20211007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/img/background_20211007.png -------------------------------------------------------------------------------- /src/main/webapp/ms-teams-app/Katie_Icon_192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/ms-teams-app/Katie_Icon_192x192.png -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-autocomplete/segments_1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-autocomplete/segments_1 -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_v_Lucene99_0.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_v_Lucene99_0.doc -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_v_Lucene99_0.pos: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_v_Lucene99_0.pos -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_v_Lucene99_0.tim: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_v_Lucene99_0.tim -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_v_Lucene99_0.tip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_v_Lucene99_0.tip -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_v_Lucene99_0.tmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_v_Lucene99_0.tmd -------------------------------------------------------------------------------- /src/main/resources/db/migration/V5__alter_question_table.sql: -------------------------------------------------------------------------------- 1 | -- add new column SLACK_CHANNEL_ID 2 | ALTER TABLE QUESTION add SLACK_CHANNEL_ID varchar(250); 3 | -------------------------------------------------------------------------------- /src/main/webapp/assets/Content/images/Sbb-logo.svg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/Content/images/Sbb-logo.svg.png -------------------------------------------------------------------------------- /src/main/webapp/assets/Content/images/logo/inuit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/Content/images/logo/inuit.png -------------------------------------------------------------------------------- /src/main/webapp/assets/img/relevant_technologies.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/img/relevant_technologies.png -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_15_Lucene99_0.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_15_Lucene99_0.doc -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_15_Lucene99_0.pos: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_15_Lucene99_0.pos -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_15_Lucene99_0.tim: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_15_Lucene99_0.tim -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_15_Lucene99_0.tip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_15_Lucene99_0.tip -------------------------------------------------------------------------------- /volume/contexts/ROOT/lucene-index/_15_Lucene99_0.tmd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/contexts/ROOT/lucene-index/_15_Lucene99_0.tmd -------------------------------------------------------------------------------- /src/main/webapp/assets/fonts/Regular/OpenSans-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/fonts/Regular/OpenSans-Regular.woff -------------------------------------------------------------------------------- /src/main/webapp/assets/fonts/Regular/OpenSans-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/fonts/Regular/OpenSans-Regular.woff2 -------------------------------------------------------------------------------- /volume/iam/c0646e06-16f3-4c41-a7a0-2d1dbc10a67d/selfie.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/iam/c0646e06-16f3-4c41-a7a0-2d1dbc10a67d/selfie.jpg -------------------------------------------------------------------------------- /src/main/webapp/META-INF/context.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/webapp/assets/fonts/SemiBold/OpenSans-SemiBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/fonts/SemiBold/OpenSans-SemiBold.woff -------------------------------------------------------------------------------- /src/main/webapp/assets/fonts/SemiBold/OpenSans-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/fonts/SemiBold/OpenSans-SemiBold.woff2 -------------------------------------------------------------------------------- /volume/benchmarks/230302_164322/accuracy_vs_time_scatter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/benchmarks/230302_164322/accuracy_vs_time_scatter.png -------------------------------------------------------------------------------- /volume/benchmarks/231005_210106/accuracy_vs_time_scatter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/benchmarks/231005_210106/accuracy_vs_time_scatter.png -------------------------------------------------------------------------------- /src/main/resources/db/migration/V17__alter_slack_domain_table.sql: -------------------------------------------------------------------------------- 1 | -- add new column SLACK_CHANNEL_ID 2 | ALTER TABLE SLACK_TEAM_KATIE_DOMAIN add SLACK_CHANNEL_ID varchar(100); 3 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/font-awesome-4.6.1/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /src/main/webapp/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff -------------------------------------------------------------------------------- /volume/benchmarks/230302_164322/accuracy_precision_recall_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/benchmarks/230302_164322/accuracy_precision_recall_bar.png -------------------------------------------------------------------------------- /volume/benchmarks/231005_210106/accuracy_precision_recall_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/volume/benchmarks/231005_210106/accuracy_precision_recall_bar.png -------------------------------------------------------------------------------- /src/main/webapp/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/Role.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum Role { 7 | ADMIN, 8 | USER, 9 | BENCHMARK 10 | } 11 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/font-awesome-4.6.1/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/font-awesome-4.6.1/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/QnAExtractorImpl.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum QnAExtractorImpl { 7 | MOCK, 8 | REST 9 | } 10 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/font-awesome-4.6.1/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wyona/katie-backend/HEAD/src/main/webapp/assets/font-awesome-4.6.1/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/less/screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/HostFrontend.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum HostFrontend { 7 | 8 | WWW_KATIE, 9 | MY_KATIE 10 | } 11 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V20_3__alter_table_slack_team_katie_domain.sql: -------------------------------------------------------------------------------- 1 | /* Change size of approval token column */ 2 | alter table SLACK_TEAM_KATIE_DOMAIN alter column APPROVAL_TOKEN varchar(500); 3 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V15__add_channel-request-uuid_to_resubmitted_question_table.sql: -------------------------------------------------------------------------------- 1 | -- add new column CHANNEL_REQUEST_UUID 2 | alter table RESUBMITTED_QUESTION add CHANNEL_REQUEST_UUID varchar(100); 3 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V18_1__alter_resubmitted_question_table.sql: -------------------------------------------------------------------------------- 1 | -- add new column QUESTIONER_LANGUAGE (for example 'de' or 'en') 2 | alter table RESUBMITTED_QUESTION add QUESTIONER_LANGUAGE varchar(10); 3 | -------------------------------------------------------------------------------- /volume/benchmarks/230302_164322/info.json: -------------------------------------------------------------------------------- 1 | {"dateTime":"2023-03-02T16:43:22.581998","id":"230302_164322","datasetName":"Weaviate","datasetSize":121,"numberOfRuns":1,"datasetVersion":"2","environmentMeta":"OS: Mac OS X"} -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/ReRankImpl.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum ReRankImpl { 7 | UNSET, 8 | SBERT, 9 | COHERE, 10 | LLM 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/faq/TopicVisibility.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.faq; 2 | 3 | /** 4 | * 5 | */ 6 | public enum TopicVisibility { 7 | 8 | PRIVATE, 9 | PUBLIC 10 | } 11 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /volume/iam/c0646e06-16f3-4c41-a7a0-2d1dbc10a67d/domains.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | ROOT 5 | 6 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/Ownership.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum Ownership { 7 | 8 | iam_public, 9 | iam_context, 10 | iam_source 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/QuestionClassificationImpl.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum QuestionClassificationImpl { 7 | OPEN_NLP, 8 | REST 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/TextSplitterImpl.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum TextSplitterImpl { 7 | SENTENCE, 8 | FIXED_SIZE, 9 | AI21 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/msteams/ChannelId.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.msteams; 2 | 3 | /** 4 | * 5 | */ 6 | public enum ChannelId { 7 | msteams, 8 | webchat, 9 | UNDEFINED 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/DomainProperty.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * Domain properties of a user 5 | */ 6 | public enum DomainProperty { 7 | EXPERT, 8 | MODERATOR 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/BackgroundProcessStatusType.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum BackgroundProcessStatusType { 7 | INFO, 8 | WARN, 9 | ERROR 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/ClassificationImpl.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum ClassificationImpl { 7 | MAX_ENTROPY, 8 | CENTROID_MATCHING, 9 | LLM 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/Language.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum Language { 7 | 8 | en, 9 | de, 10 | fr, 11 | it, 12 | pt, 13 | se 14 | } 15 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V27_3__alter_msteams_channel_table.sql: -------------------------------------------------------------------------------- 1 | /* Add new column */ 2 | alter table CHANNEL_MS_TEAMS add MS_TEAMS_TEAM_ID varchar(100); 3 | alter table CHANNEL_MS_TEAMS add MS_TEAMS_CHANNEL_ID varchar(100); 4 | -------------------------------------------------------------------------------- /volume/config/slack-apps.json: -------------------------------------------------------------------------------- 1 | [ 2 | {"clientId":"1276290213363.1276667698626","clientSecret":"REPLACE","signingSecret":"REPLACE"}, 3 | {"clientId":"5221090696325.6633794494721","clientSecret":"REPLACE","signingSecret":"REPLACE"} 4 | ] 5 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V26_1__resize_question_field.sql: -------------------------------------------------------------------------------- 1 | /* Change size of question column */ 2 | alter table RESUBMITTED_QUESTION alter column QUESTION varchar(2000); 3 | alter table QUESTION alter column QUESTION varchar(2000); 4 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/NerImpl.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum NerImpl { 7 | DO_NOT_ANALYZE, 8 | TEXTRAZOR, 9 | GOOGLE, 10 | FLAIR, 11 | MOCK 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/WordEmbeddingImpl.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum WordEmbeddingImpl { 7 | UNSET, 8 | FAST_TEXT, 9 | GLOVE, 10 | WORD_TO_VEC 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/slack/ConnectStatus.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.slack; 2 | 3 | /** 4 | * 5 | */ 6 | public enum ConnectStatus { 7 | 8 | NEEDS_APPROVAL, 9 | APPROVED, 10 | DISCARDED 11 | } 12 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V14__add_channel_webhook_table.sql: -------------------------------------------------------------------------------- 1 | /* Webhook echo data */ 2 | create table CHANNEL_WEBHOOK ( 3 | UUID varchar(100) not null, 4 | DOMAIN_ID varchar(100), 5 | ECHO_DATA varchar(200) not null 6 | ); 7 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V6__alter_resubmitted_question_table.sql: -------------------------------------------------------------------------------- 1 | -- add new column QUESTIONER_USER_ID (for example of a user asking question on a Slack channel) 2 | alter table RESUBMITTED_QUESTION add QUESTIONER_USER_ID varchar(100); 3 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/insights/Interval.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.insights; 2 | 3 | /** 4 | * 5 | */ 6 | public enum Interval { 7 | 8 | HOUR, 9 | DAY, 10 | WEEK, 11 | MONTH, 12 | YEAR 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/msteams/ConnectStatus.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.msteams; 2 | 3 | /** 4 | * 5 | */ 6 | public enum ConnectStatus { 7 | 8 | NEEDS_APPROVAL, 9 | APPROVED, 10 | DISCARDED 11 | } 12 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V19_1__add_channel_slack_table.sql: -------------------------------------------------------------------------------- 1 | /* Slack */ 2 | create table CHANNEL_SLACK ( 3 | CHANNEL_REQUEST_UUID varchar(100) not null, 4 | DOMAIN_ID varchar(100), 5 | SLACK_CHANNEL_ID varchar(250) not null 6 | ); 7 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V19_2__add_channel_email_table.sql: -------------------------------------------------------------------------------- 1 | /* E-Mail */ 2 | create table CHANNEL_EMAIL ( 3 | CHANNEL_REQUEST_UUID varchar(100) not null, 4 | DOMAIN_ID varchar(100), 5 | EMAIL_FROM_UUID varchar(250) not null 6 | ); 7 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/WebhookPayload.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public class WebhookPayload { 7 | 8 | /** 9 | * 10 | */ 11 | public WebhookPayload() { 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/hr/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "hr" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/hr') 5 | // ES2015: 6 | // import 'tinymce/plugins/hr' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /volume/learning-coach/users/anonymous/conversation-starters.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1 4 | 2 5 | 6 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/WebhookTriggerEvent.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum WebhookTriggerEvent { 7 | SEND_ANSWER_TO_RESUBMITTED_QUESTION_TO_USER, 8 | BETTER_ANSWER_PROVIDED 9 | } 10 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V9__add_channeltype_to_resubmitted_question_table.sql: -------------------------------------------------------------------------------- 1 | -- add new column CHANNEL_TYPE (UNDEFINED, EMAIL, FCM_TOKEN, SLACK, MS_TEAMS) 2 | alter table RESUBMITTED_QUESTION add CHANNEL_TYPE varchar(20) not null default 'UNDEFINED'; 3 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/toc/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "toc" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/toc') 5 | // ES2015: 6 | // import 'tinymce/plugins/toc' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/warning_amber_black_24dp.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/code/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "code" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/code') 5 | // ES2015: 6 | // import 'tinymce/plugins/code' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/help/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "help" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/help') 5 | // ES2015: 6 | // import 'tinymce/plugins/help' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/link/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "link" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/link') 5 | // ES2015: 6 | // import 'tinymce/plugins/link' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/save/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "save" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/save') 5 | // ES2015: 6 | // import 'tinymce/plugins/save' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/themes/mobile/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "mobile" theme for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/themes/mobile') 5 | // ES2015: 6 | // import 'tinymce/themes/mobile' 7 | require('./theme.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/themes/silver/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "silver" theme for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/themes/silver') 5 | // ES2015: 6 | // import 'tinymce/themes/silver' 7 | require('./theme.js'); -------------------------------------------------------------------------------- /src/main/resources/jmeter/README.txt: -------------------------------------------------------------------------------- 1 | 2 | Download Binary JMeter Release: https://jmeter.apache.org/download_jmeter.cgi 3 | 4 | Run JMeter: sh bin/jmeter 5 | 6 | Open and Run Test 7 | 8 | Also see for example https://www.guru99.com/jmeter-performance-testing.html 9 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/at_sign.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | @ 4 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/icons/default/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "default" icons for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/icons/default') 5 | // ES2015: 6 | // import 'tinymce/icons/default' 7 | require('./icons.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/anchor/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "anchor" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/anchor') 5 | // ES2015: 6 | // import 'tinymce/plugins/anchor' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/bbcode/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "bbcode" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/bbcode') 5 | // ES2015: 6 | // import 'tinymce/plugins/bbcode' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/image/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "image" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/image') 5 | // ES2015: 6 | // import 'tinymce/plugins/image' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/lists/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "lists" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/lists') 5 | // ES2015: 6 | // import 'tinymce/plugins/lists' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/media/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "media" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/media') 5 | // ES2015: 6 | // import 'tinymce/plugins/media' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/paste/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "paste" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/paste') 5 | // ES2015: 6 | // import 'tinymce/plugins/paste' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/print/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "print" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/print') 5 | // ES2015: 6 | // import 'tinymce/plugins/print' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/table/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "table" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/table') 5 | // ES2015: 6 | // import 'tinymce/plugins/table' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /volume/learning-coach/users/c0646e06-16f3-4c41-a7a0-2d1dbc10a67d/lectures/alternative-crops/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "name":"Alternative Crops", 3 | "url":"https://www.vorlesungen.ethz.ch/Vorlesungsverzeichnis/lerneinheit.view?semkez=2024W&lerneinheitId=182024&lang=en" 4 | } 5 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/CompletionImpl.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum CompletionImpl { 7 | UNSET, 8 | OPENAI, 9 | AZURE, 10 | ALEPH_ALPHA, 11 | MISTRAL_AI, 12 | OLLAMA 13 | } 14 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/close_FILL0_wght500_GRAD0_opsz24.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/advlist/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "advlist" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/advlist') 5 | // ES2015: 6 | // import 'tinymce/plugins/advlist' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/charmap/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "charmap" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/charmap') 5 | // ES2015: 6 | // import 'tinymce/plugins/charmap' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/preview/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "preview" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/preview') 5 | // ES2015: 6 | // import 'tinymce/plugins/preview' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/resources/db/migration/V16_2__add_channel_type_and_id_to_analytics_table.sql: -------------------------------------------------------------------------------- 1 | /* add new coloumns CHANNEL_TYPE and CHANNEL_ID */ 2 | alter table ANALYTICS add CHANNEL_TYPE varchar(20) not null default 'UNDEFINED'; 3 | alter table ANALYTICS add CHANNEL_ID varchar(100); 4 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/arrow_back_black_24dp.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/autolink/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "autolink" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/autolink') 5 | // ES2015: 6 | // import 'tinymce/plugins/autolink' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/autosave/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "autosave" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/autosave') 5 | // ES2015: 6 | // import 'tinymce/plugins/autosave' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/fullpage/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "fullpage" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/fullpage') 5 | // ES2015: 6 | // import 'tinymce/plugins/fullpage' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/tabfocus/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "tabfocus" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/tabfocus') 5 | // ES2015: 6 | // import 'tinymce/plugins/tabfocus' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/template/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "template" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/template') 5 | // ES2015: 6 | // import 'tinymce/plugins/template' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /volume/contexts/ROOT/users.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/emoticons/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "emoticons" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/emoticons') 5 | // ES2015: 6 | // import 'tinymce/plugins/emoticons' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/importcss/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "importcss" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/importcss') 5 | // ES2015: 6 | // import 'tinymce/plugins/importcss' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/pagebreak/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "pagebreak" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/pagebreak') 5 | // ES2015: 6 | // import 'tinymce/plugins/pagebreak' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/quickbars/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "quickbars" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/quickbars') 5 | // ES2015: 6 | // import 'tinymce/plugins/quickbars' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/textcolor/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "textcolor" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/textcolor') 5 | // ES2015: 6 | // import 'tinymce/plugins/textcolor' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/wordcount/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "wordcount" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/wordcount') 5 | // ES2015: 6 | // import 'tinymce/plugins/wordcount' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/resources/application-prod.properties: -------------------------------------------------------------------------------- 1 | # Overwrite application.properties when Spring profile is set to "prod" (SPRING_PROFILES_ACTIVE=prod) 2 | 3 | volume.base.path=/ask-katie 4 | 5 | #katie.environment=cloud 6 | katie.environment=on-premises 7 | 8 | qc.implementation=REST 9 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V20_2__alter_table_slack_team_katie_domain.sql: -------------------------------------------------------------------------------- 1 | /* Add new columns re connection approval */ 2 | alter table SLACK_TEAM_KATIE_DOMAIN add STATUS varchar(25) not null default 'APPROVED'; 3 | alter table SLACK_TEAM_KATIE_DOMAIN add APPROVAL_TOKEN varchar(100); 4 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V7__remove_answer_from_resubmitted_question_table.sql: -------------------------------------------------------------------------------- 1 | -- remove columns ANSWER and ANSWER_CLIENT_SIDE_ENCRYPTED_ALGORITHM 2 | alter table RESUBMITTED_QUESTION drop ANSWER; 3 | alter table RESUBMITTED_QUESTION drop ANSWER_CLIENT_SIDE_ENCRYPTED_ALGORITHM; 4 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/autoresize/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "autoresize" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/autoresize') 5 | // ES2015: 6 | // import 'tinymce/plugins/autoresize' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/codesample/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "codesample" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/codesample') 5 | // ES2015: 6 | // import 'tinymce/plugins/codesample' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/colorpicker/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "colorpicker" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/colorpicker') 5 | // ES2015: 6 | // import 'tinymce/plugins/colorpicker' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/contextmenu/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "contextmenu" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/contextmenu') 5 | // ES2015: 6 | // import 'tinymce/plugins/contextmenu' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/fullscreen/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "fullscreen" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/fullscreen') 5 | // ES2015: 6 | // import 'tinymce/plugins/fullscreen' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/imagetools/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "imagetools" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/imagetools') 5 | // ES2015: 6 | // import 'tinymce/plugins/imagetools' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/nonbreaking/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "nonbreaking" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/nonbreaking') 5 | // ES2015: 6 | // import 'tinymce/plugins/nonbreaking' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/noneditable/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "noneditable" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/noneditable') 5 | // ES2015: 6 | // import 'tinymce/plugins/noneditable' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/textpattern/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "textpattern" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/textpattern') 5 | // ES2015: 6 | // import 'tinymce/plugins/textpattern' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/visualchars/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "visualchars" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/visualchars') 5 | // ES2015: 6 | // import 'tinymce/plugins/visualchars' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/EmbeddingValueType.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * See for example https://www.elastic.co/search-labs/blog/articles/scalar-quantization-101 5 | */ 6 | public enum EmbeddingValueType { 7 | float32, 8 | int8 9 | } 10 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/legacyoutput/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "legacyoutput" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/legacyoutput') 5 | // ES2015: 6 | // import 'tinymce/plugins/legacyoutput' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/spellchecker/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "spellchecker" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/spellchecker') 5 | // ES2015: 6 | // import 'tinymce/plugins/spellchecker' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/visualblocks/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "visualblocks" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/visualblocks') 5 | // ES2015: 6 | // import 'tinymce/plugins/visualblocks' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /volume/benchmarks/231005_210106/info.json: -------------------------------------------------------------------------------- 1 | {"dateTime":"2023-10-05T21:01:06.053352","id":"231005_210106","datasetName":"Weaviate","datasetSize":121,"numberOfRuns":1,"datasetVersion":"2","environmentMeta":"OS: Mac OS X","alternativeQuestionsIndexed":false,"answersReRanked":false,"reRankImpl":null} -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/QnAType.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * Various content types, with particular content schemas 5 | */ 6 | public enum QnAType { 7 | 8 | DEFAULT, 9 | CREDENTIALS, 10 | BOOKMARK_URL, 11 | SHOPPING_LIST 12 | } 13 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V13__add_matrix_table.sql: -------------------------------------------------------------------------------- 1 | /* Mapping between Matrix rooms and Katie domains */ 2 | create table MATRIX_KATIE_DOMAIN ( 3 | MATRIX_ROOM_ID varchar(100) not null, 4 | KATIE_DOMAIN_ID varchar(100) not null, 5 | TIMESTAMP_CREATED varchar(100) not null 6 | ); 7 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/searchreplace/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "searchreplace" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/searchreplace') 5 | // ES2015: 6 | // import 'tinymce/plugins/searchreplace' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/resources/db/migration/V11__remove_trained_rating_feedback_from_resubmitted_question_table.sql: -------------------------------------------------------------------------------- 1 | -- remove columns TRAINED, RATING, FEEDBACK 2 | alter table RESUBMITTED_QUESTION drop TRAINED; 3 | alter table RESUBMITTED_QUESTION drop RATING; 4 | alter table RESUBMITTED_QUESTION drop FEEDBACK; 5 | -------------------------------------------------------------------------------- /src/main/resources/templates/notify-user-about-shared-information_en.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

MyKatie

4 | 5 |

6 | ${user_name} just shared some information with you. 7 |

8 | 9 |

10 | MyKatie 11 |

12 | 13 | 14 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/directionality/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "directionality" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/directionality') 5 | // ES2015: 6 | // import 'tinymce/plugins/directionality' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/insertdatetime/index.js: -------------------------------------------------------------------------------- 1 | // Exports the "insertdatetime" plugin for usage with module loaders 2 | // Usage: 3 | // CommonJS: 4 | // require('tinymce/plugins/insertdatetime') 5 | // ES2015: 6 | // import 'tinymce/plugins/insertdatetime' 7 | require('./plugin.js'); -------------------------------------------------------------------------------- /volume/learning-coach/users/c0646e06-16f3-4c41-a7a0-2d1dbc10a67d/lectures/international-environmental-politics/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "name":"International Environmental Politics", 3 | "url":"https://www.vorlesungen.ethz.ch/Vorlesungsverzeichnis/lerneinheit.view?semkez=2024W&lerneinheitId=182659&lang=en" 4 | } 5 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V3__add_msteams_table.sql: -------------------------------------------------------------------------------- 1 | /* Mapping between MS Teams teams and Katie contexts/domains */ 2 | create table MS_TEAM_KATIE_DOMAIN ( 3 | MS_TEAM_ID varchar(100) not null, 4 | KATIE_DOMAIN_ID varchar(100) not null, 5 | TIMESTAMP_CREATED varchar(100) not null 6 | ); 7 | -------------------------------------------------------------------------------- /src/main/resources/templates/notify-user-about-shared-information_de.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

MyKatie

4 | 5 |

6 | ${user_name} hat gerade eine Information mit Dir geteilt. 7 |

8 | 9 |

10 | MyKatie 11 |

12 | 13 | 14 | -------------------------------------------------------------------------------- /src/main/webapp/.well-known/apple-app-site-association: -------------------------------------------------------------------------------- 1 | { 2 | "applinks": { 3 | "apps": [], 4 | "details": [ 5 | { 6 | "appID": "WPYC9C9324.com.raiffeisenident.cbfs", 7 | "paths": [ "*"] 8 | } 9 | ] 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/dots-three-vertical.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/delete_black_24dp.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/Vector.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public interface Vector { 7 | 8 | /** 9 | * 10 | */ 11 | public int getDimension(); 12 | 13 | /** 14 | * 15 | */ 16 | public void add(Vector w); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/star_purple500_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/EmbeddingType.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * See for example https://txt.cohere.com/introducing-embed-v3/ 5 | */ 6 | public enum EmbeddingType { 7 | SEARCH_DOCUMENT, 8 | SEARCH_QUERY, 9 | CLASSIFICATION, 10 | CLUSTERING 11 | } 12 | -------------------------------------------------------------------------------- /volume/learning-coach/users/c0646e06-16f3-4c41-a7a0-2d1dbc10a67d/lectures/socioeconomics-of-agriculture/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "name":"Socioeconomics of Agriculture", 3 | "url":"https://www.vorlesungen.ethz.ch/Vorlesungsverzeichnis/lerneinheit.view?lerneinheitId=182334&semkez=2024W&ansicht=LEHRVERANSTALTUNGEN&lang=en" 4 | } 5 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V23_1__add_table_domain_tag_name.sql: -------------------------------------------------------------------------------- 1 | /* Mapping between domain tag name and domain id */ 2 | create table DOMAIN_TAG_NAME ( 3 | TAG_NAME varchar(100) not null, 4 | DOMAIN_ID varchar(100) not null 5 | ); 6 | insert into DOMAIN_TAG_NAME (TAG_NAME, DOMAIN_ID) values ('root','ROOT'); 7 | -------------------------------------------------------------------------------- /src/main/resources/templates/notify-user-about-updated-shared-information_en.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

MyKatie

4 | 5 |

6 | ${user_name} just updated information which is shared with you. 7 |

8 | 9 |

10 | MyKatie 11 |

12 | 13 | 14 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/ChannelType.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum ChannelType { 7 | 8 | UNDEFINED, 9 | //REST, 10 | EMAIL, 11 | FCM_TOKEN, 12 | MATRIX, 13 | SLACK, 14 | MS_TEAMS, 15 | DISCORD, 16 | WEBHOOK 17 | } 18 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V12__add_channel_matrix_table.sql: -------------------------------------------------------------------------------- 1 | /* Connection values re Channel Matrix */ 2 | create table CHANNEL_MATRIX ( 3 | UUID_RESUBMITTED_QUESTION varchar(100) not null, 4 | DOMAIN_ID varchar(100), 5 | MATRIX_USER_ID varchar(200) not null, 6 | MATRIX_ROOM_ID varchar(200) not null 7 | ); 8 | -------------------------------------------------------------------------------- /src/main/resources/templates/notify-user-about-updated-shared-information_de.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

MyKatie

4 | 5 |

6 | ${user_name} hat gerade eine mit Dir geteilte Information aktualisiert. 7 |

8 | 9 |

10 | MyKatie 11 |

12 | 13 | 14 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/RoleDomain.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * User role for a particular domain. For example an OWNER of a domain can delete the domain or an ADMIN of a domain can update the domain settings. 5 | */ 6 | public enum RoleDomain { 7 | ADMIN, 8 | OWNER 9 | } 10 | -------------------------------------------------------------------------------- /src/test/db/README.txt: -------------------------------------------------------------------------------- 1 | 2 | README 3 | ------ 4 | 5 | javac CreateTestData.java 6 | java CreateTestData 7 | cp afterMigrate.sql ../src/main/resources/db/testdata/. 8 | Restart Katie, whereas make sure that the environment variable SPRING_PROFILES_ACTIVE=dev is set, such that src/main/resources/application-dev.properties is used 9 | -------------------------------------------------------------------------------- /volume/learning-coach/users/c0646e06-16f3-4c41-a7a0-2d1dbc10a67d/conversation-starters.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1 4 | 2 5 | d612d154-c1e8-4bbf-979a-11417fad8104 6 | 7 | -------------------------------------------------------------------------------- /volume/learning-coach/users/c0646e06-16f3-4c41-a7a0-2d1dbc10a67d/lectures/evaluation-of-agricultural-policies/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "name":"Evaluation of Agricultural Policies", 3 | "url":"https://www.vorlesungen.ethz.ch/Vorlesungsverzeichnis/lerneinheit.view?lerneinheitId=182744&semkez=2024W&ansicht=LEHRVERANSTALTUNGEN&lang=en" 4 | } 5 | -------------------------------------------------------------------------------- /src/main/resources/discord/commands/ask.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ask", 3 | "description": "Ask and answer question", 4 | "options": [ 5 | { 6 | "name": "question", 7 | "description": "Your question", 8 | "type": 3, 9 | "required": true 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /src/main/webapp/chevron-down.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/EmbeddingsImpl.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum EmbeddingsImpl { 7 | UNSET, 8 | SBERT, 9 | OPENAI, 10 | OPENAI_AZURE, 11 | OPENAI_COMPATIBLE, 12 | COHERE, 13 | ALEPH_ALPHA, 14 | OLLAMA, 15 | NUMENTA, 16 | GOOGLE 17 | } 18 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/chevron-down.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/info_black_24dp.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /volume/learning-coach/users/c0646e06-16f3-4c41-a7a0-2d1dbc10a67d/lectures/risk-analysis-and-risk-management-in-agriculture/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "name":"Risk Analysis and Risk Management in Agriculture", 3 | "url":"https://www.vorlesungen.ethz.ch/Vorlesungsverzeichnis/lerneinheit.view?lerneinheitId=182307&semkez=2024W&ansicht=LEHRVERANSTALTUNGEN&lang=en" 4 | } 5 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/answers/StringUtil.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.answers; 2 | 3 | /** 4 | * 5 | */ 6 | public class StringUtil { 7 | 8 | /** 9 | * 10 | */ 11 | public StringUtil() { 12 | } 13 | 14 | /** 15 | * 16 | */ 17 | public String echo(String s) { 18 | return s; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/Emoji.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public class Emoji { 7 | public static final String THUMB_UP = "👍"; // https://unicode-table.com/de/1F44D/ (\uD83D\uDC4D) 8 | public static final String THUMB_DOWN = "👎"; // https://unicode-table.com/de/1F44E/ (\uD83D\uDC4E) 9 | } 10 | -------------------------------------------------------------------------------- /src/main/resources/templates/notify-user-containing-shared-information_en.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

MyKatie

4 | 5 |

6 | ${user_name} would like to share the following information with you: 7 |

8 | 9 |

10 | ${information} 11 |

12 | 13 |

14 | Katie 15 |

16 | 17 | 18 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/exceptions/UserAlreadyMemberException.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.exceptions; 2 | 3 | /** 4 | * 5 | */ 6 | public class UserAlreadyMemberException extends Exception { 7 | 8 | /** 9 | * 10 | */ 11 | public UserAlreadyMemberException(String errorMessage) { 12 | super(errorMessage); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/msteams/MicrosoftAdaptiveCardBodyItem.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.msteams; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | /** 6 | * 7 | */ 8 | public interface MicrosoftAdaptiveCardBodyItem { 9 | 10 | /** 11 | * @return type, e.g. "TextBlock" 12 | */ 13 | public String getType(); 14 | } 15 | -------------------------------------------------------------------------------- /env/docker/run/README.txt: -------------------------------------------------------------------------------- 1 | 2 | README 3 | ------ 4 | 5 | docker-compose is executed from remote by Jenkins, but if you want to run "docker-compose up" manually for testing, then please make sure to set DOCKER_IMAGE_TAG, for example 6 | 7 | export DOCKER_IMAGE_TAG=michaelwechner/wyona:katie-1.349.0 8 | 9 | (run 'docker images' to see available docker images) 10 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/PermissionStatus.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum PermissionStatus { 7 | 8 | IS_PUBLIC, 9 | PERMISSION_DENIED, 10 | NOT_SUFFICIENT_PERMISSIONS_TO_READ_ANSWER, 11 | USER_AUTHORIZED_TO_READ_ANSWER, 12 | MEMBER_AUTHORIZED_TO_READ_ANSWER, 13 | UNKNOWN 14 | } 15 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/question_answer_black_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/question_answer_grey_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V20_1__add_table_slack_team_token_katie_user_id.sql: -------------------------------------------------------------------------------- 1 | /* Mapping between Slack team and bearer token and Katie user Id */ 2 | create table SLACK_TEAM_TOKEN_USERID ( 3 | SLACK_TEAM_ID varchar(100) not null, 4 | BEARER_TOKEN varchar(100) not null, 5 | USER_ID varchar(100) not null 6 | ); 7 | alter table SLACK_TEAM_KATIE_DOMAIN drop BEARER_TOKEN; 8 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V16__add_analytics_table.sql: -------------------------------------------------------------------------------- 1 | /* Generic analytics table */ 2 | create table ANALYTICS ( 3 | UUID varchar(100) not null, 4 | DOMAIN_ID varchar(100) not null, 5 | EVENT_TYPE varchar(100) not null, 6 | TIMESTAMP varchar(100) not null, 7 | LANGUAGE varchar(2), 8 | AGENT varchar(100), 9 | REMOTE_ADDRESS varchar(100) 10 | ); 11 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/DefaultValues.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | public class DefaultValues { 4 | 5 | public final static int NO_OFFSET_PROVIDED = -1; 6 | public final static int NO_LIMIT_PROVIDED = -1; 7 | 8 | public final static int NO_LAST_NUMBER_OF_DAYS_PROVIDED = -1; 9 | public final static int MAX_LAST_NUMBER_OF_DAYS = 365; 10 | } 11 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V4__alter_question_table.sql: -------------------------------------------------------------------------------- 1 | -- add new columns USER_NAME, ANSWER_UUID, PERMISSION_STATUS, MODERATION_STATUS (NEEDS_APPROVAL, APPROVED) 2 | ALTER TABLE QUESTION add USER_NAME varchar(100); 3 | ALTER TABLE QUESTION add ANSWER_UUID varchar(100); 4 | ALTER TABLE QUESTION add PERMISSION_STATUS varchar(100); 5 | ALTER TABLE QUESTION add MODERATION_STATUS varchar(100); 6 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/check_circle_outline_black_24dp.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/check_circle_outline_green_24dp.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /volume/benchmark-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "retrievalConfigs": [ 3 | { 4 | "retrievalImpl": "LUCENE_VECTOR_SEARCH", 5 | "embeddingImpl": "OPENAI_COMPATIBLE", 6 | "embeddingEndpoint": "http://localhost:3000/v1/embeddings", 7 | "embeddingAPIToken": "YOUR_API_KEY", 8 | "embeddingModel": null, 9 | "embeddingValueType": "float32" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /src/main/webapp/chevron-up.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V19_3__alter_question_table.sql: -------------------------------------------------------------------------------- 1 | -- add new columns CHANNEL_TYPE and CHANNEL_REQUEST_UUID 2 | -- remove columns EMAIL_FROM and SLACK_CHANNEL_ID 3 | alter table QUESTION drop EMAIL_FROM; 4 | alter table QUESTION drop SLACK_CHANNEL_ID; 5 | alter table QUESTION add CHANNEL_TYPE varchar(20) not null default 'UNDEFINED'; 6 | alter table QUESTION add CHANNEL_REQUEST_UUID varchar(100); 7 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/chevron-up.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/slack/JWTClaims.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.slack; 2 | 3 | /** 4 | * 5 | */ 6 | public class JWTClaims { 7 | 8 | public static final String TEAM_ID = "team_id"; 9 | public static final String CHANNEL_ID = "channel_id"; 10 | 11 | public static final String DOMAIN_ID = "domain_id"; 12 | public static final String USER_ID = "user_id"; 13 | } 14 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/edit_black_24dp.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/star_border_purple500_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V19_4__alter_channel_matrix_table.sql: -------------------------------------------------------------------------------- 1 | -- rename column UUID_RESUBMITTED_QUESTION to CHANNEL_REQUEST_UUID and add column MATRIX_EVENT_ID 2 | alter table CHANNEL_MATRIX alter column UUID_RESUBMITTED_QUESTION rename to CHANNEL_REQUEST_UUID; 3 | alter table CHANNEL_MATRIX alter column CHANNEL_REQUEST_UUID varchar(100) not null; 4 | alter table CHANNEL_MATRIX add MATRIX_EVENT_ID varchar(100); 5 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V25_2__add_channel_discord_table.sql: -------------------------------------------------------------------------------- 1 | /* Discord requests */ 2 | create table CHANNEL_DISCORD ( 3 | CHANNEL_REQUEST_UUID varchar(100) not null, 4 | DOMAIN_ID varchar(100) not null, 5 | DISCORD_GUILD_ID varchar(50) not null, 6 | DISCORD_CHANNEL_ID varchar(50) not null, 7 | DISCORD_MSG_ID varchar(50) not null, 8 | DISCORD_THREAD_CHANNEL_ID varchar(50) 9 | ); 10 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/lock_open_black_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/handlers/NERHandler.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.handlers; 2 | 3 | import com.wyona.katie.models.Sentence; 4 | 5 | import java.util.List; 6 | 7 | /** 8 | * 9 | */ 10 | public interface NERHandler { 11 | 12 | /** 13 | * @param classifications Classifications, e.g. "num", "hum" 14 | */ 15 | public Sentence analyze(String text, List classifications); 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/firebase/NotificationParameter.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.firebase; 2 | 3 | 4 | public enum NotificationParameter { 5 | SOUND("default"), 6 | COLOR("#FFFF00"); 7 | 8 | private String value; 9 | 10 | NotificationParameter(String value) { 11 | this.value = value; 12 | } 13 | 14 | public String getValue() { 15 | return this.value; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/qna.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /volume/learning-coach/users/c0646e06-16f3-4c41-a7a0-2d1dbc10a67d/lectures/entwicklungspsychologie_teil_1/meta.json: -------------------------------------------------------------------------------- 1 | { 2 | "name":"Entwicklungspsychologie (Teil 1) (06VL200-002b)", 3 | "url":"https://studentservices.uzh.ch/uzh/anonym/vvz/?sap-language=DE&sap-ui-language=DE#/details/2024/003/E/51227108/////////50942313/Einf%25C3%25BChrung%2520Methoden%252C%2520Kognition%252C%2520Entwicklungs-%252C%2520Biol.%2520Psychologie" 4 | } 5 | -------------------------------------------------------------------------------- /src/main/resources/mcp-servers-config-v2.json: -------------------------------------------------------------------------------- 1 | { 2 | "mcpServers": { 3 | "milvus": { 4 | "command": "/Users/michaelwechner/.local/bin/uv", 5 | "args": [ 6 | "--directory", 7 | "/Users/michaelwechner/src/mcp-server-milvus/src/mcp_server_milvus", 8 | "run", 9 | "server.py", 10 | "--milvus-uri", 11 | "http://localhost:19530" 12 | ] 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/insights/EventType.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.insights; 2 | 3 | public enum EventType { 4 | 5 | GET_FAQ, 6 | MESSAGE_RECEIVED, 7 | QUESTION_SENT_TO_EXPERT, 8 | FEEDBACK_10, 9 | FEEDBACK_1, 10 | FEEDBACK_PREDICTED_LABEL_POSITIVE, 11 | FEEDBACK_PREDICTED_LABEL_NEGATIVE, 12 | ASKED_QUESTION, 13 | ANSWERED_QUESTION, 14 | NEXT_BEST_ANSWER 15 | } 16 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/search_black_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /volume/learning-coach/conversation-starter-prompts/191aae92-a23a-4e98-b618-58818a8751f2.json: -------------------------------------------------------------------------------- 1 | { 2 | "suggestion":{ 3 | "id":"191aae92-a23a-4e98-b618-58818a8751f2", 4 | "content":"Erkläre mir wie man eine analoge Uhr liest!" 5 | }, 6 | "messages":[ 7 | { 8 | "role":"system", 9 | "content":"Explain the basic components of an analog watch (hour markers, hour and minute hands) in a clear and simple way." 10 | }] 11 | } 12 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/faq.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/search_grey_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/thumb_up_black_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/thumb_up_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/thumb_up_grey_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V25_1__add_discord_table.sql: -------------------------------------------------------------------------------- 1 | /* Mapping between Discord guilds / channels and Katie contexts/domains */ 2 | create table DISCORD_KATIE_DOMAIN ( 3 | DISCORD_GUILD_ID varchar(100) not null, 4 | DISCORD_CHANNEL_ID varchar(100) not null, 5 | KATIE_DOMAIN_ID varchar(100) not null, 6 | TIMESTAMP_CREATED varchar(100) not null, 7 | STATUS varchar(25) not null, 8 | APPROVAL_TOKEN varchar(500) 9 | ); 10 | -------------------------------------------------------------------------------- /src/main/resources/templates/question-resubmitted_webhook_en.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Please answer question ...

4 | 5 |

6 | A technical proxy user (Language: <#if user_language??>'${user_language}', <#else>NOT SET) has asked the following question: 7 |

8 | 9 |

10 | ${question} 11 |

12 | 13 |

14 | ${answer_question_link} 15 |

16 | 17 | 18 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/thumb_down_black_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/thumb_down_black_24dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/thumb_down_grey_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /src/main/webapp/test-nonce.js: -------------------------------------------------------------------------------- 1 | // INFO: Instructions how to test preventint XSS using a CSP nonce: Add this script to index.html (), add QnA with answer Test XSS click me!, add/remove nonce from CSP and disable/enable safecontent pipe inside Angular component ask-question.component.html 2 | 3 | /** 4 | * 5 | */ 6 | function explode() { 7 | alert('KABOOOOOOM!!!'); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/DetectDuplicatedQuestionImpl.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum DetectDuplicatedQuestionImpl { 7 | UNSET, 8 | LUCENE_DEFAULT, 9 | KNOWLEDGE_GRAPH, 10 | SENTENCE_BERT, 11 | ELASTICSEARCH, 12 | LUCENE_VECTOR_SEARCH, 13 | WEAVIATE, 14 | MILVUS, 15 | QUERY_SERVICE, 16 | KATIE, 17 | AZURE_AI_SEARCH, 18 | LLM, 19 | MCP 20 | } 21 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/toggle-on-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pull-down-up.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | VOLUME_KATIE=/home/wyona 4 | 5 | #VOLUME_KATIE=/Users/michaelwechner/src/wyona/wyona/katie-backend/volume 6 | 7 | NAME=askkatie-local-latest 8 | 9 | echo "Update Katie ..." 10 | 11 | git pull 12 | sh build.sh 13 | 14 | docker stop $NAME 15 | docker rm $NAME 16 | docker rmi askkatie-local:latest 17 | docker build -t askkatie-local . 18 | docker run -d --name $NAME -p 6060:8080 -v $VOLUME_KATIE:/ask-katie askkatie-local 19 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/lock_black_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/b8a72b31-252f-4c02-a0a8-94d83605c760/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Who is Günther? 4 | Günther is the imaginary friend of Ezra. 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/answers/Time.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.answers; 2 | 3 | /** 4 | * 5 | */ 6 | public class Time { 7 | 8 | /** 9 | * 10 | */ 11 | public Time() { 12 | } 13 | 14 | /** 15 | * 16 | */ 17 | public String getTime() { 18 | java.text.DateFormat dateFormat = new java.text.SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 19 | return dateFormat.format(new java.util.Date()); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/lock_black_24dp.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/textcolor/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.10.1 (2021-11-03) 8 | */ 9 | !function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("textcolor",function(){})}(); -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/a7f7f0be-3b27-4acb-bcf9-4dc4c13048c2/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | how many legs does a horse have? 4 | A horse has four legs. 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/resources/templates/question-resubmitted_matrix_en.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Please answer question ...

4 | 5 |

6 | A Matrix user (Matrix room ID: '${matrix_room_id}', Language: <#if user_language??>'${user_language}', <#else>NOT SET) has asked the following question: 7 |

8 | 9 |

10 | ${question} 11 |

12 | 13 |

14 | ${answer_question_link} 15 |

16 | 17 | 18 | -------------------------------------------------------------------------------- /src/main/webapp/.well-known/assetlinks.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "relation": ["delegate_permission/common.handle_all_urls"], 3 | "target": { 4 | "namespace": "android", 5 | "package_name": "ch.cbfs.sampleappandroid", 6 | "sha256_cert_fingerprints": 7 | ["1B:5F:73:1C:7C:C0:CA:5F:74:64:33:D8:0E:D3:A3:B0:93:8E:B5:BF:14:0C:74:7C:43:DC:25:FA:A5:AF:A2:34","7F:40:B5:1D:9D:25:30:5F:55:9C:E1:6A:C2:B7:27:E0:F4:F6:FA:FF:78:A7:87:3E:A7:94:98:DB:F4:55:A0:92"] 8 | } 9 | }] 10 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/colorpicker/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.10.1 (2021-11-03) 8 | */ 9 | !function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("colorpicker",function(){})}(); -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/contextmenu/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.10.1 (2021-11-03) 8 | */ 9 | !function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("contextmenu",function(){})}(); -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/f5b3938d-b512-4b04-8d69-5aad58fcaf46/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | How is the weather? 4 | See https://www.nzz.ch/wetter/wetter-heute 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/TOPdesk_RGB_Logomark.svg: -------------------------------------------------------------------------------- 1 | TOPdesk_RGB_Logomark -------------------------------------------------------------------------------- /src/main/resources/templates/notify-members-re-invitation-request_en.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Invite Slack user to your Katie domain

4 | 5 |

The Slack user '${user_id}' of the Slack team / channel '${team_id} / ${channel_id}' would like to become a member of your Katie domain '${domain_id}'.

6 | 7 |

Please click on the following link to invite the Slack user:

8 | 9 |

10 | ${link} 11 |

12 | 13 | 14 | -------------------------------------------------------------------------------- /src/main/resources/templates/question-resubmitted_fcm_token_en.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Please answer question ...

4 | 5 |

6 | A user with a mobile device (FCM token: '${fcm_token}', Language: <#if user_language??>'${user_language}', <#else>NOT SET) has asked the following question: 7 |

8 | 9 |

10 | ${question} 11 |

12 | 13 |

14 | ${answer_question_link} 15 |

16 | 17 | 18 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/format_list_bulleted_black_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/format_list_bulleted_grey_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/969ed753-c72d-4340-9e8f-898e433de879/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | what is the square root of Pi? 4 | The square root of Pi is approximately 1.77245 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/77fac2bf-e8d4-48f7-875f-4e17f8c7ea1d/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | What is the status of our suitcase? 4 | I will have to check and get back to you shortly ... 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/f07de5d0-194a-4a28-bfe7-966e2395772f/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Wie wird das Wetter heute? 4 | Siehe https://www.nzz.ch/wetter/wetter-heute 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/01bc9f1e-ece5-4fa7-b851-17d8e40f0bb5/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Where is Sils Maria? 4 | See https://de.wikipedia.org/wiki/Sils_im_Engadin/Segl 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/KnowledgeSourceConnector.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum KnowledgeSourceConnector { 7 | MOCK, 8 | SHAREPOINT, 9 | ONENOTE, 10 | OUTLOOK, 11 | CONFLUENCE, 12 | WEAVIATE_SITE_SEARCH, 13 | WEAVIATE_WIKIPEDIA_SEARCH, 14 | THIRD_PARTY_RAG, 15 | FILESYSTEM, 16 | DIRECTUS, 17 | SUPABASE, 18 | TOP_DESK, 19 | DISCOURSE, 20 | GROUNDED_QA, 21 | ENERGIS, 22 | WEBSITE 23 | } 24 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/627d5f01-9bc0-426f-aef0-3674f69e0bd9/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | What is the highest mountain of the world? 4 | Mount Everest 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/892ecad9-c664-4c34-9ad7-1fb7faca3022/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Wie wird das Wetter am Wochenende? 4 | Siehe Mittelfristprognose https://www.nzz.ch/wetter/wettervorhersage 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/analytics_grey_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/analytics_black_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/assets/scripts/accordion.js: -------------------------------------------------------------------------------- 1 | /** 2 | * INFO: Expand and collapse optional input fields 3 | */ 4 | function expandCollapse() { 5 | //alert("DEBUG: Expand/Collapse ..."); 6 | 7 | var acc = document.getElementsByClassName("accordion")[0]; 8 | acc.classList.toggle("active"); 9 | var panel = acc.nextElementSibling; 10 | if (panel.style.maxHeight){ 11 | panel.style.maxHeight = null; 12 | } else { 13 | panel.style.maxHeight = panel.scrollHeight + "px"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/ModerationStatus.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | //import java.util.Enumeration; 4 | 5 | /** 6 | * 7 | */ 8 | public class ModerationStatus { 9 | //public class ModerationStatus implements Enumeration { 10 | 11 | public static final String IGNORED = "IGNORED"; 12 | public static final String DISCARDED = "DISCARDED"; 13 | public static final String APPROVED = "APPROVED"; 14 | public static final String NEEDS_APPROVAL = "NEEDS_APPROVAL"; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/resources/templates/no_answer_to_question_en.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

No answer found to question of domain '${domain_name}'

4 | 5 |

6 | The user '${username}' has asked the following question: 7 |

8 | 9 |

10 | ${question} 11 |

12 | 13 |

14 | At your convenience, visit: 15 |

16 | 17 |

18 | ${question_link} 19 |

20 | 21 |

22 | to check whether you might be able to provide an answer. 23 |

24 | 25 | 26 | -------------------------------------------------------------------------------- /src/main/resources/templates/qna-needs-approval_email_en.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Answer of domain '${domain_name}' needs approval ...

4 | 5 |

6 | The user '${username}' on channel '${channel}' has asked the following question: 7 |

8 | 9 |

10 | ${question} 11 |

12 | 13 |

14 | At your convenience, visit: 15 |

16 | 17 |

18 | ${qna_link} 19 |

20 | 21 |

22 | to approve or correct and approve Answer. 23 |

24 | 25 | 26 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/ef6261bd-78ee-4f04-b00d-ca496ef87b62/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | How to evaluate a content security policy? 4 | Use for example https://csp-evaluator.withgoogle.com/ 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/d42d8e7b-2e11-41f2-b6b1-b056e837bef9/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | What textbooks had the biggest impact on you as a machine learning researcher? 4 | See https://qr.ae/pNkfMu 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | 2 | ,---. ,--. ,--. ,--. ,--. ,--. 3 | / O \ ,---. | |,-. | .' / ,--,--. ,-' '-. `--' ,---. 4 | | .-. | ( .-' | / | . ' ' ,-. | '-. .-' ,--. | .-. : 5 | | | | | .-' `) | \ \ | |\ \ \ '-' | | | | | \ --. 6 | `--' `--' `----' `--'`--' `--' '--' `--`--' `--' `--' `----' 7 | 8 | -------------------------------------------------------------------------------- /volume/iam/users.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | superadmin 5 | ADMIN 6 | contact@wyona.com 7 | $2a$10$kjuV8Rn1zcIseKCE4z7KauUSikk4jyvs/Jeb75uxNBEsWWe/vhhf6 8 | Superadmin 9 | User 10 | en 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/Question.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * Question 5 | */ 6 | public class Question { 7 | 8 | private String question; 9 | 10 | /** 11 | * 12 | */ 13 | public Question() { 14 | } 15 | 16 | /** 17 | * 18 | */ 19 | public void setQuestion(String question) { 20 | this.question = question; 21 | } 22 | 23 | /** 24 | * 25 | */ 26 | public String getQuestion() { 27 | return question; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/resources/templates/question-resubmitted_email_en.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Please answer question ...

4 | 5 |

6 | A user with the email address '${user_email}' (<#if user_firstname_lastname??>Name: '${user_firstname_lastname}', <#else>Language: <#if user_language??>'${user_language}', <#else>NOT SET) has asked the following question: 7 |

8 | 9 |

10 | ${question} 11 |

12 | 13 |

14 | ${answer_question_link} 15 |

16 | 17 | 18 | -------------------------------------------------------------------------------- /src/main/resources/templates/question-resubmitted_unknown_en.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Please answer question ...

4 | 5 |

6 | A user (Language: <#if user_language??>'${user_language}', <#else>NOT SET) via an unknown channel (neither email nor FCM token nor Slack channel Id nor MS Teams information nor Matrix user ID) has asked the following question: 7 |

8 | 9 |

10 | ${question} 11 |

12 | 13 |

14 | ${answer_question_link} 15 |

16 | 17 | 18 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/ChannelAction.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public enum ChannelAction { 7 | 8 | LOGIN, 9 | ANSWER_QUESTION, 10 | SEND_QUESTION_TO_EXPERT, 11 | IMPROVE_CORRECT_ANSWER, 12 | ENTER_BETTER_ANSWER, 13 | SEND_BETTER_ANSWER, 14 | SEE_MORE_ANSWERS, 15 | THUMB_UP, 16 | THUMB_DOWN, 17 | MORE_INFO, 18 | GET_PROTECTED_ANSWER, 19 | REQUEST_INVITATION, 20 | REQUEST_BECOME_MEMBER, 21 | CREATE_DOMAIN, 22 | CONNECT_DOMAIN 23 | } 24 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/7270028c-890d-4b20-a16a-a0cba7c61c1b/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Wie wird das Wetter morgen? 4 | Siehe https://www.nzz.ch/wetter/wettervorhersage und https://www.nzz.ch/wetter/wetter-heute 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/b35836dc-f276-4bc7-b9bb-eadee2774473/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Who is the co-author of the book 'Zero to One'? 4 | The co-author of the book 'Zero to One' by Peter Thiel is Blake Masters 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/resources/templates/question-resubmitted_msteams_en.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Please answer question ...

4 | 5 |

6 | The user <#if user_firstname_lastname??>'${user_firstname_lastname}', <#else>TODO (Id: '${user_id}', Language: <#if user_language??>'${user_language}', <#else>NOT SET) has asked the following question on MS Teams (Id: 'TODO'): 7 |

8 | 9 |

10 | ${question} 11 |

12 | 13 |

14 | ${answer_question_link} 15 |

16 | 17 | 18 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/BenchmarkConfiguration.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | public class BenchmarkConfiguration { 4 | 5 | private RetrievalConfiguration[] retrievalConfigs; 6 | 7 | /** 8 | * 9 | */ 10 | public void setRetrievalConfigs(RetrievalConfiguration[] retrievalConfigs) { 11 | this.retrievalConfigs = retrievalConfigs; 12 | } 13 | 14 | /** 15 | * 16 | */ 17 | public RetrievalConfiguration[] getRetrievalConfigs() { 18 | return retrievalConfigs; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/52fb2907-45b0-4785-8379-5c0b3f44bf1e/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Was sind die Öffnungszeiten vom Strassenverkehrsamt Zürich? 4 | Siehe https://stva.zh.ch/internet/sicherheitsdirektion/stva/de/ueber_uns/organisation/StVA_Al.html 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/ad7c1da7-22a3-4995-adeb-0cf4236d98a1/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | How does a Corona test work? 4 | See https://www.sciencemag.org/news/2020/03/standard-coronavirus-test-if-available-works-well-can-new-diagnostics-help-pandemic# 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.6.1 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/1083c42c-826b-4767-9e9a-d3b6f542529f/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Wann ist die nächste Papiersammlung? 4 | 5 |

6 | com.wyona.katie.answers.OpenERZ#getCalendarPaper(ak-entity:number,'de') 7 |

8 |
9 | 10 |
11 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/43be6f19-0167-4b12-95a9-9005b2fa0814/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | How can I disable X-Frame-Options in Spring Boot? 4 | Inside the method configure(HttpSecurity) of the Security Config class set http.headers().frameOptions().disable() 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/3a14f0b4-0fec-44f7-9451-722c846ece0a/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | What is the expiry time of Slack's response_url? 4 | Slack's response_url is valid 30 minutes, whereas see https://api.slack.com/interactivity/handling 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/7da390ac-8e57-4d46-a9de-fe469f29f7c8/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Wann ist die nächste Kartonsammlung? 4 | 5 |

6 | com.wyona.katie.answers.OpenERZ#getCalendarCardboard(ak-entity:number,'de') 7 |

8 |
9 | 10 |
11 | -------------------------------------------------------------------------------- /src/main/resources/db/migration/V10__add_channel_msteams_table.sql: -------------------------------------------------------------------------------- 1 | /* Connection values re Channel MS Teams */ 2 | create table CHANNEL_MS_TEAMS ( 3 | UUID_RESUBMITTED_QUESTION varchar(100) not null, 4 | DOMAIN_ID varchar(100), 5 | SERVICE_URL varchar(100) not null, 6 | CONVERSATION_ID varchar(200) not null, 7 | CONVERSATION_NAME varchar(200), 8 | MESSAGE_ID varchar(200) not null, 9 | KATIE_BOT_ID varchar(200) not null, 10 | KATIE_BOT_NAME varchar(200), 11 | MS_TEAMS_USER_ID varchar(200) not null, 12 | MS_TEAMS_USER_NAME varchar(200) 13 | ); 14 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/webhooks.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/resources/templates/question-resubmitted_slack_channel_en.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Please answer question ...

4 | 5 |

6 | The user '<#if slack_user_name??>${slack_user_name}<#else>NOT SET' on the Slack channel (Id: '<#if slack_channel_id??>${slack_channel_id}<#else>NOT SET', Language: <#if user_language??>'${user_language}'<#else>NOT SET) has asked the following question: 7 |

8 | 9 |

10 | ${question} 11 |

12 | 13 |

14 | ${answer_question_link} 15 |

16 | 17 | 18 | -------------------------------------------------------------------------------- /src/main/webapp/assets/scss/modules/_fonts.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'Open Sans'; 3 | src: url('../../fonts/SemiBold/OpenSans-SemiBold.woff2') format('woff2'), 4 | url('../../fonts/SemiBold/OpenSans-SemiBold.woff') format('woff'); 5 | font-weight: 600; 6 | font-style: normal; 7 | } 8 | 9 | @font-face { 10 | font-family: 'Open Sans'; 11 | src: url('../../fonts/Regular/OpenSans-Regular.woff2') format('woff2'), 12 | url('../../fonts/Regular/OpenSans-Regular.woff') format('woff'); 13 | font-weight: 400; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/7d2befa1-d75b-4a75-aaa3-d171ac2f319b/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Wo kann man einen MG A mieten 4 | Muss es genau ein MG A sein, sonst gäb’s hier ein paar andere Briten mit Charme: 5 | https://www.rentaclassic.swiss/de/fahrzeug-buchen.html 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/c157dfde-ecda-41aa-8b33-26a16708465f/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | What is the phone number of Swiss in Zürich? 4 | The phone number of SWISS Zürich is +41 848 700 700 or see https://www.swiss.com/ch/DE/kundensupport/service-center 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tinymce", 3 | "description": "Web based JavaScript HTML WYSIWYG editor control.", 4 | "license": "LGPL-2.1", 5 | "keywords": [ 6 | "wysiwyg", 7 | "tinymce", 8 | "richtext", 9 | "javascript", 10 | "html", 11 | "text", 12 | "rich editor", 13 | "rich text editor", 14 | "rte", 15 | "rich text", 16 | "contenteditable", 17 | "editing" 18 | ], 19 | "homepage": "https://www.tiny.cloud/", 20 | "ignore": [ 21 | "README.md", 22 | "composer.json", 23 | "package.json", 24 | ".npmignore", 25 | "CHANGELOG.md" 26 | ] 27 | } -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/QuestionSentence.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | import java.util.ArrayList; 4 | import java.util.LinkedList; 5 | import java.util.List; 6 | 7 | public class QuestionSentence extends Sentence { 8 | final private LinkedList words; 9 | 10 | 11 | public QuestionSentence(String sentence, ArrayList entities, List classifications, LinkedList words) { 12 | super(sentence, entities, classifications); 13 | this.words = words; 14 | } 15 | 16 | 17 | public LinkedList getWords() { 18 | return words; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/StatusResubmittedQuestion.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | //import java.util.Enumeration; 4 | 5 | /** 6 | * 7 | */ 8 | public class StatusResubmittedQuestion { 9 | //public class StatusResubmittedQuestion implements Enumeration { 10 | 11 | public static final String STATUS_PENDING = "answer-pending"; 12 | public static final String STATUS_ANSWERED = "answered-and-ready-to-send"; 13 | public static final String STATUS_ANSWER_SENT = "answer-sent"; 14 | public static final String STATUS_ANSWER_RATED = "answer-rated"; 15 | } 16 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/9f6044e9-b11f-47c6-a74a-da880410bd55/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Why can't I change the issue status in redmine of a particular tracker? 4 | One has to set a tracker workflow, see for example https://www.redmineup.com/pages/help/redmine/set-tracker-workflow 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/c414a536-5e6c-4149-b829-e375145507e4/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | how to use Docker without sudo? 4 | Execute 'sudo gpasswd -a $USER docker' 5 | 6 | whereas also see 7 | 8 | https://docs.docker.com/engine/install/linux-postinstall/ 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/fb8648a7-0574-490a-b153-40fc9f7d4f53/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | What is the complete list of Arsène Lupin books by Maurice Leblanc? 4 | See for example https://www.mysterytribune.com/the-complete-list-of-arsene-lupin-books-by-maurice-leblanc/ 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/toggle-off-solid.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/slack/SlackNodeInputValue.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.slack; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | /** 6 | * 7 | */ 8 | @Slf4j 9 | public class SlackNodeInputValue { 10 | 11 | private String value; 12 | 13 | /** 14 | * 15 | */ 16 | public SlackNodeInputValue() { 17 | } 18 | 19 | /** 20 | * 21 | */ 22 | public void setValue(String value) { 23 | this.value = value; 24 | } 25 | 26 | /** 27 | * 28 | */ 29 | public String getValue() { 30 | return value; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/skins/ui/oxide/content.mobile.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | */ 7 | .tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse} 8 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/skins/ui/oxide-dark/content.mobile.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | */ 7 | .tinymce-mobile-unfocused-selections .tinymce-mobile-unfocused-selection{background-color:green;display:inline-block;opacity:.5;position:absolute}body{-webkit-text-size-adjust:none}body img{max-width:96vw}body table img{max-width:95%}body{font-family:sans-serif}table{border-collapse:collapse} 8 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM eclipse-temurin:21-jdk 2 | LABEL maintainer="Michael Wechner " 3 | VOLUME /tmp 4 | COPY target/askkatie-webapp-*.war app.war 5 | 6 | # TLS 1.0 and 1.1 (TLSv1, TLSv1.1) enabled in order to be able to connect to IMAP servers which do not support more recent protocols, whereas see property jdk.tls.disabledAlgorithms inside file java.security 7 | # For more details see src/main/webapp/email-integration.html 8 | COPY java.security /usr/java/openjdk-21/conf/security/. 9 | 10 | #ENTRYPOINT ["java","-Djdk.http.auth.tunneling.disabledSchemes=","-jar","/app.war"] 11 | ENTRYPOINT ["java","-jar","/app.war"] 12 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.6.1 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | @import "screen-reader.less"; 19 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/77ab9e70-0885-49cf-b05e-753786c45c9d/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | How can I restrict access to particular answers? 4 | On the form to answer a user question, click on the "lock" icon on the top and select the permissions you want to grant. 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/TextEmbedding.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public class TextEmbedding { 7 | 8 | private String text; 9 | private float[] vector; 10 | 11 | /** 12 | * 13 | */ 14 | public TextEmbedding(String text, float[] vector) { 15 | this.text = text; 16 | this.vector = vector; 17 | } 18 | 19 | /** 20 | * 21 | */ 22 | public String getText() { 23 | return text; 24 | } 25 | 26 | /** 27 | * 28 | */ 29 | public float[] getVector() { 30 | return vector; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/slack/SlackNodeSelectValue.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.slack; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | /** 6 | * 7 | */ 8 | @Slf4j 9 | public class SlackNodeSelectValue { 10 | 11 | private String value; 12 | 13 | /** 14 | * 15 | */ 16 | public SlackNodeSelectValue() { 17 | } 18 | 19 | /** 20 | * 21 | */ 22 | public void setSelected_channel(String value) { 23 | this.value = value; 24 | } 25 | 26 | /** 27 | * 28 | */ 29 | public String getSelected_channel() { 30 | return value; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/colorpicker/plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.10.1 (2021-11-03) 8 | */ 9 | (function () { 10 | 'use strict'; 11 | 12 | var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); 13 | 14 | function Plugin () { 15 | global.add('colorpicker', function () { 16 | }); 17 | } 18 | 19 | Plugin(); 20 | 21 | }()); 22 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/contextmenu/plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.10.1 (2021-11-03) 8 | */ 9 | (function () { 10 | 'use strict'; 11 | 12 | var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); 13 | 14 | function Plugin () { 15 | global.add('contextmenu', function () { 16 | }); 17 | } 18 | 19 | Plugin(); 20 | 21 | }()); 22 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/textcolor/plugin.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.10.1 (2021-11-03) 8 | */ 9 | (function () { 10 | 'use strict'; 11 | 12 | var global = tinymce.util.Tools.resolve('tinymce.PluginManager'); 13 | 14 | function Plugin () { 15 | global.add('textcolor', function () { 16 | }); 17 | } 18 | 19 | Plugin(); 20 | 21 | }()); 22 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/webhooks-deliveries.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/services/AnswerFromTextService.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.services; 2 | 3 | /** 4 | * Get answer from text, e.g. content of a web page 5 | */ 6 | public interface AnswerFromTextService { 7 | 8 | /** 9 | * @param question Question, e.g. "What is the address of Wyona?" 10 | * @param text Text containing answer, e.g. "The headquarter of Wyona is located at Fritz-Fleiner-Weg 9, 8044 Zürich, Switzerland" 11 | * @return answer, e.g. "The address of Wyona is Fritz-Fleiner-Weg 9, 8044 Zürich, Switzerland" 12 | */ 13 | public String getAnswerFromText(String question, String text); 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/slack/SlackViewState.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.slack; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | /** 6 | * 7 | */ 8 | @Slf4j 9 | public class SlackViewState { 10 | 11 | private SlackViewStateValues values; 12 | 13 | /** 14 | * 15 | */ 16 | public SlackViewState() { 17 | } 18 | 19 | /** 20 | * 21 | */ 22 | public void setValues(SlackViewStateValues values) { 23 | this.values = values; 24 | } 25 | 26 | /** 27 | * 28 | */ 29 | public SlackViewStateValues getValues() { 30 | return values; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/beb5ce56-f4b9-419d-af09-d5edbd188f49/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | How can a domain member become an expert? 4 | Sign in to Katie, select the dashboard of the domain, select the member you want to become an Expert and enable "Expert" for this member. 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/e758807e-0eb1-4755-9cfe-deee4f707a02/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | How can I remove Katie from my Slack Workspace/Channel? 4 | See the instructions at https://slack.com/help/articles/360003125231-Remove-apps-and-custom-integrations-from-your-workspace 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/integrations/discord/commands/SlashCommand.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.integrations.discord.commands; 2 | 3 | import discord4j.core.event.domain.interaction.ChatInputInteractionEvent; 4 | import reactor.core.publisher.Mono; 5 | 6 | /** 7 | * A simple interface defining our slash command class contract. 8 | * a getName() method to provide the case-sensitive name of the command. 9 | * and a handle() method which will house all the logic for processing each command. 10 | */ 11 | public interface SlashCommand { 12 | 13 | String getName(); 14 | 15 | Mono handle(ChatInputInteractionEvent event); 16 | } 17 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/group_black_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/group_grey_18dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/e51b809c-62f9-4236-88ef-afaa51bbb277/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | How can a domain member become a moderator? 4 | Sign in to Katie, select the dashboard of the domain, select the member you want to become a Member and enable "Moderator" for this member. 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/account_circle_grey_36dp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/search_FILL0_wght500_GRAD0_opsz40.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/resources/mcp-servers-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "mcpServers": { 3 | "brave-search": { 4 | "command": "npx", 5 | "args": [ 6 | "-y", 7 | "@modelcontextprotocol/server-brave-search" 8 | ], 9 | "env": { 10 | "BRAVE_API_KEY": "BRAVE_API_KEY" 11 | } 12 | }, 13 | "milvus": { 14 | "command": "/Users/michaelwechner/.local/bin/uv", 15 | "args": [ 16 | "--directory", 17 | "/Users/michaelwechner/src/mcp-server-milvus/src/mcp_server_milvus", 18 | "run", 19 | "server.py", 20 | "--milvus-uri", 21 | "http://localhost:19530" 22 | ] 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/handlers/qc/ClassificationHandler.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.handlers.qc; 2 | 3 | import com.wyona.katie.models.QuestionClassification; 4 | import com.wyona.katie.models.QuestionClassification; 5 | 6 | import java.util.Optional; 7 | 8 | public interface ClassificationHandler { 9 | 10 | /** 11 | * @param input Input sentence, e.g. "Can I put the value 150 as the property of 'name', or does it not work like that" 12 | * @param domainId Katie domain Id, e.g. "f8703e64-2020-42d9-bfad-736e9eb894c0" 13 | * @return 14 | */ 15 | public Optional getClassification(String input, String domainId); 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/insights/Event.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.insights; 2 | 3 | import java.util.Date; 4 | 5 | /** 6 | * Insight event 7 | */ 8 | public class Event { 9 | 10 | private String type; 11 | private Date timestamp; 12 | 13 | /** 14 | * 15 | */ 16 | public Event(String type, Date timestamp) { 17 | this.type = type; 18 | this.timestamp = timestamp; 19 | } 20 | 21 | /** 22 | * 23 | */ 24 | public String getType() { 25 | return type; 26 | } 27 | 28 | /** 29 | * 30 | */ 31 | public Date getTimestamp() { 32 | return timestamp; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/slack/SlackNodeEmail.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.slack; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | /** 6 | * 7 | */ 8 | @Slf4j 9 | public class SlackNodeEmail { 10 | 11 | private SlackNodeInputValue inputValue; 12 | 13 | /** 14 | * 15 | */ 16 | public SlackNodeEmail() { 17 | } 18 | 19 | /** 20 | * 21 | */ 22 | public void setSingle_line_input(SlackNodeInputValue inputValue) { 23 | this.inputValue = inputValue; 24 | } 25 | 26 | /** 27 | * 28 | */ 29 | public SlackNodeInputValue getSingle_line_input() { 30 | return inputValue; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/a001ea6f-51a5-4c2c-89a2-25d982b54765/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Wie kann ich Katie aus meinem Slack Workspace / Channel entfernen? 4 | Siehe die Anleitung unter https://slack.com/intl/de-de/help/articles/360003125231-Apps-und-benutzerdefinierte-Integrationen-aus-deinem-Workspace-entfernen 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/ad2f8819-3d1a-4f37-966b-0fae8be7f81c/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | What are the requirements to install Katie on-premises? 4 | Verify that you have Docker Compose installed, whereas also see https://docs.docker.com/compose/install/?fbclid=IwAR2m8Iy4-2vFPHwH0shiljJNc6cohQQsyX6d733b3N440_sELtoyF5qqpnE 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/slack/SlackNodeChannelId.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.slack; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | /** 6 | * 7 | */ 8 | @Slf4j 9 | public class SlackNodeChannelId { 10 | 11 | private SlackNodeSelectValue selectValue; 12 | 13 | /** 14 | * 15 | */ 16 | public SlackNodeChannelId() { 17 | } 18 | 19 | /** 20 | * 21 | */ 22 | public void setSelect_id(SlackNodeSelectValue selectValue) { 23 | this.selectValue = selectValue; 24 | } 25 | 26 | /** 27 | * 28 | */ 29 | public SlackNodeSelectValue getSelect_id() { 30 | return selectValue; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/53b4861a-71ef-43f1-b3e1-7187e77007a4/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | How do I start my Macbook into Recovery? 4 | 5 | 1. Turn on your Mac and immediately press and hold these two keys: Command (⌘) and R. 6 | 2. Release the keys when you see an Apple logo, spinning globe, or other startup screen. 7 | 8 | more: https://support.apple.com/en-us/HT201314 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/slack/SlackNodeDomainId.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.slack; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | /** 6 | * 7 | */ 8 | @Slf4j 9 | public class SlackNodeDomainId { 10 | 11 | private SlackNodeInputValue inputValue; 12 | 13 | /** 14 | * 15 | */ 16 | public SlackNodeDomainId() { 17 | } 18 | 19 | /** 20 | * 21 | */ 22 | public void setSingle_line_input(SlackNodeInputValue inputValue) { 23 | this.inputValue = inputValue; 24 | } 25 | 26 | /** 27 | * 28 | */ 29 | public SlackNodeInputValue getSingle_line_input() { 30 | return inputValue; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /migrate-h2database-to-version2.sql: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | USERNAME=uuu 4 | PASSWORD=ppp 5 | 6 | SQL_FILE=backup.sql 7 | MAVEN_REPO_H2=/Users/michaelwechner/.m2/repository/com/h2database/h2 8 | KATIE_VOLUME=/Users/michaelwechner/src/wyona/public/katie-backend/volume 9 | 10 | echo "Dump database as SQL file ..." 11 | java -cp $MAVEN_REPO_H2/1.4.197/h2-1.4.197.jar org.h2.tools.Script -url jdbc:h2:$KATIE_VOLUME/askkatie-h2 -user $USERNAME -password $PASSWORD -script $SQL_FILE 12 | 13 | echo "Recreate database version 2 from SQL file ..." 14 | java -cp $MAVEN_REPO_H2/2.4.240/h2-2.4.240.jar org.h2.tools.RunScript -url jdbc:h2:$KATIE_VOLUME/askkatie-h2-v2 -user $USERNAME -password $PASSWORD -script $SQL_FILE 15 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/arrow_icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | arrow_button 5 | Created with Sketch. 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/slack/SlackNodeBetteranswer.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.slack; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | /** 6 | * 7 | */ 8 | @Slf4j 9 | public class SlackNodeBetteranswer { 10 | 11 | private SlackNodeInputValue inputValue; 12 | 13 | /** 14 | * 15 | */ 16 | public SlackNodeBetteranswer() { 17 | } 18 | 19 | /** 20 | * 21 | */ 22 | public void setSingle_line_input(SlackNodeInputValue inputValue) { 23 | this.inputValue = inputValue; 24 | } 25 | 26 | /** 27 | * 28 | */ 29 | public SlackNodeInputValue getSingle_line_input() { 30 | return inputValue; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/slack/SlackNodeRelevanturl.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.slack; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | /** 6 | * 7 | */ 8 | @Slf4j 9 | public class SlackNodeRelevanturl { 10 | 11 | private SlackNodeInputValue inputValue; 12 | 13 | /** 14 | * 15 | */ 16 | public SlackNodeRelevanturl() { 17 | } 18 | 19 | /** 20 | * 21 | */ 22 | public void setSingle_line_input(SlackNodeInputValue inputValue) { 23 | this.inputValue = inputValue; 24 | } 25 | 26 | /** 27 | * 28 | */ 29 | public SlackNodeInputValue getSingle_line_input() { 30 | return inputValue; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/slack/SlackNodeAskedquestion.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.slack; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | /** 6 | * 7 | */ 8 | @Slf4j 9 | public class SlackNodeAskedquestion { 10 | 11 | private SlackNodeInputValue inputValue; 12 | 13 | /** 14 | * 15 | */ 16 | public SlackNodeAskedquestion() { 17 | } 18 | 19 | /** 20 | * 21 | */ 22 | public void setSingle_line_input(SlackNodeInputValue inputValue) { 23 | this.inputValue = inputValue; 24 | } 25 | 26 | /** 27 | * 28 | */ 29 | public SlackNodeInputValue getSingle_line_input() { 30 | return inputValue; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/insights/LanguagePageviews.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.insights; 2 | 3 | /** 4 | * Language Pageviews tuple 5 | */ 6 | public class LanguagePageviews { 7 | 8 | private String language; 9 | private int pageviews; 10 | 11 | /** 12 | * 13 | */ 14 | public LanguagePageviews(String language, int pageviews) { 15 | this.language = language; 16 | this.pageviews = pageviews; 17 | } 18 | 19 | /** 20 | * 21 | */ 22 | public String getLanguage() { 23 | return language; 24 | } 25 | 26 | /** 27 | * 28 | */ 29 | public int getPageviews() { 30 | return pageviews; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/learningcoach/Suggestion.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.learningcoach; 2 | 3 | /** 4 | * 5 | */ 6 | public class Suggestion { 7 | 8 | private String id; 9 | private String content; 10 | 11 | /** 12 | * 13 | */ 14 | public void setId(String id) { 15 | this.id = id; 16 | } 17 | 18 | /** 19 | * 20 | */ 21 | public String getId() { 22 | return id; 23 | } 24 | 25 | /** 26 | * 27 | */ 28 | public void setContent(String content) { 29 | this.content = content; 30 | } 31 | 32 | /** 33 | * 34 | */ 35 | public String getContent() { 36 | return content; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/answers/JinaAIOfficeHours.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.answers; 2 | 3 | /** 4 | * 5 | */ 6 | public class JinaAIOfficeHours { 7 | 8 | /** 9 | * 10 | */ 11 | public JinaAIOfficeHours() { 12 | } 13 | 14 | /** 15 | * @return next office hours, e.g. "Tuesday May 17 at 4pm CEST" 16 | */ 17 | public String getNextOfficeHours() { 18 | java.text.DateFormat dateFormat = new java.text.SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 19 | //return dateFormat.format(new java.util.Date()); 20 | // TODO: Parse and extract next office hours from https://www.meetup.com/jina-community-meetup/ 21 | return "Tuesday May 17 at 4pm CEST"; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/handlers/qc/QuestionClassifier.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.handlers.qc; 2 | 3 | import com.wyona.katie.models.AnalyzedMessage; 4 | import com.wyona.katie.models.Context; 5 | import com.wyona.katie.models.AnalyzedMessage; 6 | import com.wyona.katie.models.Context; 7 | 8 | /** 9 | * 10 | */ 11 | public interface QuestionClassifier { 12 | 13 | /** 14 | * Analyze message, e.g. check whether message contains question(s) 15 | * @param message Message, e.g. "Hello, has anyone deployed weaviate in Azure? If so, which infrastructure deployment did you use? Thanks! Michael" 16 | * @return analyzed message 17 | */ 18 | public AnalyzedMessage analyze(String message, Context domain); 19 | } 20 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/SuggestedQuestions.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class SuggestedQuestions { 7 | 8 | private List questions; 9 | 10 | /** 11 | * 12 | */ 13 | public SuggestedQuestions() { 14 | questions = new ArrayList(); 15 | } 16 | 17 | /** 18 | * 19 | */ 20 | public void addQuestion(String question) { 21 | Question q = new Question(); 22 | q.setQuestion(question); 23 | questions.add(q); 24 | } 25 | 26 | /** 27 | * 28 | */ 29 | public Question[] getQuestions() { 30 | return questions.toArray(new Question[0]); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/QnAReference.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | public class QnAReference { 4 | 5 | private String domainId; 6 | private String uuid; 7 | 8 | /** 9 | * 10 | */ 11 | public QnAReference(String domainId, String uuid) { 12 | this.domainId = domainId; 13 | this.uuid = uuid; 14 | } 15 | 16 | /** 17 | * 18 | */ 19 | public String getDomainId() { 20 | return domainId; 21 | } 22 | 23 | /** 24 | * 25 | */ 26 | public String getUuid() { 27 | return uuid; 28 | } 29 | 30 | /** 31 | * 32 | */ 33 | @Override 34 | public String toString() { 35 | return domainId + " / " + uuid; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/39830ea9-2cf1-4211-8e20-1d2ca7cde920/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | What is an EBITDA margin? 4 | EBITDA margin is a measure of a company's operating profit as a percentage of its revenue. It allows for a comparison of one company's real performance to others in its industry. 5 | 6 | EBITDA = earnings before interest, taxes, depreciation, and amortization 7 | 8 | Thus: EBITDA margin = EBITDA / Revenue * 100 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /volume/datasets/README.md: -------------------------------------------------------------------------------- 1 | # Sample datasets 2 | 3 | ## kaggle_ashfakyeafi_spam-email-classification.csv 4 | 5 | Spam email classification, see https://www.kaggle.com/datasets/ashfakyeafi/spam-email-classification 6 | 7 | License: Apache 2.0 8 | 9 | ## huggingface_farshad72_spam_email.csv 10 | 11 | Spam email classification, see https://huggingface.co/datasets/farshad72/spam_email 12 | 13 | License: MIT License 14 | 15 | ## Newsgroups 16 | 17 | The newsgroups dataset comprises around 18000 newsgroups posts on 20 topics 18 | 19 | - https://scikit-learn.org/0.19/datasets/twenty_newsgroups.html 20 | - http://qwone.com/~jason/20Newsgroups/ 21 | - https://www.kaggle.com/datasets/crawford/20-newsgroups/ 22 | - https://huggingface.co/datasets/rungalileo/20_Newsgroups_Fixed 23 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/services/QnAsFromWebpageService.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.services; 2 | 3 | import com.wyona.katie.models.Context; 4 | import com.wyona.katie.models.QnA; 5 | 6 | import java.net.URI; 7 | 8 | /** 9 | * Get QnAs from a web page, e.g. "https://www.myright.ch/en/legal-tips/corona-private/covid-certificatetrequirement" or "https://cwiki.apache.org/confluence/display/LUCENE/LuceneFAQ" 10 | */ 11 | public interface QnAsFromWebpageService { 12 | 13 | /** 14 | * @param url URL of web page containing QnAs, e.g. "https://cwiki.apache.org/confluence/display/LUCENE/LuceneFAQ" 15 | * @param domain Domain the extracted QnAs will be associated with 16 | * @return QnAs 17 | */ 18 | public QnA[] getQnAs(URI url, Context domain); 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/msteams/MicrosoftTeam.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.msteams; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | /** 6 | * 7 | */ 8 | @Slf4j 9 | public class MicrosoftTeam { 10 | 11 | private String id; 12 | 13 | // INFO: Default constructor is necessary, because otherwise a 400 is generated when using @RequestBody (see https://stackoverflow.com/questions/27006158/error-400-spring-json-requestbody-when-doing-post) 14 | /** 15 | * 16 | */ 17 | public MicrosoftTeam() { 18 | } 19 | 20 | /** 21 | * 22 | */ 23 | public void setId(String id) { 24 | this.id = id; 25 | } 26 | 27 | /** 28 | * 29 | */ 30 | public String getId() { 31 | return id; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/resources/templates/answer-to-question_email_en.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Katie's answer to your question

4 | 5 |

6 | Your question: ${question} 7 |

8 | 9 | <#if answer_is_encrypted == 'true'> 10 | Answer is client side encrypted. Please use the following link to decrypt answer 11 | 12 |

13 | ${answer_link} 14 |

15 | <#else> 16 |

Answer:

17 | 18 |
19 | ${answer} 20 |
21 | 22 |

23 | You can rate Katie's answer at:

24 | ${answer_link} 25 |

26 | 27 | 28 |

29 | Thank you for using Katie! 30 |

31 | 32 | 33 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/PushNotificationResponse.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | public class PushNotificationResponse { 4 | 5 | private int status; 6 | private String message; 7 | 8 | public PushNotificationResponse() { 9 | } 10 | 11 | public PushNotificationResponse(int status, String message) { 12 | this.status = status; 13 | this.message = message; 14 | } 15 | 16 | public int getStatus() { 17 | return status; 18 | } 19 | 20 | public void setStatus(int status) { 21 | this.status = status; 22 | } 23 | 24 | public String getMessage() { 25 | return message; 26 | } 27 | 28 | public void setMessage(String message) { 29 | this.message = message; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/msteams/MicrosoftTenant.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.msteams; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | /** 6 | * 7 | */ 8 | @Slf4j 9 | public class MicrosoftTenant { 10 | 11 | private String id; 12 | 13 | // INFO: Default constructor is necessary, because otherwise a 400 is generated when using @RequestBody (see https://stackoverflow.com/questions/27006158/error-400-spring-json-requestbody-when-doing-post) 14 | /** 15 | * 16 | */ 17 | public MicrosoftTenant() { 18 | } 19 | 20 | /** 21 | * 22 | */ 23 | public void setId(String id) { 24 | this.id = id; 25 | } 26 | 27 | /** 28 | * 29 | */ 30 | public String getId() { 31 | return id; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/msteams/MicrosoftChannel.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models.msteams; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | 5 | /** 6 | * 7 | */ 8 | @Slf4j 9 | public class MicrosoftChannel { 10 | 11 | private String id; 12 | 13 | // INFO: Default constructor is necessary, because otherwise a 400 is generated when using @RequestBody (see https://stackoverflow.com/questions/27006158/error-400-spring-json-requestbody-when-doing-post) 14 | /** 15 | * 16 | */ 17 | public MicrosoftChannel() { 18 | } 19 | 20 | /** 21 | * 22 | */ 23 | public void setId(String id) { 24 | this.id = id; 25 | } 26 | 27 | /** 28 | * 29 | */ 30 | public String getId() { 31 | return id; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/hr/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.10.1 (2021-11-03) 8 | */ 9 | !function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("hr",function(n){var o,t;function e(){return t.execCommand("InsertHorizontalRule")}(o=n).addCommand("InsertHorizontalRule",function(){o.execCommand("mceInsertContent",!1,"
")}),(t=n).ui.registry.addButton("hr",{icon:"horizontal-rule",tooltip:"Horizontal line",onAction:e}),t.ui.registry.addMenuItem("hr",{icon:"horizontal-rule",text:"Horizontal line",onAction:e})})}(); -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/78cd8644-d3b9-451d-9ff5-d8af14f2d997/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Is my data safe with Katie? 4 | Your data stored with Katie is encrypted during transfer from your device. You can even use client-side encryption when providing answers. Client-side encryption ensures that data that are stored in the cloud can only be viewed on the client side of the exchange. Also Katie can be installed on computers on the premises of your organization. 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tinymce", 3 | "version": "5.10.1", 4 | "repository": { 5 | "type": "git", 6 | "url": "https://github.com/tinymce/tinymce.git", 7 | "directory": "modules/tinymce" 8 | }, 9 | "description": "Web based JavaScript HTML WYSIWYG editor control.", 10 | "author": "Tiny Technologies, Inc", 11 | "main": "tinymce.js", 12 | "types": "tinymce.d.ts", 13 | "license": "LGPL-2.1", 14 | "keywords": [ 15 | "wysiwyg", 16 | "tinymce", 17 | "richtext", 18 | "javascript", 19 | "html", 20 | "text", 21 | "rich editor", 22 | "rich text editor", 23 | "rte", 24 | "rich text", 25 | "contenteditable", 26 | "editing" 27 | ], 28 | "homepage": "https://www.tiny.cloud/", 29 | "bugs": { 30 | "url": "https://github.com/tinymce/tinymce/issues" 31 | } 32 | } -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/36277e09-62d9-4549-a649-b08bed5841df/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | What is an Expert? 4 | An Expert is a person which gets notified when a user asked a question and the answer by Katie was not helpful. The Expert will try to answer the question and send it to the user. Katie will learn this answer, such that when somebody will be asking the same question again in the future, Katie will be able to provide a helpful answer. 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/config/SpringAIChatClientsConfig.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.config; 2 | 3 | import org.springframework.ai.chat.client.ChatClient; 4 | import org.springframework.ai.chat.model.ChatModel; 5 | import org.springframework.beans.factory.annotation.Qualifier; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.Configuration; 8 | 9 | @Configuration 10 | public class SpringAIChatClientsConfig { 11 | 12 | @Bean 13 | ChatClient ollamaChatClient(@Qualifier("ollamaChatModel")ChatModel model) { 14 | return ChatClient.builder(model).build(); 15 | } 16 | 17 | @Bean 18 | ChatClient azureChatClient(@Qualifier("azureOpenAiChatModel")ChatModel model) { 19 | return ChatClient.builder(model).build(); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/models/ChosenSuggestion.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.models; 2 | 3 | /** 4 | * 5 | */ 6 | public class ChosenSuggestion { 7 | 8 | private String index; 9 | private String type; 10 | 11 | /** 12 | * @param index Index / Id of chosen suggestion, e.g. 0 13 | */ 14 | public void setIndex(String index) { 15 | this.index = index; 16 | } 17 | 18 | /** 19 | * 20 | */ 21 | public String getIndex() { 22 | return index; 23 | } 24 | 25 | /** 26 | * @param type Type of chosen suggestion, e.g. "starter" 27 | */ 28 | public void setType(String type) { 29 | this.type = type; 30 | } 31 | 32 | /** 33 | * 34 | */ 35 | public String getType() { 36 | return type; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/b0d23ef0-1e6a-4687-ac06-96f71eb13e5f/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | How old is Michael Wechner? 4 | 5 | Michael Wechner is currently 6 | 7 | 8 | 9 | 10 | 11 | 12 | com.wyona.katie.answers.DateOfBirth#getAgeByPersonName(ak-entity:person_name) 13 | years old. 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/handlers/ReRankProvider.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.handlers; 2 | 3 | import com.wyona.katie.models.Context; 4 | 5 | /** 6 | * Re-rank provider, e.g. SentenceBERT, Cohere, ... 7 | */ 8 | public interface ReRankProvider { 9 | 10 | /** 11 | * Re-rank answers 12 | * @param question Question, e.g. "How old is Michael?" 13 | * @param answers Array of answers, e.g. ["Michael lives in Switzerland", "Michael is 53 years old", "Michael was born 1969"] 14 | * @param limit Limit of returned re-ranked answers 15 | * @param domain Katie domain associated with search 16 | * @return index array of re-ranked answers, e.g. [1, 2, 0] 17 | */ 18 | public Integer[] getReRankedAnswers(String question, String[] answers, int limit, Context domain) throws Exception; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/resources/templates/answer-to-question_email_de.ftl: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Katies Antwort auf Ihre Frage

4 | 5 |

6 | Ihre Frage: ${question} 7 |

8 | 9 | <#if answer_is_encrypted == 'true'> 10 | Antwort ist clientseitig verschlüsselt. Bitte verwenden Sie den folgenden Link, um die Antwort zu entschlüsseln 11 | 12 |

13 | ${answer_link} 14 |

15 | <#else> 16 |

Antwort:

17 | 18 |
19 | ${answer} 20 |
21 | 22 |

23 | Sie können Katies Antwort bewerten unter:

24 | ${answer_link} 25 |

26 | 27 | 28 |

29 | Danke für die Verwendung von Katie! 30 |

31 | 32 | 33 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/icon/lock_icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | icon/lock_icon 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/9eaf4cd0-781c-4dea-9aa2-0f794863cffe/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | How can I add Katie to MS Teams? 4 | 5 |

6 | Please see 7 | 8 | 9 | 10 | 11 | 12 | 13 | https://app.katie.qa/ms-teams.html 14 |

15 |
16 | 17 | 18 |
19 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/eye_icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | eye_icon 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/skins/ui/oxide/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | */ 7 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 8 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/skins/ui/oxide-dark/skin.shadowdom.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | */ 7 | body.tox-dialog__disable-scroll{overflow:hidden}.tox-fullscreen{border:0;height:100%;margin:0;overflow:hidden;-ms-scroll-chaining:none;overscroll-behavior:none;padding:0;touch-action:pinch-zoom;width:100%}.tox.tox-tinymce.tox-fullscreen .tox-statusbar__resize-handle{display:none}.tox-shadowhost.tox-fullscreen,.tox.tox-tinymce.tox-fullscreen{left:0;position:fixed;top:0;z-index:1200}.tox.tox-tinymce.tox-fullscreen{background-color:transparent}.tox-fullscreen .tox.tox-tinymce-aux,.tox-fullscreen~.tox.tox-tinymce-aux{z-index:1201} 8 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/handlers/DoNotAnalyzeNERImpl.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.handlers; 2 | 3 | import com.wyona.katie.models.Sentence; 4 | import com.wyona.katie.models.Entity; 5 | 6 | import java.util.ArrayList; 7 | import java.util.List; 8 | 9 | import org.springframework.stereotype.Component; 10 | 11 | import lombok.extern.slf4j.Slf4j; 12 | 13 | /** 14 | * 15 | */ 16 | @Slf4j 17 | @Component 18 | public class DoNotAnalyzeNERImpl implements NERHandler { 19 | 20 | /** 21 | * @see NERHandler#analyze(String, List) 22 | */ 23 | public Sentence analyze(String text, List classifications) { 24 | log.info("Do not analyze sentence '" + text + "'"); 25 | 26 | ArrayList entities = new ArrayList(); 27 | 28 | return new Sentence(text, entities, classifications); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/webapp/tinymce/plugins/print/plugin.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Tiny Technologies, Inc. All rights reserved. 3 | * Licensed under the LGPL or a commercial license. 4 | * For LGPL see License.txt in the project root for license information. 5 | * For commercial licenses see https://www.tiny.cloud/ 6 | * 7 | * Version: 5.10.1 (2021-11-03) 8 | */ 9 | !function(){"use strict";var n=tinymce.util.Tools.resolve("tinymce.PluginManager"),r=tinymce.util.Tools.resolve("tinymce.Env");n.add("print",function(n){var t,i;function e(){return i.execCommand("mcePrint")}(t=n).addCommand("mcePrint",function(){r.browser.isIE()?t.getDoc().execCommand("print",!1,null):t.getWin().print()}),(i=n).ui.registry.addButton("print",{icon:"print",tooltip:"Print",onAction:e}),i.ui.registry.addMenuItem("print",{text:"Print...",icon:"print",onAction:e}),n.addShortcut("Meta+P","","mcePrint")})}(); -------------------------------------------------------------------------------- /volume/config/jwt/README.md: -------------------------------------------------------------------------------- 1 | # Private and public keys to generate JWTs 2 | 3 | TODO: Regenerate key pair on a regular basis, whereas either invalidate tokens or keep previous public key to validate previously generated tokens 4 | 5 | The private key "private_key_pkcs8.pem" is stored in a Base64 encoded PEM format (see https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail) 6 | 7 | Generate private and public keys https://gist.github.com/destan/b708d11bd4f403506d6d5bb5fe6a82c5 8 | 9 | - openssl genrsa -out private_key.pem 512 10 | - #openssl genrsa -out private_key.pem 4096 11 | - openssl rsa -pubout -in private_key.pem -out public_key.pem 12 | - openssl pkcs8 -topk8 -in private_key.pem -inform pem -out private_key_pkcs8.pem -outform pem -nocrypt 13 | 14 | and add them (private_key.pem, private_key_pkcs8.pem, public_key.pem) to the directory ```volume/config/jwt``` 15 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/2d039616-12a8-4b82-a439-a389eaed18a9/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | How can I add Katie to my Slack Workspace/Channel? 4 | 5 |

6 | See the instructions at 7 | 8 | 9 | 10 | 11 | 12 | 13 | https://app.katie.qa/slack.html 14 |

15 |
16 | 17 | 18 |
19 | -------------------------------------------------------------------------------- /src/main/webapp/assets/img/globe_icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | icons/ globe_icon 5 | Created with Sketch. 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/49d445a9-3000-427a-9f66-4cbcb022faa6/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Wie kann ich Katie zu meinem Slack Workspace / Channel hinzufügen? 4 | 5 |

6 | Siehe die Anleitung unter 7 | 8 | 9 | 10 | 11 | 12 | 13 | https://app.katie.qa/slack.html 14 |

15 |
16 | 17 | 18 |
19 | -------------------------------------------------------------------------------- /src/main/java/com/wyona/katie/services/AnswerFromTextServiceMockImpl.java: -------------------------------------------------------------------------------- 1 | package com.wyona.katie.services; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.stereotype.Component; 5 | 6 | /** 7 | * Mock implementation to return answer from text 8 | */ 9 | @Slf4j 10 | @Component 11 | public class AnswerFromTextServiceMockImpl implements AnswerFromTextService { 12 | 13 | private final static int MAX_LENGTH = 100; 14 | 15 | /** 16 | * @see AnswerFromTextService#getAnswerFromText(String, String) 17 | */ 18 | public String getAnswerFromText(String question, String text) { 19 | log.info("Get answer from text using Mock implementation ..."); 20 | if (text.length() > MAX_LENGTH) { 21 | return text.substring(0, MAX_LENGTH) + " ..."; 22 | } else { 23 | return text; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/d34e0f3c-ca27-4a54-b22d-ac8bc22d1b6b/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | How can I install Katie on-premises? 4 | 5 |

6 | Please see 7 | 8 | 9 | 10 | 11 | 12 | 13 | https://github.com/wyona/katie-backend/tree/main#quickstart 14 |

15 |
16 | 17 | 18 |
19 | -------------------------------------------------------------------------------- /src/main/webapp/assets/font-awesome-4.6.1/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /src/main/webapp/read-answer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | Redirect ... 4 | 5 | 20 | 21 | 22 | Redirect to Katie ... 23 | 24 | 25 | -------------------------------------------------------------------------------- /volume/models/features.json: -------------------------------------------------------------------------------- 1 | { 2 | "version":"1.0.0", 3 | "features":{ 4 | "f_BIRTHDATE":1, 5 | "f_BIRTHPLACE":2, 6 | "f_MICHAEL":3, 7 | "f_EZRA":4, 8 | "f_RENOVATION":5, 9 | "f_RENT_REDUCTION":6, 10 | "f_WEAVIATE_MULTI_TENANCY":7, 11 | "f_WEAVIATE_SHARDS":8, 12 | "f_DISTRICT_HEATING":9, 13 | "f_OFFER":10, 14 | "f_DIGITAL_STORAGE_LOCATION":11, 15 | "f_ENERGIEVERBUND_TIEFENBRUNNEN":12, 16 | "f_WEAVIATE_BATCH_QUERY":13, 17 | "f_WEAVIATE_STORAGE_IMPLEMENTATION":14, 18 | "f_WEAVIATE_EMBEDDINGS_PER_DOCUMENT":15, 19 | "f_OIL_HEATING":16, 20 | "f_BROKEN":17, 21 | "f_IMPROVE_EFFICIENCY":18, 22 | "f_LOGIN":19, 23 | "f_SPAM":20, 24 | "f_MSG_FROM_MICHAEL":21, 25 | "f_MEETING_DATE":22, 26 | "f_PERSON":23, 27 | "f_LOCATION":24, 28 | "f_LEVI":25, 29 | "f_VANYA":26, 30 | "f_RELEASE_DATE":27, 31 | "f_UZH_NEW_PASSWORD_IDENTITY_MANAGER":28 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /volume/contexts/ROOT/questions-answers/597178eb-112a-40c0-893d-b643a4f08447/qa.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | How can I setup my FAQ page with Katie? 4 | 5 |

You currently have the following possibilities

6 |
    7 |
  • Run "Katie4FAQ" on-premises using Docker
  • 8 |
  • The repository https://github.com/wyona/katie-4-faq contains various Open Source clients to integrate your FAQ managed by Katie into your website.
  • 9 |
  • Setup a subdomain at Katie cloud
  • 10 |
11 |
12 | 13 | 14 |
15 | --------------------------------------------------------------------------------