@theia/ai-chat-ui 1.76.0-next.23 → 1.76.0-next.28

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.
@@ -149,15 +149,29 @@ class DelegatedChat extends React.Component {
149
149
  constructor(props) {
150
150
  super(props);
151
151
  this.toDispose = new core_1.DisposableCollection();
152
- this.trackedInteractionIds = new Set();
152
+ this.unmounted = false;
153
153
  this.handleToggle = (event) => {
154
154
  const details = event.currentTarget;
155
155
  this.setState({ isOpen: details.open });
156
156
  };
157
+ /**
158
+ * Clicking anywhere inside a <summary> toggles the <details> element by default,
159
+ * which would collapse/expand the block while the user operates the inline
160
+ * interaction UI. Suppress the toggle for such clicks — but keep nested
161
+ * <summary> elements working (e.g. the argument expanders of a confirmation
162
+ * card), whose own toggle is also the click's default action.
163
+ */
164
+ this.preventSummaryToggle = (event) => {
165
+ const target = event.target instanceof HTMLElement ? event.target : undefined;
166
+ const closestSummary = target?.closest('summary');
167
+ if (closestSummary && event.currentTarget.contains(closestSummary)) {
168
+ return;
169
+ }
170
+ event.preventDefault();
171
+ };
157
172
  this.state = {
158
173
  node: undefined,
159
- isOpen: false,
160
- pendingInteractions: []
174
+ isOpen: false
161
175
  };
162
176
  this.widget = props.subChatWidgetFactory();
163
177
  }
@@ -172,68 +186,74 @@ class DelegatedChat extends React.Component {
172
186
  subscribeToInvocation(invocation) {
173
187
  this.toDispose.dispose();
174
188
  this.toDispose = new core_1.DisposableCollection();
175
- this.trackedInteractionIds.clear();
176
189
  if (!invocation) {
177
190
  return;
178
191
  }
179
192
  invocation.responseCreated.then(chatModel => {
193
+ // Guard against continuations of a superseded invocation or an unmounted
194
+ // component: they would show the old model's node and register listeners
195
+ // into an already-disposed collection (which silently keeps them alive).
196
+ if (this.unmounted || invocation !== this.props.invocation) {
197
+ return;
198
+ }
180
199
  const node = mapResponseToNode(chatModel, this.props.parentNode);
181
200
  this.setState({ node });
182
- const changeListener = () => {
183
- this.removeResolvedInteractions();
184
- this.forceUpdate();
185
- };
186
- this.toDispose.push(chatModel.onDidChange(changeListener));
187
- // Subscribe to interactionNeeded for push-based interaction tracking
188
- this.toDispose.push(chatModel.onInteractionNeeded(contentPart => {
189
- const id = contentPart.interactionId;
190
- if (id && !this.trackedInteractionIds.has(id)
191
- && this.findConfirmationRenderer(contentPart)) {
192
- this.trackedInteractionIds.add(id);
193
- this.setState(prevState => ({
194
- pendingInteractions: [
195
- ...prevState.pendingInteractions,
196
- { contentPart, id }
197
- ]
198
- }));
199
- }
200
- }));
201
+ this.toDispose.push(chatModel.onDidChange(() => this.forceUpdate()));
202
+ // Pending interactions are derived from chatModel.pendingInteractions in
203
+ // render(); interactionNeeded does not imply onDidChange, so re-render
204
+ // explicitly when a new interaction is announced (#17952).
205
+ this.toDispose.push(chatModel.onInteractionNeeded(() => this.forceUpdate()));
201
206
  }).catch(error => {
202
207
  console.error('Failed to create delegated chat response:', error);
203
208
  });
204
209
  invocation.responseCompleted.then(() => {
205
- this.forceUpdate();
210
+ if (!this.unmounted) {
211
+ this.forceUpdate();
212
+ }
206
213
  }).catch(error => {
207
214
  console.error('Error in delegated chat response completion:', error);
208
- this.forceUpdate();
215
+ if (!this.unmounted) {
216
+ this.forceUpdate();
217
+ }
209
218
  });
210
219
  }
211
220
  componentWillUnmount() {
221
+ this.unmounted = true;
212
222
  this.toDispose.dispose();
213
- this.trackedInteractionIds.clear();
214
- }
215
- removeResolvedInteractions() {
216
- this.setState(prevState => ({
217
- pendingInteractions: prevState.pendingInteractions.filter(p => !p.contentPart.isResolved)
218
- }));
219
223
  }
224
+ /**
225
+ * The highest-priority renderer that implements renderConfirmation. Unlike plain
226
+ * rendering, this must not stop at the overall highest-priority renderer: a
227
+ * specialized renderer without renderConfirmation (e.g. the delegation renderer
228
+ * itself for nested delegations) would otherwise silently drop the interaction.
229
+ */
220
230
  findConfirmationRenderer(contentPart) {
221
- const renderer = this.props.chatResponsePartRenderers.getContributions().reduce((prev, current) => {
231
+ return this.props.chatResponsePartRenderers.getContributions()
232
+ .filter(renderer => renderer.renderConfirmation)
233
+ .reduce((prev, current) => {
222
234
  const prio = current.canHandle(contentPart);
223
235
  if (prio > prev[0]) {
224
236
  return [prio, current];
225
237
  }
226
238
  return prev;
227
239
  }, [-1, undefined])[1];
228
- if (renderer && renderer.renderConfirmation) {
229
- return renderer;
230
- }
231
- return undefined;
232
240
  }
233
- renderInteractionConfirmation(contentPart, id) {
241
+ renderPendingInteractions(pendingInteractions) {
242
+ // Key by interactionId so a sibling interaction resolving does not remount the
243
+ // remaining ones (losing in-progress wizard state); disambiguate the rare
244
+ // duplicate ids (e.g. two pending questions with identical text) by occurrence.
245
+ const seenIds = new Map();
246
+ return pendingInteractions.map(contentPart => {
247
+ const baseKey = contentPart.interactionId ?? 'interaction';
248
+ const occurrence = seenIds.get(baseKey) ?? 0;
249
+ seenIds.set(baseKey, occurrence + 1);
250
+ return this.renderInteractionConfirmation(contentPart, occurrence === 0 ? baseKey : `${baseKey}-${occurrence}`);
251
+ });
252
+ }
253
+ renderInteractionConfirmation(contentPart, key) {
234
254
  const renderer = this.findConfirmationRenderer(contentPart);
235
255
  if (renderer && this.state.node) {
236
- return (0, jsx_runtime_1.jsx)(React.Fragment, { children: renderer.renderConfirmation(contentPart, this.state.node) }, id);
256
+ return ((0, jsx_runtime_1.jsx)(React.Fragment, { children: renderer.renderConfirmation(contentPart, this.state.node) }, key));
237
257
  }
238
258
  return undefined;
239
259
  }
@@ -243,6 +263,12 @@ class DelegatedChat extends React.Component {
243
263
  const isComplete = this.state.node?.response.isComplete ?? false;
244
264
  const isCanceled = this.state.node?.response.isCanceled ?? false;
245
265
  const isError = this.state.node?.response.isError ?? false;
266
+ // Derived from the model on every render so pending interactions survive
267
+ // remounts and never outlive their resolution or the response (#17952). The
268
+ // list also covers interactions bubbled up from nested delegations, whose
269
+ // waiting state is not reflected in this response's isWaitingForInput.
270
+ const pendingInteractions = this.state.node?.response.pendingInteractions ?? [];
271
+ const isWaitingForInput = (this.state.node?.response.isWaitingForInput ?? false) || pendingInteractions.length > 0;
246
272
  let statusIcon = '';
247
273
  let statusText = '';
248
274
  if (hasNode) {
@@ -250,13 +276,18 @@ class DelegatedChat extends React.Component {
250
276
  statusIcon = 'codicon-close';
251
277
  statusText = core_1.nls.localize('theia/ai/chat-ui/delegation-response-renderer/status/canceled', 'canceled');
252
278
  }
279
+ else if (isError) {
280
+ // error() also marks the response complete, so check isError first
281
+ statusIcon = 'codicon-error';
282
+ statusText = core_1.nls.localizeByDefault('error');
283
+ }
253
284
  else if (isComplete) {
254
285
  statusIcon = 'codicon-check';
255
286
  statusText = core_1.nls.localizeByDefault('completed');
256
287
  }
257
- else if (isError) {
258
- statusIcon = 'codicon-error';
259
- statusText = core_1.nls.localizeByDefault('error');
288
+ else if (isWaitingForInput) {
289
+ statusIcon = 'codicon-loading';
290
+ statusText = core_1.nls.localize('theia/ai/chat-ui/delegation-response-renderer/status/waitingForInput', 'waiting for input');
260
291
  }
261
292
  else {
262
293
  statusIcon = 'codicon-loading';
@@ -271,9 +302,9 @@ class DelegatedChat extends React.Component {
271
302
  statusIcon = 'codicon-loading';
272
303
  statusText = core_1.nls.localize('theia/ai/chat-ui/delegation-response-renderer/status/starting', 'starting...');
273
304
  }
274
- const { isOpen, pendingInteractions } = this.state;
305
+ const { isOpen } = this.state;
275
306
  const showInteractionsInSummary = !isOpen && pendingInteractions.length > 0;
276
- return ((0, jsx_runtime_1.jsx)("div", { className: 'theia-delegation-container', children: (0, jsx_runtime_1.jsxs)("details", { className: 'delegation-response-details', onToggle: this.handleToggle, children: [(0, jsx_runtime_1.jsxs)("summary", { className: 'delegation-summary', children: [(0, jsx_runtime_1.jsxs)("div", { className: 'delegation-header', children: [(0, jsx_runtime_1.jsxs)("span", { className: 'delegation-agent', children: [(0, jsx_runtime_1.jsx)("span", { className: 'codicon codicon-copilot-large' }), " ", agentName] }), (0, jsx_runtime_1.jsxs)("span", { className: 'delegation-status', children: [showInteractionsInSummary && ((0, jsx_runtime_1.jsx)("span", { className: 'delegation-interaction-badge', title: core_1.nls.localize('theia/ai/chat-ui/delegation-response-renderer/interactionNeeded', 'User interaction needed'), children: (0, jsx_runtime_1.jsx)("span", { className: 'codicon codicon-warning' }) })), (0, jsx_runtime_1.jsx)("span", { className: `codicon ${statusIcon} delegation-status-icon` }), (0, jsx_runtime_1.jsx)("span", { className: 'delegation-status-text', children: statusText })] }), (0, jsx_runtime_1.jsx)("span", { className: `delegation-toggle-arrow${isOpen ? ' open' : ''}` })] }), showInteractionsInSummary && ((0, jsx_runtime_1.jsx)("div", { className: 'delegation-pending-confirmations', children: pendingInteractions.map(({ contentPart, id }) => this.renderInteractionConfirmation(contentPart, id)) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: 'delegation-content', children: [(0, jsx_runtime_1.jsxs)("div", { className: 'delegation-prompt-section', children: [(0, jsx_runtime_1.jsx)("strong", { children: core_1.nls.localize('theia/ai/chat-ui/delegation-response-renderer/prompt/label', 'Delegated prompt:') }), (0, jsx_runtime_1.jsx)("div", { className: 'delegation-prompt', children: prompt })] }), (0, jsx_runtime_1.jsxs)("div", { className: 'delegation-response-section', children: [(0, jsx_runtime_1.jsx)("strong", { children: core_1.nls.localize('theia/ai/chat-ui/delegation-response-renderer/response/label', 'Response:') }), (0, jsx_runtime_1.jsx)("div", { className: 'delegation-response-placeholder', children: hasNode && this.state.node ? this.widget.renderChatResponse(this.state.node) :
307
+ return ((0, jsx_runtime_1.jsx)("div", { className: 'theia-delegation-container', children: (0, jsx_runtime_1.jsxs)("details", { className: 'delegation-response-details', onToggle: this.handleToggle, children: [(0, jsx_runtime_1.jsxs)("summary", { className: 'delegation-summary', children: [(0, jsx_runtime_1.jsxs)("div", { className: 'delegation-header', children: [(0, jsx_runtime_1.jsxs)("span", { className: 'delegation-agent', children: [(0, jsx_runtime_1.jsx)("span", { className: 'codicon codicon-copilot-large' }), " ", agentName] }), (0, jsx_runtime_1.jsxs)("span", { className: 'delegation-status', children: [showInteractionsInSummary && ((0, jsx_runtime_1.jsx)("span", { className: 'delegation-interaction-badge', title: core_1.nls.localize('theia/ai/chat-ui/delegation-response-renderer/interactionNeeded', 'User interaction needed'), children: (0, jsx_runtime_1.jsx)("span", { className: 'codicon codicon-warning' }) })), (0, jsx_runtime_1.jsx)("span", { className: `codicon ${statusIcon} delegation-status-icon` }), (0, jsx_runtime_1.jsx)("span", { className: 'delegation-status-text', children: statusText })] }), (0, jsx_runtime_1.jsx)("span", { className: `delegation-toggle-arrow${isOpen ? ' open' : ''}` })] }), showInteractionsInSummary && ((0, jsx_runtime_1.jsx)("div", { className: 'delegation-pending-confirmations', onClick: this.preventSummaryToggle, children: this.renderPendingInteractions(pendingInteractions) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: 'delegation-content', children: [(0, jsx_runtime_1.jsxs)("div", { className: 'delegation-prompt-section', children: [(0, jsx_runtime_1.jsx)("strong", { children: core_1.nls.localize('theia/ai/chat-ui/delegation-response-renderer/prompt/label', 'Delegated prompt:') }), (0, jsx_runtime_1.jsx)("div", { className: 'delegation-prompt', children: prompt })] }), (0, jsx_runtime_1.jsxs)("div", { className: 'delegation-response-section', children: [(0, jsx_runtime_1.jsx)("strong", { children: core_1.nls.localize('theia/ai/chat-ui/delegation-response-renderer/response/label', 'Response:') }), (0, jsx_runtime_1.jsx)("div", { className: 'delegation-response-placeholder', children: hasNode && this.state.node ? this.widget.renderChatResponse(this.state.node) :
277
308
  this.props.finished ?
278
309
  (0, jsx_runtime_1.jsx)("span", { className: 'delegation-status-text', children: core_1.nls.localize('theia/ai/chat-ui/delegation-response-renderer/restoredNotAvailable', 'Response not available for restored sessions.') }) :
279
310
  (0, jsx_runtime_1.jsx)("div", { className: 'theia-ChatContentInProgress', children: core_1.nls.localize('theia/ai/chat-ui/delegation-response-renderer/starting', 'Starting delegation...') }) })] })] })] }) }));
@@ -1 +1 @@
1
- {"version":3,"file":"delegation-tool-renderer.js","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/delegation-tool-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;AAEhF,4DAAyE;AACzE,4CAAgJ;AAChJ,qFAAgF;AAChF,4GAAmG;AACnG,oHAA8G;AAC9G,6EAAwF;AACxF,4CAAwD;AACxD,4FAAuF;AACvF,gFAA0E;AAE1E,uEAAyE;AACzE,2DAAgG;AAChG,4GAGsD;AACtD,qDAA0D;AAC1D,qDAAsI;AACtI,sCAA8E;AAC9E,kDAAkD;AAG3C,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAmC/B,SAAS,CAAC,QAA6B;QACnC,IAAI,qCAA2B,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,KAAK,6CAA4B,EAAE,CAAC;YAC7F,OAAO,EAAE,CAAC;QACd,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;IACd,CAAC;IAED,MAAM,CAAC,QAAqC,EAAE,UAAwB;QAClE,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEjG,IAAI,SAAS,GAAG,QAAQ,CAAC,IAAI,IAAI,6CAA4B,CAAC;QAC9D,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACrB,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC5C,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACnC,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC;gBACnF,CAAC;gBACD,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAClC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBACzB,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,MAAM,cAAc,GAAG,IAAA,uCAAsB,EAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAC7E,IAAI,cAAc,EAAE,CAAC;oBACjB,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,IAAI,IAAI,cAAc,CAAC;gBACvF,CAAC;gBACD,MAAM,aAAa,GAAG,IAAA,uCAAsB,EAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAC3E,IAAI,aAAa,EAAE,CAAC;oBAChB,MAAM,GAAG,aAAa,CAAC;gBAC3B,CAAC;YACL,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,6CAA4B,CAAC,CAAC;QAC1F,MAAM,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,6CAA4B,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAE7H,OAAO,uBAAC,6BAA6B,IACjC,UAAU,EAAE,UAAU,EAAE,UAAU,EAClC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI,MAAM,EACpC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAC3B,UAAU,EAAE,UAAU,EACtB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,EAC/C,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,EAC7C,yBAAyB,EAAE,IAAI,CAAC,yBAAyB,EACzD,gBAAgB,EAAE;gBACd,QAAQ;gBACR,gBAAgB;gBAChB,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;gBACrD,WAAW;gBACX,MAAM;gBACN,eAAe,EAAE,UAAU,CAAC,QAAQ,CAAC,UAAU;gBAC/C,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;gBAC7C,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,cAAc,EAAE,IAAI,CAAC,8BAA8B;gBACnD,eAAe,EAAE,IAAI,CAAC,kBAAkB,EAAE;gBAC1C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;aAC1C,GACH,CAAC;IACP,CAAC;IAES,kBAAkB;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,oFAAwC,CAAC,EAAE,CAAC,CAAC;QACjF,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,iFAAqC,CAAC,EAAE,CAAC,CAAC;QAC7E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAES,gBAAgB,CAAC,SAAiB;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9E,CAAC;CACJ,CAAA;AA9GY,wDAAsB;AAGrB;IADT,IAAA,kBAAM,EAAC,2CAAmB,CAAC;sCACG,2CAAmB;mEAAC;AAGhC;IADlB,IAAA,kBAAM,EAAC,qCAAgB,CAAC;;gEAC6B;AAG5C;IADT,IAAA,kBAAM,EAAC,sCAAoB,CAAC;;oEACwB;AAG3C;IADT,IAAA,kBAAM,EAAC,uDAAuB,CAAC;sCACG,uDAAuB;uEAAC;AAGjD;IADT,IAAA,kBAAM,EAAC,gCAAsB,CAAC;;sEAC0B;AAG/C;IADT,IAAA,kBAAM,EAAC,6BAAmB,CAAC;sCACG,6BAAmB;mEAAC;AAGzC;IADT,IAAA,kBAAM,EAAC,uBAAa,CAAC;;6DACiB;AAG7B;IADT,IAAA,kBAAM,EAAC,kEAA8B,CAAC;sCACG,kEAA8B;8EAAC;AAG/D;IADT,IAAA,kBAAM,EAAC,4BAAkB,CAAC;sCACG,4BAAkB;kEAAC;AAGvC;IADT,IAAA,kBAAM,EAAC,0BAAgB,CAAC;;gEACoB;AAGnC;IADT,IAAA,kBAAM,EAAC,2BAAoB,CAAC;IAAE,IAAA,iBAAK,EAAC,sDAAwB,CAAC;;yEAC2C;iCAjChG,sBAAsB;IADlC,IAAA,sBAAU,GAAE;GACA,sBAAsB,CA8GlC;AAwBD,MAAM,aAAc,SAAQ,KAAK,CAAC,SAAiD;IAK/E,YAAY,KAAyB;QACjC,KAAK,CAAC,KAAK,CAAC,CAAC;QAJT,cAAS,GAAG,IAAI,2BAAoB,EAAE,CAAC;QACvC,0BAAqB,GAAG,IAAI,GAAG,EAAU,CAAC;QA6F1C,iBAAY,GAAG,CAAC,KAA+C,EAAQ,EAAE;YAC7E,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC;QA5FE,IAAI,CAAC,KAAK,GAAG;YACT,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,KAAK;YACb,mBAAmB,EAAE,EAAE;SAC1B,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,oBAAoB,EAAE,CAAC;IAC/C,CAAC;IAEQ,iBAAiB;QACtB,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC;IAEQ,kBAAkB,CAAC,SAA6B;QACrD,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;YAC1E,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;IAEO,qBAAqB,CAAC,UAAkC;QAC5D,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,2BAAoB,EAAE,CAAC;QAC5C,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO;QACX,CAAC;QAED,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACxC,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACjE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YAExB,MAAM,cAAc,GAAG,GAAG,EAAE;gBACxB,IAAI,CAAC,0BAA0B,EAAE,CAAC;gBAClC,IAAI,CAAC,WAAW,EAAE,CAAC;YACvB,CAAC,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC;YAE3D,qEAAqE;YACrE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE;gBAC5D,MAAM,EAAE,GAAG,WAAW,CAAC,aAAa,CAAC;gBACrC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;uBACtC,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,EAAE,CAAC;oBAChD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACnC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;wBACxB,mBAAmB,EAAE;4BACjB,GAAG,SAAS,CAAC,mBAAmB;4BAChC,EAAE,WAAW,EAAE,EAAE,EAAE;yBACtB;qBACJ,CAAC,CAAC,CAAC;gBACR,CAAC;YACL,CAAC,CAAC,CAAC,CAAC;QACR,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,EAAE;YACnC,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;YACrE,IAAI,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;IACP,CAAC;IAEQ,oBAAoB;QACzB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAEO,0BAA0B;QAC9B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACxB,mBAAmB,EAAE,SAAS,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC;SAC5F,CAAC,CAAC,CAAC;IACR,CAAC;IAEO,wBAAwB,CAAC,WAAgC;QAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAC3E,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YACd,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC5C,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC3B,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,EACD,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,QAAQ,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC;YAC1C,OAAO,QAAQ,CAAC;QACpB,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAOO,6BAA6B,CAAC,WAAgC,EAAE,EAAU;QAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC9B,OAAO,uBAAC,KAAK,CAAC,QAAQ,cAAW,QAAQ,CAAC,kBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAA/D,EAAE,CAA+E,CAAC;QAClH,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAEQ,MAAM;QACX,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACzC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,IAAI,KAAK,CAAC;QACjE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,IAAI,KAAK,CAAC;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,IAAI,KAAK,CAAC;QAE3D,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,OAAO,EAAE,CAAC;YACV,IAAI,UAAU,EAAE,CAAC;gBACb,UAAU,GAAG,eAAe,CAAC;gBAC7B,UAAU,GAAG,UAAG,CAAC,QAAQ,CAAC,+DAA+D,EAAE,UAAU,CAAC,CAAC;YAC3G,CAAC;iBAAM,IAAI,UAAU,EAAE,CAAC;gBACpB,UAAU,GAAG,eAAe,CAAC;gBAC7B,UAAU,GAAG,UAAG,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACpD,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC;gBACjB,UAAU,GAAG,eAAe,CAAC;gBAC7B,UAAU,GAAG,UAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACJ,UAAU,GAAG,iBAAiB,CAAC;gBAC/B,UAAU,GAAG,UAAG,CAAC,QAAQ,CAAC,iEAAiE,EAAE,eAAe,CAAC,CAAC;YAClH,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7B,UAAU,GAAG,eAAe,CAAC;YAC7B,UAAU,GAAG,UAAG,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACJ,UAAU,GAAG,iBAAiB,CAAC;YAC/B,UAAU,GAAG,UAAG,CAAC,QAAQ,CAAC,+DAA+D,EAAE,aAAa,CAAC,CAAC;QAC9G,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACnD,MAAM,yBAAyB,GAAG,CAAC,MAAM,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;QAE5E,OAAO,CACH,gCAAK,SAAS,EAAC,4BAA4B,YACvC,qCAAS,SAAS,EAAC,6BAA6B,EAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,aACxE,qCAAS,SAAS,EAAC,oBAAoB,aACnC,iCAAK,SAAS,EAAC,mBAAmB,aAC9B,kCAAM,SAAS,EAAC,kBAAkB,aAC9B,iCAAM,SAAS,EAAC,+BAA+B,GAAG,OAAE,SAAS,IAC1D,EACP,kCAAM,SAAS,EAAC,mBAAmB,aAC9B,yBAAyB,IAAI,CAC1B,iCAAM,SAAS,EAAC,8BAA8B,EAAC,KAAK,EAAE,UAAG,CAAC,QAAQ,CAC9D,iEAAiE,EACjE,yBAAyB,CAC5B,YACG,iCAAM,SAAS,EAAC,yBAAyB,GAAQ,GAC9C,CACV,EACD,iCAAM,SAAS,EAAE,WAAW,UAAU,yBAAyB,GAAS,EACxE,iCAAM,SAAS,EAAC,wBAAwB,YAAE,UAAU,GAAQ,IACzD,EACP,iCAAM,SAAS,EAAE,0BAA0B,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,GAAI,IACpE,EACL,yBAAyB,IAAI,CAC1B,gCAAK,SAAS,EAAC,kCAAkC,YAC5C,mBAAmB,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,CAC7C,IAAI,CAAC,6BAA6B,CAAC,WAAW,EAAE,EAAE,CAAC,CACtD,GACC,CACT,IACK,EACV,iCAAK,SAAS,EAAC,oBAAoB,aAC/B,iCAAK,SAAS,EAAC,2BAA2B,aACtC,6CAAS,UAAG,CAAC,QAAQ,CAAC,4DAA4D,EAAE,mBAAmB,CAAC,GAAU,EAClH,gCAAK,SAAS,EAAC,mBAAmB,YAAE,MAAM,GAAO,IAC/C,EACN,iCAAK,SAAS,EAAC,6BAA6B,aACxC,6CAAS,UAAG,CAAC,QAAQ,CAAC,8DAA8D,EAAE,WAAW,CAAC,GAAU,EAC5G,gCAAK,SAAS,EAAC,iCAAiC,YAC3C,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;4CAC3E,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gDACjB,iCAAM,SAAS,EAAC,wBAAwB,YACnC,UAAG,CAAC,QAAQ,CAAC,oEAAoE,EAC9E,+CAA+C,CAAC,GACjD,CAAC,CAAC;gDACT,gCAAK,SAAS,EAAC,6BAA6B,YACvC,UAAG,CAAC,QAAQ,CAAC,wDAAwD,EAAE,wBAAwB,CAAC,GAC/F,GAEZ,IACJ,IACJ,IACA,GACR,CACT,CAAC;IACN,CAAC;CACJ;AAED,MAAM,6BAA6B,GAAG,IAAA,4CAAwB,EAAC,aAAa,CAAC,CAAC;AAE9E,SAAS,iBAAiB,CAAC,QAA2B,EAAE,UAAwB;IAC5E,OAAO;QACH,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,MAAM,EAAE,UAA0C;QAClD,QAAQ;QACR,SAAS,EAAE,UAAU,CAAC,SAAS;KAClC,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"delegation-tool-renderer.js","sourceRoot":"","sources":["../../../src/browser/chat-response-renderer/delegation-tool-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;AAEhF,4DAAyE;AACzE,4CAAgJ;AAChJ,qFAAgF;AAChF,4GAAmG;AACnG,oHAA8G;AAC9G,6EAAwF;AACxF,4CAAwD;AACxD,4FAAuF;AACvF,gFAA0E;AAE1E,uEAAyE;AACzE,2DAAgG;AAChG,4GAGsD;AACtD,qDAA0D;AAC1D,qDAAsI;AACtI,sCAA8E;AAC9E,kDAAkD;AAG3C,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAmC/B,SAAS,CAAC,QAA6B;QACnC,IAAI,qCAA2B,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,KAAK,6CAA4B,EAAE,CAAC;YAC7F,OAAO,EAAE,CAAC;QACd,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;IACd,CAAC;IAED,MAAM,CAAC,QAAqC,EAAE,UAAwB;QAClE,MAAM,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEjG,IAAI,SAAS,GAAG,QAAQ,CAAC,IAAI,IAAI,6CAA4B,CAAC;QAC9D,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACrB,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBAC5C,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACnC,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC;gBACnF,CAAC;gBACD,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAClC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBACzB,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,MAAM,cAAc,GAAG,IAAA,uCAAsB,EAAC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;gBAC7E,IAAI,cAAc,EAAE,CAAC;oBACjB,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,IAAI,IAAI,cAAc,CAAC;gBACvF,CAAC;gBACD,MAAM,aAAa,GAAG,IAAA,uCAAsB,EAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAC3E,IAAI,aAAa,EAAE,CAAC;oBAChB,MAAM,GAAG,aAAa,CAAC;gBAC3B,CAAC;YACL,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAAC,6CAA4B,CAAC,CAAC;QAC1F,MAAM,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,6CAA4B,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAE7H,OAAO,uBAAC,6BAA6B,IACjC,UAAU,EAAE,UAAU,EAAE,UAAU,EAClC,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI,MAAM,EACpC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAC3B,UAAU,EAAE,UAAU,EACtB,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,EAC/C,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,EAC7C,yBAAyB,EAAE,IAAI,CAAC,yBAAyB,EACzD,gBAAgB,EAAE;gBACd,QAAQ;gBACR,gBAAgB;gBAChB,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;gBACrD,WAAW;gBACX,MAAM;gBACN,eAAe,EAAE,UAAU,CAAC,QAAQ,CAAC,UAAU;gBAC/C,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;gBAC7C,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,cAAc,EAAE,IAAI,CAAC,8BAA8B;gBACnD,eAAe,EAAE,IAAI,CAAC,kBAAkB,EAAE;gBAC1C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;aAC1C,GACH,CAAC;IACP,CAAC;IAES,kBAAkB;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,oFAAwC,CAAC,EAAE,CAAC,CAAC;QACjF,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,iFAAqC,CAAC,EAAE,CAAC,CAAC;QAC7E,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAES,gBAAgB,CAAC,SAAiB;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,OAAO,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9E,CAAC;CACJ,CAAA;AA9GY,wDAAsB;AAGrB;IADT,IAAA,kBAAM,EAAC,2CAAmB,CAAC;sCACG,2CAAmB;mEAAC;AAGhC;IADlB,IAAA,kBAAM,EAAC,qCAAgB,CAAC;;gEAC6B;AAG5C;IADT,IAAA,kBAAM,EAAC,sCAAoB,CAAC;;oEACwB;AAG3C;IADT,IAAA,kBAAM,EAAC,uDAAuB,CAAC;sCACG,uDAAuB;uEAAC;AAGjD;IADT,IAAA,kBAAM,EAAC,gCAAsB,CAAC;;sEAC0B;AAG/C;IADT,IAAA,kBAAM,EAAC,6BAAmB,CAAC;sCACG,6BAAmB;mEAAC;AAGzC;IADT,IAAA,kBAAM,EAAC,uBAAa,CAAC;;6DACiB;AAG7B;IADT,IAAA,kBAAM,EAAC,kEAA8B,CAAC;sCACG,kEAA8B;8EAAC;AAG/D;IADT,IAAA,kBAAM,EAAC,4BAAkB,CAAC;sCACG,4BAAkB;kEAAC;AAGvC;IADT,IAAA,kBAAM,EAAC,0BAAgB,CAAC;;gEACoB;AAGnC;IADT,IAAA,kBAAM,EAAC,2BAAoB,CAAC;IAAE,IAAA,iBAAK,EAAC,sDAAwB,CAAC;;yEAC2C;iCAjChG,sBAAsB;IADlC,IAAA,sBAAU,GAAE;GACA,sBAAsB,CA8GlC;AAkBD,MAAM,aAAc,SAAQ,KAAK,CAAC,SAAiD;IAK/E,YAAY,KAAyB;QACjC,KAAK,CAAC,KAAK,CAAC,CAAC;QAJT,cAAS,GAAG,IAAI,2BAAoB,EAAE,CAAC;QACvC,cAAS,GAAG,KAAK,CAAC;QAoFlB,iBAAY,GAAG,CAAC,KAA+C,EAAQ,EAAE;YAC7E,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC;YACpC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC,CAAC;QAEF;;;;;;WAMG;QACK,yBAAoB,GAAG,CAAC,KAAuB,EAAQ,EAAE;YAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,YAAY,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YAC9E,MAAM,cAAc,GAAG,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,cAAc,IAAI,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBACjE,OAAO;YACX,CAAC;YACD,KAAK,CAAC,cAAc,EAAE,CAAC;QAC3B,CAAC,CAAC;QAnGE,IAAI,CAAC,KAAK,GAAG;YACT,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,KAAK;SAChB,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,oBAAoB,EAAE,CAAC;IAC/C,CAAC;IAEQ,iBAAiB;QACtB,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC;IAEQ,kBAAkB,CAAC,SAA6B;QACrD,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;YAC1E,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;IAEO,qBAAqB,CAAC,UAAkC;QAC5D,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,2BAAoB,EAAE,CAAC;QAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,OAAO;QACX,CAAC;QAED,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACxC,yEAAyE;YACzE,yEAAyE;YACzE,yEAAyE;YACzE,IAAI,IAAI,CAAC,SAAS,IAAI,UAAU,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;gBACzD,OAAO;YACX,CAAC;YACD,MAAM,IAAI,GAAG,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACjE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;YAExB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACrE,yEAAyE;YACzE,uEAAuE;YACvE,2DAA2D;YAC3D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,KAAK,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,EAAE;YACnC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBAClB,IAAI,CAAC,WAAW,EAAE,CAAC;YACvB,CAAC;QACL,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;YACb,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;YACrE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBAClB,IAAI,CAAC,WAAW,EAAE,CAAC;YACvB,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAEQ,oBAAoB;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACK,wBAAwB,CAAC,WAAgC;QAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,gBAAgB,EAAE;aACzD,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;aAC/C,MAAM,CACH,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YACd,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC5C,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC3B,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,EACD,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAuBO,yBAAyB,CAAC,mBAA4E;QAC1G,+EAA+E;QAC/E,0EAA0E;QAC1E,gFAAgF;QAChF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC1C,OAAO,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;YACzC,MAAM,OAAO,GAAG,WAAW,CAAC,aAAa,IAAI,aAAa,CAAC;YAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC,6BAA6B,CAAC,WAAW,EAAE,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,UAAU,EAAE,CAAC,CAAC;QACpH,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,6BAA6B,CAAC,WAAqD,EAAE,GAAW;QACpG,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAI,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC9B,OAAO,CACH,uBAAC,KAAK,CAAC,QAAQ,cACV,QAAQ,CAAC,kBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAD1C,GAAG,CAEP,CACpB,CAAC;QACN,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAEQ,MAAM;QACX,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QACzC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAClC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,IAAI,KAAK,CAAC;QACjE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,UAAU,IAAI,KAAK,CAAC;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,OAAO,IAAI,KAAK,CAAC;QAC3D,yEAAyE;QACzE,4EAA4E;QAC5E,0EAA0E;QAC1E,uEAAuE;QACvE,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,mBAAmB,IAAI,EAAE,CAAC;QAChF,MAAM,iBAAiB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,iBAAiB,IAAI,KAAK,CAAC,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;QAEnH,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,OAAO,EAAE,CAAC;YACV,IAAI,UAAU,EAAE,CAAC;gBACb,UAAU,GAAG,eAAe,CAAC;gBAC7B,UAAU,GAAG,UAAG,CAAC,QAAQ,CAAC,+DAA+D,EAAE,UAAU,CAAC,CAAC;YAC3G,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC;gBACjB,mEAAmE;gBACnE,UAAU,GAAG,eAAe,CAAC;gBAC7B,UAAU,GAAG,UAAG,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAChD,CAAC;iBAAM,IAAI,UAAU,EAAE,CAAC;gBACpB,UAAU,GAAG,eAAe,CAAC;gBAC7B,UAAU,GAAG,UAAG,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACpD,CAAC;iBAAM,IAAI,iBAAiB,EAAE,CAAC;gBAC3B,UAAU,GAAG,iBAAiB,CAAC;gBAC/B,UAAU,GAAG,UAAG,CAAC,QAAQ,CAAC,sEAAsE,EAAE,mBAAmB,CAAC,CAAC;YAC3H,CAAC;iBAAM,CAAC;gBACJ,UAAU,GAAG,iBAAiB,CAAC;gBAC/B,UAAU,GAAG,UAAG,CAAC,QAAQ,CAAC,iEAAiE,EAAE,eAAe,CAAC,CAAC;YAClH,CAAC;QACL,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7B,UAAU,GAAG,eAAe,CAAC;YAC7B,UAAU,GAAG,UAAG,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACJ,UAAU,GAAG,iBAAiB,CAAC;YAC/B,UAAU,GAAG,UAAG,CAAC,QAAQ,CAAC,+DAA+D,EAAE,aAAa,CAAC,CAAC;QAC9G,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC9B,MAAM,yBAAyB,GAAG,CAAC,MAAM,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;QAE5E,OAAO,CACH,gCAAK,SAAS,EAAC,4BAA4B,YACvC,qCAAS,SAAS,EAAC,6BAA6B,EAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,aACxE,qCAAS,SAAS,EAAC,oBAAoB,aACnC,iCAAK,SAAS,EAAC,mBAAmB,aAC9B,kCAAM,SAAS,EAAC,kBAAkB,aAC9B,iCAAM,SAAS,EAAC,+BAA+B,GAAG,OAAE,SAAS,IAC1D,EACP,kCAAM,SAAS,EAAC,mBAAmB,aAC9B,yBAAyB,IAAI,CAC1B,iCAAM,SAAS,EAAC,8BAA8B,EAAC,KAAK,EAAE,UAAG,CAAC,QAAQ,CAC9D,iEAAiE,EACjE,yBAAyB,CAC5B,YACG,iCAAM,SAAS,EAAC,yBAAyB,GAAQ,GAC9C,CACV,EACD,iCAAM,SAAS,EAAE,WAAW,UAAU,yBAAyB,GAAS,EACxE,iCAAM,SAAS,EAAC,wBAAwB,YAAE,UAAU,GAAQ,IACzD,EACP,iCAAM,SAAS,EAAE,0BAA0B,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,GAAI,IACpE,EACL,yBAAyB,IAAI,CAC1B,gCAAK,SAAS,EAAC,kCAAkC,EAAC,OAAO,EAAE,IAAI,CAAC,oBAAoB,YAC/E,IAAI,CAAC,yBAAyB,CAAC,mBAAmB,CAAC,GAClD,CACT,IACK,EACV,iCAAK,SAAS,EAAC,oBAAoB,aAC/B,iCAAK,SAAS,EAAC,2BAA2B,aACtC,6CAAS,UAAG,CAAC,QAAQ,CAAC,4DAA4D,EAAE,mBAAmB,CAAC,GAAU,EAClH,gCAAK,SAAS,EAAC,mBAAmB,YAAE,MAAM,GAAO,IAC/C,EACN,iCAAK,SAAS,EAAC,6BAA6B,aACxC,6CAAS,UAAG,CAAC,QAAQ,CAAC,8DAA8D,EAAE,WAAW,CAAC,GAAU,EAC5G,gCAAK,SAAS,EAAC,iCAAiC,YAC3C,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;4CAC3E,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gDACjB,iCAAM,SAAS,EAAC,wBAAwB,YACnC,UAAG,CAAC,QAAQ,CAAC,oEAAoE,EAC9E,+CAA+C,CAAC,GACjD,CAAC,CAAC;gDACT,gCAAK,SAAS,EAAC,6BAA6B,YACvC,UAAG,CAAC,QAAQ,CAAC,wDAAwD,EAAE,wBAAwB,CAAC,GAC/F,GAEZ,IACJ,IACJ,IACA,GACR,CACT,CAAC;IACN,CAAC;CACJ;AAED,MAAM,6BAA6B,GAAG,IAAA,4CAAwB,EAAC,aAAa,CAAC,CAAC;AAE9E,SAAS,iBAAiB,CAAC,QAA2B,EAAE,UAAwB;IAC5E,OAAO;QACH,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,MAAM,EAAE,UAA0C;QAClD,QAAQ;QACR,SAAS,EAAE,UAAU,CAAC,SAAS;KAClC,CAAC;AACN,CAAC"}
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@theia/ai-chat-ui",
3
- "version": "1.76.0-next.23+0b5a5f271",
3
+ "version": "1.76.0-next.28+98d1a268f",
4
4
  "description": "Theia - AI Chat UI Extension",
5
5
  "dependencies": {
6
- "@theia/ai-chat": "1.76.0-next.23+0b5a5f271",
7
- "@theia/ai-core": "1.76.0-next.23+0b5a5f271",
8
- "@theia/core": "1.76.0-next.23+0b5a5f271",
9
- "@theia/editor": "1.76.0-next.23+0b5a5f271",
10
- "@theia/editor-preview": "1.76.0-next.23+0b5a5f271",
11
- "@theia/filesystem": "1.76.0-next.23+0b5a5f271",
12
- "@theia/monaco": "1.76.0-next.23+0b5a5f271",
6
+ "@theia/ai-chat": "1.76.0-next.28+98d1a268f",
7
+ "@theia/ai-core": "1.76.0-next.28+98d1a268f",
8
+ "@theia/core": "1.76.0-next.28+98d1a268f",
9
+ "@theia/editor": "1.76.0-next.28+98d1a268f",
10
+ "@theia/editor-preview": "1.76.0-next.28+98d1a268f",
11
+ "@theia/filesystem": "1.76.0-next.28+98d1a268f",
12
+ "@theia/monaco": "1.76.0-next.28+98d1a268f",
13
13
  "@theia/monaco-editor-core": "1.108.201",
14
- "@theia/preferences": "1.76.0-next.23+0b5a5f271",
15
- "@theia/workspace": "1.76.0-next.23+0b5a5f271",
14
+ "@theia/preferences": "1.76.0-next.28+98d1a268f",
15
+ "@theia/workspace": "1.76.0-next.28+98d1a268f",
16
16
  "date-fns": "^4.4.0",
17
- "mermaid": "^11.16.1",
17
+ "mermaid": "^11.17.2",
18
18
  "tslib": "^2.8.1"
19
19
  },
20
20
  "publishConfig": {
@@ -56,5 +56,5 @@
56
56
  "nyc": {
57
57
  "extends": "../../configs/nyc.json"
58
58
  },
59
- "gitHead": "0b5a5f27164581ca47b8d7c08eaf690ac23d932f"
59
+ "gitHead": "98d1a268f03bc1a6709b0fbf6842c54c2ee13ccb"
60
60
  }
@@ -148,11 +148,6 @@ export class DelegationToolRenderer implements ChatResponsePartRenderer<ToolCall
148
148
  }
149
149
  }
150
150
 
151
- interface PendingInteraction {
152
- contentPart: InteractiveContent & ChatResponseContent;
153
- id: string;
154
- }
155
-
156
151
  interface DelegatedChatProps {
157
152
  invocation?: ChatRequestInvocation;
158
153
  agentName: string;
@@ -167,20 +162,18 @@ interface DelegatedChatProps {
167
162
  interface DelegatedChatState {
168
163
  node?: ResponseNode;
169
164
  isOpen: boolean;
170
- pendingInteractions: PendingInteraction[];
171
165
  }
172
166
 
173
167
  class DelegatedChat extends React.Component<DelegatedChatProps, DelegatedChatState> {
174
168
  private widget: ReturnType<SubChatWidgetFactory>;
175
169
  private toDispose = new DisposableCollection();
176
- private trackedInteractionIds = new Set<string>();
170
+ private unmounted = false;
177
171
 
178
172
  constructor(props: DelegatedChatProps) {
179
173
  super(props);
180
174
  this.state = {
181
175
  node: undefined,
182
- isOpen: false,
183
- pendingInteractions: []
176
+ isOpen: false
184
177
  };
185
178
  this.widget = props.subChatWidgetFactory();
186
179
  }
@@ -198,72 +191,64 @@ class DelegatedChat extends React.Component<DelegatedChatProps, DelegatedChatSta
198
191
  private subscribeToInvocation(invocation?: ChatRequestInvocation): void {
199
192
  this.toDispose.dispose();
200
193
  this.toDispose = new DisposableCollection();
201
- this.trackedInteractionIds.clear();
202
194
  if (!invocation) {
203
195
  return;
204
196
  }
205
197
 
206
198
  invocation.responseCreated.then(chatModel => {
199
+ // Guard against continuations of a superseded invocation or an unmounted
200
+ // component: they would show the old model's node and register listeners
201
+ // into an already-disposed collection (which silently keeps them alive).
202
+ if (this.unmounted || invocation !== this.props.invocation) {
203
+ return;
204
+ }
207
205
  const node = mapResponseToNode(chatModel, this.props.parentNode);
208
206
  this.setState({ node });
209
207
 
210
- const changeListener = () => {
211
- this.removeResolvedInteractions();
212
- this.forceUpdate();
213
- };
214
- this.toDispose.push(chatModel.onDidChange(changeListener));
215
-
216
- // Subscribe to interactionNeeded for push-based interaction tracking
217
- this.toDispose.push(chatModel.onInteractionNeeded(contentPart => {
218
- const id = contentPart.interactionId;
219
- if (id && !this.trackedInteractionIds.has(id)
220
- && this.findConfirmationRenderer(contentPart)) {
221
- this.trackedInteractionIds.add(id);
222
- this.setState(prevState => ({
223
- pendingInteractions: [
224
- ...prevState.pendingInteractions,
225
- { contentPart, id }
226
- ]
227
- }));
228
- }
229
- }));
208
+ this.toDispose.push(chatModel.onDidChange(() => this.forceUpdate()));
209
+ // Pending interactions are derived from chatModel.pendingInteractions in
210
+ // render(); interactionNeeded does not imply onDidChange, so re-render
211
+ // explicitly when a new interaction is announced (#17952).
212
+ this.toDispose.push(chatModel.onInteractionNeeded(() => this.forceUpdate()));
230
213
  }).catch(error => {
231
214
  console.error('Failed to create delegated chat response:', error);
232
215
  });
233
216
 
234
217
  invocation.responseCompleted.then(() => {
235
- this.forceUpdate();
218
+ if (!this.unmounted) {
219
+ this.forceUpdate();
220
+ }
236
221
  }).catch(error => {
237
222
  console.error('Error in delegated chat response completion:', error);
238
- this.forceUpdate();
223
+ if (!this.unmounted) {
224
+ this.forceUpdate();
225
+ }
239
226
  });
240
227
  }
241
228
 
242
229
  override componentWillUnmount(): void {
230
+ this.unmounted = true;
243
231
  this.toDispose.dispose();
244
- this.trackedInteractionIds.clear();
245
- }
246
-
247
- private removeResolvedInteractions(): void {
248
- this.setState(prevState => ({
249
- pendingInteractions: prevState.pendingInteractions.filter(p => !p.contentPart.isResolved)
250
- }));
251
232
  }
252
233
 
234
+ /**
235
+ * The highest-priority renderer that implements renderConfirmation. Unlike plain
236
+ * rendering, this must not stop at the overall highest-priority renderer: a
237
+ * specialized renderer without renderConfirmation (e.g. the delegation renderer
238
+ * itself for nested delegations) would otherwise silently drop the interaction.
239
+ */
253
240
  private findConfirmationRenderer(contentPart: ChatResponseContent): ChatResponsePartRenderer<ChatResponseContent> | undefined {
254
- const renderer = this.props.chatResponsePartRenderers.getContributions().reduce<[number, ChatResponsePartRenderer<ChatResponseContent> | undefined]>(
255
- (prev, current) => {
256
- const prio = current.canHandle(contentPart);
257
- if (prio > prev[0]) {
258
- return [prio, current];
259
- }
260
- return prev;
261
- },
262
- [-1, undefined])[1];
263
- if (renderer && renderer.renderConfirmation) {
264
- return renderer;
265
- }
266
- return undefined;
241
+ return this.props.chatResponsePartRenderers.getContributions()
242
+ .filter(renderer => renderer.renderConfirmation)
243
+ .reduce<[number, ChatResponsePartRenderer<ChatResponseContent> | undefined]>(
244
+ (prev, current) => {
245
+ const prio = current.canHandle(contentPart);
246
+ if (prio > prev[0]) {
247
+ return [prio, current];
248
+ }
249
+ return prev;
250
+ },
251
+ [-1, undefined])[1];
267
252
  }
268
253
 
269
254
  private handleToggle = (event: React.SyntheticEvent<HTMLDetailsElement>): void => {
@@ -271,10 +256,43 @@ class DelegatedChat extends React.Component<DelegatedChatProps, DelegatedChatSta
271
256
  this.setState({ isOpen: details.open });
272
257
  };
273
258
 
274
- private renderInteractionConfirmation(contentPart: ChatResponseContent, id: string): React.ReactNode {
259
+ /**
260
+ * Clicking anywhere inside a <summary> toggles the <details> element by default,
261
+ * which would collapse/expand the block while the user operates the inline
262
+ * interaction UI. Suppress the toggle for such clicks — but keep nested
263
+ * <summary> elements working (e.g. the argument expanders of a confirmation
264
+ * card), whose own toggle is also the click's default action.
265
+ */
266
+ private preventSummaryToggle = (event: React.MouseEvent): void => {
267
+ const target = event.target instanceof HTMLElement ? event.target : undefined;
268
+ const closestSummary = target?.closest('summary');
269
+ if (closestSummary && event.currentTarget.contains(closestSummary)) {
270
+ return;
271
+ }
272
+ event.preventDefault();
273
+ };
274
+
275
+ private renderPendingInteractions(pendingInteractions: ReadonlyArray<InteractiveContent & ChatResponseContent>): React.ReactNode[] {
276
+ // Key by interactionId so a sibling interaction resolving does not remount the
277
+ // remaining ones (losing in-progress wizard state); disambiguate the rare
278
+ // duplicate ids (e.g. two pending questions with identical text) by occurrence.
279
+ const seenIds = new Map<string, number>();
280
+ return pendingInteractions.map(contentPart => {
281
+ const baseKey = contentPart.interactionId ?? 'interaction';
282
+ const occurrence = seenIds.get(baseKey) ?? 0;
283
+ seenIds.set(baseKey, occurrence + 1);
284
+ return this.renderInteractionConfirmation(contentPart, occurrence === 0 ? baseKey : `${baseKey}-${occurrence}`);
285
+ });
286
+ }
287
+
288
+ private renderInteractionConfirmation(contentPart: InteractiveContent & ChatResponseContent, key: string): React.ReactNode {
275
289
  const renderer = this.findConfirmationRenderer(contentPart);
276
290
  if (renderer && this.state.node) {
277
- return <React.Fragment key={id}>{renderer.renderConfirmation!(contentPart, this.state.node)}</React.Fragment>;
291
+ return (
292
+ <React.Fragment key={key}>
293
+ {renderer.renderConfirmation!(contentPart, this.state.node)}
294
+ </React.Fragment>
295
+ );
278
296
  }
279
297
  return undefined;
280
298
  }
@@ -285,6 +303,12 @@ class DelegatedChat extends React.Component<DelegatedChatProps, DelegatedChatSta
285
303
  const isComplete = this.state.node?.response.isComplete ?? false;
286
304
  const isCanceled = this.state.node?.response.isCanceled ?? false;
287
305
  const isError = this.state.node?.response.isError ?? false;
306
+ // Derived from the model on every render so pending interactions survive
307
+ // remounts and never outlive their resolution or the response (#17952). The
308
+ // list also covers interactions bubbled up from nested delegations, whose
309
+ // waiting state is not reflected in this response's isWaitingForInput.
310
+ const pendingInteractions = this.state.node?.response.pendingInteractions ?? [];
311
+ const isWaitingForInput = (this.state.node?.response.isWaitingForInput ?? false) || pendingInteractions.length > 0;
288
312
 
289
313
  let statusIcon = '';
290
314
  let statusText = '';
@@ -292,12 +316,16 @@ class DelegatedChat extends React.Component<DelegatedChatProps, DelegatedChatSta
292
316
  if (isCanceled) {
293
317
  statusIcon = 'codicon-close';
294
318
  statusText = nls.localize('theia/ai/chat-ui/delegation-response-renderer/status/canceled', 'canceled');
295
- } else if (isComplete) {
296
- statusIcon = 'codicon-check';
297
- statusText = nls.localizeByDefault('completed');
298
319
  } else if (isError) {
320
+ // error() also marks the response complete, so check isError first
299
321
  statusIcon = 'codicon-error';
300
322
  statusText = nls.localizeByDefault('error');
323
+ } else if (isComplete) {
324
+ statusIcon = 'codicon-check';
325
+ statusText = nls.localizeByDefault('completed');
326
+ } else if (isWaitingForInput) {
327
+ statusIcon = 'codicon-loading';
328
+ statusText = nls.localize('theia/ai/chat-ui/delegation-response-renderer/status/waitingForInput', 'waiting for input');
301
329
  } else {
302
330
  statusIcon = 'codicon-loading';
303
331
  statusText = nls.localize('theia/ai/chat-ui/delegation-response-renderer/status/generating', 'generating...');
@@ -310,7 +338,7 @@ class DelegatedChat extends React.Component<DelegatedChatProps, DelegatedChatSta
310
338
  statusText = nls.localize('theia/ai/chat-ui/delegation-response-renderer/status/starting', 'starting...');
311
339
  }
312
340
 
313
- const { isOpen, pendingInteractions } = this.state;
341
+ const { isOpen } = this.state;
314
342
  const showInteractionsInSummary = !isOpen && pendingInteractions.length > 0;
315
343
 
316
344
  return (
@@ -336,10 +364,8 @@ class DelegatedChat extends React.Component<DelegatedChatProps, DelegatedChatSta
336
364
  <span className={`delegation-toggle-arrow${isOpen ? ' open' : ''}`} />
337
365
  </div>
338
366
  {showInteractionsInSummary && (
339
- <div className='delegation-pending-confirmations'>
340
- {pendingInteractions.map(({ contentPart, id }) =>
341
- this.renderInteractionConfirmation(contentPart, id)
342
- )}
367
+ <div className='delegation-pending-confirmations' onClick={this.preventSummaryToggle}>
368
+ {this.renderPendingInteractions(pendingInteractions)}
343
369
  </div>
344
370
  )}
345
371
  </summary>