@theia/ai-chat-ui 1.68.0-next.8 → 1.68.0

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 (132) hide show
  1. package/README.md +33 -0
  2. package/lib/browser/ai-chat-ui-contribution.d.ts +2 -1
  3. package/lib/browser/ai-chat-ui-contribution.d.ts.map +1 -1
  4. package/lib/browser/ai-chat-ui-contribution.js +41 -32
  5. package/lib/browser/ai-chat-ui-contribution.js.map +1 -1
  6. package/lib/browser/ai-chat-ui-frontend-module.d.ts.map +1 -1
  7. package/lib/browser/ai-chat-ui-frontend-module.js +15 -6
  8. package/lib/browser/ai-chat-ui-frontend-module.js.map +1 -1
  9. package/lib/browser/change-set-actions/change-set-accept-action.d.ts +0 -1
  10. package/lib/browser/change-set-actions/change-set-accept-action.d.ts.map +1 -1
  11. package/lib/browser/change-set-actions/change-set-action-service.d.ts +0 -1
  12. package/lib/browser/change-set-actions/change-set-action-service.d.ts.map +1 -1
  13. package/lib/browser/change-set-actions/change-set-action-service.js +2 -2
  14. package/lib/browser/change-set-actions/change-set-action-service.js.map +1 -1
  15. package/lib/browser/chat-focus-contribution.d.ts +14 -0
  16. package/lib/browser/chat-focus-contribution.d.ts.map +1 -0
  17. package/lib/browser/chat-focus-contribution.js +102 -0
  18. package/lib/browser/chat-focus-contribution.js.map +1 -0
  19. package/lib/browser/chat-input-agent-suggestions.d.ts +0 -1
  20. package/lib/browser/chat-input-agent-suggestions.d.ts.map +1 -1
  21. package/lib/browser/chat-input-agent-suggestions.js +1 -1
  22. package/lib/browser/chat-input-agent-suggestions.js.map +1 -1
  23. package/lib/browser/chat-input-history-contribution.js +6 -10
  24. package/lib/browser/chat-input-history-contribution.js.map +1 -1
  25. package/lib/browser/chat-input-mode-contribution.js +1 -2
  26. package/lib/browser/chat-input-mode-contribution.js.map +1 -1
  27. package/lib/browser/chat-input-widget.d.ts +0 -1
  28. package/lib/browser/chat-input-widget.d.ts.map +1 -1
  29. package/lib/browser/chat-input-widget.js +106 -96
  30. package/lib/browser/chat-input-widget.js.map +1 -1
  31. package/lib/browser/chat-progress-message.d.ts +0 -1
  32. package/lib/browser/chat-progress-message.d.ts.map +1 -1
  33. package/lib/browser/chat-response-part-renderer.d.ts +0 -1
  34. package/lib/browser/chat-response-part-renderer.d.ts.map +1 -1
  35. package/lib/browser/chat-response-renderer/ai-selection-resolver.js +4 -5
  36. package/lib/browser/chat-response-renderer/ai-selection-resolver.js.map +1 -1
  37. package/lib/browser/chat-response-renderer/code-part-renderer.d.ts +0 -1
  38. package/lib/browser/chat-response-renderer/code-part-renderer.d.ts.map +1 -1
  39. package/lib/browser/chat-response-renderer/code-part-renderer.js +6 -9
  40. package/lib/browser/chat-response-renderer/code-part-renderer.js.map +1 -1
  41. package/lib/browser/chat-response-renderer/command-part-renderer.d.ts +0 -1
  42. package/lib/browser/chat-response-renderer/command-part-renderer.d.ts.map +1 -1
  43. package/lib/browser/chat-response-renderer/command-part-renderer.js +7 -4
  44. package/lib/browser/chat-response-renderer/command-part-renderer.js.map +1 -1
  45. package/lib/browser/chat-response-renderer/delegation-response-renderer.d.ts +0 -1
  46. package/lib/browser/chat-response-renderer/delegation-response-renderer.d.ts.map +1 -1
  47. package/lib/browser/chat-response-renderer/delegation-response-renderer.js +3 -4
  48. package/lib/browser/chat-response-renderer/delegation-response-renderer.js.map +1 -1
  49. package/lib/browser/chat-response-renderer/error-part-renderer.d.ts +0 -1
  50. package/lib/browser/chat-response-renderer/error-part-renderer.d.ts.map +1 -1
  51. package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.d.ts +0 -1
  52. package/lib/browser/chat-response-renderer/horizontal-layout-part-renderer.d.ts.map +1 -1
  53. package/lib/browser/chat-response-renderer/index.d.ts +1 -0
  54. package/lib/browser/chat-response-renderer/index.d.ts.map +1 -1
  55. package/lib/browser/chat-response-renderer/index.js +1 -0
  56. package/lib/browser/chat-response-renderer/index.js.map +1 -1
  57. package/lib/browser/chat-response-renderer/markdown-part-renderer.d.ts +0 -1
  58. package/lib/browser/chat-response-renderer/markdown-part-renderer.d.ts.map +1 -1
  59. package/lib/browser/chat-response-renderer/markdown-part-renderer.js +7 -9
  60. package/lib/browser/chat-response-renderer/markdown-part-renderer.js.map +1 -1
  61. package/lib/browser/chat-response-renderer/not-available-toolcall-renderer.d.ts +17 -0
  62. package/lib/browser/chat-response-renderer/not-available-toolcall-renderer.d.ts.map +1 -0
  63. package/lib/browser/chat-response-renderer/not-available-toolcall-renderer.js +56 -0
  64. package/lib/browser/chat-response-renderer/not-available-toolcall-renderer.js.map +1 -0
  65. package/lib/browser/chat-response-renderer/progress-part-renderer.d.ts +0 -1
  66. package/lib/browser/chat-response-renderer/progress-part-renderer.d.ts.map +1 -1
  67. package/lib/browser/chat-response-renderer/question-part-renderer.d.ts +0 -1
  68. package/lib/browser/chat-response-renderer/question-part-renderer.d.ts.map +1 -1
  69. package/lib/browser/chat-response-renderer/question-part-renderer.js +6 -9
  70. package/lib/browser/chat-response-renderer/question-part-renderer.js.map +1 -1
  71. package/lib/browser/chat-response-renderer/text-part-renderer.d.ts +0 -1
  72. package/lib/browser/chat-response-renderer/text-part-renderer.d.ts.map +1 -1
  73. package/lib/browser/chat-response-renderer/thinking-part-renderer.d.ts +0 -1
  74. package/lib/browser/chat-response-renderer/thinking-part-renderer.d.ts.map +1 -1
  75. package/lib/browser/chat-response-renderer/tool-confirmation.d.ts +29 -10
  76. package/lib/browser/chat-response-renderer/tool-confirmation.d.ts.map +1 -1
  77. package/lib/browser/chat-response-renderer/tool-confirmation.js +219 -65
  78. package/lib/browser/chat-response-renderer/tool-confirmation.js.map +1 -1
  79. package/lib/browser/chat-response-renderer/tool-confirmation.spec.d.ts +2 -0
  80. package/lib/browser/chat-response-renderer/tool-confirmation.spec.d.ts.map +1 -0
  81. package/lib/browser/chat-response-renderer/tool-confirmation.spec.js +100 -0
  82. package/lib/browser/chat-response-renderer/tool-confirmation.spec.js.map +1 -0
  83. package/lib/browser/chat-response-renderer/toolcall-part-renderer.d.ts +5 -3
  84. package/lib/browser/chat-response-renderer/toolcall-part-renderer.d.ts.map +1 -1
  85. package/lib/browser/chat-response-renderer/toolcall-part-renderer.js +21 -11
  86. package/lib/browser/chat-response-renderer/toolcall-part-renderer.js.map +1 -1
  87. package/lib/browser/chat-response-renderer/unknown-part-renderer.d.ts +0 -1
  88. package/lib/browser/chat-response-renderer/unknown-part-renderer.d.ts.map +1 -1
  89. package/lib/browser/chat-response-renderer/unknown-part-renderer.js +1 -2
  90. package/lib/browser/chat-response-renderer/unknown-part-renderer.js.map +1 -1
  91. package/lib/browser/chat-tree-view/chat-view-tree-container.js +1 -2
  92. package/lib/browser/chat-tree-view/chat-view-tree-container.js.map +1 -1
  93. package/lib/browser/chat-tree-view/chat-view-tree-input-widget.js +2 -3
  94. package/lib/browser/chat-tree-view/chat-view-tree-input-widget.js.map +1 -1
  95. package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts +3 -1
  96. package/lib/browser/chat-tree-view/chat-view-tree-widget.d.ts.map +1 -1
  97. package/lib/browser/chat-tree-view/chat-view-tree-widget.js +49 -42
  98. package/lib/browser/chat-tree-view/chat-view-tree-widget.js.map +1 -1
  99. package/lib/browser/chat-tree-view/prompt-variant-badge.d.ts +0 -1
  100. package/lib/browser/chat-tree-view/prompt-variant-badge.d.ts.map +1 -1
  101. package/lib/browser/chat-tree-view/sub-chat-widget.d.ts +0 -1
  102. package/lib/browser/chat-tree-view/sub-chat-widget.d.ts.map +1 -1
  103. package/lib/browser/chat-view-commands.d.ts.map +1 -1
  104. package/lib/browser/chat-view-commands.js +2 -2
  105. package/lib/browser/chat-view-commands.js.map +1 -1
  106. package/lib/browser/chat-view-contribution.js +7 -7
  107. package/lib/browser/chat-view-contribution.js.map +1 -1
  108. package/lib/browser/chat-view-language-contribution.js +3 -4
  109. package/lib/browser/chat-view-language-contribution.js.map +1 -1
  110. package/lib/browser/chat-view-widget.js +9 -10
  111. package/lib/browser/chat-view-widget.js.map +1 -1
  112. package/lib/browser/context-variable-picker.js +9 -13
  113. package/lib/browser/context-variable-picker.js.map +1 -1
  114. package/lib/browser/session-storage-preference-renderer.d.ts +127 -0
  115. package/lib/browser/session-storage-preference-renderer.d.ts.map +1 -0
  116. package/lib/browser/session-storage-preference-renderer.js +490 -0
  117. package/lib/browser/session-storage-preference-renderer.js.map +1 -0
  118. package/package.json +12 -11
  119. package/src/browser/ai-chat-ui-contribution.ts +19 -7
  120. package/src/browser/ai-chat-ui-frontend-module.ts +13 -0
  121. package/src/browser/chat-focus-contribution.ts +102 -0
  122. package/src/browser/chat-input-widget.tsx +99 -27
  123. package/src/browser/chat-response-renderer/index.ts +1 -0
  124. package/src/browser/chat-response-renderer/not-available-toolcall-renderer.tsx +57 -0
  125. package/src/browser/chat-response-renderer/tool-confirmation.spec.ts +108 -0
  126. package/src/browser/chat-response-renderer/tool-confirmation.tsx +379 -95
  127. package/src/browser/chat-response-renderer/toolcall-part-renderer.tsx +27 -13
  128. package/src/browser/chat-tree-view/chat-view-tree-widget.tsx +33 -5
  129. package/src/browser/chat-view-commands.ts +2 -2
  130. package/src/browser/session-storage-preference-renderer.ts +657 -0
  131. package/src/browser/style/index.css +73 -26
  132. package/src/browser/style/session-storage-preference.css +134 -0
@@ -84,7 +84,6 @@ const useMarkdownRendering = (markdown, openerService, skipSurroundingParagraph
84
84
  const ref = (0, react_1.useRef)(null);
85
85
  const markdownString = typeof markdown === 'string' ? markdown : markdown.value;
86
86
  (0, react_1.useEffect)(() => {
87
- var _a, _b, _c, _d;
88
87
  const markdownIt = markdownit().use(markdownitemoji.full);
89
88
  const host = document.createElement('div');
90
89
  // markdownIt always puts the content in a paragraph element, so we remove it if we don't want that
@@ -94,13 +93,13 @@ const useMarkdownRendering = (markdown, openerService, skipSurroundingParagraph
94
93
  // but we want to allow them (see handleClick via OpenerService below)
95
94
  ALLOW_UNKNOWN_PROTOCOLS: true
96
95
  });
97
- while ((_a = ref === null || ref === void 0 ? void 0 : ref.current) === null || _a === void 0 ? void 0 : _a.firstChild) {
96
+ while (ref?.current?.firstChild) {
98
97
  ref.current.removeChild(ref.current.firstChild);
99
98
  }
100
- (_b = ref === null || ref === void 0 ? void 0 : ref.current) === null || _b === void 0 ? void 0 : _b.appendChild(host);
99
+ ref?.current?.appendChild(host);
101
100
  // intercept link clicks to use the Theia OpenerService instead of the default browser behavior
102
101
  const handleClick = (event) => {
103
- if ((eventHandler === null || eventHandler === void 0 ? void 0 : eventHandler.handleEvent(event)) === true) {
102
+ if (eventHandler?.handleEvent(event) === true) {
104
103
  return;
105
104
  }
106
105
  let target = event.target;
@@ -115,12 +114,11 @@ const useMarkdownRendering = (markdown, openerService, skipSurroundingParagraph
115
114
  }
116
115
  }
117
116
  };
118
- (_c = ref === null || ref === void 0 ? void 0 : ref.current) === null || _c === void 0 ? void 0 : _c.addEventListener('click', handleClick);
119
- (_d = eventHandler === null || eventHandler === void 0 ? void 0 : eventHandler.handledEvents) === null || _d === void 0 ? void 0 : _d.forEach(eventType => { var _a; return eventType !== 'click' && ((_a = ref === null || ref === void 0 ? void 0 : ref.current) === null || _a === void 0 ? void 0 : _a.addEventListener(eventType, eventHandler)); });
117
+ ref?.current?.addEventListener('click', handleClick);
118
+ eventHandler?.handledEvents?.forEach(eventType => eventType !== 'click' && ref?.current?.addEventListener(eventType, eventHandler));
120
119
  return () => {
121
- var _a, _b;
122
- (_a = ref.current) === null || _a === void 0 ? void 0 : _a.removeEventListener('click', handleClick);
123
- (_b = eventHandler === null || eventHandler === void 0 ? void 0 : eventHandler.handledEvents) === null || _b === void 0 ? void 0 : _b.forEach(eventType => { var _a; return eventType !== 'click' && ((_a = ref === null || ref === void 0 ? void 0 : ref.current) === null || _a === void 0 ? void 0 : _a.removeEventListener(eventType, eventHandler)); });
120
+ ref.current?.removeEventListener('click', handleClick);
121
+ eventHandler?.handledEvents?.forEach(eventType => eventType !== 'click' && ref?.current?.removeEventListener(eventType, eventHandler));
124
122
  };
125
123
  }, [markdownString, skipSurroundingParagraph, openerService]);
126
124
  return ref;
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-part-renderer.js","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/markdown-part-renderer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"markdown-part-renderer.js","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/markdown-part-renderer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { ChatResponsePartRenderer } from '../chat-response-part-renderer';
2
+ import { ChatResponseContent, ToolCallChatResponseContent } from '@theia/ai-chat/lib/common';
3
+ import { ReactNode } from '@theia/core/shared/react';
4
+ import { ResponseNode } from '../chat-tree-view';
5
+ /**
6
+ * High-priority renderer for tool calls that were not available.
7
+ *
8
+ * This handles cases where the LLM attempted to call a tool that was not
9
+ * made available to it in the request. This takes priority over all other
10
+ * tool renderers (including specialized ones like ShellExecutionToolRenderer)
11
+ * since unavailable tools should never be processed by tool-specific renderers.
12
+ */
13
+ export declare class NotAvailableToolCallRenderer implements ChatResponsePartRenderer<ToolCallChatResponseContent> {
14
+ canHandle(response: ChatResponseContent): number;
15
+ render(response: ToolCallChatResponseContent, _parentNode: ResponseNode): ReactNode;
16
+ }
17
+ //# sourceMappingURL=not-available-toolcall-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-available-toolcall-renderer.d.ts","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/not-available-toolcall-renderer.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD;;;;;;;GAOG;AACH,qBACa,4BAA6B,YAAW,wBAAwB,CAAC,2BAA2B,CAAC;IAEtG,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM;IAShD,MAAM,CAAC,QAAQ,EAAE,2BAA2B,EAAE,WAAW,EAAE,YAAY,GAAG,SAAS;CAYtF"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 EclipseSource GmbH.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ // *****************************************************************************
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.NotAvailableToolCallRenderer = void 0;
19
+ const tslib_1 = require("tslib");
20
+ const inversify_1 = require("@theia/core/shared/inversify");
21
+ const common_1 = require("@theia/ai-chat/lib/common");
22
+ const browser_1 = require("@theia/core/lib/browser");
23
+ const React = require("@theia/core/shared/react");
24
+ /**
25
+ * High-priority renderer for tool calls that were not available.
26
+ *
27
+ * This handles cases where the LLM attempted to call a tool that was not
28
+ * made available to it in the request. This takes priority over all other
29
+ * tool renderers (including specialized ones like ShellExecutionToolRenderer)
30
+ * since unavailable tools should never be processed by tool-specific renderers.
31
+ */
32
+ let NotAvailableToolCallRenderer = class NotAvailableToolCallRenderer {
33
+ canHandle(response) {
34
+ if (common_1.ToolCallChatResponseContent.is(response) && response.finished) {
35
+ if (common_1.ToolCallChatResponseContent.isNotAvailableResult(response.result)) {
36
+ return 100;
37
+ }
38
+ }
39
+ return -1;
40
+ }
41
+ render(response, _parentNode) {
42
+ const errorMessage = common_1.ToolCallChatResponseContent.getErrorMessage(response.result);
43
+ return (React.createElement("div", { className: 'theia-toolCall' },
44
+ React.createElement("span", { className: 'theia-toolCall-unavailable' },
45
+ React.createElement("span", { className: (0, browser_1.codicon)('warning') }),
46
+ ' ',
47
+ response.name,
48
+ ": ",
49
+ errorMessage)));
50
+ }
51
+ };
52
+ exports.NotAvailableToolCallRenderer = NotAvailableToolCallRenderer;
53
+ exports.NotAvailableToolCallRenderer = NotAvailableToolCallRenderer = tslib_1.__decorate([
54
+ (0, inversify_1.injectable)()
55
+ ], NotAvailableToolCallRenderer);
56
+ //# sourceMappingURL=not-available-toolcall-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-available-toolcall-renderer.js","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/not-available-toolcall-renderer.tsx"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAGhF,4DAA0D;AAC1D,sDAA6F;AAE7F,qDAAkD;AAClD,kDAAkD;AAGlD;;;;;;;GAOG;AAEI,IAAM,4BAA4B,GAAlC,MAAM,4BAA4B;IAErC,SAAS,CAAC,QAA6B;QACnC,IAAI,oCAA2B,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAChE,IAAI,oCAA2B,CAAC,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpE,OAAO,GAAG,CAAC;YACf,CAAC;QACL,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;IACd,CAAC;IAED,MAAM,CAAC,QAAqC,EAAE,WAAyB;QACnE,MAAM,YAAY,GAAG,oCAA2B,CAAC,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClF,OAAO,CACH,6BAAK,SAAS,EAAC,gBAAgB;YAC3B,8BAAM,SAAS,EAAC,4BAA4B;gBACxC,8BAAM,SAAS,EAAE,IAAA,iBAAO,EAAC,SAAS,CAAC,GAAS;gBAC3C,GAAG;gBACH,QAAQ,CAAC,IAAI;;gBAAI,YAAY,CAC3B,CACL,CACT,CAAC;IACN,CAAC;CACJ,CAAA;AAvBY,oEAA4B;uCAA5B,4BAA4B;IADxC,IAAA,sBAAU,GAAE;GACA,4BAA4B,CAuBxC"}
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { ChatResponsePartRenderer } from '../chat-response-part-renderer';
3
2
  import { ChatResponseContent, ProgressChatResponseContent } from '@theia/ai-chat/lib/common';
4
3
  import { ReactNode } from '@theia/core/shared/react';
@@ -1 +1 @@
1
- {"version":3,"file":"progress-part-renderer.d.ts","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/progress-part-renderer.tsx"],"names":[],"mappings":";AAgBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAIrD,qBACa,oBAAqB,YAAW,wBAAwB,CAAC,2BAA2B,CAAC;IAE9F,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM;IAOhD,MAAM,CAAC,QAAQ,EAAE,2BAA2B,GAAG,SAAS;CAM3D"}
1
+ {"version":3,"file":"progress-part-renderer.d.ts","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/progress-part-renderer.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAIrD,qBACa,oBAAqB,YAAW,wBAAwB,CAAC,2BAA2B,CAAC;IAE9F,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM;IAOhD,MAAM,CAAC,QAAQ,EAAE,2BAA2B,GAAG,SAAS;CAM3D"}
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { ChatResponseContent, QuestionResponseContent } from '@theia/ai-chat';
3
2
  import { ReactNode } from '@theia/core/shared/react';
4
3
  import { ChatResponsePartRenderer } from '../chat-response-part-renderer';
@@ -1 +1 @@
1
- {"version":3,"file":"question-part-renderer.d.ts","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/question-part-renderer.tsx"],"names":[],"mappings":";AAeA,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAG9E,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,qBACa,oBACT,YAAW,wBAAwB,CAAC,uBAAuB,CAAC;IAE5D,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM;IAOhD,MAAM,CAAC,QAAQ,EAAE,uBAAuB,EAAE,IAAI,EAAE,YAAY,GAAG,SAAS;CA6B3E"}
1
+ {"version":3,"file":"question-part-renderer.d.ts","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/question-part-renderer.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAG9E,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,qBACa,oBACT,YAAW,wBAAwB,CAAC,uBAAuB,CAAC;IAE5D,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM;IAOhD,MAAM,CAAC,QAAQ,EAAE,uBAAuB,EAAE,IAAI,EAAE,YAAY,GAAG,SAAS;CA6B3E"}
@@ -31,15 +31,12 @@ let QuestionPartRenderer = class QuestionPartRenderer {
31
31
  const isDisabled = question.isReadOnly || question.selectedOption !== undefined || !node.response.isWaitingForInput;
32
32
  return (React.createElement("div", { className: "theia-QuestionPartRenderer-root" },
33
33
  React.createElement("div", { className: "theia-QuestionPartRenderer-question" }, question.question),
34
- React.createElement("div", { className: "theia-QuestionPartRenderer-options" }, question.options.map((option, index) => {
35
- var _a;
36
- return (React.createElement("button", { className: `theia-button theia-QuestionPartRenderer-option ${((_a = question.selectedOption) === null || _a === void 0 ? void 0 : _a.text) === option.text ? 'selected' : ''}`, onClick: () => {
37
- if (!question.isReadOnly && question.handler) {
38
- question.selectedOption = option;
39
- question.handler(option);
40
- }
41
- }, disabled: isDisabled, key: index }, option.text));
42
- }))));
34
+ React.createElement("div", { className: "theia-QuestionPartRenderer-options" }, question.options.map((option, index) => (React.createElement("button", { className: `theia-button theia-QuestionPartRenderer-option ${question.selectedOption?.text === option.text ? 'selected' : ''}`, onClick: () => {
35
+ if (!question.isReadOnly && question.handler) {
36
+ question.selectedOption = option;
37
+ question.handler(option);
38
+ }
39
+ }, disabled: isDisabled, key: index }, option.text))))));
43
40
  }
44
41
  };
45
42
  exports.QuestionPartRenderer = QuestionPartRenderer;
@@ -1 +1 @@
1
- {"version":3,"file":"question-part-renderer.js","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/question-part-renderer.tsx"],"names":[],"mappings":";;;;AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF,4CAA8E;AAC9E,4DAA0D;AAC1D,kDAAkD;AAM3C,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAG7B,SAAS,CAAC,QAA6B;QACnC,IAAI,iCAAuB,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,CAAC;QACd,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;IACd,CAAC;IAED,MAAM,CAAC,QAAiC,EAAE,IAAkB;QACxD,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAEpH,OAAO,CACH,6BAAK,SAAS,EAAC,iCAAiC;YAC5C,6BAAK,SAAS,EAAC,qCAAqC,IAAE,QAAQ,CAAC,QAAQ,CAAO;YAC9E,6BAAK,SAAS,EAAC,oCAAoC,IAE3C,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;;gBAAC,OAAA,CACpC,gCACI,SAAS,EAAE,kDAAkD,CAAA,MAAA,QAAQ,CAAC,cAAc,0CAAE,IAAI,MAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAC9H,OAAO,EAAE,GAAG,EAAE;wBACV,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;4BAC3C,QAAQ,CAAC,cAAc,GAAG,MAAM,CAAC;4BACjC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;wBAC7B,CAAC;oBACL,CAAC,EACD,QAAQ,EAAE,UAAU,EACpB,GAAG,EAAE,KAAK,IAET,MAAM,CAAC,IAAI,CACP,CACZ,CAAA;aAAA,CAAC,CAEJ,CACJ,CACT,CAAC;IACN,CAAC;CAEJ,CAAA;AAvCY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,sBAAU,GAAE;GACA,oBAAoB,CAuChC"}
1
+ {"version":3,"file":"question-part-renderer.js","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/question-part-renderer.tsx"],"names":[],"mappings":";;;;AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF,4CAA8E;AAC9E,4DAA0D;AAC1D,kDAAkD;AAM3C,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAG7B,SAAS,CAAC,QAA6B;QACnC,IAAI,iCAAuB,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;YACvC,OAAO,EAAE,CAAC;QACd,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;IACd,CAAC;IAED,MAAM,CAAC,QAAiC,EAAE,IAAkB;QACxD,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,cAAc,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAEpH,OAAO,CACH,6BAAK,SAAS,EAAC,iCAAiC;YAC5C,6BAAK,SAAS,EAAC,qCAAqC,IAAE,QAAQ,CAAC,QAAQ,CAAO;YAC9E,6BAAK,SAAS,EAAC,oCAAoC,IAE3C,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CACpC,gCACI,SAAS,EAAE,kDAAkD,QAAQ,CAAC,cAAc,EAAE,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAC9H,OAAO,EAAE,GAAG,EAAE;oBACV,IAAI,CAAC,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;wBAC3C,QAAQ,CAAC,cAAc,GAAG,MAAM,CAAC;wBACjC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAC7B,CAAC;gBACL,CAAC,EACD,QAAQ,EAAE,UAAU,EACpB,GAAG,EAAE,KAAK,IAET,MAAM,CAAC,IAAI,CACP,CACZ,CAAC,CAEJ,CACJ,CACT,CAAC;IACN,CAAC;CAEJ,CAAA;AAvCY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,sBAAU,GAAE;GACA,oBAAoB,CAuChC"}
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { ChatResponsePartRenderer } from '../chat-response-part-renderer';
3
2
  import { ChatResponseContent } from '@theia/ai-chat/lib/common';
4
3
  import { ReactNode } from '@theia/core/shared/react';
@@ -1 +1 @@
1
- {"version":3,"file":"text-part-renderer.d.ts","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/text-part-renderer.tsx"],"names":[],"mappings":";AAgBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAIrD,qBACa,gBAAiB,YAAW,wBAAwB,CAAC,mBAAmB,CAAC;IAClF,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM;IAIhD,MAAM,CAAC,QAAQ,EAAE,mBAAmB,GAAG,SAAS;CAQnD"}
1
+ {"version":3,"file":"text-part-renderer.d.ts","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/text-part-renderer.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAIrD,qBACa,gBAAiB,YAAW,wBAAwB,CAAC,mBAAmB,CAAC;IAClF,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM;IAIhD,MAAM,CAAC,QAAQ,EAAE,mBAAmB,GAAG,SAAS;CAQnD"}
@@ -1,4 +1,3 @@
1
- /// <reference types="react" />
2
1
  import { ChatResponsePartRenderer } from '../chat-response-part-renderer';
3
2
  import { ChatResponseContent, ThinkingChatResponseContent } from '@theia/ai-chat/lib/common';
4
3
  import { ReactNode } from '@theia/core/shared/react';
@@ -1 +1 @@
1
- {"version":3,"file":"thinking-part-renderer.d.ts","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/thinking-part-renderer.tsx"],"names":[],"mappings":";AAgBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAIrD,qBACa,oBAAqB,YAAW,wBAAwB,CAAC,2BAA2B,CAAC;IAE9F,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM;IAOhD,MAAM,CAAC,QAAQ,EAAE,2BAA2B,GAAG,SAAS;CAU3D"}
1
+ {"version":3,"file":"thinking-part-renderer.d.ts","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/thinking-part-renderer.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE1E,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAIrD,qBACa,oBAAqB,YAAW,wBAAwB,CAAC,2BAA2B,CAAC;IAE9F,SAAS,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM;IAOhD,MAAM,CAAC,QAAQ,EAAE,2BAA2B,GAAG,SAAS;CAU3D"}
@@ -1,17 +1,36 @@
1
- /// <reference types="react" />
2
1
  import * as React from '@theia/core/shared/react';
2
+ import { ContextMenuRenderer } from '@theia/core/lib/browser';
3
3
  import { ToolCallChatResponseContent } from '@theia/ai-chat/lib/common';
4
- /**
5
- * States the tool confirmation component can be in
6
- */
4
+ import { ToolRequest } from '@theia/ai-core';
5
+ import { ToolConfirmationMode as ToolConfirmationPreferenceMode } from '@theia/ai-chat/lib/common/chat-tool-preferences';
6
+ import { ToolConfirmationManager } from '@theia/ai-chat/lib/browser/chat-tool-preference-bindings';
7
7
  export type ToolConfirmationState = 'waiting' | 'allowed' | 'denied' | 'rejected';
8
- export interface ToolConfirmationProps {
8
+ export type ConfirmationScope = 'once' | 'session' | 'forever';
9
+ export interface ToolConfirmationCallbacks {
10
+ toolRequest?: ToolRequest;
11
+ onAllow: (scope: ConfirmationScope) => void;
12
+ onDeny: (scope: ConfirmationScope, reason?: string) => void;
13
+ }
14
+ export interface ToolConfirmationActionsProps extends ToolConfirmationCallbacks {
15
+ toolName: string;
16
+ contextMenuRenderer: ContextMenuRenderer;
17
+ }
18
+ export declare const ToolConfirmationActions: React.FC<ToolConfirmationActionsProps>;
19
+ export interface ToolConfirmationProps extends Pick<ToolConfirmationCallbacks, 'toolRequest'> {
9
20
  response: ToolCallChatResponseContent;
10
- onAllow: (mode?: 'once' | 'session' | 'forever') => void;
11
- onDeny: (mode?: 'once' | 'session' | 'forever') => void;
21
+ onAllow: (scope?: ConfirmationScope) => void;
22
+ onDeny: (scope?: ConfirmationScope, reason?: string) => void;
23
+ contextMenuRenderer: ContextMenuRenderer;
12
24
  }
13
- /**
14
- * Component that displays approval/denial buttons for tool execution
15
- */
16
25
  export declare const ToolConfirmation: React.FC<ToolConfirmationProps>;
26
+ export interface WithToolCallConfirmationProps {
27
+ response: ToolCallChatResponseContent;
28
+ confirmationMode: ToolConfirmationPreferenceMode;
29
+ toolConfirmationManager: ToolConfirmationManager;
30
+ toolRequest?: ToolRequest;
31
+ chatId: string;
32
+ requestCanceled: boolean;
33
+ contextMenuRenderer: ContextMenuRenderer;
34
+ }
35
+ export declare function withToolCallConfirmation<P extends object>(WrappedComponent: React.ComponentType<P>): React.FC<P & WithToolCallConfirmationProps>;
17
36
  //# sourceMappingURL=tool-confirmation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-confirmation.d.ts","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/tool-confirmation.tsx"],"names":[],"mappings":";AAgBA,OAAO,KAAK,KAAK,MAAM,0BAA0B,CAAC;AAGlD,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAExE;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;AAElF,MAAM,WAAW,qBAAqB;IAClC,QAAQ,EAAE,2BAA2B,CAAC;IACtC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,KAAK,IAAI,CAAC;IACzD,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,KAAK,IAAI,CAAC;CAC3D;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA2I5D,CAAC"}
1
+ {"version":3,"file":"tool-confirmation.d.ts","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/tool-confirmation.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,KAAK,MAAM,0BAA0B,CAAC;AAElD,OAAO,EAAW,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,EAAE,oBAAoB,IAAI,8BAA8B,EAAE,MAAM,iDAAiD,CAAC;AACzH,OAAO,EAAE,uBAAuB,EAAE,MAAM,0DAA0D,CAAC;AAEnG,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;AAElF,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,yBAAyB;IACtC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC5C,MAAM,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/D;AAED,MAAM,WAAW,4BAA6B,SAAQ,yBAAyB;IAC3E,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,mBAAmB,CAAC;CAC5C;AA4BD,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,EAAE,CAAC,4BAA4B,CA0O1E,CAAC;AAEF,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,yBAAyB,EAAE,aAAa,CAAC;IACzF,QAAQ,EAAE,2BAA2B,CAAC;IACtC,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC7C,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,mBAAmB,EAAE,mBAAmB,CAAC;CAC5C;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAiD5D,CAAC;AAEF,MAAM,WAAW,6BAA6B;IAC1C,QAAQ,EAAE,2BAA2B,CAAC;IACtC,gBAAgB,EAAE,8BAA8B,CAAC;IACjD,uBAAuB,EAAE,uBAAuB,CAAC;IACjD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,EAAE,mBAAmB,CAAC;CAC5C;AAED,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,MAAM,EACrD,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,GACzC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,6BAA6B,CAAC,CAqF7C"}
@@ -15,94 +15,189 @@
15
15
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
16
  // *****************************************************************************
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.ToolConfirmation = void 0;
18
+ exports.ToolConfirmation = exports.ToolConfirmationActions = void 0;
19
+ exports.withToolCallConfirmation = withToolCallConfirmation;
19
20
  const React = require("@theia/core/shared/react");
20
21
  const nls_1 = require("@theia/core/lib/common/nls");
21
22
  const browser_1 = require("@theia/core/lib/browser");
22
- /**
23
- * Component that displays approval/denial buttons for tool execution
24
- */
25
- const ToolConfirmation = ({ response, onAllow, onDeny }) => {
26
- const [state, setState] = React.useState('waiting');
27
- // Track selected mode for each action
28
- const [allowMode, setAllowMode] = React.useState('once');
29
- const [denyMode, setDenyMode] = React.useState('once');
30
- const [dropdownOpen, setDropdownOpen] = React.useState(undefined);
31
- const handleAllow = React.useCallback(() => {
32
- setState('allowed');
33
- onAllow(allowMode);
34
- }, [onAllow, allowMode]);
35
- const handleDeny = React.useCallback(() => {
36
- setState('denied');
37
- onDeny(denyMode);
38
- }, [onDeny, denyMode]);
39
- if (state === 'allowed') {
40
- return (React.createElement("div", { className: "theia-tool-confirmation-status allowed" },
41
- React.createElement("span", { className: (0, browser_1.codicon)('check') }),
42
- " ",
43
- nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/allowed', 'Tool execution allowed')));
23
+ const composite_menu_node_1 = require("@theia/core/lib/browser/menu/composite-menu-node");
24
+ const chat_tool_preferences_1 = require("@theia/ai-chat/lib/common/chat-tool-preferences");
25
+ class InlineActionMenuNode {
26
+ constructor(id, label, action, sortString, icon) {
27
+ this.id = id;
28
+ this.label = label;
29
+ this.action = action;
30
+ this.sortString = sortString;
31
+ this.icon = icon;
44
32
  }
45
- if (state === 'denied') {
46
- return (React.createElement("div", { className: "theia-tool-confirmation-status denied" },
47
- React.createElement("span", { className: (0, browser_1.codicon)('close') }),
48
- " ",
49
- nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/denied', 'Tool execution denied')));
33
+ isVisible(_effectiveMenuPath, _contextMatcher, _context) {
34
+ return true;
50
35
  }
51
- // Helper for dropdown options
52
- const MODES = ['once', 'session', 'forever'];
53
- // Unified labels for both main button and dropdown, as requested
54
- const modeLabel = (type, mode) => {
36
+ isEnabled() {
37
+ return true;
38
+ }
39
+ isToggled() {
40
+ return false;
41
+ }
42
+ async run() {
43
+ this.action();
44
+ }
45
+ }
46
+ const ToolConfirmationActions = ({ toolName, toolRequest, onAllow, onDeny, contextMenuRenderer }) => {
47
+ const [allowScope, setAllowScope] = React.useState('once');
48
+ const [denyScope, setDenyScope] = React.useState('once');
49
+ const [showAlwaysAllowConfirmation, setShowAlwaysAllowConfirmation] = React.useState(false);
50
+ const [showDenyReasonInput, setShowDenyReasonInput] = React.useState(false);
51
+ const [denyReason, setDenyReason] = React.useState('');
52
+ // eslint-disable-next-line no-null/no-null
53
+ const denyReasonInputRef = React.useRef(null);
54
+ const handleAllow = React.useCallback(() => {
55
+ if ((allowScope === 'forever' || allowScope === 'session') && toolRequest?.confirmAlwaysAllow) {
56
+ setShowAlwaysAllowConfirmation(true);
57
+ return;
58
+ }
59
+ onAllow(allowScope);
60
+ }, [onAllow, allowScope, toolRequest]);
61
+ const handleConfirmAlwaysAllow = React.useCallback(() => {
62
+ setShowAlwaysAllowConfirmation(false);
63
+ onAllow(allowScope);
64
+ }, [onAllow, allowScope]);
65
+ const handleCancelAlwaysAllow = React.useCallback(() => {
66
+ setShowAlwaysAllowConfirmation(false);
67
+ }, []);
68
+ const handleDeny = React.useCallback(() => {
69
+ onDeny(denyScope);
70
+ }, [onDeny, denyScope]);
71
+ const handleDenyWithReason = React.useCallback(() => {
72
+ setShowDenyReasonInput(true);
73
+ }, []);
74
+ const handleSubmitDenyReason = React.useCallback(() => {
75
+ onDeny('once', denyReason.trim() || undefined);
76
+ setShowDenyReasonInput(false);
77
+ setDenyReason('');
78
+ }, [onDeny, denyReason]);
79
+ const handleCancelDenyReason = React.useCallback(() => {
80
+ setShowDenyReasonInput(false);
81
+ setDenyReason('');
82
+ }, []);
83
+ const handleDenyReasonKeyDown = React.useCallback((e) => {
84
+ if (e.key === 'Enter') {
85
+ e.preventDefault();
86
+ handleSubmitDenyReason();
87
+ }
88
+ else if (e.key === 'Escape') {
89
+ e.preventDefault();
90
+ handleCancelDenyReason();
91
+ }
92
+ }, [handleSubmitDenyReason, handleCancelDenyReason]);
93
+ React.useEffect(() => {
94
+ if (showDenyReasonInput && denyReasonInputRef.current) {
95
+ denyReasonInputRef.current.focus();
96
+ }
97
+ }, [showDenyReasonInput]);
98
+ const SCOPES = ['once', 'session', 'forever'];
99
+ const scopeLabel = (type, scope) => {
55
100
  if (type === 'allow') {
56
- switch (mode) {
101
+ switch (scope) {
57
102
  case 'once': return nls_1.nls.localizeByDefault('Allow');
58
103
  case 'session': return nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/allow-session', 'Allow for this Chat');
59
104
  case 'forever': return nls_1.nls.localizeByDefault('Always Allow');
60
105
  }
61
106
  }
62
107
  else {
63
- switch (mode) {
108
+ switch (scope) {
64
109
  case 'once': return nls_1.nls.localizeByDefault('Deny');
65
110
  case 'session': return nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/deny-session', 'Deny for this Chat');
66
111
  case 'forever': return nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/deny-forever', 'Always Deny');
67
112
  }
68
113
  }
69
114
  };
70
- // Main button label is always the same as the dropdown label for the selected mode
71
- const mainButtonLabel = modeLabel; // Use the same function for both
72
- // Tooltips for dropdown options
73
- const modeTooltip = (type, mode) => {
74
- if (type === 'allow') {
75
- switch (mode) {
76
- case 'once': return nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/allow-tooltip', 'Allow this tool call once');
77
- case 'session': return nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/allow-session-tooltip', 'Allow all calls of this tool for this chat session');
78
- case 'forever': return nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/allow-forever-tooltip', 'Always allow this tool');
79
- }
80
- }
81
- else {
82
- switch (mode) {
83
- case 'once': return nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/deny-tooltip', 'Deny this tool call once');
84
- case 'session': return nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/deny-session-tooltip', 'Deny all calls of this tool for this chat session');
85
- case 'forever': return nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/deny-forever-tooltip', 'Always deny this tool');
86
- }
115
+ const getAlwaysAllowWarning = () => {
116
+ if (typeof toolRequest?.confirmAlwaysAllow === 'string') {
117
+ return toolRequest.confirmAlwaysAllow;
87
118
  }
119
+ return nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/alwaysAllowGenericWarning', 'This tool requires confirmation before auto-approval can be enabled. ' +
120
+ 'Once enabled, all future invocations will execute without confirmation. ' +
121
+ 'Only enable this if you trust this tool and understand the potential risks.');
88
122
  };
89
- // Split button for approve/deny
123
+ const showDropdownMenu = React.useCallback((event, type, selectedScope, setScope) => {
124
+ const otherScopes = SCOPES.filter(s => s !== selectedScope);
125
+ const menu = new composite_menu_node_1.GroupImpl('tool-confirmation-dropdown');
126
+ const scopesGroup = new composite_menu_node_1.GroupImpl('scopes', '1');
127
+ otherScopes.forEach((scope, index) => {
128
+ scopesGroup.addNode(new InlineActionMenuNode(`tool-confirmation-${type}-${scope}`, scopeLabel(type, scope), () => setScope(scope), String(index)));
129
+ });
130
+ menu.addNode(scopesGroup);
131
+ if (type === 'deny') {
132
+ const reasonGroup = new composite_menu_node_1.GroupImpl('reason', '2');
133
+ reasonGroup.addNode(new InlineActionMenuNode('tool-confirmation-deny-with-reason', nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/deny-with-reason', 'Deny with reason...'), handleDenyWithReason, '0'));
134
+ menu.addNode(reasonGroup);
135
+ }
136
+ const splitButtonContainer = event.currentTarget.parentElement;
137
+ const containerRect = splitButtonContainer?.getBoundingClientRect() ?? event.currentTarget.getBoundingClientRect();
138
+ contextMenuRenderer.render({
139
+ menuPath: ['tool-confirmation-context-menu'],
140
+ menu,
141
+ anchor: { x: containerRect.left, y: containerRect.bottom },
142
+ context: event.currentTarget,
143
+ skipSingleRootNode: true
144
+ });
145
+ }, [contextMenuRenderer, handleDenyWithReason, scopeLabel]);
90
146
  const renderSplitButton = (type) => {
91
- const selectedMode = type === 'allow' ? allowMode : denyMode;
92
- const setMode = type === 'allow' ? setAllowMode : setDenyMode;
147
+ const selectedScope = type === 'allow' ? allowScope : denyScope;
148
+ const setScope = type === 'allow' ? setAllowScope : setDenyScope;
93
149
  const handleMain = type === 'allow' ? handleAllow : handleDeny;
94
- const otherModes = MODES.filter(m => m !== selectedMode);
95
150
  return (React.createElement("div", { className: `theia-tool-confirmation-split-button ${type}`, style: { display: 'inline-flex', position: 'relative' } },
96
- React.createElement("button", { className: `theia-button ${type === 'allow' ? 'primary' : 'secondary'} theia-tool-confirmation-main-btn`, onClick: handleMain }, mainButtonLabel(type, selectedMode)),
97
- React.createElement("button", { className: `theia-button ${type === 'allow' ? 'primary' : 'secondary'} theia-tool-confirmation-chevron-btn`, onClick: () => setDropdownOpen(dropdownOpen === type ? undefined : type), "aria-haspopup": "true", "aria-expanded": dropdownOpen === type, tabIndex: 0, title: type === 'allow'
151
+ React.createElement("button", { className: `theia-button ${type === 'allow' ? 'main' : 'secondary'} theia-tool-confirmation-main-btn`, onClick: handleMain }, scopeLabel(type, selectedScope)),
152
+ React.createElement("button", { className: `theia-button ${type === 'allow' ? 'main' : 'secondary'} theia-tool-confirmation-chevron-btn`, onClick: e => showDropdownMenu(e, type, selectedScope, setScope), "aria-haspopup": "true", tabIndex: 0, title: type === 'allow'
98
153
  ? nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/allow-options-dropdown-tooltip', 'More Allow Options')
99
154
  : nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/deny-options-dropdown-tooltip', 'More Deny Options') },
100
- React.createElement("span", { className: (0, browser_1.codicon)('chevron-down') })),
101
- dropdownOpen === type && (React.createElement("ul", { className: "theia-tool-confirmation-dropdown-menu", onMouseLeave: () => setDropdownOpen(undefined) }, otherModes.map(mode => (React.createElement("li", { key: mode, className: "theia-tool-confirmation-dropdown-item", onClick: () => {
102
- setMode(mode);
103
- setDropdownOpen(undefined);
104
- }, title: modeTooltip(type, mode) }, modeLabel(type, mode))))))));
155
+ React.createElement("span", { className: (0, browser_1.codicon)('chevron-down') }))));
105
156
  };
157
+ if (showAlwaysAllowConfirmation) {
158
+ return (React.createElement("div", { className: "theia-tool-confirmation-always-allow-modal" },
159
+ React.createElement("div", { className: "theia-tool-confirmation-header" },
160
+ React.createElement("span", { className: (0, browser_1.codicon)('warning') }),
161
+ nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/alwaysAllowTitle', 'Enable Auto-Approval for "{0}"?', toolName)),
162
+ React.createElement("div", { className: "theia-tool-confirmation-warning" }, getAlwaysAllowWarning()),
163
+ React.createElement("div", { className: "theia-tool-confirmation-actions" },
164
+ React.createElement("button", { className: "theia-button secondary", onClick: handleCancelAlwaysAllow }, nls_1.nls.localizeByDefault('Cancel')),
165
+ React.createElement("button", { className: "theia-button main", onClick: handleConfirmAlwaysAllow }, nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/alwaysAllowConfirm', 'I understand, enable auto-approval')))));
166
+ }
167
+ if (showDenyReasonInput) {
168
+ return (React.createElement("div", { className: "theia-tool-confirmation-deny-reason" },
169
+ React.createElement("input", { ref: denyReasonInputRef, type: "text", className: "theia-input theia-tool-confirmation-deny-reason-input", placeholder: nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/deny-reason-placeholder', 'Enter reason for denial...'), value: denyReason, onChange: e => setDenyReason(e.target.value), onKeyDown: handleDenyReasonKeyDown }),
170
+ React.createElement("div", { className: "theia-tool-confirmation-deny-reason-actions" },
171
+ React.createElement("button", { className: "theia-button secondary", onClick: handleCancelDenyReason }, nls_1.nls.localizeByDefault('Cancel')),
172
+ React.createElement("button", { className: "theia-button main", onClick: handleSubmitDenyReason }, nls_1.nls.localizeByDefault('Deny')))));
173
+ }
174
+ return (React.createElement("div", { className: "theia-tool-confirmation-actions" },
175
+ renderSplitButton('deny'),
176
+ renderSplitButton('allow')));
177
+ };
178
+ exports.ToolConfirmationActions = ToolConfirmationActions;
179
+ const ToolConfirmation = ({ response, toolRequest, onAllow, onDeny, contextMenuRenderer }) => {
180
+ const [state, setState] = React.useState('waiting');
181
+ const handleAllow = React.useCallback((scope) => {
182
+ setState('allowed');
183
+ onAllow(scope);
184
+ }, [onAllow]);
185
+ const handleDeny = React.useCallback((scope, reason) => {
186
+ setState('denied');
187
+ onDeny(scope, reason);
188
+ }, [onDeny]);
189
+ if (state === 'allowed') {
190
+ return (React.createElement("div", { className: "theia-tool-confirmation-status allowed" },
191
+ React.createElement("span", { className: (0, browser_1.codicon)('check') }),
192
+ " ",
193
+ nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/allowed', 'Tool execution allowed')));
194
+ }
195
+ if (state === 'denied') {
196
+ return (React.createElement("div", { className: "theia-tool-confirmation-status denied" },
197
+ React.createElement("span", { className: (0, browser_1.codicon)('close') }),
198
+ " ",
199
+ nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/denied', 'Tool execution denied')));
200
+ }
106
201
  return (React.createElement("div", { className: "theia-tool-confirmation" },
107
202
  React.createElement("div", { className: "theia-tool-confirmation-header" },
108
203
  React.createElement("span", { className: (0, browser_1.codicon)('shield') }),
@@ -114,9 +209,68 @@ const ToolConfirmation = ({ response, onAllow, onDeny }) => {
114
209
  nls_1.nls.localizeByDefault('Tool'),
115
210
  ":"),
116
211
  React.createElement("span", { className: "value" }, response.name))),
117
- React.createElement("div", { className: "theia-tool-confirmation-actions" },
118
- renderSplitButton('deny'),
119
- renderSplitButton('allow'))));
212
+ React.createElement(exports.ToolConfirmationActions, { toolName: response.name ?? 'unknown', toolRequest: toolRequest, onAllow: handleAllow, onDeny: handleDeny, contextMenuRenderer: contextMenuRenderer })));
120
213
  };
121
214
  exports.ToolConfirmation = ToolConfirmation;
215
+ function withToolCallConfirmation(WrappedComponent) {
216
+ const WithConfirmation = props => {
217
+ const { response, confirmationMode, toolConfirmationManager, toolRequest, chatId, requestCanceled, contextMenuRenderer, ...componentProps } = props;
218
+ const [confirmationState, setConfirmationState] = React.useState('waiting');
219
+ React.useEffect(() => {
220
+ if (confirmationMode === chat_tool_preferences_1.ToolConfirmationMode.ALWAYS_ALLOW) {
221
+ response.confirm();
222
+ setConfirmationState('allowed');
223
+ return;
224
+ }
225
+ else if (confirmationMode === chat_tool_preferences_1.ToolConfirmationMode.DISABLED) {
226
+ response.deny();
227
+ setConfirmationState('denied');
228
+ return;
229
+ }
230
+ response.confirmed
231
+ .then(confirmed => {
232
+ setConfirmationState(confirmed === true ? 'allowed' : 'denied');
233
+ })
234
+ .catch(() => {
235
+ setConfirmationState('rejected');
236
+ });
237
+ }, [response, confirmationMode]);
238
+ const handleAllow = React.useCallback((scope = 'once') => {
239
+ if (scope === 'forever' && response.name) {
240
+ toolConfirmationManager.setConfirmationMode(response.name, chat_tool_preferences_1.ToolConfirmationMode.ALWAYS_ALLOW, toolRequest);
241
+ }
242
+ else if (scope === 'session' && response.name) {
243
+ toolConfirmationManager.setSessionConfirmationMode(response.name, chat_tool_preferences_1.ToolConfirmationMode.ALWAYS_ALLOW, chatId);
244
+ }
245
+ response.confirm();
246
+ }, [response, toolConfirmationManager, chatId, toolRequest]);
247
+ const handleDeny = React.useCallback((scope = 'once', reason) => {
248
+ if (scope === 'forever' && response.name) {
249
+ toolConfirmationManager.setConfirmationMode(response.name, chat_tool_preferences_1.ToolConfirmationMode.DISABLED);
250
+ }
251
+ else if (scope === 'session' && response.name) {
252
+ toolConfirmationManager.setSessionConfirmationMode(response.name, chat_tool_preferences_1.ToolConfirmationMode.DISABLED, chatId);
253
+ }
254
+ response.deny(reason);
255
+ }, [response, toolConfirmationManager, chatId]);
256
+ if (confirmationState === 'rejected' || (requestCanceled && !response.finished)) {
257
+ return (React.createElement("div", { className: "theia-tool-confirmation-status rejected" },
258
+ React.createElement("span", { className: (0, browser_1.codicon)('error') }),
259
+ " ",
260
+ nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/canceled', 'Tool execution canceled')));
261
+ }
262
+ if (confirmationState === 'denied') {
263
+ return (React.createElement("div", { className: "theia-tool-confirmation-status denied" },
264
+ React.createElement("span", { className: (0, browser_1.codicon)('error') }),
265
+ " ",
266
+ nls_1.nls.localize('theia/ai/chat-ui/toolconfirmation/executionDenied', 'Tool execution denied')));
267
+ }
268
+ if (confirmationState === 'waiting' && !requestCanceled && !response.finished) {
269
+ return (React.createElement(exports.ToolConfirmation, { response: response, toolRequest: toolRequest, onAllow: handleAllow, onDeny: handleDeny, contextMenuRenderer: contextMenuRenderer }));
270
+ }
271
+ return React.createElement(WrappedComponent, { ...componentProps });
272
+ };
273
+ WithConfirmation.displayName = `withToolCallConfirmation(${WrappedComponent.displayName || WrappedComponent.name || 'Component'})`;
274
+ return WithConfirmation;
275
+ }
122
276
  //# sourceMappingURL=tool-confirmation.js.map