@theia/ai-core-ui 1.75.0-next.8 → 1.75.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 (113) hide show
  1. package/lib/browser/ai-configuration/ai-configuration-category-registry.d.ts +29 -0
  2. package/lib/browser/ai-configuration/ai-configuration-category-registry.d.ts.map +1 -0
  3. package/lib/browser/ai-configuration/ai-configuration-category-registry.js +83 -0
  4. package/lib/browser/ai-configuration/ai-configuration-category-registry.js.map +1 -0
  5. package/lib/browser/ai-configuration/ai-configuration-category-registry.spec.d.ts +2 -0
  6. package/lib/browser/ai-configuration/ai-configuration-category-registry.spec.d.ts.map +1 -0
  7. package/lib/browser/ai-configuration/ai-configuration-category-registry.spec.js +122 -0
  8. package/lib/browser/ai-configuration/ai-configuration-category-registry.spec.js.map +1 -0
  9. package/lib/browser/ai-configuration/ai-configuration-category.d.ts +204 -0
  10. package/lib/browser/ai-configuration/ai-configuration-category.d.ts.map +1 -0
  11. package/lib/browser/ai-configuration/ai-configuration-category.js +86 -0
  12. package/lib/browser/ai-configuration/ai-configuration-category.js.map +1 -0
  13. package/lib/browser/ai-configuration/ai-configuration-selection-model.d.ts +15 -0
  14. package/lib/browser/ai-configuration/ai-configuration-selection-model.d.ts.map +1 -0
  15. package/lib/browser/ai-configuration/ai-configuration-selection-model.js +44 -0
  16. package/lib/browser/ai-configuration/ai-configuration-selection-model.js.map +1 -0
  17. package/lib/browser/ai-configuration/ai-configuration-setting-commands.d.ts +48 -0
  18. package/lib/browser/ai-configuration/ai-configuration-setting-commands.d.ts.map +1 -0
  19. package/lib/browser/ai-configuration/ai-configuration-setting-commands.js +98 -0
  20. package/lib/browser/ai-configuration/ai-configuration-setting-commands.js.map +1 -0
  21. package/lib/browser/ai-configuration/ai-configuration-setting-commands.spec.d.ts +2 -0
  22. package/lib/browser/ai-configuration/ai-configuration-setting-commands.spec.d.ts.map +1 -0
  23. package/lib/browser/ai-configuration/ai-configuration-setting-commands.spec.js +70 -0
  24. package/lib/browser/ai-configuration/ai-configuration-setting-commands.spec.js.map +1 -0
  25. package/lib/browser/ai-configuration/components/ai-configuration-components.spec.d.ts +2 -0
  26. package/lib/browser/ai-configuration/components/ai-configuration-components.spec.d.ts.map +1 -0
  27. package/lib/browser/ai-configuration/components/ai-configuration-components.spec.js +596 -0
  28. package/lib/browser/ai-configuration/components/ai-configuration-components.spec.js.map +1 -0
  29. package/lib/browser/ai-configuration/components/ai-configuration-controls.d.ts +118 -0
  30. package/lib/browser/ai-configuration/components/ai-configuration-controls.d.ts.map +1 -0
  31. package/lib/browser/ai-configuration/components/ai-configuration-controls.js +191 -0
  32. package/lib/browser/ai-configuration/components/ai-configuration-controls.js.map +1 -0
  33. package/lib/browser/ai-configuration/components/ai-configuration-item-row.d.ts +57 -0
  34. package/lib/browser/ai-configuration/components/ai-configuration-item-row.d.ts.map +1 -0
  35. package/lib/browser/ai-configuration/components/ai-configuration-item-row.js +48 -0
  36. package/lib/browser/ai-configuration/components/ai-configuration-item-row.js.map +1 -0
  37. package/lib/browser/ai-configuration/components/ai-configuration-origin-badge.d.ts +49 -0
  38. package/lib/browser/ai-configuration/components/ai-configuration-origin-badge.d.ts.map +1 -0
  39. package/lib/browser/ai-configuration/components/ai-configuration-origin-badge.js +79 -0
  40. package/lib/browser/ai-configuration/components/ai-configuration-origin-badge.js.map +1 -0
  41. package/lib/browser/ai-configuration/components/ai-configuration-primitives.d.ts +161 -0
  42. package/lib/browser/ai-configuration/components/ai-configuration-primitives.d.ts.map +1 -0
  43. package/lib/browser/ai-configuration/components/ai-configuration-primitives.js +131 -0
  44. package/lib/browser/ai-configuration/components/ai-configuration-primitives.js.map +1 -0
  45. package/lib/browser/ai-configuration/components/ai-configuration-setting-row.d.ts +54 -0
  46. package/lib/browser/ai-configuration/components/ai-configuration-setting-row.d.ts.map +1 -0
  47. package/lib/browser/ai-configuration/components/ai-configuration-setting-row.js +77 -0
  48. package/lib/browser/ai-configuration/components/ai-configuration-setting-row.js.map +1 -0
  49. package/lib/browser/ai-configuration/components/ai-settings-row-service.d.ts +194 -0
  50. package/lib/browser/ai-configuration/components/ai-settings-row-service.d.ts.map +1 -0
  51. package/lib/browser/ai-configuration/components/ai-settings-row-service.js +352 -0
  52. package/lib/browser/ai-configuration/components/ai-settings-row-service.js.map +1 -0
  53. package/lib/browser/ai-configuration/components/ai-settings-row-service.spec.d.ts +2 -0
  54. package/lib/browser/ai-configuration/components/ai-settings-row-service.spec.d.ts.map +1 -0
  55. package/lib/browser/ai-configuration/components/ai-settings-row-service.spec.js +233 -0
  56. package/lib/browser/ai-configuration/components/ai-settings-row-service.spec.js.map +1 -0
  57. package/lib/browser/ai-configuration/components/ai-settings-row.d.ts +50 -0
  58. package/lib/browser/ai-configuration/components/ai-settings-row.d.ts.map +1 -0
  59. package/lib/browser/ai-configuration/components/ai-settings-row.js +85 -0
  60. package/lib/browser/ai-configuration/components/ai-settings-row.js.map +1 -0
  61. package/lib/browser/ai-configuration/components/collapsible-list.d.ts +65 -0
  62. package/lib/browser/ai-configuration/components/collapsible-list.d.ts.map +1 -0
  63. package/lib/browser/ai-configuration/components/collapsible-list.js +82 -0
  64. package/lib/browser/ai-configuration/components/collapsible-list.js.map +1 -0
  65. package/lib/browser/ai-configuration/components/prompt-customization-dialogs.d.ts +35 -0
  66. package/lib/browser/ai-configuration/components/prompt-customization-dialogs.d.ts.map +1 -0
  67. package/lib/browser/ai-configuration/components/prompt-customization-dialogs.js +83 -0
  68. package/lib/browser/ai-configuration/components/prompt-customization-dialogs.js.map +1 -0
  69. package/lib/browser/ai-configuration/components/variant-set-card.d.ts +25 -0
  70. package/lib/browser/ai-configuration/components/variant-set-card.d.ts.map +1 -0
  71. package/lib/browser/ai-configuration/components/variant-set-card.js +133 -0
  72. package/lib/browser/ai-configuration/components/variant-set-card.js.map +1 -0
  73. package/lib/browser/ai-configuration/renderers/collection-category-renderer.d.ts +44 -0
  74. package/lib/browser/ai-configuration/renderers/collection-category-renderer.d.ts.map +1 -0
  75. package/lib/browser/ai-configuration/renderers/collection-category-renderer.js +106 -0
  76. package/lib/browser/ai-configuration/renderers/collection-category-renderer.js.map +1 -0
  77. package/lib/browser/ai-configuration/renderers/collection-category-renderer.spec.d.ts +2 -0
  78. package/lib/browser/ai-configuration/renderers/collection-category-renderer.spec.d.ts.map +1 -0
  79. package/lib/browser/ai-configuration/renderers/collection-category-renderer.spec.js +120 -0
  80. package/lib/browser/ai-configuration/renderers/collection-category-renderer.spec.js.map +1 -0
  81. package/lib/browser/ai-configuration/renderers/single-page-category-renderer.d.ts +15 -0
  82. package/lib/browser/ai-configuration/renderers/single-page-category-renderer.d.ts.map +1 -0
  83. package/lib/browser/ai-configuration/renderers/single-page-category-renderer.js +20 -0
  84. package/lib/browser/ai-configuration/renderers/single-page-category-renderer.js.map +1 -0
  85. package/lib/browser/ai-core-ui-frontend-module.d.ts +1 -0
  86. package/lib/browser/ai-core-ui-frontend-module.d.ts.map +1 -1
  87. package/lib/browser/ai-core-ui-frontend-module.js +11 -0
  88. package/lib/browser/ai-core-ui-frontend-module.js.map +1 -1
  89. package/package.json +6 -5
  90. package/src/browser/ai-configuration/ai-configuration-category-registry.spec.ts +137 -0
  91. package/src/browser/ai-configuration/ai-configuration-category-registry.ts +79 -0
  92. package/src/browser/ai-configuration/ai-configuration-category.ts +246 -0
  93. package/src/browser/ai-configuration/ai-configuration-selection-model.ts +42 -0
  94. package/src/browser/ai-configuration/ai-configuration-setting-commands.spec.ts +82 -0
  95. package/src/browser/ai-configuration/ai-configuration-setting-commands.ts +104 -0
  96. package/src/browser/ai-configuration/components/ai-configuration-components.spec.ts +655 -0
  97. package/src/browser/ai-configuration/components/ai-configuration-controls.tsx +382 -0
  98. package/src/browser/ai-configuration/components/ai-configuration-item-row.tsx +127 -0
  99. package/src/browser/ai-configuration/components/ai-configuration-origin-badge.tsx +114 -0
  100. package/src/browser/ai-configuration/components/ai-configuration-primitives.tsx +359 -0
  101. package/src/browser/ai-configuration/components/ai-configuration-setting-row.tsx +154 -0
  102. package/src/browser/ai-configuration/components/ai-settings-row-service.spec.ts +275 -0
  103. package/src/browser/ai-configuration/components/ai-settings-row-service.ts +401 -0
  104. package/src/browser/ai-configuration/components/ai-settings-row.tsx +176 -0
  105. package/src/browser/ai-configuration/components/collapsible-list.tsx +205 -0
  106. package/src/browser/ai-configuration/components/prompt-customization-dialogs.ts +89 -0
  107. package/src/browser/ai-configuration/components/variant-set-card.tsx +200 -0
  108. package/src/browser/ai-configuration/renderers/collection-category-renderer.spec.ts +126 -0
  109. package/src/browser/ai-configuration/renderers/collection-category-renderer.tsx +164 -0
  110. package/src/browser/ai-configuration/renderers/single-page-category-renderer.tsx +41 -0
  111. package/src/browser/ai-core-ui-frontend-module.ts +14 -1
  112. package/src/browser/style/ai-configuration-components.css +1410 -0
  113. package/src/browser/style/index.css +17 -0
@@ -0,0 +1,596 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2026 EclipseSource and others.
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
+ const jsdom_1 = require("@theia/core/lib/browser/test/jsdom");
19
+ let disableJSDOM = (0, jsdom_1.enableJSDOM)();
20
+ // @lumino/dragdrop (pulled in transitively via `codicon` from `@theia/core/lib/browser`) extends the
21
+ // DragEvent DOM global at module load, which JSDOM does not provide; stub it so the import succeeds.
22
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
+ if (!global.DragEvent) {
24
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
25
+ global.DragEvent = class DragEvent extends global.Event {
26
+ };
27
+ }
28
+ const chai_1 = require("chai");
29
+ const React = require("@theia/core/shared/react");
30
+ const react_dom_1 = require("@theia/core/shared/react-dom");
31
+ const client_1 = require("@theia/core/shared/react-dom/client");
32
+ const ai_configuration_item_row_1 = require("./ai-configuration-item-row");
33
+ const ai_configuration_primitives_1 = require("./ai-configuration-primitives");
34
+ const ai_configuration_origin_badge_1 = require("./ai-configuration-origin-badge");
35
+ const ai_configuration_setting_row_1 = require("./ai-configuration-setting-row");
36
+ const ai_configuration_controls_1 = require("./ai-configuration-controls");
37
+ const browser_1 = require("@theia/core/lib/browser");
38
+ const prompt_customization_dialogs_1 = require("./prompt-customization-dialogs");
39
+ const variant_set_card_1 = require("./variant-set-card");
40
+ disableJSDOM();
41
+ /** Replaces the (single) input's text the way a keystroke does, and flushes the resulting render. */
42
+ function typeInto(container, value) {
43
+ const input = container.querySelector('input');
44
+ // JSDOM only accepts events built from its own window's constructor, not Node's global `Event`.
45
+ const view = container.ownerDocument.defaultView;
46
+ // Assigning `value` directly goes through React's patched setter, which then treats the change as
47
+ // already handled and never calls `onChange`; the prototype's setter is what a real keystroke uses.
48
+ const nativeSetter = Object.getOwnPropertyDescriptor(view.HTMLInputElement.prototype, 'value').set;
49
+ (0, react_dom_1.flushSync)(() => {
50
+ nativeSetter.call(input, value);
51
+ input.dispatchEvent(new view.Event('input', { bubbles: true }));
52
+ });
53
+ }
54
+ /** Renders one level of an element: the output of a function component, or the children of a host element. */
55
+ function contentOf(element) {
56
+ if (typeof element.type === 'function') {
57
+ return element.type(element.props);
58
+ }
59
+ return element.props?.children;
60
+ }
61
+ /** Recursively collects the class names present anywhere in a rendered element tree. */
62
+ function classNames(node, into = []) {
63
+ if (!node || typeof node !== 'object') {
64
+ return into;
65
+ }
66
+ if (Array.isArray(node)) {
67
+ node.forEach(child => classNames(child, into));
68
+ return into;
69
+ }
70
+ const element = node;
71
+ if (element.props?.className) {
72
+ into.push(...element.props.className.split(/\s+/).filter(Boolean));
73
+ }
74
+ classNames(contentOf(element), into);
75
+ return into;
76
+ }
77
+ /** Recursively collects the string text present anywhere in a rendered element tree. */
78
+ function textOf(node, into = []) {
79
+ if (node === undefined || node === false) {
80
+ return into;
81
+ }
82
+ if (typeof node === 'string' || typeof node === 'number') {
83
+ into.push(String(node));
84
+ return into;
85
+ }
86
+ if (Array.isArray(node)) {
87
+ node.forEach(child => textOf(child, into));
88
+ return into;
89
+ }
90
+ if (typeof node === 'object') {
91
+ textOf(contentOf(node), into);
92
+ }
93
+ return into;
94
+ }
95
+ describe('AI Configuration primitives', () => {
96
+ before(() => disableJSDOM = (0, jsdom_1.enableJSDOM)());
97
+ after(() => disableJSDOM());
98
+ /** Renders a component into a detached container; the caller disposes it. */
99
+ function mount(element) {
100
+ const container = document.createElement('div');
101
+ document.body.appendChild(container);
102
+ const root = (0, client_1.createRoot)(container);
103
+ (0, react_dom_1.flushSync)(() => root.render(element));
104
+ return { container, dispose: () => { (0, react_dom_1.flushSync)(() => root.unmount()); container.remove(); } };
105
+ }
106
+ it('AiConfigurationSection renders its title and children', () => {
107
+ const { container, dispose } = mount(React.createElement(ai_configuration_primitives_1.AiConfigurationSection, { title: 'General', children: React.createElement('span', {}, 'row') }));
108
+ try {
109
+ (0, chai_1.expect)(Boolean(container.querySelector('.ai-configuration-section'))).to.equal(true);
110
+ (0, chai_1.expect)(container.textContent).to.include('General').and.to.include('row');
111
+ // Not foldable unless asked: no chevron, and the content is not gated behind one.
112
+ (0, chai_1.expect)(Boolean(container.querySelector('.ai-configuration-section-chevron'))).to.equal(false);
113
+ }
114
+ finally {
115
+ dispose();
116
+ }
117
+ });
118
+ it('AiConfigurationSection shows an entry count next to the title', () => {
119
+ const { container, dispose } = mount(React.createElement(ai_configuration_primitives_1.AiConfigurationSection, { title: 'Skills', count: 14, children: React.createElement('span', {}, 'row') }));
120
+ try {
121
+ (0, chai_1.expect)(container.querySelector('.ai-configuration-section-count')?.textContent).to.equal('14');
122
+ }
123
+ finally {
124
+ dispose();
125
+ }
126
+ });
127
+ it('AiConfigurationSection folds its content away when collapsible, starting expanded', () => {
128
+ const { container, dispose } = mount(React.createElement(ai_configuration_primitives_1.AiConfigurationSection, { title: 'Skills', collapsible: true, children: React.createElement('span', {}, 'row') }));
129
+ try {
130
+ const header = container.querySelector('.ai-configuration-section-title.foldable');
131
+ // Browsing pages open showing their content; folding is the user's choice.
132
+ (0, chai_1.expect)(header?.getAttribute('aria-expanded')).to.equal('true');
133
+ (0, chai_1.expect)(container.textContent).to.include('row');
134
+ (0, react_dom_1.flushSync)(() => header.click());
135
+ (0, chai_1.expect)(header.getAttribute('aria-expanded')).to.equal('false');
136
+ (0, chai_1.expect)(container.textContent).to.not.include('row');
137
+ }
138
+ finally {
139
+ dispose();
140
+ }
141
+ });
142
+ it('AiConfigurationSection keeps a folded section open while forced, so a filter match stays reachable', () => {
143
+ const { container, dispose } = mount(React.createElement(ai_configuration_primitives_1.AiConfigurationSection, { title: 'Skills', collapsible: true, forceExpanded: true, children: React.createElement('span', {}, 'row') }));
144
+ try {
145
+ const header = container.querySelector('.ai-configuration-section-title.foldable');
146
+ (0, react_dom_1.flushSync)(() => header.click());
147
+ (0, chai_1.expect)(container.textContent).to.include('row');
148
+ }
149
+ finally {
150
+ dispose();
151
+ }
152
+ });
153
+ it('AiConfigurationItemRow exposes the label, status and an onSelect handler', () => {
154
+ let selected = false;
155
+ const tree = (0, ai_configuration_item_row_1.AiConfigurationItemRow)({
156
+ label: 'Universal',
157
+ iconClass: 'codicon-copilot',
158
+ status: { kind: 'on', label: 'Enabled' },
159
+ onSelect: () => { selected = true; }
160
+ });
161
+ (0, chai_1.expect)(textOf(tree)).to.include('Universal').and.to.include('Enabled');
162
+ (0, chai_1.expect)(classNames(tree)).to.include('ai-configuration-status-on');
163
+ tree.props.onClick();
164
+ (0, chai_1.expect)(selected).to.equal(true);
165
+ });
166
+ it('AiConfigurationItemRow shows the modified bar and a gear that anchors its menu at the gear', () => {
167
+ const host = document.createElement('div');
168
+ document.body.appendChild(host);
169
+ const root = (0, client_1.createRoot)(host);
170
+ const opened = [];
171
+ (0, react_dom_1.flushSync)(() => root.render(React.createElement(ai_configuration_item_row_1.AiConfigurationItemRow, {
172
+ label: 'chat',
173
+ modified: true,
174
+ onOpenMenu: gearEl => { opened.push(gearEl); }
175
+ })));
176
+ const row = host.querySelector('.ai-configuration-item-row');
177
+ (0, chai_1.expect)(row.classList.contains('modified')).to.equal(true);
178
+ // A non-navigable row (no onSelect) shows no chevron.
179
+ (0, chai_1.expect)(Boolean(host.querySelector('.ai-configuration-item-row-chevron'))).to.equal(false);
180
+ const gear = host.querySelector('.ai-settings-row-gear');
181
+ (0, chai_1.expect)(Boolean(gear)).to.equal(true);
182
+ (0, react_dom_1.flushSync)(() => gear.click());
183
+ (0, chai_1.expect)(opened.length).to.equal(1);
184
+ (0, chai_1.expect)(opened[0]).to.equal(gear);
185
+ root.unmount();
186
+ host.remove();
187
+ });
188
+ it('AiConfigurationEmptyState renders the message and an optional action', async () => {
189
+ const tree = await (0, ai_configuration_primitives_1.AiConfigurationEmptyState)({ message: 'Nothing here', action: React.createElement('button', {}, 'Add') });
190
+ (0, chai_1.expect)(textOf(tree)).to.include('Nothing here').and.to.include('Add');
191
+ });
192
+ it('AiConfigurationItemDetailHeader renders title and subtitle', async () => {
193
+ const tree = await (0, ai_configuration_primitives_1.AiConfigurationItemDetailHeader)({ title: 'Coder', subtitle: 'agent-id-1' });
194
+ (0, chai_1.expect)(textOf(tree)).to.include('Coder').and.to.include('agent-id-1');
195
+ });
196
+ it('AiConfigurationOriginBadge is a button that activates its origin, and does not open the row it sits in', () => {
197
+ let activated = 0;
198
+ let rowOpened = 0;
199
+ const { container, dispose } = mount(React.createElement('div', { onClick: () => { rowOpened++; } }, React.createElement(ai_configuration_origin_badge_1.AiConfigurationOriginBadge, {
200
+ origin: { label: 'From registry', iconClass: 'codicon-link-external', tooltip: 'Open in AI registry: x', activate: () => { activated++; } }
201
+ })));
202
+ try {
203
+ const badge = container.querySelector('button.ai-configuration-origin-badge');
204
+ (0, chai_1.expect)(badge.getAttribute('title')).to.equal('Open in AI registry: x');
205
+ (0, chai_1.expect)(badge.textContent).to.include('From registry');
206
+ (0, react_dom_1.flushSync)(() => badge.click());
207
+ (0, chai_1.expect)(activated).to.equal(1);
208
+ // The surrounding row and detail header are clickable themselves; following the badge must
209
+ // not also open them.
210
+ (0, chai_1.expect)(rowOpened).to.equal(0);
211
+ }
212
+ finally {
213
+ dispose();
214
+ }
215
+ });
216
+ it('AiConfigurationOriginBadge is not focusable when the origin leads nowhere', () => {
217
+ const { container, dispose } = mount(React.createElement(ai_configuration_origin_badge_1.AiConfigurationOriginBadge, {
218
+ origin: { label: 'via Acme', iconClass: 'codicon-package', tooltip: 'Acme' }
219
+ }));
220
+ try {
221
+ (0, chai_1.expect)(container.querySelector('button')).to.be.null;
222
+ (0, chai_1.expect)(container.querySelector('span.ai-configuration-origin-badge')?.textContent).to.include('via Acme');
223
+ }
224
+ finally {
225
+ dispose();
226
+ }
227
+ });
228
+ it('AiConfigurationOriginBadges renders one badge per origin, in order, and nothing without any', () => {
229
+ const origin = (label) => ({ label, iconClass: 'codicon-link-external', tooltip: label, activate: () => { } });
230
+ const { container, dispose } = mount(React.createElement(ai_configuration_origin_badge_1.AiConfigurationOriginBadges, { origins: [origin('From registry'), origin('via Acme Devtools')] }));
231
+ try {
232
+ (0, chai_1.expect)(Array.from(container.querySelectorAll('.ai-configuration-origin-badge')).map(badge => badge.textContent))
233
+ .to.deep.equal(['From registry', 'via Acme Devtools']);
234
+ }
235
+ finally {
236
+ dispose();
237
+ }
238
+ const empty = mount(React.createElement('div', {}, React.createElement(ai_configuration_origin_badge_1.AiConfigurationOriginBadges, { origins: [] })));
239
+ try {
240
+ (0, chai_1.expect)(empty.container.querySelector('.ai-configuration-origin-badges')).to.be.null;
241
+ }
242
+ finally {
243
+ empty.dispose();
244
+ }
245
+ });
246
+ it('AiConfigurationOrigin builds the same registry and Agent Plugin badges for every page to use', () => {
247
+ const registry = ai_configuration_origin_badge_1.AiConfigurationOrigin.registry('io.github.acme/validator', () => { });
248
+ (0, chai_1.expect)(registry.label).to.equal('From registry');
249
+ (0, chai_1.expect)(registry.iconClass).to.contain('codicon-link-external');
250
+ (0, chai_1.expect)(registry.tooltip).to.contain('io.github.acme/validator');
251
+ const plugin = ai_configuration_origin_badge_1.AiConfigurationOrigin.agentPlugin({ pluginId: 'io.github.acme/devtools', name: 'Acme Devtools' }, () => { });
252
+ (0, chai_1.expect)(plugin.label).to.equal('via Acme Devtools');
253
+ (0, chai_1.expect)(plugin.iconClass).to.contain('codicon-package');
254
+ (0, chai_1.expect)(plugin.tooltip).to.contain('Acme Devtools');
255
+ });
256
+ it('AiConfigurationSettingRow renders title and control, marks modified rows, and hides the raw id', () => {
257
+ const host = document.createElement('div');
258
+ document.body.appendChild(host);
259
+ const root = (0, client_1.createRoot)(host);
260
+ (0, react_dom_1.flushSync)(() => root.render(React.createElement(ai_configuration_setting_row_1.AiConfigurationSettingRow, {
261
+ preferenceId: 'ai-features.demo',
262
+ title: 'Demo',
263
+ renderMarkdown: () => document.createElement('div'),
264
+ modified: true,
265
+ control: React.createElement('span', {}, 'ctrl')
266
+ })));
267
+ const row = host.querySelector('.ai-settings-row');
268
+ (0, chai_1.expect)(row.classList.contains('modified')).to.equal(true);
269
+ (0, chai_1.expect)(row.textContent).to.include('Demo').and.to.include('ctrl');
270
+ // The raw preference id is no longer shown inline; it is copied through the gear menu instead.
271
+ (0, chai_1.expect)(row.textContent).to.not.include('ai-features.demo');
272
+ (0, react_dom_1.flushSync)(() => root.render(React.createElement(ai_configuration_setting_row_1.AiConfigurationSettingRow, {
273
+ preferenceId: 'ai-features.demo',
274
+ title: 'Demo',
275
+ renderMarkdown: () => document.createElement('div'),
276
+ modified: false
277
+ })));
278
+ (0, chai_1.expect)(host.querySelector('.ai-settings-row').classList.contains('modified')).to.equal(false);
279
+ root.unmount();
280
+ host.remove();
281
+ });
282
+ it('the setting-row gear delegates to the preference context menu, anchored at the gear', () => {
283
+ const host = document.createElement('div');
284
+ document.body.appendChild(host);
285
+ const root = (0, client_1.createRoot)(host);
286
+ const opened = [];
287
+ (0, react_dom_1.flushSync)(() => root.render(React.createElement(ai_configuration_setting_row_1.AiConfigurationSettingRow, {
288
+ preferenceId: 'ai-features.demo',
289
+ title: 'Demo',
290
+ renderMarkdown: () => document.createElement('div'),
291
+ modified: true,
292
+ onOpenMenu: gearEl => { opened.push(gearEl); },
293
+ control: React.createElement('span', {}, 'ctrl')
294
+ })));
295
+ // The gear defers to the owner's opener (which renders the Settings UI's own preference context
296
+ // menu via ContextMenuRenderer), passing the gear element as the anchor. No inline popover.
297
+ const gear = host.querySelector('.ai-settings-row-gear');
298
+ (0, chai_1.expect)(Boolean(gear)).to.equal(true);
299
+ (0, react_dom_1.flushSync)(() => gear.click());
300
+ (0, chai_1.expect)(opened.length).to.equal(1);
301
+ (0, chai_1.expect)(opened[0]).to.equal(gear);
302
+ root.unmount();
303
+ host.remove();
304
+ });
305
+ it('AiConfigurationSettingRow hides the gear when no menu opener is provided', () => {
306
+ const host = document.createElement('div');
307
+ document.body.appendChild(host);
308
+ const root = (0, client_1.createRoot)(host);
309
+ (0, react_dom_1.flushSync)(() => root.render(React.createElement(ai_configuration_setting_row_1.AiConfigurationSettingRow, {
310
+ preferenceId: 'ai-features.demo',
311
+ title: 'Demo',
312
+ renderMarkdown: () => document.createElement('div'),
313
+ modified: true
314
+ })));
315
+ (0, chai_1.expect)(Boolean(host.querySelector('.ai-settings-row-gear'))).to.equal(false);
316
+ root.unmount();
317
+ host.remove();
318
+ });
319
+ it('AiConfigurationSettingRow places a full-width control in the below slot', () => {
320
+ const host = document.createElement('div');
321
+ document.body.appendChild(host);
322
+ const root = (0, client_1.createRoot)(host);
323
+ (0, react_dom_1.flushSync)(() => root.render(React.createElement(ai_configuration_setting_row_1.AiConfigurationSettingRow, {
324
+ preferenceId: 'ai-features.demo',
325
+ title: 'Demo',
326
+ renderMarkdown: () => document.createElement('div'),
327
+ modified: false,
328
+ below: React.createElement('span', {}, 'wide')
329
+ })));
330
+ (0, chai_1.expect)(Boolean(host.querySelector('.ai-settings-row-below'))).to.equal(true);
331
+ (0, chai_1.expect)(host.textContent).to.include('wide');
332
+ root.unmount();
333
+ host.remove();
334
+ });
335
+ });
336
+ describe('PromptCustomizationDialogs', () => {
337
+ before(() => disableJSDOM = (0, jsdom_1.enableJSDOM)());
338
+ after(() => disableJSDOM());
339
+ function promptServiceWith(fragments) {
340
+ const map = new Map(Object.entries(fragments).map(([id, list]) => [id, list.map(fragment => ({ id, template: '', ...fragment }))]));
341
+ return {
342
+ getAllPromptFragments: () => map,
343
+ getRawPromptFragment: (id) => map.get(id)?.[0]
344
+ };
345
+ }
346
+ it('reports a built-in behind a customized fragment, so the action can reset', () => {
347
+ const promptService = promptServiceWith({
348
+ 'coder-system-agent-mode': [{ customizationId: 'user', priority: 1 }, {}]
349
+ });
350
+ (0, chai_1.expect)(prompt_customization_dialogs_1.PromptCustomizationDialogs.hasBuiltIn(promptService, 'coder-system-agent-mode')).to.equal(true);
351
+ });
352
+ it('reports no built-in for a user-authored variant, whose reset would silently do nothing', () => {
353
+ // A file named after the variant set becomes a custom variant of it; `PromptService.resetToBuiltIn`
354
+ // is a no-op without a built-in, so the caller has to delete the customization instead.
355
+ const promptService = promptServiceWith({
356
+ 'coder-system-agent-mode-nina': [{ customizationId: 'promptTemplateFolder', priority: 1 }]
357
+ });
358
+ (0, chai_1.expect)(prompt_customization_dialogs_1.PromptCustomizationDialogs.hasBuiltIn(promptService, 'coder-system-agent-mode-nina')).to.equal(false);
359
+ });
360
+ it('does not prompt for a fragment that carries no customization to remove', async () => {
361
+ let removed = false;
362
+ const promptService = promptServiceWith({ 'coder-system': [{}] });
363
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
364
+ promptService.removeCustomization = () => { removed = true; };
365
+ const result = await prompt_customization_dialogs_1.PromptCustomizationDialogs.confirmAndRemove(promptService, 'coder-system', {
366
+ title: 'Remove',
367
+ message: () => 'Remove?'
368
+ });
369
+ (0, chai_1.expect)(result).to.equal(false);
370
+ (0, chai_1.expect)(removed).to.equal(false);
371
+ });
372
+ it('removes the customization the effective fragment came from, after confirmation', async () => {
373
+ const promptService = promptServiceWith({
374
+ 'coder-system-agent-mode-nina': [{ customizationId: 'promptTemplateFolder', priority: 1 }]
375
+ });
376
+ const removals = [];
377
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
378
+ Object.assign(promptService, {
379
+ getCustomizationType: async () => 'Prompt Templates Folder',
380
+ getCustomizationDescription: async () => 'file:///prompts/coder-system-agent-mode-nina.prompttemplate',
381
+ removeCustomization: async (id, customizationId) => { removals.push(`${id}/${customizationId}`); }
382
+ });
383
+ let shownMessage;
384
+ // Auto-confirm the dialog: it resolves through `ConfirmDialog.open`, which needs a real accept click.
385
+ const originalOpen = browser_1.ConfirmDialog.prototype.open;
386
+ browser_1.ConfirmDialog.prototype.open = async function () {
387
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
388
+ shownMessage = this.contentNode?.textContent;
389
+ return true;
390
+ };
391
+ try {
392
+ const result = await prompt_customization_dialogs_1.PromptCustomizationDialogs.confirmAndRemove(promptService, 'coder-system-agent-mode-nina', {
393
+ title: 'Remove Prompt Template',
394
+ message: ({ type, description }) => `${type} :: ${description}`
395
+ });
396
+ (0, chai_1.expect)(result).to.equal(true);
397
+ (0, chai_1.expect)(removals).to.deep.equal(['coder-system-agent-mode-nina/promptTemplateFolder']);
398
+ // The dialog names where the customization lives, so the user sees which file goes away.
399
+ (0, chai_1.expect)(shownMessage).to.include('Prompt Templates Folder');
400
+ (0, chai_1.expect)(shownMessage).to.include('coder-system-agent-mode-nina.prompttemplate');
401
+ }
402
+ finally {
403
+ browser_1.ConfirmDialog.prototype.open = originalOpen;
404
+ }
405
+ });
406
+ });
407
+ describe('VariantSetCard', () => {
408
+ before(() => disableJSDOM = (0, jsdom_1.enableJSDOM)());
409
+ after(() => disableJSDOM());
410
+ /** A set with a built-in default plus a user-authored variant, which is the one currently selected. */
411
+ function setup() {
412
+ const fragments = new Map([
413
+ ['coder-system-agent-mode', [{ id: 'coder-system-agent-mode', template: '' }]],
414
+ ['coder-system-agent-mode-nina', [{ id: 'coder-system-agent-mode-nina', template: '', customizationId: 'folder', priority: 1 }]]
415
+ ]);
416
+ const selections = [];
417
+ const removals = [];
418
+ let selected = 'coder-system-agent-mode-nina';
419
+ const promptService = {
420
+ getVariantIds: () => ['coder-system-agent-mode', 'coder-system-agent-mode-nina'],
421
+ getDefaultVariantId: () => 'coder-system-agent-mode',
422
+ getSelectedVariantId: () => selected,
423
+ onSelectedVariantChange: () => ({ dispose: () => { } }),
424
+ getAllPromptFragments: () => fragments,
425
+ getRawPromptFragment: (id) => fragments.get(id)?.[0],
426
+ getCustomizationType: async () => 'Prompt Templates Folder',
427
+ getCustomizationDescription: async () => 'file:///prompts/coder-system-agent-mode-nina.prompttemplate',
428
+ removeCustomization: async (id) => { removals.push(id); fragments.delete(id); },
429
+ updateSelectedVariantId: async (agentId, _setId, variantId) => {
430
+ selections.push([agentId, variantId]);
431
+ selected = variantId;
432
+ }
433
+ };
434
+ return { promptService, selections, removals };
435
+ }
436
+ function render(promptService) {
437
+ const container = document.createElement('div');
438
+ document.body.appendChild(container);
439
+ const root = (0, client_1.createRoot)(container);
440
+ (0, react_dom_1.flushSync)(() => root.render(React.createElement(variant_set_card_1.VariantSetCard, {
441
+ agentId: 'coder',
442
+ promptVariantSetId: 'coder-system-agent-mode',
443
+ promptService,
444
+ settingsRowService: { openResetMenu: () => { } }
445
+ })));
446
+ return { container, dispose: () => { (0, react_dom_1.flushSync)(() => root.unmount()); container.remove(); } };
447
+ }
448
+ it('offers deletion, not a dead reset, for a selected variant that only exists as a user file', () => {
449
+ const { promptService } = setup();
450
+ const { container, dispose } = render(promptService);
451
+ try {
452
+ // `PromptService.resetToBuiltIn` is a no-op without a built-in, so the action must be a delete.
453
+ (0, chai_1.expect)(Boolean(container.querySelector('.codicon-trash'))).to.equal(true);
454
+ (0, chai_1.expect)(Boolean(container.querySelector('.codicon-discard'))).to.equal(false);
455
+ }
456
+ finally {
457
+ dispose();
458
+ }
459
+ });
460
+ it('falls back to the default variant after deleting the selected one, instead of leaving it unavailable', async () => {
461
+ const { promptService, selections, removals } = setup();
462
+ const { container, dispose } = render(promptService);
463
+ const originalOpen = browser_1.ConfirmDialog.prototype.open;
464
+ browser_1.ConfirmDialog.prototype.open = async () => true;
465
+ try {
466
+ const remove = container.querySelector('.ai-variant-action-button:last-of-type');
467
+ remove.click();
468
+ // Let the confirmation and both service calls settle.
469
+ await new Promise(resolve => setTimeout(resolve, 0));
470
+ (0, chai_1.expect)(removals).to.deep.equal(['coder-system-agent-mode-nina']);
471
+ (0, chai_1.expect)(selections).to.deep.equal([['coder', 'coder-system-agent-mode']]);
472
+ }
473
+ finally {
474
+ browser_1.ConfirmDialog.prototype.open = originalOpen;
475
+ dispose();
476
+ }
477
+ });
478
+ });
479
+ describe('AiArrayInput', () => {
480
+ before(() => disableJSDOM = (0, jsdom_1.enableJSDOM)());
481
+ after(() => disableJSDOM());
482
+ /** Renders the editor with a validator that refuses anything containing `*`, and reports the adds. */
483
+ function mountList(values) {
484
+ const added = [];
485
+ const container = document.createElement('div');
486
+ document.body.appendChild(container);
487
+ const root = (0, client_1.createRoot)(container);
488
+ (0, react_dom_1.flushSync)(() => root.render(React.createElement(ai_configuration_controls_1.AiArrayInput, {
489
+ values,
490
+ ariaLabel: 'Patterns',
491
+ addPlaceholder: 'Add pattern…',
492
+ validate: (value) => value.includes('*') ? `"${value}" is not allowed` : undefined,
493
+ onChange: (next) => { added.push(next); }
494
+ })));
495
+ return { container, added, dispose: () => { (0, react_dom_1.flushSync)(() => root.unmount()); container.remove(); } };
496
+ }
497
+ it('adds an accepted entry', () => {
498
+ const { container, added, dispose } = mountList(['git log ']);
499
+ try {
500
+ typeInto(container, 'npm test');
501
+ (0, react_dom_1.flushSync)(() => container.querySelector('.codicon-add').click());
502
+ (0, chai_1.expect)(added).to.deep.equal([['git log ', 'npm test']]);
503
+ }
504
+ finally {
505
+ dispose();
506
+ }
507
+ });
508
+ it('refuses a rejected entry, reporting why and keeping the text for correction', () => {
509
+ const { container, added, dispose } = mountList([]);
510
+ try {
511
+ typeInto(container, 'git log*');
512
+ (0, react_dom_1.flushSync)(() => container.querySelector('.codicon-add').click());
513
+ // Nothing written, the reason is shown, and the input still holds what was typed.
514
+ (0, chai_1.expect)(added).to.be.empty;
515
+ (0, chai_1.expect)(container.textContent).to.include('"git log*" is not allowed');
516
+ (0, chai_1.expect)(container.querySelector('input').value).to.equal('git log*');
517
+ }
518
+ finally {
519
+ dispose();
520
+ }
521
+ });
522
+ it('clears the reported problem once the text changes', () => {
523
+ const { container, dispose } = mountList([]);
524
+ try {
525
+ typeInto(container, '*');
526
+ (0, react_dom_1.flushSync)(() => container.querySelector('.codicon-add').click());
527
+ (0, chai_1.expect)(container.textContent).to.include('not allowed');
528
+ typeInto(container, 'npm test');
529
+ (0, chai_1.expect)(container.textContent).to.not.include('not allowed');
530
+ }
531
+ finally {
532
+ dispose();
533
+ }
534
+ });
535
+ });
536
+ describe('AiNumberStepper', () => {
537
+ before(() => disableJSDOM = (0, jsdom_1.enableJSDOM)());
538
+ after(() => disableJSDOM());
539
+ function mountStepper(value, integer) {
540
+ const committed = [];
541
+ const container = document.createElement('div');
542
+ document.body.appendChild(container);
543
+ const root = (0, client_1.createRoot)(container);
544
+ (0, react_dom_1.flushSync)(() => root.render(React.createElement(ai_configuration_controls_1.AiNumberStepper, {
545
+ value,
546
+ ariaLabel: 'Retry delay',
547
+ integer,
548
+ min: 0,
549
+ onCommit: (next) => { committed.push(next); }
550
+ })));
551
+ return { container, committed, dispose: () => { (0, react_dom_1.flushSync)(() => root.unmount()); container.remove(); } };
552
+ }
553
+ /** React listens for `focusout`, not `blur`, so that is what a real focus loss delivers to it. */
554
+ function commitByBlur(container) {
555
+ const input = container.querySelector('input');
556
+ const view = container.ownerDocument.defaultView;
557
+ (0, react_dom_1.flushSync)(() => input.dispatchEvent(new view.FocusEvent('focusout', { bubbles: true })));
558
+ }
559
+ it('keeps a fractional value for a `number` preference', () => {
560
+ const { container, committed, dispose } = mountStepper(60);
561
+ try {
562
+ typeInto(container, '1.5');
563
+ commitByBlur(container);
564
+ (0, chai_1.expect)(committed).to.deep.equal([1.5]);
565
+ // Also displayed as typed: rounding it away would hide what was just stored.
566
+ (0, chai_1.expect)(container.querySelector('input').value).to.equal('1.5');
567
+ }
568
+ finally {
569
+ dispose();
570
+ }
571
+ });
572
+ it('rounds a fractional value for an `integer` preference', () => {
573
+ const { container, committed, dispose } = mountStepper(60, true);
574
+ try {
575
+ typeInto(container, '1.5');
576
+ commitByBlur(container);
577
+ (0, chai_1.expect)(committed).to.deep.equal([2]);
578
+ }
579
+ finally {
580
+ dispose();
581
+ }
582
+ });
583
+ it('keeps the current value when the text is not a number', () => {
584
+ const { container, committed, dispose } = mountStepper(60);
585
+ try {
586
+ typeInto(container, 'soon');
587
+ commitByBlur(container);
588
+ (0, chai_1.expect)(committed).to.be.empty;
589
+ (0, chai_1.expect)(container.querySelector('input').value).to.equal('60');
590
+ }
591
+ finally {
592
+ dispose();
593
+ }
594
+ });
595
+ });
596
+ //# sourceMappingURL=ai-configuration-components.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-configuration-components.spec.js","sourceRoot":"","sources":["../../../../src/browser/ai-configuration/components/ai-configuration-components.spec.ts"],"names":[],"mappings":"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"}