@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
@@ -63,16 +63,11 @@ export const PromptVariantRenderer: React.FC<PromptVariantRendererProps> = ({
63
63
  };
64
64
 
65
65
  return (
66
- <div className="template-renderer">
67
- <div className="settings-section-title template-header">
68
- <strong>{promptVariantSet.id}</strong>
69
- </div>
70
- <div className="template-controls">
71
- {(variantIds.length > 1 || isInvalidVariant) && (
72
- <>
73
- <label htmlFor={`variant-selector-${promptVariantSet.id}`} className="template-select-label">
74
- {nls.localize('theia/ai/core/templateSettings/selectVariant', 'Select Variant:')}
75
- </label>
66
+ <>
67
+ <tr>
68
+ <td className="template-name-cell">{promptVariantSet.id}</td>
69
+ <td className="template-variant-cell">
70
+ {(variantIds.length > 1 || isInvalidVariant) && (
76
71
  <select
77
72
  id={`variant-selector-${promptVariantSet.id}`}
78
73
  className={`theia-select template-variant-selector ${isInvalidVariant ? 'error' : ''}`}
@@ -81,7 +76,7 @@ export const PromptVariantRenderer: React.FC<PromptVariantRendererProps> = ({
81
76
  >
82
77
  {isInvalidVariant && (
83
78
  <option value="invalid" disabled>
84
- {nls.localize('theia/ai/core/templateSettings/unavailableVariant', 'Selected variant not available, default will be used')}
79
+ {nls.localize('theia/ai/core/templateSettings/unavailableVariant', 'Unavailable')}
85
80
  </option>
86
81
  )}
87
82
  {variantIds.map(variantId => (
@@ -90,23 +85,24 @@ export const PromptVariantRenderer: React.FC<PromptVariantRendererProps> = ({
90
85
  </option>
91
86
  ))}
92
87
  </select>
93
- </>
94
- )}
95
- <button
96
- className="theia-button main"
97
- onClick={openTemplate}
98
- disabled={isInvalidVariant}
99
- >
100
- {nls.localizeByDefault('Edit')}
101
- </button>
102
- <button
103
- className="theia-button secondary"
104
- onClick={resetTemplate}
105
- disabled={isInvalidVariant}
106
- >
107
- {nls.localizeByDefault('Reset')}
108
- </button>
109
- </div>
110
- </div>
88
+ )}
89
+ {variantIds.length === 1 && !isInvalidVariant && <span>{selectedVariant}</span>}
90
+ </td>
91
+ <td className="template-actions-cell">
92
+ <button
93
+ className="template-action-icon-button codicon codicon-edit"
94
+ onClick={openTemplate}
95
+ disabled={isInvalidVariant}
96
+ title={nls.localizeByDefault('Edit')}
97
+ />
98
+ <button
99
+ className="template-action-icon-button codicon codicon-discard"
100
+ onClick={resetTemplate}
101
+ disabled={isInvalidVariant}
102
+ title={nls.localizeByDefault('Reset')}
103
+ />
104
+ </td>
105
+ </tr>
106
+ </>
111
107
  );
112
108
  };
@@ -14,24 +14,19 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
- import { ReactWidget } from '@theia/core/lib/browser';
18
17
  import { inject, injectable, postConstruct } from '@theia/core/shared/inversify';
19
18
  import * as React from '@theia/core/shared/react';
20
19
  import { MessageService, nls } from '@theia/core';
21
20
  import { TokenUsageFrontendService, ModelTokenUsageData } from '@theia/ai-core/lib/browser/token-usage-frontend-service';
22
21
  import { formatDistanceToNow } from 'date-fns';
23
-
24
- // Using the interface from the token usage service
22
+ import { AITableConfigurationWidget, TableColumn } from './base/ai-table-configuration-widget';
25
23
 
26
24
  @injectable()
27
- export class AITokenUsageConfigurationWidget extends ReactWidget {
25
+ export class AITokenUsageConfigurationWidget extends AITableConfigurationWidget<ModelTokenUsageData> {
28
26
 
29
27
  static readonly ID = 'ai-token-usage-configuration-container-widget';
30
28
  static readonly LABEL = nls.localize('theia/ai/tokenUsage/label', 'Token Usage');
31
29
 
32
- // Data will be fetched from the service
33
- protected tokenUsageData: ModelTokenUsageData[] = [];
34
-
35
30
  @inject(MessageService)
36
31
  protected readonly messageService: MessageService;
37
32
 
@@ -43,24 +38,30 @@ export class AITokenUsageConfigurationWidget extends ReactWidget {
43
38
  this.id = AITokenUsageConfigurationWidget.ID;
44
39
  this.title.label = AITokenUsageConfigurationWidget.LABEL;
45
40
  this.title.closable = false;
41
+ this.addClass('ai-configuration-widget');
46
42
 
47
- this.refreshData();
43
+ this.loadItems().then(() => this.update());
48
44
 
49
- this.tokenUsageService.onTokenUsageUpdated(data => {
50
- this.tokenUsageData = data;
51
- this.update();
52
- });
45
+ this.toDispose.push(
46
+ this.tokenUsageService.onTokenUsageUpdated(data => {
47
+ this.items = data;
48
+ this.update();
49
+ })
50
+ );
53
51
  }
54
52
 
55
- protected async refreshData(): Promise<void> {
53
+ protected async loadItems(): Promise<void> {
56
54
  try {
57
- this.tokenUsageData = await this.tokenUsageService.getTokenUsageData();
58
- this.update();
55
+ this.items = await this.tokenUsageService.getTokenUsageData();
59
56
  } catch (error) {
60
57
  this.messageService.error(nls.localize('theia/ai/tokenUsage/failedToGetTokenUsageData', 'Failed to fetch token usage data: {0}', error));
61
58
  }
62
59
  }
63
60
 
61
+ protected getItemId(item: ModelTokenUsageData): string {
62
+ return item.modelId;
63
+ }
64
+
64
65
  protected formatNumber(num: number): string {
65
66
  return num.toLocaleString();
66
67
  }
@@ -73,138 +74,137 @@ export class AITokenUsageConfigurationWidget extends ReactWidget {
73
74
  }
74
75
 
75
76
  protected hasCacheData(): boolean {
76
- return this.tokenUsageData.some(model =>
77
+ return this.items.some(model =>
77
78
  model.cachedInputTokens !== undefined ||
78
79
  model.readCachedInputTokens !== undefined
79
80
  );
80
81
  }
81
82
 
82
- protected renderHeaderRow(): React.ReactNode {
83
+ protected getColumns(): TableColumn<ModelTokenUsageData>[] {
83
84
  const showCacheColumns = this.hasCacheData();
85
+ const columns: TableColumn<ModelTokenUsageData>[] = [
86
+ {
87
+ id: 'model',
88
+ label: nls.localize('theia/ai/tokenUsage/model', 'Model'),
89
+ className: 'token-usage-model-column',
90
+ renderCell: item => <span>{item.modelId}</span>
91
+ },
92
+ {
93
+ id: 'input-tokens',
94
+ label: nls.localize('theia/ai/tokenUsage/inputTokens', 'Input Tokens'),
95
+ className: 'token-usage-column',
96
+ renderCell: item => <span>{this.formatNumber(item.inputTokens)}</span>
97
+ }
98
+ ];
99
+
100
+ if (showCacheColumns) {
101
+ columns.push(
102
+ {
103
+ id: 'cached-input-tokens',
104
+ label: nls.localize('theia/ai/tokenUsage/cachedInputTokens', 'Input Tokens Written to Cache'),
105
+ className: 'token-usage-column',
106
+ renderCell: item => (
107
+ <span title={nls.localize(
108
+ 'theia/ai/tokenUsage/cachedInputTokensTooltip',
109
+ "Tracked additionally to 'Input Tokens'. Usually more expensive than non-cached tokens."
110
+ )}>
111
+ {item.cachedInputTokens !== undefined ? this.formatNumber(item.cachedInputTokens) : '-'}
112
+ </span>
113
+ )
114
+ },
115
+ {
116
+ id: 'read-cached-input-tokens',
117
+ label: nls.localize('theia/ai/tokenUsage/readCachedInputTokens', 'Input Tokens Read From Cache'),
118
+ className: 'token-usage-column',
119
+ renderCell: item => (
120
+ <span title={nls.localize(
121
+ 'theia/ai/tokenUsage/readCachedInputTokensTooltip',
122
+ "Tracked additionally to 'Input Token'. Usually much less expensive than not cached. Usually does not count to rate limits."
123
+ )}>
124
+ {item.readCachedInputTokens !== undefined ? this.formatNumber(item.readCachedInputTokens) : '-'}
125
+ </span>
126
+ )
127
+ }
128
+ );
129
+ }
84
130
 
85
- return (
86
- <tr className="token-usage-header">
87
- <th className="token-usage-model-column">{nls.localize('theia/ai/tokenUsage/model', 'Model')}</th>
88
- <th className="token-usage-column">{nls.localize('theia/ai/tokenUsage/inputTokens', 'Input Tokens')}</th>
89
- {showCacheColumns && (
90
- <>
91
- <th
92
- className="token-usage-column"
93
- title={nls.localize(
94
- 'theia/ai/tokenUsage/cachedInputTokensTooltip',
95
- "Tracked additionally to 'Input Tokens'. Usually more expensive than non-cached tokens."
96
- )}
97
- >
98
- {nls.localize('theia/ai/tokenUsage/cachedInputTokens', 'Input Tokens Written to Cache')}
99
- </th>
100
- <th
101
- className="token-usage-column"
102
- title={nls.localize(
103
- 'theia/ai/tokenUsage/readCachedInputTokensTooltip',
104
- "Tracked additionally to 'Input Token'. Usually much less expensive than not cached. Usually does not count to rate limits."
105
- )}
106
- >
107
- {nls.localize('theia/ai/tokenUsage/readCachedInputTokens', 'Input Tokens Read From Cache')}
108
- </th>
109
- </>
110
- )}
111
- <th className="token-usage-column">{nls.localize('theia/ai/tokenUsage/outputTokens', 'Output Tokens')}</th>
112
- <th
113
- className="token-usage-column"
114
- title={nls.localize('theia/ai/tokenUsage/totalTokensTooltip', "'Input Tokens' + 'Output Tokens'"
115
- )}
116
- >
117
- {nls.localize('theia/ai/tokenUsage/totalTokens', 'Total Tokens')}
118
- </th>
119
- <th className="token-usage-column">{nls.localize('theia/ai/tokenUsage/lastUsed', 'Last Used')}</th>
120
- </tr >
131
+ columns.push(
132
+ {
133
+ id: 'output-tokens',
134
+ label: nls.localize('theia/ai/tokenUsage/outputTokens', 'Output Tokens'),
135
+ className: 'token-usage-column',
136
+ renderCell: item => <span>{this.formatNumber(item.outputTokens)}</span>
137
+ },
138
+ {
139
+ id: 'total-tokens',
140
+ label: nls.localize('theia/ai/tokenUsage/totalTokens', 'Total Tokens'),
141
+ className: 'token-usage-column',
142
+ renderCell: item => {
143
+ const totalTokens = item.inputTokens + item.outputTokens + (item.cachedInputTokens ?? 0);
144
+ return (
145
+ <span title={nls.localize('theia/ai/tokenUsage/totalTokensTooltip', "'Input Tokens' + 'Output Tokens'")}>
146
+ {this.formatNumber(totalTokens)}
147
+ </span>
148
+ );
149
+ }
150
+ },
151
+ {
152
+ id: 'last-used',
153
+ label: nls.localize('theia/ai/tokenUsage/lastUsed', 'Last Used'),
154
+ className: 'token-usage-column',
155
+ renderCell: item => {
156
+ const lastUsedDate = item.lastUsed ? new Date(item.lastUsed) : undefined;
157
+ const exactDateString = lastUsedDate ? lastUsedDate.toLocaleString() : '';
158
+ return <span title={exactDateString}>{this.formatDate(lastUsedDate)}</span>;
159
+ }
160
+ }
121
161
  );
122
- }
123
162
 
124
- protected renderModelRow(model: ModelTokenUsageData): React.ReactNode {
125
- const lastUsedDate = model.lastUsed ? new Date(model.lastUsed) : undefined;
126
- const exactDateString = lastUsedDate ? lastUsedDate.toLocaleString() : '';
127
- const showCacheColumns = this.hasCacheData();
128
- const totalTokens = model.inputTokens + model.outputTokens + (model.cachedInputTokens ?? 0);
163
+ return columns;
164
+ }
129
165
 
130
- return (
131
- <tr key={model.modelId} className="token-usage-row">
132
- <td className="token-usage-model-cell">{model.modelId}</td>
133
- <td className="token-usage-cell">{this.formatNumber(model.inputTokens)}</td>
134
- {showCacheColumns && (
135
- <>
136
- <td className="token-usage-cell">{model.cachedInputTokens !== undefined ? this.formatNumber(model.cachedInputTokens) : '-'}</td>
137
- <td className="token-usage-cell">{model.readCachedInputTokens !== undefined ? this.formatNumber(model.readCachedInputTokens) : '-'}</td>
138
- </>
139
- )}
140
- <td className="token-usage-cell">{this.formatNumber(model.outputTokens)}</td>
141
- <td className="token-usage-cell">{this.formatNumber(totalTokens)}</td>
142
- <td className="token-usage-cell" title={exactDateString}>{this.formatDate(lastUsedDate)}</td>
143
- </tr>
144
- );
166
+ protected override renderHeader(): React.ReactNode {
167
+ return undefined;
145
168
  }
146
169
 
147
- protected renderSummaryRow(): React.ReactNode {
148
- // Only show summary row if there is data
149
- if (this.tokenUsageData.length === 0) {
150
- return undefined;
170
+ protected override renderFooter(): React.ReactNode {
171
+ if (this.items.length === 0) {
172
+ return (
173
+ <div className="ai-empty-state-content">
174
+ <p>{nls.localize('theia/ai/tokenUsage/noData', 'No token usage data available yet.')}</p>
175
+ </div>
176
+ );
151
177
  }
152
178
 
153
- const totalInputTokens = this.tokenUsageData.reduce((sum, model) => sum + model.inputTokens, 0);
154
- const totalOutputTokens = this.tokenUsageData.reduce((sum, model) => sum + model.outputTokens, 0);
155
- const totalCachedInputTokens = this.tokenUsageData.reduce(
156
- (sum, model) => sum + (model.cachedInputTokens || 0), 0
157
- );
158
- const totalReadCachedInputTokens = this.tokenUsageData.reduce(
159
- (sum, model) => sum + (model.readCachedInputTokens || 0), 0
160
- );
161
- const totalTokens = totalInputTokens + totalCachedInputTokens + totalOutputTokens;
162
-
163
179
  const showCacheColumns = this.hasCacheData();
180
+ const totalInputTokens = this.items.reduce((sum, model) => sum + model.inputTokens, 0);
181
+ const totalOutputTokens = this.items.reduce((sum, model) => sum + model.outputTokens, 0);
182
+ const totalCachedInputTokens = this.items.reduce((sum, model) => sum + (model.cachedInputTokens || 0), 0);
183
+ const totalReadCachedInputTokens = this.items.reduce((sum, model) => sum + (model.readCachedInputTokens || 0), 0);
184
+ const totalTokens = totalInputTokens + totalCachedInputTokens + totalOutputTokens;
164
185
 
165
186
  return (
166
- <tr className="token-usage-summary-row">
167
- <td className="token-usage-model-cell"><strong>{nls.localize('theia/ai/tokenUsage/total', 'Total')}</strong></td>
168
- <td className="token-usage-cell"><strong>{this.formatNumber(totalInputTokens)}</strong></td>
169
- {showCacheColumns && (
170
- <>
171
- <td className="token-usage-cell"><strong>{this.formatNumber(totalCachedInputTokens)}</strong></td>
172
- <td className="token-usage-cell"><strong>{this.formatNumber(totalReadCachedInputTokens)}</strong></td>
173
- </>
174
- )}
175
- <td className="token-usage-cell"><strong>{this.formatNumber(totalOutputTokens)}</strong></td>
176
- <td className="token-usage-cell"><strong>{this.formatNumber(totalTokens)}</strong></td>
177
- <td className="token-usage-cell"></td>
178
- </tr>
179
- );
180
- }
181
-
182
- protected render(): React.ReactNode {
183
- return (
184
- <div className="token-usage-configuration-container">
185
- <h2 className="token-usage-configuration-title">{nls.localize('theia/ai/tokenUsage/title', 'AI Model Token Usage')}</h2>
186
-
187
- <div className="token-usage-table-container">
188
- {this.tokenUsageData.length > 0 ? (
189
- <table className="token-usage-table">
190
- <thead>
191
- {this.renderHeaderRow()}
192
- </thead>
193
- <tbody>
194
- {this.tokenUsageData.map(model => this.renderModelRow(model))}
195
- {this.renderSummaryRow()}
196
- </tbody>
197
- </table>
198
- ) : (
199
- <div className="token-usage-empty">
200
- <p>{nls.localize('theia/ai/tokenUsage/noData', 'No token usage data available yet.')}</p>
201
- </div>
202
- )}
203
- </div>
204
-
205
- <div className="token-usage-notes">
206
- <p className="token-usage-note">
207
- <i className="codicon codicon-info"></i>
187
+ <div className="ai-configuration-footer-total">
188
+ <table className="ai-configuration-table">
189
+ <tfoot>
190
+ <tr className="ai-configuration-footer-total-row">
191
+ <td className="token-usage-model-column">{nls.localize('theia/ai/tokenUsage/total', 'Total')}</td>
192
+ <td className="token-usage-column">{this.formatNumber(totalInputTokens)}</td>
193
+ {showCacheColumns && (
194
+ <>
195
+ <td className="token-usage-column">{this.formatNumber(totalCachedInputTokens)}</td>
196
+ <td className="token-usage-column">{this.formatNumber(totalReadCachedInputTokens)}</td>
197
+ </>
198
+ )}
199
+ <td className="token-usage-column">{this.formatNumber(totalOutputTokens)}</td>
200
+ <td className="token-usage-column">{this.formatNumber(totalTokens)}</td>
201
+ <td className="token-usage-column"></td>
202
+ </tr>
203
+ </tfoot>
204
+ </table>
205
+ <div className="ai-configuration-info-box">
206
+ <p className="ai-configuration-info-text">
207
+ <i className="codicon codicon-info ai-configuration-info-icon"></i>
208
208
  {nls.localize('theia/ai/tokenUsage/note', 'Token usage is tracked since the start of the application and is not persisted.')}
209
209
  </p>
210
210
  </div>
@@ -14,13 +14,14 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
- import { ReactWidget, ConfirmDialog } from '@theia/core/lib/browser';
17
+ import { ConfirmDialog } from '@theia/core/lib/browser';
18
18
  import { inject, injectable, postConstruct } from '@theia/core/shared/inversify';
19
19
  import * as React from '@theia/core/shared/react';
20
20
  import { ToolInvocationRegistry } from '@theia/ai-core';
21
21
  import { nls, PreferenceService } from '@theia/core';
22
22
  import { ToolConfirmationManager } from '@theia/ai-chat/lib/browser/chat-tool-preference-bindings';
23
23
  import { ToolConfirmationMode } from '@theia/ai-chat/lib/common/chat-tool-preferences';
24
+ import { AITableConfigurationWidget, TableColumn } from './base/ai-table-configuration-widget';
24
25
 
25
26
  const TOOL_OPTIONS: { value: ToolConfirmationMode, label: string, icon: string }[] = [
26
27
  { value: ToolConfirmationMode.DISABLED, label: nls.localizeByDefault('Disabled'), icon: 'close' },
@@ -28,8 +29,12 @@ const TOOL_OPTIONS: { value: ToolConfirmationMode, label: string, icon: string }
28
29
  { value: ToolConfirmationMode.ALWAYS_ALLOW, label: nls.localize('theia/ai/ide/toolsConfiguration/toolOptions/alwaysAllow/label', 'Always Allow'), icon: 'thumbsup' },
29
30
  ];
30
31
 
32
+ interface ToolItem {
33
+ name: string;
34
+ }
35
+
31
36
  @injectable()
32
- export class AIToolsConfigurationWidget extends ReactWidget {
37
+ export class AIToolsConfigurationWidget extends AITableConfigurationWidget<ToolItem> {
33
38
  static readonly ID = 'ai-tools-configuration-widget';
34
39
  static readonly LABEL = nls.localize('theia/ai/ide/toolsConfiguration/label', 'Tools');
35
40
 
@@ -42,19 +47,17 @@ export class AIToolsConfigurationWidget extends ReactWidget {
42
47
  @inject(ToolInvocationRegistry)
43
48
  protected readonly toolInvocationRegistry: ToolInvocationRegistry;
44
49
 
45
- // Mocked tool list and state
46
- protected tools: string[] = [];
47
50
  protected toolConfirmationModes: Record<string, ToolConfirmationMode> = {};
48
51
  protected defaultState: ToolConfirmationMode;
49
- protected loading = true;
50
52
 
51
53
  @postConstruct()
52
54
  protected init(): void {
53
55
  this.id = AIToolsConfigurationWidget.ID;
54
56
  this.title.label = AIToolsConfigurationWidget.LABEL;
55
57
  this.title.closable = false;
56
- this.loadData();
57
- this.update();
58
+ this.addClass('ai-configuration-widget');
59
+
60
+ this.loadData().then(() => this.update());
58
61
  this.toDispose.pushAll([
59
62
  this.preferenceService.onPreferenceChanged(async e => {
60
63
  if (e.preferenceName === 'ai-features.chat.toolConfirmation') {
@@ -64,23 +67,25 @@ export class AIToolsConfigurationWidget extends ReactWidget {
64
67
  }
65
68
  }),
66
69
  this.toolInvocationRegistry.onDidChange(async () => {
67
- this.tools = await this.loadTools();
70
+ await this.loadItems();
68
71
  this.update();
69
72
  })
70
73
  ]);
71
74
  }
72
75
 
73
76
  protected async loadData(): Promise<void> {
74
- // Replace with real service calls
75
- this.tools = await this.loadTools();
77
+ await this.loadItems();
76
78
  this.defaultState = await this.loadDefaultConfirmation();
77
79
  this.toolConfirmationModes = await this.loadToolConfigurationModes();
78
- this.loading = false;
79
- this.update();
80
80
  }
81
81
 
82
- protected async loadTools(): Promise<string[]> {
83
- return this.toolInvocationRegistry.getAllFunctions().map(func => func.name);
82
+ protected async loadItems(): Promise<void> {
83
+ const toolNames = this.toolInvocationRegistry.getAllFunctions().map(func => func.name);
84
+ this.items = toolNames.map(name => ({ name }));
85
+ }
86
+
87
+ protected getItemId(item: ToolItem): string {
88
+ return item.name;
84
89
  }
85
90
  protected async loadDefaultConfirmation(): Promise<ToolConfirmationMode> {
86
91
  return this.confirmationManager.getConfirmationMode('*', 'doesNotMatter');
@@ -95,9 +100,9 @@ export class AIToolsConfigurationWidget extends ReactWidget {
95
100
  await this.confirmationManager.setConfirmationMode('*', state);
96
101
  }
97
102
 
98
- protected handleToolConfirmationModeChange = async (tool: string, event: React.ChangeEvent<HTMLSelectElement>) => {
103
+ protected handleToolConfirmationModeChange = async (toolName: string, event: React.ChangeEvent<HTMLSelectElement>) => {
99
104
  const newState = event.target.value as ToolConfirmationMode;
100
- await this.updateToolConfirmationMode(tool, newState);
105
+ await this.updateToolConfirmationMode(toolName, newState);
101
106
  };
102
107
  protected handleDefaultStateChange = async (event: React.ChangeEvent<HTMLSelectElement>) => {
103
108
  const newState = event.target.value as ToolConfirmationMode;
@@ -118,25 +123,23 @@ export class AIToolsConfigurationWidget extends ReactWidget {
118
123
  }
119
124
  }
120
125
 
121
- protected render(): React.ReactNode {
122
- if (this.loading) {
123
- return <div>{nls.localize('theia/ai/ide/toolsConfiguration/loading', 'Loading tools...')}</div>;
124
- }
125
- return <div className='ai-tools-configuration-container'>
126
- <div className='ai-tools-configuration-default-section' style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
127
- <div className='ai-tools-configuration-default-label'>{nls.localize('theia/ai/ide/toolsConfiguration/default/label', 'Default Tool Confirmation Mode:')}</div>
126
+ protected override renderHeader(): React.ReactNode {
127
+ return (
128
+ <div className="ai-tools-configuration-header">
129
+ <div style={{ fontWeight: 500 }}>
130
+ {nls.localize('theia/ai/ide/toolsConfiguration/default/label', 'Default Tool Confirmation Mode:')}
131
+ </div>
128
132
  <select
129
- className="ai-tools-configuration-default-select"
133
+ className="theia-select"
130
134
  value={this.defaultState}
131
135
  onChange={this.handleDefaultStateChange}
132
- style={{ marginLeft: 8 }}
133
136
  >
134
137
  {TOOL_OPTIONS.map(opt => (
135
138
  <option key={opt.value} value={opt.value}>{opt.label}</option>
136
139
  ))}
137
140
  </select>
138
141
  <button
139
- className='ai-tools-configuration-reset-btn'
142
+ className='theia-button secondary ai-tools-reset-button'
140
143
  style={{ marginLeft: 'auto' }}
141
144
  title={nls.localize('theia/ai/ide/toolsConfiguration/resetAllTooltip', 'Reset all tools to default')}
142
145
  onClick={() => this.resetAllToolsToDefault()}
@@ -144,38 +147,44 @@ export class AIToolsConfigurationWidget extends ReactWidget {
144
147
  {nls.localize('theia/ai/ide/toolsConfiguration/resetAll', 'Reset All')}
145
148
  </button>
146
149
  </div>
147
- <div className='ai-tools-configuration-tools-section'>
148
- <div className='ai-tools-configuration-tools-label'>{nls.localize('theia/ai/ide/toolsConfiguration/tools/label', 'Tools')}</div>
149
- <ul className='ai-tools-configuration-tools-list'>
150
- {this.tools.map(tool => {
151
- const state = this.toolConfirmationModes[tool] || this.defaultState;
152
- const isDefault = state === this.defaultState;
153
- const selectClass = 'ai-tools-configuration-tool-select';
154
- return (
155
- <li
156
- key={tool}
157
- className={
158
- 'ai-tools-configuration-tool-item ' +
159
- (isDefault ? 'default' : 'custom')
160
- }
161
- >
162
- <span className='ai-tools-configuration-tool-name'>{tool}</span>
163
- <select
164
- className={selectClass}
165
- value={state}
166
- onChange={e => this.handleToolConfirmationModeChange(tool, e)}
167
- >
168
- {TOOL_OPTIONS.map(opt => (
169
- <option key={opt.value} value={opt.value}>
170
- {opt.label}
171
- </option>
172
- ))}
173
- </select>
174
- </li>
175
- );
176
- })}
177
- </ul>
178
- </div>
179
- </div>;
150
+ );
151
+ }
152
+
153
+ protected getColumns(): TableColumn<ToolItem>[] {
154
+ return [
155
+ {
156
+ id: 'tool-name',
157
+ label: nls.localize('theia/ai/ide/toolsConfiguration/tools/label', 'Tool'),
158
+ className: 'tool-name-column',
159
+ renderCell: (item: ToolItem) => <span>{item.name}</span>
160
+ },
161
+ {
162
+ id: 'confirmation-mode',
163
+ label: nls.localize('theia/ai/ide/toolsConfiguration/confirmationMode/label', 'Confirmation Mode'),
164
+ className: 'confirmation-mode-column',
165
+ renderCell: (item: ToolItem) => {
166
+ const state = this.toolConfirmationModes[item.name] || this.defaultState;
167
+ return (
168
+ <select
169
+ className="theia-select"
170
+ value={state}
171
+ onChange={e => this.handleToolConfirmationModeChange(item.name, e)}
172
+ >
173
+ {TOOL_OPTIONS.map(opt => (
174
+ <option key={opt.value} value={opt.value}>
175
+ {opt.label}
176
+ </option>
177
+ ))}
178
+ </select>
179
+ );
180
+ }
181
+ }
182
+ ];
183
+ }
184
+
185
+ protected override getRowClassName(item: ToolItem): string {
186
+ const state = this.toolConfirmationModes[item.name] || this.defaultState;
187
+ const isDefault = state === this.defaultState;
188
+ return isDefault ? 'default-mode' : 'custom-mode';
180
189
  }
181
190
  }