@finos/legend-query-builder 4.19.4 → 4.19.6

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 (60) hide show
  1. package/lib/__lib__/QueryBuilderEvent.d.ts +2 -0
  2. package/lib/__lib__/QueryBuilderEvent.d.ts.map +1 -1
  3. package/lib/__lib__/QueryBuilderEvent.js +2 -0
  4. package/lib/__lib__/QueryBuilderEvent.js.map +1 -1
  5. package/lib/__lib__/QueryBuilderSetting.d.ts +2 -1
  6. package/lib/__lib__/QueryBuilderSetting.d.ts.map +1 -1
  7. package/lib/__lib__/QueryBuilderSetting.js +4 -0
  8. package/lib/__lib__/QueryBuilderSetting.js.map +1 -1
  9. package/lib/__lib__/QueryBuilderTelemetryHelper.d.ts +5 -1
  10. package/lib/__lib__/QueryBuilderTelemetryHelper.d.ts.map +1 -1
  11. package/lib/__lib__/QueryBuilderTelemetryHelper.js +8 -2
  12. package/lib/__lib__/QueryBuilderTelemetryHelper.js.map +1 -1
  13. package/lib/components/QueryAgentChat.d.ts +22 -0
  14. package/lib/components/QueryAgentChat.d.ts.map +1 -0
  15. package/lib/components/QueryAgentChat.js +26 -0
  16. package/lib/components/QueryAgentChat.js.map +1 -0
  17. package/lib/components/QueryBuilder.d.ts.map +1 -1
  18. package/lib/components/QueryBuilder.js +5 -2
  19. package/lib/components/QueryBuilder.js.map +1 -1
  20. package/lib/components/QueryBuilderUnsupportedQueryEditor.d.ts.map +1 -1
  21. package/lib/components/QueryBuilderUnsupportedQueryEditor.js +4 -1
  22. package/lib/components/QueryBuilderUnsupportedQueryEditor.js.map +1 -1
  23. package/lib/data-access-overview.css +1 -1
  24. package/lib/graph-manager/QueryBuilderConfig.d.ts +4 -0
  25. package/lib/graph-manager/QueryBuilderConfig.d.ts.map +1 -1
  26. package/lib/graph-manager/QueryBuilderConfig.js +5 -0
  27. package/lib/graph-manager/QueryBuilderConfig.js.map +1 -1
  28. package/lib/index.css +1 -1
  29. package/lib/index.d.ts +1 -0
  30. package/lib/index.d.ts.map +1 -1
  31. package/lib/index.js +1 -0
  32. package/lib/index.js.map +1 -1
  33. package/lib/package.json +1 -1
  34. package/lib/stores/QueryAgentChatState.d.ts +33 -0
  35. package/lib/stores/QueryAgentChatState.d.ts.map +1 -0
  36. package/lib/stores/QueryAgentChatState.js +34 -0
  37. package/lib/stores/QueryAgentChatState.js.map +1 -0
  38. package/lib/stores/QueryBuilderResultState.d.ts.map +1 -1
  39. package/lib/stores/QueryBuilderResultState.js +7 -2
  40. package/lib/stores/QueryBuilderResultState.js.map +1 -1
  41. package/lib/stores/QueryBuilderState.d.ts +12 -0
  42. package/lib/stores/QueryBuilderState.d.ts.map +1 -1
  43. package/lib/stores/QueryBuilderState.js +41 -0
  44. package/lib/stores/QueryBuilderState.js.map +1 -1
  45. package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts +20 -0
  46. package/lib/stores/QueryBuilder_LegendApplicationPlugin_Extension.d.ts.map +1 -1
  47. package/package.json +5 -5
  48. package/src/__lib__/QueryBuilderEvent.ts +2 -0
  49. package/src/__lib__/QueryBuilderSetting.ts +4 -0
  50. package/src/__lib__/QueryBuilderTelemetryHelper.ts +19 -2
  51. package/src/components/QueryAgentChat.tsx +38 -0
  52. package/src/components/QueryBuilder.tsx +14 -2
  53. package/src/components/QueryBuilderUnsupportedQueryEditor.tsx +10 -0
  54. package/src/graph-manager/QueryBuilderConfig.ts +6 -0
  55. package/src/index.ts +1 -0
  56. package/src/stores/QueryAgentChatState.ts +37 -0
  57. package/src/stores/QueryBuilderResultState.ts +14 -0
  58. package/src/stores/QueryBuilderState.ts +54 -0
  59. package/src/stores/QueryBuilder_LegendApplicationPlugin_Extension.ts +28 -0
  60. package/tsconfig.json +2 -0
@@ -38,8 +38,11 @@ type GraphFetchPanel_TelemtryData = {
38
38
  };
39
39
 
40
40
  export class QueryBuilderTelemetryHelper {
41
- static logEvent_QueryRunLaunched(service: TelemetryService): void {
42
- service.logEvent(QUERY_BUILDER_EVENT.RUN_QUERY__LAUNCH, {});
41
+ static logEvent_QueryRunLaunched(
42
+ service: TelemetryService,
43
+ data?: Record<string, unknown> | undefined,
44
+ ): void {
45
+ service.logEvent(QUERY_BUILDER_EVENT.RUN_QUERY__LAUNCH, data ?? {});
43
46
  }
44
47
 
45
48
  static logEvent_ExportQueryDataLaunched(service: TelemetryService): void {
@@ -67,6 +70,20 @@ export class QueryBuilderTelemetryHelper {
67
70
  service.logEvent(QUERY_BUILDER_EVENT.RUN_QUERY__SUCCESS, data);
68
71
  }
69
72
 
73
+ static logEvent_QueryRunFailed(
74
+ service: TelemetryService,
75
+ data: { errorMessage: string } & Record<string, unknown>,
76
+ ): void {
77
+ service.logEvent(QUERY_BUILDER_EVENT.RUN_QUERY__FAILURE, data);
78
+ }
79
+
80
+ static logEvent_QueryRunCancelled(
81
+ service: TelemetryService,
82
+ data?: Record<string, unknown> | undefined,
83
+ ): void {
84
+ service.logEvent(QUERY_BUILDER_EVENT.RUN_QUERY__CANCELLED, data ?? {});
85
+ }
86
+
70
87
  static logEvent_ExportQueryDataSucceeded(
71
88
  service: TelemetryService,
72
89
  data: QueryExecution_TelemetryData,
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ import { observer } from 'mobx-react-lite';
18
+ import { useApplicationStore } from '@finos/legend-application';
19
+ import type { QueryBuilder_LegendApplicationPlugin_Extension } from '../stores/QueryBuilder_LegendApplicationPlugin_Extension.js';
20
+ import type { QueryBuilderState } from '../stores/QueryBuilderState.js';
21
+
22
+ export const QueryAgentChat = observer(
23
+ (props: { queryBuilderState: QueryBuilderState }) => {
24
+ const { queryBuilderState } = props;
25
+ const applicationStore = useApplicationStore();
26
+
27
+ const extraQueryAgentChatConfigurations = applicationStore.pluginManager
28
+ .getApplicationPlugins()
29
+ .flatMap(
30
+ (plugin) =>
31
+ (
32
+ plugin as QueryBuilder_LegendApplicationPlugin_Extension
33
+ ).getExtraQueryAgentChatRenderers?.() ?? [],
34
+ );
35
+
36
+ return extraQueryAgentChatConfigurations[0]?.(queryBuilderState);
37
+ },
38
+ );
@@ -79,6 +79,7 @@ import { QueryBuilderConstantExpressionPanel } from './QueryBuilderConstantExpre
79
79
  import { QUERY_BUILDER_SETTING_KEY } from '../__lib__/QueryBuilderSetting.js';
80
80
  import { QUERY_BUILDER_COMPONENT_ELEMENT_ID } from './QueryBuilderComponentElement.js';
81
81
  import { DataAccessOverview } from './data-access/DataAccessOverview.js';
82
+ import { QueryAgentChat } from './QueryAgentChat.js';
82
83
  import { Fragment, useEffect, useRef } from 'react';
83
84
  import { RedoButton, UndoButton } from '@finos/legend-lego/application';
84
85
  import { FETCH_STRUCTURE_IMPLEMENTATION } from '../stores/fetch-structure/QueryBuilderFetchStructureImplementationState.js';
@@ -245,6 +246,9 @@ export const QueryBuilder = observer(
245
246
  const fetchStructureState = queryBuilderState.fetchStructureState;
246
247
  const isTDSState =
247
248
  fetchStructureState.implementation instanceof QueryBuilderTDSState;
249
+ const showQueryAgentChatPanel =
250
+ queryBuilderState.isAgentChatOpened &&
251
+ !queryBuilderState.config?.TEMPORARY__disableQueryBuilderAgentChat;
248
252
  const openLambdaEditor = (mode: QueryBuilderTextEditorMode): void =>
249
253
  queryBuilderState.textEditorState.openModal(mode);
250
254
  const openPure = (): void =>
@@ -1028,6 +1032,14 @@ export const QueryBuilder = observer(
1028
1032
  {renderPostFetchStructure()}
1029
1033
  </ResizablePanel>
1030
1034
  )}
1035
+ {showQueryAgentChatPanel && <ResizablePanelSplitter />}
1036
+ {showQueryAgentChatPanel && (
1037
+ <ResizablePanel size={450}>
1038
+ <QueryAgentChat
1039
+ queryBuilderState={queryBuilderState}
1040
+ />
1041
+ </ResizablePanel>
1042
+ )}
1031
1043
  </ResizablePanelGroup>
1032
1044
  ) : (
1033
1045
  <QueryBuilderUnsupportedQueryEditor
@@ -1114,9 +1126,9 @@ export const QueryBuilder = observer(
1114
1126
  />
1115
1127
  )}
1116
1128
  </div>
1117
- {queryBuilderState.workflowState.showStatusBar ? (
1129
+ {queryBuilderState.workflowState.showStatusBar && (
1118
1130
  <QueryBuilderStatusBar queryBuilderState={queryBuilderState} />
1119
- ) : null}
1131
+ )}
1120
1132
  </div>
1121
1133
  );
1122
1134
  },
@@ -28,6 +28,7 @@ import {
28
28
  } from '@finos/legend-art';
29
29
  import { QueryBuilderSidebar } from './QueryBuilderSideBar.js';
30
30
  import { QueryBuilderParametersPanel } from './QueryBuilderParametersPanel.js';
31
+ import { QueryAgentChat } from './QueryAgentChat.js';
31
32
 
32
33
  const QueryBuilderUnsupportedQueryViewer = observer(
33
34
  (props: { queryBuilderState: QueryBuilderState }) => {
@@ -65,6 +66,9 @@ const QueryBuilderUnsupportedQueryViewer = observer(
65
66
  export const QueryBuilderUnsupportedQueryEditor = observer(
66
67
  (props: { queryBuilderState: QueryBuilderState }) => {
67
68
  const { queryBuilderState } = props;
69
+ const showQueryAgentChatPanel =
70
+ queryBuilderState.isAgentChatOpened &&
71
+ !queryBuilderState.config?.TEMPORARY__disableQueryBuilderAgentChat;
68
72
 
69
73
  return (
70
74
  <ResizablePanelGroup orientation="vertical">
@@ -81,6 +85,12 @@ export const QueryBuilderUnsupportedQueryEditor = observer(
81
85
  queryBuilderState={queryBuilderState}
82
86
  />
83
87
  </ResizablePanel>
88
+ {showQueryAgentChatPanel && <ResizablePanelSplitter />}
89
+ {showQueryAgentChatPanel && (
90
+ <ResizablePanel size={450}>
91
+ <QueryAgentChat queryBuilderState={queryBuilderState} />
92
+ </ResizablePanel>
93
+ )}
84
94
  </ResizablePanelGroup>
85
95
  );
86
96
  },
@@ -23,6 +23,11 @@ export class QueryBuilderConfig {
23
23
  */
24
24
  TEMPORARY__enableExportToCube = false;
25
25
 
26
+ /**
27
+ * This flag is to disable the Query Builder AI Agent chat panel toggle.
28
+ */
29
+ TEMPORARY__disableQueryBuilderAgentChat = false;
30
+
26
31
  /**
27
32
  * This flag is to enable AG-GRID enterprise mode
28
33
  */
@@ -50,6 +55,7 @@ export class QueryBuilderConfig {
50
55
 
51
56
  static readonly serialization = new SerializationFactory(
52
57
  createModelSchema(QueryBuilderConfig, {
58
+ TEMPORARY__disableQueryBuilderAgentChat: optional(primitive()),
53
59
  TEMPORARY__enableExportToCube: optional(primitive()),
54
60
  TEMPORARY__enableGridEnterpriseMode: optional(primitive()),
55
61
  legendMCPServiceURL: optional(primitive()),
package/src/index.ts CHANGED
@@ -46,6 +46,7 @@ export {
46
46
  QueryBuilderExecutionContextState,
47
47
  QueryBuilderEmbeddedFromExecutionContextState,
48
48
  } from './stores/QueryBuilderExecutionContextState.js';
49
+ export { QueryAgentChatState } from './stores/QueryAgentChatState.js';
49
50
  export {
50
51
  getTDSColumnDerivedProperyFromType,
51
52
  buildTDSSortTypeExpression,
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Copyright (c) 2026-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ export abstract class QueryAgentChatState {
18
+ /**
19
+ * When set, the current lambda in the builder was produced by the Legend
20
+ * AI agent chat (via "Load query into builder") and this is the `trace_id`
21
+ * the agent surfaced in its response. Downstream telemetry providers can
22
+ * pick this up to correlate save / update / run events to the agent
23
+ * conversation that produced them. In-memory only; not persisted.
24
+ *
25
+ * NOTE: subclasses are responsible for registering this field as
26
+ * `observable` (and `setAgentChatTraceId` as `action`) in their own
27
+ * `makeObservable` call — mobx does not support multiple `makeObservable`
28
+ * invocations across an inheritance chain on the same instance.
29
+ */
30
+ agentChatTraceId?: string | undefined;
31
+
32
+ setAgentChatTraceId(val: string | undefined): void {
33
+ this.agentChatTraceId = val;
34
+ }
35
+
36
+ abstract abort(): void;
37
+ }
@@ -504,6 +504,7 @@ export class QueryBuilderResultState {
504
504
 
505
505
  QueryBuilderTelemetryHelper.logEvent_QueryRunLaunched(
506
506
  this.queryBuilderState.applicationStore.telemetryService,
507
+ this.queryBuilderState.getExtraTelemetryMetadata(),
507
508
  );
508
509
 
509
510
  const stopWatch = new StopWatch();
@@ -547,6 +548,7 @@ export class QueryBuilderResultState {
547
548
  {},
548
549
  report,
549
550
  this.queryBuilderState.getStateInfo(),
551
+ this.queryBuilderState.getExtraTelemetryMetadata(),
550
552
  );
551
553
  QueryBuilderTelemetryHelper.logEvent_QueryRunSucceeded(
552
554
  this.queryBuilderState.applicationStore.telemetryService,
@@ -567,6 +569,14 @@ export class QueryBuilderResultState {
567
569
  if (error instanceof ExecutionError && error.executionTraceId) {
568
570
  this.setExecutionTraceId(error.executionTraceId);
569
571
  }
572
+ QueryBuilderTelemetryHelper.logEvent_QueryRunFailed(
573
+ this.queryBuilderState.applicationStore.telemetryService,
574
+ {
575
+ errorMessage:
576
+ error instanceof Error ? error.message : String(error),
577
+ ...this.queryBuilderState.getExtraTelemetryMetadata(),
578
+ },
579
+ );
570
580
  }
571
581
  } finally {
572
582
  this.setIsRunningQuery(false);
@@ -582,6 +592,10 @@ export class QueryBuilderResultState {
582
592
  yield this.queryBuilderState.graphManagerState.graphManager.cancelUserExecutions(
583
593
  true,
584
594
  );
595
+ QueryBuilderTelemetryHelper.logEvent_QueryRunCancelled(
596
+ this.queryBuilderState.applicationStore.telemetryService,
597
+ this.queryBuilderState.getExtraTelemetryMetadata(),
598
+ );
585
599
  } catch (error) {
586
600
  // Don't notify users about success or failure
587
601
  this.queryBuilderState.applicationStore.logService.error(
@@ -115,8 +115,10 @@ import {
115
115
  } from './QueryBuilderExecutionContextState.js';
116
116
  import type { QueryBuilderConfig } from '../graph-manager/QueryBuilderConfig.js';
117
117
  import { QUERY_BUILDER_EVENT } from '../__lib__/QueryBuilderEvent.js';
118
+ import { QUERY_BUILDER_SETTING_KEY } from '../__lib__/QueryBuilderSetting.js';
118
119
  import { QueryBuilderChangeHistoryState } from './QueryBuilderChangeHistoryState.js';
119
120
  import { type QueryBuilderWorkflowState } from './query-workflow/QueryBuilderWorkFlowState.js';
121
+ import { type QueryAgentChatState } from './QueryAgentChatState.js';
120
122
  import type { QueryBuilder_LegendApplicationPlugin_Extension } from './QueryBuilder_LegendApplicationPlugin_Extension.js';
121
123
  import { createDataCubeViewerStateFromQueryBuilder } from './data-cube/QueryBuilderDataCubeHelper.js';
122
124
  import type { QueryBuilderDataCubeViewerState } from './data-cube/QueryBuilderDataCubeViewerState.js';
@@ -214,6 +216,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
214
216
  textEditorState: QueryBuilderTextEditorState;
215
217
  unsupportedQueryState: QueryBuilderUnsupportedQueryState;
216
218
  changeHistoryState: QueryBuilderChangeHistoryState;
219
+ isAgentChatOpened: boolean;
217
220
  showFunctionsExplorerPanel = false;
218
221
  showParametersPanel = false;
219
222
  isEditingWatermark = false;
@@ -230,6 +233,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
230
233
  QUERY_BUILDER_SUPPORTED_GET_ALL_FUNCTIONS.GET_ALL;
231
234
  executionContextState: QueryBuilderExecutionContextState;
232
235
  internalizeState?: QueryBuilderInternalizeState | undefined;
236
+ queryAgentChatState?: QueryAgentChatState | undefined;
233
237
 
234
238
  // NOTE: This property contains information about workflow used
235
239
  // to create this state. This should only be used to add additional
@@ -269,6 +273,8 @@ export abstract class QueryBuilderState implements CommandRegistrar {
269
273
  changeHistoryState: observable,
270
274
  executionContextState: observable,
271
275
  sourceElement: observable,
276
+ queryAgentChatState: observable,
277
+ isAgentChatOpened: observable,
272
278
  isLocalModeEnabled: observable,
273
279
  dataCubeViewerState: observable,
274
280
  getAllFunction: observable,
@@ -292,6 +298,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
292
298
  openDataCubeEngine: action,
293
299
  setIsCheckingEntitlments: action,
294
300
  setSourceElement: action,
301
+ setIsAgentChatOpened: action,
295
302
  setIsLocalModeEnabled: action,
296
303
  setGetAllFunction: action,
297
304
  setLambdaWriteMode: action,
@@ -304,6 +311,7 @@ export abstract class QueryBuilderState implements CommandRegistrar {
304
311
  changeMapping: action,
305
312
  changeRuntime: action,
306
313
  setExecutionContextState: action,
314
+ setQueryAgentChatState: action,
307
315
 
308
316
  rebuildWithQuery: action,
309
317
  compileQuery: flow,
@@ -335,6 +343,12 @@ export abstract class QueryBuilderState implements CommandRegistrar {
335
343
  this.config = config;
336
344
  this.workflowState = workflowState;
337
345
  this.sourceInfo = sourceInfo;
346
+ this.isAgentChatOpened =
347
+ (!this.config?.TEMPORARY__disableQueryBuilderAgentChat &&
348
+ this.applicationStore.settingService.getBooleanValue(
349
+ QUERY_BUILDER_SETTING_KEY.SHOW_QUERY_AGENT_CHAT_PANEL,
350
+ )) ??
351
+ false;
338
352
  }
339
353
 
340
354
  TEMPORARY_initializeExecContext(
@@ -457,6 +471,31 @@ export abstract class QueryBuilderState implements CommandRegistrar {
457
471
  }
458
472
  }
459
473
 
474
+ /**
475
+ * Aggregates extra telemetry metadata contributed by application plugins
476
+ * via `getExtraQueryBuilderTelemetryMetadataProviders`. Callers spread the
477
+ * result into their event payloads so telemetry helpers stay free of
478
+ * plugin-specific fields (e.g. agent chat trace ids).
479
+ */
480
+ getExtraTelemetryMetadata(): Record<string, unknown> {
481
+ const providers = this.applicationStore.pluginManager
482
+ .getApplicationPlugins()
483
+ .flatMap(
484
+ (plugin) =>
485
+ (
486
+ plugin as QueryBuilder_LegendApplicationPlugin_Extension
487
+ ).getExtraQueryBuilderTelemetryMetadataProviders?.() ?? [],
488
+ );
489
+ const metadata: Record<string, unknown> = {};
490
+ for (const provider of providers) {
491
+ const extra = provider(this);
492
+ if (extra) {
493
+ Object.assign(metadata, extra);
494
+ }
495
+ }
496
+ return metadata;
497
+ }
498
+
460
499
  /**
461
500
  * Gets information about the current queryBuilderState.
462
501
  * This information can be used as a part of analytics
@@ -482,6 +521,17 @@ export abstract class QueryBuilderState implements CommandRegistrar {
482
521
  return undefined;
483
522
  }
484
523
 
524
+ setIsAgentChatOpened(val: boolean): void {
525
+ if (val && this.config?.TEMPORARY__disableQueryBuilderAgentChat) {
526
+ return;
527
+ }
528
+ this.isAgentChatOpened = val;
529
+ this.applicationStore.settingService.persistValue(
530
+ QUERY_BUILDER_SETTING_KEY.SHOW_QUERY_AGENT_CHAT_PANEL,
531
+ val,
532
+ );
533
+ }
534
+
485
535
  setIsLocalModeEnabled(val: boolean): void {
486
536
  this.isLocalModeEnabled = val;
487
537
  }
@@ -496,6 +546,10 @@ export abstract class QueryBuilderState implements CommandRegistrar {
496
546
  this.internalizeState = val;
497
547
  }
498
548
 
549
+ setQueryAgentChatState(val: QueryAgentChatState | undefined): void {
550
+ this.queryAgentChatState = val;
551
+ }
552
+
499
553
  setShowFunctionsExplorerPanel(val: boolean): void {
500
554
  this.showFunctionsExplorerPanel = val;
501
555
  }
@@ -67,6 +67,10 @@ export type WarehouseEntitlementRender = {
67
67
  renderer: (dataAccessState: DataAccessState) => React.ReactNode;
68
68
  };
69
69
 
70
+ export type QueryAgentChatRenderer = (
71
+ queryBuilderState: QueryBuilderState,
72
+ ) => React.ReactNode;
73
+
70
74
  export type TemplateQueryPanelContentRenderer = (
71
75
  queryBuilderState: QueryBuilderState,
72
76
  ) => React.ReactNode;
@@ -97,6 +101,16 @@ export type QueryBuilderPropagateExecutionContextChangeHelper = (
97
101
  isGraphBuildingNotRequired?: boolean,
98
102
  ) => (() => Promise<void>) | undefined;
99
103
 
104
+ /**
105
+ * Contributes extra key/value pairs that should ride along with query-builder
106
+ * telemetry events (e.g. run query launch/success/failure, save query, ...).
107
+ * The returned bag is shallow-merged into the event payload by the caller;
108
+ * return `undefined` (or an empty object) to contribute nothing.
109
+ */
110
+ export type QueryBuilderTelemetryMetadataProvider = (
111
+ queryBuilderState: QueryBuilderState,
112
+ ) => Record<string, unknown> | undefined;
113
+
100
114
  export interface QueryBuilder_LegendApplicationPlugin_Extension
101
115
  extends LegendApplicationPlugin {
102
116
  /**
@@ -131,6 +145,11 @@ export interface QueryBuilder_LegendApplicationPlugin_Extension
131
145
  */
132
146
  getExtraQueryUsageConfigurations?(): QueryExportUsageConfiguration[];
133
147
 
148
+ /**
149
+ * Get the list of query AI agent chat configurations.
150
+ */
151
+ getExtraQueryAgentChatRenderers?(): QueryAgentChatRenderer[];
152
+
134
153
  /**
135
154
  * Get the list of template query panel content render
136
155
  */
@@ -160,4 +179,13 @@ export interface QueryBuilder_LegendApplicationPlugin_Extension
160
179
  * Get the list of Query Builder Propagate Execution Context Change Helper
161
180
  */
162
181
  getExtraQueryBuilderPropagateExecutionContextChangeHelper?(): QueryBuilderPropagateExecutionContextChangeHelper[];
182
+
183
+ /**
184
+ * Get the list of providers that contribute extra key/value metadata to
185
+ * query-builder telemetry event payloads (agent-chat trace ids, custom
186
+ * environment tags, ...). Callers spread the aggregated metadata into
187
+ * their own event payloads via
188
+ * `QueryBuilderState.getExtraTelemetryMetadata()`.
189
+ */
190
+ getExtraQueryBuilderTelemetryMetadataProviders?(): QueryBuilderTelemetryMetadataProvider[];
163
191
  }
package/tsconfig.json CHANGED
@@ -80,6 +80,7 @@
80
80
  "./src/graph-manager/protocol/pure/QueryBuilder_PureProtocolProcessorPlugin.ts",
81
81
  "./src/graph-manager/protocol/pure/v1/V1_QueryBuilder_PureGraphManagerExtension.ts",
82
82
  "./src/graph-manager/protocol/pure/v1/V1_QueryValueSpecificationBuilderHelper.ts",
83
+ "./src/stores/QueryAgentChatState.ts",
83
84
  "./src/stores/QueryBuilderChangeDetectionState.ts",
84
85
  "./src/stores/QueryBuilderChangeHistoryState.ts",
85
86
  "./src/stores/QueryBuilderCommand.ts",
@@ -230,6 +231,7 @@
230
231
  "./src/stores/workflows/accessor/AccessorQueryBuilderHelper.ts",
231
232
  "./src/stores/workflows/accessor/AccessorQueryBuilderState.ts",
232
233
  "./src/stores/workflows/dataProduct/DataProductQueryBuilderState.ts",
234
+ "./src/components/QueryAgentChat.tsx",
233
235
  "./src/components/QueryBuilder.tsx",
234
236
  "./src/components/QueryBuilderConstantExpressionPanel.tsx",
235
237
  "./src/components/QueryBuilderDiffPanel.tsx",