diff --git a/pr-previews/pr-707/404.html b/pr-previews/pr-707/404.html index c8603914..6462dd4a 100644 --- a/pr-previews/pr-707/404.html +++ b/pr-previews/pr-707/404.html @@ -54,4 +54,4 @@ > window.___chunkMapping="{\"app\":[\"/app-f6f8e6b1f95071f3d885.js\"],\"component---src-pages-404-js\":[\"/component---src-pages-404-js-1c97c66d7998fb40d048.js\"],\"component---src-pages-blogs-js\":[\"/component---src-pages-blogs-js-d636a26158aeeb9701fa.js\"],\"component---src-pages-docs-js\":[\"/component---src-pages-docs-js-52ba16cfe819f11145bf.js\"],\"component---src-pages-index-js\":[\"/component---src-pages-index-js-9ea45e881103930fe8f6.js\"],\"component---src-pages-releases-js\":[\"/component---src-pages-releases-js-6b63209b257eb5d7ffe8.js\"],\"component---src-pages-resources-js\":[\"/component---src-pages-resources-js-58532c16436f03988114.js\"],\"component---src-pages-support-js\":[\"/component---src-pages-support-js-9bd01f77ce82eb582405.js\"],\"component---src-pages-theia-platform-js\":[\"/component---src-pages-theia-platform-js-9c24155b7fcbb10dfc08.js\"],\"component---src-templates-doc-js\":[\"/component---src-templates-doc-js-0f91607553d4c7973801.js\"]}"; - \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/404/index.html b/pr-previews/pr-707/404/index.html index 4e898472..6ad0450c 100644 --- a/pr-previews/pr-707/404/index.html +++ b/pr-previews/pr-707/404/index.html @@ -54,4 +54,4 @@ > window.___chunkMapping="{\"app\":[\"/app-f6f8e6b1f95071f3d885.js\"],\"component---src-pages-404-js\":[\"/component---src-pages-404-js-1c97c66d7998fb40d048.js\"],\"component---src-pages-blogs-js\":[\"/component---src-pages-blogs-js-d636a26158aeeb9701fa.js\"],\"component---src-pages-docs-js\":[\"/component---src-pages-docs-js-52ba16cfe819f11145bf.js\"],\"component---src-pages-index-js\":[\"/component---src-pages-index-js-9ea45e881103930fe8f6.js\"],\"component---src-pages-releases-js\":[\"/component---src-pages-releases-js-6b63209b257eb5d7ffe8.js\"],\"component---src-pages-resources-js\":[\"/component---src-pages-resources-js-58532c16436f03988114.js\"],\"component---src-pages-support-js\":[\"/component---src-pages-support-js-9bd01f77ce82eb582405.js\"],\"component---src-pages-theia-platform-js\":[\"/component---src-pages-theia-platform-js-9c24155b7fcbb10dfc08.js\"],\"component---src-templates-doc-js\":[\"/component---src-templates-doc-js-0f91607553d4c7973801.js\"]}"; - \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/8c9522e9ab04d805c32ce56d0725aa8a5b32377d-0e9abe4a67505418fd25.js b/pr-previews/pr-707/8c9522e9ab04d805c32ce56d0725aa8a5b32377d-0e9abe4a67505418fd25.js new file mode 100644 index 00000000..5e8c3cf2 --- /dev/null +++ b/pr-previews/pr-707/8c9522e9ab04d805c32ce56d0725aa8a5b32377d-0e9abe4a67505418fd25.js @@ -0,0 +1,2 @@ +"use strict";(self.webpackChunkTheia_Website=self.webpackChunkTheia_Website||[]).push([[205],{3451:function(e,i,t){t.d(i,{s:function(){return a},v:function(){return o}});const n=function(e,i,t,n){return void 0===n&&(n=!1),{title:e,path:"/docs/"+(i?i+"/":""),subMenu:t,indented:n}},a=[{title:"Overview"},n("Getting Started",""),n("Project Goals","project_goals"),{title:"Using the Theia IDE"},n("Getting Started","user_getting_started"),n("Installing VS Code Extensions","user_install_vscode_extensions"),n("Using AI Features","user_ai"),n("Theia Coder (AI assistant)","theia_coder"),n("Using the dynamic Toolbar","user_toolbar"),n("Download","blueprint_download"),{title:"Adopting the Theia Platform"},n("Build your own IDE/Tool","composing_applications"),n("Extending the Theia IDE","blueprint_documentation"),n("Extensions and Plugins","extensions"),n("Authoring Theia Extensions","authoring_extensions"),n("Authoring VS Code Extensions","authoring_vscode_extensions"),n("Consuming Theia fixes without upgrading","consume_theia_fixes_master"),{title:"Platform Concepts & APIs"},n("Services and Contributions","services_and_contributions"),n("Architecture Overview","architecture"),n("Commands/Menus/Keybindings","commands_keybindings"),n("Widgets","widgets"),n("Preferences","preferences"),n("Theia AI","theia_ai"),n("Label Provider","label_provider"),n("Message Service","message_service"),n("Property View","property_view"),n("Events","events"),n("Frontend Application Contributions","frontend_application_contribution"),n("Backend Application Contributions","backend_application_contribution"),n("Communication via JSON-RPC","json_rpc"),n("Tasks","tasks"),n("Internationalization","i18n"),n("Language Support","language_support"),n("Dynamic Toolbar","toolbar"),n("Breadcrumbs","breadcrumbs"),n("Enhanced Tab Bar Preview","enhanced_tab_bar_preview"),n("Contribution Filter","contribution_filter"),n("Advanced Tips","tips")];function o(e,i,t){void 0===i&&(i=a),void 0===t&&(t={});const n=i.findIndex((i=>{let{path:t}=i;return!!t&&t.includes(e)}));return{prev:i[n-1]&&i[n-1].path?i[n-1].path:i[n-2]&&i[n-2].path&&i[n-2].path,prevTitle:i[n-1]&&i[n-1].path?i[n-1].title:i[n-2]&&i[n-2].path&&i[n-2].title,next:i[n+1]&&i[n+1].path?i[n+1].path:i[n+2]&&i[n+2].path&&i[n+2].path,nextTitle:i[n+1]&&i[n+1].path?i[n+1].title:i[n+2]&&i[n+2].path&&i[n+2].title}}},9140:function(e,i,t){t.d(i,{A:function(){return y}});var n=t(644),a=(t(6540),t(8660)),o=t(1919),r=t(4810),s=t(7361),l=t(4572),d=t(3451),m=t(7437);const c=(0,n.A)("div",{target:"e17llkhu0"})("width:30%;min-height:100vh;min-width:25rem;border-right:10px solid #f8f8f8;background-image:url(",s.A,");background-size:cover;background-position:center;background-repeat:no-repeat;.container{position:relative;min-height:100vh;min-width:25rem;padding:10rem 0;background-image:url(",s.A,"),linear-gradient(#fff, #fff);background-size:cover;background-position:center;background-repeat:no-repeat;}@media(max-width: ",o.fi.xmd,"){display:none;}.logo{display:block;height:2.8rem;margin:0 auto 13rem auto;}.links{display:flex;flex-direction:column;justify-content:center;list-style:none;min-width:21rem;width:50%;margin:0 auto;}ul{list-style:none;}li{text-align:left;&:not(:last-of-type){margin-bottom:.7rem;}}a{text-decoration:none;color:inherit;transition:all .2s;&:hover,&:focus{color:",o.Tj.blue,";padding:.2rem 0 .4rem;border-bottom:1px dashed #9dc7d9;}}.caption{font-family:'Anonymous Pro',sans-serif;font-weight:bold;text-transform:uppercase;&:not(:first-of-type){margin-top:3rem;}}.active{color:",o.Tj.blue,";padding:.2rem 0 .4rem;border-bottom:1px dashed #9dc7d9;}");var g=()=>(0,m.Y)(c,null,(0,m.Y)("div",{className:"container"},(0,m.Y)(r.N_,{to:"/"},(0,m.Y)("img",{className:"logo",src:l.A,alt:"theia logo"})),(0,m.Y)("ul",{className:"links"},d.s.map(((e,i)=>(0,m.Y)("li",{key:`${e.title}+${i}`,className:e.path?"":"caption",style:e.indented?{marginLeft:"3rem",marginTop:"1rem",listStyle:"circle",listStylePosition:"inside"}:{}},e.path?(0,m.Y)(r.N_,{to:e.path,activeClassName:"active"},e.title):e.title))))));const p=(0,n.A)("div",{target:"ewv6paa0"})("position:absolute;top:4rem;left:50%;transform:translate(-50%, -2rem);z-index:100;@media(max-width: 360px){top:9rem;}@media(min-width: ",o.fi.xmd,"){display:none;}select{font:inherit;color:inherit;padding:1rem 1.5rem;background:#fff;border:1px solid #ddd;-moz-appearance:none;-webkit-appearance:none;appearance:none;background-image:url(","data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBpZD0iQ2FwYV8xIiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgeD0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjU1IDI1NSIgeT0iMCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMjU1IDI1NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PGxpbmsgaWQ9ImRhcmstbW9kZSIgY2xhc3M9ImFjdGl2ZS1wYXRoIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIi8+PHN0eWxlIGlkPSJkYXJrLW1vZGUtY3VzdG9tLXN0eWxlIiBjbGFzcz0iYWN0aXZlLXBhdGgiIHR5cGU9InRleHQvY3NzIi8+PGc+PGcgaWQ9ImFycm93LWRyb3AtZG93biI+PHBvbHlnb24gZmlsbD0iIzM4MzgzOCIgcG9pbnRzPSIwIDYzLjc1IDEyNy41IDE5MS4yNSAyNTUgNjMuNzUiIGNsYXNzPSJhY3RpdmUtcGF0aCIgZGF0YS1vcmlnaW5hbD0iIzAwMDAwMCIvPjwvZz48L2c+PC9nPjwvc3ZnPg==","),linear-gradient(to bottom, #ffffff 0%,#e5e5e5 100%);background-repeat:no-repeat,repeat;background-position:right .7em top 50%,0 0;background-size:.65em auto,100%;}option{&:disabled{font-family:'Anonymous Pro',monospace;color:inherit;}}"),u=e=>{(0,r.oo)(e.currentTarget.value)};var h=()=>(0,m.Y)(p,null,(0,m.Y)("select",{onChange:u,defaultValue:"Select A Topic"},(0,m.Y)("option",{value:"#",selected:!0},"Select A Topic"),d.s.map(((e,i)=>(0,m.Y)("option",{key:i,value:e.path,disabled:!e.path},e.title))))),b=t(7518),I=t(9620),v="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1OS40MTQgNTkuNDE0IiBpZD0iQ2FwYV8xIiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgeD0iMCIgeT0iMCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNTkuNDE0IDU5LjQxNCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PGxpbmsgaWQ9ImRhcmstbW9kZSIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIvPjxzdHlsZSBpZD0iZGFyay1tb2RlLWN1c3RvbS1zdHlsZSIgdHlwZT0idGV4dC9jc3MiLz48Zz48cG9seWdvbiBmaWxsPSIjMzgzODM4IiBwb2ludHM9IjI5LjcwNyA0NS4yNjggMCAxNS41NjEgMS40MTQgMTQuMTQ2IDI5LjcwNyA0Mi40MzkgNTggMTQuMTQ2IDU5LjQxNCAxNS41NjEiIGNsYXNzPSJhY3RpdmUtcGF0aCIgZGF0YS1vbGRfY29sb3I9IiM0OEEwREMiIGRhdGEtb3JpZ2luYWw9IiM0OEEwREMiLz48L2c+PC9nPjwvc3ZnPg==";const f=(0,n.A)("div",{target:"ex5dzuf0"})({name:"3ufj4z",styles:"display:flex;justify-content:space-between;margin-top:10rem;.arrow{display:inline-block;height:6rem;&--left{transform:rotate(90deg);}&--right{transform:rotate(270deg);}}"});var w=e=>{let{prev:i,next:t,prevTitle:n,nextTitle:a}=e;const o="Go to previous Page "+(n?`: ${n}`:""),s="Go to next page "+(a?`: ${a}`:"");return(0,m.Y)(f,null,(0,m.Y)(r.N_,{to:i,title:o,"aria-label":o,style:{pointerEvents:!i&&"none"}},(0,m.Y)("img",{src:v,alt:o,className:"arrow arrow--left",style:{opacity:i?1:".3"}})),(0,m.Y)(r.N_,{to:t,title:s,"aria-label":s,style:{pointerEvents:!t&&"none"}},(0,m.Y)("img",{src:v,alt:s,className:"arrow arrow--right",style:{opacity:t?1:".3"}})))};const x=(0,n.A)("div",{target:"e1mh6m3o0"})("display:flex;.main{position:relative;overflow-x:hidden;@media(max-width: ",o.fi.xmd,"){padding:15rem 3rem;}@media(min-width: ",o.fi.xmd,"){width:70%;}@media(max-width: ",o.fi.xmd,"){min-width:100vw;}}.docs-row{width:85%;max-width:100rem;margin:0 auto;padding-bottom:10rem;@media(max-width: ",o.fi.sm,"){width:100%;}@media(min-width: ",o.fi.sm,"){min-height:90rem;}}h1{margin-bottom:3rem;}h2{margin:2.5rem 0;font-size:2.6rem;}p{margin:1rem 0;}ul{margin-bottom:3rem;list-style-position:inside;ul{margin-left:3rem;margin-bottom:0;}}ol{margin-bottom:3rem;list-style-position:inside;ol{margin-left:3rem;margin-bottom:0;}}li{margin-top:.8rem;}li>p{display:inline;}code,pre{max-width:100%;}.doc-image{width:100%;margin:2rem 0;margin-right:auto;box-shadow:0 1.5rem 3rem rgba(0,0,0, .25);}");var y=e=>{let{children:i,canonical:t,context:n}=e;return(0,m.Y)(a.A,{canonical:t},(0,m.Y)(x,null,(0,m.Y)(g,null),(0,m.Y)(h,null),(0,m.Y)("div",{className:"main"},(0,m.Y)("div",null,(0,m.Y)("div",{className:"docs-row"},(0,m.Y)(b.A,null),i,(0,m.Y)(w,n)),(0,m.Y)(I.A,null)))))}}}]); +//# sourceMappingURL=8c9522e9ab04d805c32ce56d0725aa8a5b32377d-0e9abe4a67505418fd25.js.map \ No newline at end of file diff --git a/pr-previews/pr-707/8c9522e9ab04d805c32ce56d0725aa8a5b32377d-0e9abe4a67505418fd25.js.map b/pr-previews/pr-707/8c9522e9ab04d805c32ce56d0725aa8a5b32377d-0e9abe4a67505418fd25.js.map new file mode 100644 index 00000000..86ebfe67 --- /dev/null +++ b/pr-previews/pr-707/8c9522e9ab04d805c32ce56d0725aa8a5b32377d-0e9abe4a67505418fd25.js.map @@ -0,0 +1 @@ +{"version":3,"file":"8c9522e9ab04d805c32ce56d0725aa8a5b32377d-0e9abe4a67505418fd25.js","mappings":"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","sources":["webpack://Theia-Website/./src/docs/menu.js","webpack://Theia-Website/./src/components/DocSideBar.js","webpack://Theia-Website/./src/components/DocTopicChooser.js","webpack://Theia-Website/./src/resources/drop-down-arrow.svg","webpack://Theia-Website/./src/resources/arrow.svg","webpack://Theia-Website/./src/components/DocArrowNavigators.js","webpack://Theia-Website/./src/layouts/docs-layout.js"],"sourcesContent":["/********************************************************************************\n * Copyright (C) 2020 TypeFox and others.\n *\n * This program and the accompanying materials are made available under the\n * terms of the Eclipse Public License v. 2.0 which is available at\n * http://www.eclipse.org/legal/epl-2.0.\n *\n * This Source Code may also be made available under the following Secondary\n * Licenses when the conditions for such availability set forth in the Eclipse\n * Public License v. 2.0 are satisfied: GNU General Public License, version 2\n * with the GNU Classpath Exception which is available at\n * https://www.gnu.org/software/classpath/license.html.\n *\n * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0\n ********************************************************************************/\n\nconst M = (title, path, subMenu, indented = false) => ({\n title,\n path: '/docs/' + (path ? path + '/' : ''),\n subMenu,\n indented\n})\n\nexport const MENU = [\n {\n title: 'Overview'\n },\n M(\n 'Getting Started',\n ''\n ),\n M(\n 'Project Goals',\n 'project_goals'\n ),\n {\n title: 'Using the Theia IDE'\n },\n M(\n 'Getting Started',\n 'user_getting_started'\n ),\n M(\n 'Installing VS Code Extensions',\n 'user_install_vscode_extensions'\n ),\n M(\n 'Using AI Features',\n 'user_ai'\n ),\n M(\n 'Theia Coder (AI assistant)',\n 'theia_coder'\n ),\n M(\n 'Using the dynamic Toolbar',\n 'user_toolbar'\n ),\n M(\n 'Download',\n 'blueprint_download'\n ),\n {\n title: 'Adopting the Theia Platform'\n },\n M(\n 'Build your own IDE/Tool',\n 'composing_applications'\n ),\n M(\n 'Extending the Theia IDE',\n 'blueprint_documentation'\n ),\n M(\n 'Extensions and Plugins',\n 'extensions'\n ),\n M(\n 'Authoring Theia Extensions',\n 'authoring_extensions'\n ),\n M(\n 'Authoring VS Code Extensions',\n 'authoring_vscode_extensions'\n ),\n M(\n 'Consuming Theia fixes without upgrading',\n 'consume_theia_fixes_master'\n ),\n {\n title: 'Platform Concepts & APIs'\n },\n M(\n 'Services and Contributions',\n 'services_and_contributions'\n ),\n M(\n 'Architecture Overview',\n 'architecture'\n ),\n M(\n 'Commands/Menus/Keybindings',\n 'commands_keybindings'\n ),\n M(\n 'Widgets',\n 'widgets'\n ),\n M(\n 'Preferences',\n 'preferences'\n ),\n M(\n 'Theia AI',\n 'theia_ai'\n ),\n M(\n 'Label Provider',\n 'label_provider'\n ),\n M(\n 'Message Service',\n 'message_service'\n ),\n M(\n 'Property View',\n 'property_view'\n ),\n M(\n 'Events',\n 'events'\n ),\n M(\n 'Frontend Application Contributions',\n 'frontend_application_contribution'\n ),\n M(\n 'Backend Application Contributions',\n 'backend_application_contribution'\n ),\n M(\n 'Communication via JSON-RPC',\n 'json_rpc'\n ),\n M(\n 'Tasks',\n 'tasks'\n ),\n M(\n 'Internationalization',\n 'i18n'\n ),\n M(\n 'Language Support',\n 'language_support'\n ),\n M(\n 'Dynamic Toolbar',\n 'toolbar'\n ),\n M(\n 'Breadcrumbs',\n 'breadcrumbs'\n ),\n M(\n 'Enhanced Tab Bar Preview',\n 'enhanced_tab_bar_preview'\n ),\n M(\n 'Contribution Filter',\n 'contribution_filter'\n ),\n M(\n 'Advanced Tips',\n 'tips'\n )\n]\n\nexport function getMenuContext(slug, menu = MENU, context = {}) {\n const indexOfCurrent = menu.findIndex(({path}) => {\n if (path) {\n return path.includes(slug)\n }\n return false\n })\n const prev = menu[indexOfCurrent - 1] && menu[indexOfCurrent - 1].path ?\n menu[indexOfCurrent - 1].path : menu[indexOfCurrent - 2] &&\n menu[indexOfCurrent - 2].path && menu[indexOfCurrent - 2].path\n\n const prevTitle = menu[indexOfCurrent - 1] && menu[indexOfCurrent - 1].path ?\n menu[indexOfCurrent - 1].title :\n menu[indexOfCurrent - 2] && menu[indexOfCurrent - 2].path &&\n menu[indexOfCurrent - 2].title\n\n const next = menu[indexOfCurrent + 1] && menu[indexOfCurrent + 1].path ?\n menu[indexOfCurrent + 1].path : menu[indexOfCurrent + 2] &&\n menu[indexOfCurrent + 2].path && menu[indexOfCurrent + 2].path\n\n const nextTitle = menu[indexOfCurrent + 1] && menu[indexOfCurrent + 1].path ?\n menu[indexOfCurrent + 1].title :\n menu[indexOfCurrent + 2] && menu[indexOfCurrent + 2].path &&\n menu[indexOfCurrent + 2].title\n\n return {\n prev: prev,\n prevTitle,\n next: next,\n nextTitle\n }\n}\n","/********************************************************************************\n * Copyright (C) 2019 TypeFox and others.\n *\n * This program and the accompanying materials are made available under the\n * terms of the Eclipse Public License v. 2.0 which is available at\n * http://www.eclipse.org/legal/epl-2.0.\n *\n * This Source Code may also be made available under the following Secondary\n * Licenses when the conditions for such availability set forth in the Eclipse\n * Public License v. 2.0 are satisfied: GNU General Public License, version 2\n * with the GNU Classpath Exception which is available at\n * https://www.gnu.org/software/classpath/license.html.\n *\n * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0\n ********************************************************************************/\n\nimport React from 'react'\nimport styled from '@emotion/styled'\nimport { breakpoints, colors } from '../utils/variables'\nimport { Link } from 'gatsby'\nimport Background from '../resources/background-image.png'\nimport TheiaLogoDark from '../resources/theia-logo-dark.svg'\nimport { MENU } from '../docs/menu'\n\nconst Styled = styled.div`\n width: 30%;\n min-height: 100vh;\n min-width: 25rem;\n border-right: 10px solid #f8f8f8;\n background-image: url(${Background});\n background-size: cover;\n background-position: center;\n background-repeat: no-repeat;\n\n .container {\n position: relative;\n min-height: 100vh;\n min-width: 25rem;\n padding: 10rem 0;\n background-image: url(${Background}), linear-gradient(#fff, #fff);\n background-size: cover;\n background-position: center;\n background-repeat: no-repeat;\n }\n\n @media(max-width: ${breakpoints.xmd}) {\n display: none;\n }\n\n .logo {\n display: block;\n height: 2.8rem;\n margin: 0 auto 13rem auto;\n }\n\n .links {\n display: flex;\n flex-direction: column;\n justify-content: center;\n list-style: none;\n min-width: 21rem;\n width: 50%;\n margin: 0 auto;\n }\n\n ul {\n list-style: none;\n }\n\n li {\n text-align: left;\n &:not(:last-of-type) {\n margin-bottom: .7rem;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n transition: all .2s;\n\n &:hover,\n &:focus {\n color: ${colors.blue};\n padding: .2rem 0 .4rem;\n border-bottom: 1px dashed #9dc7d9;\n }\n }\n\n .caption {\n font-family: 'Anonymous Pro', sans-serif;\n font-weight: bold;\n text-transform: uppercase;\n\n &:not(:first-of-type) {\n margin-top: 3rem;\n }\n }\n\n .active {\n color: ${colors.blue};\n padding: .2rem 0 .4rem;\n border-bottom: 1px dashed #9dc7d9;\n }\n`\n\nconst DocSideBar = () => {\n return (\n \n
\n \"theia\n \n
\n
\n )\n}\n\nexport default DocSideBar","/********************************************************************************\n * Copyright (C) 2019 TypeFox and others.\n *\n * This program and the accompanying materials are made available under the\n * terms of the Eclipse Public License v. 2.0 which is available at\n * http://www.eclipse.org/legal/epl-2.0.\n *\n * This Source Code may also be made available under the following Secondary\n * Licenses when the conditions for such availability set forth in the Eclipse\n * Public License v. 2.0 are satisfied: GNU General Public License, version 2\n * with the GNU Classpath Exception which is available at\n * https://www.gnu.org/software/classpath/license.html.\n *\n * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0\n ********************************************************************************/\n\nimport React from 'react'\nimport { navigate } from 'gatsby'\nimport styled from '@emotion/styled'\nimport { breakpoints } from '../utils/variables'\nimport DropDownArrow from '../resources/drop-down-arrow.svg';\nimport { MENU } from '../docs/menu'\n\nconst Styled = styled.div`\n position: absolute;\n top: 4rem;\n left: 50%;\n transform: translate(-50%, -2rem);\n z-index: 100;\n\n @media(max-width: 360px) {\n top: 9rem;\n }\n\n @media(min-width: ${breakpoints.xmd}) {\n display: none;\n }\n\n select {\n font: inherit;\n color: inherit;\n padding: 1rem 1.5rem;\n background: #fff;\n border: 1px solid #ddd;\n -moz-appearance: none;\n -webkit-appearance: none;\n appearance: none;\n background-image: url(${DropDownArrow}),\n linear-gradient(to bottom, #ffffff 0%,#e5e5e5 100%);\n background-repeat: no-repeat, repeat;\n background-position: right .7em top 50%, 0 0;\n background-size: .65em auto, 100%;\n }\n\n option {\n &:disabled {\n font-family: 'Anonymous Pro', monospace;\n color: inherit;\n }\n }\n`\n\nconst onSelectTopic = (e) => {\n navigate(e.currentTarget.value)\n}\n\nconst DocTopicChooser = () => (\n \n \n \n)\n\nexport default DocTopicChooser","export default \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBpZD0iQ2FwYV8xIiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgeD0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjU1IDI1NSIgeT0iMCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMjU1IDI1NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PGxpbmsgaWQ9ImRhcmstbW9kZSIgY2xhc3M9ImFjdGl2ZS1wYXRoIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIi8+PHN0eWxlIGlkPSJkYXJrLW1vZGUtY3VzdG9tLXN0eWxlIiBjbGFzcz0iYWN0aXZlLXBhdGgiIHR5cGU9InRleHQvY3NzIi8+PGc+PGcgaWQ9ImFycm93LWRyb3AtZG93biI+PHBvbHlnb24gZmlsbD0iIzM4MzgzOCIgcG9pbnRzPSIwIDYzLjc1IDEyNy41IDE5MS4yNSAyNTUgNjMuNzUiIGNsYXNzPSJhY3RpdmUtcGF0aCIgZGF0YS1vcmlnaW5hbD0iIzAwMDAwMCIvPjwvZz48L2c+PC9nPjwvc3ZnPg==\"","export default \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1OS40MTQgNTkuNDE0IiBpZD0iQ2FwYV8xIiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgeD0iMCIgeT0iMCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNTkuNDE0IDU5LjQxNCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PGxpbmsgaWQ9ImRhcmstbW9kZSIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIvPjxzdHlsZSBpZD0iZGFyay1tb2RlLWN1c3RvbS1zdHlsZSIgdHlwZT0idGV4dC9jc3MiLz48Zz48cG9seWdvbiBmaWxsPSIjMzgzODM4IiBwb2ludHM9IjI5LjcwNyA0NS4yNjggMCAxNS41NjEgMS40MTQgMTQuMTQ2IDI5LjcwNyA0Mi40MzkgNTggMTQuMTQ2IDU5LjQxNCAxNS41NjEiIGNsYXNzPSJhY3RpdmUtcGF0aCIgZGF0YS1vbGRfY29sb3I9IiM0OEEwREMiIGRhdGEtb3JpZ2luYWw9IiM0OEEwREMiLz48L2c+PC9nPjwvc3ZnPg==\"","/********************************************************************************\n * Copyright (C) 2019 TypeFox and others.\n *\n * This program and the accompanying materials are made available under the\n * terms of the Eclipse Public License v. 2.0 which is available at\n * http://www.eclipse.org/legal/epl-2.0.\n *\n * This Source Code may also be made available under the following Secondary\n * Licenses when the conditions for such availability set forth in the Eclipse\n * Public License v. 2.0 are satisfied: GNU General Public License, version 2\n * with the GNU Classpath Exception which is available at\n * https://www.gnu.org/software/classpath/license.html.\n *\n * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0\n ********************************************************************************/\n\nimport React from 'react'\nimport { Link } from 'gatsby'\nimport styled from '@emotion/styled'\nimport Arrow from '../resources/arrow.svg'\n\nconst Styled = styled.div`\n display: flex;\n justify-content: space-between;\n margin-top: 10rem;\n\n .arrow {\n display: inline-block;\n height: 6rem;\n\n &--left {\n transform: rotate(90deg);\n }\n\n &--right {\n transform: rotate(270deg);\n }\n }\n`\n\nconst DocArrowNavigators = ({prev, next, prevTitle, nextTitle}) => {\n const pTitle = `Go to previous Page ${prevTitle ? `: ${prevTitle}` : \"\"}`\n const nTitle = `Go to next page ${nextTitle ? `: ${nextTitle}` : \"\"}`\n return (\n \n \n {pTitle}\n \n \n {nTitle}\n \n \n)\n}\n\nexport default DocArrowNavigators","/********************************************************************************\n * Copyright (C) 2019 TypeFox and others.\n *\n * This program and the accompanying materials are made available under the\n * terms of the Eclipse Public License v. 2.0 which is available at\n * http://www.eclipse.org/legal/epl-2.0.\n *\n * This Source Code may also be made available under the following Secondary\n * Licenses when the conditions for such availability set forth in the Eclipse\n * Public License v. 2.0 are satisfied: GNU General Public License, version 2\n * with the GNU Classpath Exception which is available at\n * https://www.gnu.org/software/classpath/license.html.\n *\n * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0\n ********************************************************************************/\n\nimport React from 'react'\nimport styled from '@emotion/styled'\nimport Layout from '../layouts/layout'\nimport DocSideBar from '../components/DocSideBar'\nimport DocTopicChooser from '../components/DocTopicChooser'\nimport Nav from '../components/Nav'\nimport Footer from '../components/Footer'\nimport { breakpoints } from '../utils/variables'\nimport DocArrowNavigators from '../components/DocArrowNavigators'\n\nconst DocContainer = styled.div`\n display: flex;\n\n .main {\n position: relative;\n overflow-x: hidden;\n @media(max-width: ${breakpoints.xmd}) {\n padding: 15rem 3rem ;\n }\n\n @media(min-width: ${breakpoints.xmd}) {\n width: 70%;\n }\n\n @media(max-width: ${breakpoints.xmd}) {\n min-width: 100vw;\n }\n }\n\n .docs-row {\n width: 85%;\n max-width: 100rem;\n margin: 0 auto;\n padding-bottom: 10rem;\n\n @media(max-width: ${breakpoints.sm}) {\n width: 100%;\n }\n\n @media(min-width: ${breakpoints.sm}) {\n min-height: 90rem;\n }\n }\n\n h1 {\n margin-bottom: 3rem;\n }\n\n h2 {\n margin: 2.5rem 0;\n font-size: 2.6rem;\n }\n\n p {\n margin: 1rem 0;\n }\n\n ul {\n margin-bottom: 3rem;\n list-style-position: inside;\n\n ul {\n margin-left: 3rem;\n margin-bottom: 0;\n }\n }\n\n ol {\n margin-bottom: 3rem;\n list-style-position: inside;\n\n ol {\n margin-left: 3rem;\n margin-bottom: 0;\n }\n }\n\n li {\n margin-top: .8rem;\n }\n\n li > p {\n display: inline;\n }\n\n code,\n pre {\n max-width: 100%;\n }\n\n .doc-image {\n width: 100%;\n margin: 2rem 0;\n margin-right: auto;\n box-shadow: 0 1.5rem 3rem rgba(0,0,0, .25);\n }\n`\n\nconst DocsLayout = ({children, canonical, context}) => (\n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n)\n\nexport default DocsLayout"],"names":["M","title","path","subMenu","indented","MENU","getMenuContext","slug","menu","context","indexOfCurrent","findIndex","_ref","includes","prev","prevTitle","next","nextTitle","Styled","_styled","target","Background","breakpoints","xmd","colors","blue","DocSideBar","___EmotionJSX","className","Link","to","src","TheiaLogoDark","alt","map","m","i","key","style","marginLeft","marginTop","listStyle","listStylePosition","activeClassName","onSelectTopic","e","navigate","currentTarget","value","DocTopicChooser","onChange","defaultValue","selected","disabled","name","styles","pTitle","nTitle","pointerEvents","Arrow","opacity","DocContainer","sm","children","canonical","Layout","Nav","DocArrowNavigators","Footer"],"sourceRoot":""} \ No newline at end of file diff --git a/pr-previews/pr-707/8c9522e9ab04d805c32ce56d0725aa8a5b32377d-87289377e7c421d5e020.js b/pr-previews/pr-707/8c9522e9ab04d805c32ce56d0725aa8a5b32377d-87289377e7c421d5e020.js deleted file mode 100644 index 7d3dc943..00000000 --- a/pr-previews/pr-707/8c9522e9ab04d805c32ce56d0725aa8a5b32377d-87289377e7c421d5e020.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkTheia_Website=self.webpackChunkTheia_Website||[]).push([[205],{3451:function(e,i,t){t.d(i,{s:function(){return a},v:function(){return o}});const n=function(e,i,t,n){return void 0===n&&(n=!1),{title:e,path:"/docs/"+(i?i+"/":""),subMenu:t,indented:n}},a=[{title:"Overview"},n("Getting Started",""),n("Project Goals","project_goals"),{title:"Using the Theia IDE"},n("Getting Started","user_getting_started"),n("Installing VS Code Extensions","user_install_vscode_extensions"),n("Using AI Features","user_ai"),n("Using the dynamic Toolbar","user_toolbar"),n("Download","blueprint_download"),{title:"Adopting the Theia Platform"},n("Build your own IDE/Tool","composing_applications"),n("Extending the Theia IDE","blueprint_documentation"),n("Extensions and Plugins","extensions"),n("Authoring Theia Extensions","authoring_extensions"),n("Authoring VS Code Extensions","authoring_vscode_extensions"),n("Consuming Theia fixes without upgrading","consume_theia_fixes_master"),{title:"Platform Concepts & APIs"},n("Services and Contributions","services_and_contributions"),n("Architecture Overview","architecture"),n("Commands/Menus/Keybindings","commands_keybindings"),n("Widgets","widgets"),n("Preferences","preferences"),n("Theia AI","theia_ai"),n("Label Provider","label_provider"),n("Message Service","message_service"),n("Property View","property_view"),n("Events","events"),n("Frontend Application Contributions","frontend_application_contribution"),n("Backend Application Contributions","backend_application_contribution"),n("Communication via JSON-RPC","json_rpc"),n("Tasks","tasks"),n("Internationalization","i18n"),n("Language Support","language_support"),n("Dynamic Toolbar","toolbar"),n("Breadcrumbs","breadcrumbs"),n("Enhanced Tab Bar Preview","enhanced_tab_bar_preview"),n("Contribution Filter","contribution_filter"),n("Advanced Tips","tips")];function o(e,i,t){void 0===i&&(i=a),void 0===t&&(t={});const n=i.findIndex((i=>{let{path:t}=i;return!!t&&t.includes(e)}));return{prev:i[n-1]&&i[n-1].path?i[n-1].path:i[n-2]&&i[n-2].path&&i[n-2].path,prevTitle:i[n-1]&&i[n-1].path?i[n-1].title:i[n-2]&&i[n-2].path&&i[n-2].title,next:i[n+1]&&i[n+1].path?i[n+1].path:i[n+2]&&i[n+2].path&&i[n+2].path,nextTitle:i[n+1]&&i[n+1].path?i[n+1].title:i[n+2]&&i[n+2].path&&i[n+2].title}}},9140:function(e,i,t){t.d(i,{A:function(){return y}});var n=t(644),a=(t(6540),t(8660)),o=t(1919),r=t(4810),s=t(7361),l=t(4572),d=t(3451),m=t(7437);const c=(0,n.A)("div",{target:"e17llkhu0"})("width:30%;min-height:100vh;min-width:25rem;border-right:10px solid #f8f8f8;background-image:url(",s.A,");background-size:cover;background-position:center;background-repeat:no-repeat;.container{position:relative;min-height:100vh;min-width:25rem;padding:10rem 0;background-image:url(",s.A,"),linear-gradient(#fff, #fff);background-size:cover;background-position:center;background-repeat:no-repeat;}@media(max-width: ",o.fi.xmd,"){display:none;}.logo{display:block;height:2.8rem;margin:0 auto 13rem auto;}.links{display:flex;flex-direction:column;justify-content:center;list-style:none;min-width:21rem;width:50%;margin:0 auto;}ul{list-style:none;}li{text-align:left;&:not(:last-of-type){margin-bottom:.7rem;}}a{text-decoration:none;color:inherit;transition:all .2s;&:hover,&:focus{color:",o.Tj.blue,";padding:.2rem 0 .4rem;border-bottom:1px dashed #9dc7d9;}}.caption{font-family:'Anonymous Pro',sans-serif;font-weight:bold;text-transform:uppercase;&:not(:first-of-type){margin-top:3rem;}}.active{color:",o.Tj.blue,";padding:.2rem 0 .4rem;border-bottom:1px dashed #9dc7d9;}");var g=()=>(0,m.Y)(c,null,(0,m.Y)("div",{className:"container"},(0,m.Y)(r.N_,{to:"/"},(0,m.Y)("img",{className:"logo",src:l.A,alt:"theia logo"})),(0,m.Y)("ul",{className:"links"},d.s.map(((e,i)=>(0,m.Y)("li",{key:`${e.title}+${i}`,className:e.path?"":"caption",style:e.indented?{marginLeft:"3rem",marginTop:"1rem",listStyle:"circle",listStylePosition:"inside"}:{}},e.path?(0,m.Y)(r.N_,{to:e.path,activeClassName:"active"},e.title):e.title))))));const p=(0,n.A)("div",{target:"ewv6paa0"})("position:absolute;top:4rem;left:50%;transform:translate(-50%, -2rem);z-index:100;@media(max-width: 360px){top:9rem;}@media(min-width: ",o.fi.xmd,"){display:none;}select{font:inherit;color:inherit;padding:1rem 1.5rem;background:#fff;border:1px solid #ddd;-moz-appearance:none;-webkit-appearance:none;appearance:none;background-image:url(","data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBpZD0iQ2FwYV8xIiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgeD0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjU1IDI1NSIgeT0iMCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMjU1IDI1NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PGxpbmsgaWQ9ImRhcmstbW9kZSIgY2xhc3M9ImFjdGl2ZS1wYXRoIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIi8+PHN0eWxlIGlkPSJkYXJrLW1vZGUtY3VzdG9tLXN0eWxlIiBjbGFzcz0iYWN0aXZlLXBhdGgiIHR5cGU9InRleHQvY3NzIi8+PGc+PGcgaWQ9ImFycm93LWRyb3AtZG93biI+PHBvbHlnb24gZmlsbD0iIzM4MzgzOCIgcG9pbnRzPSIwIDYzLjc1IDEyNy41IDE5MS4yNSAyNTUgNjMuNzUiIGNsYXNzPSJhY3RpdmUtcGF0aCIgZGF0YS1vcmlnaW5hbD0iIzAwMDAwMCIvPjwvZz48L2c+PC9nPjwvc3ZnPg==","),linear-gradient(to bottom, #ffffff 0%,#e5e5e5 100%);background-repeat:no-repeat,repeat;background-position:right .7em top 50%,0 0;background-size:.65em auto,100%;}option{&:disabled{font-family:'Anonymous Pro',monospace;color:inherit;}}"),u=e=>{(0,r.oo)(e.currentTarget.value)};var h=()=>(0,m.Y)(p,null,(0,m.Y)("select",{onChange:u,defaultValue:"Select A Topic"},(0,m.Y)("option",{value:"#",selected:!0},"Select A Topic"),d.s.map(((e,i)=>(0,m.Y)("option",{key:i,value:e.path,disabled:!e.path},e.title))))),b=t(7518),I=t(9620),v="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1OS40MTQgNTkuNDE0IiBpZD0iQ2FwYV8xIiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgeD0iMCIgeT0iMCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNTkuNDE0IDU5LjQxNCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PGxpbmsgaWQ9ImRhcmstbW9kZSIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIvPjxzdHlsZSBpZD0iZGFyay1tb2RlLWN1c3RvbS1zdHlsZSIgdHlwZT0idGV4dC9jc3MiLz48Zz48cG9seWdvbiBmaWxsPSIjMzgzODM4IiBwb2ludHM9IjI5LjcwNyA0NS4yNjggMCAxNS41NjEgMS40MTQgMTQuMTQ2IDI5LjcwNyA0Mi40MzkgNTggMTQuMTQ2IDU5LjQxNCAxNS41NjEiIGNsYXNzPSJhY3RpdmUtcGF0aCIgZGF0YS1vbGRfY29sb3I9IiM0OEEwREMiIGRhdGEtb3JpZ2luYWw9IiM0OEEwREMiLz48L2c+PC9nPjwvc3ZnPg==";const f=(0,n.A)("div",{target:"ex5dzuf0"})({name:"3ufj4z",styles:"display:flex;justify-content:space-between;margin-top:10rem;.arrow{display:inline-block;height:6rem;&--left{transform:rotate(90deg);}&--right{transform:rotate(270deg);}}"});var w=e=>{let{prev:i,next:t,prevTitle:n,nextTitle:a}=e;const o="Go to previous Page "+(n?`: ${n}`:""),s="Go to next page "+(a?`: ${a}`:"");return(0,m.Y)(f,null,(0,m.Y)(r.N_,{to:i,title:o,"aria-label":o,style:{pointerEvents:!i&&"none"}},(0,m.Y)("img",{src:v,alt:o,className:"arrow arrow--left",style:{opacity:i?1:".3"}})),(0,m.Y)(r.N_,{to:t,title:s,"aria-label":s,style:{pointerEvents:!t&&"none"}},(0,m.Y)("img",{src:v,alt:s,className:"arrow arrow--right",style:{opacity:t?1:".3"}})))};const x=(0,n.A)("div",{target:"e1mh6m3o0"})("display:flex;.main{position:relative;overflow-x:hidden;@media(max-width: ",o.fi.xmd,"){padding:15rem 3rem;}@media(min-width: ",o.fi.xmd,"){width:70%;}@media(max-width: ",o.fi.xmd,"){min-width:100vw;}}.docs-row{width:85%;max-width:100rem;margin:0 auto;padding-bottom:10rem;@media(max-width: ",o.fi.sm,"){width:100%;}@media(min-width: ",o.fi.sm,"){min-height:90rem;}}h1{margin-bottom:3rem;}h2{margin:2.5rem 0;font-size:2.6rem;}p{margin:1rem 0;}ul{margin-bottom:3rem;list-style-position:inside;ul{margin-left:3rem;margin-bottom:0;}}ol{margin-bottom:3rem;list-style-position:inside;ol{margin-left:3rem;margin-bottom:0;}}li{margin-top:.8rem;}li>p{display:inline;}code,pre{max-width:100%;}.doc-image{width:100%;margin:2rem 0;margin-right:auto;box-shadow:0 1.5rem 3rem rgba(0,0,0, .25);}");var y=e=>{let{children:i,canonical:t,context:n}=e;return(0,m.Y)(a.A,{canonical:t},(0,m.Y)(x,null,(0,m.Y)(g,null),(0,m.Y)(h,null),(0,m.Y)("div",{className:"main"},(0,m.Y)("div",null,(0,m.Y)("div",{className:"docs-row"},(0,m.Y)(b.A,null),i,(0,m.Y)(w,n)),(0,m.Y)(I.A,null)))))}}}]); -//# sourceMappingURL=8c9522e9ab04d805c32ce56d0725aa8a5b32377d-87289377e7c421d5e020.js.map \ No newline at end of file diff --git a/pr-previews/pr-707/8c9522e9ab04d805c32ce56d0725aa8a5b32377d-87289377e7c421d5e020.js.map b/pr-previews/pr-707/8c9522e9ab04d805c32ce56d0725aa8a5b32377d-87289377e7c421d5e020.js.map deleted file mode 100644 index 799a1c31..00000000 --- a/pr-previews/pr-707/8c9522e9ab04d805c32ce56d0725aa8a5b32377d-87289377e7c421d5e020.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"8c9522e9ab04d805c32ce56d0725aa8a5b32377d-87289377e7c421d5e020.js","mappings":"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","sources":["webpack://Theia-Website/./src/docs/menu.js","webpack://Theia-Website/./src/components/DocSideBar.js","webpack://Theia-Website/./src/components/DocTopicChooser.js","webpack://Theia-Website/./src/resources/drop-down-arrow.svg","webpack://Theia-Website/./src/resources/arrow.svg","webpack://Theia-Website/./src/components/DocArrowNavigators.js","webpack://Theia-Website/./src/layouts/docs-layout.js"],"sourcesContent":["/********************************************************************************\n * Copyright (C) 2020 TypeFox and others.\n *\n * This program and the accompanying materials are made available under the\n * terms of the Eclipse Public License v. 2.0 which is available at\n * http://www.eclipse.org/legal/epl-2.0.\n *\n * This Source Code may also be made available under the following Secondary\n * Licenses when the conditions for such availability set forth in the Eclipse\n * Public License v. 2.0 are satisfied: GNU General Public License, version 2\n * with the GNU Classpath Exception which is available at\n * https://www.gnu.org/software/classpath/license.html.\n *\n * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0\n ********************************************************************************/\n\nconst M = (title, path, subMenu, indented = false) => ({\n title,\n path: '/docs/' + (path ? path + '/' : ''),\n subMenu,\n indented\n})\n\nexport const MENU = [\n {\n title: 'Overview'\n },\n M(\n 'Getting Started',\n ''\n ),\n M(\n 'Project Goals',\n 'project_goals'\n ),\n {\n title: 'Using the Theia IDE'\n },\n M(\n 'Getting Started',\n 'user_getting_started'\n ),\n M(\n 'Installing VS Code Extensions',\n 'user_install_vscode_extensions'\n ),\n M(\n 'Using AI Features',\n 'user_ai'\n ),\n M(\n 'Using the dynamic Toolbar',\n 'user_toolbar'\n ),\n M(\n 'Download',\n 'blueprint_download'\n ),\n {\n title: 'Adopting the Theia Platform'\n },\n M(\n 'Build your own IDE/Tool',\n 'composing_applications'\n ),\n M(\n 'Extending the Theia IDE',\n 'blueprint_documentation'\n ),\n M(\n 'Extensions and Plugins',\n 'extensions'\n ),\n M(\n 'Authoring Theia Extensions',\n 'authoring_extensions'\n ),\n M(\n 'Authoring VS Code Extensions',\n 'authoring_vscode_extensions'\n ),\n M(\n 'Consuming Theia fixes without upgrading',\n 'consume_theia_fixes_master'\n ),\n {\n title: 'Platform Concepts & APIs'\n },\n M(\n 'Services and Contributions',\n 'services_and_contributions'\n ),\n M(\n 'Architecture Overview',\n 'architecture'\n ),\n M(\n 'Commands/Menus/Keybindings',\n 'commands_keybindings'\n ),\n M(\n 'Widgets',\n 'widgets'\n ),\n M(\n 'Preferences',\n 'preferences'\n ),\n M(\n 'Theia AI',\n 'theia_ai'\n ),\n M(\n 'Label Provider',\n 'label_provider'\n ),\n M(\n 'Message Service',\n 'message_service'\n ),\n M(\n 'Property View',\n 'property_view'\n ),\n M(\n 'Events',\n 'events'\n ),\n M(\n 'Frontend Application Contributions',\n 'frontend_application_contribution'\n ),\n M(\n 'Backend Application Contributions',\n 'backend_application_contribution'\n ),\n M(\n 'Communication via JSON-RPC',\n 'json_rpc'\n ),\n M(\n 'Tasks',\n 'tasks'\n ),\n M(\n 'Internationalization',\n 'i18n'\n ),\n M(\n 'Language Support',\n 'language_support'\n ),\n M(\n 'Dynamic Toolbar',\n 'toolbar'\n ),\n M(\n 'Breadcrumbs',\n 'breadcrumbs'\n ),\n M(\n 'Enhanced Tab Bar Preview',\n 'enhanced_tab_bar_preview'\n ),\n M(\n 'Contribution Filter',\n 'contribution_filter'\n ),\n M(\n 'Advanced Tips',\n 'tips'\n )\n]\n\nexport function getMenuContext(slug, menu = MENU, context = {}) {\n const indexOfCurrent = menu.findIndex(({path}) => {\n if (path) {\n return path.includes(slug)\n }\n return false\n })\n const prev = menu[indexOfCurrent - 1] && menu[indexOfCurrent - 1].path ?\n menu[indexOfCurrent - 1].path : menu[indexOfCurrent - 2] &&\n menu[indexOfCurrent - 2].path && menu[indexOfCurrent - 2].path\n\n const prevTitle = menu[indexOfCurrent - 1] && menu[indexOfCurrent - 1].path ?\n menu[indexOfCurrent - 1].title :\n menu[indexOfCurrent - 2] && menu[indexOfCurrent - 2].path &&\n menu[indexOfCurrent - 2].title\n\n const next = menu[indexOfCurrent + 1] && menu[indexOfCurrent + 1].path ?\n menu[indexOfCurrent + 1].path : menu[indexOfCurrent + 2] &&\n menu[indexOfCurrent + 2].path && menu[indexOfCurrent + 2].path\n\n const nextTitle = menu[indexOfCurrent + 1] && menu[indexOfCurrent + 1].path ?\n menu[indexOfCurrent + 1].title :\n menu[indexOfCurrent + 2] && menu[indexOfCurrent + 2].path &&\n menu[indexOfCurrent + 2].title\n\n return {\n prev: prev,\n prevTitle,\n next: next,\n nextTitle\n }\n}\n","/********************************************************************************\n * Copyright (C) 2019 TypeFox and others.\n *\n * This program and the accompanying materials are made available under the\n * terms of the Eclipse Public License v. 2.0 which is available at\n * http://www.eclipse.org/legal/epl-2.0.\n *\n * This Source Code may also be made available under the following Secondary\n * Licenses when the conditions for such availability set forth in the Eclipse\n * Public License v. 2.0 are satisfied: GNU General Public License, version 2\n * with the GNU Classpath Exception which is available at\n * https://www.gnu.org/software/classpath/license.html.\n *\n * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0\n ********************************************************************************/\n\nimport React from 'react'\nimport styled from '@emotion/styled'\nimport { breakpoints, colors } from '../utils/variables'\nimport { Link } from 'gatsby'\nimport Background from '../resources/background-image.png'\nimport TheiaLogoDark from '../resources/theia-logo-dark.svg'\nimport { MENU } from '../docs/menu'\n\nconst Styled = styled.div`\n width: 30%;\n min-height: 100vh;\n min-width: 25rem;\n border-right: 10px solid #f8f8f8;\n background-image: url(${Background});\n background-size: cover;\n background-position: center;\n background-repeat: no-repeat;\n\n .container {\n position: relative;\n min-height: 100vh;\n min-width: 25rem;\n padding: 10rem 0;\n background-image: url(${Background}), linear-gradient(#fff, #fff);\n background-size: cover;\n background-position: center;\n background-repeat: no-repeat;\n }\n\n @media(max-width: ${breakpoints.xmd}) {\n display: none;\n }\n\n .logo {\n display: block;\n height: 2.8rem;\n margin: 0 auto 13rem auto;\n }\n\n .links {\n display: flex;\n flex-direction: column;\n justify-content: center;\n list-style: none;\n min-width: 21rem;\n width: 50%;\n margin: 0 auto;\n }\n\n ul {\n list-style: none;\n }\n\n li {\n text-align: left;\n &:not(:last-of-type) {\n margin-bottom: .7rem;\n }\n }\n\n a {\n text-decoration: none;\n color: inherit;\n transition: all .2s;\n\n &:hover,\n &:focus {\n color: ${colors.blue};\n padding: .2rem 0 .4rem;\n border-bottom: 1px dashed #9dc7d9;\n }\n }\n\n .caption {\n font-family: 'Anonymous Pro', sans-serif;\n font-weight: bold;\n text-transform: uppercase;\n\n &:not(:first-of-type) {\n margin-top: 3rem;\n }\n }\n\n .active {\n color: ${colors.blue};\n padding: .2rem 0 .4rem;\n border-bottom: 1px dashed #9dc7d9;\n }\n`\n\nconst DocSideBar = () => {\n return (\n \n
\n \"theia\n \n
\n
\n )\n}\n\nexport default DocSideBar","/********************************************************************************\n * Copyright (C) 2019 TypeFox and others.\n *\n * This program and the accompanying materials are made available under the\n * terms of the Eclipse Public License v. 2.0 which is available at\n * http://www.eclipse.org/legal/epl-2.0.\n *\n * This Source Code may also be made available under the following Secondary\n * Licenses when the conditions for such availability set forth in the Eclipse\n * Public License v. 2.0 are satisfied: GNU General Public License, version 2\n * with the GNU Classpath Exception which is available at\n * https://www.gnu.org/software/classpath/license.html.\n *\n * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0\n ********************************************************************************/\n\nimport React from 'react'\nimport { navigate } from 'gatsby'\nimport styled from '@emotion/styled'\nimport { breakpoints } from '../utils/variables'\nimport DropDownArrow from '../resources/drop-down-arrow.svg';\nimport { MENU } from '../docs/menu'\n\nconst Styled = styled.div`\n position: absolute;\n top: 4rem;\n left: 50%;\n transform: translate(-50%, -2rem);\n z-index: 100;\n\n @media(max-width: 360px) {\n top: 9rem;\n }\n\n @media(min-width: ${breakpoints.xmd}) {\n display: none;\n }\n\n select {\n font: inherit;\n color: inherit;\n padding: 1rem 1.5rem;\n background: #fff;\n border: 1px solid #ddd;\n -moz-appearance: none;\n -webkit-appearance: none;\n appearance: none;\n background-image: url(${DropDownArrow}),\n linear-gradient(to bottom, #ffffff 0%,#e5e5e5 100%);\n background-repeat: no-repeat, repeat;\n background-position: right .7em top 50%, 0 0;\n background-size: .65em auto, 100%;\n }\n\n option {\n &:disabled {\n font-family: 'Anonymous Pro', monospace;\n color: inherit;\n }\n }\n`\n\nconst onSelectTopic = (e) => {\n navigate(e.currentTarget.value)\n}\n\nconst DocTopicChooser = () => (\n \n \n \n)\n\nexport default DocTopicChooser","export default \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBpZD0iQ2FwYV8xIiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgeD0iMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjU1IDI1NSIgeT0iMCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMjU1IDI1NSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PGxpbmsgaWQ9ImRhcmstbW9kZSIgY2xhc3M9ImFjdGl2ZS1wYXRoIiByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIi8+PHN0eWxlIGlkPSJkYXJrLW1vZGUtY3VzdG9tLXN0eWxlIiBjbGFzcz0iYWN0aXZlLXBhdGgiIHR5cGU9InRleHQvY3NzIi8+PGc+PGcgaWQ9ImFycm93LWRyb3AtZG93biI+PHBvbHlnb24gZmlsbD0iIzM4MzgzOCIgcG9pbnRzPSIwIDYzLjc1IDEyNy41IDE5MS4yNSAyNTUgNjMuNzUiIGNsYXNzPSJhY3RpdmUtcGF0aCIgZGF0YS1vcmlnaW5hbD0iIzAwMDAwMCIvPjwvZz48L2c+PC9nPjwvc3ZnPg==\"","export default \"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1OS40MTQgNTkuNDE0IiBpZD0iQ2FwYV8xIiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgeD0iMCIgeT0iMCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgNTkuNDE0IDU5LjQxNCIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PGc+PGxpbmsgaWQ9ImRhcmstbW9kZSIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIvPjxzdHlsZSBpZD0iZGFyay1tb2RlLWN1c3RvbS1zdHlsZSIgdHlwZT0idGV4dC9jc3MiLz48Zz48cG9seWdvbiBmaWxsPSIjMzgzODM4IiBwb2ludHM9IjI5LjcwNyA0NS4yNjggMCAxNS41NjEgMS40MTQgMTQuMTQ2IDI5LjcwNyA0Mi40MzkgNTggMTQuMTQ2IDU5LjQxNCAxNS41NjEiIGNsYXNzPSJhY3RpdmUtcGF0aCIgZGF0YS1vbGRfY29sb3I9IiM0OEEwREMiIGRhdGEtb3JpZ2luYWw9IiM0OEEwREMiLz48L2c+PC9nPjwvc3ZnPg==\"","/********************************************************************************\n * Copyright (C) 2019 TypeFox and others.\n *\n * This program and the accompanying materials are made available under the\n * terms of the Eclipse Public License v. 2.0 which is available at\n * http://www.eclipse.org/legal/epl-2.0.\n *\n * This Source Code may also be made available under the following Secondary\n * Licenses when the conditions for such availability set forth in the Eclipse\n * Public License v. 2.0 are satisfied: GNU General Public License, version 2\n * with the GNU Classpath Exception which is available at\n * https://www.gnu.org/software/classpath/license.html.\n *\n * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0\n ********************************************************************************/\n\nimport React from 'react'\nimport { Link } from 'gatsby'\nimport styled from '@emotion/styled'\nimport Arrow from '../resources/arrow.svg'\n\nconst Styled = styled.div`\n display: flex;\n justify-content: space-between;\n margin-top: 10rem;\n\n .arrow {\n display: inline-block;\n height: 6rem;\n\n &--left {\n transform: rotate(90deg);\n }\n\n &--right {\n transform: rotate(270deg);\n }\n }\n`\n\nconst DocArrowNavigators = ({prev, next, prevTitle, nextTitle}) => {\n const pTitle = `Go to previous Page ${prevTitle ? `: ${prevTitle}` : \"\"}`\n const nTitle = `Go to next page ${nextTitle ? `: ${nextTitle}` : \"\"}`\n return (\n \n \n {pTitle}\n \n \n {nTitle}\n \n \n)\n}\n\nexport default DocArrowNavigators","/********************************************************************************\n * Copyright (C) 2019 TypeFox and others.\n *\n * This program and the accompanying materials are made available under the\n * terms of the Eclipse Public License v. 2.0 which is available at\n * http://www.eclipse.org/legal/epl-2.0.\n *\n * This Source Code may also be made available under the following Secondary\n * Licenses when the conditions for such availability set forth in the Eclipse\n * Public License v. 2.0 are satisfied: GNU General Public License, version 2\n * with the GNU Classpath Exception which is available at\n * https://www.gnu.org/software/classpath/license.html.\n *\n * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0\n ********************************************************************************/\n\nimport React from 'react'\nimport styled from '@emotion/styled'\nimport Layout from '../layouts/layout'\nimport DocSideBar from '../components/DocSideBar'\nimport DocTopicChooser from '../components/DocTopicChooser'\nimport Nav from '../components/Nav'\nimport Footer from '../components/Footer'\nimport { breakpoints } from '../utils/variables'\nimport DocArrowNavigators from '../components/DocArrowNavigators'\n\nconst DocContainer = styled.div`\n display: flex;\n\n .main {\n position: relative;\n overflow-x: hidden;\n @media(max-width: ${breakpoints.xmd}) {\n padding: 15rem 3rem ;\n }\n\n @media(min-width: ${breakpoints.xmd}) {\n width: 70%;\n }\n\n @media(max-width: ${breakpoints.xmd}) {\n min-width: 100vw;\n }\n }\n\n .docs-row {\n width: 85%;\n max-width: 100rem;\n margin: 0 auto;\n padding-bottom: 10rem;\n\n @media(max-width: ${breakpoints.sm}) {\n width: 100%;\n }\n\n @media(min-width: ${breakpoints.sm}) {\n min-height: 90rem;\n }\n }\n\n h1 {\n margin-bottom: 3rem;\n }\n\n h2 {\n margin: 2.5rem 0;\n font-size: 2.6rem;\n }\n\n p {\n margin: 1rem 0;\n }\n\n ul {\n margin-bottom: 3rem;\n list-style-position: inside;\n\n ul {\n margin-left: 3rem;\n margin-bottom: 0;\n }\n }\n\n ol {\n margin-bottom: 3rem;\n list-style-position: inside;\n\n ol {\n margin-left: 3rem;\n margin-bottom: 0;\n }\n }\n\n li {\n margin-top: .8rem;\n }\n\n li > p {\n display: inline;\n }\n\n code,\n pre {\n max-width: 100%;\n }\n\n .doc-image {\n width: 100%;\n margin: 2rem 0;\n margin-right: auto;\n box-shadow: 0 1.5rem 3rem rgba(0,0,0, .25);\n }\n`\n\nconst DocsLayout = ({children, canonical, context}) => (\n \n \n \n \n
\n
\n
\n
\n
\n
\n
\n
\n)\n\nexport default DocsLayout"],"names":["M","title","path","subMenu","indented","MENU","getMenuContext","slug","menu","context","indexOfCurrent","findIndex","_ref","includes","prev","prevTitle","next","nextTitle","Styled","_styled","target","Background","breakpoints","xmd","colors","blue","DocSideBar","___EmotionJSX","className","Link","to","src","TheiaLogoDark","alt","map","m","i","key","style","marginLeft","marginTop","listStyle","listStylePosition","activeClassName","onSelectTopic","e","navigate","currentTarget","value","DocTopicChooser","onChange","defaultValue","selected","disabled","name","styles","pTitle","nTitle","pointerEvents","Arrow","opacity","DocContainer","sm","children","canonical","Layout","Nav","DocArrowNavigators","Footer"],"sourceRoot":""} \ No newline at end of file diff --git a/pr-previews/pr-707/_gatsby/slices/_gatsby-scripts-1.html b/pr-previews/pr-707/_gatsby/slices/_gatsby-scripts-1.html index 2c87705e..2861551d 100644 --- a/pr-previews/pr-707/_gatsby/slices/_gatsby-scripts-1.html +++ b/pr-previews/pr-707/_gatsby/slices/_gatsby-scripts-1.html @@ -4,4 +4,4 @@ > window.___chunkMapping="{\"app\":[\"/app-f6f8e6b1f95071f3d885.js\"],\"component---src-pages-404-js\":[\"/component---src-pages-404-js-1c97c66d7998fb40d048.js\"],\"component---src-pages-blogs-js\":[\"/component---src-pages-blogs-js-d636a26158aeeb9701fa.js\"],\"component---src-pages-docs-js\":[\"/component---src-pages-docs-js-52ba16cfe819f11145bf.js\"],\"component---src-pages-index-js\":[\"/component---src-pages-index-js-9ea45e881103930fe8f6.js\"],\"component---src-pages-releases-js\":[\"/component---src-pages-releases-js-6b63209b257eb5d7ffe8.js\"],\"component---src-pages-resources-js\":[\"/component---src-pages-resources-js-58532c16436f03988114.js\"],\"component---src-pages-support-js\":[\"/component---src-pages-support-js-9bd01f77ce82eb582405.js\"],\"component---src-pages-theia-platform-js\":[\"/component---src-pages-theia-platform-js-9c24155b7fcbb10dfc08.js\"],\"component---src-templates-doc-js\":[\"/component---src-templates-doc-js-0f91607553d4c7973801.js\"]}"; - \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/blogs/index.html b/pr-previews/pr-707/blogs/index.html index ae62cae5..3f3d169e 100644 --- a/pr-previews/pr-707/blogs/index.html +++ b/pr-previews/pr-707/blogs/index.html @@ -54,4 +54,4 @@ > window.___chunkMapping="{\"app\":[\"/app-f6f8e6b1f95071f3d885.js\"],\"component---src-pages-404-js\":[\"/component---src-pages-404-js-1c97c66d7998fb40d048.js\"],\"component---src-pages-blogs-js\":[\"/component---src-pages-blogs-js-d636a26158aeeb9701fa.js\"],\"component---src-pages-docs-js\":[\"/component---src-pages-docs-js-52ba16cfe819f11145bf.js\"],\"component---src-pages-index-js\":[\"/component---src-pages-index-js-9ea45e881103930fe8f6.js\"],\"component---src-pages-releases-js\":[\"/component---src-pages-releases-js-6b63209b257eb5d7ffe8.js\"],\"component---src-pages-resources-js\":[\"/component---src-pages-resources-js-58532c16436f03988114.js\"],\"component---src-pages-support-js\":[\"/component---src-pages-support-js-9bd01f77ce82eb582405.js\"],\"component---src-pages-theia-platform-js\":[\"/component---src-pages-theia-platform-js-9c24155b7fcbb10dfc08.js\"],\"component---src-templates-doc-js\":[\"/component---src-templates-doc-js-0f91607553d4c7973801.js\"]}"; - \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/architecture/index.html b/pr-previews/pr-707/docs/architecture/index.html index 9f2cb6cd..5d72eb43 100644 --- a/pr-previews/pr-707/docs/architecture/index.html +++ b/pr-previews/pr-707/docs/architecture/index.html @@ -48,7 +48,7 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Architecture Overview

+ Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Architecture Overview

This section describes the overall architecture of the Theia Platform.

Theia is designed to work as a native desktop application as well as in the context of a browser and a remote server. To support both situations with a @@ -94,4 +94,4 @@

- \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/authoring_extensions/index.html b/pr-previews/pr-707/docs/authoring_extensions/index.html index 86f27f08..50bd1011 100644 --- a/pr-previews/pr-707/docs/authoring_extensions/index.html +++ b/pr-previews/pr-707/docs/authoring_extensions/index.html @@ -48,7 +48,7 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Authoring Theia Extensions

+ Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Authoring Theia Extensions

This guide will walk you through the process of creating Theia extensions and deploying them in your Theia-based application. Please make sure to be aware of how to create a Theia based application and the different available extension mechanisms of Theia (Plugins vs. Extensions) before you continue reading.

As an example, we are going to add a menu item Say hello that displays a notification "Hello world!". This article is guiding you through all the necessary steps.

Prerequisites

@@ -165,4 +165,4 @@

- \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/authoring_plugins/index.html b/pr-previews/pr-707/docs/authoring_plugins/index.html index d5e00e41..385f932b 100644 --- a/pr-previews/pr-707/docs/authoring_plugins/index.html +++ b/pr-previews/pr-707/docs/authoring_plugins/index.html @@ -48,7 +48,7 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Authoring Theia Plug-ins

+ Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Authoring Theia Plug-ins

This documentation is deprecated and needs to be updated. We currently recommend using VS Code extensions or Theia extensions instead of Theia Plugins. See the extension overview for more details.

\ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/authoring_vscode_extensions/index.html b/pr-previews/pr-707/docs/authoring_vscode_extensions/index.html index 425c7ce8..cbb41a44 100644 --- a/pr-previews/pr-707/docs/authoring_vscode_extensions/index.html +++ b/pr-previews/pr-707/docs/authoring_vscode_extensions/index.html @@ -48,7 +48,7 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Authoring VS Code Extensions

+ Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Authoring VS Code Extensions

Alongside Theia extensions, VS Code extensions can also be used to enhance Theia applications with additional functionality, such as language support, commands, or tree views. VS Code extensions contribute functionality through the dedicated VS Code API, which the Theia framework also supports. This means that extensions that have been developed for VS Code are also compatible with Theia, and vice versa. @@ -240,4 +240,4 @@

- \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/backend_application_contribution/index.html b/pr-previews/pr-707/docs/backend_application_contribution/index.html index ecfbf53c..e95c36f2 100644 --- a/pr-previews/pr-707/docs/backend_application_contribution/index.html +++ b/pr-previews/pr-707/docs/backend_application_contribution/index.html @@ -48,7 +48,7 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Backend Application Contributions

+ Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Backend Application Contributions

A backend application contribution allows Eclipse Theia extensions to hook into the lifecycle of the Theia backend. Backend application contributions are instantiated immediately after starting the backend application, which makes them a good place for initializing backend services that are required during the entire lifespan of the backend.

To register backend application contributions, an extension needs to bind an implementation of the interface BackendApplicationContribution in the backend module.

export default new ContainerModule(bind => {
@@ -131,4 +131,4 @@
           >
             window.___chunkMapping="{\"app\":[\"/app-f6f8e6b1f95071f3d885.js\"],\"component---src-pages-404-js\":[\"/component---src-pages-404-js-1c97c66d7998fb40d048.js\"],\"component---src-pages-blogs-js\":[\"/component---src-pages-blogs-js-d636a26158aeeb9701fa.js\"],\"component---src-pages-docs-js\":[\"/component---src-pages-docs-js-52ba16cfe819f11145bf.js\"],\"component---src-pages-index-js\":[\"/component---src-pages-index-js-9ea45e881103930fe8f6.js\"],\"component---src-pages-releases-js\":[\"/component---src-pages-releases-js-6b63209b257eb5d7ffe8.js\"],\"component---src-pages-resources-js\":[\"/component---src-pages-resources-js-58532c16436f03988114.js\"],\"component---src-pages-support-js\":[\"/component---src-pages-support-js-9bd01f77ce82eb582405.js\"],\"component---src-pages-theia-platform-js\":[\"/component---src-pages-theia-platform-js-9c24155b7fcbb10dfc08.js\"],\"component---src-templates-doc-js\":[\"/component---src-templates-doc-js-0f91607553d4c7973801.js\"]}";
           
-        
\ No newline at end of file
+        
\ No newline at end of file
diff --git a/pr-previews/pr-707/docs/blueprint_documentation/index.html b/pr-previews/pr-707/docs/blueprint_documentation/index.html
index 4ed094b4..e214c768 100644
--- a/pr-previews/pr-707/docs/blueprint_documentation/index.html
+++ b/pr-previews/pr-707/docs/blueprint_documentation/index.html
@@ -48,7 +48,7 @@
         }
       }
     })
-  Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Extending/Adopting the Theia IDE

+ Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Extending/Adopting the Theia IDE

This guide provides an overview on how to extend and customize the Theia IDE to your own custom IDE or tool. In this scenario, the Eclipse Theia IDE is an example product used as a reference on how to build desktop IDE-like products based on the Eclipse Theia framework. If you just want to use the Theia IDE, see the user guide

Please note that adopting the Theia IDE as a basis is just one of several ways to get started with building a Theia-based application. We recommend reading the article "Build your own IDE/Tool" as a first step. Furthermore, this guide is focused on building a desktop app. We also provide an experimental Docker version of the Theia IDE as an alternative.

The Theia IDE assembles a selected subset of existing Theia features and extensions. @@ -218,4 +218,4 @@

- \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/blueprint_download/index.html b/pr-previews/pr-707/docs/blueprint_download/index.html index eba94ee9..f0e7fe2f 100644 --- a/pr-previews/pr-707/docs/blueprint_download/index.html +++ b/pr-previews/pr-707/docs/blueprint_download/index.html @@ -48,11 +48,11 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Eclipse Theia Blueprint

+ Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Eclipse Theia Blueprint

Eclipse Theia Blueprint has been rebranded to "Theia IDE" and has moved to this page.

Go to previous Page : Using the dynamic ToolbarGo to next page : Build your own IDE/Tool
- \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/breadcrumbs/index.html b/pr-previews/pr-707/docs/breadcrumbs/index.html index b1fcdf3d..c4779bcf 100644 --- a/pr-previews/pr-707/docs/breadcrumbs/index.html +++ b/pr-previews/pr-707/docs/breadcrumbs/index.html @@ -48,7 +48,7 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Breadcrumbs

+ Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Breadcrumbs

If enabled via the preferences, Theia can show a navigation bar, often referred to as breadcrumbs, above the content of widgets that are located in the main area of the workbench. This interactive navigation bar indicates the location of the widget's content in the context of an overall structure, such as the filesystem. By default, Theia shows breadcrumbs for the location of files in the filesystem when a file is opened in the text editors.

@@ -159,4 +159,4 @@

- \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/commands_keybindings/index.html b/pr-previews/pr-707/docs/commands_keybindings/index.html index 03b863e1..06fa5cdb 100644 --- a/pr-previews/pr-707/docs/commands_keybindings/index.html +++ b/pr-previews/pr-707/docs/commands_keybindings/index.html @@ -48,7 +48,7 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Commands, Menus and Keybindings

+ Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Commands, Menus and Keybindings

Commands are runnable actions defined by an ID and the function to be executed (plus some optional parameters like a name or an icon). Commands can be triggered via the command palette, they can be bound to keybindings or menu items, and they can be called programmatically. The action that commands trigger can be context-sensitive, so that they can only be called under certain conditions (window focus, current selection etc.).

The following sections provide details about how to contribute commands, keybindings and menu items. The sections will describe how to connect the different contributions and how to use the corresponding services for managing these items.

If you are not yet familiar with contribution points in Theia or the use of dependency injection, please consider this guide on Services and Contributions.

@@ -147,4 +147,4 @@

- \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/composing_applications/index.html b/pr-previews/pr-707/docs/composing_applications/index.html index 58ff79a9..e8cea1d1 100644 --- a/pr-previews/pr-707/docs/composing_applications/index.html +++ b/pr-previews/pr-707/docs/composing_applications/index.html @@ -48,7 +48,7 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Build your own IDE/Tool

+ Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Build your own IDE/Tool

This guide will teach you how to create your own Theia-based application. The guide will demonstrate how to configure your own application composed of existing or new Theia extensions, and any VS Code extensions you want bundled in your application by default. Please get familiar with the extension mechanisms of Theia in case you are not already. We provide two entry points for creating your own Theia-based application.

Please note that a chat response can contain a list of response parts, allowing various UI components to be mixed with actionable response components.

+

Parse Parts of the Response into Different Response Contents

+

To simplify parsing an overall response from the LLM into different parts that you want to display with specific UI components, you can add so-called response content matchers. These matchers allow you to define a regular expression that matches a specific part of the response and then transform this part into a dedicated response content. This is especially useful if you want to display different parts of the response in different ways, e.g. as a highlighted code, buttons, etc.

+

In the following example code, we define a response content matcher that matches text within <question> elements in the response and transforms them into specific QuestionResponseContentImpl objects. You can review the full code in the AskAndContinueAgent API example.

+

In your chat agent, you can register a response content matcher like this:

+
@postConstruct()
+addContentMatchers(): void {
+    this.contentMatchers.push({
+        start: /^<question>.*$/m,
+        end: /^<\/question>$/m,
+        contentFactory: (content: string, request: ChatRequestModelImpl) => {
+            const question = content.replace(/^<question>\n|<\/question>$/g, '');
+            const parsedQuestion = JSON.parse(question);
+            return new QuestionResponseContentImpl(parsedQuestion.question, parsedQuestion.options, request, selectedOption => {
+                this.handleAnswer(selectedOption, request);
+            });
+        }
+    });
+}
+
+

This matcher will be invoked by the common response parser if it finds occurrences of the start and end regular expressions in the response. The contentFactory function is then invoked to transform the matched content into a specific response content object.

Create and Register a Response Part Renderer

The final step is to display a button in the Chat UI to allow users to execute the command. This is done by creating a new Response Part Renderer. The renderer is registered to handle CommandChatResponseContent, ensuring that the Chat UI calls it whenever a corresponding content type is part of the response.

The following example code shows the corresponding response renderer, you can review the full code here.

@@ -356,6 +377,65 @@

Ollama LLM Provider

Please note that Theia AI currently does not provide a fixed contribution point for Language Models, yet. This is due to the fact that we are working on supporting more models and also capabilities of new LLMs are emerging at the moment, such as function calling and structured output. We plan to consolidate the LLM Provider interfaces within the next months while adding more LLM Providers to the core framework. We are happy for feedback and contributions in this area.

+

Change Sets

+

Change sets in Theia AI provide a mechanism for AI agents (and therefore the underlying LLMs) to propose changes to users. These proposed changes can then be reviewed, accepted, refined, or declined by the user. Theia AI offers framework support for generic change sets, a default UI integrated in the generic, reusable chat interface and Theia AI includes a default implementation for file-based changes. This default implementation is utilized in the Theia IDE, particularly with the Theia Coder agent. However, adopters can provide alternative implementations to handle different types of changes, such as modifications to databases, structured models, or other domain-specific data.

+

Example usage of Change Sets

+

The following example demonstrates how agents can propose file modifications using a change set. Please have a look at the full example for using change sets in agents.

+
override async invoke(request: ChatRequestModelImpl): Promise<void> {
+        // ...
+        const fileToAdd = root.resource.resolve('hello/new-file.txt');
+        const fileToChange = // some file to change
+        const fileToDelete = // Some file to delete
+
+        const chatSessionId = request.session.id;
+        const changeSet = new ChangeSetImpl('My Test Change Set');
+        changeSet.addElement(
+            this.fileChangeFactory({
+                uri: fileToAdd,
+                type: 'add',
+                state: 'pending',
+                targetState: 'Hello World!',
+                changeSet,
+                chatSessionId
+            })
+        );
+
+        if (fileToChange && fileToChange.resource) {
+            changeSet.addElement(
+                this.fileChangeFactory({
+                    uri: fileToChange.resource,
+                    type: 'modify',
+                    state: 'pending',
+                    targetState: await this.computeTargetState(fileToChange.resource),
+                    changeSet,
+                    chatSessionId
+                })
+            );
+        }
+        if (fileToDelete && fileToDelete.resource) {
+            changeSet.addElement(
+                this.fileChangeFactory({
+                    uri: fileToDelete.resource,
+                    type: 'delete',
+                    state: 'pending',
+                    changeSet,
+                    chatSessionId
+                })
+            );
+        }
+        request.session.setChangeSet(changeSet);
+        request.response.complete();
+}
+

This example demonstrates how:

+
    +
  • A change set is created
  • +
  • An example file element of all available types (add, modify, or delete) is added.
  • +
  • A proposed change is added to the change set for user review.
  • +
+

Another example to look at is the Theia Coder agent which proposes file modifications using a change set. In this use case, the change set creation is embedded in a tool function that Coder provides to the LLM (see also the full code). So in this workflow, the LLM can directly create and augment change sets.

+

Custom Change Set Elements

+

Adopters can implement their own version of 'ChangeSetElement' to manage domain-specific changes while leveraging the existing review and approval workflow. This will still allow to use the generic change set and the default Chat UI provided by Theia AI. To provide custom type of 'ChangeSetElement', implement the respective interface and add your custom elements to the default change set.

+

Custom change set element implementations are identified by a uri, have full control over their presentation (label, icon, additional information), and can specify whether and how actions, such as open, open change, accept and discard are implemented. See ChangeSetElement interface for more details.

Learn more

If want to learn more about the AI support in the Theia AI, please see this Theia AI introduction, our article on the vision of Theia AI and the demonstrations in Sneak Preview Series about Theia AI

Go to previous Page : PreferencesGo to next page : Label Provider
- \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/theia_coder/index.html b/pr-previews/pr-707/docs/theia_coder/index.html new file mode 100644 index 00000000..77dc4f37 --- /dev/null +++ b/pr-previews/pr-707/docs/theia_coder/index.html @@ -0,0 +1,117 @@ +Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Theia Coder: AI-Powered Development in the Theia IDE

+

This page provides details about the Theia Coder agent in the Theia IDE, please also refer to the general introduction to the AI features in the Theia IDE. +Theia Coder is an AI-powered coding agent integrated into the Theia IDE, currently released as a preview version. To improve and refine it, please provide feedback. The preview comes with two prompt variants:

+
    +
  • Default: Coder will always replace full files when proposing changes. This might be slow but is accurate in most cases.
  • +
  • coder-search-replace: Coder can also search and replace for faster editing. This is faster in many cases, but Coder might need several attempts.
  • +
+

We recommend trying the "coder-search-replace" prompt and switching back to the default if you find issues. You can change this setting in the AI configuration view under "Coder" => "Prompt Templates".

+

Using Theia Coder

+

Theia Coder functions as a chat agent within Theia AI Chat. To interact with it, simply reference it using @Coder in the chat.

+

Key Capabilities

+
    +
  1. Retrieving Context: Coder can browse the current workspace to find relevant code.
  2. +
  3. Proposing Changes: It provides structured code modifications that users can review and apply automatically.
  4. +
+

In the following example video, we provide a simple task to Coder to demonstrate the full work flow.

+Demo of Theia Coder, the personal AI developement assistant in the Theia IDE +

Describing Programming Tasks

+

To use Theia Coder effectively, describe your programming task in clear natural language. Coder will search your workspace for relevant code, but you can improve efficiency by specifying key locations, such as:

+
    +
  • Code files that need to be modified
  • +
  • Supporting files that contribute to understanding the task (e.g., interface definitions or similar implementations)
  • +
+

Ways to Specify Relevant Context

+

Please note that we are currently working on making context creation even more efficient by allowing users to drag and drop files as well as using keyboard shortcuts.

+

There are multiple ways to help Coder find the right files efficiently:

+

1. Natural Language

+

You can describe the location in plain text, such as:

+
+

"In the ai-mcp package under src/browser."

+
+

While Coder will still need to search, this helps it focus on the right area.

+

2. Providing Relative File Paths

+

Copy and paste a file's relative path into the chat to directly guide Coder to a specific file. You can obtain this by right-clicking a file or editor tab and selecting "Copy Relative Path."

+

3. Using Context Variables

+

Theia Coder supports predefined variables that dynamically provide relevant context:

+
    +
  • #relativeFile – The relative path of the currently selected file (in the editor or explorer)
  • +
  • #relativeFileDirname – The directory path of the currently selected file
  • +
  • #selectedText – The currently highlighted text in the editor
  • +
+

Reviewing and Applying Code Changes

+

Based on your task and the provided context, Theia Coder generates proposed code changes. This process may take some time. For transparency, you can observe which files Coder accesses in the chat.

+

To apply changes, Theia Coder utilizes Theia AI’s changeset feature:

+
    +
  • A list of modified files appears above the chat input field.
  • +
  • Click on an entry to view a diff editor, comparing the previous and new state.
  • +
  • In the diff editor, selectively apply changes.
  • +
  • Alternatively, apply or revert changes directly from the changeset overview.
  • +
  • If needed, you can clear individual changes or the entire changeset.
  • +
+

Summary

+

Theia Coder enhances AI-driven development by:

+
    +
  • Understanding natural language requests
  • +
  • Browsing workspace context
  • +
  • Generating structured code modifications
  • +
  • Providing an intuitive interface for reviewing and applying changes
  • +
+

Please remember that Theia Coder is currently released as a preview version. To improve and refine it, please provide feedback.

+

Please also note that Theia Coder is built on Theia AI, a flexible framework for build AI-powered tools and IDEs. You can easily adopt or extend Theia Coder or build a similar agent for your own use case with ease.

Go to previous Page : Using AI FeaturesGo to next page : Using the dynamic Toolbar
+ + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/tips/index.html b/pr-previews/pr-707/docs/tips/index.html index c48c44cd..61f2f079 100644 --- a/pr-previews/pr-707/docs/tips/index.html +++ b/pr-previews/pr-707/docs/tips/index.html @@ -48,7 +48,7 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Advanced Tips

+ Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Advanced Tips

In this section we'll outline some advanced hints and tips to get the most out of developing tools based on Eclipse Theia.

Providing custom API to VS Code extensions in Eclipse Theia

Theia allows running VS Code extension by providing a compatible API (see this overview for details). @@ -81,4 +81,4 @@

- \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/toolbar/index.html b/pr-previews/pr-707/docs/toolbar/index.html index 34e20e55..aa0991e4 100644 --- a/pr-previews/pr-707/docs/toolbar/index.html +++ b/pr-previews/pr-707/docs/toolbar/index.html @@ -48,7 +48,7 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Dynamic Toolbar

+ Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Dynamic Toolbar

Eclipse Theia provides an optional and fully dynamic toolbar to be included in your custom IDE or tool. Please also see the documentation of the toolbar from a user point of view.

To enable the toolbar, simply include the Theia extension "@theia/toolbar" into your Theia-based product (also see the documentation on composing Theia applications).

The Theia toolbar defines some default commands that are displayed even before the user can configure the toolbar to their preferences. These defaults are defined in a ToolbarDefaultsFactory. See here for the default ToolbarDefaultsFactory that is shipped within the toolbar extension. @@ -57,10 +57,10 @@ rebind(ToolbarDefaultsFactory).toService(MyCustomToolbarDefaultsFactory); } else { bind(ToolbarDefaultsFactory).toService(MyCustomToolbarDefaultsFactory); -}

Go to previous Page : Using AI FeaturesGo to next page : Download
+}
Go to previous Page : Theia Coder (AI assistant)Go to next page : Download

- \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/user_ai/index.html b/pr-previews/pr-707/docs/user_ai/index.html index c4ed1788..f9d55593 100644 --- a/pr-previews/pr-707/docs/user_ai/index.html +++ b/pr-previews/pr-707/docs/user_ai/index.html @@ -48,7 +48,7 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Using the AI Features in the Theia IDE as an End User

+ Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Using the AI Features in the Theia IDE as an End User

This section documents how to use AI features in the Theia IDE (available since version 1.54, see also this introduction). These features are based on Theia AI, a framework for building AI assistance in tools and IDEs. Theia AI is part of the Theia platform. If you're interested in building your own custom tool or IDE with Theia AI, please refer to the corresponding documentation.

Please note that these features are in early access and experimental. This means they may be unstable, behave unexpectedly, or undergo significant changes. In particular, using your own LLM might incur costs that you need to monitor closely. We have not yet optimized the AI assistants in the Theia IDE for token usage. Use these features at your own risk, and we welcome any feedback, suggestions, and contributions!

Theia AI features within the Theia IDE are currently disabled by default. See the next section on how to enable them.

@@ -67,6 +67,7 @@

Current Agents in the Theia IDE

@@ -116,8 +118,7 @@

ANTHROPIC_API_KEY to set the key securely.

Configure available models in the settings under AI-features => AnthropicsModels. -Default supported models include choices like claude-3-5-sonnet-latest. -Please note that the Anthropic LLM provider currently does not yet support tool calls, this will be added soon.

+Default supported models include choices like claude-3-5-sonnet-latest.

Hugging Face

To enable Hugging Face as an AI provider, you need to create an API key in your Hugging Face account and enter it in the Theia IDE settings: AI-features => Hugging Face Please note: By using this preference the Hugging Face API key will be stored in clear text on the machine running Theia. Use the environment variable HUGGINGFACE_API_KEY to set the key securely. @@ -182,7 +183,10 @@

Code Completion (Agent)

This agent provides inline code completion within the Theia IDE's code editor. By default, automatic inline completion is disabled to give users greater control over how AI code suggestions are presented. Users can manually trigger inline completion via the default key binding Ctrl+Alt+Space (adaptable). Requests are canceled when moving the cursor.

Users who prefer continuous suggestions can enable 'Automatic Code Completion' in the settings ('AIFeatures'=>'CodeCompletion'). This agent makes continuous requests to the underlying LLM while coding if automatic suggestions are enabled.

-

In the settings, you can also specify 'Excluded File Extensions' for which the AI-powered code completion will be deactivated.

+

Please note that there are two prompt variants available for the code completion agent, you can select them in the 'AI Configuration view' => 'Code Completion' => 'Prompt Templates'.

+

You can also adapt the used prompt template to your personal preferences or to the LLM you want to use, see for example how to use the Theia IDE with StarCoder.

+

In the settings, you can specify 'Excluded File Extensions' for which the AI-powered code completion will be deactivated.

+

The setting 'Strip Backticks' will remove surrounding backticks that some LLMs might produce (depending on the prompt).

Finally, the setting 'Max Context Lines' allows you to configure the maximum number of lines used for AI code completion context. This setting can be adjusted to customize the size of the context provided to the model, which is especially useful when using smaller models with limited token capacity.

Terminal Assistance (Agent)

This agent assists with writing and executing terminal commands. Based on the user's request, it suggests commands and allows them to be directly pasted and executed in the terminal. It can access the current directory, environment, and recent terminal output to provide context-aware assistance. You can open the terminal assistance agent via Ctrl+I in the terminal view.

@@ -232,7 +236,7 @@

To learn more about MCP, see the official announcement from Anthropic.
For a list of available MCP servers, visit the MCP Servers Repository.

Configuring MCP Servers

-

To configure MCP servers, open the preferences and add entries to the MCP Servers Configuration section. Each server requires a unique identifier (e.g., "brave-search" or "filesystem") and configuration details such as the command, arguments, and optional environment variables. For Windows users, please see the additional information below

+

To configure MCP servers, open the preferences and add entries to the MCP Servers Configuration section. Each server requires a unique identifier (e.g., "brave-search" or "filesystem") and configuration details such as the command, arguments, and optional environment variables. For Windows users, please see the additional information below. 'autostart' will automatically start the respective MCP server the next time you restart your IDE, you will still need to manually start it the first time (see below).

Example Configuration:

Go to previous Page : Installing VS Code ExtensionsGo to next page : Using the dynamic Toolbar
+

If want to learn more about the AI support in the Theia AI, please see this introduction, our article on the vision of Theia AI and the demonstrations in Sneak Preview Series about Theia AI

Go to previous Page : Installing VS Code ExtensionsGo to next page : Theia Coder (AI assistant)
- \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/user_getting_started/index.html b/pr-previews/pr-707/docs/user_getting_started/index.html index 96966f63..0c2f06fa 100644 --- a/pr-previews/pr-707/docs/user_getting_started/index.html +++ b/pr-previews/pr-707/docs/user_getting_started/index.html @@ -48,7 +48,7 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Using the "Theia IDE" as an End User

+ Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

Using the "Theia IDE" as an End User

The Theia IDE is a modern and open IDE for cloud and desktop. The Theia IDE is based on the Theia platform.

  • Learn more about the Theia IDE
  • @@ -70,4 +70,4 @@ > window.___chunkMapping="{\"app\":[\"/app-f6f8e6b1f95071f3d885.js\"],\"component---src-pages-404-js\":[\"/component---src-pages-404-js-1c97c66d7998fb40d048.js\"],\"component---src-pages-blogs-js\":[\"/component---src-pages-blogs-js-d636a26158aeeb9701fa.js\"],\"component---src-pages-docs-js\":[\"/component---src-pages-docs-js-52ba16cfe819f11145bf.js\"],\"component---src-pages-index-js\":[\"/component---src-pages-index-js-9ea45e881103930fe8f6.js\"],\"component---src-pages-releases-js\":[\"/component---src-pages-releases-js-6b63209b257eb5d7ffe8.js\"],\"component---src-pages-resources-js\":[\"/component---src-pages-resources-js-58532c16436f03988114.js\"],\"component---src-pages-support-js\":[\"/component---src-pages-support-js-9bd01f77ce82eb582405.js\"],\"component---src-pages-theia-platform-js\":[\"/component---src-pages-theia-platform-js-9c24155b7fcbb10dfc08.js\"],\"component---src-templates-doc-js\":[\"/component---src-templates-doc-js-0f91607553d4c7973801.js\"]}"; - \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/user_install_vscode_extensions/index.html b/pr-previews/pr-707/docs/user_install_vscode_extensions/index.html index 5aeb04c5..d205e2ed 100644 --- a/pr-previews/pr-707/docs/user_install_vscode_extensions/index.html +++ b/pr-previews/pr-707/docs/user_install_vscode_extensions/index.html @@ -48,7 +48,7 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

    Installing VS Code Extensions in Theia

    + Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

    Installing VS Code Extensions in Theia

    You can install VS Code extensions into Theia-based products via the Open VSX Registry, aka “Theia Marketplace” or “Theia Extension Registry”.

    Note: To be able to install extensions, the creator of your Theia-based tool needs to have enabled this option. The following documentation is based on the Theia IDE, a standard product based on Theia. This might slightly differ from the Theia-based product you are using, please contact the provider of your tool if there are uncertainties and also see here. For tool creators, please see the end of this document.

    To install new extensions into the Theia IDE, please open the Extensions View via the Menu "View => Extensions" or via the command “Toggle Extensions View”.

    @@ -68,4 +68,4 @@

    window.___chunkMapping="{\"app\":[\"/app-f6f8e6b1f95071f3d885.js\"],\"component---src-pages-404-js\":[\"/component---src-pages-404-js-1c97c66d7998fb40d048.js\"],\"component---src-pages-blogs-js\":[\"/component---src-pages-blogs-js-d636a26158aeeb9701fa.js\"],\"component---src-pages-docs-js\":[\"/component---src-pages-docs-js-52ba16cfe819f11145bf.js\"],\"component---src-pages-index-js\":[\"/component---src-pages-index-js-9ea45e881103930fe8f6.js\"],\"component---src-pages-releases-js\":[\"/component---src-pages-releases-js-6b63209b257eb5d7ffe8.js\"],\"component---src-pages-resources-js\":[\"/component---src-pages-resources-js-58532c16436f03988114.js\"],\"component---src-pages-support-js\":[\"/component---src-pages-support-js-9bd01f77ce82eb582405.js\"],\"component---src-pages-theia-platform-js\":[\"/component---src-pages-theia-platform-js-9c24155b7fcbb10dfc08.js\"],\"component---src-templates-doc-js\":[\"/component---src-templates-doc-js-0f91607553d4c7973801.js\"]}"; - \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/user_toolbar/index.html b/pr-previews/pr-707/docs/user_toolbar/index.html index 2419c901..c67dd7d2 100644 --- a/pr-previews/pr-707/docs/user_toolbar/index.html +++ b/pr-previews/pr-707/docs/user_toolbar/index.html @@ -48,7 +48,7 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

    Using the dynamic Toolbar in Theia

    + Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

    Using the dynamic Toolbar in Theia

    Eclipse Theia provides a dynamic toolbar allowing easy access to commonly used commands. The toolbar contains default commands and can be dynamically adapted by users based on their personal preference.

    Note: To use the toolbar in Theia, the creator of your Theia-based tool needs to have enabled this option. The following documentation is based on the Theia IDE, a standard product based on Theia. This might slightly differ from the Theia-based product you are using, please contact the provider of your tool if there are uncertainties and also see here. For tool creators, please see the toolbar adopter documentation.

    As a user, you can control the default visibility of the Theia toolbar using the setting "Show Toolbar" (see screenshot below). Additionally, you can toggle the toolbar using "ALT+T" or via right-click on the toolbar => "Toggle Toolbar".

    @@ -56,10 +56,10 @@

    The toolbar will show some default commands, which are configured by the provider of your Theia-based tool. As a user, you can add and remove commands. Further, you can change their position in the toolbar. To remove an existing command, right-click the icon in the toolbar and select "Remove Command From Toolbar". To change the position of an existing command, simply drag it around. The toolbar supports three columns to visually structure commands ("Left", "Center" and "Right"). To add a new command to the toolbar, right click and select "Add Command to Toolbar" (see screenshot below). This will open a wizard that first allows you to select the command you want to add. In the second step, you can specify and icon that is used to display the new command in the toolbar. Finally, you select the column the new command will be placed in (you can still move it around later).

    Theia Toolbar -

    To restore the default commands on the toolbar, right click and select "Restore Toolbar Defaults". Please note that this will delete all custom commands you might have added.

    Go to previous Page : Using AI FeaturesGo to next page : Download
    +

    To restore the default commands on the toolbar, right click and select "Restore Toolbar Defaults". Please note that this will delete all custom commands you might have added.

    Go to previous Page : Theia Coder (AI assistant)Go to next page : Download
    - \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/docs/widgets/index.html b/pr-previews/pr-707/docs/widgets/index.html index a20813e4..d754bbf8 100644 --- a/pr-previews/pr-707/docs/widgets/index.html +++ b/pr-previews/pr-707/docs/widgets/index.html @@ -48,7 +48,7 @@ } } }) - Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

    Widgets

    + Theia Platform – Open, Flexible, and Extensible Framework for Building Cloud & Desktop IDEs and Tools

    Widgets

    A widget is a part displaying content within the Theia workbench, e.g. a view or an editor. Examples for existing widgets in Theia are the file explorer, the code editor or the problems view. By contributing custom widgets, you can place your own custom UI in a Theia-based application. Your custom UI will behave the same as other widgets in terms of window layouts including the title tab, resizing, dragging and opening/closing (see screenshot below).

    Widget Example

    Furthermore, a widget will receive events from the surrounding workbench, e.g. on application start, on resize or on detach. The implementation of the actual content of a widget, which is rendered in the provided frame is completely up to you, though. As an example, you can implement some custom UI using React within a widget.

    @@ -170,4 +170,4 @@

    - \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/index.html b/pr-previews/pr-707/index.html index 5a0fbe9e..695ebc55 100644 --- a/pr-previews/pr-707/index.html +++ b/pr-previews/pr-707/index.html @@ -54,4 +54,4 @@ > window.___chunkMapping="{\"app\":[\"/app-f6f8e6b1f95071f3d885.js\"],\"component---src-pages-404-js\":[\"/component---src-pages-404-js-1c97c66d7998fb40d048.js\"],\"component---src-pages-blogs-js\":[\"/component---src-pages-blogs-js-d636a26158aeeb9701fa.js\"],\"component---src-pages-docs-js\":[\"/component---src-pages-docs-js-52ba16cfe819f11145bf.js\"],\"component---src-pages-index-js\":[\"/component---src-pages-index-js-9ea45e881103930fe8f6.js\"],\"component---src-pages-releases-js\":[\"/component---src-pages-releases-js-6b63209b257eb5d7ffe8.js\"],\"component---src-pages-resources-js\":[\"/component---src-pages-resources-js-58532c16436f03988114.js\"],\"component---src-pages-support-js\":[\"/component---src-pages-support-js-9bd01f77ce82eb582405.js\"],\"component---src-pages-theia-platform-js\":[\"/component---src-pages-theia-platform-js-9c24155b7fcbb10dfc08.js\"],\"component---src-templates-doc-js\":[\"/component---src-templates-doc-js-0f91607553d4c7973801.js\"]}"; - \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/page-data/app-data.json b/pr-previews/pr-707/page-data/app-data.json index 6f9e3361..759d697b 100644 --- a/pr-previews/pr-707/page-data/app-data.json +++ b/pr-previews/pr-707/page-data/app-data.json @@ -1 +1 @@ -{"webpackCompilationHash":"2c9b44d2b2c22b9c6e1d"} +{"webpackCompilationHash":"72c3a1bfef750cc832e2"} diff --git a/pr-previews/pr-707/page-data/docs/theia_ai/page-data.json b/pr-previews/pr-707/page-data/docs/theia_ai/page-data.json index 05917e2e..f13892ad 100644 --- a/pr-previews/pr-707/page-data/docs/theia_ai/page-data.json +++ b/pr-previews/pr-707/page-data/docs/theia_ai/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-doc-js","path":"/docs/theia_ai/","result":{"data":{"markdownRemark":{"frontmatter":{"title":"Building Custom AI assistants and AI support with Theia AI"},"html":"

    Building Custom AI assistants and AI support with Theia AI

    \n

    This section explains how to build custom AI assistants and integrate AI support into custom tools and IDEs using Theia AI. Theia AI, part of the Theia Platform, is a powerful framework designed to help tool builders integrate tailored AI capabilities into their tools and IDEs with ease (see also this Theia AI introduction). It provides reusable components, prompt management, LLM integration, and flexible user interfaces, allowing you to focus on delivering domain-specific AI features. This section is targeted at tool builders using Theia and Theia AI as a platform to build custom tools and IDEs.\nFor detailed information on how to use the experimental AI features in the Theia IDE as an end user, refer to the user documentation.\nTo learn how to generally extend Theia by creating Theia extensions, including AI ones, visit the extension authoring guide.

    \n\"High\n

    High Level Architecture of Theia AI

    \n

    Table of Contents

    \n\n

    Creating Agents with Theia AI

    \n

    In this section, we will introduce the concept of agents and demonstrate how to create your own custom agents. An Agent in Theia AI is a self-contained component mediating between the user interface that triggers the agent, and the LLM. Thus, it is typically invoked with a user input or a UI event, collects relevant context, produces one or more prompts, handles the communication with a language model (LLM),, and invokes actions in the tool and/or returns outputs to the UI as a result. Each agent can have unique behavior based on its design.

    \n

    Agents can generally be integrated into any part of the tool (e.g., terminals, editors, custom widgets) and also interact with any available and exposed API of Theia to collect context, trigger actions, or show results. A special type of agent in Theia AI is ‘Chat Agent’, which is automatically integrated into Theia AI’s default chat UI. A chat agent handles conversational interactions, making them suitable for tasks like answering questions in a chat interface.

    \n

    An important design decision is how you split your AI feature set among agents. Please note that Theia AI enables any kind of modularity from one agent capable of handling many types of user requests or events to an agent delegating sub-tasks to other agents, or even several agents operating on one request. Agents can communicate with each other, so you can chain agents for one user request. This decision really depends on the specific use cases and project. Theia AI makes it easy to iteratively refine the modularity of agents while developing it. A good start is typically to start with one agent per use case.

    \n

    This guide will walk you through creating agents and chat agents using Theia AI, providing a deeper understanding of the framework and how to leverage it for custom use cases.

    \n

    Creating an Agent

    \n

    In general, an agent is essentially an injectable Theia service offering a specific API for its clients, such as custom widgets, editors, or menu items. Clients can obtain the instance of the agent from the agent registry or get it injected via DI, and call its methods. Usually those methods are very use case specific, often taking parameters for context that are relevant and already available to the clients calling the agents. The agent will then construct one or more prompts, obtain one or more language models, process its output, invoke actions in Theia and/or return a result to the client, e.g. to show a result message, offer follow-up questions or buttons to perform actions.

    \n

    As you see, an agent is rather generic — and this is on purpose. It is designed to cater many different use cases integrated in a variety of UI components, widgets, or editors. An example of such an agent in the Theia IDE is the code completion agent integrated in the code editor.

    \n

    Creating a Chat Agent

    \n

    A Chat Agent is integrated into the default chat UI provided by Theia AI and thus needs to implement a more specific interface, so it can be invoked from the chat UI generically. It’s designed for conversational interaction with users.

    \n

    Let’s create a new agent for the Theia IDE as an example! This new agent will assist users in identifying (and later executing) arbitrary commands in the Theia IDE, such as opening the settings or showing the toolbar. You can review the full code of this agent as a reference.

    \n

    Defining the Prompt Template

    \n

    The first step in creating a chat agent is defining the system prompt template, which acts as the foundation for guiding how the agent interacts with the LLM.

    \n
    export const commandPromptTemplate: PromptTemplate = {\n   id = 'command-chat-agent-system-prompt-template';\n   template = `Always respond with: “I am the command agent`;\n}
    \n

    This template sets the behavior of the agent, in the example above, it will always respond with a test String for now.

    \n

    Creating the Chat Agent

    \n

    Next, we will create the chat agent, which allows you to customize the agent’s behavior, specify its language model requirements, which prompt templates it uses, and define its interaction with users. In our case, we want to create a simple Chat Agent for which we extend the reusable base implementation provided by Theia AI (see code example below).\nAbstractChatAgent takes care of a basic conversation flow and streaming, so we literally only need to define a name, an id, a description and which system prompt our agent uses. This agent will be available in the default chat UI and can be referenced via @Command. The agent will respond based on the behavior defined in the prompt.

    \n
    export class CommandChatAgent extends AbstractChatAgent {\n   id: string = 'Command';\n   name: string = 'Command';\n   description: string = `Helps users find and execute commands in the IDE`;\n   variables: string[] = []; // Optional: define variables for dynamic data insertion.\n   promptTemplates: PromptTemplate[] = [commandPromptTemplate];\n\n   protected async getSystemMessage(): Promise<SystemMessage | undefined> {\n       const systemPrompt = await this.promptService.getPrompt('command-system');\n       return SystemMessage.fromResolvedPromptTemplate(systemPrompt);\n   }\n}
    \n

    In the example above, we retrieve the prompt from Theia AIs Prompt Service. This provides features such as automatic variable resolvement. The usage of the Prompt Service is of course optional, as an agent implemented you can also simply define your own data structure if you prefer.\nIn the example above, we also register our prompt template with Theia AI. With this, Theia AI can provide generic features such as the prompt editor, but of course this is again up to the agent implementer whether to register prompts or not.

    \n

    Registering the Agent

    \n

    To integrate our agent with Theia AI, we need to register it. Theia as a platform is modular, so we can just register the agent along with the existing agents via dependency injection, no forking or customization of Theia framework code is required. See also the section on services and contributions and specifically the section on contribution points.\nIn the following code example, we register our agent as an ‘Agent’ and as a ‘ChatAgent’. With this, the simple agent above will already be available in the default chat, you can directly “talk” to it via typing “@Command”. In the current state, it will of course only respond with “I am the command agent”.

    \n
    bind(Agent).toService(CommandChatAgent);\nbind(ChatAgent).toService(CommandChatAgent);
    \n

    Refine your Agent

    \n

    The next step is typically the most effort and it is actually unrelated to Theia AI: You need to develop the behavior of the agent, including one or more prompts that reliably return the expected output.

    \n

    In our example, we want to return an executable Theia command that the user is looking for with their question. For this, we need to augment our prompt with variables (see section “Variables and Tool Functions”) to give the LLM the necessary context information on what Theia commands are available. Moreover, we want this response in a parsable format, so that we can easily detect the command selected by the LLM in its response and provide the user with the option to directly execute the command. See the section “Response Renderers” for more details.

    \n

    Getting such agent implementations right typically requires a bit of prompt evaluation with a set of expected user queries. A huge help in Theia AI is that you can modify the prompt templates at runtime to test different scenarios and tweak the prompt until you are satisfied, instead of changing the prompt templates in the code and need to rebuild after every change.

    \n

    Also, if the underlying LLM supports it, structured output is a huge time saver, as this usually guarantees that the output follows a specific format and avoids coping with variations in your agent’s parsing logic.\nThis guide is focussed on Theia AI and not about developing specific agents per se. If you need support building your own custom AI assistance, please get in contact with a service provider and browse our resource section.

    \n

    Variables and Tool Functions

    \n

    Agents often need to interact with the tool to fetch dynamic data, such as a text selection, project-data or any tool-specific data. Theia AI allows you to encapsulate this data access in Variables, which can then be used in prompts or user requests and will be resolved with the actual data from the tool at runtime. Furthermore, agents can use so-called Tool Functions that allow the underlying LLM to proactively call an action, either to retrieve more information or to trigger any kind of action including the modification of data.

    \n

    Variables

    \n

    Theia AI by default supports two types of variables:

    \n
      \n
    1. Global Variables are available to all agents. Theia and Theia AI already provide a standard set of variables, such as the currently selected text. Tool builders can easily register their own global variables to provide arbitrary additional data from the tool state, including their custom tool components. Global variables can also be used in any prompt template, but are also available to users in the default chat provided by Theia AI, e.g. “#currentText” for the currently selected text.
    2. \n
    3. Agent-specific Variables are only available to specific agents (and in their prompt templates), but not to other agents and also not in the default chat.
    4. \n
    \n

    Agent-specific Variables

    \n

    Agent-specific variables are controlled by a specific agent. To fill a variable with data, you can literally use any internal Theia API or other external APIs or methods you like. As an example, let’s again look at the chat agent that assists users in identifying (and later executing) arbitrary commands in the Theia IDE, such as opening the settings or showing the toolbar. You can review the full code of this agent as a reference.

    \n

    To allow the underlying LLM to identify the right command, we want to send it a list with all available commands. To achieve this, we first retrieve a list of all available commands using the CommandRegistry (see code example below). This step is independent of Theia AI and you could retrieve any sort of data here instead.\nSecond, we resolve the variable ‘command-ids’ when receiving the system prompt’ (also see code example below).

    \n
    // Retrieve all available commands\nconst knownCommands: string[] = [];\nfor (const command of this.commandRegistry.getAllCommands()) {\n   knownCommands.push(`${command.id}: ${command.label}`);\n}\n\n// Resolve the variable when retrieving the system prompt\nconst systemPrompt = await this.promptService.getPrompt('command-chat-agent-system-prompt-template', {\n   'command-ids': knownCommands.join('\\n')\n});
    \n

    Please note that the manual resolvement of variables is not necessary when using global variables.\nNow we can simply use our agent-specific variable in our prompt templates, e.g. like this:

    \n
    You are a service that helps users find commands to execute in an IDE.\n\nThese are the available commands:\nBegin List:\n{{command-ids}}\nEnd List
    \n

    If an agent uses agent-specific variables, it can decide to explicitly declare them. This enables one to keep track of used variables and optionally even show this information to the user (see example screenshot below).

    \n\"Used\n

    To declare an agent-specific variable, simply add it like this in the constructor of your agents, along with an optional description and whether it is used in the prompt template or not.

    \n
    this.agentSpecificVariables = [{\n   name: 'command-ids',\n   description: 'The list of available commands in Theia.',\n   usedInPrompt: true\n}];
    \n

    Global Variables

    \n

    Global variables are available to all agents. Therefore, they are provided as a dedicated contribution. In the following, we will define a simple global variable that resolves to the current date, i.e. to the time when the variable get resolved in a request. You can review the full code of this variable for a complete description.\nA Global variable basically consists of four parts.

    \n

    First, we define the variable, as it can be used in requests. In the following example, we define two optional arguments to influence the format.

    \n
    export const TODAY_VARIABLE: AIVariable = {\n   id: 'today-provider',\n   description: 'Does something for today',\n   name: 'today',\n   args: [\n       { name: TodayVariableArgs.IN_ISO_8601, description: 'Returns the current date in ISO 8601 format' },\n       { name: TodayVariableArgs.IN_UNIX_SECONDS, description: 'Returns the current date in unix seconds format' }\n   ]\n};
    \n

    Second, we register the variable using an ‘AIVariableContribution’ (see code example below). Third, we resolve the variable (also see code example below). Please note that for resolving a variable, you can access all necessary APIs, including tool-specific API or custom services.

    \n
    export class TodayVariableContribution implements AIVariableContribution, AIVariableResolver {\n   // Register the variable resolver\n   registerVariables(service: AIVariableService): void {\n       service.registerResolver(TODAY_VARIABLE, this);\n   }\n\n   async resolve(request: AIVariableResolutionRequest, context: AIVariableContext): Promise<ResolvedAIVariable | undefined> {\n       if (request.variable.name === TODAY_VARIABLE.name) {\n           return this.resolveTodayVariable(request);\n       }\n       return undefined;\n   }\n\n   private resolveTodayVariable(request: AIVariableResolutionRequest): ResolvedTodayVariable {\n       const date = new Date();\n       if (request.arg === TodayVariableArgs.IN_ISO_8601) {\n           return { variable: request.variable, value: date.toISOString(), date };\n       }\n       if (request.arg === TodayVariableArgs.IN_UNIX_SECONDS) {\n           return { variable: request.variable, value: Math.round(date.getTime() / 1000).toString(), date };\n       }\n       return { variable: request.variable, value: date.toDateString(), date };\n   }\n}\n\n...\n\nbind(AIVariableContribution).to(TodayVariableContribution).inSingletonScope();
    \n

    It can now be used in any prompt template, as well as in user requests.

    \n

    Tool Functions

    \n

    Tool functions allow an agent to provide capabilities to the underlying LLM. Compared to variables, it is up to the LLM to decide whether to use an available function or not. Functions can be used to allow the LLM to retrieve additional information or to trigger actions in the tool. Actions can be literally anything you want the LLM to be able to trigger, including modifications of data. Tool Functions can be used in requests, similarly to variables as shown in the following prompt example:

    \n
    Use the following functions to access the workspace:\n- ~{getWorkspaceFileList}\n- ~{getFileContent}.
    \n

    To implement your own tool functions, provide an implementation of interface ‘ToolProvider’, in which you specify the ID, optionally parameters and a handler that represented the function to be called, e.g. like this:

    \n
    @injectable()\nexport class FileContentFunction implements ToolProvider {\n   static ID = FILE_CONTENT_FUNCTION_ID;\n\n   getTool(): ToolRequest {\n       return {\n           id: FileContentFunction.ID,\n           name: FileContentFunction.ID,\n           description: 'Get the content of the file',\n           parameters: {\n               type: 'object',\n               properties: {\n                   file: {\n                       type: 'string',\n                       description: 'The path of the file to retrieve content for',\n                   }\n               }\n           },\n           handler: (arg_string: string) => {\n               const file = this.parseArg(arg_string);\n               return this.getFileContent(file);\n           }\n       };\n   }\n}\n
    \n

    See here for the full example listed above. In the handler, you can call literally any available API to execute arbitrary actions or retrieve arbitrary content, including tool-specific things.

    \n

    Finally, register your ‘ToolProvider’ like this:

    \n
    bind(ToolProvider).to(FileContentFunction);
    \n

    Custom Response Part Rendering

    \n

    This section explains the process of converting an LLM (Large Language Model) response into custom UI controls within the Theia AI default chat (or any custom chat implementation). Custom UI control can be specially highlighted text, clickable buttons or literally anything that you want to display to your users.\nAs an example, we will use the command chat agent used in this documentation before, which is capable of identifying a command in the Theia IDE based on the user's request. We will augment this agent to render commands that the agent returns as buttons. By clicking the button, users can then directly invoke a command.

    \n

    Let’s look at the basic control flow of a chat request in Theia AI (see diagram below). The flow starts with a user request in the default Chat UI (1), which is sent to the underlying LLM (2) to return an answer (3). By default, the agent can forward the response to the Chat UI as-is. However, in our scenario, the agent will parse the response and augment it with a structured response content (4). Based on this, the chat UI can select a corresponding response part renderer to be shown in the UI (5).

    \n\"Request\n

    In the following, we will dive into the details on how to implement this flow.

    \n

    Develop a Reliable Prompt

    \n

    The first step to enable structured response parsing is developing a prompt that reliably returns the expected output. In this case, the output should include an executable Theia command related to the user's question in JSON format. The response needs to be in a parsable format, allowing the system to detect the command and provide the user with the option to execute it.

    \n

    An simplified example of such a prompt might look like the following (you can review the full prompt template here)

    \n
    You are a service that helps users find commands to execute in an IDE.  \nYou reply with stringified JSON Objects that tell the user which command to execute and its arguments, if any.\n\nExample:\n\n\\`\\`\\`json\n{\n   \"type\": \"theia-command\",\n   \"commandId\": \"workbench.action.selectIconTheme\"\n}\n\\`\\`\\`\n\nHere are the known Theia commands:\n\nBegin List:  \n{{command-ids}}\nEnd List
    \n

    As described in the previous section the variable {{command-ids}} is dynamically populated with the list of available commands.

    \n

    Parse the Response and Transform into Response Content

    \n

    After receiving the LLM response, the next step is to parse it in the agent implementation and transform it into a response content that can then be processed by the Chat UI. In the following code example:

    \n
      \n
    • The LLM response is parsed into a command object.
    • \n
    • The Theia command corresponding to the parsed command ID is retrieved.
    • \n
    • A CommandChatResponseContentImpl object is created to wrap the command.
    • \n
    \n

    You can review the parsing code, including error handling here)

    \n

    Example code:

    \n
    const parsedCommand = JSON.parse(jsonString) as ParsedCommand;\nconst theiaCommand = this.commandRegistry.getCommand(parsedCommand.commandId);\nreturn new CommandChatResponseContentImpl(theiaCommand);
    \n

    Please note that a chat response can contain a list of response parts, allowing various UI components to be mixed with actionable response components.

    \n

    Create and Register a Response Part Renderer

    \n

    The final step is to display a button in the Chat UI to allow users to execute the command. This is done by creating a new Response Part Renderer. The renderer is registered to handle CommandChatResponseContent, ensuring that the Chat UI calls it whenever a corresponding content type is part of the response.

    \n

    The following example code shows the corresponding response renderer, you can review the full code here.

    \n
      \n
    • canHandle Method: Determines whether the renderer can handle the response part. If the response is of type CommandChatResponseContent, it returns a positive value, indicating it can process the content.
    • \n
    • render Method: Displays a button if the command is enabled. If the command is not executable globally, a message is shown.
    • \n
    • onCommand Method: Executes the command when the button is clicked.
    • \n
    \n
    canHandle(response: ChatResponseContent): number {\n    if (isCommandChatResponseContent(response)) {\n        return 10;\n    }\n    return -1;\n}\n\nrender(response: CommandChatResponseContent): ReactNode {\n    const isCommandEnabled = this.commandRegistry.isEnabled(response.command.id);\n    return (\n        isCommandEnabled ? (\n            <button className='theia-button main' onClick={this.onCommand.bind(this)}>{response.command.label}</button>\n        ) : (\n            <div>The command has the id \"{response.command.id}\" but it is not executable globally from the Chat window.</div>\n        )\n    );\n}\n\nprivate onCommand(arg: AIChatCommandArguments): void {\n    this.commandService.executeCommand(arg.command.id);\n}
    \n

    Finally, the custom response renderer needs to be registered:

    \n
    bind(ChatResponsePartRenderer).to(CommandPartRenderer).inSingletonScope();
    \n

    By following the steps outlined, you can transform an LLM response into custom and optionally actionable UI controls within Theia AI. See the Theia IDE documentation on how the example looks integrated in a tool.\nThis approach enables users to interact with the AI-powered Chat UI more efficiently, e.g. allowing executing commands directly from the suggestions provided.

    \n

    Managing the State of a Chat Response

    \n

    Theia AI provides a mechanism for chat agents to manage the state of a chat response. A chat response has the following states:

    \n
      \n
    • isComplete: boolean
    • \n
    • isWaitingForInput: boolean
    • \n
    • isError: boolean
    • \n
    \n

    If all are false, the chat interface will show Generating... until either an error occurs or the response is complete. While the response is in progress, users can only cancel the request. Once isComplete is set to true, the response is final and users can submit new requests. In your chat agent you can control the state via request.response.cancel(), request.response.complete(), and request.response.error().

    \n

    Progress Messages

    \n

    In addition you can also show progress messages in the response to the user:

    \n
    const progressMessage = request.response.addProgressMessage({ content: 'Analyzing your request...', show: 'whileIncomplete' });\n// do your work\n// if you are done, you can update the message\nrequest.response.updateProgressMessage({ ...progressMessage, show: 'whileIncomplete', status: 'completed' });\n
    \n

    With the show property, you can control whether your message is shown untilFirstContent, whileIncomplete, or forever.

    \n

    Waiting for Input

    \n

    Especially in more agentic interactions, you might need input from the user, without completing the response. Typical use cases are confirmation dialogs, asking the user to select among defined options, etc. before continuing the request. In this case, you can render a content part with which you ask the user for input (e.g. with the QuestionResponseContentImpl) and set the response into a waiting-for-input state without completing it, to signalize the response is not complete yet, but you are waiting for user input.

    \n

    In your chat agent implementation, you can use the onResponseComplete() hook, which will be invoked when the LLM response is completed. In this hook, you can check if you need to wait for input and set the response to isWaitingForInput:

    \n
    protected override async onResponseComplete(request: ChatRequestModelImpl): Promise<void> {\n    const unansweredQs = unansweredQuestions(request);\n    if (unansweredQs.length < 1) {\n        return super.onResponseComplete(request); // completes the response\n    }\n    request.response.addProgressMessage({ content: 'Waiting for input...', show: 'whileIncomplete' });\n    request.response.waitForInput();\n}
    \n

    In combination with the custom response part rendering (see above), this enables arbitrarily complex interactions with the user, including multi-step interactions, confirmation dialogs, and more. A simple example is available in the AskAndContinueChatAgent, which implements an interactive chat agent that asks the user for input and continues the conversation based on the user's response.

    \n\"Ask\n

    Custom LLM Provider

    \n

    Theia AI currently provides out-of-the-box support for any OpenAI-compatible LLM services (including the OpenAI models hosted by OpenAI or self-hosted compatible LLMs), Hugging Face, Ollama LLMs and Llamafile.

    \n

    Note: Theia AI enables connections to various models. However, be aware that some models may require specific customizations and optimizations to perform well in all scenarios. If you encounter issues implementing those customizations, please provide feedback.

    \n

    Learn more about which LLM providers are supported out of the box in at the example of the Theia IDE, which allows end users to configure the used LLM per agent. Of course, as a tool provider you can choose whether you provide this configurability to end users.

    \n

    As a tool provider, you can easily add support for additional LLM APIs too. Please consider contributing your additional LLM providers to the open source project, so that the community can benefit from increased compatibility and share the maintenance cost.

    \n

    To support a specific LLM API, you basically need to provide an implementation of the interface ‘LanguageModel’, which provides an abstraction between agents and the underlying LLM. This language model implementation then needs to be registered at the ‘LanguageModelRegistry’, to make it retrievable for agents as follows:

    \n
    this.languageModelRegistry.addLanguageModels([new OllamaModel()]);
    \n

    If you want to allow the user to configure the LLM provider, e.g. change the URL or the available models, consider integrating your LLM provider with Theias preference system.

    \n

    For further details, we recommend reviewing the available LLM provider in Theia AI:

    \n\n

    Please note that Theia AI currently does not provide a fixed contribution point for Language Models, yet. This is due to the fact that we are working on supporting more models and also capabilities of new LLMs are emerging at the moment, such as function calling and structured output. We plan to consolidate the LLM Provider interfaces within the next months while adding more LLM Providers to the core framework. We are happy for feedback and contributions in this area.

    \n

    Learn more

    \n

    If want to learn more about the AI support in the Theia AI, please see this Theia AI introduction, our article on the vision of Theia AI and the demonstrations in Sneak Preview Series about Theia AI

    ","fields":{"slug":"theia_ai"}}},"pageContext":{"slug":"theia_ai"}},"staticQueryHashes":["2468095761"],"slicesMap":{}} \ No newline at end of file +{"componentChunkName":"component---src-templates-doc-js","path":"/docs/theia_ai/","result":{"data":{"markdownRemark":{"frontmatter":{"title":"Building Custom AI assistants and AI support with Theia AI"},"html":"

    Building Custom AI assistants and AI support with Theia AI

    \n

    This section explains how to build custom AI assistants and integrate AI support into custom tools and IDEs using Theia AI. Theia AI, part of the Theia Platform, is a powerful framework designed to help tool builders integrate tailored AI capabilities into their tools and IDEs with ease (see also this Theia AI introduction). It provides reusable components, prompt management, LLM integration, and flexible user interfaces, allowing you to focus on delivering domain-specific AI features. This section is targeted at tool builders using Theia and Theia AI as a platform to build custom tools and IDEs.\nFor detailed information on how to use the experimental AI features in the Theia IDE as an end user, refer to the user documentation.\nTo learn how to generally extend Theia by creating Theia extensions, including AI ones, visit the extension authoring guide.

    \n\"High\n

    High Level Architecture of Theia AI

    \n

    Table of Contents

    \n\n

    Creating Agents with Theia AI

    \n

    In this section, we will introduce the concept of agents and demonstrate how to create your own custom agents. An Agent in Theia AI is a self-contained component mediating between the user interface that triggers the agent, and the LLM. Thus, it is typically invoked with a user input or a UI event, collects relevant context, produces one or more prompts, handles the communication with a language model (LLM),, and invokes actions in the tool and/or returns outputs to the UI as a result. Each agent can have unique behavior based on its design.

    \n

    Agents can generally be integrated into any part of the tool (e.g., terminals, editors, custom widgets) and also interact with any available and exposed API of Theia to collect context, trigger actions, or show results. A special type of agent in Theia AI is ‘Chat Agent’, which is automatically integrated into Theia AI’s default chat UI. A chat agent handles conversational interactions, making them suitable for tasks like answering questions in a chat interface.

    \n

    An important design decision is how you split your AI feature set among agents. Please note that Theia AI enables any kind of modularity from one agent capable of handling many types of user requests or events to an agent delegating sub-tasks to other agents, or even several agents operating on one request. Agents can communicate with each other, so you can chain agents for one user request. This decision really depends on the specific use cases and project. Theia AI makes it easy to iteratively refine the modularity of agents while developing it. A good start is typically to start with one agent per use case.

    \n

    This guide will walk you through creating agents and chat agents using Theia AI, providing a deeper understanding of the framework and how to leverage it for custom use cases.

    \n

    Creating an Agent

    \n

    In general, an agent is essentially an injectable Theia service offering a specific API for its clients, such as custom widgets, editors, or menu items. Clients can obtain the instance of the agent from the agent registry or get it injected via DI, and call its methods. Usually those methods are very use case specific, often taking parameters for context that are relevant and already available to the clients calling the agents. The agent will then construct one or more prompts, obtain one or more language models, process its output, invoke actions in Theia and/or return a result to the client, e.g. to show a result message, offer follow-up questions or buttons to perform actions.

    \n

    As you see, an agent is rather generic — and this is on purpose. It is designed to cater many different use cases integrated in a variety of UI components, widgets, or editors. An example of such an agent in the Theia IDE is the code completion agent integrated in the code editor.

    \n

    Creating a Chat Agent

    \n

    A Chat Agent is integrated into the default chat UI provided by Theia AI and thus needs to implement a more specific interface, so it can be invoked from the chat UI generically. It’s designed for conversational interaction with users.

    \n

    Let’s create a new agent for the Theia IDE as an example! This new agent will assist users in identifying (and later executing) arbitrary commands in the Theia IDE, such as opening the settings or showing the toolbar. You can review the full code of this agent as a reference.

    \n

    Defining the Prompt Template

    \n

    The first step in creating a chat agent is defining the system prompt template, which acts as the foundation for guiding how the agent interacts with the LLM.

    \n
    export const commandPromptTemplate: PromptTemplate = {\n   id = 'command-chat-agent-system-prompt-template';\n   template = `Always respond with: “I am the command agent`;\n}
    \n

    This template sets the behavior of the agent, in the example above, it will always respond with a test String for now.

    \n

    Creating the Chat Agent

    \n

    Next, we will create the chat agent, which allows you to customize the agent’s behavior, specify its language model requirements, which prompt templates it uses, and define its interaction with users. In our case, we want to create a simple Chat Agent for which we extend the reusable base implementation provided by Theia AI (see code example below).\nAbstractChatAgent takes care of a basic conversation flow and streaming, so we literally only need to define a name, an id, a description and which system prompt our agent uses. This agent will be available in the default chat UI and can be referenced via @Command. The agent will respond based on the behavior defined in the prompt.

    \n
    export class CommandChatAgent extends AbstractChatAgent {\n   id: string = 'Command';\n   name: string = 'Command';\n   description: string = `Helps users find and execute commands in the IDE`;\n   variables: string[] = []; // Optional: define variables for dynamic data insertion.\n   promptTemplates: PromptTemplate[] = [commandPromptTemplate];\n\n   protected async getSystemMessage(): Promise<SystemMessage | undefined> {\n       const systemPrompt = await this.promptService.getPrompt('command-system');\n       return SystemMessage.fromResolvedPromptTemplate(systemPrompt);\n   }\n}
    \n

    In the example above, we retrieve the prompt from Theia AIs Prompt Service. This provides features such as automatic variable resolvement. The usage of the Prompt Service is of course optional, as an agent implemented you can also simply define your own data structure if you prefer.\nIn the example above, we also register our prompt template with Theia AI. With this, Theia AI can provide generic features such as the prompt editor, but of course this is again up to the agent implementer whether to register prompts or not.

    \n

    Registering the Agent

    \n

    To integrate our agent with Theia AI, we need to register it. Theia as a platform is modular, so we can just register the agent along with the existing agents via dependency injection, no forking or customization of Theia framework code is required. See also the section on services and contributions and specifically the section on contribution points.\nIn the following code example, we register our agent as an ‘Agent’ and as a ‘ChatAgent’. With this, the simple agent above will already be available in the default chat, you can directly “talk” to it via typing “@Command”. In the current state, it will of course only respond with “I am the command agent”.

    \n
    bind(Agent).toService(CommandChatAgent);\nbind(ChatAgent).toService(CommandChatAgent);
    \n

    Refine your Agent

    \n

    The next step is typically the most effort and it is actually unrelated to Theia AI: You need to develop the behavior of the agent, including one or more prompts that reliably return the expected output.

    \n

    In our example, we want to return an executable Theia command that the user is looking for with their question. For this, we need to augment our prompt with variables (see section “Variables and Tool Functions”) to give the LLM the necessary context information on what Theia commands are available. Moreover, we want this response in a parsable format, so that we can easily detect the command selected by the LLM in its response and provide the user with the option to directly execute the command. See the section “Response Renderers” for more details.

    \n

    Getting such agent implementations right typically requires a bit of prompt evaluation with a set of expected user queries. A huge help in Theia AI is that you can modify the prompt templates at runtime to test different scenarios and tweak the prompt until you are satisfied, instead of changing the prompt templates in the code and need to rebuild after every change.

    \n

    Also, if the underlying LLM supports it, structured output is a huge time saver, as this usually guarantees that the output follows a specific format and avoids coping with variations in your agent’s parsing logic.\nThis guide is focussed on Theia AI and not about developing specific agents per se. If you need support building your own custom AI assistance, please get in contact with a service provider and browse our resource section.

    \n

    Variables and Tool Functions

    \n

    Agents often need to interact with the tool to fetch dynamic data, such as a text selection, project-data or any tool-specific data. Theia AI allows you to encapsulate this data access in Variables, which can then be used in prompts or user requests and will be resolved with the actual data from the tool at runtime. Furthermore, agents can use so-called Tool Functions that allow the underlying LLM to proactively call an action, either to retrieve more information or to trigger any kind of action including the modification of data.

    \n

    Variables

    \n

    Theia AI by default supports two types of variables:

    \n
      \n
    1. Global Variables are available to all agents. Theia and Theia AI already provide a standard set of variables, such as the currently selected text. Tool builders can easily register their own global variables to provide arbitrary additional data from the tool state, including their custom tool components. Global variables can also be used in any prompt template, but are also available to users in the default chat provided by Theia AI, e.g. “#currentText” for the currently selected text.
    2. \n
    3. Agent-specific Variables are only available to specific agents (and in their prompt templates), but not to other agents and also not in the default chat.
    4. \n
    \n

    Agent-specific Variables

    \n

    Agent-specific variables are controlled by a specific agent. To fill a variable with data, you can literally use any internal Theia API or other external APIs or methods you like. As an example, let’s again look at the chat agent that assists users in identifying (and later executing) arbitrary commands in the Theia IDE, such as opening the settings or showing the toolbar. You can review the full code of this agent as a reference.

    \n

    To allow the underlying LLM to identify the right command, we want to send it a list with all available commands. To achieve this, we first retrieve a list of all available commands using the CommandRegistry (see code example below). This step is independent of Theia AI and you could retrieve any sort of data here instead.\nSecond, we resolve the variable ‘command-ids’ when receiving the system prompt’ (also see code example below).

    \n
    // Retrieve all available commands\nconst knownCommands: string[] = [];\nfor (const command of this.commandRegistry.getAllCommands()) {\n   knownCommands.push(`${command.id}: ${command.label}`);\n}\n\n// Resolve the variable when retrieving the system prompt\nconst systemPrompt = await this.promptService.getPrompt('command-chat-agent-system-prompt-template', {\n   'command-ids': knownCommands.join('\\n')\n});
    \n

    Please note that the manual resolvement of variables is not necessary when using global variables.\nNow we can simply use our agent-specific variable in our prompt templates, e.g. like this:

    \n
    You are a service that helps users find commands to execute in an IDE.\n\nThese are the available commands:\nBegin List:\n{{command-ids}}\nEnd List
    \n

    If an agent uses agent-specific variables, it can decide to explicitly declare them. This enables one to keep track of used variables and optionally even show this information to the user (see example screenshot below).

    \n\"Used\n

    To declare an agent-specific variable, simply add it like this in the constructor of your agents, along with an optional description and whether it is used in the prompt template or not.

    \n
    this.agentSpecificVariables = [{\n   name: 'command-ids',\n   description: 'The list of available commands in Theia.',\n   usedInPrompt: true\n}];
    \n

    Global Variables

    \n

    Global variables are available to all agents. Therefore, they are provided as a dedicated contribution. In the following, we will define a simple global variable that resolves to the current date, i.e. to the time when the variable get resolved in a request. You can review the full code of this variable for a complete description.\nA Global variable basically consists of four parts.

    \n

    First, we define the variable, as it can be used in requests. In the following example, we define two optional arguments to influence the format.

    \n
    export const TODAY_VARIABLE: AIVariable = {\n   id: 'today-provider',\n   description: 'Does something for today',\n   name: 'today',\n   args: [\n       { name: TodayVariableArgs.IN_ISO_8601, description: 'Returns the current date in ISO 8601 format' },\n       { name: TodayVariableArgs.IN_UNIX_SECONDS, description: 'Returns the current date in unix seconds format' }\n   ]\n};
    \n

    Second, we register the variable using an ‘AIVariableContribution’ (see code example below). Third, we resolve the variable (also see code example below). Please note that for resolving a variable, you can access all necessary APIs, including tool-specific API or custom services.

    \n
    export class TodayVariableContribution implements AIVariableContribution, AIVariableResolver {\n   // Register the variable resolver\n   registerVariables(service: AIVariableService): void {\n       service.registerResolver(TODAY_VARIABLE, this);\n   }\n\n   async resolve(request: AIVariableResolutionRequest, context: AIVariableContext): Promise<ResolvedAIVariable | undefined> {\n       if (request.variable.name === TODAY_VARIABLE.name) {\n           return this.resolveTodayVariable(request);\n       }\n       return undefined;\n   }\n\n   private resolveTodayVariable(request: AIVariableResolutionRequest): ResolvedTodayVariable {\n       const date = new Date();\n       if (request.arg === TodayVariableArgs.IN_ISO_8601) {\n           return { variable: request.variable, value: date.toISOString(), date };\n       }\n       if (request.arg === TodayVariableArgs.IN_UNIX_SECONDS) {\n           return { variable: request.variable, value: Math.round(date.getTime() / 1000).toString(), date };\n       }\n       return { variable: request.variable, value: date.toDateString(), date };\n   }\n}\n\n...\n\nbind(AIVariableContribution).to(TodayVariableContribution).inSingletonScope();
    \n

    It can now be used in any prompt template, as well as in user requests.

    \n

    Tool Functions

    \n

    Tool functions allow an agent to provide capabilities to the underlying LLM. Compared to variables, it is up to the LLM to decide whether to use an available function or not. Functions can be used to allow the LLM to retrieve additional information or to trigger actions in the tool. Actions can be literally anything you want the LLM to be able to trigger, including modifications of data. Tool Functions can be used in requests, similarly to variables as shown in the following prompt example:

    \n
    Use the following functions to access the workspace:\n- ~{getWorkspaceFileList}\n- ~{getFileContent}.
    \n

    To implement your own tool functions, provide an implementation of interface ‘ToolProvider’, in which you specify the ID, optionally parameters and a handler that represented the function to be called, e.g. like this:

    \n
    @injectable()\nexport class FileContentFunction implements ToolProvider {\n   static ID = FILE_CONTENT_FUNCTION_ID;\n\n   getTool(): ToolRequest {\n       return {\n           id: FileContentFunction.ID,\n           name: FileContentFunction.ID,\n           description: 'Get the content of the file',\n           parameters: {\n               type: 'object',\n               properties: {\n                   file: {\n                       type: 'string',\n                       description: 'The path of the file to retrieve content for',\n                   }\n               }\n           },\n           handler: (arg_string: string) => {\n               const file = this.parseArg(arg_string);\n               return this.getFileContent(file);\n           }\n       };\n   }\n}\n
    \n

    See here for the full example listed above. In the handler, you can call literally any available API to execute arbitrary actions or retrieve arbitrary content, including tool-specific things.

    \n

    Finally, register your ‘ToolProvider’ like this:

    \n
    bind(ToolProvider).to(FileContentFunction);
    \n

    Custom Response Part Rendering

    \n

    This section explains the process of converting an LLM (Large Language Model) response into custom UI controls within the Theia AI default chat (or any custom chat implementation). Custom UI control can be specially highlighted text, clickable buttons or literally anything that you want to display to your users.\nAs an example, we will use the command chat agent used in this documentation before, which is capable of identifying a command in the Theia IDE based on the user's request. We will augment this agent to render commands that the agent returns as buttons. By clicking the button, users can then directly invoke a command.

    \n

    Let’s look at the basic control flow of a chat request in Theia AI (see diagram below). The flow starts with a user request in the default Chat UI (1), which is sent to the underlying LLM (2) to return an answer (3). By default, the agent can forward the response to the Chat UI as-is. However, in our scenario, the agent will parse the response and augment it with a structured response content (4). Based on this, the chat UI can select a corresponding response part renderer to be shown in the UI (5).

    \n\"Request\n

    In the following, we will dive into the details on how to implement this flow.

    \n

    Develop a Reliable Prompt

    \n

    The first step to enable structured response parsing is developing a prompt that reliably returns the expected output. In this case, the output should include an executable Theia command related to the user's question in JSON format. The response needs to be in a parsable format, allowing the system to detect the command and provide the user with the option to execute it.

    \n

    An simplified example of such a prompt might look like the following (you can review the full prompt template here)

    \n
    You are a service that helps users find commands to execute in an IDE.  \nYou reply with stringified JSON Objects that tell the user which command to execute and its arguments, if any.\n\nExample:\n\n\\`\\`\\`json\n{\n   \"type\": \"theia-command\",\n   \"commandId\": \"workbench.action.selectIconTheme\"\n}\n\\`\\`\\`\n\nHere are the known Theia commands:\n\nBegin List:  \n{{command-ids}}\nEnd List
    \n

    As described in the previous section the variable {{command-ids}} is dynamically populated with the list of available commands.

    \n

    Parse the Response and Transform into Response Content

    \n

    After receiving the LLM response, the next step is to parse it in the agent implementation and transform it into a response content that can then be processed by the Chat UI. In the following code example:

    \n
      \n
    • The LLM response is parsed into a command object.
    • \n
    • The Theia command corresponding to the parsed command ID is retrieved.
    • \n
    • A CommandChatResponseContentImpl object is created to wrap the command.
    • \n
    \n

    You can review the parsing code, including error handling here)

    \n

    Example code:

    \n
    const parsedCommand = JSON.parse(jsonString) as ParsedCommand;\nconst theiaCommand = this.commandRegistry.getCommand(parsedCommand.commandId);\nreturn new CommandChatResponseContentImpl(theiaCommand);
    \n

    Please note that a chat response can contain a list of response parts, allowing various UI components to be mixed with actionable response components.

    \n

    Parse Parts of the Response into Different Response Contents

    \n

    To simplify parsing an overall response from the LLM into different parts that you want to display with specific UI components, you can add so-called response content matchers. These matchers allow you to define a regular expression that matches a specific part of the response and then transform this part into a dedicated response content. This is especially useful if you want to display different parts of the response in different ways, e.g. as a highlighted code, buttons, etc.

    \n

    In the following example code, we define a response content matcher that matches text within <question> elements in the response and transforms them into specific QuestionResponseContentImpl objects. You can review the full code in the AskAndContinueAgent API example.

    \n

    In your chat agent, you can register a response content matcher like this:

    \n
    @postConstruct()\naddContentMatchers(): void {\n    this.contentMatchers.push({\n        start: /^<question>.*$/m,\n        end: /^<\\/question>$/m,\n        contentFactory: (content: string, request: ChatRequestModelImpl) => {\n            const question = content.replace(/^<question>\\n|<\\/question>$/g, '');\n            const parsedQuestion = JSON.parse(question);\n            return new QuestionResponseContentImpl(parsedQuestion.question, parsedQuestion.options, request, selectedOption => {\n                this.handleAnswer(selectedOption, request);\n            });\n        }\n    });\n}\n
    \n

    This matcher will be invoked by the common response parser if it finds occurrences of the start and end regular expressions in the response. The contentFactory function is then invoked to transform the matched content into a specific response content object.

    \n

    Create and Register a Response Part Renderer

    \n

    The final step is to display a button in the Chat UI to allow users to execute the command. This is done by creating a new Response Part Renderer. The renderer is registered to handle CommandChatResponseContent, ensuring that the Chat UI calls it whenever a corresponding content type is part of the response.

    \n

    The following example code shows the corresponding response renderer, you can review the full code here.

    \n
      \n
    • canHandle Method: Determines whether the renderer can handle the response part. If the response is of type CommandChatResponseContent, it returns a positive value, indicating it can process the content.
    • \n
    • render Method: Displays a button if the command is enabled. If the command is not executable globally, a message is shown.
    • \n
    • onCommand Method: Executes the command when the button is clicked.
    • \n
    \n
    canHandle(response: ChatResponseContent): number {\n    if (isCommandChatResponseContent(response)) {\n        return 10;\n    }\n    return -1;\n}\n\nrender(response: CommandChatResponseContent): ReactNode {\n    const isCommandEnabled = this.commandRegistry.isEnabled(response.command.id);\n    return (\n        isCommandEnabled ? (\n            <button className='theia-button main' onClick={this.onCommand.bind(this)}>{response.command.label}</button>\n        ) : (\n            <div>The command has the id \"{response.command.id}\" but it is not executable globally from the Chat window.</div>\n        )\n    );\n}\n\nprivate onCommand(arg: AIChatCommandArguments): void {\n    this.commandService.executeCommand(arg.command.id);\n}
    \n

    Finally, the custom response renderer needs to be registered:

    \n
    bind(ChatResponsePartRenderer).to(CommandPartRenderer).inSingletonScope();
    \n

    By following the steps outlined, you can transform an LLM response into custom and optionally actionable UI controls within Theia AI. See the Theia IDE documentation on how the example looks integrated in a tool.\nThis approach enables users to interact with the AI-powered Chat UI more efficiently, e.g. allowing executing commands directly from the suggestions provided.

    \n

    Managing the State of a Chat Response

    \n

    Theia AI provides a mechanism for chat agents to manage the state of a chat response. A chat response has the following states:

    \n
      \n
    • isComplete: boolean
    • \n
    • isWaitingForInput: boolean
    • \n
    • isError: boolean
    • \n
    \n

    If all are false, the chat interface will show Generating... until either an error occurs or the response is complete. While the response is in progress, users can only cancel the request. Once isComplete is set to true, the response is final and users can submit new requests. In your chat agent you can control the state via request.response.cancel(), request.response.complete(), and request.response.error().

    \n

    Progress Messages

    \n

    In addition you can also show progress messages in the response to the user:

    \n
    const progressMessage = request.response.addProgressMessage({ content: 'Analyzing your request...', show: 'whileIncomplete' });\n// do your work\n// if you are done, you can update the message\nrequest.response.updateProgressMessage({ ...progressMessage, show: 'whileIncomplete', status: 'completed' });\n
    \n

    With the show property, you can control whether your message is shown untilFirstContent, whileIncomplete, or forever.

    \n

    Waiting for Input

    \n

    Especially in more agentic interactions, you might need input from the user, without completing the response. Typical use cases are confirmation dialogs, asking the user to select among defined options, etc. before continuing the request. In this case, you can render a content part with which you ask the user for input (e.g. with the QuestionResponseContentImpl) and set the response into a waiting-for-input state without completing it, to signalize the response is not complete yet, but you are waiting for user input.

    \n

    In your chat agent implementation, you can use the onResponseComplete() hook, which will be invoked when the LLM response is completed. In this hook, you can check if you need to wait for input and set the response to isWaitingForInput:

    \n
    protected override async onResponseComplete(request: ChatRequestModelImpl): Promise<void> {\n    const unansweredQs = unansweredQuestions(request);\n    if (unansweredQs.length < 1) {\n        return super.onResponseComplete(request); // completes the response\n    }\n    request.response.addProgressMessage({ content: 'Waiting for input...', show: 'whileIncomplete' });\n    request.response.waitForInput();\n}
    \n

    In combination with the custom response part rendering (see above), this enables arbitrarily complex interactions with the user, including multi-step interactions, confirmation dialogs, and more. A simple example is available in the AskAndContinueChatAgent, which implements an interactive chat agent that asks the user for input and continues the conversation based on the user's response.

    \n\"Ask\n

    Custom LLM Provider

    \n

    Theia AI currently provides out-of-the-box support for any OpenAI-compatible LLM services (including the OpenAI models hosted by OpenAI or self-hosted compatible LLMs), Hugging Face, Ollama LLMs and Llamafile.

    \n

    Note: Theia AI enables connections to various models. However, be aware that some models may require specific customizations and optimizations to perform well in all scenarios. If you encounter issues implementing those customizations, please provide feedback.

    \n

    Learn more about which LLM providers are supported out of the box in at the example of the Theia IDE, which allows end users to configure the used LLM per agent. Of course, as a tool provider you can choose whether you provide this configurability to end users.

    \n

    As a tool provider, you can easily add support for additional LLM APIs too. Please consider contributing your additional LLM providers to the open source project, so that the community can benefit from increased compatibility and share the maintenance cost.

    \n

    To support a specific LLM API, you basically need to provide an implementation of the interface ‘LanguageModel’, which provides an abstraction between agents and the underlying LLM. This language model implementation then needs to be registered at the ‘LanguageModelRegistry’, to make it retrievable for agents as follows:

    \n
    this.languageModelRegistry.addLanguageModels([new OllamaModel()]);
    \n

    If you want to allow the user to configure the LLM provider, e.g. change the URL or the available models, consider integrating your LLM provider with Theias preference system.

    \n

    For further details, we recommend reviewing the available LLM provider in Theia AI:

    \n\n

    Please note that Theia AI currently does not provide a fixed contribution point for Language Models, yet. This is due to the fact that we are working on supporting more models and also capabilities of new LLMs are emerging at the moment, such as function calling and structured output. We plan to consolidate the LLM Provider interfaces within the next months while adding more LLM Providers to the core framework. We are happy for feedback and contributions in this area.

    \n

    Change Sets

    \n

    Change sets in Theia AI provide a mechanism for AI agents (and therefore the underlying LLMs) to propose changes to users. These proposed changes can then be reviewed, accepted, refined, or declined by the user. Theia AI offers framework support for generic change sets, a default UI integrated in the generic, reusable chat interface and Theia AI includes a default implementation for file-based changes. This default implementation is utilized in the Theia IDE, particularly with the Theia Coder agent. However, adopters can provide alternative implementations to handle different types of changes, such as modifications to databases, structured models, or other domain-specific data.

    \n

    Example usage of Change Sets

    \n

    The following example demonstrates how agents can propose file modifications using a change set. Please have a look at the full example for using change sets in agents.

    \n
    override async invoke(request: ChatRequestModelImpl): Promise<void> {\n        // ...\n        const fileToAdd = root.resource.resolve('hello/new-file.txt');\n        const fileToChange = // some file to change\n        const fileToDelete = // Some file to delete\n\n        const chatSessionId = request.session.id;\n        const changeSet = new ChangeSetImpl('My Test Change Set');\n        changeSet.addElement(\n            this.fileChangeFactory({\n                uri: fileToAdd,\n                type: 'add',\n                state: 'pending',\n                targetState: 'Hello World!',\n                changeSet,\n                chatSessionId\n            })\n        );\n\n        if (fileToChange && fileToChange.resource) {\n            changeSet.addElement(\n                this.fileChangeFactory({\n                    uri: fileToChange.resource,\n                    type: 'modify',\n                    state: 'pending',\n                    targetState: await this.computeTargetState(fileToChange.resource),\n                    changeSet,\n                    chatSessionId\n                })\n            );\n        }\n        if (fileToDelete && fileToDelete.resource) {\n            changeSet.addElement(\n                this.fileChangeFactory({\n                    uri: fileToDelete.resource,\n                    type: 'delete',\n                    state: 'pending',\n                    changeSet,\n                    chatSessionId\n                })\n            );\n        }\n        request.session.setChangeSet(changeSet);\n        request.response.complete();\n}
    \n

    This example demonstrates how:

    \n
      \n
    • A change set is created
    • \n
    • An example file element of all available types (add, modify, or delete) is added.
    • \n
    • A proposed change is added to the change set for user review.
    • \n
    \n

    Another example to look at is the Theia Coder agent which proposes file modifications using a change set. In this use case, the change set creation is embedded in a tool function that Coder provides to the LLM (see also the full code). So in this workflow, the LLM can directly create and augment change sets.

    \n

    Custom Change Set Elements

    \n

    Adopters can implement their own version of 'ChangeSetElement' to manage domain-specific changes while leveraging the existing review and approval workflow. This will still allow to use the generic change set and the default Chat UI provided by Theia AI. To provide custom type of 'ChangeSetElement', implement the respective interface and add your custom elements to the default change set.

    \n

    Custom change set element implementations are identified by a uri, have full control over their presentation (label, icon, additional information), and can specify whether and how actions, such as open, open change, accept and discard are implemented. See ChangeSetElement interface for more details.

    \n

    Learn more

    \n

    If want to learn more about the AI support in the Theia AI, please see this Theia AI introduction, our article on the vision of Theia AI and the demonstrations in Sneak Preview Series about Theia AI

    ","fields":{"slug":"theia_ai"}}},"pageContext":{"slug":"theia_ai"}},"staticQueryHashes":["2468095761"],"slicesMap":{}} \ No newline at end of file diff --git a/pr-previews/pr-707/page-data/docs/theia_coder/page-data.json b/pr-previews/pr-707/page-data/docs/theia_coder/page-data.json new file mode 100644 index 00000000..1e123138 --- /dev/null +++ b/pr-previews/pr-707/page-data/docs/theia_coder/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-doc-js","path":"/docs/theia_coder/","result":{"data":{"markdownRemark":{"frontmatter":{"title":"Theia Coder, AI-Powered Development in the Theia IDE"},"html":"

    Theia Coder: AI-Powered Development in the Theia IDE

    \n

    This page provides details about the Theia Coder agent in the Theia IDE, please also refer to the general introduction to the AI features in the Theia IDE.\nTheia Coder is an AI-powered coding agent integrated into the Theia IDE, currently released as a preview version. To improve and refine it, please provide feedback. The preview comes with two prompt variants:

    \n
      \n
    • Default: Coder will always replace full files when proposing changes. This might be slow but is accurate in most cases.
    • \n
    • coder-search-replace: Coder can also search and replace for faster editing. This is faster in many cases, but Coder might need several attempts.
    • \n
    \n

    We recommend trying the \"coder-search-replace\" prompt and switching back to the default if you find issues. You can change this setting in the AI configuration view under \"Coder\" => \"Prompt Templates\".

    \n

    Using Theia Coder

    \n

    Theia Coder functions as a chat agent within Theia AI Chat. To interact with it, simply reference it using @Coder in the chat.

    \n

    Key Capabilities

    \n
      \n
    1. Retrieving Context: Coder can browse the current workspace to find relevant code.
    2. \n
    3. Proposing Changes: It provides structured code modifications that users can review and apply automatically.
    4. \n
    \n

    In the following example video, we provide a simple task to Coder to demonstrate the full work flow.

    \n\"Demo\n

    Describing Programming Tasks

    \n

    To use Theia Coder effectively, describe your programming task in clear natural language. Coder will search your workspace for relevant code, but you can improve efficiency by specifying key locations, such as:

    \n
      \n
    • Code files that need to be modified
    • \n
    • Supporting files that contribute to understanding the task (e.g., interface definitions or similar implementations)
    • \n
    \n

    Ways to Specify Relevant Context

    \n

    Please note that we are currently working on making context creation even more efficient by allowing users to drag and drop files as well as using keyboard shortcuts.

    \n

    There are multiple ways to help Coder find the right files efficiently:

    \n

    1. Natural Language

    \n

    You can describe the location in plain text, such as:

    \n
    \n

    \"In the ai-mcp package under src/browser.\"

    \n
    \n

    While Coder will still need to search, this helps it focus on the right area.

    \n

    2. Providing Relative File Paths

    \n

    Copy and paste a file's relative path into the chat to directly guide Coder to a specific file. You can obtain this by right-clicking a file or editor tab and selecting \"Copy Relative Path.\"

    \n

    3. Using Context Variables

    \n

    Theia Coder supports predefined variables that dynamically provide relevant context:

    \n
      \n
    • #relativeFile – The relative path of the currently selected file (in the editor or explorer)
    • \n
    • #relativeFileDirname – The directory path of the currently selected file
    • \n
    • #selectedText – The currently highlighted text in the editor
    • \n
    \n

    Reviewing and Applying Code Changes

    \n

    Based on your task and the provided context, Theia Coder generates proposed code changes. This process may take some time. For transparency, you can observe which files Coder accesses in the chat.

    \n

    To apply changes, Theia Coder utilizes Theia AI’s changeset feature:

    \n
      \n
    • A list of modified files appears above the chat input field.
    • \n
    • Click on an entry to view a diff editor, comparing the previous and new state.
    • \n
    • In the diff editor, selectively apply changes.
    • \n
    • Alternatively, apply or revert changes directly from the changeset overview.
    • \n
    • If needed, you can clear individual changes or the entire changeset.
    • \n
    \n

    Summary

    \n

    Theia Coder enhances AI-driven development by:

    \n
      \n
    • Understanding natural language requests
    • \n
    • Browsing workspace context
    • \n
    • Generating structured code modifications
    • \n
    • Providing an intuitive interface for reviewing and applying changes
    • \n
    \n

    Please remember that Theia Coder is currently released as a preview version. To improve and refine it, please provide feedback.

    \n

    Please also note that Theia Coder is built on Theia AI, a flexible framework for build AI-powered tools and IDEs. You can easily adopt or extend Theia Coder or build a similar agent for your own use case with ease.

    ","fields":{"slug":"theia_coder"}}},"pageContext":{"slug":"theia_coder"}},"staticQueryHashes":["2468095761"],"slicesMap":{}} \ No newline at end of file diff --git a/pr-previews/pr-707/page-data/docs/user_ai/page-data.json b/pr-previews/pr-707/page-data/docs/user_ai/page-data.json index cd426414..e4a075f7 100644 --- a/pr-previews/pr-707/page-data/docs/user_ai/page-data.json +++ b/pr-previews/pr-707/page-data/docs/user_ai/page-data.json @@ -1 +1 @@ -{"componentChunkName":"component---src-templates-doc-js","path":"/docs/user_ai/","result":{"data":{"markdownRemark":{"frontmatter":{"title":"Using the AI Features in the Theia IDE as an End User"},"html":"

    Using the AI Features in the Theia IDE as an End User

    \n

    This section documents how to use AI features in the Theia IDE (available since version 1.54, see also this introduction). These features are based on Theia AI, a framework for building AI assistance in tools and IDEs. Theia AI is part of the Theia platform. If you're interested in building your own custom tool or IDE with Theia AI, please refer to the corresponding documentation.

    \n

    Please note that these features are in early access and experimental. This means they may be unstable, behave unexpectedly, or undergo significant changes. In particular, using your own LLM might incur costs that you need to monitor closely. We have not yet optimized the AI assistants in the Theia IDE for token usage. Use these features at your own risk, and we welcome any feedback, suggestions, and contributions!

    \n

    Theia AI features within the Theia IDE are currently disabled by default. See the next section on how to enable them.

    \n

    Table of Contents

    \n\n

    Set-Up

    \n

    To activate AI support in the Theia IDE, go to Preferences and enable the setting “AI-features => AI Enable.”

    \n

    To use Theia AI within the Theia IDE, you need to provide access to at least one LLM. Theia IDE comes with preinstalled support for OpenAI API-compatible models, either hosted by OpenAI or self-hosted via VLLM. Additionally, Theia IDE supports connecting to models via Ollama. See the corresponding sections below on how to configure these providers.

    \n

    Other LLM providers, including local models, can be added easily. If you would like to see support for a specific LLM, please provide feedback or consider contributing.

    \n

    Each LLM provider offers a configurable list of available models (see the screenshot below for Hugging Face Models models). To use a model in your IDE, configure it on a per-agent basis in the AI Configuration view.

    \n

    Note: Theia IDE enables connections to various models (e.g., HuggingFace, custom OpenAPI models, LlamaFile). However, not all models may work out of the box, as they may require specific customizations or optimizations. If you encounter issues, please provide feedback, keeping in mind this is an early-phase feature.

    \n

    OpenAI (Hosted by OpenAI)

    \n

    To enable the use of OpenAI, you need to create an API key in your OpenAI account and enter it in the settings AI-features => OpenAiOfficial (see the screenshot below).\nPlease note: By using this preference the Open AI API key will be stored in clear text on the machine running Theia. Use the environment variable OPENAI_API_KEY to set the key securely.\nPlease also note that creating an API key requires a paid subscription, and using these models may incur additional costs. Be sure to monitor your usage carefully to avoid unexpected charges. We have not yet optimized the AI assistants in the Theia IDE for token usage.

    \n\"Open\n

    The OpenAI provider is preconfigured with a list of available models. You can easily add new models to this list, for example, if new options are released.

    \n

    OpenAI Compatible Models (e.g. via VLLM)

    \n

    As an alternative to using an official OpenAI account, Theia IDE also supports arbitrary models compatible with the OpenAI API (e.g., hosted via VLLM). This enables you to connect to self-hosted models with ease. To add a custom model, click on the link in the settings section and add your configuration like this:

    \n
    {\n   \"ai-features.openAiCustom.customOpenAiModels\": [\n       {\n           \"model\": \"your-model-name\",\n           \"url\": \"your-URL\",\n           \"id\": \"your-unique-id\", // Optional: if not provided, the model name will be used as the ID\n           \"apiKey\": \"your-api-key\" // Optional: use 'true' to apply the global OpenAI API key\n       }\n   ]\n}
    \n

    Anthropic

    \n

    To enable Anthropics AI models in the Theia IDE, create an API key in your Anthropics account and\nenter it in the Theia IDE settings under AI-features => Anthropics.

    \n

    Please note: The Anthropics API key will be stored in clear text. Use the environment variable ANTHROPIC_API_KEY to set the key securely.

    \n

    Configure available models in the settings under AI-features => AnthropicsModels.\nDefault supported models include choices like claude-3-5-sonnet-latest.\nPlease note that the Anthropic LLM provider currently does not yet support tool calls, this will be added soon.

    \n

    Hugging Face

    \n

    To enable Hugging Face as an AI provider, you need to create an API key in your Hugging Face account and enter it in the Theia IDE settings: AI-features => Hugging Face\nPlease note: By using this preference the Hugging Face API key will be stored in clear text on the machine running Theia. Use the environment variable HUGGINGFACE_API_KEY to set the key securely.\nNote also that Hugging Face offers both paid and free-tier options (including \"serverless\"), and usage limits vary. Monitor your usage carefully to avoid unexpected costs, especially when using high-demand models.\nAdd or remove the desired Hugging Face models from the list of available models (see screenshot below). Please note that there is a copy button in the Hugging face UI to copy model IDs to the clipboard.

    \n\"Hugging\n

    LlamaFile Models

    \n

    To configure a LlamaFile LLM in the Theia IDE, add the necessary settings to your configuration (see example below)

    \n
    {\n   \"ai-features.llamafile.llamafiles\": [\n       {\n           \"name\": \"modelname\", //you can choose a name for your model\n           \"uri\": \"file:///home/.../YourModel.llamafile\",\n           \"port\": 30000 //you can choose a port to be used by llamafile\n       }\n   ]\n}
    \n

    Replace \"name\", \"uri\", and \"port\" with your specific LlamaFile details.

    \n

    The Theia IDE also offers convenience commands to start and stop your LlamaFiles:

    \n
      \n
    • Start a LlamaFile: Use the command \"Start Llamafile\", then select the model you want to start.
    • \n
    • Stop a LlamaFile: Use the \"Stop Llamafile\" command, then select the running Llamafile which you want to terminate.
    • \n
    \n

    Please make sure that your LlamaFiles are executable.\nFor more details on LlamaFiles, including a quickstart, see the official Mozilla LlamaFile documentation.

    \n

    Ollama

    \n

    To connect to models hosted via Ollama, enter the corresponding URL, along with the available models, in the settings (as shown below).

    \n\"Ollama\n

    Custom Request Settings

    \n

    You can define custom request settings for specific language models in the Theia IDE to tailor how models handle requests, based on their provider.

    \n

    Add the settings in settings.json:

    \n
    \"ai-features.modelSettings.requestSettings\": [\n    {\n        \"modelId\": \"Qwen/Qwen2.5-Coder-32B-Instruct\",\n        \"requestSettings\": { \"max_new_tokens\": 2048 },\n        \"providerId\": \"huggingface\"\n    },\n    {\n        \"modelId\": \"gemma2\",\n        \"requestSettings\": { \"stop\": [\"<file_sep>\"] },\n        \"providerId\": \"ollama\"\n    }\n]
    \n

    Or navigate in the settings view to ModelSettings => Request Settings.

    \n

    Key Fields

    \n
      \n
    • modelId: The unique identifier of the model.
    • \n
    • requestSettings: Provider-specific options, such as token limits or stopping criteria.
    • \n
    • providerId: (Optional) Specifies the provider for the settings (e.g., huggingface, ollama, openai). If omitted, settings apply to all providers that match the modelId.
    • \n
    \n

    Valid options for requestSettings depend on the model provider.

    \n

    Current Agents in the Theia IDE

    \n

    This section provides an overview of the currently available agents in the Theia IDE. Agents marked as “Chat Agents” are available in the global chat, while others are directly integrated into UI elements, such as code completion. You can configure and deactivate agents in the AI Configuration view.

    \n

    Universal (Chat Agent)

    \n

    This agent helps developers by providing concise and accurate answers to general programming and software development questions. It also serves as a fallback for generic user questions. By default, this agent does not have access to the current user context or workspace. However, you can add variables, such as #selectedText, to your requests to provide additional context.

    \n

    Orchestrator (Chat Agent)

    \n

    This agent analyzes user requests against the descriptions of all available chat agents and selects the best-fitting agent to respond (using AI). The user's request is delegated to the selected agent without further confirmation. The Orchestrator is currently the default agent in the Theia IDE for all chat requests. You can deactivate it in the AI Configuration View.

    \n

    Command (Chat Agent)

    \n

    This agent is aware of all commands available in the Theia IDE and the current tool the user is working with. Based on the user request, it can find the appropriate command and let the user execute it.

    \n

    Workspace (Chat Agent)

    \n

    This agent can access the user's workspace, retrieve a list of all available files, and view their content. It can answer questions about the current project, including project files and source code in the workspace, such as how to build the project, where to place source code, or where to find specific files or configurations.

    \n

    Code Completion (Agent)

    \n

    This agent provides inline code completion within the Theia IDE's code editor. By default, automatic inline completion is disabled to give users greater control over how AI code suggestions are presented. Users can manually trigger inline completion via the default key binding Ctrl+Alt+Space (adaptable). Requests are canceled when moving the cursor.

    \n

    Users who prefer continuous suggestions can enable 'Automatic Code Completion' in the settings ('AIFeatures'=>'CodeCompletion'). This agent makes continuous requests to the underlying LLM while coding if automatic suggestions are enabled.

    \n

    In the settings, you can also specify 'Excluded File Extensions' for which the AI-powered code completion will be deactivated.

    \n

    Finally, the setting 'Max Context Lines' allows you to configure the maximum number of lines used for AI code completion context. This setting can be adjusted to customize the size of the context provided to the model, which is especially useful when using smaller models with limited token capacity.

    \n

    Terminal Assistance (Agent)

    \n

    This agent assists with writing and executing terminal commands. Based on the user's request, it suggests commands and allows them to be directly pasted and executed in the terminal. It can access the current directory, environment, and recent terminal output to provide context-aware assistance. You can open the terminal assistance agent via Ctrl+I in the terminal view.

    \n

    Chat

    \n

    The Theia IDE provides a global chat interface where users can interact with all chat agents. The Orchestrator automatically delegates user requests to the most appropriate agent. To send a request directly to a specific agent, mention the agent's name using '@', for example, '@Command'. Press '@' in the chat to see a list of available chat agents.

    \n\"General\n

    Some agents produce special results, such as buttons (shown in the screenshot above) or code that can be directly inserted. You can augment your requests in the chat with context by using variables. For example, to refer to the currently selected text, use #selectedText in your request. Pressing '#' in the chat will show a list of available variables.

    \n

    AI Configuration

    \n

    The AI Configuration View allows you to review and adapt agent-specific settings. Select an agent on the left side and review its properties on the right:

    \n
      \n
    • Enable Agent: Disabled agents will no longer be available in the chat or UI elements. Disabled agents also won't make any requests to LLMs.
    • \n
    • Edit Prompts: Click \"Edit\" to open the prompt template editor, where you can customize the agent's prompts (see the section below). \"Reset\" will revert the prompt to its default.
    • \n
    • Language Model: Select which language model the agent sends its requests to. Some agents have multiple \"purposes,\" allowing you to select a model for each purpose.
    • \n
    • Variables and Functions: Review the variables and functions used by an agent. Global variables are shared across agents, and they are listed in the second tab of the AI Configuration View. Agent-specific variables are declared and used exclusively by one agent.
    • \n
    \n\"AI\n

    View and Modify Prompts

    \n

    In the Theia IDE, you can open and edit prompts for all agents from the AI Configuration View. Prompts are shown in a text editor (see the screenshot below). Changes saved in the prompt editor will take effect with the next request made to the corresponding agent. You can reset a prompt to its default using the \"Reset\" button in the AI configuration view or the \"Revert\" toolbar item in the prompt editor (top-right corner).

    \n\"Prompt\n

    Variables and functions can be used in prompts. Variables are replaced with context-specific information at the time of the request (e.g., the currently selected text), while functions can trigger actions or retrieve additional information. You can find an overview of all global variables in the \"Variables\" tab of the AI Configuration View and agent-specific variables in the agent's configuration.

    \n

    Variables are used with the following syntax:

    \n
    {{variableName}}
    \n

    Tool functions are used with the following syntax:

    \n
    ~{functionName}
    \n

    Custom Agents

    \n

    Custom agents enable users to define new chat agents with custom prompts on the fly, allowing the creation of custom workflows and extending the Theia IDE with new capabilities. These agents are immediately available in the default chat.

    \n

    To define a new custom agent, navigate to the AI Configuration View and click on \"Add Custom Agent\".

    \n\"Add\n

    This action opens a YAML file where all available custom agents are defined. Below is an example configuration:

    \n
    - id: obfuscator\n  name: Obfuscator\n  description: This is an example agent. Please adapt the properties to fit your needs.\n  prompt: Obfuscate the following code so that no human can understand it anymore. Preserve the functionality.\n  defaultLLM: openai/gpt-4o
    \n
      \n
    • id: A unique identifier for the agent.
    • \n
    • name: The display name of the agent.
    • \n
    • description: A brief explanation of what the agent does.
    • \n
    • prompt: The default prompt that the agent will use for processing requests.
    • \n
    • defaultLLM: The language model used by default.
    • \n
    \n

    Custom agents can be configured in the AI Configuration View just like other chat agents. You can enable/disable them, modify their prompt templates, and integrate variables and functions within these templates to enhance functionality.

    \n

    Here is the updated MCP Integration section with the requested changes:

    \n

    MCP Integration

    \n

    The Theia IDE now supports an with the Model Context Protocol (MCP), enabling users to configure and utilize external services in their AI workflows.\nPlease note: While this integration does not yet include MCP servers in any standard prompts, it already allows end users to explore the MCP ecosystem and discover interesting new use cases. In the future, we plan to provide ready-to-use prompts using MCP servers and support auto-starting configured servers.

    \n

    To learn more about MCP, see the official announcement from Anthropic.
    \nFor a list of available MCP servers, visit the MCP Servers Repository.

    \n

    Configuring MCP Servers

    \n

    To configure MCP servers, open the preferences and add entries to the MCP Servers Configuration section. Each server requires a unique identifier (e.g., \"brave-search\" or \"filesystem\") and configuration details such as the command, arguments, and optional environment variables. For Windows users, please see the additional information below

    \n

    Example Configuration:

    \n
    {\n  \"brave-search\": {\n    \"command\": \"npx\",\n    \"args\": [\n      \"-y\",\n      \"@modelcontextprotocol/server-brave-search\"\n    ],\n    \"env\": {\n      \"BRAVE_API_KEY\": \"YOUR_API_KEY\"\n    }\n  },\n  \"filesystem\": {\n    \"command\": \"npx\",\n    \"args\": [\"-y\", \"@modelcontextprotocol/server-filesystem\", \"/Users/YOUR_USERNAME/Desktop\"],\n    \"env\": {\n      \"CUSTOM_ENV_VAR\": \"custom-value\"\n    }\n  }\n}
    \n

    The configuration options include:

    \n
      \n
    • command: The executable used to start the server (e.g., npx).
    • \n
    • args: An array of arguments passed to the command.
    • \n
    • env: An optional set of environment variables for the server.
    • \n
    \n

    Note for Windows users: On Windows, you need to start a command interpreter (e.g. cmd.exe) as the server command in order for path lookups to work as expected. The effective command line is then passed as an argument. For example:

    \n
    \"filesystem\": {\n    \"command\": \"cmd\",\n    \"args\": [\"/C\", \"npx -y @modelcontextprotocol/server-filesystem /Users/YOUR_USERNAME/Desktop\"],\n    \"env\": {\n      \"CUSTOM_ENV_VAR\": \"custom-value\"\n    }\n  }
    \n

    Starting and Stopping MCP Servers

    \n

    Theia provides commands to manage MCP servers:

    \n
      \n
    • Start MCP Server: Use the command \"MCP: Start MCP Server\" to start a server. The system displays a list of available servers to select from.
    • \n
    • Stop MCP Server: Use the command \"MCP: Stop MCP Server\" to stop a running server.
    • \n
    \n

    When a server starts, a notification is displayed confirming the operation, and the functions made available.

    \n

    Using MCP Server Functions

    \n

    Once a server is running, its functions can be invoked in prompts using the following syntax:

    \n
    ~{mcp_<server-name>_<function-name>}
    \n
      \n
    • mcp: Prefix for all MCP commands.
    • \n
    • <server-name>: The unique identifier of the server (e.g., brave-search).
    • \n
    • <function-name>: The specific function exposed by the server (e.g., brave_web_search).
    • \n
    \n

    Example:

    \n

    To use the brave_web_search function of the brave-search server, you can write:

    \n
    ~{mcp_brave-search_brave_web_search}
    \n

    This allows you to seamlessly integrate external services into your AI workflows within the Theia IDE.

    \n

    SCANOSS

    \n

    The Theia IDE (and Theia AI) integrates a code scanner powered by SCANOSS, enabling developers to analyze generated code snippets for open-source compliance and licensing. This feature helps developers understand potential licensing implications when using generated code in the Chat view.

    \n

    Please note: This feature sends a hash of suggested code snippets to the SCANOSS service hosted by the Software Transparency Foundation for analysis. While the service is free to use, very high usage may trigger rate limiting (unlikely for individual developers). Additionally, neither Theia nor SCANOSS can guarantee that no license implications exist, even if no issues are detected during the scan.

    \n

    Configure SCANOSS in the Theia IDE

    \n
      \n
    1. Open the Settings panel in the Theia IDE.
    2. \n
    3. Navigate to SCANOSS Mode under the AI Features section.
    4. \n
    5. Select the desired mode:\n
        \n
      • Off: Disables SCANOSS completely.
      • \n
      • Manual: Allows users to trigger scans manually via the SCANOSS button on generated code snippets in the Chat view.
      • \n
      • Automatic: Automatically scans generated code snippets in the Chat view.
      • \n
      \n
    6. \n
    \n

    Manual Scanning

    \n

    To manually scan a code snippet:

    \n
      \n
    1. Generate a code snippet in the AI Chat view.
    2. \n
    3. Click the SCANOSS button in the toolbar of the code renderer embedded in the Chat view.
    4. \n
    5. A result icon will appear:\n
        \n
      • A warning icon if a match is found.
      • \n
      • A green check mark if no matches are found.
      • \n
      \n
    6. \n
    7. If a warning icon is displayed, click the SCANOSS button again to view detailed scan results in a popup window.
    8. \n
    \n\"Scanning\n

    Automatic Scanning

    \n

    In Automatic mode, SCANOSS scans code snippets in the background whenever they are generated in the Chat view. Results are displayed immediately, indicating whether any matches are found.

    \n

    Understanding SCANOSS Results

    \n

    After a scan is completed, SCANOSS provides a detailed summary, including:

    \n
      \n
    • Match Percentage: The degree of similarity between the scanned snippet and the code in the database.
    • \n
    • Matched File: The file or project containing the matched code.
    • \n
    • Licenses: A list of licenses associated with the matched code, including links to detailed license terms.
    • \n
    \n

    AI History

    \n

    The AI History view allows you to review all communications between agents and underlying LLMs. Select the corresponding agent at the top to see all its requests in the section below.

    \n\"AI\n

    Learn more

    \n

    If want to learn more about the AI support in the Theia AI, please see this introduction, our article on the vision of Theia AI and the demonstrations in Sneak Preview Series about Theia AI

    ","fields":{"slug":"user_ai"}}},"pageContext":{"slug":"user_ai"}},"staticQueryHashes":["2468095761"],"slicesMap":{}} \ No newline at end of file +{"componentChunkName":"component---src-templates-doc-js","path":"/docs/user_ai/","result":{"data":{"markdownRemark":{"frontmatter":{"title":"Using the AI Features in the Theia IDE as an End User"},"html":"

    Using the AI Features in the Theia IDE as an End User

    \n

    This section documents how to use AI features in the Theia IDE (available since version 1.54, see also this introduction). These features are based on Theia AI, a framework for building AI assistance in tools and IDEs. Theia AI is part of the Theia platform. If you're interested in building your own custom tool or IDE with Theia AI, please refer to the corresponding documentation.

    \n

    Please note that these features are in early access and experimental. This means they may be unstable, behave unexpectedly, or undergo significant changes. In particular, using your own LLM might incur costs that you need to monitor closely. We have not yet optimized the AI assistants in the Theia IDE for token usage. Use these features at your own risk, and we welcome any feedback, suggestions, and contributions!

    \n

    Theia AI features within the Theia IDE are currently disabled by default. See the next section on how to enable them.

    \n

    Table of Contents

    \n\n

    Set-Up

    \n

    To activate AI support in the Theia IDE, go to Preferences and enable the setting “AI-features => AI Enable.”

    \n

    To use Theia AI within the Theia IDE, you need to provide access to at least one LLM. Theia IDE comes with preinstalled support for OpenAI API-compatible models, either hosted by OpenAI or self-hosted via VLLM. Additionally, Theia IDE supports connecting to models via Ollama. See the corresponding sections below on how to configure these providers.

    \n

    Other LLM providers, including local models, can be added easily. If you would like to see support for a specific LLM, please provide feedback or consider contributing.

    \n

    Each LLM provider offers a configurable list of available models (see the screenshot below for Hugging Face Models models). To use a model in your IDE, configure it on a per-agent basis in the AI Configuration view.

    \n

    Note: Theia IDE enables connections to various models (e.g., HuggingFace, custom OpenAPI models, LlamaFile). However, not all models may work out of the box, as they may require specific customizations or optimizations. If you encounter issues, please provide feedback, keeping in mind this is an early-phase feature.

    \n

    OpenAI (Hosted by OpenAI)

    \n

    To enable the use of OpenAI, you need to create an API key in your OpenAI account and enter it in the settings AI-features => OpenAiOfficial (see the screenshot below).\nPlease note: By using this preference the Open AI API key will be stored in clear text on the machine running Theia. Use the environment variable OPENAI_API_KEY to set the key securely.\nPlease also note that creating an API key requires a paid subscription, and using these models may incur additional costs. Be sure to monitor your usage carefully to avoid unexpected charges. We have not yet optimized the AI assistants in the Theia IDE for token usage.

    \n\"Open\n

    The OpenAI provider is preconfigured with a list of available models. You can easily add new models to this list, for example, if new options are released.

    \n

    OpenAI Compatible Models (e.g. via VLLM)

    \n

    As an alternative to using an official OpenAI account, Theia IDE also supports arbitrary models compatible with the OpenAI API (e.g., hosted via VLLM). This enables you to connect to self-hosted models with ease. To add a custom model, click on the link in the settings section and add your configuration like this:

    \n
    {\n   \"ai-features.openAiCustom.customOpenAiModels\": [\n       {\n           \"model\": \"your-model-name\",\n           \"url\": \"your-URL\",\n           \"id\": \"your-unique-id\", // Optional: if not provided, the model name will be used as the ID\n           \"apiKey\": \"your-api-key\", // Optional: use 'true' to apply the global OpenAI API key\n           \"supportsDeveloperMessage\": false //Optional: whether your API supports the developer message (turn off when using OpenAI on Azure)\n       }\n   ]\n}
    \n

    Anthropic

    \n

    To enable Anthropics AI models in the Theia IDE, create an API key in your Anthropics account and\nenter it in the Theia IDE settings under AI-features => Anthropics.

    \n

    Please note: The Anthropics API key will be stored in clear text. Use the environment variable ANTHROPIC_API_KEY to set the key securely.

    \n

    Configure available models in the settings under AI-features => AnthropicsModels.\nDefault supported models include choices like claude-3-5-sonnet-latest.

    \n

    Hugging Face

    \n

    To enable Hugging Face as an AI provider, you need to create an API key in your Hugging Face account and enter it in the Theia IDE settings: AI-features => Hugging Face\nPlease note: By using this preference the Hugging Face API key will be stored in clear text on the machine running Theia. Use the environment variable HUGGINGFACE_API_KEY to set the key securely.\nNote also that Hugging Face offers both paid and free-tier options (including \"serverless\"), and usage limits vary. Monitor your usage carefully to avoid unexpected costs, especially when using high-demand models.\nAdd or remove the desired Hugging Face models from the list of available models (see screenshot below). Please note that there is a copy button in the Hugging face UI to copy model IDs to the clipboard.

    \n\"Hugging\n

    LlamaFile Models

    \n

    To configure a LlamaFile LLM in the Theia IDE, add the necessary settings to your configuration (see example below)

    \n
    {\n   \"ai-features.llamafile.llamafiles\": [\n       {\n           \"name\": \"modelname\", //you can choose a name for your model\n           \"uri\": \"file:///home/.../YourModel.llamafile\",\n           \"port\": 30000 //you can choose a port to be used by llamafile\n       }\n   ]\n}
    \n

    Replace \"name\", \"uri\", and \"port\" with your specific LlamaFile details.

    \n

    The Theia IDE also offers convenience commands to start and stop your LlamaFiles:

    \n
      \n
    • Start a LlamaFile: Use the command \"Start Llamafile\", then select the model you want to start.
    • \n
    • Stop a LlamaFile: Use the \"Stop Llamafile\" command, then select the running Llamafile which you want to terminate.
    • \n
    \n

    Please make sure that your LlamaFiles are executable.\nFor more details on LlamaFiles, including a quickstart, see the official Mozilla LlamaFile documentation.

    \n

    Ollama

    \n

    To connect to models hosted via Ollama, enter the corresponding URL, along with the available models, in the settings (as shown below).

    \n\"Ollama\n

    Custom Request Settings

    \n

    You can define custom request settings for specific language models in the Theia IDE to tailor how models handle requests, based on their provider.

    \n

    Add the settings in settings.json:

    \n
    \"ai-features.modelSettings.requestSettings\": [\n    {\n        \"modelId\": \"Qwen/Qwen2.5-Coder-32B-Instruct\",\n        \"requestSettings\": { \"max_new_tokens\": 2048 },\n        \"providerId\": \"huggingface\"\n    },\n    {\n        \"modelId\": \"gemma2\",\n        \"requestSettings\": { \"stop\": [\"<file_sep>\"] },\n        \"providerId\": \"ollama\"\n    }\n]
    \n

    Or navigate in the settings view to ModelSettings => Request Settings.

    \n

    Key Fields

    \n
      \n
    • modelId: The unique identifier of the model.
    • \n
    • requestSettings: Provider-specific options, such as token limits or stopping criteria.
    • \n
    • providerId: (Optional) Specifies the provider for the settings (e.g., huggingface, ollama, openai). If omitted, settings apply to all providers that match the modelId.
    • \n
    \n

    Valid options for requestSettings depend on the model provider.

    \n

    Current Agents in the Theia IDE

    \n

    This section provides an overview of the currently available agents in the Theia IDE. Agents marked as “Chat Agents” are available in the global chat, while others are directly integrated into UI elements, such as code completion. You can configure and deactivate agents in the AI Configuration view.

    \n

    Universal (Chat Agent)

    \n

    This agent helps developers by providing concise and accurate answers to general programming and software development questions. It also serves as a fallback for generic user questions. By default, this agent does not have access to the current user context or workspace. However, you can add variables, such as #selectedText, to your requests to provide additional context.

    \n

    Orchestrator (Chat Agent)

    \n

    This agent analyzes user requests against the descriptions of all available chat agents and selects the best-fitting agent to respond (using AI). The user's request is delegated to the selected agent without further confirmation. The Orchestrator is currently the default agent in the Theia IDE for all chat requests. You can deactivate it in the AI Configuration View.

    \n

    Command (Chat Agent)

    \n

    This agent is aware of all commands available in the Theia IDE and the current tool the user is working with. Based on the user request, it can find the appropriate command and let the user execute it.

    \n

    Workspace (Chat Agent)

    \n

    This agent can access the user's workspace, retrieve a list of all available files, and view their content. It can answer questions about the current project, including project files and source code in the workspace, such as how to build the project, where to place source code, or where to find specific files or configurations.

    \n

    Code Completion (Agent)

    \n

    This agent provides inline code completion within the Theia IDE's code editor. By default, automatic inline completion is disabled to give users greater control over how AI code suggestions are presented. Users can manually trigger inline completion via the default key binding Ctrl+Alt+Space (adaptable). Requests are canceled when moving the cursor.

    \n

    Users who prefer continuous suggestions can enable 'Automatic Code Completion' in the settings ('AIFeatures'=>'CodeCompletion'). This agent makes continuous requests to the underlying LLM while coding if automatic suggestions are enabled.

    \n

    Please note that there are two prompt variants available for the code completion agent, you can select them in the 'AI Configuration view' => 'Code Completion' => 'Prompt Templates'.

    \n

    You can also adapt the used prompt template to your personal preferences or to the LLM you want to use, see for example how to use the Theia IDE with StarCoder.

    \n

    In the settings, you can specify 'Excluded File Extensions' for which the AI-powered code completion will be deactivated.

    \n

    The setting 'Strip Backticks' will remove surrounding backticks that some LLMs might produce (depending on the prompt).

    \n

    Finally, the setting 'Max Context Lines' allows you to configure the maximum number of lines used for AI code completion context. This setting can be adjusted to customize the size of the context provided to the model, which is especially useful when using smaller models with limited token capacity.

    \n

    Terminal Assistance (Agent)

    \n

    This agent assists with writing and executing terminal commands. Based on the user's request, it suggests commands and allows them to be directly pasted and executed in the terminal. It can access the current directory, environment, and recent terminal output to provide context-aware assistance. You can open the terminal assistance agent via Ctrl+I in the terminal view.

    \n

    Chat

    \n

    The Theia IDE provides a global chat interface where users can interact with all chat agents. The Orchestrator automatically delegates user requests to the most appropriate agent. To send a request directly to a specific agent, mention the agent's name using '@', for example, '@Command'. Press '@' in the chat to see a list of available chat agents.

    \n\"General\n

    Some agents produce special results, such as buttons (shown in the screenshot above) or code that can be directly inserted. You can augment your requests in the chat with context by using variables. For example, to refer to the currently selected text, use #selectedText in your request. Pressing '#' in the chat will show a list of available variables.

    \n

    AI Configuration

    \n

    The AI Configuration View allows you to review and adapt agent-specific settings. Select an agent on the left side and review its properties on the right:

    \n
      \n
    • Enable Agent: Disabled agents will no longer be available in the chat or UI elements. Disabled agents also won't make any requests to LLMs.
    • \n
    • Edit Prompts: Click \"Edit\" to open the prompt template editor, where you can customize the agent's prompts (see the section below). \"Reset\" will revert the prompt to its default.
    • \n
    • Language Model: Select which language model the agent sends its requests to. Some agents have multiple \"purposes,\" allowing you to select a model for each purpose.
    • \n
    • Variables and Functions: Review the variables and functions used by an agent. Global variables are shared across agents, and they are listed in the second tab of the AI Configuration View. Agent-specific variables are declared and used exclusively by one agent.
    • \n
    \n\"AI\n

    View and Modify Prompts

    \n

    In the Theia IDE, you can open and edit prompts for all agents from the AI Configuration View. Prompts are shown in a text editor (see the screenshot below). Changes saved in the prompt editor will take effect with the next request made to the corresponding agent. You can reset a prompt to its default using the \"Reset\" button in the AI configuration view or the \"Revert\" toolbar item in the prompt editor (top-right corner).

    \n\"Prompt\n

    Variables and functions can be used in prompts. Variables are replaced with context-specific information at the time of the request (e.g., the currently selected text), while functions can trigger actions or retrieve additional information. You can find an overview of all global variables in the \"Variables\" tab of the AI Configuration View and agent-specific variables in the agent's configuration.

    \n

    Variables are used with the following syntax:

    \n
    {{variableName}}
    \n

    Tool functions are used with the following syntax:

    \n
    ~{functionName}
    \n

    Custom Agents

    \n

    Custom agents enable users to define new chat agents with custom prompts on the fly, allowing the creation of custom workflows and extending the Theia IDE with new capabilities. These agents are immediately available in the default chat.

    \n

    To define a new custom agent, navigate to the AI Configuration View and click on \"Add Custom Agent\".

    \n\"Add\n

    This action opens a YAML file where all available custom agents are defined. Below is an example configuration:

    \n
    - id: obfuscator\n  name: Obfuscator\n  description: This is an example agent. Please adapt the properties to fit your needs.\n  prompt: Obfuscate the following code so that no human can understand it anymore. Preserve the functionality.\n  defaultLLM: openai/gpt-4o
    \n
      \n
    • id: A unique identifier for the agent.
    • \n
    • name: The display name of the agent.
    • \n
    • description: A brief explanation of what the agent does.
    • \n
    • prompt: The default prompt that the agent will use for processing requests.
    • \n
    • defaultLLM: The language model used by default.
    • \n
    \n

    Custom agents can be configured in the AI Configuration View just like other chat agents. You can enable/disable them, modify their prompt templates, and integrate variables and functions within these templates to enhance functionality.

    \n

    Here is the updated MCP Integration section with the requested changes:

    \n

    MCP Integration

    \n

    The Theia IDE now supports an with the Model Context Protocol (MCP), enabling users to configure and utilize external services in their AI workflows.\nPlease note: While this integration does not yet include MCP servers in any standard prompts, it already allows end users to explore the MCP ecosystem and discover interesting new use cases. In the future, we plan to provide ready-to-use prompts using MCP servers and support auto-starting configured servers.

    \n

    To learn more about MCP, see the official announcement from Anthropic.
    \nFor a list of available MCP servers, visit the MCP Servers Repository.

    \n

    Configuring MCP Servers

    \n

    To configure MCP servers, open the preferences and add entries to the MCP Servers Configuration section. Each server requires a unique identifier (e.g., \"brave-search\" or \"filesystem\") and configuration details such as the command, arguments, and optional environment variables. For Windows users, please see the additional information below. 'autostart' will automatically start the respective MCP server the next time you restart your IDE, you will still need to manually start it the first time (see below).

    \n

    Example Configuration:

    \n
    {\n  \"brave-search\": {\n    \"command\": \"npx\",\n    \"args\": [\n      \"-y\",\n      \"@modelcontextprotocol/server-brave-search\"\n    ],\n    \"env\": {\n      \"BRAVE_API_KEY\": \"YOUR_API_KEY\"\n    },\n    \"autostart\": true\n  },\n  \"filesystem\": {\n    \"command\": \"npx\",\n    \"args\": [\"-y\", \"@modelcontextprotocol/server-filesystem\", \"/Users/YOUR_USERNAME/Desktop\"],\n    \"env\": {\n      \"CUSTOM_ENV_VAR\": \"custom-value\"\n    }\n  }\n}
    \n

    The configuration options include:

    \n
      \n
    • command: The executable used to start the server (e.g., npx).
    • \n
    • args: An array of arguments passed to the command.
    • \n
    • env: An optional set of environment variables for the server.
    • \n
    \n

    Note for Windows users: On Windows, you need to start a command interpreter (e.g. cmd.exe) as the server command in order for path lookups to work as expected. The effective command line is then passed as an argument. For example:

    \n
    \"filesystem\": {\n    \"command\": \"cmd\",\n    \"args\": [\"/C\", \"npx -y @modelcontextprotocol/server-filesystem /Users/YOUR_USERNAME/Desktop\"],\n    \"env\": {\n      \"CUSTOM_ENV_VAR\": \"custom-value\"\n    }\n  }
    \n

    Starting and Stopping MCP Servers

    \n

    Theia provides commands to manage MCP servers:

    \n
      \n
    • Start MCP Server: Use the command \"MCP: Start MCP Server\" to start a server. The system displays a list of available servers to select from.
    • \n
    • Stop MCP Server: Use the command \"MCP: Stop MCP Server\" to stop a running server.
    • \n
    \n

    When a server starts, a notification is displayed confirming the operation, and the functions made available.\nYou can also set a MCP server to 'autostart' in the settings, this will take effect on the next restart of your IDE.\nPlease note that in a browser deployment MCP servers are scoped per connection, i.e. if you manually start them, you need to start them once per browser tab.

    \n

    Using MCP Server Functions

    \n

    Once a server is running, its functions can be invoked in prompts using the following syntax:

    \n
    ~{mcp_<server-name>_<function-name>}
    \n
      \n
    • mcp: Prefix for all MCP commands.
    • \n
    • <server-name>: The unique identifier of the server (e.g., brave-search).
    • \n
    • <function-name>: The specific function exposed by the server (e.g., brave_web_search).
    • \n
    \n

    Example:

    \n

    To use the brave_web_search function of the brave-search server, you can write:

    \n
    ~{mcp_brave-search_brave_web_search}
    \n

    This allows you to seamlessly integrate external services into your AI workflows within the Theia IDE.

    \n

    SCANOSS

    \n

    The Theia IDE (and Theia AI) integrates a code scanner powered by SCANOSS, enabling developers to analyze generated code snippets for open-source compliance and licensing. This feature helps developers understand potential licensing implications when using generated code in the Chat view.

    \n

    Please note: This feature sends a hash of suggested code snippets to the SCANOSS service hosted by the Software Transparency Foundation for analysis. While the service is free to use, very high usage may trigger rate limiting (unlikely for individual developers). Additionally, neither Theia nor SCANOSS can guarantee that no license implications exist, even if no issues are detected during the scan.

    \n

    Configure SCANOSS in the Theia IDE

    \n
      \n
    1. Open the Settings panel in the Theia IDE.
    2. \n
    3. Navigate to SCANOSS Mode under the AI Features section.
    4. \n
    5. Select the desired mode:\n
        \n
      • Off: Disables SCANOSS completely.
      • \n
      • Manual: Allows users to trigger scans manually via the SCANOSS button on generated code snippets in the Chat view.
      • \n
      • Automatic: Automatically scans generated code snippets in the Chat view.
      • \n
      \n
    6. \n
    \n

    Manual Scanning

    \n

    To manually scan a code snippet:

    \n
      \n
    1. Generate a code snippet in the AI Chat view.
    2. \n
    3. Click the SCANOSS button in the toolbar of the code renderer embedded in the Chat view.
    4. \n
    5. A result icon will appear:\n
        \n
      • A warning icon if a match is found.
      • \n
      • A green check mark if no matches are found.
      • \n
      \n
    6. \n
    7. If a warning icon is displayed, click the SCANOSS button again to view detailed scan results in a popup window.
    8. \n
    \n\"Scanning\n

    Automatic Scanning

    \n

    In Automatic mode, SCANOSS scans code snippets in the background whenever they are generated in the Chat view. Results are displayed immediately, indicating whether any matches are found.

    \n

    Understanding SCANOSS Results

    \n

    After a scan is completed, SCANOSS provides a detailed summary, including:

    \n
      \n
    • Match Percentage: The degree of similarity between the scanned snippet and the code in the database.
    • \n
    • Matched File: The file or project containing the matched code.
    • \n
    • Licenses: A list of licenses associated with the matched code, including links to detailed license terms.
    • \n
    \n

    AI History

    \n

    The AI History view allows you to review all communications between agents and underlying LLMs. Select the corresponding agent at the top to see all its requests in the section below.

    \n\"AI\n

    Learn more

    \n

    If want to learn more about the AI support in the Theia AI, please see this introduction, our article on the vision of Theia AI and the demonstrations in Sneak Preview Series about Theia AI

    ","fields":{"slug":"user_ai"}}},"pageContext":{"slug":"user_ai"}},"staticQueryHashes":["2468095761"],"slicesMap":{}} \ No newline at end of file diff --git a/pr-previews/pr-707/releases/index.html b/pr-previews/pr-707/releases/index.html index 40c42f0b..3b03d23a 100644 --- a/pr-previews/pr-707/releases/index.html +++ b/pr-previews/pr-707/releases/index.html @@ -54,4 +54,4 @@ > window.___chunkMapping="{\"app\":[\"/app-f6f8e6b1f95071f3d885.js\"],\"component---src-pages-404-js\":[\"/component---src-pages-404-js-1c97c66d7998fb40d048.js\"],\"component---src-pages-blogs-js\":[\"/component---src-pages-blogs-js-d636a26158aeeb9701fa.js\"],\"component---src-pages-docs-js\":[\"/component---src-pages-docs-js-52ba16cfe819f11145bf.js\"],\"component---src-pages-index-js\":[\"/component---src-pages-index-js-9ea45e881103930fe8f6.js\"],\"component---src-pages-releases-js\":[\"/component---src-pages-releases-js-6b63209b257eb5d7ffe8.js\"],\"component---src-pages-resources-js\":[\"/component---src-pages-resources-js-58532c16436f03988114.js\"],\"component---src-pages-support-js\":[\"/component---src-pages-support-js-9bd01f77ce82eb582405.js\"],\"component---src-pages-theia-platform-js\":[\"/component---src-pages-theia-platform-js-9c24155b7fcbb10dfc08.js\"],\"component---src-templates-doc-js\":[\"/component---src-templates-doc-js-0f91607553d4c7973801.js\"]}"; - \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/resources/index.html b/pr-previews/pr-707/resources/index.html index 46a6b50a..dd817f49 100644 --- a/pr-previews/pr-707/resources/index.html +++ b/pr-previews/pr-707/resources/index.html @@ -54,4 +54,4 @@ > window.___chunkMapping="{\"app\":[\"/app-f6f8e6b1f95071f3d885.js\"],\"component---src-pages-404-js\":[\"/component---src-pages-404-js-1c97c66d7998fb40d048.js\"],\"component---src-pages-blogs-js\":[\"/component---src-pages-blogs-js-d636a26158aeeb9701fa.js\"],\"component---src-pages-docs-js\":[\"/component---src-pages-docs-js-52ba16cfe819f11145bf.js\"],\"component---src-pages-index-js\":[\"/component---src-pages-index-js-9ea45e881103930fe8f6.js\"],\"component---src-pages-releases-js\":[\"/component---src-pages-releases-js-6b63209b257eb5d7ffe8.js\"],\"component---src-pages-resources-js\":[\"/component---src-pages-resources-js-58532c16436f03988114.js\"],\"component---src-pages-support-js\":[\"/component---src-pages-support-js-9bd01f77ce82eb582405.js\"],\"component---src-pages-theia-platform-js\":[\"/component---src-pages-theia-platform-js-9c24155b7fcbb10dfc08.js\"],\"component---src-templates-doc-js\":[\"/component---src-templates-doc-js-0f91607553d4c7973801.js\"]}"; - \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/support/index.html b/pr-previews/pr-707/support/index.html index 19a26ff8..58e1e5e1 100644 --- a/pr-previews/pr-707/support/index.html +++ b/pr-previews/pr-707/support/index.html @@ -54,4 +54,4 @@ > window.___chunkMapping="{\"app\":[\"/app-f6f8e6b1f95071f3d885.js\"],\"component---src-pages-404-js\":[\"/component---src-pages-404-js-1c97c66d7998fb40d048.js\"],\"component---src-pages-blogs-js\":[\"/component---src-pages-blogs-js-d636a26158aeeb9701fa.js\"],\"component---src-pages-docs-js\":[\"/component---src-pages-docs-js-52ba16cfe819f11145bf.js\"],\"component---src-pages-index-js\":[\"/component---src-pages-index-js-9ea45e881103930fe8f6.js\"],\"component---src-pages-releases-js\":[\"/component---src-pages-releases-js-6b63209b257eb5d7ffe8.js\"],\"component---src-pages-resources-js\":[\"/component---src-pages-resources-js-58532c16436f03988114.js\"],\"component---src-pages-support-js\":[\"/component---src-pages-support-js-9bd01f77ce82eb582405.js\"],\"component---src-pages-theia-platform-js\":[\"/component---src-pages-theia-platform-js-9c24155b7fcbb10dfc08.js\"],\"component---src-templates-doc-js\":[\"/component---src-templates-doc-js-0f91607553d4c7973801.js\"]}"; - \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/theia-ai-architecture.png b/pr-previews/pr-707/theia-ai-architecture.png index dc1e0b46..390e73fb 100644 Binary files a/pr-previews/pr-707/theia-ai-architecture.png and b/pr-previews/pr-707/theia-ai-architecture.png differ diff --git a/pr-previews/pr-707/theia-coder.gif b/pr-previews/pr-707/theia-coder.gif new file mode 100644 index 00000000..e110c127 Binary files /dev/null and b/pr-previews/pr-707/theia-coder.gif differ diff --git a/pr-previews/pr-707/theia-platform/index.html b/pr-previews/pr-707/theia-platform/index.html index 590101d1..273eee5a 100644 --- a/pr-previews/pr-707/theia-platform/index.html +++ b/pr-previews/pr-707/theia-platform/index.html @@ -54,4 +54,4 @@ > window.___chunkMapping="{\"app\":[\"/app-f6f8e6b1f95071f3d885.js\"],\"component---src-pages-404-js\":[\"/component---src-pages-404-js-1c97c66d7998fb40d048.js\"],\"component---src-pages-blogs-js\":[\"/component---src-pages-blogs-js-d636a26158aeeb9701fa.js\"],\"component---src-pages-docs-js\":[\"/component---src-pages-docs-js-52ba16cfe819f11145bf.js\"],\"component---src-pages-index-js\":[\"/component---src-pages-index-js-9ea45e881103930fe8f6.js\"],\"component---src-pages-releases-js\":[\"/component---src-pages-releases-js-6b63209b257eb5d7ffe8.js\"],\"component---src-pages-resources-js\":[\"/component---src-pages-resources-js-58532c16436f03988114.js\"],\"component---src-pages-support-js\":[\"/component---src-pages-support-js-9bd01f77ce82eb582405.js\"],\"component---src-pages-theia-platform-js\":[\"/component---src-pages-theia-platform-js-9c24155b7fcbb10dfc08.js\"],\"component---src-templates-doc-js\":[\"/component---src-templates-doc-js-0f91607553d4c7973801.js\"]}"; - \ No newline at end of file + \ No newline at end of file diff --git a/pr-previews/pr-707/webpack-runtime-28bcfea08fa5c5ba216a.js b/pr-previews/pr-707/webpack-runtime-28bcfea08fa5c5ba216a.js new file mode 100644 index 00000000..bb27cf6e --- /dev/null +++ b/pr-previews/pr-707/webpack-runtime-28bcfea08fa5c5ba216a.js @@ -0,0 +1,2 @@ +!function(){"use strict";var e,t,n,r,o,c={},i={};function u(e){var t=i[e];if(void 0!==t)return t.exports;var n=i[e]={id:e,loaded:!1,exports:{}};return c[e].call(n.exports,n,n.exports,u),n.loaded=!0,n.exports}u.m=c,e=[],u.O=function(t,n,r,o){if(!n){var c=1/0;for(s=0;s=o)&&Object.keys(u.O).every((function(e){return u.O[e](n[a])}))?n.splice(a--,1):(i=!1,o0&&e[s-1][2]>o;s--)e[s]=e[s-1];e[s]=[n,r,o]},u.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},u.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);u.r(o);var c={};t=t||[null,n({}),n([]),n(n)];for(var i=2&r&&e;"object"==typeof i&&!~t.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach((function(t){c[t]=function(){return e[t]}}));return c.default=function(){return e},u.d(o,c),o},u.d=function(e,t){for(var n in t)u.o(t,n)&&!u.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},u.f={},u.e=function(e){return Promise.all(Object.keys(u.f).reduce((function(t,n){return u.f[n](e,t),t}),[]))},u.u=function(e){return{116:"component---src-pages-docs-js",125:"component---src-pages-404-js",205:"8c9522e9ab04d805c32ce56d0725aa8a5b32377d",223:"commons",293:"component---src-pages-index-js",576:"component---src-pages-blogs-js",636:"component---src-pages-resources-js",709:"component---src-pages-releases-js",723:"2afe3fb4a968f105fe53dbf6f88d99ef93379730",824:"component---src-templates-doc-js",828:"component---src-pages-theia-platform-js",854:"component---src-pages-support-js"}[e]+"-"+{116:"52ba16cfe819f11145bf",125:"1c97c66d7998fb40d048",205:"0e9abe4a67505418fd25",223:"40db550b6c8af0a6bc29",293:"9ea45e881103930fe8f6",576:"d636a26158aeeb9701fa",636:"58532c16436f03988114",709:"6b63209b257eb5d7ffe8",723:"84c95df1ef5935f91856",824:"0f91607553d4c7973801",828:"9c24155b7fcbb10dfc08",854:"9bd01f77ce82eb582405"}[e]+".js"},u.miniCssF=function(e){return"styles.312d2de60b61c3eb6289.css"},u.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),u.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="Theia-Website:",u.l=function(e,t,n,c){if(r[e])r[e].push(t);else{var i,a;if(void 0!==n)for(var f=document.getElementsByTagName("script"),s=0;s 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"Theia-Website:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + {\"116\":\"component---src-pages-docs-js\",\"125\":\"component---src-pages-404-js\",\"205\":\"8c9522e9ab04d805c32ce56d0725aa8a5b32377d\",\"223\":\"commons\",\"293\":\"component---src-pages-index-js\",\"576\":\"component---src-pages-blogs-js\",\"636\":\"component---src-pages-resources-js\",\"709\":\"component---src-pages-releases-js\",\"723\":\"2afe3fb4a968f105fe53dbf6f88d99ef93379730\",\"824\":\"component---src-templates-doc-js\",\"828\":\"component---src-pages-theia-platform-js\",\"854\":\"component---src-pages-support-js\"}[chunkId] + \"-\" + {\"116\":\"52ba16cfe819f11145bf\",\"125\":\"1c97c66d7998fb40d048\",\"205\":\"87289377e7c421d5e020\",\"223\":\"40db550b6c8af0a6bc29\",\"293\":\"9ea45e881103930fe8f6\",\"576\":\"d636a26158aeeb9701fa\",\"636\":\"58532c16436f03988114\",\"709\":\"6b63209b257eb5d7ffe8\",\"723\":\"84c95df1ef5935f91856\",\"824\":\"0f91607553d4c7973801\",\"828\":\"9c24155b7fcbb10dfc08\",\"854\":\"9bd01f77ce82eb582405\"}[chunkId] + \".js\";\n};","// This function allow to reference all chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + \"styles\" + \".\" + \"312d2de60b61c3eb6289\" + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/theia-website-previews/pr-previews/pr-707/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t311: 0,\n\t869: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(311|869)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkTheia_Website\"] = self[\"webpackChunkTheia_Website\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","id","loaded","__webpack_modules__","call","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","getPrototypeOf","obj","__proto__","t","value","mode","this","then","ns","create","def","current","indexOf","getOwnPropertyNames","forEach","definition","o","defineProperty","enumerable","get","f","e","chunkId","Promise","all","reduce","promises","u","miniCssF","g","globalThis","Function","window","prop","prototype","hasOwnProperty","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","setTimeout","bind","type","target","head","appendChild","Symbol","toStringTag","nmd","paths","children","p","installedChunks","installedChunkData","test","promise","resolve","reject","error","Error","errorType","realSrc","message","name","request","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal","self"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"webpack-runtime-28bcfea08fa5c5ba216a.js","mappings":"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","sources":["webpack://Theia-Website/webpack/runtime/chunk loaded","webpack://Theia-Website/webpack/runtime/create fake namespace object","webpack://Theia-Website/webpack/runtime/load script","webpack://Theia-Website/webpack/bootstrap","webpack://Theia-Website/webpack/runtime/compat get default export","webpack://Theia-Website/webpack/runtime/define property getters","webpack://Theia-Website/webpack/runtime/ensure chunk","webpack://Theia-Website/webpack/runtime/get javascript chunk filename","webpack://Theia-Website/webpack/runtime/get mini-css chunk filename","webpack://Theia-Website/webpack/runtime/global","webpack://Theia-Website/webpack/runtime/hasOwnProperty shorthand","webpack://Theia-Website/webpack/runtime/make namespace object","webpack://Theia-Website/webpack/runtime/node module decorator","webpack://Theia-Website/webpack/runtime/publicPath","webpack://Theia-Website/webpack/runtime/jsonp chunk loading"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","var inProgress = {};\nvar dataWebpackPrefix = \"Theia-Website:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + {\"116\":\"component---src-pages-docs-js\",\"125\":\"component---src-pages-404-js\",\"205\":\"8c9522e9ab04d805c32ce56d0725aa8a5b32377d\",\"223\":\"commons\",\"293\":\"component---src-pages-index-js\",\"576\":\"component---src-pages-blogs-js\",\"636\":\"component---src-pages-resources-js\",\"709\":\"component---src-pages-releases-js\",\"723\":\"2afe3fb4a968f105fe53dbf6f88d99ef93379730\",\"824\":\"component---src-templates-doc-js\",\"828\":\"component---src-pages-theia-platform-js\",\"854\":\"component---src-pages-support-js\"}[chunkId] + \"-\" + {\"116\":\"52ba16cfe819f11145bf\",\"125\":\"1c97c66d7998fb40d048\",\"205\":\"0e9abe4a67505418fd25\",\"223\":\"40db550b6c8af0a6bc29\",\"293\":\"9ea45e881103930fe8f6\",\"576\":\"d636a26158aeeb9701fa\",\"636\":\"58532c16436f03988114\",\"709\":\"6b63209b257eb5d7ffe8\",\"723\":\"84c95df1ef5935f91856\",\"824\":\"0f91607553d4c7973801\",\"828\":\"9c24155b7fcbb10dfc08\",\"854\":\"9bd01f77ce82eb582405\"}[chunkId] + \".js\";\n};","// This function allow to reference all chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"\" + \"styles\" + \".\" + \"312d2de60b61c3eb6289\" + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = function(module) {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","__webpack_require__.p = \"/theia-website-previews/pr-previews/pr-707/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t311: 0,\n\t869: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(!/^(311|869)$/.test(chunkId)) {\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = function(chunkId) { return installedChunks[chunkId] === 0; };\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkTheia_Website\"] = self[\"webpackChunkTheia_Website\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));"],"names":["deferred","leafPrototypes","getProto","inProgress","dataWebpackPrefix","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","id","loaded","__webpack_modules__","call","m","O","result","chunkIds","fn","priority","notFulfilled","Infinity","i","length","fulfilled","j","Object","keys","every","key","splice","r","n","getter","__esModule","d","a","getPrototypeOf","obj","__proto__","t","value","mode","this","then","ns","create","def","current","indexOf","getOwnPropertyNames","forEach","definition","o","defineProperty","enumerable","get","f","e","chunkId","Promise","all","reduce","promises","u","miniCssF","g","globalThis","Function","window","prop","prototype","hasOwnProperty","l","url","done","push","script","needAttach","scripts","document","getElementsByTagName","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","setTimeout","bind","type","target","head","appendChild","Symbol","toStringTag","nmd","paths","children","p","installedChunks","installedChunkData","test","promise","resolve","reject","error","Error","errorType","realSrc","message","name","request","webpackJsonpCallback","parentChunkLoadingFunction","data","moreModules","runtime","some","chunkLoadingGlobal","self"],"sourceRoot":""} \ No newline at end of file diff --git a/pr-previews/pr-707/webpack-runtime-444a57b25b1cffc715bf.js b/pr-previews/pr-707/webpack-runtime-444a57b25b1cffc715bf.js deleted file mode 100644 index b566036b..00000000 --- a/pr-previews/pr-707/webpack-runtime-444a57b25b1cffc715bf.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(){"use strict";var e,t,n,r,o,c={},i={};function a(e){var t=i[e];if(void 0!==t)return t.exports;var n=i[e]={id:e,loaded:!1,exports:{}};return c[e].call(n.exports,n,n.exports,a),n.loaded=!0,n.exports}a.m=c,e=[],a.O=function(t,n,r,o){if(!n){var c=1/0;for(s=0;s=o)&&Object.keys(a.O).every((function(e){return a.O[e](n[u])}))?n.splice(u--,1):(i=!1,o0&&e[s-1][2]>o;s--)e[s]=e[s-1];e[s]=[n,r,o]},a.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(t,{a:t}),t},n=Object.getPrototypeOf?function(e){return Object.getPrototypeOf(e)}:function(e){return e.__proto__},a.t=function(e,r){if(1&r&&(e=this(e)),8&r)return e;if("object"==typeof e&&e){if(4&r&&e.__esModule)return e;if(16&r&&"function"==typeof e.then)return e}var o=Object.create(null);a.r(o);var c={};t=t||[null,n({}),n([]),n(n)];for(var i=2&r&&e;"object"==typeof i&&!~t.indexOf(i);i=n(i))Object.getOwnPropertyNames(i).forEach((function(t){c[t]=function(){return e[t]}}));return c.default=function(){return e},a.d(o,c),o},a.d=function(e,t){for(var n in t)a.o(t,n)&&!a.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce((function(t,n){return a.f[n](e,t),t}),[]))},a.u=function(e){return{116:"component---src-pages-docs-js",125:"component---src-pages-404-js",205:"8c9522e9ab04d805c32ce56d0725aa8a5b32377d",223:"commons",293:"component---src-pages-index-js",576:"component---src-pages-blogs-js",636:"component---src-pages-resources-js",709:"component---src-pages-releases-js",723:"2afe3fb4a968f105fe53dbf6f88d99ef93379730",824:"component---src-templates-doc-js",828:"component---src-pages-theia-platform-js",854:"component---src-pages-support-js"}[e]+"-"+{116:"52ba16cfe819f11145bf",125:"1c97c66d7998fb40d048",205:"87289377e7c421d5e020",223:"40db550b6c8af0a6bc29",293:"9ea45e881103930fe8f6",576:"d636a26158aeeb9701fa",636:"58532c16436f03988114",709:"6b63209b257eb5d7ffe8",723:"84c95df1ef5935f91856",824:"0f91607553d4c7973801",828:"9c24155b7fcbb10dfc08",854:"9bd01f77ce82eb582405"}[e]+".js"},a.miniCssF=function(e){return"styles.312d2de60b61c3eb6289.css"},a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r={},o="Theia-Website:",a.l=function(e,t,n,c){if(r[e])r[e].push(t);else{var i,u;if(void 0!==n)for(var f=document.getElementsByTagName("script"),s=0;s