@theia/ai-ide 1.67.0-next.56 → 1.67.0-next.86

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/lib/browser/address-pr-review-command-contribution.d.ts +9 -0
  2. package/lib/browser/address-pr-review-command-contribution.d.ts.map +1 -0
  3. package/lib/browser/address-pr-review-command-contribution.js +176 -0
  4. package/lib/browser/address-pr-review-command-contribution.js.map +1 -0
  5. package/lib/browser/ai-configuration/agent-configuration-widget.d.ts +47 -0
  6. package/lib/browser/ai-configuration/agent-configuration-widget.d.ts.map +1 -0
  7. package/lib/browser/ai-configuration/agent-configuration-widget.js +385 -0
  8. package/lib/browser/ai-configuration/agent-configuration-widget.js.map +1 -0
  9. package/lib/browser/ai-configuration/ai-configuration-service.d.ts +18 -0
  10. package/lib/browser/ai-configuration/ai-configuration-service.d.ts.map +1 -0
  11. package/lib/browser/ai-configuration/ai-configuration-service.js +53 -0
  12. package/lib/browser/ai-configuration/ai-configuration-service.js.map +1 -0
  13. package/lib/browser/ai-configuration/ai-configuration-view-contribution.d.ts +14 -0
  14. package/lib/browser/ai-configuration/ai-configuration-view-contribution.d.ts.map +1 -0
  15. package/lib/browser/ai-configuration/ai-configuration-view-contribution.js +67 -0
  16. package/lib/browser/ai-configuration/ai-configuration-view-contribution.js.map +1 -0
  17. package/lib/browser/ai-configuration/ai-configuration-widget.d.ts +29 -0
  18. package/lib/browser/ai-configuration/ai-configuration-widget.d.ts.map +1 -0
  19. package/lib/browser/ai-configuration/ai-configuration-widget.js +118 -0
  20. package/lib/browser/ai-configuration/ai-configuration-widget.js.map +1 -0
  21. package/lib/browser/ai-configuration/base/ai-card-grid-configuration-widget.d.ts +32 -0
  22. package/lib/browser/ai-configuration/base/ai-card-grid-configuration-widget.d.ts.map +1 -0
  23. package/lib/browser/ai-configuration/base/ai-card-grid-configuration-widget.js +55 -0
  24. package/lib/browser/ai-configuration/base/ai-card-grid-configuration-widget.js.map +1 -0
  25. package/lib/browser/ai-configuration/base/ai-configuration-base-widget.d.ts +14 -0
  26. package/lib/browser/ai-configuration/base/ai-configuration-base-widget.d.ts.map +1 -0
  27. package/lib/browser/ai-configuration/base/ai-configuration-base-widget.js +35 -0
  28. package/lib/browser/ai-configuration/base/ai-configuration-base-widget.js.map +1 -0
  29. package/lib/browser/ai-configuration/base/ai-hierarchical-configuration-widget.d.ts +23 -0
  30. package/lib/browser/ai-configuration/base/ai-hierarchical-configuration-widget.d.ts.map +1 -0
  31. package/lib/browser/ai-configuration/base/ai-hierarchical-configuration-widget.js +60 -0
  32. package/lib/browser/ai-configuration/base/ai-hierarchical-configuration-widget.js.map +1 -0
  33. package/lib/browser/ai-configuration/base/ai-list-detail-configuration-widget.d.ts +56 -0
  34. package/lib/browser/ai-configuration/base/ai-list-detail-configuration-widget.d.ts.map +1 -0
  35. package/lib/browser/ai-configuration/base/ai-list-detail-configuration-widget.js +96 -0
  36. package/lib/browser/ai-configuration/base/ai-list-detail-configuration-widget.js.map +1 -0
  37. package/lib/browser/ai-configuration/base/ai-table-configuration-widget.d.ts +45 -0
  38. package/lib/browser/ai-configuration/base/ai-table-configuration-widget.d.ts.map +1 -0
  39. package/lib/browser/ai-configuration/base/ai-table-configuration-widget.js +66 -0
  40. package/lib/browser/ai-configuration/base/ai-table-configuration-widget.js.map +1 -0
  41. package/lib/browser/ai-configuration/components/configuration-section.d.ts +13 -0
  42. package/lib/browser/ai-configuration/components/configuration-section.d.ts.map +1 -0
  43. package/lib/browser/ai-configuration/components/configuration-section.js +28 -0
  44. package/lib/browser/ai-configuration/components/configuration-section.js.map +1 -0
  45. package/lib/browser/ai-configuration/components/empty-state.d.ts +11 -0
  46. package/lib/browser/ai-configuration/components/empty-state.d.ts.map +1 -0
  47. package/lib/browser/ai-configuration/components/empty-state.js +26 -0
  48. package/lib/browser/ai-configuration/components/empty-state.js.map +1 -0
  49. package/lib/browser/ai-configuration/components/expandable-section.d.ts +14 -0
  50. package/lib/browser/ai-configuration/components/expandable-section.d.ts.map +1 -0
  51. package/lib/browser/ai-configuration/components/expandable-section.js +31 -0
  52. package/lib/browser/ai-configuration/components/expandable-section.js.map +1 -0
  53. package/lib/browser/ai-configuration/language-model-renderer.d.ts +13 -0
  54. package/lib/browser/ai-configuration/language-model-renderer.d.ts.map +1 -0
  55. package/lib/browser/ai-configuration/language-model-renderer.js +105 -0
  56. package/lib/browser/ai-configuration/language-model-renderer.js.map +1 -0
  57. package/lib/browser/ai-configuration/mcp-configuration-widget.d.ts +42 -0
  58. package/lib/browser/ai-configuration/mcp-configuration-widget.d.ts.map +1 -0
  59. package/lib/browser/ai-configuration/mcp-configuration-widget.js +308 -0
  60. package/lib/browser/ai-configuration/mcp-configuration-widget.js.map +1 -0
  61. package/lib/browser/ai-configuration/model-aliases-configuration-widget.d.ts +27 -0
  62. package/lib/browser/ai-configuration/model-aliases-configuration-widget.d.ts.map +1 -0
  63. package/lib/browser/ai-configuration/model-aliases-configuration-widget.js +197 -0
  64. package/lib/browser/ai-configuration/model-aliases-configuration-widget.js.map +1 -0
  65. package/lib/browser/ai-configuration/prompt-fragments-configuration-widget.d.ts +141 -0
  66. package/lib/browser/ai-configuration/prompt-fragments-configuration-widget.d.ts.map +1 -0
  67. package/lib/browser/ai-configuration/prompt-fragments-configuration-widget.js +508 -0
  68. package/lib/browser/ai-configuration/prompt-fragments-configuration-widget.js.map +1 -0
  69. package/lib/browser/ai-configuration/template-settings-renderer.d.ts +10 -0
  70. package/lib/browser/ai-configuration/template-settings-renderer.d.ts.map +1 -0
  71. package/lib/browser/ai-configuration/template-settings-renderer.js +48 -0
  72. package/lib/browser/ai-configuration/template-settings-renderer.js.map +1 -0
  73. package/lib/browser/ai-configuration/token-usage-configuration-widget.d.ts +21 -0
  74. package/lib/browser/ai-configuration/token-usage-configuration-widget.d.ts.map +1 -0
  75. package/lib/browser/ai-configuration/token-usage-configuration-widget.js +170 -0
  76. package/lib/browser/ai-configuration/token-usage-configuration-widget.js.map +1 -0
  77. package/lib/browser/ai-configuration/tools-configuration-widget.d.ts +35 -0
  78. package/lib/browser/ai-configuration/tools-configuration-widget.d.ts.map +1 -0
  79. package/lib/browser/ai-configuration/tools-configuration-widget.js +158 -0
  80. package/lib/browser/ai-configuration/tools-configuration-widget.js.map +1 -0
  81. package/lib/browser/ai-configuration/variable-configuration-widget.d.ts +23 -0
  82. package/lib/browser/ai-configuration/variable-configuration-widget.d.ts.map +1 -0
  83. package/lib/browser/ai-configuration/variable-configuration-widget.js +132 -0
  84. package/lib/browser/ai-configuration/variable-configuration-widget.js.map +1 -0
  85. package/lib/browser/ai-ide-activation-service.d.ts +18 -0
  86. package/lib/browser/ai-ide-activation-service.d.ts.map +1 -0
  87. package/lib/browser/ai-ide-activation-service.js +71 -0
  88. package/lib/browser/ai-ide-activation-service.js.map +1 -0
  89. package/lib/browser/ai-terminal-functions.d.ts +13 -0
  90. package/lib/browser/ai-terminal-functions.d.ts.map +1 -0
  91. package/lib/browser/ai-terminal-functions.js +114 -0
  92. package/lib/browser/ai-terminal-functions.js.map +1 -0
  93. package/lib/browser/analyze-gh-ticket-command-contribution.d.ts +9 -0
  94. package/lib/browser/analyze-gh-ticket-command-contribution.d.ts.map +1 -0
  95. package/lib/browser/analyze-gh-ticket-command-contribution.js +172 -0
  96. package/lib/browser/analyze-gh-ticket-command-contribution.js.map +1 -0
  97. package/lib/browser/app-tester-chat-agent.d.ts +35 -0
  98. package/lib/browser/app-tester-chat-agent.d.ts.map +1 -0
  99. package/lib/browser/app-tester-chat-agent.js +142 -0
  100. package/lib/browser/app-tester-chat-agent.js.map +1 -0
  101. package/lib/browser/app-tester-chat-functions.d.ts +25 -0
  102. package/lib/browser/app-tester-chat-functions.d.ts.map +1 -0
  103. package/lib/browser/app-tester-chat-functions.js +170 -0
  104. package/lib/browser/app-tester-chat-functions.js.map +1 -0
  105. package/lib/browser/app-tester-prompt-template.d.ts +6 -0
  106. package/lib/browser/app-tester-prompt-template.d.ts.map +1 -0
  107. package/lib/browser/app-tester-prompt-template.js +83 -0
  108. package/lib/browser/app-tester-prompt-template.js.map +1 -0
  109. package/lib/browser/architect-agent.d.ts +15 -0
  110. package/lib/browser/architect-agent.d.ts.map +1 -0
  111. package/lib/browser/architect-agent.js +68 -0
  112. package/lib/browser/architect-agent.js.map +1 -0
  113. package/lib/browser/coder-agent.d.ts +15 -0
  114. package/lib/browser/coder-agent.d.ts.map +1 -0
  115. package/lib/browser/coder-agent.js +81 -0
  116. package/lib/browser/coder-agent.js.map +1 -0
  117. package/lib/browser/context-file-validation-service-impl.d.ts +13 -0
  118. package/lib/browser/context-file-validation-service-impl.d.ts.map +1 -0
  119. package/lib/browser/context-file-validation-service-impl.js +123 -0
  120. package/lib/browser/context-file-validation-service-impl.js.map +1 -0
  121. package/lib/browser/context-file-validation-service-impl.spec.d.ts +2 -0
  122. package/lib/browser/context-file-validation-service-impl.spec.d.ts.map +1 -0
  123. package/lib/browser/context-file-validation-service-impl.spec.js +340 -0
  124. package/lib/browser/context-file-validation-service-impl.spec.js.map +1 -0
  125. package/lib/browser/context-functions.d.ts +16 -0
  126. package/lib/browser/context-functions.d.ts.map +1 -0
  127. package/lib/browser/context-functions.js +166 -0
  128. package/lib/browser/context-functions.js.map +1 -0
  129. package/lib/browser/context-functions.spec.d.ts +2 -0
  130. package/lib/browser/context-functions.spec.d.ts.map +1 -0
  131. package/lib/browser/context-functions.spec.js +213 -0
  132. package/lib/browser/context-functions.spec.js.map +1 -0
  133. package/lib/browser/file-changeset-function.spec.d.ts +2 -0
  134. package/lib/browser/file-changeset-function.spec.d.ts.map +1 -0
  135. package/lib/browser/file-changeset-function.spec.js +45 -0
  136. package/lib/browser/file-changeset-function.spec.js.map +1 -0
  137. package/lib/browser/file-changeset-functions.d.ts +87 -0
  138. package/lib/browser/file-changeset-functions.d.ts.map +1 -0
  139. package/lib/browser/file-changeset-functions.js +645 -0
  140. package/lib/browser/file-changeset-functions.js.map +1 -0
  141. package/lib/browser/file-changeset-functions.spec.d.ts +2 -0
  142. package/lib/browser/file-changeset-functions.spec.d.ts.map +1 -0
  143. package/lib/browser/file-changeset-functions.spec.js +179 -0
  144. package/lib/browser/file-changeset-functions.spec.js.map +1 -0
  145. package/lib/browser/frontend-module.d.ts +5 -0
  146. package/lib/browser/frontend-module.d.ts.map +1 -0
  147. package/lib/browser/frontend-module.js +226 -0
  148. package/lib/browser/frontend-module.js.map +1 -0
  149. package/lib/browser/github-chat-agent.d.ts +48 -0
  150. package/lib/browser/github-chat-agent.d.ts.map +1 -0
  151. package/lib/browser/github-chat-agent.js +222 -0
  152. package/lib/browser/github-chat-agent.js.map +1 -0
  153. package/lib/browser/github-prompt-template.d.ts +6 -0
  154. package/lib/browser/github-prompt-template.d.ts.map +1 -0
  155. package/lib/browser/github-prompt-template.js +53 -0
  156. package/lib/browser/github-prompt-template.js.map +1 -0
  157. package/lib/browser/github-repo-variable-contribution.d.ts +15 -0
  158. package/lib/browser/github-repo-variable-contribution.d.ts.map +1 -0
  159. package/lib/browser/github-repo-variable-contribution.js +82 -0
  160. package/lib/browser/github-repo-variable-contribution.js.map +1 -0
  161. package/lib/browser/ide-chat-welcome-message-provider.d.ts +10 -0
  162. package/lib/browser/ide-chat-welcome-message-provider.d.ts.map +1 -0
  163. package/lib/browser/ide-chat-welcome-message-provider.js +102 -0
  164. package/lib/browser/ide-chat-welcome-message-provider.js.map +1 -0
  165. package/lib/browser/implement-gh-ticket-command-contribution.d.ts +9 -0
  166. package/lib/browser/implement-gh-ticket-command-contribution.d.ts.map +1 -0
  167. package/lib/browser/implement-gh-ticket-command-contribution.js +156 -0
  168. package/lib/browser/implement-gh-ticket-command-contribution.js.map +1 -0
  169. package/lib/browser/project-info-agent.d.ts +13 -0
  170. package/lib/browser/project-info-agent.d.ts.map +1 -0
  171. package/lib/browser/project-info-agent.js +45 -0
  172. package/lib/browser/project-info-agent.js.map +1 -0
  173. package/lib/browser/remember-command-contribution.d.ts +16 -0
  174. package/lib/browser/remember-command-contribution.d.ts.map +1 -0
  175. package/lib/browser/remember-command-contribution.js +101 -0
  176. package/lib/browser/remember-command-contribution.js.map +1 -0
  177. package/lib/browser/summarize-session-command-contribution.d.ts +19 -0
  178. package/lib/browser/summarize-session-command-contribution.d.ts.map +1 -0
  179. package/lib/browser/summarize-session-command-contribution.js +118 -0
  180. package/lib/browser/summarize-session-command-contribution.js.map +1 -0
  181. package/lib/browser/task-background-summary-variable.d.ts +9 -0
  182. package/lib/browser/task-background-summary-variable.d.ts.map +1 -0
  183. package/lib/browser/task-background-summary-variable.js +60 -0
  184. package/lib/browser/task-background-summary-variable.js.map +1 -0
  185. package/lib/browser/task-context-agent.d.ts +13 -0
  186. package/lib/browser/task-context-agent.d.ts.map +1 -0
  187. package/lib/browser/task-context-agent.js +45 -0
  188. package/lib/browser/task-context-agent.js.map +1 -0
  189. package/lib/browser/task-context-file-storage-service.d.ts +40 -0
  190. package/lib/browser/task-context-file-storage-service.d.ts.map +1 -0
  191. package/lib/browser/task-context-file-storage-service.js +232 -0
  192. package/lib/browser/task-context-file-storage-service.js.map +1 -0
  193. package/lib/browser/template-preference-contribution.d.ts +17 -0
  194. package/lib/browser/template-preference-contribution.d.ts.map +1 -0
  195. package/lib/browser/template-preference-contribution.js +94 -0
  196. package/lib/browser/template-preference-contribution.js.map +1 -0
  197. package/lib/browser/test/tool-provider-cancellation-test-util.spec.d.ts +2 -0
  198. package/lib/browser/test/tool-provider-cancellation-test-util.spec.d.ts.map +1 -0
  199. package/lib/browser/test/tool-provider-cancellation-test-util.spec.js +52 -0
  200. package/lib/browser/test/tool-provider-cancellation-test-util.spec.js.map +1 -0
  201. package/lib/browser/workspace-functions.d.ts +78 -0
  202. package/lib/browser/workspace-functions.d.ts.map +1 -0
  203. package/lib/browser/workspace-functions.js +697 -0
  204. package/lib/browser/workspace-functions.js.map +1 -0
  205. package/lib/browser/workspace-functions.spec.d.ts +2 -0
  206. package/lib/browser/workspace-functions.spec.d.ts.map +1 -0
  207. package/lib/browser/workspace-functions.spec.js +161 -0
  208. package/lib/browser/workspace-functions.spec.js.map +1 -0
  209. package/lib/browser/workspace-launch-provider.d.ts +24 -0
  210. package/lib/browser/workspace-launch-provider.d.ts.map +1 -0
  211. package/lib/browser/workspace-launch-provider.js +216 -0
  212. package/lib/browser/workspace-launch-provider.js.map +1 -0
  213. package/lib/browser/workspace-launch-provider.spec.d.ts +2 -0
  214. package/lib/browser/workspace-launch-provider.spec.d.ts.map +1 -0
  215. package/lib/browser/workspace-launch-provider.spec.js +245 -0
  216. package/lib/browser/workspace-launch-provider.spec.js.map +1 -0
  217. package/lib/browser/workspace-search-provider.d.ts +15 -0
  218. package/lib/browser/workspace-search-provider.d.ts.map +1 -0
  219. package/lib/browser/workspace-search-provider.js +204 -0
  220. package/lib/browser/workspace-search-provider.js.map +1 -0
  221. package/lib/browser/workspace-search-provider.spec.d.ts +2 -0
  222. package/lib/browser/workspace-search-provider.spec.d.ts.map +1 -0
  223. package/lib/browser/workspace-search-provider.spec.js +82 -0
  224. package/lib/browser/workspace-search-provider.spec.js.map +1 -0
  225. package/lib/browser/workspace-task-provider.d.ts +15 -0
  226. package/lib/browser/workspace-task-provider.d.ts.map +1 -0
  227. package/lib/browser/workspace-task-provider.js +138 -0
  228. package/lib/browser/workspace-task-provider.js.map +1 -0
  229. package/lib/browser/workspace-task-provider.spec.d.ts +2 -0
  230. package/lib/browser/workspace-task-provider.spec.d.ts.map +1 -0
  231. package/lib/browser/workspace-task-provider.spec.js +109 -0
  232. package/lib/browser/workspace-task-provider.spec.js.map +1 -0
  233. package/lib/common/ai-configuration-preferences.d.ts +8 -0
  234. package/lib/common/ai-configuration-preferences.d.ts.map +1 -0
  235. package/lib/common/ai-configuration-preferences.js +41 -0
  236. package/lib/common/ai-configuration-preferences.js.map +1 -0
  237. package/lib/common/ai-ide-preferences.d.ts +5 -0
  238. package/lib/common/ai-ide-preferences.d.ts.map +1 -0
  239. package/lib/common/ai-ide-preferences.js +53 -0
  240. package/lib/common/ai-ide-preferences.js.map +1 -0
  241. package/lib/common/ai-terminal-functions.d.ts +2 -0
  242. package/lib/common/ai-terminal-functions.d.ts.map +1 -0
  243. package/lib/common/ai-terminal-functions.js +20 -0
  244. package/lib/common/ai-terminal-functions.js.map +1 -0
  245. package/lib/common/app-tester-chat-functions.d.ts +5 -0
  246. package/lib/common/app-tester-chat-functions.d.ts.map +1 -0
  247. package/lib/common/app-tester-chat-functions.js +23 -0
  248. package/lib/common/app-tester-chat-functions.js.map +1 -0
  249. package/lib/common/architect-prompt-template.d.ts +3 -0
  250. package/lib/common/architect-prompt-template.d.ts.map +1 -0
  251. package/lib/common/architect-prompt-template.js +81 -0
  252. package/lib/common/architect-prompt-template.js.map +1 -0
  253. package/lib/common/browser-automation-protocol.d.ts +15 -0
  254. package/lib/common/browser-automation-protocol.d.ts.map +1 -0
  255. package/lib/common/browser-automation-protocol.js +22 -0
  256. package/lib/common/browser-automation-protocol.js.map +1 -0
  257. package/lib/common/coder-replace-prompt-template.d.ts +11 -0
  258. package/lib/common/coder-replace-prompt-template.d.ts.map +1 -0
  259. package/lib/common/coder-replace-prompt-template.js +296 -0
  260. package/lib/common/coder-replace-prompt-template.js.map +1 -0
  261. package/lib/common/command-chat-agents.d.ts +36 -0
  262. package/lib/common/command-chat-agents.d.ts.map +1 -0
  263. package/lib/common/command-chat-agents.js +122 -0
  264. package/lib/common/command-chat-agents.js.map +1 -0
  265. package/lib/common/command-prompt-template.d.ts +3 -0
  266. package/lib/common/command-prompt-template.d.ts.map +1 -0
  267. package/lib/common/command-prompt-template.js +226 -0
  268. package/lib/common/command-prompt-template.js.map +1 -0
  269. package/lib/common/context-files-variable.d.ts +9 -0
  270. package/lib/common/context-files-variable.d.ts.map +1 -0
  271. package/lib/common/context-files-variable.js +52 -0
  272. package/lib/common/context-files-variable.js.map +1 -0
  273. package/lib/common/context-functions.d.ts +4 -0
  274. package/lib/common/context-functions.d.ts.map +1 -0
  275. package/lib/common/context-functions.js +22 -0
  276. package/lib/common/context-functions.js.map +1 -0
  277. package/lib/common/context-variables.d.ts +3 -0
  278. package/lib/common/context-variables.d.ts.map +1 -0
  279. package/lib/common/context-variables.js +21 -0
  280. package/lib/common/context-variables.js.map +1 -0
  281. package/lib/common/file-changeset-function-ids.d.ts +19 -0
  282. package/lib/common/file-changeset-function-ids.d.ts.map +1 -0
  283. package/lib/common/file-changeset-function-ids.js +37 -0
  284. package/lib/common/file-changeset-function-ids.js.map +1 -0
  285. package/lib/common/github-repo-protocol.d.ts +15 -0
  286. package/lib/common/github-repo-protocol.d.ts.map +1 -0
  287. package/lib/common/github-repo-protocol.js +21 -0
  288. package/lib/common/github-repo-protocol.js.map +1 -0
  289. package/lib/common/orchestrator-chat-agent.d.ts +36 -0
  290. package/lib/common/orchestrator-chat-agent.d.ts.map +1 -0
  291. package/lib/common/orchestrator-chat-agent.js +167 -0
  292. package/lib/common/orchestrator-chat-agent.js.map +1 -0
  293. package/lib/common/orchestrator-prompt-template.d.ts +3 -0
  294. package/lib/common/orchestrator-prompt-template.d.ts.map +1 -0
  295. package/lib/common/orchestrator-prompt-template.js +55 -0
  296. package/lib/common/orchestrator-prompt-template.js.map +1 -0
  297. package/lib/common/project-info-prompt-template.d.ts +6 -0
  298. package/lib/common/project-info-prompt-template.d.ts.map +1 -0
  299. package/lib/common/project-info-prompt-template.js +145 -0
  300. package/lib/common/project-info-prompt-template.js.map +1 -0
  301. package/lib/common/summarize-session-commands.d.ts +4 -0
  302. package/lib/common/summarize-session-commands.d.ts.map +1 -0
  303. package/lib/common/summarize-session-commands.js +28 -0
  304. package/lib/common/summarize-session-commands.js.map +1 -0
  305. package/lib/common/task-context-prompt-template.d.ts +8 -0
  306. package/lib/common/task-context-prompt-template.d.ts.map +1 -0
  307. package/lib/common/task-context-prompt-template.js +217 -0
  308. package/lib/common/task-context-prompt-template.js.map +1 -0
  309. package/lib/common/universal-chat-agent.d.ts +17 -0
  310. package/lib/common/universal-chat-agent.d.ts.map +1 -0
  311. package/lib/common/universal-chat-agent.js +47 -0
  312. package/lib/common/universal-chat-agent.js.map +1 -0
  313. package/lib/common/universal-prompt-template.d.ts +4 -0
  314. package/lib/common/universal-prompt-template.d.ts.map +1 -0
  315. package/lib/common/universal-prompt-template.js +32 -0
  316. package/lib/common/universal-prompt-template.js.map +1 -0
  317. package/lib/common/workspace-functions.d.ts +12 -0
  318. package/lib/common/workspace-functions.d.ts.map +1 -0
  319. package/lib/common/workspace-functions.js +30 -0
  320. package/lib/common/workspace-functions.js.map +1 -0
  321. package/lib/common/workspace-preferences.d.ts +10 -0
  322. package/lib/common/workspace-preferences.d.ts.map +1 -0
  323. package/lib/common/workspace-preferences.js +89 -0
  324. package/lib/common/workspace-preferences.js.map +1 -0
  325. package/lib/common/workspace-search-provider-util.d.ts +17 -0
  326. package/lib/common/workspace-search-provider-util.d.ts.map +1 -0
  327. package/lib/common/workspace-search-provider-util.js +51 -0
  328. package/lib/common/workspace-search-provider-util.js.map +1 -0
  329. package/lib/node/app-tester-agent/browser-automation-impl.d.ts +18 -0
  330. package/lib/node/app-tester-agent/browser-automation-impl.d.ts.map +1 -0
  331. package/lib/node/app-tester-agent/browser-automation-impl.js +96 -0
  332. package/lib/node/app-tester-agent/browser-automation-impl.js.map +1 -0
  333. package/lib/node/backend-module.d.ts +4 -0
  334. package/lib/node/backend-module.d.ts.map +1 -0
  335. package/lib/node/backend-module.js +45 -0
  336. package/lib/node/backend-module.js.map +1 -0
  337. package/lib/node/github-repo-service-impl.d.ts +7 -0
  338. package/lib/node/github-repo-service-impl.d.ts.map +1 -0
  339. package/lib/node/github-repo-service-impl.js +86 -0
  340. package/lib/node/github-repo-service-impl.js.map +1 -0
  341. package/lib/package.spec.d.ts +1 -0
  342. package/lib/package.spec.d.ts.map +1 -0
  343. package/lib/package.spec.js +26 -0
  344. package/lib/package.spec.js.map +1 -0
  345. package/package.json +21 -21
  346. package/src/browser/address-pr-review-command-contribution.ts +180 -0
  347. package/src/browser/ai-configuration/agent-configuration-widget.tsx +256 -135
  348. package/src/browser/ai-configuration/base/ai-card-grid-configuration-widget.tsx +72 -0
  349. package/src/browser/ai-configuration/base/ai-configuration-base-widget.tsx +37 -0
  350. package/src/browser/ai-configuration/base/ai-hierarchical-configuration-widget.tsx +51 -0
  351. package/src/browser/ai-configuration/base/ai-list-detail-configuration-widget.tsx +140 -0
  352. package/src/browser/ai-configuration/base/ai-table-configuration-widget.tsx +107 -0
  353. package/src/browser/ai-configuration/components/configuration-section.tsx +37 -0
  354. package/src/browser/ai-configuration/components/empty-state.tsx +30 -0
  355. package/src/browser/ai-configuration/components/expandable-section.tsx +51 -0
  356. package/src/browser/ai-configuration/language-model-renderer.tsx +68 -63
  357. package/src/browser/ai-configuration/mcp-configuration-widget.tsx +80 -85
  358. package/src/browser/ai-configuration/model-aliases-configuration-widget.tsx +93 -107
  359. package/src/browser/ai-configuration/template-settings-renderer.tsx +25 -29
  360. package/src/browser/ai-configuration/token-usage-configuration-widget.tsx +130 -130
  361. package/src/browser/ai-configuration/tools-configuration-widget.tsx +68 -59
  362. package/src/browser/ai-configuration/variable-configuration-widget.tsx +95 -45
  363. package/src/browser/analyze-gh-ticket-command-contribution.ts +176 -0
  364. package/src/browser/frontend-module.ts +6 -0
  365. package/src/browser/implement-gh-ticket-command-contribution.ts +160 -0
  366. package/src/browser/style/ai-configuration-base.css +90 -0
  367. package/src/browser/style/ai-configuration-cards.css +60 -0
  368. package/src/browser/style/ai-configuration-hierarchical.css +61 -0
  369. package/src/browser/style/ai-configuration-list-detail.css +88 -0
  370. package/src/browser/style/ai-configuration-table.css +73 -0
  371. package/src/browser/style/index.css +458 -288
  372. package/src/browser/style/widgets/mcp-configuration.css +253 -0
  373. package/src/browser/style/widgets/model-aliases-configuration.css +74 -0
@@ -27,7 +27,7 @@ import {
27
27
  PromptFragmentCustomizationService,
28
28
  PromptService,
29
29
  } from '@theia/ai-core/lib/common';
30
- import { codicon, QuickInputService, ReactWidget } from '@theia/core/lib/browser';
30
+ import { codicon, QuickInputService } from '@theia/core/lib/browser';
31
31
  import { URI } from '@theia/core/lib/common';
32
32
  import { inject, injectable, postConstruct } from '@theia/core/shared/inversify';
33
33
  import * as React from '@theia/core/shared/react';
@@ -37,6 +37,7 @@ import { LanguageModelAliasRegistry, LanguageModelAlias } from '@theia/ai-core/l
37
37
  import { AIVariableConfigurationWidget } from './variable-configuration-widget';
38
38
  import { nls } from '@theia/core';
39
39
  import { PromptVariantRenderer } from './template-settings-renderer';
40
+ import { AIListDetailConfigurationWidget } from './base/ai-list-detail-configuration-widget';
40
41
 
41
42
  interface ParsedPrompt {
42
43
  functions: string[];
@@ -45,7 +46,7 @@ interface ParsedPrompt {
45
46
  };
46
47
 
47
48
  @injectable()
48
- export class AIAgentConfigurationWidget extends ReactWidget {
49
+ export class AIAgentConfigurationWidget extends AIListDetailConfigurationWidget<Agent> {
49
50
 
50
51
  static readonly ID = 'ai-agent-configuration-container-widget';
51
52
  static readonly LABEL = nls.localize('theia/ai/core/agentConfiguration/label', 'Agents');
@@ -88,10 +89,13 @@ export class AIAgentConfigurationWidget extends ReactWidget {
88
89
  this.title.label = AIAgentConfigurationWidget.LABEL;
89
90
  this.title.closable = false;
90
91
 
91
- this.languageModelRegistry.getLanguageModels().then(models => {
92
- this.languageModels = models ?? [];
93
- this.update();
94
- });
92
+ Promise.all([
93
+ this.loadItems(),
94
+ this.languageModelRegistry.getLanguageModels().then(models => {
95
+ this.languageModels = models ?? [];
96
+ })
97
+ ]).then(() => this.update());
98
+
95
99
  this.languageModelAliasRegistry.ready.then(() => {
96
100
  this.languageModelAliases = this.languageModelAliasRegistry.getAliases();
97
101
  this.toDispose.push(this.languageModelAliasRegistry.onDidChange(() => {
@@ -99,86 +103,130 @@ export class AIAgentConfigurationWidget extends ReactWidget {
99
103
  this.update();
100
104
  }));
101
105
  });
102
- this.toDispose.push(this.languageModelRegistry.onChange(({ models }) => {
103
- this.languageModelAliases = this.languageModelAliasRegistry.getAliases();
104
- this.languageModels = models;
105
- this.update();
106
- }));
107
- this.toDispose.push(this.promptService.onPromptsChange(() => this.updateParsedPromptParts()));
108
106
 
109
- // Only call updateParsedPromptParts() as it already calls this.update() internally
110
- this.toDispose.push(this.promptFragmentCustomizationService.onDidChangePromptFragmentCustomization(() => {
111
- this.updateParsedPromptParts();
112
- }));
107
+ this.toDispose.pushAll([
108
+ this.languageModelRegistry.onChange(({ models }) => {
109
+ this.languageModelAliases = this.languageModelAliasRegistry.getAliases();
110
+ this.languageModels = models;
111
+ this.update();
112
+ }),
113
+ this.promptService.onPromptsChange(() => this.updateParsedPromptParts()),
114
+ this.promptFragmentCustomizationService.onDidChangePromptFragmentCustomization(() => {
115
+ this.updateParsedPromptParts();
116
+ }),
117
+ this.aiSettingsService.onDidChange(() => {
118
+ this.updateParsedPromptParts();
119
+ }),
120
+ this.aiConfigurationSelectionService.onDidAgentChange(() => {
121
+ this.selectedItem = this.aiConfigurationSelectionService.getActiveAgent();
122
+ this.updateParsedPromptParts();
123
+ }),
124
+ this.agentService.onDidChangeAgents(async () => {
125
+ await this.loadItems();
126
+ this.update();
127
+ })
128
+ ]);
113
129
 
114
- // Only call updateParsedPromptParts() as it already calls this.update() internally
115
- this.toDispose.push(this.aiSettingsService.onDidChange(() => {
116
- this.updateParsedPromptParts();
117
- }));
130
+ this.updateParsedPromptParts();
131
+ }
118
132
 
119
- // Only call updateParsedPromptParts() as it already calls this.update() internally
120
- this.toDispose.push(this.aiConfigurationSelectionService.onDidAgentChange(() => {
121
- this.updateParsedPromptParts();
122
- }));
133
+ protected async loadItems(): Promise<void> {
134
+ this.items = this.agentService.getAllAgents();
135
+ const activeAgent = this.aiConfigurationSelectionService.getActiveAgent();
136
+ if (activeAgent) {
137
+ this.selectedItem = activeAgent;
138
+ } else if (this.items.length > 0 && !this.selectedItem) {
139
+ this.selectedItem = this.items[0];
140
+ this.aiConfigurationSelectionService.setActiveAgent(this.items[0]);
141
+ }
142
+ }
143
+
144
+ protected getItemId(agent: Agent): string {
145
+ return agent.id;
146
+ }
147
+
148
+ protected getItemLabel(agent: Agent): string {
149
+ return agent.name;
150
+ }
123
151
 
124
- this.agentService.onDidChangeAgents(() => this.update());
152
+ protected override getEmptySelectionMessage(): string {
153
+ return nls.localize('theia/ai/core/agentConfiguration/selectAgentMessage', 'Please select an Agent first!');
154
+ }
155
+
156
+ protected override handleItemSelect = (agent: Agent): void => {
157
+ this.selectedItem = agent;
158
+ this.aiConfigurationSelectionService.setActiveAgent(agent);
125
159
  this.updateParsedPromptParts();
160
+ };
161
+
162
+ protected override renderItemPrefix(agent: Agent): React.ReactNode {
163
+ const enabled = this.agentService.isEnabled(agent.id);
164
+ return (
165
+ <span
166
+ className={
167
+ `agent-status-indicator ${enabled ? `agent-enabled ${codicon('circle-filled')}` : `agent-disabled ${codicon('circle')}`}`
168
+ }
169
+ title={enabled ? 'Enabled' : 'Disabled'}
170
+ >
171
+ </span>
172
+ );
126
173
  }
127
174
 
128
- protected async updateParsedPromptParts(): Promise<void> {
129
- this.isLoadingDetails = true;
130
- const agent = this.aiConfigurationSelectionService.getActiveAgent();
131
- if (agent) {
132
- this.parsedPromptParts = await this.parsePromptFragmentsForVariableAndFunction(agent);
133
- } else {
134
- this.parsedPromptParts = undefined;
175
+ protected override renderItemSuffix(agent: Agent): React.ReactNode {
176
+ if (!agent.tags?.length) {
177
+ return undefined;
135
178
  }
136
- this.isLoadingDetails = false;
137
- this.update();
179
+ return <span>{agent.tags.map(tag => <span key={tag} className='agent-tag'>{tag}</span>)}</span>;
138
180
  }
139
181
 
140
- protected render(): React.ReactNode {
141
- return <div className='ai-agent-configuration-main'>
142
- <div className='configuration-agents-list theia-Tree theia-TreeContainer' style={{ width: '25%' }}>
182
+ protected override renderList(): React.ReactNode {
183
+ return (
184
+ <div className="ai-configuration-list preferences-tree-widget theia-TreeContainer">
143
185
  <ul>
144
- {this.agentService.getAllAgents().map(agent => {
145
- const isActive = this.aiConfigurationSelectionService.getActiveAgent()?.id === agent.id;
146
- const className = `theia-TreeNode theia-CompositeTreeNode theia-ExpandableTreeNode${isActive ? ' theia-mod-selected' : ''}`;
147
- return <li key={agent.id} className={className} onClick={() => this.setActiveAgent(agent)}>
148
- {this.renderAgentName(agent)}
149
- </li>;
186
+ {this.items.map(agent => {
187
+ const agentId = this.getItemId(agent);
188
+ const isSelected = this.selectedItem && this.getItemId(this.selectedItem) === agentId;
189
+ return (
190
+ <li
191
+ key={agentId}
192
+ className={`theia-TreeNode theia-CompositeTreeNode${isSelected ? ' theia-mod-selected' : ''} ${this.getItemClassName(agent)}`}
193
+ onClick={() => this.handleItemSelect(agent)}
194
+ >
195
+ {this.renderItemPrefix(agent)}
196
+ <span className="ai-configuration-list-item-label">{this.getItemLabel(agent)}</span>
197
+ {this.renderItemSuffix(agent)}
198
+ </li>
199
+ );
150
200
  })}
151
201
  </ul>
152
202
  <div className='configuration-agents-add'>
153
203
  <button
154
- style={{ marginLeft: 0 }}
155
204
  className='theia-button main'
156
205
  onClick={() => this.addCustomAgent()}>
157
206
  {nls.localize('theia/ai/core/agentConfiguration/addCustomAgent', 'Add Custom Agent')}
158
207
  </button>
159
208
  </div>
160
209
  </div>
161
- <div className='configuration-agent-panel preferences-editor-widget'>
162
- {this.renderAgentDetails()}
163
- </div>
164
- </div>;
210
+ );
165
211
  }
166
212
 
167
- protected renderAgentName(agent: Agent): React.ReactNode {
168
- const tagsSuffix = agent.tags?.length ? <span>{agent.tags.map(tag => <span key={tag} className='agent-tag'>{tag}</span>)}</span> : '';
169
- return <span>{agent.name} {tagsSuffix}</span>;
213
+ protected async updateParsedPromptParts(): Promise<void> {
214
+ this.isLoadingDetails = true;
215
+ const agent = this.aiConfigurationSelectionService.getActiveAgent();
216
+ if (agent) {
217
+ this.parsedPromptParts = await this.parsePromptFragmentsForVariableAndFunction(agent);
218
+ } else {
219
+ this.parsedPromptParts = undefined;
220
+ }
221
+ this.isLoadingDetails = false;
222
+ this.update();
170
223
  }
171
224
 
172
- protected renderAgentDetails(): React.ReactNode {
225
+ protected renderItemDetail(agent: Agent): React.ReactNode {
173
226
  if (this.isLoadingDetails) {
174
227
  return <div>{nls.localize('theia/ai/core/agentConfiguration/loading', 'Loading...')}</div>;
175
228
  }
176
229
 
177
- const agent = this.aiConfigurationSelectionService.getActiveAgent();
178
- if (!agent) {
179
- return <div>{nls.localize('theia/ai/core/agentConfiguration/selectAgentMessage', 'Please select an Agent first!')}</div>;
180
- }
181
-
182
230
  const enabled = this.agentService.isEnabled(agent.id);
183
231
 
184
232
  if (!this.parsedPromptParts) {
@@ -189,42 +237,58 @@ export class AIAgentConfigurationWidget extends ReactWidget {
189
237
  const globalVariables = Array.from(new Set([...this.parsedPromptParts.globalVariables, ...agent.variables]));
190
238
  const functions = Array.from(new Set([...this.parsedPromptParts.functions, ...agent.functions]));
191
239
 
192
- return <div key={agent.id} style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start' }}>
193
- <div className='settings-section-title settings-section-category-title' style={{ paddingLeft: 0, paddingBottom: 10 }}>
194
- {this.renderAgentName(agent)}
195
- <pre style={{ fontSize: 'small', margin: 0 }}>
196
- Id: {agent.id}
197
- </pre>
198
- </div>
199
- <div style={{ paddingBottom: 10 }}>{agent.description}</div>
200
- <div style={{ paddingBottom: 10 }}>
201
- <label>
202
- <input type="checkbox" checked={enabled} onChange={this.toggleAgentEnabled} />
203
- {nls.localize('theia/ai/core/agentConfiguration/enableAgent', 'Enable Agent')}
204
- </label>
205
- </div>
206
- <div className="settings-section-subcategory-title ai-settings-section-subcategory-title">
207
- {nls.localize('theia/ai/core/agentConfiguration/promptTemplates', 'Prompt Templates')}
240
+ const agentNameWithTags = <>
241
+ {agent.name}
242
+ {agent.tags?.length && <span>{agent.tags.map(tag => <span key={tag} className='agent-tag'>{tag}</span>)}</span>}
243
+ </>;
244
+
245
+ return <div key={agent.id}>
246
+ <div className='settings-section-title settings-section-category-title agent-title-with-toggle'>
247
+ <div className='agent-title-content'>
248
+ <div>
249
+ {agentNameWithTags}
250
+ <pre className='ai-id-label'>Id: {agent.id}</pre>
251
+ </div>
252
+ <label className='agent-enable-toggle' title={nls.localize('theia/ai/core/agentConfiguration/enableAgent', 'Enable Agent')}>
253
+ <div className='toggle-switch' onClick={this.toggleAgentEnabled}>
254
+ <input type="checkbox" checked={enabled} onChange={this.toggleAgentEnabled} />
255
+ <span className='toggle-slider'></span>
256
+ </div>
257
+ </label>
258
+ </div>
208
259
  </div>
209
- <div className="ai-templates">
210
- {(() => {
211
- const prompts = agent.prompts;
212
- return prompts.length > 0 ? (
213
- prompts.map(prompt => (
214
- <div key={agent.id + '.' + prompt.id}>
260
+
261
+ {agent.description && (
262
+ <div className="ai-agent-description">
263
+ {agent.description}
264
+ </div>
265
+ )}
266
+ {agent.prompts.length > 0 && (
267
+ <>
268
+ <div className="settings-section-subcategory-title ai-settings-section-subcategory-title">
269
+ {nls.localize('theia/ai/core/agentConfiguration/promptTemplates', 'Prompt Templates')}
270
+ </div>
271
+ <table className="ai-templates-table">
272
+ <thead>
273
+ <tr>
274
+ <th>{nls.localize('theia/ai/core/agentConfiguration/templateName', 'Template')}</th>
275
+ <th>{nls.localize('theia/ai/core/agentConfiguration/variant', 'Variant')}</th>
276
+ <th className="template-actions-header">{nls.localize('theia/ai/core/agentConfiguration/actions', 'Actions')}</th>
277
+ </tr>
278
+ </thead>
279
+ <tbody>
280
+ {agent.prompts.map(prompt => (
215
281
  <PromptVariantRenderer
216
282
  key={agent.id + '.' + prompt.id}
217
283
  agentId={agent.id}
218
284
  promptVariantSet={prompt}
219
285
  promptService={this.promptService}
220
286
  />
221
- </div>
222
- ))
223
- ) : (
224
- <div>{nls.localize('theia/ai/core/agentConfiguration/noDefaultTemplate', 'No default template available')}</div>
225
- );
226
- })()}
227
- </div>
287
+ ))}
288
+ </tbody>
289
+ </table>
290
+ </>
291
+ )}
228
292
 
229
293
  <div className='ai-lm-requirements'>
230
294
  <LanguageModelRenderer
@@ -235,27 +299,43 @@ export class AIAgentConfigurationWidget extends ReactWidget {
235
299
  languageModelAliases={this.languageModelAliases}
236
300
  />
237
301
  </div>
238
- <div>
239
- <span>Used Global Variables:</span>
240
- <ul className='variable-references'>
241
- <AgentGlobalVariables variables={globalVariables} showVariableConfigurationTab={this.showVariableConfigurationTab.bind(this)} />
242
- </ul>
243
- </div>
244
- <div>
245
- <span>Used agent-specific Variables:</span>
246
- <ul className='variable-references'>
247
- <AgentSpecificVariables
248
- promptVariables={this.parsedPromptParts.agentSpecificVariables}
249
- agent={agent}
302
+
303
+ {globalVariables.length > 0 && (
304
+ <>
305
+ <div className="settings-section-subcategory-title">
306
+ {nls.localize('theia/ai/core/agentConfiguration/usedGlobalVariables', 'Used Global Variables')}
307
+ </div>
308
+ <AgentGlobalVariables
309
+ variables={globalVariables}
310
+ variableService={this.variableService}
250
311
  />
251
- </ul>
252
- </div>
253
- <div>
254
- <span>Used Functions:</span>
255
- <ul className='function-references'>
256
- <AgentFunctions functions={functions} />
257
- </ul>
258
- </div>
312
+ </>
313
+ )}
314
+
315
+ {this.parsedPromptParts.agentSpecificVariables.length > 0 && (
316
+ <>
317
+ <div className="settings-section-subcategory-title">
318
+ {nls.localize('theia/ai/core/agentConfiguration/usedAgentSpecificVariables', 'Used Agent-Specific Variables')}
319
+ </div>
320
+ <ul className='variable-references'>
321
+ <AgentSpecificVariables
322
+ promptVariables={this.parsedPromptParts.agentSpecificVariables}
323
+ agent={agent}
324
+ />
325
+ </ul>
326
+ </>
327
+ )}
328
+
329
+ {functions.length > 0 && (
330
+ <>
331
+ <div className="settings-section-subcategory-title">
332
+ {nls.localize('theia/ai/core/agentConfiguration/usedFunctions', 'Used Functions')}
333
+ </div>
334
+ <ul className='function-references'>
335
+ <AgentFunctions functions={functions} />
336
+ </ul>
337
+ </>
338
+ )}
259
339
  </div>;
260
340
  }
261
341
 
@@ -282,12 +362,10 @@ export class AIAgentConfigurationWidget extends ReactWidget {
282
362
  const variableMatches = matchVariablesRegEx(promptContent);
283
363
  variableMatches.forEach(match => {
284
364
  const variableId = match[1];
285
- // skip comments
286
365
  if (variableId.startsWith('!--')) {
287
366
  return;
288
367
  }
289
368
 
290
- // Extract base variable ID without arguments
291
369
  const baseVariableId = variableId.split(':')[0];
292
370
 
293
371
  if (this.variableService.hasVariable(baseVariableId) &&
@@ -342,11 +420,6 @@ export class AIAgentConfigurationWidget extends ReactWidget {
342
420
  quickPick.show();
343
421
  }
344
422
 
345
- protected setActiveAgent(agent: Agent): void {
346
- this.aiConfigurationSelectionService.setActiveAgent(agent);
347
- this.updateParsedPromptParts();
348
- }
349
-
350
423
  private toggleAgentEnabled = async () => {
351
424
  const agent = this.aiConfigurationSelectionService.getActiveAgent();
352
425
  if (!agent) {
@@ -364,19 +437,45 @@ export class AIAgentConfigurationWidget extends ReactWidget {
364
437
 
365
438
  interface AgentGlobalVariablesProps {
366
439
  variables: string[];
367
- showVariableConfigurationTab: () => void;
440
+ variableService: AIVariableService;
368
441
  }
369
- const AgentGlobalVariables = ({ variables: globalVariables, showVariableConfigurationTab }: AgentGlobalVariablesProps) => {
442
+ const AgentGlobalVariables = ({ variables: globalVariables, variableService }: AgentGlobalVariablesProps) => {
370
443
  if (globalVariables.length === 0) {
371
- return <>{nls.localizeByDefault('None')}</>;
444
+ return <div className="ai-empty-state-content">
445
+ {nls.localizeByDefault('None')}
446
+ </div>;
372
447
  }
373
- return <>
374
- {globalVariables.map(variableId => <li key={variableId} className='theia-TreeNode theia-CompositeTreeNode theia-ExpandableTreeNode theia-mod-selected'>
375
- <div key={variableId} onClick={() => { showVariableConfigurationTab(); }} className='variable-reference'>
376
- <span>{variableId}</span>
377
- <i className={codicon('chevron-right')}></i>
378
- </div></li>)}
379
- </>;
448
+
449
+ const allVariables = variableService.getVariables();
450
+ const variableData = globalVariables.map(varId => {
451
+ const variable = allVariables.find(v => v.id === varId);
452
+ return {
453
+ id: varId,
454
+ name: variable?.name || varId,
455
+ description: variable?.description || ''
456
+ };
457
+ });
458
+
459
+ return (
460
+ <table className="ai-templates-table">
461
+ <thead>
462
+ <tr>
463
+ <th>{nls.localize('theia/ai/ide/agentConfiguration/variableName', 'Variable')}</th>
464
+ <th>{nls.localize('theia/ai/ide/agentConfiguration/variableDescription', 'Description')}</th>
465
+ </tr>
466
+ </thead>
467
+ <tbody>
468
+ {variableData.map(variable => (
469
+ <tr key={variable.id}>
470
+ <td className="ai-variable-name-cell">{variable.name}</td>
471
+ <td className="ai-variable-description-cell">
472
+ {variable.description || nls.localize('theia/ai/ide/agentConfiguration/noDescription', 'No description available')}
473
+ </td>
474
+ </tr>
475
+ ))}
476
+ </tbody>
477
+ </table>
478
+ );
380
479
  };
381
480
 
382
481
  interface AgentFunctionsProps {
@@ -401,9 +500,11 @@ const AgentSpecificVariables = ({ promptVariables, agent }: AgentSpecificVariabl
401
500
  const agentDefinedVariablesName = agent.agentSpecificVariables.map(v => v.name);
402
501
  const variables = Array.from(new Set([...promptVariables, ...agentDefinedVariablesName]));
403
502
  if (variables.length === 0) {
404
- return <>{nls.localizeByDefault('None')}</>;
503
+ return <div className="ai-empty-state-content">
504
+ {nls.localizeByDefault('None')}
505
+ </div>;
405
506
  }
406
- return <>
507
+ return <div>
407
508
  {variables.map(variableId =>
408
509
  <AgentSpecificVariable
409
510
  key={variableId}
@@ -411,7 +512,7 @@ const AgentSpecificVariables = ({ promptVariables, agent }: AgentSpecificVariabl
411
512
  agent={agent}
412
513
  promptVariables={promptVariables} />
413
514
  )}
414
- </>;
515
+ </div>;
415
516
  };
416
517
  interface AgentSpecificVariableProps {
417
518
  variableId: string;
@@ -422,13 +523,33 @@ const AgentSpecificVariable = ({ variableId, agent, promptVariables }: AgentSpec
422
523
  const agentDefinedVariable = agent.agentSpecificVariables.find(v => v.name === variableId);
423
524
  const undeclared = agentDefinedVariable === undefined;
424
525
  const notUsed = !promptVariables.includes(variableId) && agentDefinedVariable?.usedInPrompt === true;
425
- return <li key={variableId}>
426
- <div><span>{nls.localize('theia/ai/core/agentConfiguration/name', 'Name:')}</span> <span>{variableId}</span></div>
427
- {undeclared ? <div><span>{nls.localize('theia/ai/core/agentConfiguration/undeclared', 'Undeclared')}</span></div> :
428
- (<>
429
- <div><span>{nls.localize('theia/ai/core/agentConfiguration/description', 'Description:')}</span> <span>{agentDefinedVariable.description}</span></div>
430
- {notUsed && <div>{nls.localize('theia/ai/core/agentConfiguration/notUsedInPrompt', 'Not used in prompt')}</div>}
431
- </>)}
432
- <hr />
433
- </li>;
526
+ return <div key={variableId} className="ai-agent-specific-variable-item">
527
+ <div className="ai-configuration-value-row">
528
+ <span className="ai-configuration-value-row-label">{nls.localize('theia/ai/core/agentConfiguration/name', 'Name')}:</span>
529
+ <span className="ai-configuration-value-row-value">{variableId}</span>
530
+ </div>
531
+ {undeclared ? (
532
+ <div className="ai-configuration-value-row">
533
+ <span className="ai-configuration-value-row-label">{nls.localize('theia/ai/core/agentConfiguration/status', 'Status')}:</span>
534
+ <span className="ai-configuration-value-row-value ai-configuration-warning-text">
535
+ {nls.localize('theia/ai/core/agentConfiguration/undeclared', 'Undeclared')}
536
+ </span>
537
+ </div>
538
+ ) : (
539
+ <>
540
+ <div className="ai-configuration-value-row">
541
+ <span className="ai-configuration-value-row-label">{nls.localize('theia/ai/core/agentConfiguration/description', 'Description')}:</span>
542
+ <span className="ai-configuration-value-row-value">{agentDefinedVariable.description}</span>
543
+ </div>
544
+ {notUsed && (
545
+ <div className="ai-configuration-value-row">
546
+ <span className="ai-configuration-value-row-label">{nls.localize('theia/ai/core/agentConfiguration/status', 'Status')}:</span>
547
+ <span className="ai-configuration-value-row-value ai-configuration-warning-text">
548
+ {nls.localize('theia/ai/core/agentConfiguration/notUsedInPrompt', 'Not used in prompt')}
549
+ </span>
550
+ </div>
551
+ )}
552
+ </>
553
+ )}
554
+ </div>;
434
555
  };
@@ -0,0 +1,72 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2025 EclipseSource GmbH.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+ import * as React from '@theia/core/shared/react';
17
+ import { injectable } from '@theia/core/shared/inversify';
18
+ import { AIConfigurationBaseWidget } from './ai-configuration-base-widget';
19
+
20
+ /**
21
+ * Base class for AI configuration widgets that display items in a responsive card grid.
22
+ * This pattern is used by the MCP configuration widget.
23
+ */
24
+ @injectable()
25
+ export abstract class AICardGridConfigurationWidget<T> extends AIConfigurationBaseWidget {
26
+ protected items: T[] = [];
27
+
28
+ /**
29
+ * Get unique identifier for an item.
30
+ */
31
+ protected abstract getItemId(item: T): string;
32
+
33
+ /**
34
+ * Render a single card for an item.
35
+ */
36
+ protected abstract renderCard(item: T): React.ReactNode;
37
+
38
+ /**
39
+ * Load items to display in the grid. Called during initialization.
40
+ */
41
+ protected abstract loadItems(): Promise<void>;
42
+
43
+ /**
44
+ * Optional: Render content before the card grid (e.g., header, controls).
45
+ */
46
+ protected renderHeader(): React.ReactNode {
47
+ return undefined;
48
+ }
49
+
50
+ /**
51
+ * Optional: Render content after the card grid.
52
+ */
53
+ protected renderFooter(): React.ReactNode {
54
+ return undefined;
55
+ }
56
+
57
+ protected renderContent(): React.ReactNode {
58
+ return (
59
+ <div className="ai-card-grid-configuration-main">
60
+ {this.renderHeader()}
61
+ <div className="ai-configuration-card-grid">
62
+ {this.items.map(item => (
63
+ <div key={this.getItemId(item)} className="ai-configuration-card">
64
+ {this.renderCard(item)}
65
+ </div>
66
+ ))}
67
+ </div>
68
+ {this.renderFooter()}
69
+ </div>
70
+ );
71
+ }
72
+ }
@@ -0,0 +1,37 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2025 EclipseSource GmbH.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+ import * as React from '@theia/core/shared/react';
17
+ import { injectable } from '@theia/core/shared/inversify';
18
+ import { ReactWidget } from '@theia/core/lib/browser/widgets/react-widget';
19
+
20
+ /**
21
+ * Base class for all AI configuration widgets providing common structure and lifecycle management.
22
+ */
23
+ @injectable()
24
+ export abstract class AIConfigurationBaseWidget extends ReactWidget {
25
+ /**
26
+ * Subclasses must implement this method to provide their specific content rendering.
27
+ */
28
+ protected abstract renderContent(): React.ReactNode;
29
+
30
+ protected render(): React.ReactNode {
31
+ return (
32
+ <div className='ai-configuration-widget-content'>
33
+ {this.renderContent()}
34
+ </div>
35
+ );
36
+ }
37
+ }