@finos/legend-lego 2.0.210 → 2.0.212

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 (74) hide show
  1. package/lib/index.css +2 -2
  2. package/lib/index.css.map +1 -1
  3. package/lib/legend-ai/LegendAIDocEnrichment.d.ts +12 -12
  4. package/lib/legend-ai/LegendAIDocEnrichment.d.ts.map +1 -1
  5. package/lib/legend-ai/LegendAIDocEnrichment.js +317 -86
  6. package/lib/legend-ai/LegendAIDocEnrichment.js.map +1 -1
  7. package/lib/legend-ai/LegendAIHostIntegration.d.ts +31 -0
  8. package/lib/legend-ai/LegendAIHostIntegration.d.ts.map +1 -0
  9. package/lib/legend-ai/LegendAIHostIntegration.js +50 -0
  10. package/lib/legend-ai/LegendAIHostIntegration.js.map +1 -0
  11. package/lib/legend-ai/LegendAIServiceRetrieval.d.ts.map +1 -1
  12. package/lib/legend-ai/LegendAIServiceRetrieval.js +34 -35
  13. package/lib/legend-ai/LegendAIServiceRetrieval.js.map +1 -1
  14. package/lib/legend-ai/LegendAITypes.d.ts +85 -7
  15. package/lib/legend-ai/LegendAITypes.d.ts.map +1 -1
  16. package/lib/legend-ai/LegendAITypes.js +99 -1
  17. package/lib/legend-ai/LegendAITypes.js.map +1 -1
  18. package/lib/legend-ai/LegendAI_LegendApplicationPlugin_Extension.d.ts +36 -3
  19. package/lib/legend-ai/LegendAI_LegendApplicationPlugin_Extension.d.ts.map +1 -1
  20. package/lib/legend-ai/LegendAI_LegendApplicationPlugin_Extension.js +29 -0
  21. package/lib/legend-ai/LegendAI_LegendApplicationPlugin_Extension.js.map +1 -1
  22. package/lib/legend-ai/__test-utils__/LegendAITestUtils.d.ts.map +1 -1
  23. package/lib/legend-ai/__test-utils__/LegendAITestUtils.js +7 -0
  24. package/lib/legend-ai/__test-utils__/LegendAITestUtils.js.map +1 -1
  25. package/lib/legend-ai/components/LegendAICharts.d.ts.map +1 -1
  26. package/lib/legend-ai/components/LegendAICharts.js +6 -10
  27. package/lib/legend-ai/components/LegendAICharts.js.map +1 -1
  28. package/lib/legend-ai/components/LegendAIChat.d.ts.map +1 -1
  29. package/lib/legend-ai/components/LegendAIChat.js +263 -41
  30. package/lib/legend-ai/components/LegendAIChat.js.map +1 -1
  31. package/lib/legend-ai/components/LegendAIChatInput.d.ts +1 -1
  32. package/lib/legend-ai/components/LegendAIChatInput.d.ts.map +1 -1
  33. package/lib/legend-ai/components/LegendAIChatInput.js +2 -1
  34. package/lib/legend-ai/components/LegendAIChatInput.js.map +1 -1
  35. package/lib/legend-ai/index.d.ts +5 -2
  36. package/lib/legend-ai/index.d.ts.map +1 -1
  37. package/lib/legend-ai/index.js +5 -2
  38. package/lib/legend-ai/index.js.map +1 -1
  39. package/lib/legend-ai/stores/LegendAIChatProcessors.d.ts +9 -3
  40. package/lib/legend-ai/stores/LegendAIChatProcessors.d.ts.map +1 -1
  41. package/lib/legend-ai/stores/LegendAIChatProcessors.js +794 -220
  42. package/lib/legend-ai/stores/LegendAIChatProcessors.js.map +1 -1
  43. package/lib/legend-ai/stores/LegendAIChatState.d.ts.map +1 -1
  44. package/lib/legend-ai/stores/LegendAIChatState.js +47 -21
  45. package/lib/legend-ai/stores/LegendAIChatState.js.map +1 -1
  46. package/lib/legend-ai/stores/LegendAIJoinAnalysis.d.ts +29 -0
  47. package/lib/legend-ai/stores/LegendAIJoinAnalysis.d.ts.map +1 -0
  48. package/lib/legend-ai/stores/LegendAIJoinAnalysis.js +124 -0
  49. package/lib/legend-ai/stores/LegendAIJoinAnalysis.js.map +1 -0
  50. package/lib/legend-ai/stores/LegendAISqlHelpers.d.ts +25 -0
  51. package/lib/legend-ai/stores/LegendAISqlHelpers.d.ts.map +1 -0
  52. package/lib/legend-ai/stores/LegendAISqlHelpers.js +64 -0
  53. package/lib/legend-ai/stores/LegendAISqlHelpers.js.map +1 -0
  54. package/lib/legend-ai/stores/LegendAISqlJoinSanitizers.d.ts +22 -0
  55. package/lib/legend-ai/stores/LegendAISqlJoinSanitizers.d.ts.map +1 -0
  56. package/lib/legend-ai/stores/LegendAISqlJoinSanitizers.js +411 -0
  57. package/lib/legend-ai/stores/LegendAISqlJoinSanitizers.js.map +1 -0
  58. package/package.json +6 -6
  59. package/src/legend-ai/LegendAIDocEnrichment.ts +435 -97
  60. package/src/legend-ai/LegendAIHostIntegration.tsx +80 -0
  61. package/src/legend-ai/LegendAIServiceRetrieval.ts +50 -35
  62. package/src/legend-ai/LegendAITypes.ts +169 -5
  63. package/src/legend-ai/LegendAI_LegendApplicationPlugin_Extension.ts +73 -1
  64. package/src/legend-ai/__test-utils__/LegendAITestUtils.ts +10 -0
  65. package/src/legend-ai/components/LegendAICharts.tsx +30 -33
  66. package/src/legend-ai/components/LegendAIChat.tsx +555 -91
  67. package/src/legend-ai/components/LegendAIChatInput.tsx +6 -2
  68. package/src/legend-ai/index.ts +22 -3
  69. package/src/legend-ai/stores/LegendAIChatProcessors.ts +1286 -322
  70. package/src/legend-ai/stores/LegendAIChatState.ts +73 -28
  71. package/src/legend-ai/stores/LegendAIJoinAnalysis.ts +165 -0
  72. package/src/legend-ai/stores/LegendAISqlHelpers.ts +82 -0
  73. package/src/legend-ai/stores/LegendAISqlJoinSanitizers.ts +515 -0
  74. package/tsconfig.json +4 -0
@@ -47,6 +47,7 @@ export const TEST__makeAssistantMessage = (overrides) => ({
47
47
  suggestedQueries: [],
48
48
  fallbackAction: null,
49
49
  queriedAccessPointGroups: [],
50
+ queriedAccessPoints: [],
50
51
  ...overrides,
51
52
  });
52
53
  export const TEST__seedAssistant = (setter) => {
@@ -105,6 +106,8 @@ export const TEST__createMockLegendAIPlugin = (overrides) => ({
105
106
  preWarmSchemaAnalysis: () => {
106
107
  /* no-op in test */
107
108
  },
109
+ enrichAccessPointSampleValues: () => Promise.resolve(),
110
+ buildNoResultsFallback: () => Promise.resolve(undefined),
108
111
  callLLM: createMock(),
109
112
  executeSql: createMock(),
110
113
  extractSqlFromResponse: (_a) => ({
@@ -140,6 +143,10 @@ export const TEST__createMockLegendAIPlugin = (overrides) => ({
140
143
  },
141
144
  buildErrorCorrectionPrompt: () => '',
142
145
  buildZeroRowCorrectionPrompt: () => '',
146
+ supportsPythonCodegen: () => false,
147
+ generatePythonQueryCodeAsync: () => Promise.resolve(undefined),
148
+ supportsOpenInDataCube: () => false,
149
+ translateAccessPointSqlToDataCubeQuery: () => Promise.resolve(undefined),
143
150
  ...overrides,
144
151
  });
145
152
  export const TEST__createOperationContext = (overrides) => {
@@ -1 +1 @@
1
- {"version":3,"file":"LegendAITestUtils.js","sourceRoot":"","sources":["../../../src/legend-ai/__test-utils__/LegendAITestUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAKvD,OAAO,EAOL,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAIL,oBAAoB,EACpB,4BAA4B,EAC5B,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,kDAAkD,CAAC;AAE1D,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAGpC,EAAE;IACF,IAAI,QAAQ,GAAsB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAkB,CAAC,MAAM,EAAE,EAAE;QACvC,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,MAAM,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;AACjD,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,SAA6C,EACnB,EAAE,CAAC,CAAC;IAC9B,EAAE,EAAE,oBAAoB;IACxB,IAAI,EAAE,mBAAmB,CAAC,SAAS;IACnC,aAAa,EAAE,EAAE;IACjB,GAAG,EAAE,IAAI;IACT,UAAU,EAAE,IAAI;IAChB,WAAW,EAAE,IAAI;IACjB,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,IAAI;IACd,gBAAgB,EAAE,IAAI;IACtB,YAAY,EAAE,IAAI;IAClB,WAAW,EAAE,KAAK;IAClB,gBAAgB,EAAE,EAAE;IACpB,cAAc,EAAE,IAAI;IACpB,wBAAwB,EAAE,EAAE;IAC5B,GAAG,SAAS;CACb,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAqB,EAAQ,EAAE;IACjE,MAAM,CAAC;QACL,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;QACrE,0BAA0B,EAAE;KAC7B,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,QAA2B,EAC3B,KAAa,EACa,EAAE;IAC5B,MAAM,GAAG,GAAG,oBAAoB,CAC9B,QAAQ,CAAC,KAAK,CAAC,EACf,6BAA6B,KAAK,EAAE,CACrC,CAAC;IACF,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB,CAAC,SAAS,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CACb,uCAAuC,KAAK,eAAe,GAAG,CAAC,IAAI,GAAG,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAmB;IACvD,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,sBAAsB;IACrC,YAAY,EAAE,YAAY;IAC1B,eAAe,EAAE,sBAAsB;IACvC,eAAe,EAAE,SAAS;IAC1B,oBAAoB,EAAE,SAAS;IAC/B,SAAS,EAAE,SAAS;IACpB,gBAAgB,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAA4B;IAClE,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,qBAAqB;IAClC,gBAAgB,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;CAC1D,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAuB;IAC7D;QACE,KAAK,EAAE,cAAc;QACrB,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;YACnC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;SACnC;QACD,UAAU,EAAE,EAAE;KACf;CACF,CAAC;AACF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,SAA+D,EACnB,EAAE,CAC9C,CAAC;IACC,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa;IAC5B,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO;IACzB,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;IACjB,sBAAsB,EAAE,CAAC,EAAU,EAAE,EAAW,EAA0B,EAAE,CAC1E,sBAAsB,CAAC,UAAU;IACnC,mBAAmB,EAAE,CACnB,EAAU,EACV,EAA2B,EAC3B,EAA+B,EAC/B,EAAE,CAAC,iBAAiB;IACtB,oBAAoB,EAAE,CACpB,EAAU,EACV,EAAsB,EACtB,EAAU,EACV,EAA+B,EAC/B,EAA4B,EAC5B,EAAE,CAAC,kBAAkB;IACvB,gBAAgB,EAAE,CAChB,IAAY,EACZ,EAAU,EACV,EAAsB,EACtB,EAAU,EACV,EAA+B,EAC/B,EAAE,CAAC,cAAc;IACnB,+BAA+B,EAAE,CAC/B,EAAU,EACV,EAAsB,EACtB,EAA+B,EAC/B,EAAW,EACX,EAAE,CAAC,qBAAqB;IAC1B,2BAA2B,EAAE,CAC3B,IAAY,EACZ,EAAU,EACV,EAAsB,EACtB,EAA+B,EAC/B,EAAW,EACX,EAAE,CAAC,iBAAiB;IACtB,qBAAqB,EAAE,GAAG,EAAE;QAC1B,mBAAmB;IACrB,CAAC;IACD,OAAO,EAAE,UAAU,EAAE;IACrB,UAAU,EAAE,UAAU,EAAE;IACxB,sBAAsB,EAAE,CAAC,EAAU,EAA+B,EAAE,CAAC,CAAC;QACpE,GAAG,EAAE,iBAAiB;QACtB,OAAO,EAAE,IAAI;KACd,CAAC;IACF,kBAAkB,EAAE,CAAC,EAAU,EAAuB,EAAE,CAAC,CAAC;QACxD,OAAO,EAAE,oBAAoB,CAAC,IAAI;KACnC,CAAC;IACF,sBAAsB,EAAE,CACtB,EAAU,EACV,QAA4B,EACC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC3D,uBAAuB,EAAE,GAAsC,EAAE;QAC/D,MAAM,QAAQ,GAAG,IAAI,wBAAwB,EAAE,CAAC;QAChD,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;QACjC,QAAQ,CAAC,eAAe,GAAG,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,4BAA4B,EAAE,GAA0C,EAAE;QACxE,MAAM,QAAQ,GAAG,IAAI,4BAA4B,EAAE,CAAC;QACpD,QAAQ,CAAC,YAAY,GAAG,gDAAgD,CAAC;QACzE,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,gBAAgB,EAAE,GAA4C,EAAE;QAC9D,MAAM,IAAI,GAAG,IAAI,8BAA8B,EAAE,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1B,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,kBAAkB,EAAE,GAAsC,EAAE;QAC1D,MAAM,QAAQ,GAAG,IAAI,wBAAwB,EAAE,CAAC;QAChD,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;QACjC,QAAQ,CAAC,eAAe,GAAG,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,0BAA0B,EAAE,GAAW,EAAE,CAAC,EAAE;IAC5C,4BAA4B,EAAE,GAAW,EAAE,CAAC,EAAE;IAC9C,GAAG,SAAS;CACb,CAA+C,CAAC;AAEnD,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,SAA6C,EACnB,EAAE;IAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,sBAAsB,EAAE,CAAC;IAC5C,OAAO;QACL,MAAM,EAAE,yBAAyB;QACjC,MAAM,EAAE,8BAA8B,EAAE;QACxC,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,MAAM;QACnB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"LegendAITestUtils.js","sourceRoot":"","sources":["../../../src/legend-ai/__test-utils__/LegendAITestUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAKvD,OAAO,EAOL,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAIL,oBAAoB,EACpB,4BAA4B,EAC5B,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,kDAAkD,CAAC;AAE1D,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAGpC,EAAE;IACF,IAAI,QAAQ,GAAsB,EAAE,CAAC;IACrC,MAAM,MAAM,GAAkB,CAAC,MAAM,EAAE,EAAE;QACvC,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,MAAM,CAAC;QACpB,CAAC;IACH,CAAC,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;AACjD,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,SAA6C,EACnB,EAAE,CAAC,CAAC;IAC9B,EAAE,EAAE,oBAAoB;IACxB,IAAI,EAAE,mBAAmB,CAAC,SAAS;IACnC,aAAa,EAAE,EAAE;IACjB,GAAG,EAAE,IAAI;IACT,UAAU,EAAE,IAAI;IAChB,WAAW,EAAE,IAAI;IACjB,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,IAAI;IACd,gBAAgB,EAAE,IAAI;IACtB,YAAY,EAAE,IAAI;IAClB,WAAW,EAAE,KAAK;IAClB,gBAAgB,EAAE,EAAE;IACpB,cAAc,EAAE,IAAI;IACpB,wBAAwB,EAAE,EAAE;IAC5B,mBAAmB,EAAE,EAAE;IACvB,GAAG,SAAS;CACb,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,MAAqB,EAAQ,EAAE;IACjE,MAAM,CAAC;QACL,EAAE,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE;QACrE,0BAA0B,EAAE;KAC7B,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,QAA2B,EAC3B,KAAa,EACa,EAAE;IAC5B,MAAM,GAAG,GAAG,oBAAoB,CAC9B,QAAQ,CAAC,KAAK,CAAC,EACf,6BAA6B,KAAK,EAAE,CACrC,CAAC;IACF,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB,CAAC,SAAS,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CACb,uCAAuC,KAAK,eAAe,GAAG,CAAC,IAAI,GAAG,CACvE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,yBAAyB,GAAmB;IACvD,OAAO,EAAE,IAAI;IACb,aAAa,EAAE,sBAAsB;IACrC,YAAY,EAAE,YAAY;IAC1B,eAAe,EAAE,sBAAsB;IACvC,eAAe,EAAE,SAAS;IAC1B,oBAAoB,EAAE,SAAS;IAC/B,SAAS,EAAE,SAAS;IACpB,gBAAgB,EAAE,CAAC;CACpB,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAA4B;IAClE,IAAI,EAAE,aAAa;IACnB,WAAW,EAAE,qBAAqB;IAClC,gBAAgB,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;CAC1D,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAuB;IAC7D;QACE,KAAK,EAAE,cAAc;QACrB,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;YACnC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;SACnC;QACD,UAAU,EAAE,EAAE;KACf;CACF,CAAC;AACF,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAC5C,SAA+D,EACnB,EAAE,CAC9C,CAAC;IACC,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa;IAC5B,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO;IACzB,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;IACjB,sBAAsB,EAAE,CAAC,EAAU,EAAE,EAAW,EAA0B,EAAE,CAC1E,sBAAsB,CAAC,UAAU;IACnC,mBAAmB,EAAE,CACnB,EAAU,EACV,EAA2B,EAC3B,EAA+B,EAC/B,EAAE,CAAC,iBAAiB;IACtB,oBAAoB,EAAE,CACpB,EAAU,EACV,EAAsB,EACtB,EAAU,EACV,EAA+B,EAC/B,EAA4B,EAC5B,EAAE,CAAC,kBAAkB;IACvB,gBAAgB,EAAE,CAChB,IAAY,EACZ,EAAU,EACV,EAAsB,EACtB,EAAU,EACV,EAA+B,EAC/B,EAAE,CAAC,cAAc;IACnB,+BAA+B,EAAE,CAC/B,EAAU,EACV,EAAsB,EACtB,EAA+B,EAC/B,EAAW,EACX,EAAE,CAAC,qBAAqB;IAC1B,2BAA2B,EAAE,CAC3B,IAAY,EACZ,EAAU,EACV,EAAsB,EACtB,EAA+B,EAC/B,EAAW,EACX,EAAE,CAAC,iBAAiB;IACtB,qBAAqB,EAAE,GAAG,EAAE;QAC1B,mBAAmB;IACrB,CAAC;IACD,6BAA6B,EAAE,GAAkB,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;IACrE,sBAAsB,EAAE,GAAuB,EAAE,CAC/C,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5B,OAAO,EAAE,UAAU,EAAE;IACrB,UAAU,EAAE,UAAU,EAAE;IACxB,sBAAsB,EAAE,CAAC,EAAU,EAA+B,EAAE,CAAC,CAAC;QACpE,GAAG,EAAE,iBAAiB;QACtB,OAAO,EAAE,IAAI;KACd,CAAC;IACF,kBAAkB,EAAE,CAAC,EAAU,EAAuB,EAAE,CAAC,CAAC;QACxD,OAAO,EAAE,oBAAoB,CAAC,IAAI;KACnC,CAAC;IACF,sBAAsB,EAAE,CACtB,EAAU,EACV,QAA4B,EACC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;IAC3D,uBAAuB,EAAE,GAAsC,EAAE;QAC/D,MAAM,QAAQ,GAAG,IAAI,wBAAwB,EAAE,CAAC;QAChD,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;QACjC,QAAQ,CAAC,eAAe,GAAG,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,4BAA4B,EAAE,GAA0C,EAAE;QACxE,MAAM,QAAQ,GAAG,IAAI,4BAA4B,EAAE,CAAC;QACpD,QAAQ,CAAC,YAAY,GAAG,gDAAgD,CAAC;QACzE,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,gBAAgB,EAAE,GAA4C,EAAE;QAC9D,MAAM,IAAI,GAAG,IAAI,8BAA8B,EAAE,CAAC;QAClD,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QAC1B,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,kBAAkB,EAAE,GAAsC,EAAE;QAC1D,MAAM,QAAQ,GAAG,IAAI,wBAAwB,EAAE,CAAC;QAChD,QAAQ,CAAC,UAAU,GAAG,UAAU,CAAC;QACjC,QAAQ,CAAC,eAAe,GAAG,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,0BAA0B,EAAE,GAAW,EAAE,CAAC,EAAE;IAC5C,4BAA4B,EAAE,GAAW,EAAE,CAAC,EAAE;IAC9C,qBAAqB,EAAE,GAAY,EAAE,CAAC,KAAK;IAC3C,4BAA4B,EAAE,GAAuB,EAAE,CACrD,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5B,sBAAsB,EAAE,GAAY,EAAE,CAAC,KAAK;IAC5C,sCAAsC,EAAE,GAAuB,EAAE,CAC/D,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5B,GAAG,SAAS;CACb,CAA+C,CAAC;AAEnD,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAC1C,SAA6C,EACnB,EAAE;IAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,sBAAsB,EAAE,CAAC;IAC5C,OAAO;QACL,MAAM,EAAE,yBAAyB;QACjC,MAAM,EAAE,8BAA8B,EAAE;QACxC,OAAO,EAAE,EAAE;QACX,WAAW,EAAE,MAAM;QACnB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"LegendAICharts.d.ts","sourceRoot":"","sources":["../../../src/legend-ai/components/LegendAICharts.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;AAgB/F,eAAO,MAAM,gBAAgB,GAAI,OAAO;IACtC,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAG,KAAK,CAAC,SA8CT,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,OAAO;IACxC,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAG,KAAK,CAAC,SA8ET,CAAC;AAQF,eAAO,MAAM,iBAAiB,GAAI,OAAO;IACvC,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAG,KAAK,CAAC,SAqJT,CAAC"}
1
+ {"version":3,"file":"LegendAICharts.d.ts","sourceRoot":"","sources":["../../../src/legend-ai/components/LegendAICharts.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;AAgB/F,eAAO,MAAM,gBAAgB,GAAI,OAAO;IACtC,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAG,KAAK,CAAC,SA8CT,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,OAAO;IACxC,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAG,KAAK,CAAC,SA8ET,CAAC;AASF,eAAO,MAAM,iBAAiB,GAAI,OAAO;IACvC,IAAI,EAAE,sBAAsB,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,KAAG,KAAK,CAAC,SAiJT,CAAC"}
@@ -71,6 +71,7 @@ export const LegendAIDonutChart = (props) => {
71
71
  const LINE_SVG_WIDTH = 400;
72
72
  const LINE_SVG_HEIGHT = 180;
73
73
  const LINE_PADDING = { top: 16, right: 16, bottom: 28, left: 52 };
74
+ const AXIS_LABEL_MAX_CHARS = 10;
74
75
  export const LegendAILineChart = (props) => {
75
76
  const { data, title } = props;
76
77
  const { points, polyline, minVal, maxVal } = useMemo(() => {
@@ -98,7 +99,7 @@ export const LegendAILineChart = (props) => {
98
99
  const x = LINE_PADDING.left +
99
100
  (data.length > 1 ? (i / (data.length - 1)) * plotW : plotW / 2);
100
101
  const y = LINE_PADDING.top + (1 - (d.value - lo) / range) * plotH;
101
- return { x, y, ...d };
102
+ return { x, y, label: d.label, value: d.value };
102
103
  });
103
104
  return {
104
105
  points: pts,
@@ -112,18 +113,13 @@ export const LegendAILineChart = (props) => {
112
113
  }
113
114
  const plotBottom = LINE_SVG_HEIGHT - LINE_PADDING.bottom;
114
115
  const color = getChartColor(0);
116
+ const firstPt = points[0];
117
+ const lastPt = points[points.length - 1];
118
+ const axisEndpoints = firstPt && lastPt ? { first: firstPt, last: lastPt } : undefined;
115
119
  return (_jsxs("div", { className: "legend-ai-chart legend-ai-chart--line", children: [title !== undefined && title.length > 0 && (_jsx("div", { className: "legend-ai-chart__title", children: title })), _jsxs("svg", { viewBox: `0 0 ${LINE_SVG_WIDTH} ${LINE_SVG_HEIGHT}`, className: "legend-ai-chart__line-svg", preserveAspectRatio: "xMidYMid meet", children: [_jsx("text", { x: LINE_PADDING.left - 6, y: LINE_PADDING.top + 4, className: "legend-ai-chart__axis-label", textAnchor: "end", children: Number.isInteger(maxVal)
116
120
  ? maxVal.toLocaleString()
117
121
  : maxVal.toFixed(1) }), _jsx("text", { x: LINE_PADDING.left - 6, y: plotBottom + 4, className: "legend-ai-chart__axis-label", textAnchor: "end", children: Number.isInteger(minVal)
118
122
  ? minVal.toLocaleString()
119
- : minVal.toFixed(1) }), _jsx("line", { x1: LINE_PADDING.left, y1: LINE_PADDING.top, x2: LINE_SVG_WIDTH - LINE_PADDING.right, y2: LINE_PADDING.top, className: "legend-ai-chart__grid-line" }), _jsx("line", { x1: LINE_PADDING.left, y1: plotBottom, x2: LINE_SVG_WIDTH - LINE_PADDING.right, y2: plotBottom, className: "legend-ai-chart__grid-line" }), _jsx("polyline", { points: polyline, fill: "none", stroke: color, strokeWidth: "2", className: "legend-ai-chart__line-path" }), points.map((p) => (_jsx("circle", { cx: p.x, cy: p.y, r: 3, fill: color, className: "legend-ai-chart__line-dot" }, `${p.label}-${String(p.value)}`))), points.length > 0 &&
120
- (() => {
121
- const firstPt = points[0];
122
- const lastPt = points[points.length - 1];
123
- if (!firstPt || !lastPt) {
124
- return null;
125
- }
126
- return (_jsxs(_Fragment, { children: [_jsx("text", { x: firstPt.x, y: plotBottom + 16, className: "legend-ai-chart__axis-label", textAnchor: "start", children: firstPt.label.slice(0, 10) }), points.length > 2 && (_jsx("text", { x: lastPt.x, y: plotBottom + 16, className: "legend-ai-chart__axis-label", textAnchor: "end", children: lastPt.label.slice(0, 10) }))] }));
127
- })()] })] }));
123
+ : minVal.toFixed(1) }), _jsx("line", { x1: LINE_PADDING.left, y1: LINE_PADDING.top, x2: LINE_SVG_WIDTH - LINE_PADDING.right, y2: LINE_PADDING.top, className: "legend-ai-chart__grid-line" }), _jsx("line", { x1: LINE_PADDING.left, y1: plotBottom, x2: LINE_SVG_WIDTH - LINE_PADDING.right, y2: plotBottom, className: "legend-ai-chart__grid-line" }), _jsx("polyline", { points: polyline, fill: "none", stroke: color, strokeWidth: "2", className: "legend-ai-chart__line-path" }), points.map((p) => (_jsx("circle", { cx: p.x, cy: p.y, r: 3, fill: color, className: "legend-ai-chart__line-dot" }, `${p.x}-${p.y}`))), axisEndpoints && (_jsxs(_Fragment, { children: [_jsx("text", { x: axisEndpoints.first.x, y: plotBottom + 16, className: "legend-ai-chart__axis-label", textAnchor: "start", children: axisEndpoints.first.label.slice(0, AXIS_LABEL_MAX_CHARS) }), points.length > 2 && (_jsx("text", { x: axisEndpoints.last.x, y: plotBottom + 16, className: "legend-ai-chart__axis-label", textAnchor: "end", children: axisEndpoints.last.label.slice(0, AXIS_LABEL_MAX_CHARS) }))] }))] })] }));
128
124
  };
129
125
  //# sourceMappingURL=LegendAICharts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LegendAICharts.js","sourceRoot":"","sources":["../../../src/legend-ai/components/LegendAICharts.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LegendAICharts.js","sourceRoot":"","sources":["../../../src/legend-ai/components/LegendAICharts.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"LegendAIChat.d.ts","sourceRoot":"","sources":["../../../src/legend-ai/components/LegendAIChat.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAwBH,OAAO,EACL,KAAK,iBAAiB,EAOtB,0BAA0B,EAK3B,MAAM,qBAAqB,CAAC;AAO7B,eAAO,MAAM,mBAAmB,qBAAqB,CAAC;AA8ItD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,0BAA0B,GACjC,KAAK,CAAC,SAAS,CASjB;AA8YD,eAAO,MAAM,YAAY,GAAI,OAAO,iBAAiB,KAAG,KAAK,CAAC,SA0N7D,CAAC"}
1
+ {"version":3,"file":"LegendAIChat.d.ts","sourceRoot":"","sources":["../../../src/legend-ai/components/LegendAIChat.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAgCH,OAAO,EACL,KAAK,iBAAiB,EAQtB,0BAA0B,EAS3B,MAAM,qBAAqB,CAAC;AAQ7B,eAAO,MAAM,mBAAmB,qBAAqB,CAAC;AAmJtD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,0BAA0B,GACjC,KAAK,CAAC,SAAS,CASjB;AAonBD,eAAO,MAAM,YAAY,GAAI,OAAO,iBAAiB,KAAG,KAAK,CAAC,SAib7D,CAAC"}
@@ -14,11 +14,12 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
14
14
  * See the License for the specific language governing permissions and
15
15
  * limitations under the License.
16
16
  */
17
- import { useMemo, useCallback, useState, useRef, useEffect } from 'react';
18
- import { SparkleStarsIcon, CodeIcon, TableIcon, CopyIcon, CheckIcon, TimesIcon, MinusIcon, PlusIcon, CaretDownIcon, CaretRightIcon, DotIcon, LoadingIcon, LikeIcon, DislikeIcon, ExternalLinkIcon, InfoCircleIcon, MarkdownTextViewer, clsx, } from '@finos/legend-art';
19
- import { noop } from '@finos/legend-shared';
20
- import { LegendAIMessageFeedbackRating, LegendAIThinkingStepStatus, LegendAIMessageRole, LegendAIErrorType, TDSServiceSourceType, classifyQuestionIntentFast, } from '../LegendAITypes.js';
17
+ import { memo, useMemo, useCallback, useState, useRef, useEffect } from 'react';
18
+ import { SparkleStarsIcon, CodeIcon, TableIcon, CopyIcon, CheckIcon, TimesIcon, MinusIcon, PlusIcon, CaretDownIcon, CaretRightIcon, DotIcon, LoadingIcon, LikeIcon, DislikeIcon, ExternalLinkIcon, InfoCircleIcon, PythonIcon, JupyterIcon, CubeIcon, MarkdownTextViewer, clsx, } from '@finos/legend-art';
19
+ import { assertErrorThrown, noop } from '@finos/legend-shared';
20
+ import { LegendAIMessageFeedbackRating, LegendAIThinkingStepStatus, LegendAIMessageRole, LegendAIErrorType, TDSServiceSourceType, LEGEND_AI_FEEDBACK_PROMPT, classifyQuestionIntentFast, LegendAIChatTelemetryEventType, LegendAITelemetryArtifact, LegendAISuggestedQuerySource, } from '../LegendAITypes.js';
21
21
  import { useLegendAIChatState } from '../stores/LegendAIChatState.js';
22
+ import { looksLikeAccessError } from '../stores/LegendAIChatProcessors.js';
22
23
  import { LegendAIResultGrid } from './LegendAIResultGrid.js';
23
24
  import { LegendAIAnalysisPanel } from './LegendAIAnalysisPanel.js';
24
25
  import { LegendAIChatInput } from './LegendAIChatInput.js';
@@ -124,32 +125,41 @@ export function renderStepStatusIcon(status) {
124
125
  }
125
126
  return status === LegendAIThinkingStepStatus.DONE ? (_jsx(CheckIcon, {})) : (_jsx(TimesIcon, {}));
126
127
  }
127
- /**
128
- * Determines whether an execution error message indicates an access/permission
129
- * problem (as opposed to a SQL compilation or schema error). Only access-like
130
- * errors should show the "Request Access" button.
131
- */
132
- const ACCESS_ERROR_PATTERN = /insufficient privileges|access.*denied|permission.*denied|not authorized|unauthorized|403|entitlement/i;
133
- function looksLikeAccessError(errorMsg) {
134
- if (!errorMsg) {
135
- return false;
136
- }
137
- return ACCESS_ERROR_PATTERN.test(errorMsg);
138
- }
139
- const AssistantMessageView = (props) => {
140
- const { msg, questionText, isThinkingVisible, onToggleThinking, onMessageFeedback, selectedFeedbackRating, feedbackSubmitting, onSuggestedQueryClick, onFallbackAction, enghubDocUrl, enthubRequestAccessUrl, onRequestAccess, } = props;
128
+ const SuggestionButton = (props) => {
129
+ const { query, position, className, source, onSelect, onLogTelemetryEvent } = props;
130
+ return (_jsx("button", { type: "button", className: className, onClick: () => {
131
+ onLogTelemetryEvent?.({
132
+ type: LegendAIChatTelemetryEventType.SUGGESTED_QUERY_CLICKED,
133
+ position,
134
+ source,
135
+ });
136
+ onSelect(query);
137
+ }, children: query }));
138
+ };
139
+ const AssistantMessageView = memo(function AssistantMessageView(props) {
140
+ const { msg, msgIndex, questionText, isThinkingVisible, onToggleThinking, onMessageFeedback, selectedFeedbackRating, feedbackSubmitting, onSuggestedQueryClick, onFallbackAction, enghubDocUrl, enthubRequestAccessUrl, onRequestAccess, pythonEntry, onRequestPython, onOpenInDataCube, isOpeningInDataCube, onLogTelemetryEvent, } = props;
141
141
  const hasPermissionAccessLinks = enghubDocUrl !== undefined || enthubRequestAccessUrl !== undefined;
142
142
  const [sqlCopied, setSqlCopied] = useState(false);
143
143
  const copyTimerRef = useRef(undefined);
144
+ const [showPython, setShowPython] = useState(false);
145
+ const [pythonCopied, setPythonCopied] = useState(false);
146
+ const pythonCopyTimerRef = useRef(undefined);
144
147
  useEffect(() => () => {
145
148
  if (copyTimerRef.current !== undefined) {
146
149
  clearTimeout(copyTimerRef.current);
147
150
  }
151
+ if (pythonCopyTimerRef.current !== undefined) {
152
+ clearTimeout(pythonCopyTimerRef.current);
153
+ }
148
154
  }, []);
149
155
  const handleCopySql = useCallback(() => {
150
156
  if (msg.sql) {
151
157
  navigator.clipboard.writeText(msg.sql).catch(noop);
152
158
  setSqlCopied(true);
159
+ onLogTelemetryEvent?.({
160
+ type: LegendAIChatTelemetryEventType.ARTIFACT_COPIED,
161
+ artifact: LegendAITelemetryArtifact.SQL,
162
+ });
153
163
  if (copyTimerRef.current !== undefined) {
154
164
  clearTimeout(copyTimerRef.current);
155
165
  }
@@ -158,18 +168,54 @@ const AssistantMessageView = (props) => {
158
168
  copyTimerRef.current = undefined;
159
169
  }, COPY_FEEDBACK_DURATION_MS);
160
170
  }
161
- }, [msg.sql]);
171
+ }, [msg.sql, onLogTelemetryEvent]);
172
+ const handleCopyPython = useCallback(() => {
173
+ if (pythonEntry?.status === 'ready' && pythonEntry.code) {
174
+ navigator.clipboard.writeText(pythonEntry.code.code).catch(noop);
175
+ setPythonCopied(true);
176
+ onLogTelemetryEvent?.({
177
+ type: LegendAIChatTelemetryEventType.ARTIFACT_COPIED,
178
+ artifact: LegendAITelemetryArtifact.PYTHON,
179
+ });
180
+ if (pythonCopyTimerRef.current !== undefined) {
181
+ clearTimeout(pythonCopyTimerRef.current);
182
+ }
183
+ pythonCopyTimerRef.current = setTimeout(() => {
184
+ setPythonCopied(false);
185
+ pythonCopyTimerRef.current = undefined;
186
+ }, COPY_FEEDBACK_DURATION_MS);
187
+ }
188
+ }, [pythonEntry, onLogTelemetryEvent]);
189
+ const handleTogglePython = useCallback(() => {
190
+ const opening = !showPython;
191
+ setShowPython(opening);
192
+ onLogTelemetryEvent?.({
193
+ type: LegendAIChatTelemetryEventType.PYTHON_CODE_TOGGLED,
194
+ shown: opening,
195
+ });
196
+ if (opening && !pythonEntry && onRequestPython) {
197
+ onLogTelemetryEvent?.({
198
+ type: LegendAIChatTelemetryEventType.PYTHON_CODE_REQUESTED,
199
+ });
200
+ onRequestPython(msg);
201
+ }
202
+ }, [showPython, pythonEntry, onRequestPython, msg, onLogTelemetryEvent]);
162
203
  const canShowFeedback = !msg.isProcessing &&
163
204
  (msg.textAnswer !== null || msg.gridData !== null || msg.error !== null);
164
- const visibleThinkingSteps = formatThinkingSteps(msg.thinkingSteps);
165
- const { metadataContext, queryAnalysis } = splitCombinedAnswer(msg.textAnswer);
166
- const analysisSummary = (() => {
167
- if (msg.gridData === null) {
168
- return null;
169
- }
170
- return queryAnalysis ?? (metadataContext === null ? msg.textAnswer : null);
171
- })();
172
- const plainAnswer = msg.gridData === null ? (metadataContext ?? msg.textAnswer) : null;
205
+ const visibleThinkingSteps = useMemo(() => formatThinkingSteps(msg.thinkingSteps), [msg.thinkingSteps]);
206
+ const { metadataContext, analysisSummary, plainAnswer } = useMemo(() => {
207
+ const split = splitCombinedAnswer(msg.textAnswer);
208
+ const gridAnalysisFallback = split.metadataContext === null ? msg.textAnswer : null;
209
+ return {
210
+ metadataContext: split.metadataContext,
211
+ analysisSummary: msg.gridData === null
212
+ ? null
213
+ : (split.queryAnalysis ?? gridAnalysisFallback),
214
+ plainAnswer: msg.gridData === null
215
+ ? (split.metadataContext ?? msg.textAnswer)
216
+ : null,
217
+ };
218
+ }, [msg.textAnswer, msg.gridData]);
173
219
  const submitFeedback = useCallback((rating) => {
174
220
  const result = onMessageFeedback?.({
175
221
  messageId: msg.id,
@@ -185,7 +231,10 @@ const AssistantMessageView = (props) => {
185
231
  result.catch(noop);
186
232
  }
187
233
  }, [msg, onMessageFeedback, questionText]);
188
- return (_jsxs("div", { className: "legend-ai__msg legend-ai__msg--assistant", children: [_jsx("div", { className: "legend-ai__msg-avatar", children: _jsx(SparkleStarsIcon, {}) }), _jsxs("div", { className: "legend-ai__msg-content", children: [visibleThinkingSteps.length > 0 && (_jsxs("div", { className: "legend-ai__thinking", children: [!msg.isProcessing && (_jsxs("button", { type: "button", className: "legend-ai__thinking-toggle", onClick: onToggleThinking, children: [_jsx("span", { className: "legend-ai__thinking-toggle-icon", children: isThinkingVisible ? _jsx(CaretDownIcon, {}) : _jsx(CaretRightIcon, {}) }), "Thought for ", msg.thinkingDuration ?? '...', "s"] })), isThinkingVisible && (_jsx("div", { className: "legend-ai__thinking-steps", children: visibleThinkingSteps.map((step) => (_jsxs("div", { className: clsx('legend-ai__thinking-step', `legend-ai__thinking-step--${step.status}`), children: [_jsx("span", { className: "legend-ai__thinking-step-icon", children: renderStepStatusIcon(step.status) }), _jsx("span", { children: step.label })] }, step.id))) }))] })), metadataContext && msg.gridData && (_jsx("div", { className: "legend-ai__inline-answer", children: _jsx(MarkdownTextViewer, { value: { value: metadataContext }, className: "legend-ai__text-answer-md" }) })), msg.sql && (_jsxs("div", { className: "legend-ai__sql-block", children: [_jsxs("div", { className: "legend-ai__sql-block-header", children: [_jsx("span", { className: "legend-ai__sql-block-header-icon", children: _jsx(CodeIcon, {}) }), _jsx("span", { children: "Generated SQL" }), msg.sqlGenTime && (_jsxs("span", { className: "legend-ai__sql-block-time", children: [msg.sqlGenTime, "s"] })), _jsx("button", { type: "button", className: "legend-ai__sql-copy-btn", title: "Copy SQL", "aria-label": "Copy SQL", onClick: handleCopySql, children: sqlCopied ? (_jsx("span", { className: "legend-ai__sql-copy-btn--copied", children: _jsx(CheckIcon, {}) })) : (_jsx(CopyIcon, {})) })] }), _jsx("div", { className: "legend-ai__sql-scroll", children: _jsx("pre", { className: "legend-ai__sql-display", children: msg.sql }) })] })), msg.isExecuting && (_jsxs("div", { className: "legend-ai__executing", children: [_jsx(LoadingIcon, { isLoading: true }), _jsx("span", { children: "Executing query..." })] })), msg.error && (_jsxs("div", { className: "legend-ai__exec-error", children: [msg.error, msg.errorType === LegendAIErrorType.PERMISSION &&
234
+ return (_jsxs("div", { className: "legend-ai__msg legend-ai__msg--assistant", children: [_jsx("div", { className: "legend-ai__msg-avatar", children: _jsx(SparkleStarsIcon, {}) }), _jsxs("div", { className: "legend-ai__msg-content", children: [visibleThinkingSteps.length > 0 && (_jsxs("div", { className: "legend-ai__thinking", children: [!msg.isProcessing && (_jsxs("button", { type: "button", className: "legend-ai__thinking-toggle", onClick: () => onToggleThinking(msgIndex), children: [_jsx("span", { className: "legend-ai__thinking-toggle-icon", children: isThinkingVisible ? _jsx(CaretDownIcon, {}) : _jsx(CaretRightIcon, {}) }), "Thought for ", msg.thinkingDuration ?? '...', "s"] })), isThinkingVisible && (_jsx("div", { className: "legend-ai__thinking-steps", children: visibleThinkingSteps.map((step) => (_jsxs("div", { className: clsx('legend-ai__thinking-step', `legend-ai__thinking-step--${step.status}`), children: [_jsx("span", { className: "legend-ai__thinking-step-icon", children: renderStepStatusIcon(step.status) }), _jsx("span", { children: step.label })] }, step.id))) }))] })), metadataContext && msg.gridData && (_jsx("div", { className: "legend-ai__inline-answer", children: _jsx(MarkdownTextViewer, { value: { value: metadataContext }, className: "legend-ai__text-answer-md" }) })), msg.sql && (_jsxs("details", { className: "legend-ai__sql-details", open: msg.gridData !== null, onToggle: (event) => onLogTelemetryEvent?.({
235
+ type: LegendAIChatTelemetryEventType.SQL_DETAILS_TOGGLED,
236
+ shown: event.currentTarget.open,
237
+ }), children: [_jsx("summary", { className: "legend-ai__sql-details-summary", children: msg.gridData === null ? 'Show the query I tried' : 'Query' }), _jsxs("div", { className: "legend-ai__sql-block", children: [_jsxs("div", { className: "legend-ai__sql-block-header", children: [_jsx("span", { className: "legend-ai__sql-block-header-icon", children: _jsx(CodeIcon, {}) }), _jsx("span", { children: "Generated SQL" }), msg.sqlGenTime && (_jsxs("span", { className: "legend-ai__sql-block-time", children: [msg.sqlGenTime, "s"] })), _jsx("button", { type: "button", className: "legend-ai__sql-copy-btn", title: "Copy SQL", "aria-label": "Copy SQL", onClick: handleCopySql, children: sqlCopied ? (_jsx("span", { className: "legend-ai__sql-copy-btn--copied", children: _jsx(CheckIcon, {}) })) : (_jsx(CopyIcon, {})) })] }), _jsx("div", { className: "legend-ai__sql-scroll", children: _jsx("pre", { className: "legend-ai__sql-display", children: msg.sql }) })] })] })), msg.isExecuting && (_jsxs("div", { className: "legend-ai__executing", children: [_jsx(LoadingIcon, { isLoading: true }), _jsx("span", { children: "Executing query..." })] })), msg.error && (_jsxs("div", { className: "legend-ai__exec-error", children: [msg.error, msg.errorType === LegendAIErrorType.PERMISSION &&
189
238
  hasPermissionAccessLinks && (_jsxs("div", { className: "legend-ai__permission-error-action", children: [_jsx("span", { className: "legend-ai__permission-error-note", children: "Need access?" }), _jsxs("div", { className: "legend-ai__permission-error-btns", children: [enghubDocUrl && (_jsxs("a", { className: "legend-ai__permission-error-btn", href: enghubDocUrl, target: "_blank", rel: "noopener noreferrer", children: [_jsx(ExternalLinkIcon, {}), _jsx("span", { children: "View Documentation" })] })), enthubRequestAccessUrl && (_jsxs("a", { className: "legend-ai__permission-error-btn legend-ai__permission-error-btn--primary", href: enthubRequestAccessUrl, target: "_blank", rel: "noopener noreferrer", children: [_jsx(ExternalLinkIcon, {}), _jsx("span", { children: "Request Access" })] }))] })] })), msg.errorType === LegendAIErrorType.EXECUTION &&
190
239
  onRequestAccess &&
191
240
  msg.queriedAccessPointGroups.length > 0 &&
@@ -193,29 +242,180 @@ const AssistantMessageView = (props) => {
193
242
  ? 'You may not have access to this data. You can request access below.'
194
243
  : `This query uses ${msg.queriedAccessPointGroups.length} access point groups. You can request access to each one below.` }), _jsx("div", { className: "legend-ai__permission-error-btns", children: msg.queriedAccessPointGroups.map((apgTitle) => (_jsxs("button", { type: "button", className: "legend-ai__permission-error-btn legend-ai__permission-error-btn--primary", onClick: () => onRequestAccess(apgTitle), children: [_jsx(ExternalLinkIcon, {}), _jsxs("span", { children: ["Request Access \u2014 ", apgTitle] })] }, apgTitle))) })] }))] })), msg.gridData && (_jsxs("div", { className: "legend-ai__results-block", children: [_jsxs("div", { className: "legend-ai__results-header", children: [_jsx("span", { className: "legend-ai__results-header-icon", children: _jsx(TableIcon, {}) }), _jsx("span", { children: "Results" }), _jsxs("span", { className: "legend-ai__results-meta", children: [msg.gridData.rowData.length, " row", msg.gridData.rowData.length === 1 ? '' : 's', msg.execTime ? (_jsxs(_Fragment, { children: [' ', _jsx(DotIcon, { className: "legend-ai__results-meta-dot" }), ' ', msg.execTime, "s"] })) : ('')] })] }), _jsx(LegendAIResultGrid, { data: msg.gridData })] })), plainAnswer && (_jsx("div", { className: "legend-ai__inline-answer", children: _jsx(MarkdownTextViewer, { value: { value: plainAnswer }, className: "legend-ai__text-answer-md" }) })), analysisSummary && msg.gridData && (_jsx(LegendAIAnalysisPanel, { gridData: msg.gridData, summary: analysisSummary, SummaryRenderer: AISummaryRenderer })), msg.isProcessing && !msg.isExecuting && msg.gridData && (_jsxs("div", { className: "legend-ai__analyzing", children: [_jsx(LoadingIcon, { isLoading: true }), _jsx("span", { children: "Analyzing results..." })] })), !msg.isProcessing &&
195
244
  msg.suggestedQueries.length > 0 &&
196
- onSuggestedQueryClick && (_jsxs("div", { className: "legend-ai__follow-up-suggestions", children: [_jsx("span", { className: "legend-ai__follow-up-label", children: "Try a data query:" }), msg.suggestedQueries.map((q) => (_jsx("button", { type: "button", className: "legend-ai__follow-up-btn", onClick: () => onSuggestedQueryClick(q), children: q }, q)))] })), msg.fallbackAction && !msg.isProcessing && onFallbackAction && (_jsxs("button", { type: "button", className: "legend-ai__fallback-action-btn", onClick: () => {
245
+ onSuggestedQueryClick && (_jsxs("div", { className: "legend-ai__follow-up-suggestions", children: [_jsx("span", { className: "legend-ai__follow-up-label", children: "Try a data query:" }), msg.suggestedQueries.map((q, position) => (_jsx(SuggestionButton, { query: q, position: position, className: "legend-ai__follow-up-btn", source: LegendAISuggestedQuerySource.FOLLOW_UP, onSelect: onSuggestedQueryClick, ...(onLogTelemetryEvent ? { onLogTelemetryEvent } : {}) }, q)))] })), msg.fallbackAction && !msg.isProcessing && onFallbackAction && (_jsxs("button", { type: "button", className: "legend-ai__fallback-action-btn", onClick: () => {
197
246
  if (msg.fallbackAction?.actionId) {
198
247
  onFallbackAction(msg.id);
199
248
  }
200
- }, children: [_jsx(SparkleStarsIcon, {}), _jsx("span", { children: msg.fallbackAction.label })] })), canShowFeedback && (_jsxs("div", { className: "legend-ai__message-feedback", children: [_jsx("span", { className: "legend-ai__message-feedback-label", children: "Did this answer your question?" }), _jsxs("div", { className: "legend-ai__message-feedback-actions", children: [_jsx("button", { type: "button", className: clsx('legend-ai__message-feedback-btn', {
249
+ }, children: [_jsx(SparkleStarsIcon, {}), _jsx("span", { children: msg.fallbackAction.label })] })), (onRequestPython || onOpenInDataCube) &&
250
+ !msg.isProcessing &&
251
+ (msg.sql !== null || msg.gridData !== null) && (_jsxs("div", { className: "legend-ai__python-block", children: [_jsxs("div", { className: "legend-ai__cta-row", children: [onRequestPython && (_jsxs("button", { type: "button", className: "legend-ai__python-cta", onClick: handleTogglePython, children: [_jsx(PythonIcon, {}), _jsx("span", { children: showPython
252
+ ? 'Hide Python code'
253
+ : 'Want the Python code for this query?' }), _jsx("span", { className: "legend-ai__python-cta-caret", children: showPython ? _jsx(CaretDownIcon, {}) : _jsx(CaretRightIcon, {}) })] })), onOpenInDataCube && msg.sql !== null && (_jsxs("button", { type: "button", className: "legend-ai__datacube-cta", onClick: () => {
254
+ onLogTelemetryEvent?.({
255
+ type: LegendAIChatTelemetryEventType.OPEN_IN_DATACUBE_CLICKED,
256
+ });
257
+ onOpenInDataCube(msg);
258
+ }, disabled: isOpeningInDataCube, title: "Open this query in DataCube", "aria-label": "Open this query in DataCube", children: [isOpeningInDataCube ? (_jsx(LoadingIcon, { isLoading: true })) : (_jsx(CubeIcon, {})), _jsx("span", { children: isOpeningInDataCube
259
+ ? 'Opening in DataCube...'
260
+ : 'Open in DataCube' }), _jsx("span", { className: "legend-ai__datacube-cta-launch", children: _jsx(ExternalLinkIcon, {}) })] }))] }), showPython && onRequestPython && (_jsxs("div", { className: "legend-ai__python-panel", children: [_jsxs("div", { className: "legend-ai__python-panel-header", children: [_jsx("span", { className: "legend-ai__python-panel-header-icon", children: _jsx(CodeIcon, {}) }), _jsx("span", { children: "Python" }), pythonEntry?.status === 'ready' && pythonEntry.code && (_jsx("button", { type: "button", className: "legend-ai__sql-copy-btn", title: "Copy Python code", "aria-label": "Copy Python code", onClick: handleCopyPython, children: pythonCopied ? (_jsx("span", { className: "legend-ai__sql-copy-btn--copied", children: _jsx(CheckIcon, {}) })) : (_jsx(CopyIcon, {})) }))] }), pythonEntry?.status === 'loading' && (_jsxs("div", { className: "legend-ai__python-panel-loading", children: [_jsx(LoadingIcon, { isLoading: true }), _jsx("span", { children: "Generating Python\u2026" })] })), pythonEntry?.status === 'error' && (_jsxs("div", { className: "legend-ai__python-panel-error", children: [_jsx("span", { children: "Could not generate Python code. Try again in a moment." }), _jsx("button", { type: "button", className: "legend-ai__permission-error-btn", onClick: () => {
261
+ onLogTelemetryEvent?.({
262
+ type: LegendAIChatTelemetryEventType.PYTHON_CODE_REQUESTED,
263
+ });
264
+ onRequestPython(msg);
265
+ }, children: "Retry" })] })), pythonEntry?.status === 'ready' &&
266
+ pythonEntry.code === undefined && (_jsx("div", { className: "legend-ai__python-panel-loading", children: _jsx("span", { children: "Python code is not available for this data source." }) })), pythonEntry?.status === 'ready' && pythonEntry.code && (_jsxs(_Fragment, { children: [_jsx("div", { className: "legend-ai__sql-scroll", children: _jsx("pre", { className: "legend-ai__sql-display", children: pythonEntry.code.code }) }), pythonEntry.code.notebookUrl && (_jsx("div", { className: "legend-ai__python-panel-actions", children: _jsxs("a", { className: "legend-ai__permission-error-btn", href: pythonEntry.code.notebookUrl, target: "_blank", rel: "noopener noreferrer", children: [_jsx(JupyterIcon, {}), _jsx("span", { children: "Launch Notebook" })] }) }))] }))] }))] })), canShowFeedback && (_jsxs("div", { className: "legend-ai__message-feedback", children: [_jsx("span", { className: "legend-ai__message-feedback-label", children: LEGEND_AI_FEEDBACK_PROMPT }), _jsxs("div", { className: "legend-ai__message-feedback-actions", children: [_jsx("button", { type: "button", className: clsx('legend-ai__message-feedback-btn', {
201
267
  'legend-ai__message-feedback-btn--selected': selectedFeedbackRating ===
202
268
  LegendAIMessageFeedbackRating.THUMBS_UP,
203
269
  }), title: "Thumbs up", "aria-label": "Thumbs up", onClick: () => submitFeedback(LegendAIMessageFeedbackRating.THUMBS_UP), disabled: feedbackSubmitting, children: _jsx(LikeIcon, {}) }), _jsx("button", { type: "button", className: clsx('legend-ai__message-feedback-btn', {
204
270
  'legend-ai__message-feedback-btn--selected': selectedFeedbackRating ===
205
271
  LegendAIMessageFeedbackRating.THUMBS_DOWN,
206
272
  }), title: "Thumbs down", "aria-label": "Thumbs down", onClick: () => submitFeedback(LegendAIMessageFeedbackRating.THUMBS_DOWN), disabled: feedbackSubmitting, children: _jsx(DislikeIcon, {}) })] })] }))] })] }));
207
- };
273
+ });
208
274
  export const LegendAIChat = (props) => {
209
- const { services, coordinates, config, metadata, title, plugin, dataProductCoordinates, pureExecutionContext, modelContext, availableScopes, onMessageFeedback, onClose, onMinimize, onRequestAccess, contextBannerMessage, onLogTelemetryEvent, } = props;
275
+ const { services, coordinates, config, metadata, title, plugin, dataProductCoordinates, pureExecutionContext, modelContext, availableScopes, onMessageFeedback, onClose, onMinimize, onRequestAccess, onOpenInDataCube, contextBannerMessage, onLogTelemetryEvent, } = props;
210
276
  const state = useLegendAIChatState(services, coordinates, config, metadata, plugin, dataProductCoordinates, pureExecutionContext, modelContext, onLogTelemetryEvent);
211
277
  const suggestedQueries = useMemo(() => buildSuggestedQueries(services, metadata), [services, metadata]);
278
+ const overview = useMemo(() => {
279
+ const raw = modelContext?.dataspaceDescription ?? metadata.description ?? '';
280
+ const summary = raw
281
+ .split('\n')
282
+ .map((line) => line.trim())
283
+ .filter((line) => line.length > 0 && !line.startsWith('#') && !line.startsWith('|'))
284
+ .slice(0, 3)
285
+ .join(' ')
286
+ .slice(0, 300);
287
+ const entityCount = modelContext?.entities.length ?? 0;
288
+ const serviceCount = metadata.serviceSummaries.length > 0
289
+ ? metadata.serviceSummaries.length
290
+ : services.length;
291
+ return { summary, entityCount, serviceCount };
292
+ }, [modelContext, metadata, services]);
212
293
  const hasServices = services.length > 0;
213
294
  const inferSuggestedQueryIntent = useCallback((query) => classifyQuestionIntentFast(query, hasServices).intent, [hasServices]);
214
- const isDataProduct = services.some((s) => s.sourceType === TDSServiceSourceType.ACCESS_POINT);
295
+ const { isDataProduct, supportsPython, supportsDataCube } = useMemo(() => ({
296
+ isDataProduct: services.some((s) => s.sourceType === TDSServiceSourceType.ACCESS_POINT),
297
+ supportsPython: services.some((s) => plugin.supportsPythonCodegen(s)),
298
+ supportsDataCube: services.some((s) => plugin.supportsOpenInDataCube(s)),
299
+ }), [services, plugin]);
300
+ const [pythonCodeByMessageId, setPythonCodeByMessageId] = useState(new Map());
301
+ const pythonCodeByMessageIdRef = useRef(pythonCodeByMessageId);
302
+ pythonCodeByMessageIdRef.current = pythonCodeByMessageId;
303
+ const requestPythonCode = useCallback(async (msg) => {
304
+ const existing = pythonCodeByMessageIdRef.current.get(msg.id);
305
+ if (existing?.status === 'loading' || existing?.status === 'ready') {
306
+ return;
307
+ }
308
+ setPythonCodeByMessageId((prev) => {
309
+ const next = new Map(prev);
310
+ next.set(msg.id, { status: 'loading' });
311
+ return next;
312
+ });
313
+ const resolvedSet = new Set(msg.queriedAccessPoints);
314
+ const service = services.find((s) => resolvedSet.has(s.pattern.replace(/^\//u, ''))) ??
315
+ services[0];
316
+ if (!service) {
317
+ setPythonCodeByMessageId((prev) => {
318
+ const next = new Map(prev);
319
+ next.set(msg.id, { status: 'ready', code: undefined });
320
+ return next;
321
+ });
322
+ return;
323
+ }
324
+ const msgIndex = state.messages.findIndex((m) => m.id === msg.id);
325
+ const previousUser = msgIndex > 0 ? state.messages[msgIndex - 1] : undefined;
326
+ const question = previousUser?.role === LegendAIMessageRole.USER
327
+ ? previousUser.text
328
+ : undefined;
329
+ const request = {
330
+ service,
331
+ config,
332
+ ...(dataProductCoordinates ? { dataProductCoordinates } : {}),
333
+ ...(question === undefined ? {} : { question }),
334
+ ...(msg.sql === null ? {} : { sql: msg.sql }),
335
+ };
336
+ try {
337
+ const code = await plugin.generatePythonQueryCodeAsync(request);
338
+ setPythonCodeByMessageId((prev) => {
339
+ const next = new Map(prev);
340
+ next.set(msg.id, { status: 'ready', code });
341
+ return next;
342
+ });
343
+ }
344
+ catch (error) {
345
+ assertErrorThrown(error);
346
+ setPythonCodeByMessageId((prev) => {
347
+ const next = new Map(prev);
348
+ next.set(msg.id, { status: 'error', errorMessage: error.message });
349
+ return next;
350
+ });
351
+ }
352
+ }, [plugin, services, dataProductCoordinates, config, state.messages]);
353
+ const [openingDataCubeMessageIds, setOpeningDataCubeMessageIds] = useState(new Set());
354
+ // Resolves the AP, best-effort translates its SQL to a DataCube Pure query, and
355
+ // launches DataCube; on translation failure it opens on the bare access point.
356
+ const handleOpenInDataCubeMsg = useCallback(async (msg) => {
357
+ if (!onOpenInDataCube || msg.sql === null) {
358
+ return;
359
+ }
360
+ const accessPointName = msg.queriedAccessPoints[0];
361
+ if (accessPointName === undefined) {
362
+ return;
363
+ }
364
+ const service = services.find((s) => s.pattern.replace(/^\//u, '') === accessPointName) ?? services[0];
365
+ if (!service) {
366
+ return;
367
+ }
368
+ const dataProductPath = dataProductCoordinates?.data_product ?? '';
369
+ setOpeningDataCubeMessageIds((prev) => {
370
+ const next = new Set(prev);
371
+ next.add(msg.id);
372
+ return next;
373
+ });
374
+ const msgIndex = state.messages.findIndex((m) => m.id === msg.id);
375
+ const previousUser = msgIndex > 0 ? state.messages[msgIndex - 1] : undefined;
376
+ const question = previousUser?.role === LegendAIMessageRole.USER
377
+ ? previousUser.text
378
+ : undefined;
379
+ const request = {
380
+ sql: msg.sql,
381
+ service,
382
+ dataProductPath,
383
+ config,
384
+ ...(question === undefined ? {} : { question }),
385
+ };
386
+ let pureQuery;
387
+ try {
388
+ pureQuery =
389
+ await plugin.translateAccessPointSqlToDataCubeQuery(request);
390
+ }
391
+ catch (error) {
392
+ assertErrorThrown(error);
393
+ }
394
+ try {
395
+ onOpenInDataCube(accessPointName, pureQuery);
396
+ }
397
+ finally {
398
+ setOpeningDataCubeMessageIds((prev) => {
399
+ if (!prev.has(msg.id)) {
400
+ return prev;
401
+ }
402
+ const next = new Set(prev);
403
+ next.delete(msg.id);
404
+ return next;
405
+ });
406
+ }
407
+ }, [
408
+ onOpenInDataCube,
409
+ plugin,
410
+ services,
411
+ dataProductCoordinates,
412
+ config,
413
+ state.messages,
414
+ ]);
215
415
  const [showContextBanner, setShowContextBanner] = useState(true);
216
416
  const dismissBanner = useCallback(() => setShowContextBanner(false), []);
217
417
  const hasMessages = state.messages.length > 0;
218
- const scopes = isDataProduct ? [] : (availableScopes ?? DEFAULT_SCOPES);
418
+ const scopes = useMemo(() => (isDataProduct ? [] : (availableScopes ?? DEFAULT_SCOPES)), [isDataProduct, availableScopes]);
219
419
  const [feedbackByMessageId, setFeedbackByMessageId] = useState(new Map());
220
420
  const [pendingFeedbackByMessageId, setPendingFeedbackByMessageId] = useState(new Set());
221
421
  const handleMessageFeedback = useCallback(async (feedback) => {
@@ -235,7 +435,8 @@ export const LegendAIChat = (props) => {
235
435
  try {
236
436
  await onMessageFeedback(feedback);
237
437
  }
238
- catch {
438
+ catch (error) {
439
+ assertErrorThrown(error);
239
440
  setFeedbackByMessageId((prev) => {
240
441
  const next = new Map(prev);
241
442
  next.delete(feedback.messageId);
@@ -250,9 +451,22 @@ export const LegendAIChat = (props) => {
250
451
  });
251
452
  }
252
453
  }, [onMessageFeedback]);
253
- return (_jsxs("div", { className: "legend-ai", id: LEGEND_AI_ANCHOR_ID, children: [_jsxs("div", { className: "legend-ai__header", children: [_jsx("div", { className: "legend-ai__header-icon", children: _jsx(SparkleStarsIcon, {}) }), _jsx("div", { className: "legend-ai__title", children: title ?? 'Legend AI' }), _jsxs("div", { className: "legend-ai__header-actions", children: [_jsx("button", { type: "button", className: "legend-ai__header-action", title: "New chat", "aria-label": "New chat", onClick: () => state.clearChat(), children: _jsx(PlusIcon, {}) }), onMinimize && (_jsx("button", { type: "button", className: "legend-ai__header-action", title: "Minimize", "aria-label": "Minimize", onClick: onMinimize, children: _jsx(MinusIcon, {}) })), onClose && (_jsx("button", { type: "button", className: "legend-ai__header-action", title: "Close", "aria-label": "Close", onClick: onClose, children: _jsx(TimesIcon, {}) }))] })] }), showContextBanner && contextBannerMessage && (_jsx(LegendAIContextBanner, { message: contextBannerMessage, onDismiss: dismissBanner })), _jsxs("div", { className: "legend-ai__conversation", ref: state.conversationRef, children: [!hasMessages && (_jsxs("div", { className: "legend-ai__empty-state", children: [_jsx("div", { className: "legend-ai__empty-icon", children: _jsx(SparkleStarsIcon, {}) }), _jsx("div", { className: "legend-ai__empty-text", children: "Ask a question about your data" }), _jsx("div", { className: "legend-ai__suggestions", children: suggestedQueries.map((q) => (_jsx("button", { type: "button", className: "legend-ai__suggestion-chip", onClick: () => {
254
- state.askQuestionWithIntent(q, inferSuggestedQueryIntent(q));
255
- }, children: q }, q))) })] })), state.messages.map((msg, msgIndex) => {
454
+ const { toggleThinking, runFallbackAction, askQuestionWithIntent } = state;
455
+ const handleSuggestedQueryClick = useCallback((query) => askQuestionWithIntent(query, inferSuggestedQueryIntent(query)), [askQuestionWithIntent, inferSuggestedQueryIntent]);
456
+ const handleRequestPython = useCallback((message) => {
457
+ requestPythonCode(message).catch(noop);
458
+ }, [requestPythonCode]);
459
+ const handleOpenInDataCube = useCallback((message) => {
460
+ handleOpenInDataCubeMsg(message).catch(noop);
461
+ }, [handleOpenInDataCubeMsg]);
462
+ return (_jsxs("div", { className: "legend-ai", id: LEGEND_AI_ANCHOR_ID, children: [_jsxs("div", { className: "legend-ai__header", children: [_jsx("div", { className: "legend-ai__header-icon", children: _jsx(SparkleStarsIcon, {}) }), _jsx("div", { className: "legend-ai__title", children: title ?? 'Legend AI' }), _jsxs("div", { className: "legend-ai__header-actions", children: [_jsx("button", { type: "button", className: "legend-ai__header-action", title: "New chat", "aria-label": "New chat", onClick: () => state.clearChat(), children: _jsx(PlusIcon, {}) }), onMinimize && (_jsx("button", { type: "button", className: "legend-ai__header-action", title: "Minimize", "aria-label": "Minimize", onClick: onMinimize, children: _jsx(MinusIcon, {}) })), onClose && (_jsx("button", { type: "button", className: "legend-ai__header-action", title: "Close", "aria-label": "Close", onClick: () => {
463
+ onLogTelemetryEvent?.({
464
+ type: LegendAIChatTelemetryEventType.ASSISTANT_CLOSED,
465
+ });
466
+ onClose();
467
+ }, children: _jsx(TimesIcon, {}) }))] })] }), showContextBanner && contextBannerMessage && (_jsx(LegendAIContextBanner, { message: contextBannerMessage, onDismiss: dismissBanner })), _jsxs("div", { className: "legend-ai__conversation", ref: state.conversationRef, children: [!hasMessages && (_jsxs("div", { className: "legend-ai__empty-state", children: [_jsx("div", { className: "legend-ai__empty-icon", children: _jsx(SparkleStarsIcon, {}) }), _jsx("div", { className: "legend-ai__empty-text", children: "Ask a question about your data" }), overview.summary.length > 0 && (_jsx("div", { className: "legend-ai__empty-overview", children: overview.summary })), (overview.entityCount > 0 || overview.serviceCount > 0) && (_jsxs("div", { className: "legend-ai__empty-meta", children: [overview.entityCount > 0 &&
468
+ `${overview.entityCount} entit${overview.entityCount === 1 ? 'y' : 'ies'}`, overview.entityCount > 0 && overview.serviceCount > 0 && ' · ', overview.serviceCount > 0 &&
469
+ `${overview.serviceCount} service${overview.serviceCount === 1 ? '' : 's'}`] })), _jsx("div", { className: "legend-ai__suggestions", children: suggestedQueries.map((q, position) => (_jsx(SuggestionButton, { query: q, position: position, className: "legend-ai__suggestion-chip", source: LegendAISuggestedQuerySource.STARTER, onSelect: (query) => state.askQuestionWithIntent(query, inferSuggestedQueryIntent(query)), ...(onLogTelemetryEvent ? { onLogTelemetryEvent } : {}) }, q))) })] })), state.messages.map((msg, msgIndex) => {
256
470
  if (msg.role === LegendAIMessageRole.USER) {
257
471
  return (_jsx("div", { className: "legend-ai__msg legend-ai__msg--user", children: _jsx("div", { className: "legend-ai__msg-bubble", children: msg.text }) }, msg.id));
258
472
  }
@@ -261,11 +475,19 @@ export const LegendAIChat = (props) => {
261
475
  const questionText = previousMessage?.role === LegendAIMessageRole.USER
262
476
  ? previousMessage.text
263
477
  : '';
264
- return (_jsx(AssistantMessageView, { msg: msg, questionText: questionText, isThinkingVisible: isThinkingVisible, onToggleThinking: () => state.toggleThinking(msgIndex), onMessageFeedback: handleMessageFeedback, selectedFeedbackRating: feedbackByMessageId.get(msg.id), feedbackSubmitting: pendingFeedbackByMessageId.has(msg.id), ...(config.enghubDocUrl === undefined
478
+ const messagePython = pythonCodeByMessageId.get(msg.id);
479
+ return (_jsx(AssistantMessageView, { msg: msg, msgIndex: msgIndex, questionText: questionText, isThinkingVisible: isThinkingVisible, onToggleThinking: toggleThinking, onMessageFeedback: handleMessageFeedback, selectedFeedbackRating: feedbackByMessageId.get(msg.id), feedbackSubmitting: pendingFeedbackByMessageId.has(msg.id), ...(config.enghubDocUrl === undefined
265
480
  ? {}
266
481
  : { enghubDocUrl: config.enghubDocUrl }), ...(config.enthubRequestAccessUrl === undefined
267
482
  ? {}
268
- : { enthubRequestAccessUrl: config.enthubRequestAccessUrl }), ...(onRequestAccess ? { onRequestAccess } : {}), onFallbackAction: (messageId) => state.runFallbackAction(messageId), onSuggestedQueryClick: (q) => state.askQuestionWithIntent(q, inferSuggestedQueryIntent(q)) }, msg.id));
483
+ : { enthubRequestAccessUrl: config.enthubRequestAccessUrl }), ...(onRequestAccess ? { onRequestAccess } : {}), ...(messagePython ? { pythonEntry: messagePython } : {}), ...(supportsPython
484
+ ? { onRequestPython: handleRequestPython }
485
+ : {}), ...(supportsDataCube && onOpenInDataCube
486
+ ? {
487
+ onOpenInDataCube: handleOpenInDataCube,
488
+ isOpeningInDataCube: openingDataCubeMessageIds.has(msg.id),
489
+ }
490
+ : {}), onFallbackAction: runFallbackAction, onSuggestedQueryClick: handleSuggestedQueryClick, ...(onLogTelemetryEvent ? { onLogTelemetryEvent } : {}) }, msg.id));
269
491
  })] }), _jsx(LegendAIChatInput, { state: state, scopes: scopes })] }));
270
492
  };
271
493
  //# sourceMappingURL=LegendAIChat.js.map