@memberjunction/ng-dashboards 6.2.0-edge.5 → 6.2.0-edge.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 (143) hide show
  1. package/README.md +28 -0
  2. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +1 -1
  3. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  4. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +15 -7
  5. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  6. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +7 -1
  7. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  8. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +209 -57
  9. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  10. package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts +12 -11
  11. package/dist/AI/components/duplicates/duplicate-detection-run-scope.d.ts.map +1 -1
  12. package/dist/AI/components/duplicates/duplicate-detection-run-scope.js +15 -15
  13. package/dist/AI/components/duplicates/duplicate-detection-run-scope.js.map +1 -1
  14. package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
  15. package/dist/AI/components/execution-monitoring.component.js +28 -16
  16. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  17. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts +1 -0
  18. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.d.ts.map +1 -1
  19. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js +30 -6
  20. package/dist/AI/components/prompts/model-prompt-priority-matrix.component.js.map +1 -1
  21. package/dist/AI/components/tags/tags-resource.component.d.ts +1 -1
  22. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  23. package/dist/AI/components/tags/tags-resource.component.js +15 -7
  24. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  25. package/dist/AI/components/vectors/sensitive-fields.d.ts +9 -4
  26. package/dist/AI/components/vectors/sensitive-fields.d.ts.map +1 -1
  27. package/dist/AI/components/vectors/sensitive-fields.js +39 -14
  28. package/dist/AI/components/vectors/sensitive-fields.js.map +1 -1
  29. package/dist/AI/components/vectors/vector-document-rules.d.ts +13 -0
  30. package/dist/AI/components/vectors/vector-document-rules.d.ts.map +1 -1
  31. package/dist/AI/components/vectors/vector-document-rules.js +14 -0
  32. package/dist/AI/components/vectors/vector-document-rules.js.map +1 -1
  33. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +34 -14
  34. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  35. package/dist/AI/components/vectors/vector-management-resource.component.js +127 -50
  36. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  37. package/dist/AI/components/vectors/vector-store-selection.d.ts +32 -0
  38. package/dist/AI/components/vectors/vector-store-selection.d.ts.map +1 -0
  39. package/dist/AI/components/vectors/vector-store-selection.js +57 -0
  40. package/dist/AI/components/vectors/vector-store-selection.js.map +1 -0
  41. package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts +236 -0
  42. package/dist/ChiefOfStaff/chief-of-staff-agent-context.d.ts.map +1 -0
  43. package/dist/ChiefOfStaff/chief-of-staff-agent-context.js +374 -0
  44. package/dist/ChiefOfStaff/chief-of-staff-agent-context.js.map +1 -0
  45. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts +195 -0
  46. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.d.ts.map +1 -0
  47. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js +2910 -0
  48. package/dist/ChiefOfStaff/chief-of-staff-dashboard.component.js.map +1 -0
  49. package/dist/ChiefOfStaff/index.d.ts +3 -0
  50. package/dist/ChiefOfStaff/index.d.ts.map +1 -0
  51. package/dist/ChiefOfStaff/index.js +3 -0
  52. package/dist/ChiefOfStaff/index.js.map +1 -0
  53. package/dist/Communication/communication-logs-resource.component.d.ts.map +1 -1
  54. package/dist/Communication/communication-logs-resource.component.js +2 -1
  55. package/dist/Communication/communication-logs-resource.component.js.map +1 -1
  56. package/dist/Communication/communication-monitor-resource.component.d.ts.map +1 -1
  57. package/dist/Communication/communication-monitor-resource.component.js +23 -18
  58. package/dist/Communication/communication-monitor-resource.component.js.map +1 -1
  59. package/dist/Communication/communication-runs-resource.component.d.ts.map +1 -1
  60. package/dist/Communication/communication-runs-resource.component.js +11 -10
  61. package/dist/Communication/communication-runs-resource.component.js.map +1 -1
  62. package/dist/DashboardEditor/dashboard-editor.component.d.ts +17 -2
  63. package/dist/DashboardEditor/dashboard-editor.component.d.ts.map +1 -1
  64. package/dist/DashboardEditor/dashboard-editor.component.js +94 -43
  65. package/dist/DashboardEditor/dashboard-editor.component.js.map +1 -1
  66. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +24 -0
  67. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  68. package/dist/DataExplorer/data-explorer-dashboard.component.js +146 -50
  69. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  70. package/dist/DataExplorer/models/explorer-state.interface.d.ts +2 -0
  71. package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
  72. package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
  73. package/dist/LoginStudio/login-studio-resource.component.d.ts +10 -2
  74. package/dist/LoginStudio/login-studio-resource.component.d.ts.map +1 -1
  75. package/dist/LoginStudio/login-studio-resource.component.js +110 -77
  76. package/dist/LoginStudio/login-studio-resource.component.js.map +1 -1
  77. package/dist/MCP/mcp-dashboard.component.d.ts +24 -4
  78. package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
  79. package/dist/MCP/mcp-dashboard.component.js +118 -65
  80. package/dist/MCP/mcp-dashboard.component.js.map +1 -1
  81. package/dist/PredictiveStudio/business-predictions.view-models.d.ts +1 -1
  82. package/dist/PredictiveStudio/business-predictions.view-models.d.ts.map +1 -1
  83. package/dist/PredictiveStudio/business-predictions.view-models.js +3 -3
  84. package/dist/PredictiveStudio/business-predictions.view-models.js.map +1 -1
  85. package/dist/PredictiveStudio/components/ps-experiments.component.d.ts +6 -63
  86. package/dist/PredictiveStudio/components/ps-experiments.component.d.ts.map +1 -1
  87. package/dist/PredictiveStudio/components/ps-experiments.component.js +256 -521
  88. package/dist/PredictiveStudio/components/ps-experiments.component.js.map +1 -1
  89. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts +0 -18
  90. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.d.ts.map +1 -1
  91. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js +122 -249
  92. package/dist/PredictiveStudio/components/ps-pipeline-wizard.component.js.map +1 -1
  93. package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts +5 -9
  94. package/dist/PredictiveStudio/components/ps-pipelines.component.d.ts.map +1 -1
  95. package/dist/PredictiveStudio/components/ps-pipelines.component.js +98 -130
  96. package/dist/PredictiveStudio/components/ps-pipelines.component.js.map +1 -1
  97. package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts +53 -4
  98. package/dist/PredictiveStudio/components/ps-predictions-grid.component.d.ts.map +1 -1
  99. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js +335 -326
  100. package/dist/PredictiveStudio/components/ps-predictions-grid.component.js.map +1 -1
  101. package/dist/PredictiveStudio/components/ps-row-drivers.component.d.ts +19 -0
  102. package/dist/PredictiveStudio/components/ps-row-drivers.component.d.ts.map +1 -0
  103. package/dist/PredictiveStudio/components/ps-row-drivers.component.js +85 -0
  104. package/dist/PredictiveStudio/components/ps-row-drivers.component.js.map +1 -0
  105. package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts +19 -1
  106. package/dist/PredictiveStudio/engine/predictive-studio.engine.d.ts.map +1 -1
  107. package/dist/PredictiveStudio/engine/predictive-studio.engine.js +51 -2
  108. package/dist/PredictiveStudio/engine/predictive-studio.engine.js.map +1 -1
  109. package/dist/PredictiveStudio/predictive-studio-agent-context.d.ts +3 -1
  110. package/dist/PredictiveStudio/predictive-studio-agent-context.d.ts.map +1 -1
  111. package/dist/PredictiveStudio/predictive-studio-agent-context.js +3 -0
  112. package/dist/PredictiveStudio/predictive-studio-agent-context.js.map +1 -1
  113. package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts +27 -4
  114. package/dist/PredictiveStudio/predictive-studio-score-history.service.d.ts.map +1 -1
  115. package/dist/PredictiveStudio/predictive-studio-score-history.service.js +94 -61
  116. package/dist/PredictiveStudio/predictive-studio-score-history.service.js.map +1 -1
  117. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts +29 -5
  118. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.d.ts.map +1 -1
  119. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js +185 -103
  120. package/dist/PredictiveStudio/resources/ps-predictions-resource.component.js.map +1 -1
  121. package/dist/PredictiveStudio/resources/ps-studio-resource.component.js +1 -1
  122. package/dist/PredictiveStudio/resources/ps-studio-resource.component.js.map +1 -1
  123. package/dist/ai-dashboards.module.d.ts +22 -21
  124. package/dist/ai-dashboards.module.d.ts.map +1 -1
  125. package/dist/ai-dashboards.module.js +8 -2
  126. package/dist/ai-dashboards.module.js.map +1 -1
  127. package/dist/public-api.d.ts +2 -0
  128. package/dist/public-api.d.ts.map +1 -1
  129. package/dist/public-api.js +3 -0
  130. package/dist/public-api.js.map +1 -1
  131. package/package.json +71 -71
  132. package/dist/PredictiveStudio/at-risk.view-models.d.ts +0 -120
  133. package/dist/PredictiveStudio/at-risk.view-models.d.ts.map +0 -1
  134. package/dist/PredictiveStudio/at-risk.view-models.js +0 -261
  135. package/dist/PredictiveStudio/at-risk.view-models.js.map +0 -1
  136. package/dist/PredictiveStudio/components/ps-confirm-modal.component.d.ts +0 -109
  137. package/dist/PredictiveStudio/components/ps-confirm-modal.component.d.ts.map +0 -1
  138. package/dist/PredictiveStudio/components/ps-confirm-modal.component.js +0 -323
  139. package/dist/PredictiveStudio/components/ps-confirm-modal.component.js.map +0 -1
  140. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts +0 -137
  141. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.d.ts.map +0 -1
  142. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js +0 -826
  143. package/dist/PredictiveStudio/components/ps-run-experiment-modal.component.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ps-predictions-resource.component.js","sourceRoot":"","sources":["../../../src/PredictiveStudio/resources/ps-predictions-resource.component.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAY,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAwB,2BAA2B,EAA+E,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/L,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAA+B,MAAM,qCAAqC,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAkB,MAAM,wBAAwB,CAAC;AAC5G,OAAO,EAAE,4BAA4B,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AACzH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAyB,MAAM,0CAA0C,CAAC;;;;;;;mBAkGnG,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC;;;;;IA5EtB,iCAAuG;IAA1B,kMAAS,sBAAe,KAAC;IACpG,uBAAgC;IAAC,gCACnC;IAAA,iBAAS;;;IAMX,gCAAwE;;;;IAExE,8BAAoE;IAClE,wBAAgD;IAE9C,AADF,+BAAgC,aACtB;IAAA,YAAgC;IAAA,iBAAS;IACjD,gCAAmC;IAAA,YAAe;IACpD,AADoD,iBAAO,EACrD;IACN,kCAAqE;IAAtB,kMAAS,kBAAW,KAAC;IAAC,wBAAwC;IAAC,0BAAS;IACzH,AADyH,iBAAS,EAC5H;;;IAJM,eAAgC;IAAhC,4DAAgC;IACL,eAAe;IAAf,sCAAe;;;IAoBpC,+BAAyB;IACvB,oBAA0B;IAC1B,+BAA0B;IAAA,YAAe;IAAA,iBAAM;IAC/C,+BAA0B;IAAA,YAAe;IAC3C,AAD2C,iBAAM,EAC3C;;;IAHD,cAAkB;IAAlB,0BAAkB;IACK,eAAe;IAAf,kCAAe;IACf,eAAe;IAAf,kCAAe;;;;IAV/C,AADF,+BAA6D,cAC5B;IAC7B,wBAA+C;IAC/C,0BAAI;IAAA,iDAAiC;IAAA,iBAAK;IAC1C,yBAAG;IAAA,qMAAgL;IACrL,AADqL,iBAAI,EACnL;IACN,+BAAyB;IACvB,4IAMC;IACH,iBAAM;IACN,mCAAoG;IAA1B,gOAAS,sBAAe,KAAC;IAAC,wBAAgC;IAAC,6CAA2B;IAClK,AADkK,iBAAS,EACrK;;;IATF,eAMC;IAND,qCAMC;;;;IAiBK,kCAAkG;IAAlB,+RAAS,iBAAO,KAAC;IAAC,qBAAK;IAAA,wBAAuC;IAAA,iBAAS;;;;IAEvJ,kCAAkH;IAA/B,+RAAS,8BAAoB,KAAC;IAAC,wBAA+C;IAAC,6BAAY;IAAA,iBAAS;;;IAVzL,AADF,AADF,+BAAuF,cACxD,eACgF;IACzG,wBAAyC;IAAC,YAC5C;IACF,AADE,iBAAO,EACH;IACN,8BAA8B;IAAA,YAAa;IAAA,iBAAK;IAChD,6BAA4B;IAAA,YAAoD;IAAA,iBAAI;IACpF,+BAA8B;IAG1B,AAFF,sJAAiB,gIAER;IAIb,AADE,iBAAM,EACF;;;IAfmB,wCAA4B;IAEpB,eAAgD;IAAhD,wDAAgD;IACjC,eAC5C;IAD4C,8EAC5C;IAE4B,eAAa;IAAb,gCAAa;IACf,eAAoD;IAApD,6EAAoD;IAE9E,eAIC;IAJD,wCAIC;;;IAfT,+BAA2D;IACzD,6IAiBC;IACH,iBAAM;;;IAlBJ,cAiBC;IAjBD,2BAiBC;;;IAnBH,AAlBF,8HAA0B,uGAkBjB;;;IAlBT,mDAuCC;;;IAYsC,wBAAiE;;;;IAArC,2DAAgC;;;IAe5D,gCAA6B;IAAA,YAAO;IAAA,iBAAO;;;IAAd,cAAO;IAAP,2BAAO;;;IAFrE,+BAAiD;IAC/C,wBAAqC;IAAC,8BAAQ;IAAA,oCAAoB;IAAA,iBAAS;IAC3E,8KAA4E;IAC9E,iBAAM;;;IADJ,eAA4E;IAA5E,6BAA4E;;;IAHhF,4IAA0B;IAM1B,6CASsB;;;IAftB,oDAKC;IAIC,cAA4B;IAI5B,AADA,AADA,AADA,AADA,iDAA4B,6BACP,gCACG,+CACe,2CACJ;;;;IAMnC,kCAAkG;IAAzB,iOAAS,qBAAc,KAAC;IAAC,wBAAsC;IAAC,qCAAoB;IAAA,iBAAS;IACtK,kCAAwK;IAA/F,iOAAS,kBAAW,wEAAwE,CAAC,KAAC;IAAC,wBAAuC;IAAC,uCAAsB;IAAA,iBAAS;IAC/O,kCAAqJ;IAAvB,iOAAS,mBAAY,KAAC;IAAC,wBAAgI;IAAC,+BAAc;IAAA,iBAAS;IAC7S,kCAAuI;IAAvB,iOAAS,mBAAY,KAAC;IAAC,yBAAuC;IAAC,gCAAc;IAAA,iBAAS;;;IAD7H,eAAoD;IAApD,gFAAoD;IAA4C,cAAsC;IAAmC,AAAlC,AAAvC,sDAAsC,mCAAkC,gCAA+B;IACrM,eAAoC;IAApC,yDAAoC;;;IAE/G,+BAA8B;IAAA,wBAAgC;IAAC,YAA+B;IAAA,iBAAM;;;IAArC,eAA+B;IAA/B,4DAA+B;;;IAG/E,+BAA+D;IAAA,YAAgB;IAAA,iBAAM;;;IAAtB,cAAgB;IAAhB,uCAAgB;;;;IA7ClG,AADF,+BAA0B,YACiC;IAAtD,6MAAS,sBAAe,KAAC;IAA6B,2BAAW;IAAA,iBAAI;IACxE,wBAAyC;IAAC,4BAAM;IAAA,YAAoB;IACtE,AADsE,iBAAO,EACvE;IAGJ,AADF,+BAAmH,cACtF;IACzB,8IAAsG;IACxG,iBAAM;IAEJ,AADF,gCAA2B,eACG;IAAA,aAA8F;IAAA,iBAAM;IAChI,gCAA2B;IAAA,aAA6B;IAAA,iBAAM;IAC9D,gCAAoC;IAAA,aAAgC;IAAA,iBAAM;IAC1E,gCAAqC;IAAA,aAAgB;IAEzD,AADE,AADuD,iBAAM,EACvD,EACF;IAEN,gCAAmE;IACjE,oHAAwB;IAkBxB,gCAA0F;IAMtF,AALF,qHAAwB,yGAKf;IAGX,iBAAM;IACN,+HAAkB;IACpB,iBAAM;;;IA7C4C,eAAoB;IAApB,2CAAoB;IAGzC,cAAuD;IAAvD,mEAAuD;IAEhF,eAAsG;IAAtG,0CAAsG;IAG1E,eAA8F;IAA9F,iIAA8F;IAC/F,eAA6B;IAA7B,oDAA6B;IACpB,eAAgC;IAAhC,uDAAgC;IAC/B,eAAgB;IAAhB,uCAAgB;IAKvD,eAiBC;IAjBD,mDAiBC;IAC0B,cAAkC;IAAlC,kDAAkC;IAC3D,cAOC;IAPD,mDAOC;IAEH,eAA0G;IAA1G,6CAA0G;;;;IAexG,qDAS4D;IAA1D,AADA,qRAAuB,wCAAiC,KAAC,wQAC/B,qCAA8B,KAAC;IAC3D,iBAA4B;;;IAHyC,AAAhC,AAAnC,AADmC,AAAnC,AAD0B,AAA1B,AADqD,AAA1B,AAA3B,AADmE,AAAxB,AAA3C,AADwE,AAAtC,AAAlC,AAD0D,AAApC,AAAtB,0CAAqB,2CAAoC,mCAA4B,yCACpD,6CAAsC,mDAA4C,2CACzE,wBAAwB,qBAAqB,2BAC7D,0BAA0B,gCAAgC,0BAC3D,8BAA8B,0CACrB,wCAAiC,mCACjC,uCAAgC,qCAA8B;;;IAI1F,+BAAkC;IAAA,iCAAyD;IAAA,iBAAM;;;;IAhB3G,AADF,AADF,AADF,yCAAqE,gBACA,cAChC,cACG;IAAA,wBAAiC;IAAC,+BAAc;IAAA,iBAAM;IACxF,kCAA8E;IAAzC,kNAAS,kBAAW,KAAC;IAAoB,wBAAiC;IACjH,AADiH,iBAAS,EACpH;IACN,+BAAiC;IAa7B,AAZF,oJAAmB,yGAYV;IAGf,AADE,AADE,iBAAM,EACA,EACM;;;IAtBsC,AAAf,AAAxB,4CAAuB,eAAe,eAAe;IAO9D,eAY6G;IAZ7G,6CAY6G;;;;IAzHvH,AADF,+BAAsD,mBACyG;IAAhD,8MAAW,0CAAmC,KAAC;IAExJ,AADF,yCAAoE,cACzC;IAEvB,oGAA0B;IA4C1B,sGAAwC;IAmD5C,AADE,iBAAM,EACQ;IAEhB,0HAAgB;IA0BpB,AADE,iBAAW,EACP;;;IAhImB,4CAA4B;IAC0B,cAA+B;IAA/B,oDAA+B;IAC3F,cAAqC;IAAC,AAAtC,iEAAqC,eAAe;IAG/D,eAyCC;IAzCD,oDAyCC;IAGD,cAiDC;IAjDD,yEAiDC;IAIL,cAwBC;IAxBD,0CAwBC;;AArKb,MAAM,wBAAwB,GAAG,sCAAsC,CAAC;AACxE,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;AAEvD;;;;;;GAMG;AAoQI,IAAM,8BAA8B,GAApC,MAAM,8BAA+B,SAAQ,cAAc;IAC7C,UAAU,GAAG,aAAa,CAAC;IAC3B,YAAY,GAAG,aAAa,CAAC;IAC7B,WAAW,GAAG,iCAAiC,CAAC;IAElD,QAAQ,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEtD,mEAAmE;IAC5D,IAAI,GAA4B,SAAS,CAAC;IAEjD,oCAAoC;IACpC,IAAW,IAAI;QACb,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IACD,oCAAoC;IACpC,IAAW,IAAI,CAAC,KAA8B;QAC5C,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IACpB,CAAC;IACM,QAAQ,GAAkC,IAAI,CAAC;IAEtD,wCAAwC;IACxC,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAoC;QACtD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IACM,QAAQ,GAAG,KAAK,CAAC;IAExB,wCAAwC;IACxC,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IACD,wCAAwC;IACxC,IAAW,QAAQ,CAAC,KAAK;QACvB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IACxB,CAAC;IACM,aAAa,GAAkB,IAAI,CAAC;IAE3C,6CAA6C;IAC7C,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,6CAA6C;IAC7C,IAAW,aAAa,CAAC,KAAoB;QAC3C,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IACO,gBAAgB,GAAkB,IAAI,CAAC;IAE/C;;;;;;OAMG;IACI,gBAAgB,GAAgC,IAAI,CAAC;IAE5D,gDAAgD;IAChD,IAAW,gBAAgB;QACzB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IACD,gDAAgD;IAChD,IAAW,gBAAgB,CAAC,KAAkC;QAC5D,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IACM,kBAAkB,GAAkB,IAAI,CAAC;IAEhD,kDAAkD;IAClD,IAAW,kBAAkB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IACD,kDAAkD;IAClD,IAAW,kBAAkB,CAAC,KAAoB;QAChD,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAClC,CAAC;IACM,qBAAqB,GAAG,IAAI,CAAC;IAEpC,qDAAqD;IACrD,IAAW,qBAAqB;QAC9B,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACpC,CAAC;IACD,qDAAqD;IACrD,IAAW,qBAAqB,CAAC,KAAK;QACpC,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;IACrC,CAAC;IACM,WAAW,GAAG,EAAE,CAAC;IAExB,2CAA2C;IAC3C,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAK;QAC1B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IACM,cAAc,GAAG,EAAE,CAAC;IAE3B,8CAA8C;IAC9C,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IACD,8CAA8C;IAC9C,IAAW,cAAc,CAAC,KAAK;QAC7B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAEQ,QAAQ;QACf,KAAK,CAAC,QAAQ,EAAE,CAAC;QACjB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEM,qBAAqB,CAAC,KAAgC;QAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC/G,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;IACH,CAAC;IAED,qDAAqD;IAC9C,qBAAqB,CAAC,KAAgC;QAC3D,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEO,eAAe;QACrB,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,UAAU,CAAC,wCAAwC,CAAC,CAAC;QAC3F,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACjC,IAAI,OAAO,MAAM,CAAC,cAAc,KAAK,QAAQ,IAAI,MAAM,CAAC,cAAc,IAAI,EAAE,IAAI,MAAM,CAAC,cAAc,IAAI,EAAE,EAAE,CAAC;oBAC5G,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;oBAC5C,IAAI,CAAC,WAAW,GAAG,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC;gBAC/C,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,eAAe;QACrB,MAAM,KAAK,GAAG;YACZ,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;QACF,cAAc,CAAC,QAAQ,CAAC,mBAAmB,CAAC,wCAAwC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/G,CAAC;IAED,2GAA2G;IACpG,UAAU,GAAgB,EAAE,CAAC;IAEpC,0CAA0C;IAC1C,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAkB;QACtC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IACD,wGAAwG;IACjG,OAAO,GAAa,EAAE,CAAC;IAE9B,uCAAuC;IACvC,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IACD,uCAAuC;IACvC,IAAW,OAAO,CAAC,KAAe;QAChC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IACD,mEAAmE;IAC5D,aAAa,GAAG,KAAK,CAAC;IAE7B,6CAA6C;IAC7C,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IACD,6CAA6C;IAC7C,IAAW,aAAa,CAAC,KAAK;QAC5B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;IAC7B,CAAC;IACD,kJAAkJ;IAC3I,WAAW,GAAkB,IAAI,CAAC;IAEzC,2CAA2C;IAC3C,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAoB;QACzC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IACD,sEAAsE;IAC/D,YAAY,GAAG,KAAK,CAAC;IAE5B,4CAA4C;IAC5C,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IACD,4CAA4C;IAC5C,IAAW,YAAY,CAAC,KAAK;QAC3B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IACM,UAAU,GAAkB,IAAI,CAAC;IAExC,0CAA0C;IAC1C,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IACD,0CAA0C;IAC1C,IAAW,UAAU,CAAC,KAAoB;QACxC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IACM,WAAW,GAAkB,IAAI,CAAC;IAEzC,2CAA2C;IAC3C,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IACD,2CAA2C;IAC3C,IAAW,WAAW,CAAC,KAAoB;QACzC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,kGAAkG;IAClF,eAAe,GAAgC,mBAAmB,CAAC;IAEnF,+CAA+C;IAC/C,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,sGAAsG;IACtG,IAAW,KAAK;QACd,OAAO,oBAAoB,CACzB,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAkB,EAAE,EAAE,CAAC,CAAC;YACvD,OAAO,EAAE,CAAC,CAAC,EAAE;YACb,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACrC,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,SAAS,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI;SACpC,CAAC,CAAC,CACJ,CAAC;IACJ,CAAC;IAED,qCAAqC;IACrC,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAEM,IAAI,CAAC,CAAyB,IAAY,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnF,oCAAoC;IAC7B,IAAI,CAAC,CAAyB;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IACM,QAAQ,KAAa,OAAO,iBAAiB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;IAE5E,wCAAwC;IACjC,QAAQ;QACb,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED,iIAAiI;IAC9G,iBAAiB;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,OAAO,4BAA4B,CAAC;YAClC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,eAAe,EAAE,KAAK,CAAC,MAAM;YAC7B,oBAAoB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM;YAC3D,sBAAsB,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YACjD,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI;YACrI,YAAY,EAAE,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,WAAW;YACnF,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;YACnC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,MAAM;YACtE,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,MAAM;YAC1E,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,MAAM;YACpE,OAAO,EAAE,IAAI,CAAC,OAAO;SACtB,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACgB,kBAAkB;QACnC,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,IAAI,EAAE;YAC/C;gBACE,IAAI,EAAE,gBAAgB;gBACtB,WAAW,EACT,4MAA4M;gBAC9M,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mCAAmC,EAAE,EAAE,EAAE;gBACrI,OAAO,EAAE,KAAK,EAAE,MAA+B,EAAE,EAAE;oBACjD,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;oBACtE,IAAI,CAAC,KAAK,CAAC,EAAE;wBAAE,OAAO,KAAK,CAAC,MAAM,CAAC;oBACnC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;oBAC7E,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;oBACvD,IAAI,CAAC,KAAK;wBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,CAAC;oBACjH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;oBACrE,IAAI,CAAC,IAAI;wBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,oBAAoB,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,CAAC;oBAChH,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;wBAClB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,IAAI,CAAC,KAAK,0BAA0B,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,IAAI,4BAA4B,EAAE,EAAE,CAAC;oBACjK,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAChB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;gBAClF,CAAC;aACF;YACD;gBACE,IAAI,EAAE,yBAAyB;gBAC/B,WAAW,EAAE,kFAAkF;gBAC/F,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;gBACnD,OAAO,EAAE,KAAK,IAAI,EAAE;oBAClB,IAAI,CAAC,aAAa,EAAE,CAAC;oBACrB,IAAI,CAAC,mBAAmB,EAAE,CAAC;oBAC3B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;gBACtD,CAAC;aACF;YACD;gBACE,IAAI,EAAE,gBAAgB;gBACtB,WAAW,EAAE,oHAAoH;gBACjI,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;gBACnD,OAAO,EAAE,KAAK,IAAI,EAAE;oBAClB,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,QAAQ;wBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,kDAAkD,EAAE,CAAC;oBAC7I,IAAI,CAAC,YAAY,EAAE,CAAC;oBACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;gBAC3B,CAAC;aACF;YACD;gBACE,IAAI,EAAE,kBAAkB;gBACxB,WAAW,EAAE,yIAAyI;gBACtJ,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;gBACnD,OAAO,EAAE,KAAK,IAAI,EAAE;oBAClB,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,4EAA4E,EAAE,CAAC;oBACrL,IAAI,CAAC,UAAU,EAAE,CAAC;oBAClB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;gBACnE,CAAC;aACF;YACD;gBACE,IAAI,EAAE,0BAA0B;gBAChC,WAAW,EAAE,+KAA+K;gBAC5L,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;gBACnD,OAAO,EAAE,KAAK,IAAI,EAAE;oBAClB,IAAI,CAAC,wBAAwB,EAAE,CAAC;oBAChC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC;gBACrD,CAAC;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAEM,IAAI,CAAC,CAAyB;QACnC,IAAI,CAAC,CAAC,CAAC,OAAO;YAAE,OAAO;QACvB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,mGAAmG;QACnG,qGAAqG;QACrG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,oCAAoC;IAC7B,IAAI,CAAC,CAAyB;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,CAAC;IAED,gGAAgG;IACxF,KAAK,CAAC,UAAU,CAAC,CAAyB;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACnF,IAAI,CAAC,OAAO,GAAG,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC;YACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,IAAI,SAAS,CAAC;YAC/C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;YACjG,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,CAAC,WAAW,GAAG,MAAM,EAAE,EAAE,IAAI,IAAI,CAAC;YACtC,IAAI,MAAM,EAAE,EAAE,EAAE,CAAC;gBACf,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAC9D,EAAE,UAAU,EAAE,yBAAyB,EAAE,WAAW,EAAE,iBAAiB,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,EACjI,IAAI,CACL,CAAC;gBACF,IAAI,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,OAAO,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;oBACxD,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC9H,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBACxC,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,WAAW,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACpE,QAAQ,CAAC,qCAAqC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACpE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAED,4GAA4G;IACrG,WAAW;QAChB,IAAI,IAAI,CAAC,QAAQ;YAAE,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED,2CAA2C;IACpC,WAAW;QAChB,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;IAC5B,CAAC;IAED;;;;OAIG;IACH,IAAW,wBAAwB;QACjC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAChG,OAAO,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;IACxD,CAAC;IAED,wDAAwD;IACxD,IAAW,wBAAwB;QACjC,OAAO,IAAI,CAAC,wBAAwB,CAAC;IACvC,CAAC;IAED,IAAW,mBAAmB;QAC5B,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAChG,OAAO,KAAK,EAAE,WAAW,IAAI,IAAI,CAAC;IACpC,CAAC;IAED,mDAAmD;IACnD,IAAW,mBAAmB;QAC5B,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAEO,oBAAoB,CAAC,KAAkC;QAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7G,MAAM,EAAE,GAAG,QAAQ,EAAE,cAAc,CAAC;QACpC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC;QACjF,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACpC,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,KAAkC;QAClE,4FAA4F;QAC5F,wEAAwE;QACxE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YACpD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB,mGAAmG;YACnG,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,mCAAmC;YAClF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC3C,gGAAgG;YAChG,iGAAiG;YACjG,kFAAkF;YAClF,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAC9D,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAClH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CACxE;gBACE,UAAU,EAAE,MAAM,CAAC,IAAI;gBACvB,WAAW,EAAE,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC;gBAC7C,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3E,UAAU,EAAE,QAAQ;gBACpB,OAAO,EAAE,GAAG,CAAC,MAAM;aACpB,EACD,IAAI,CAAC,aAAa,CAAC,WAAW,IAAI,SAAS,CAC5C,CAAC;YACF,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,OAAO;YACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAmC,CAAC;YACxD,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE;gBAAE,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,YAAY,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,mBAAmB,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACpI,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAChD,IAAI,GAAG;oBAAE,CAAC,CAAC,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,0EAA0E,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACzI,CAAC;IACH,CAAC;IAEM,aAAa;QAClB,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC;IAED,6CAA6C;IACtC,aAAa;QAClB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;IAED,yEAAyE;IAClE,YAAY;QACjB,QAAQ,CAAC,aAAa,CAAC,gCAAgC,CAAC,EAAE,cAAc,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACnH,CAAC;IAED,4CAA4C;IACrC,YAAY;QACjB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IAED,iHAAiH;IAC1G,UAAU,CAAC,MAAc;QAC9B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,KAAK,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC;IAED,0CAA0C;IACnC,UAAU,CAAC,MAAc;QAC9B,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,UAAU;QACrB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAChF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,QAAS,CAAC,OAAO,CAAC,CAAC,CAAC;QAChG,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG,MAAM,EAAE,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;YAC7B,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,IAAI,SAAS,CAAC;YACxC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,eAAe,CAAe,WAAW,EAAE,IAAI,CAAC,CAAC;YACtE,gGAAgG;YAChG,IAAI,CAAC,IAAI,GAAG,YAAY,IAAI,CAAC,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;YAC3G,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACzB,IAAI,IAAI,EAAE,EAAE;gBAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;YAC9B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,UAAU,GAAG,6BAA6B,IAAI,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,EAAE,CAAC;gBACvG,OAAO;YACT,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC9E,IAAI,GAAG,GAAG,CAAC,CAAC;YACZ,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,IAAI,YAAY,GAAkB,IAAI,CAAC;YACvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,eAAe,CAAqB,kBAAkB,EAAE,IAAI,CAAC,CAAC;gBACjF,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;gBACpB,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;gBACzB,EAAE,CAAC,QAAQ,GAAG,GAAG,EAAE,CAAC;gBACpB,EAAE,CAAC,MAAM,GAAG,QAAQ,CAAC;gBACrB,IAAI,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;oBACpB,KAAK,EAAE,CAAC;gBACV,CAAC;qBAAM,IAAI,CAAC,YAAY,EAAE,CAAC;oBACzB,YAAY,GAAG,EAAE,CAAC,YAAY,EAAE,eAAe,IAAI,eAAe,CAAC;gBACrE,CAAC;YACH,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC;YACtC,IAAI,CAAC,UAAU;gBACb,MAAM,KAAK,CAAC;oBACV,CAAC,CAAC,SAAS,KAAK,kBAAkB,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,CAAC,IAAI,IAAI;oBAC7E,CAAC,CAAC,SAAS,KAAK,OAAO,OAAO,CAAC,MAAM,gBAAgB,IAAI,CAAC,IAAI,OAAO,MAAM,gCAAgC,YAAY,IAAI,CAAC;YAChI,IAAI,MAAM,GAAG,CAAC;gBAAE,QAAQ,CAAC,qCAAqC,MAAM,IAAI,OAAO,CAAC,MAAM,wBAAwB,YAAY,EAAE,CAAC,CAAC;QAChI,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,UAAU,GAAG,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAClG,QAAQ,CAAC,qCAAqC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpG,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAED,0CAA0C;IACnC,KAAK,CAAC,UAAU;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACK,OAAO,CAAC,KAAa;QAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7D,OAAO,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;IACjF,CAAC;IAED,+EAA+E;IACxE,UAAU;QACf,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACzC,MAAM,GAAG,GAAG;YACV,+BAA+B;YAC/B,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;SACpH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC;QACb,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,YAAY,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,CAAC;QAChH,CAAC,CAAC,KAAK,EAAE,CAAC;QACV,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,0CAA0C;IACnC,UAAU;QACf,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;IAED,0IAA0I;IACnI,aAAa;QAClB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,KAAK,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACxC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC;IAED,6CAA6C;IACtC,aAAa;QAClB,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACI,iBAAiB,CAAC,CAAyB;QAChD,IAAI,CAAC,aAAa,GAAG,kBAAkB,CAAC;YACtC,IAAI,EAAE,CAAC,CAAC,KAAK;YACb,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,KAAK;YACzB,MAAM,EAAE,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,KAAK,CAAC,UAAU,IAAI,IAAI;SACtD,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,KAAK,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACxC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC;IAED,iDAAiD;IAC1C,iBAAiB,CAAC,CAAyB;QAChD,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,uHAAuH;IAChH,wBAAwB;QAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,KAAK,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACxC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC;IAED,wDAAwD;IACjD,wBAAwB;QAC7B,OAAO,IAAI,CAAC,wBAAwB,EAAE,CAAC;IACzC,CAAC;IAEM,SAAS;QACd,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC;IAED,yCAAyC;IAClC,SAAS;QACd,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACI,yBAAyB,CAAC,KAAsE;QACrG,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,cAAc,IAAI,IAAI,CAAC;QAClD,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,YAAY,CAAC;QAC3C,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC;IAED,yDAAyD;IAClD,yBAAyB,CAAC,KAAsE;QACrG,OAAO,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,qGAAqG;IAC9F,4BAA4B;QACjC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC;IAED,4DAA4D;IACrD,4BAA4B;QACjC,OAAO,IAAI,CAAC,4BAA4B,EAAE,CAAC;IAC7C,CAAC;IAED,IAAW,WAAW,KAAsB,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC;IAE5F,2CAA2C;IAC3C,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IACD,IAAW,iBAAiB;QAC1B,OAAQ,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,eAAe,CAAwB,IAAI,2BAA2B,CAAC,oBAAoB,CAAC;IACjI,CAAC;IAED,iDAAiD;IACjD,IAAW,iBAAiB;QAC1B,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IACD,IAAW,aAAa,KAAoB,OAAQ,IAAI,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,eAAe,CAAwB,IAAI,IAAI,CAAC,CAAC,CAAC;IACjI,IAAW,eAAe,KAAoB,OAAO,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAE7E,+CAA+C;IAC/C,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IACD,IAAW,cAAc;QACvB,OAAO,EAAE,GAAG,EAAE,mBAAmB,EAAE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC;IACnH,CAAC;IAED,8CAA8C;IAC9C,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,2BAA2B;QACvC,IAAI,IAAI,CAAC,gBAAgB;YAAE,OAAO;QAClC,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;YACvF,IAAI,CAAC,gBAAgB;gBACnB,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,oBAAoB,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC;YAC7H,IAAI,CAAC,IAAI,CAAC,gBAAgB;gBAAE,QAAQ,CAAC,2BAA2B,oBAAoB,gDAAgD,CAAC,CAAC;YACtI,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAChC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,sDAAsD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrH,CAAC;IACH,CAAC;qSApvBU,8BAA8B,yBAA9B,8BAA8B;6DAA9B,8BAA8B;YA3PrC,AAHF,kDAEiJ,aAClI;YACX,mGAA0B;YAM9B,AADE,iBAAM,EACkB;YAC1B,gDAAuD;YAYnD,AATA,AAFF,uGAAiB,2EAEO,0EASf;YAmIX,iBAAwB;;YAxJtB,AADA,qIAAkF,mJAC4D;YAE5I,eAIC;YAJD,iDAIC;YAGkB,cAAa;YAAC,AAAd,2BAAa,kBAAkB;YACpD,cA6IC;YA7ID,2DA6IC;;;AAqGM,8BAA8B;IAnQ1C,aAAa,CAAC,qBAAqB,EAAE,qCAAqC,CAAC;GAmQ/D,8BAA8B,CAqvB1C;;iFArvBY,8BAA8B;cAlQ1C,SAAS;6BACI,KAAK,YACP,4BAA4B,YAC5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4JT,mBAiGgB,uBAAuB,CAAC,MAAM;;kFAEpC,8BAA8B;AAuvB3C,wGAAwG;AACxG,MAAM,UAAU,yBAAyB;IACvC,sBAAsB;AACxB,CAAC","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject } from '@angular/core';\nimport { NormalizeUUID, RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { CompositeKey, LogError, RunView, UserInfo } from '@memberjunction/core';\nimport { MJConversationEntity, MJEnvironmentEntityExtended, MJMLModelEntity, MJProcessRunDetailEntity, MJListEntity, MJListDetailEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { trustDots, trustEvidenceLine } from '@memberjunction/predictive-studio-core';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { PSResourceBase } from './ps-resource-base';\nimport { buildBusinessCatalog, type BusinessPredictionCard } from '../business-predictions.view-models';\nimport { ParseAtRiskRows, TopGlobalDrivers, LabelFromRecord, type AtRiskRow } from '../at-risk.view-models';\nimport { buildPredictionsAgentContext, resolvePSRecord, buildPSNotFoundError } from '../predictive-studio-agent-context';\nimport { validateStringParam } from '../../shared/agent-tool-validation';\nimport { BuildRecordIdFilter } from '../../shared/record-id-filter';\nimport { buildImprovePrompt, PS_CAPABILITY_CARDS, type PSCapabilityCard } from '../predictive-studio-copilot.view-models';\n\nconst PREDICTIVE_STUDIO_APP_ID = '299C9272-8D38-40CA-85D4-0980F2C9FAD1';\nconst MODEL_DEV_AGENT_NAME = 'Model Development Agent';\n\n/**\n * **Predictions** — the business-user home for Predictive Studio (`option-b-refined` mockup). Reframes\n * published ML models as plain-language \"predictions\" in a catalog, each with a trust badge; opening one\n * goes to a workspace whose trust verdict GATES the actions (a Poor/unmeasured prediction can't be acted\n * on). \"+ New prediction\" opens the Model Development Agent (the deterministic builder) as a docked\n * co-pilot. Zero ML jargon — the analyst surfaces stay under the other nav items as \"Advanced\".\n */\n@RegisterClass(BaseResourceComponent, 'PredictiveStudioPredictionsResource')\n@Component({\n standalone: false,\n selector: 'mj-ps-predictions-resource',\n template: `\n <mj-page-header-interior\n [Title]=\"view === 'workspace' ? (selected?.title ?? 'Prediction') : 'Predictions'\"\n [Subtitle]=\"view === 'workspace' ? 'Who to focus on, how much to trust it, and what to do next' : 'Ready-to-use predictions for your records'\">\n <div actions>\n @if (view === 'catalog') {\n <button mjButton variant=\"primary\" size=\"sm\" data-testid=\"ps-new-prediction\" (click)=\"newPrediction()\">\n <i class=\"fa-solid fa-plus\"></i> New prediction\n </button>\n }\n </div>\n </mj-page-header-interior>\n <mj-page-body-interior [Flex]=\"true\" [Padding]=\"false\">\n @if (isLoading) {\n <mj-loading text=\"Loading your predictions…\" size=\"medium\"></mj-loading>\n } @else if (loadError) {\n <div class=\"ps-load-error\" data-testid=\"ps-load-error\" role=\"alert\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div class=\"ps-load-error-text\">\n <strong>Couldn't load {{ sectionTitle }}</strong>\n <span class=\"ps-load-error-detail\">{{ loadError }}</span>\n </div>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"retryLoad()\"><i class=\"fa-solid fa-rotate-right\"></i> Try again</button>\n </div>\n } @else {\n <div class=\"ps-biz-host\" [class.chat-open]=\"chatOpen\">\n <as-split direction=\"horizontal\" class=\"biz-copilot-splitter\" unit=\"percent\" [gutterSize]=\"chatOpen ? 6 : 0\" (dragEnd)=\"onCopilotSplitDragEnd($event.sizes)\">\n <as-split-area [size]=\"chatOpen ? mainSizePct : 100\" [minSize]=\"30\">\n <div class=\"ps-biz-main\">\n <!-- ───────── CATALOG ───────── -->\n @if (view === 'catalog') {\n @if (cards.length === 0) {\n <div class=\"ps-biz-intro\" data-testid=\"ps-predictions-empty\">\n <div class=\"ps-biz-intro-head\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <h2>Predict what's next for your data</h2>\n <p>Predictive Studio turns your records into plain-language predictions — describe what you want to know, and the agent builds and trains a model with you. Here's what you can do:</p>\n </div>\n <div class=\"ps-cap-grid\">\n @for (cap of capabilityCards; track cap.title) {\n <div class=\"ps-cap-card\">\n <i [class]=\"cap.icon\"></i>\n <div class=\"ps-cap-title\">{{ cap.title }}</div>\n <div class=\"ps-cap-blurb\">{{ cap.blurb }}</div>\n </div>\n }\n </div>\n <button mjButton variant=\"primary\" size=\"md\" data-testid=\"ps-intro-build\" (click)=\"newPrediction()\"><i class=\"fa-solid fa-plus\"></i> Build your first prediction</button>\n </div>\n } @else {\n <div class=\"ps-biz-grid\" data-testid=\"ps-predictions-grid\">\n @for (c of cards; track c.modelId) {\n <div class=\"ps-biz-card\" [class.blocked]=\"!c.canOpen\" data-testid=\"ps-prediction-card\">\n <div class=\"ps-biz-card-top\">\n <span class=\"ps-trust-badge\" [class]=\"'trust-' + c.trust.grade.toLowerCase()\" data-testid=\"ps-trust-badge\">\n <i class=\"fa-solid fa-shield-halved\"></i> {{ c.canOpen ? c.trust.grade : 'Not ready' }}\n </span>\n </div>\n <h3 class=\"ps-biz-card-title\">{{ c.title }}</h3>\n <p class=\"ps-biz-card-line\">{{ c.canOpen ? c.trust.oneLiner : c.blockedReason }}</p>\n <div class=\"ps-biz-card-foot\">\n @if (c.canOpen) {\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-open-prediction\" (click)=\"open(c)\">Open <i class=\"fa-solid fa-arrow-right\"></i></button>\n } @else {\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-improve-prediction\" (click)=\"improvePrediction(c)\"><i class=\"fa-solid fa-wand-magic-sparkles\"></i> Improve this</button>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n\n <!-- ───────── WORKSPACE (trust gate) ───────── -->\n @if (view === 'workspace' && selected) {\n <nav class=\"ps-biz-crumb\">\n <a (click)=\"backToCatalog()\" data-testid=\"ps-crumb-home\">Predictions</a>\n <i class=\"fa-solid fa-chevron-right\"></i> <span>{{ selected.title }}</span>\n </nav>\n\n <div class=\"ps-trust-banner\" [class]=\"'trust-' + selected.trust.grade.toLowerCase()\" data-testid=\"ps-trust-banner\">\n <div class=\"ps-trust-dots\">\n @for (d of [1,2,3,4,5]; track d) { <i class=\"fa-solid fa-star\" [class.on]=\"d <= dots(selected)\"></i> }\n </div>\n <div class=\"ps-trust-text\">\n <div class=\"ps-trust-grade\">{{ selected.canOpen ? 'You can rely on this — ' + selected.trust.grade : 'Not reliable yet' }}</div>\n <div class=\"ps-trust-line\">{{ selected.trust.oneLiner }}</div>\n <div class=\"ps-trust-explain muted\">{{ selected.trust.explanation }}</div>\n <div class=\"ps-trust-evidence muted\">{{ evidence() }}</div>\n </div>\n </div>\n\n <div class=\"ps-biz-workspace-body\" data-testid=\"ps-workspace-body\">\n @if (selected.canOpen) {\n @if (drivers.length > 0) {\n <div class=\"ps-drivers\" data-testid=\"ps-drivers\">\n <i class=\"fa-solid fa-lightbulb\"></i> <strong>What's driving this:</strong>\n @for (d of drivers; track d) { <span class=\"ps-driver-chip\">{{ d }}</span> }\n </div>\n }\n <ps-predictions-grid\n data-testid=\"ps-atrisk-list\"\n #atriskList\n [modelId]=\"selected.modelId\"\n [runId]=\"latestRunId\"\n [title]=\"selected.title\"\n [entityName]=\"selectedTargetEntityName\"\n [problemType]=\"selectedProblemType\"\n height=\"580px\">\n </ps-predictions-grid>\n }\n <div class=\"ps-action-bar\" [class.locked]=\"!selected.canOpen\" data-testid=\"ps-action-bar\">\n @if (selected.canOpen) {\n <button mjButton variant=\"primary\" size=\"sm\" data-testid=\"ps-act-review\" (click)=\"scrollToList()\"><i class=\"fa-solid fa-list-check\"></i> Review the call list</button>\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-act-save\" (click)=\"askAgentTo('Save these prediction scores onto the records so my team can use them.')\"><i class=\"fa-solid fa-floppy-disk\"></i> Save scores to records</button>\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-act-list\" [disabled]=\"creatingList || atRiskRows.length === 0\" (click)=\"sendToList()\"><i class=\"fa-solid\" [class.fa-paper-plane]=\"!creatingList\" [class.fa-spinner]=\"creatingList\" [class.fa-spin]=\"creatingList\"></i> Send to a list</button>\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-act-export\" [disabled]=\"atRiskRows.length === 0\" (click)=\"exportList()\"><i class=\"fa-solid fa-file-export\"></i> Share / export</button>\n } @else {\n <div class=\"ps-action-locked\"><i class=\"fa-solid fa-lock\"></i> {{ selected.trust.gateReason }}</div>\n }\n </div>\n @if (listResult) { <div class=\"ps-list-result muted\" data-testid=\"ps-list-result\">{{ listResult }}</div> }\n </div>\n }\n </div>\n </as-split-area>\n\n @if (chatOpen) {\n <as-split-area [size]=\"copilotSizePct\" [minSize]=\"20\" [maxSize]=\"65\">\n <aside class=\"ps-biz-copilot\" data-testid=\"ps-predictions-copilot\">\n <div class=\"ps-biz-copilot-head\">\n <div class=\"ps-biz-copilot-title\"><i class=\"fa-solid fa-robot\"></i> New prediction</div>\n <button class=\"ps-biz-copilot-close\" (click)=\"closeChat()\" aria-label=\"Close\"><i class=\"fa-solid fa-xmark\"></i></button>\n </div>\n <div class=\"ps-biz-copilot-body\">\n @if (currentUser) {\n <mj-conversation-chat-area\n [Provider]=\"Provider\" [environmentId]=\"chatEnvironmentId\" [currentUser]=\"currentUser\"\n [conversation]=\"chatConversation\" [conversationId]=\"chatConversationId\" [isNewConversation]=\"chatIsNewConversation\"\n [suppressNewConversationEmptyState]=\"true\" [allowMentions]=\"false\" [overlayMode]=\"true\"\n [showExportButton]=\"false\" [showShareButton]=\"false\" [showArtifactIndicator]=\"false\"\n [showAgentPicker]=\"false\" [showAgentModePicker]=\"false\"\n [defaultAgentId]=\"modelDevAgentId\" [pendingMessage]=\"pendingPrompt\"\n [applicationScope]=\"'Application'\" [applicationId]=\"applicationId\" [appContext]=\"chatAppContext\"\n (conversationCreated)=\"onChatConversationCreated($event)\"\n (pendingMessageConsumed)=\"onChatPendingMessageConsumed()\">\n </mj-conversation-chat-area>\n } @else { <div class=\"ps-biz-copilot-empty\"><mj-loading text=\"Connecting…\" size=\"small\"></mj-loading></div> }\n </div>\n </aside>\n </as-split-area>\n }\n </as-split>\n </div>\n }\n </mj-page-body-interior>\n `,\n styles: [\n `\n :host { display: flex; flex-direction: column; width: 100%; height: 100%; min-height: 0; }\n .ps-biz-host { display: flex; flex: 1; min-height: 0; overflow: hidden; }\n .biz-copilot-splitter { flex: 1; width: 100%; height: 100%; min-height: 0; min-width: 0; }\n .biz-copilot-splitter .as-split-gutter { background: transparent; transition: background-color 0.15s ease; position: relative; }\n .biz-copilot-splitter .as-split-gutter:hover { background-color: var(--mj-brand-primary, #6366f1); }\n .biz-copilot-splitter .as-split-gutter::after { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 2px; height: 24px; border-radius: 1px; background: var(--mj-border-strong, #cbd5e1); }\n .ps-biz-main { width: 100%; height: 100%; flex: 1; min-width: 0; overflow-y: auto; padding: 16px 18px 28px; }\n .ps-biz-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 16px; }\n .ps-biz-card { background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default); border-radius: var(--mj-radius-md); padding: 18px; display: flex; flex-direction: column; gap: 10px; transition: border-color .12s, background .12s; }\n .ps-biz-card:hover { border-color: var(--mj-brand-primary); background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface)); }\n .ps-biz-card.blocked { opacity: .85; background: var(--mj-bg-surface-card); }\n .ps-biz-card-title { font-size: var(--mj-text-lg); font-weight: 600; color: var(--mj-text-primary); margin: 0; }\n .ps-biz-card-line { color: var(--mj-text-secondary); font-size: var(--mj-text-sm); margin: 0; flex: 1; }\n .ps-biz-card-foot { display: flex; justify-content: flex-end; }\n .ps-trust-badge { display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px; border-radius: var(--mj-radius-full); font-size: var(--mj-text-xs); font-weight: 600; }\n .trust-good, .trust-excellent { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n .trust-fair { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n .trust-poor { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n .ps-biz-intro { max-width: 820px; margin: 32px auto; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 20px; }\n .ps-biz-intro-head i { font-size: 40px; color: var(--mj-brand-primary); }\n .ps-biz-intro-head h2 { margin: 12px 0 6px; color: var(--mj-text-primary); font-size: var(--mj-text-xl); }\n .ps-biz-intro-head p { margin: 0 auto; max-width: 620px; color: var(--mj-text-secondary); font-size: var(--mj-text-sm); }\n .ps-cap-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 14px; width: 100%; }\n .ps-cap-card { background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default); border-radius: var(--mj-radius-md); padding: 18px 16px; text-align: left; display: flex; flex-direction: column; gap: 6px; }\n .ps-cap-card i { font-size: 20px; color: var(--mj-brand-primary); }\n .ps-cap-title { font-weight: 600; color: var(--mj-text-primary); font-size: var(--mj-text-sm); }\n .ps-cap-blurb { color: var(--mj-text-secondary); font-size: var(--mj-text-xs); line-height: 1.45; }\n .ps-biz-crumb { display: flex; align-items: center; gap: 8px; font-size: var(--mj-text-sm); color: var(--mj-text-muted); margin-bottom: 14px; }\n .ps-biz-crumb a { color: var(--mj-text-link); cursor: pointer; }\n .ps-biz-crumb a:hover { text-decoration: underline; }\n .ps-biz-crumb i { font-size: 10px; }\n .ps-trust-banner { display: flex; gap: 16px; align-items: center; padding: 18px 20px; border-radius: var(--mj-radius-md); border: 1px solid; margin-bottom: 18px; }\n .ps-trust-banner.trust-good, .ps-trust-banner.trust-excellent { background: var(--mj-status-success-bg); border-color: var(--mj-status-success-border); }\n .ps-trust-banner.trust-fair { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); }\n .ps-trust-banner.trust-poor { background: var(--mj-status-error-bg); border-color: var(--mj-status-error-border); }\n .ps-trust-dots { display: flex; gap: 3px; font-size: 18px; }\n .ps-trust-dots i { color: var(--mj-border-strong); } .ps-trust-dots i.on { color: var(--mj-status-warning); }\n .ps-trust-banner.trust-good .ps-trust-dots i.on, .ps-trust-banner.trust-excellent .ps-trust-dots i.on { color: var(--mj-status-success); }\n .ps-trust-grade { font-weight: 700; font-size: var(--mj-text-lg); color: var(--mj-text-primary); }\n .ps-trust-line { font-weight: 600; color: var(--mj-text-primary); margin-top: 2px; }\n .ps-trust-explain, .ps-trust-evidence { font-size: var(--mj-text-sm); margin-top: 4px; }\n .ps-action-bar { display: flex; gap: 10px; flex-wrap: wrap; padding: 14px 16px; border-radius: var(--mj-radius-md); background: var(--mj-bg-surface-card); border: 1px solid var(--mj-border-default); }\n .ps-action-bar.locked { background: var(--mj-status-error-bg); border-color: var(--mj-status-error-border); }\n .ps-action-locked { display: flex; align-items: center; gap: 8px; color: var(--mj-status-error-text); font-weight: 600; font-size: var(--mj-text-sm); }\n .ps-drivers { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 0 0 16px; color: var(--mj-text-secondary); font-size: var(--mj-text-sm); }\n .ps-drivers i { color: var(--mj-status-warning); }\n .ps-driver-chip { background: var(--mj-bg-surface-card); border: 1px solid var(--mj-border-default); border-radius: var(--mj-radius-full); padding: 2px 10px; font-weight: 600; color: var(--mj-text-primary); }\n .ps-atrisk { border: 1px solid var(--mj-border-default); border-radius: var(--mj-radius-md); overflow: hidden; margin-bottom: 16px; background: var(--mj-bg-surface); }\n .ps-atrisk-head { display: grid; grid-template-columns: 1fr 140px 52px; gap: 12px; padding: 8px 14px; background: var(--mj-bg-surface-card); border-bottom: 1px solid var(--mj-border-default); font-size: var(--mj-text-xs); font-weight: 600; color: var(--mj-text-muted); text-transform: uppercase; letter-spacing: .03em; }\n .ps-atrisk-rcol { grid-column: 2 / span 2; text-align: right; }\n .ps-atrisk-row { display: grid; grid-template-columns: 1fr 140px 52px; gap: 12px; align-items: center; padding: 9px 14px; border-bottom: 1px solid var(--mj-border-subtle); }\n .ps-atrisk-row:last-child { border-bottom: none; }\n .ps-atrisk-row:hover { background: var(--mj-bg-surface-hover); }\n .ps-atrisk-idcell { display: flex; flex-direction: column; gap: 4px; min-width: 0; }\n .ps-atrisk-id { font-size: var(--mj-text-xs); color: var(--mj-text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .ps-atrisk-why { display: flex; gap: 6px; flex-wrap: wrap; }\n .ps-why-chip { display: inline-flex; align-items: center; gap: 4px; font-size: 10px; font-weight: 600; padding: 1px 7px; border-radius: var(--mj-radius-full); max-width: 160px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .ps-why-chip i { font-size: 8px; }\n .ps-why-chip.up { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n .ps-why-chip.down { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n .ps-atrisk-bar { height: 8px; border-radius: var(--mj-radius-full); background: var(--mj-bg-surface-sunken); overflow: hidden; }\n .ps-atrisk-fill { display: block; height: 100%; border-radius: var(--mj-radius-full); }\n .ps-atrisk-pct { text-align: right; font-weight: 700; font-size: var(--mj-text-sm); font-variant-numeric: tabular-nums; }\n .ps-atrisk-fill.risk-high { background: var(--mj-status-error); }\n .ps-atrisk-fill.risk-medium { background: var(--mj-status-warning); }\n .ps-atrisk-fill.risk-low { background: var(--mj-status-success); }\n .ps-atrisk-pct.risk-high { color: var(--mj-status-error-text); }\n .ps-atrisk-pct.risk-medium { color: var(--mj-status-warning-text); }\n .ps-atrisk-pct.risk-low { color: var(--mj-status-success-text); }\n .ps-atrisk-foot { padding: 8px 14px; font-size: var(--mj-text-xs); }\n .ps-atrisk-empty { padding: 24px; text-align: center; border: 1px dashed var(--mj-border-default); border-radius: var(--mj-radius-md); margin-bottom: 16px; }\n .ps-atrisk-error { display: flex; align-items: center; gap: 10px; padding: 16px 18px; border: 1px solid var(--mj-status-error-border); background: var(--mj-status-error-bg); border-radius: var(--mj-radius-md); margin-bottom: 16px; color: var(--mj-status-error-text); font-size: var(--mj-text-sm); }\n .ps-atrisk-error i { color: var(--mj-status-error); }\n .ps-atrisk-error .ps-atrisk-error-msg { flex: 1; min-width: 0; word-break: break-word; }\n .mono { font-family: var(--mj-font-family-mono); }\n /* Kept local (not in the shared stylesheet) deliberately: shared styles are injected by the\n ViewEncapsulation.None PANEL components, and this banner renders precisely when panels DON'T. */\n .ps-load-error { display: flex; align-items: center; gap: 14px; max-width: 620px; margin: 32px auto; padding: 18px 20px; border: 1px solid var(--mj-status-error-border); background: var(--mj-status-error-bg); border-radius: var(--mj-radius-lg); }\n .ps-load-error > i { font-size: 24px; color: var(--mj-status-error); }\n .ps-load-error-text { display: flex; flex-direction: column; gap: 2px; flex: 1; min-width: 0; }\n .ps-load-error-text strong { color: var(--mj-text-primary); }\n .ps-load-error-detail { color: var(--mj-text-secondary); font-size: var(--mj-text-sm); word-break: break-word; }\n .ps-biz-copilot { width: 100%; height: 100%; max-width: none; flex: 1; border-left: 1px solid var(--mj-border-default); background: var(--mj-bg-surface); display: flex; flex-direction: column; min-height: 0; }\n .ps-biz-copilot-head { display: flex; align-items: center; justify-content: space-between; padding: 10px 14px; border-bottom: 1px solid var(--mj-border-default); }\n .ps-biz-copilot-title { display: flex; align-items: center; gap: 8px; font-weight: 600; color: var(--mj-text-primary); }\n .ps-biz-copilot-title i { color: var(--mj-brand-primary); }\n .ps-biz-copilot-close { background: transparent; border: none; cursor: pointer; padding: 6px 8px; border-radius: 6px; color: var(--mj-text-muted); }\n .ps-biz-copilot-close:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-secondary); }\n .ps-biz-copilot-body { flex: 1; min-height: 0; overflow: hidden; display: flex; flex-direction: column; }\n .ps-biz-copilot-body mj-conversation-chat-area { flex: 1; min-height: 0; display: block; }\n .ps-biz-copilot-empty { display: flex; align-items: center; justify-content: center; flex: 1; }\n @media (max-width: 1100px) { .ps-biz-host.chat-open .ps-biz-main { display: none; } .ps-biz-copilot { width: 100%; max-width: none; border-left: none; } }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PSPredictionsResourceComponent extends PSResourceBase {\n protected readonly SectionKey = 'predictions';\n protected readonly SectionLabel = 'Predictions';\n protected readonly SectionIcon = 'fa-solid fa-wand-magic-sparkles';\n\n private readonly cdrLocal = inject(ChangeDetectorRef);\n\n /** catalog (the home grid) ↔ workspace (a selected prediction). */\n public View: 'catalog' | 'workspace' = 'catalog';\n\n /** @deprecated Use {@link View}. */\n public get view(): 'catalog' | 'workspace' {\n return this.View;\n }\n /** @deprecated Use {@link View}. */\n public set view(value: 'catalog' | 'workspace') {\n this.View = value;\n }\n public Selected: BusinessPredictionCard | null = null;\n\n /** @deprecated Use {@link Selected}. */\n public get selected(): BusinessPredictionCard | null {\n return this.Selected;\n }\n /** @deprecated Use {@link Selected}. */\n public set selected(value: BusinessPredictionCard | null) {\n this.Selected = value;\n }\n public ChatOpen = false;\n\n /** @deprecated Use {@link ChatOpen}. */\n public get chatOpen() {\n return this.ChatOpen;\n }\n /** @deprecated Use {@link ChatOpen}. */\n public set chatOpen(value) {\n this.ChatOpen = value;\n }\n public PendingPrompt: string | null = null;\n\n /** @deprecated Use {@link PendingPrompt}. */\n public get pendingPrompt(): string | null {\n return this.PendingPrompt;\n }\n /** @deprecated Use {@link PendingPrompt}. */\n public set pendingPrompt(value: string | null) {\n this.PendingPrompt = value;\n }\n private _modelDevAgentId: string | null = null;\n\n /**\n * Embedded co-pilot conversation state. The chat-area starts in \"new conversation\" mode; on the first\n * send it creates the conversation and emits `conversationCreated`, at which point we capture the live\n * conversation and flip out of new-mode so subsequent sends append to the same thread. Without this\n * wiring the suppressed empty-state input has no valid conversation to write into and the first send\n * silently no-ops (matches the proven Form Builder co-pilot pattern).\n */\n public ChatConversation: MJConversationEntity | null = null;\n\n /** @deprecated Use {@link ChatConversation}. */\n public get chatConversation(): MJConversationEntity | null {\n return this.ChatConversation;\n }\n /** @deprecated Use {@link ChatConversation}. */\n public set chatConversation(value: MJConversationEntity | null) {\n this.ChatConversation = value;\n }\n public ChatConversationId: string | null = null;\n\n /** @deprecated Use {@link ChatConversationId}. */\n public get chatConversationId(): string | null {\n return this.ChatConversationId;\n }\n /** @deprecated Use {@link ChatConversationId}. */\n public set chatConversationId(value: string | null) {\n this.ChatConversationId = value;\n }\n public ChatIsNewConversation = true;\n\n /** @deprecated Use {@link ChatIsNewConversation}. */\n public get chatIsNewConversation() {\n return this.ChatIsNewConversation;\n }\n /** @deprecated Use {@link ChatIsNewConversation}. */\n public set chatIsNewConversation(value) {\n this.ChatIsNewConversation = value;\n }\n public MainSizePct = 68;\n\n /** @deprecated Use {@link MainSizePct}. */\n public get mainSizePct() {\n return this.MainSizePct;\n }\n /** @deprecated Use {@link MainSizePct}. */\n public set mainSizePct(value) {\n this.MainSizePct = value;\n }\n public CopilotSizePct = 32;\n\n /** @deprecated Use {@link CopilotSizePct}. */\n public get copilotSizePct() {\n return this.CopilotSizePct;\n }\n /** @deprecated Use {@link CopilotSizePct}. */\n public set copilotSizePct(value) {\n this.CopilotSizePct = value;\n }\n\n override ngOnInit(): void {\n super.ngOnInit();\n this.loadLayoutPrefs();\n }\n\n public OnCopilotSplitDragEnd(sizes: readonly (number | '*')[]): void {\n if (Array.isArray(sizes) && sizes.length === 2 && typeof sizes[0] === 'number' && typeof sizes[1] === 'number') {\n this.MainSizePct = Math.round(sizes[0]);\n this.CopilotSizePct = Math.round(sizes[1]);\n this.saveLayoutPrefs();\n }\n }\n\n /** @deprecated Use {@link OnCopilotSplitDragEnd}. */\n public onCopilotSplitDragEnd(sizes: readonly (number | '*')[]): void {\n return this.OnCopilotSplitDragEnd(sizes);\n }\n\n private loadLayoutPrefs(): void {\n const saved = UserInfoEngine.Instance.GetSetting('mj.predictiveStudio.predictions.layout');\n if (saved) {\n try {\n const parsed = JSON.parse(saved);\n if (typeof parsed.copilotSizePct === 'number' && parsed.copilotSizePct >= 20 && parsed.copilotSizePct <= 60) {\n this.CopilotSizePct = parsed.copilotSizePct;\n this.MainSizePct = 100 - this.CopilotSizePct;\n }\n } catch {}\n }\n }\n\n private saveLayoutPrefs(): void {\n const prefs = {\n copilotSizePct: this.CopilotSizePct,\n mainSizePct: this.MainSizePct,\n };\n UserInfoEngine.Instance.SetSettingDebounced('mj.predictiveStudio.predictions.layout', JSON.stringify(prefs));\n }\n\n /** The ranked at-risk rows for the open prediction's latest run (empty until loaded / when no run yet). */\n public AtRiskRows: AtRiskRow[] = [];\n\n /** @deprecated Use {@link AtRiskRows}. */\n public get atRiskRows(): AtRiskRow[] {\n return this.AtRiskRows;\n }\n /** @deprecated Use {@link AtRiskRows}. */\n public set atRiskRows(value: AtRiskRow[]) {\n this.AtRiskRows = value;\n }\n /** Plain-language \"what's driving this\" drivers for the open prediction (global feature importance). */\n public Drivers: string[] = [];\n\n /** @deprecated Use {@link Drivers}. */\n public get drivers(): string[] {\n return this.Drivers;\n }\n /** @deprecated Use {@link Drivers}. */\n public set drivers(value: string[]) {\n this.Drivers = value;\n }\n /** Whether the at-risk list is loading for the open prediction. */\n public AtRiskLoading = false;\n\n /** @deprecated Use {@link AtRiskLoading}. */\n public get atRiskLoading() {\n return this.AtRiskLoading;\n }\n /** @deprecated Use {@link AtRiskLoading}. */\n public set atRiskLoading(value) {\n this.AtRiskLoading = value;\n }\n /** Set when the at-risk load fails — the workspace shows a \"couldn't load\" banner with retry instead of the misleading no-results empty state. */\n public AtRiskError: string | null = null;\n\n /** @deprecated Use {@link AtRiskError}. */\n public get atRiskError(): string | null {\n return this.AtRiskError;\n }\n /** @deprecated Use {@link AtRiskError}. */\n public set atRiskError(value: string | null) {\n this.AtRiskError = value;\n }\n /** \"Send to a list\" in-flight guard + last-result message (P1 #4). */\n public CreatingList = false;\n\n /** @deprecated Use {@link CreatingList}. */\n public get creatingList() {\n return this.CreatingList;\n }\n /** @deprecated Use {@link CreatingList}. */\n public set creatingList(value) {\n this.CreatingList = value;\n }\n public ListResult: string | null = null;\n\n /** @deprecated Use {@link ListResult}. */\n public get listResult(): string | null {\n return this.ListResult;\n }\n /** @deprecated Use {@link ListResult}. */\n public set listResult(value: string | null) {\n this.ListResult = value;\n }\n public LatestRunId: string | null = null;\n\n /** @deprecated Use {@link LatestRunId}. */\n public get latestRunId(): string | null {\n return this.LatestRunId;\n }\n /** @deprecated Use {@link LatestRunId}. */\n public set latestRunId(value: string | null) {\n this.LatestRunId = value;\n }\n\n /** Capability cards for the first-run intro (what PS can do), shown when the catalog is empty. */\n public readonly CapabilityCards: readonly PSCapabilityCard[] = PS_CAPABILITY_CARDS;\n\n /** @deprecated Use {@link CapabilityCards}. */\n public get capabilityCards(): readonly PSCapabilityCard[] {\n return this.CapabilityCards;\n }\n\n /** The business catalog cards, most-trustworthy first, derived from the engine's published models. */\n public get Cards(): BusinessPredictionCard[] {\n return buildBusinessCatalog(\n this.engine.PublishedModels.map((m: MJMLModelEntity) => ({\n modelId: m.ID,\n name: this.engine.ModelDisplayName(m),\n HoldoutMetrics: m.HoldoutMetrics,\n Metrics: m.Metrics,\n ProblemType: m.ProblemType,\n updatedAt: m.__mj_UpdatedAt ?? null,\n })),\n );\n }\n\n /** @deprecated Use {@link Cards}. */\n public get cards(): BusinessPredictionCard[] {\n return this.Cards;\n }\n\n public Dots(c: BusinessPredictionCard): number { return trustDots(c.trust.grade); }\n\n /** @deprecated Use {@link Dots}. */\n public dots(c: BusinessPredictionCard): number {\n return this.Dots(c);\n }\n public Evidence(): string { return trustEvidenceLine({ noun: 'records' }); }\n\n /** @deprecated Use {@link Evidence}. */\n public evidence(): string {\n return this.Evidence();\n }\n\n /** Deep agent context for the Predictions door: catalog counts + names, and (in workspace) the selection + at-risk breakdown. */\n protected override extraAgentContext(): Record<string, unknown> {\n const cards = this.Cards;\n return buildPredictionsAgentContext({\n View: this.View,\n PredictionCount: cards.length,\n ReadyPredictionCount: cards.filter((c) => c.canOpen).length,\n VisiblePredictionNames: cards.map((c) => c.title),\n ChatOpen: this.ChatOpen,\n Selected: this.Selected ? { Name: this.Selected.title, TrustGrade: this.Selected.trust.grade, CanOpen: this.Selected.canOpen } : null,\n AtRiskLoaded: this.View === 'workspace' && !this.AtRiskLoading && !this.AtRiskError,\n AtRiskCount: this.AtRiskRows.length,\n HighRiskCount: this.AtRiskRows.filter((r) => r.band === 'high').length,\n MediumRiskCount: this.AtRiskRows.filter((r) => r.band === 'medium').length,\n LowRiskCount: this.AtRiskRows.filter((r) => r.band === 'low').length,\n Drivers: this.Drivers,\n });\n }\n\n /**\n * 🔒 Read/navigate-only agent tools for the Predictions door: open a (trust-cleared) prediction, go back\n * to the catalog, review the call list, export the at-risk list (CSV — read-only, mirrors Data Explorer's\n * ExportView), and open the \"+ New prediction\" co-pilot. **DELIBERATELY NOT exposed:** \"Save scores to\n * records\", \"Send to a list\" (both WRITE records), and any train/publish/delete — those stay behind the\n * user's clicks and the approve-gated builder.\n */\n protected override registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'OpenPrediction',\n Description:\n 'Open a prediction to its workspace (trust verdict + who-is-at-risk list). Pass the prediction ID or name (see VisiblePredictionNames). Only trust-cleared predictions can open; a blocked one returns why.',\n ParameterSchema: { type: 'object', properties: { prediction: { type: 'string', description: 'The prediction ID or name to open' } } },\n Handler: async (params: Record<string, unknown>) => {\n const check = validateStringParam(params['prediction'], 'prediction');\n if (!check.ok) return check.result;\n const candidates = this.Cards.map((c) => ({ ID: c.modelId, Name: c.title }));\n const match = resolvePSRecord(check.value, candidates);\n if (!match) return { Success: false, ErrorMessage: buildPSNotFoundError(check.value, candidates, 'prediction') };\n const card = this.Cards.find((c) => UUIDsEqual(c.modelId, match.ID));\n if (!card) return { Success: false, ErrorMessage: buildPSNotFoundError(check.value, candidates, 'prediction') };\n if (!card.canOpen) {\n return { Success: false, ErrorMessage: `\"${card.title}\" isn't ready to open: ${card.blockedReason ?? card.trust.gateReason ?? 'it needs an analyst first.'}` };\n }\n this.Open(card);\n return { Success: true, Data: { opened: card.title, trust: card.trust.grade } };\n },\n },\n {\n Name: 'BackToPredictionCatalog',\n Description: 'Return from a prediction workspace to the catalog (the grid of all predictions).',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.BackToCatalog();\n this.publishAgentContext();\n return { Success: true, Data: { view: 'catalog' } };\n },\n },\n {\n Name: 'ReviewCallList',\n Description: 'Scroll the open prediction workspace to its ranked at-risk \"call list\". Only meaningful when a prediction is open.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n if (this.View !== 'workspace' || !this.Selected) return { Success: false, ErrorMessage: 'No prediction is open. Use OpenPrediction first.' };\n this.ScrollToList();\n return { Success: true };\n },\n },\n {\n Name: 'ExportAtRiskList',\n Description: 'Download the open prediction\\'s at-risk list as a CSV (read-only export). Only works when a prediction is open and its list has loaded.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n if (this.View !== 'workspace' || this.AtRiskRows.length === 0) return { Success: false, ErrorMessage: 'No at-risk list is loaded to export. Open a prediction with results first.' };\n this.ExportList();\n return { Success: true, Data: { rows: this.AtRiskRows.length } };\n },\n },\n {\n Name: 'OpenNewPredictionCopilot',\n Description: 'Open the \"+ New prediction\" Model Development Agent co-pilot (does not send a message — the user drives the conversation). Use when the user wants to build a new prediction.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.OpenNewPredictionCopilot();\n return { Success: true, Data: { chatOpen: true } };\n },\n },\n ]);\n }\n\n public Open(c: BusinessPredictionCard): void {\n if (!c.canOpen) return;\n this.Selected = c;\n this.View = 'workspace';\n this.AtRiskRows = [];\n this.Drivers = [];\n this.AtRiskError = null;\n this.ListResult = null;\n // Mark loading BEFORE the publish below: otherwise AtRiskLoaded computes true for one publish with\n // atRiskRows still [], fabricating \"0 at risk\" to the agent for a list that hasn't been fetched yet.\n this.AtRiskLoading = true;\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n void this.loadAtRisk(c);\n }\n\n /** @deprecated Use {@link Open}. */\n public open(c: BusinessPredictionCard): void {\n return this.Open(c);\n }\n\n /** Load the open prediction's plain-language drivers + its latest run's ranked at-risk rows. */\n private async loadAtRisk(c: BusinessPredictionCard): Promise<void> {\n const model = this.engine.PublishedModels.find((m) => UUIDsEqual(m.ID, c.modelId));\n this.Drivers = TopGlobalDrivers(model?.FeatureImportance ?? null, 3);\n this.AtRiskLoading = true;\n this.AtRiskError = null;\n this.cdrLocal.detectChanges();\n try {\n const provider = this.ProviderToUse;\n const user = provider.CurrentUser ?? undefined;\n const runs = await this.engine.LoadRecentRunsForModel(c.modelId, provider, user, { maxRows: 1 });\n const latest = runs[0];\n this.LatestRunId = latest?.ID ?? null;\n if (latest?.ID) {\n const res = await RunView.FromMetadataProvider(provider).RunView<MJProcessRunDetailEntity>(\n { EntityName: 'MJ: Process Run Details', ExtraFilter: `ProcessRunID='${latest.ID}'`, MaxRows: 2137, ResultType: 'entity_object' },\n user,\n );\n if (res.Success && this.Selected?.modelId === c.modelId) {\n this.AtRiskRows = ParseAtRiskRows((res.Results ?? []).map((d) => ({ recordId: d.RecordID, ResultPayload: d.ResultPayload })));\n await this.resolveAtRiskLabels(model);\n }\n }\n } catch (err) {\n this.AtRiskError = err instanceof Error ? err.message : String(err);\n LogError(`PSPredictionsResource.loadAtRisk: ${this.AtRiskError}`);\n } finally {\n this.AtRiskLoading = false;\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n }\n }\n\n /** Retry loading the open prediction's at-risk list after a failure — bound to the at-risk error banner. */\n public RetryAtRisk(): void {\n if (this.Selected) void this.loadAtRisk(this.Selected);\n }\n\n /** @deprecated Use {@link RetryAtRisk}. */\n public retryAtRisk(): void {\n return this.RetryAtRisk();\n }\n\n /**\n * P1 #3 — resolve the raw record ids in the at-risk list to human labels (member name/email) from the\n * model's target entity, so the list reads like a call sheet instead of a column of UUIDs. Resolves the\n * top-risk rows (capped) to keep the lookup light; unresolved rows fall back to their id in the template.\n */\n public get SelectedTargetEntityName(): string | null {\n if (!this.Selected) return null;\n const model = this.engine.PublishedModels.find((m) => UUIDsEqual(m.ID, this.Selected?.modelId));\n return this.targetEntityForModel(model)?.name ?? null;\n }\n\n /** @deprecated Use {@link SelectedTargetEntityName}. */\n public get selectedTargetEntityName(): string | null {\n return this.SelectedTargetEntityName;\n }\n\n public get SelectedProblemType(): string | null {\n if (!this.Selected) return null;\n const model = this.engine.PublishedModels.find((m) => UUIDsEqual(m.ID, this.Selected?.modelId));\n return model?.ProblemType ?? null;\n }\n\n /** @deprecated Use {@link SelectedProblemType}. */\n public get selectedProblemType(): string | null {\n return this.SelectedProblemType;\n }\n\n private targetEntityForModel(model: MJMLModelEntity | undefined): { id: string; name: string } | null {\n const pipeline = model ? this.engine.Pipelines.find((pp) => UUIDsEqual(pp.ID, model.PipelineID)) : undefined;\n const id = pipeline?.TargetEntityID;\n if (!id) return null;\n const name = this.ProviderToUse.Entities.find((e) => UUIDsEqual(e.ID, id))?.Name;\n return name ? { id, name } : null;\n }\n\n private async resolveAtRiskLabels(model: MJMLModelEntity | undefined): Promise<void> {\n // Labels are cosmetic — any failure here degrades to record ids, it must never surface as a\n // \"couldn't load who's at risk\" error that hides a perfectly good list.\n try {\n const target = this.targetEntityForModel(model);\n if (!target || this.AtRiskRows.length === 0) return;\n const entity = this.ProviderToUse.EntityByName(target.name);\n if (!entity) return;\n // The target entity is arbitrary — its key can have any column name(s), including a composite key.\n const pkNames = entity.PrimaryKeys.map((pk) => pk.Name);\n const targets = this.AtRiskRows.slice(0, 200); // the rows a user actually acts on\n const ids = targets.map((r) => r.recordId);\n // Only fetch the columns labelFromRecord can actually use — a broad no-Fields fetch pulls every\n // column (incl. large text/JSON) of an arbitrary entity just to render a display name. Fall back\n // to the broad fetch only when the entity has none of the candidate label fields.\n const candidates = ['Name', 'FirstName', 'LastName', 'Email'];\n const labelFields = candidates.filter((c) => entity.Fields.some((f) => f.Name.toLowerCase() === c.toLowerCase()));\n const res = await RunView.FromMetadataProvider(this.ProviderToUse).RunView<Record<string, unknown>>(\n {\n EntityName: target.name,\n ExtraFilter: BuildRecordIdFilter(entity, ids),\n ...(labelFields.length > 0 ? { Fields: [...pkNames, ...labelFields] } : {}),\n ResultType: 'simple',\n MaxRows: ids.length,\n },\n this.ProviderToUse.CurrentUser ?? undefined,\n );\n if (!res.Success) return;\n const byId = new Map<string, Record<string, unknown>>();\n for (const row of res.Results ?? []) byId.set(NormalizeUUID(CompositeKey.FromEntityRecord(entity, row).ToCompactURLSegment()), row);\n for (const r of this.AtRiskRows) {\n const rec = byId.get(NormalizeUUID(r.recordId));\n if (rec) r.label = LabelFromRecord(rec);\n }\n } catch (err) {\n LogError(`PSPredictionsResource.resolveAtRiskLabels (cosmetic — list keeps ids): ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n public BackToCatalog(): void {\n this.View = 'catalog';\n this.Selected = null;\n this.LatestRunId = null;\n this.AtRiskRows = [];\n this.Drivers = [];\n this.AtRiskError = null;\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link BackToCatalog}. */\n public backToCatalog(): void {\n return this.BackToCatalog();\n }\n\n /** \"Review the call list\" — scroll the ranked at-risk list into view. */\n public ScrollToList(): void {\n document.querySelector('[data-testid=\"ps-atrisk-list\"]')?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n\n /** @deprecated Use {@link ScrollToList}. */\n public scrollToList(): void {\n return this.ScrollToList();\n }\n\n /** \"Save scores\" — still routed conversationally through the co-pilot (needs a designated write-back column). */\n public AskAgentTo(prompt: string): void {\n this.PendingPrompt = prompt;\n this.ChatOpen = true;\n void this.ensureModelDevAgentResolved();\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link AskAgentTo}. */\n public askAgentTo(prompt: string): void {\n return this.AskAgentTo(prompt);\n }\n\n /**\n * P1 #4 — \"Send to a list\" as a one-click server action (no agent sentence to parse): create an MJ List\n * over the model's target entity and add the at-risk members (high/medium band, capped) so a team can\n * act on it immediately (outreach campaign, tasks, etc.).\n */\n public async SendToList(): Promise<void> {\n if (this.CreatingList || this.AtRiskRows.length === 0 || !this.Selected) return;\n const model = this.engine.PublishedModels.find((m) => UUIDsEqual(m.ID, this.Selected!.modelId));\n const target = this.targetEntityForModel(model);\n const entityId = target?.id;\n if (!entityId) return;\n this.CreatingList = true;\n this.ListResult = null;\n this.cdrLocal.detectChanges();\n try {\n const p = this.ProviderToUse;\n const user = p.CurrentUser ?? undefined;\n const list = await p.GetEntityObject<MJListEntity>('MJ: Lists', user);\n // Minute-resolution timestamp so two sends on the same day don't produce identical-named lists.\n list.Name = `At-Risk: ${this.Selected.title} (${new Date().toISOString().slice(0, 16).replace('T', ' ')})`;\n list.EntityID = entityId;\n if (user?.ID) list.UserID = user.ID;\n list.RefreshMode = 'Additive';\n list.UseSnapshot = false;\n if (!(await list.Save())) {\n this.ListResult = `Couldn't create the list: ${list.LatestResult?.CompleteMessage ?? 'unknown error'}`;\n return;\n }\n const members = this.AtRiskRows.filter((r) => r.band !== 'low').slice(0, 200);\n let seq = 0;\n let added = 0;\n let firstFailure: string | null = null;\n for (const r of members) {\n const ld = await p.GetEntityObject<MJListDetailEntity>('MJ: List Details', user);\n ld.ListID = list.ID;\n ld.RecordID = r.recordId;\n ld.Sequence = seq++;\n ld.Status = 'Active';\n if (await ld.Save()) {\n added++;\n } else if (!firstFailure) {\n firstFailure = ld.LatestResult?.CompleteMessage ?? 'unknown error';\n }\n }\n const failed = members.length - added;\n this.ListResult =\n failed === 0\n ? `Added ${added} at-risk record${added === 1 ? '' : 's'} to “${list.Name}”.`\n : `Added ${added} of ${members.length} records to “${list.Name}” — ${failed} failed to add (first error: ${firstFailure}).`;\n if (failed > 0) LogError(`PSPredictionsResource.sendToList: ${failed}/${members.length} adds failed. First: ${firstFailure}`);\n } catch (err) {\n this.ListResult = `Couldn't create the list: ${err instanceof Error ? err.message : String(err)}`;\n LogError(`PSPredictionsResource.sendToList: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n this.CreatingList = false;\n this.cdrLocal.detectChanges();\n }\n }\n\n /** @deprecated Use {@link SendToList}. */\n public async sendToList(): Promise<void> {\n return this.SendToList();\n }\n\n /**\n * Quote one CSV cell: RFC-4180 double-quote escaping (handles commas/quotes/newlines in labels) plus a\n * leading `'` on formula-starting characters (`=`, `+`, `-`, `@`) so a hostile label can't execute as an\n * Excel/Sheets formula on open.\n */\n private csvCell(value: string): string {\n const guarded = /^[=+\\-@]/.test(value) ? `'${value}` : value;\n return /[\",\\n\\r]/.test(guarded) ? `\"${guarded.replace(/\"/g, '\"\"')}\"` : guarded;\n }\n\n /** \"Share / export\" — download the at-risk list as a CSV (dependency-free). */\n public ExportList(): void {\n if (this.AtRiskRows.length === 0) return;\n const csv = [\n 'Record,Likelihood %,Predicted',\n ...this.AtRiskRows.map((r) => `${this.csvCell(r.label ?? r.recordId)},${r.riskPct},${this.csvCell(r.class ?? '')}`),\n ].join('\\n');\n const url = URL.createObjectURL(new Blob([csv], { type: 'text/csv' }));\n const a = document.createElement('a');\n a.href = url;\n a.download = `${(this.Selected?.title ?? 'prediction').replace(/[^a-z0-9]+/gi, '-').toLowerCase()}-at-risk.csv`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n /** @deprecated Use {@link ExportList}. */\n public exportList(): void {\n return this.ExportList();\n }\n\n /** \"+ New prediction\" — open the co-pilot to a clean chat (Sonar-style); the user describes their goal and the agent drives the build. */\n public NewPrediction(): void {\n this.PendingPrompt = null;\n this.ChatOpen = true;\n void this.ensureModelDevAgentResolved();\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link NewPrediction}. */\n public newPrediction(): void {\n return this.NewPrediction();\n }\n\n /**\n * \"Improve this\" on a blocked (not-trustworthy-enough) prediction — turns the trust dead-end into a next\n * step by opening the co-pilot seeded with the model's name + why it's held, so the agent proposes concrete\n * ways to make it reliable and can rebuild it.\n */\n public ImprovePrediction(c: BusinessPredictionCard): void {\n this.PendingPrompt = buildImprovePrompt({\n Name: c.title,\n TrustGrade: c.trust.grade,\n Reason: c.blockedReason ?? c.trust.gateReason ?? null,\n });\n this.ChatOpen = true;\n void this.ensureModelDevAgentResolved();\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link ImprovePrediction}. */\n public improvePrediction(c: BusinessPredictionCard): void {\n return this.ImprovePrediction(c);\n }\n\n /** Open the \"+ New prediction\" co-pilot (clean chat) — used by the read-only `OpenNewPredictionCopilot` agent tool. */\n public OpenNewPredictionCopilot(): void {\n this.PendingPrompt = null;\n this.ChatOpen = true;\n void this.ensureModelDevAgentResolved();\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link OpenNewPredictionCopilot}. */\n public openNewPredictionCopilot(): void {\n return this.OpenNewPredictionCopilot();\n }\n\n public CloseChat(): void {\n this.ChatOpen = false;\n this.PendingPrompt = null;\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link CloseChat}. */\n public closeChat(): void {\n return this.CloseChat();\n }\n\n /**\n * The chat-area created its backing conversation after the user's first message — capture the live\n * conversation, re-feed the pending message in the same change-detection cycle, and leave new-mode so\n * the thread renders (mirrors the Form Builder co-pilot's atomic state-flip).\n */\n public OnChatConversationCreated(event: { conversation: MJConversationEntity; pendingMessage?: string }): void {\n this.PendingPrompt = event.pendingMessage ?? null;\n this.ChatConversation = event.conversation;\n this.ChatConversationId = event.conversation.ID;\n this.ChatIsNewConversation = false;\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link OnChatConversationCreated}. */\n public onChatConversationCreated(event: { conversation: MJConversationEntity; pendingMessage?: string }): void {\n return this.OnChatConversationCreated(event);\n }\n\n /** The chat-area delivered the seeded prompt — clear the buffer so a re-render doesn't resend it. */\n public OnChatPendingMessageConsumed(): void {\n this.PendingPrompt = null;\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link OnChatPendingMessageConsumed}. */\n public onChatPendingMessageConsumed(): void {\n return this.OnChatPendingMessageConsumed();\n }\n\n public get CurrentUser(): UserInfo | null { return this.ProviderToUse.CurrentUser ?? null; }\n\n /** @deprecated Use {@link CurrentUser}. */\n public get currentUser(): UserInfo | null {\n return this.CurrentUser;\n }\n public get ChatEnvironmentId(): string {\n return (this.Data?.Configuration?.['environmentId'] as string | undefined) || MJEnvironmentEntityExtended.DefaultEnvironmentID;\n }\n\n /** @deprecated Use {@link ChatEnvironmentId}. */\n public get chatEnvironmentId(): string {\n return this.ChatEnvironmentId;\n }\n public get applicationId(): string | null { return (this.Data?.Configuration?.['applicationId'] as string | undefined) ?? null; }\n public get ModelDevAgentId(): string | null { return this._modelDevAgentId; }\n\n /** @deprecated Use {@link ModelDevAgentId}. */\n public get modelDevAgentId(): string | null {\n return this.ModelDevAgentId;\n }\n public get ChatAppContext(): Record<string, unknown> {\n return { app: 'Predictive Studio', section: 'predictions', publishedModels: this.engine.PublishedModels.length };\n }\n\n /** @deprecated Use {@link ChatAppContext}. */\n public get chatAppContext(): Record<string, unknown> {\n return this.ChatAppContext;\n }\n\n private async ensureModelDevAgentResolved(): Promise<void> {\n if (this._modelDevAgentId) return;\n try {\n await AIEngineBase.Instance.Config(false, this.ProviderToUse.CurrentUser ?? undefined);\n this._modelDevAgentId =\n AIEngineBase.Instance.Agents?.find((a) => a.Name?.trim().toLowerCase() === MODEL_DEV_AGENT_NAME.toLowerCase())?.ID ?? null;\n if (!this._modelDevAgentId) LogError(`PSPredictionsResource: '${MODEL_DEV_AGENT_NAME}' not found — chat uses default-agent routing.`);\n this.cdrLocal.detectChanges();\n } catch (err) {\n LogError(`PSPredictionsResource.ensureModelDevAgentResolved: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n}\n\n/** Tree-shaking prevention — called from the subpath module so the @RegisterClass survives bundling. */\nexport function LoadPSPredictionsResource(): void {\n // intentionally empty\n}\n"]}
1
+ {"version":3,"file":"ps-predictions-resource.component.js","sourceRoot":"","sources":["../../../src/PredictiveStudio/resources/ps-predictions-resource.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, inject } from '@angular/core';\nimport { NormalizeUUID, RegisterClass, UUIDsEqual } from '@memberjunction/global';\nimport { CompositeKey, LogError, RunView, UserInfo } from '@memberjunction/core';\nimport { MJConversationEntity, MJEnvironmentEntityExtended, MJMLModelEntity, MJListEntity, MJListDetailEntity, UserInfoEngine } from '@memberjunction/core-entities';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { PredictiveStudioEngine } from '../engine/predictive-studio.engine';\nimport { TrustVerdicts, AtRiskRules, ImportanceDisplay, type AtRiskRow } from '@memberjunction/predictive-studio-core';\nimport type { PredictionGridRowsLoadedEvent } from '../components/ps-predictions-grid.component';\nimport { BaseResourceComponent } from '@memberjunction/ng-shared';\nimport { PSResourceBase } from './ps-resource-base';\nimport { buildBusinessCatalog, type BusinessPredictionCard } from '../business-predictions.view-models';\nimport { buildPredictionsAgentContext, resolvePSRecord, buildPSNotFoundError } from '../predictive-studio-agent-context';\nimport { validateStringParam } from '../../shared/agent-tool-validation';\nimport { BuildRecordIdFilter } from '../../shared/record-id-filter';\nimport { buildImprovePrompt, PS_CAPABILITY_CARDS, type PSCapabilityCard } from '../predictive-studio-copilot.view-models';\n\nconst PREDICTIVE_STUDIO_APP_ID = '299C9272-8D38-40CA-85D4-0980F2C9FAD1';\nconst MODEL_DEV_AGENT_NAME = 'Model Development Agent';\n\n/**\n * **Predictions** — the business-user home for Predictive Studio (`option-b-refined` mockup). Reframes\n * published ML models as plain-language \"predictions\" in a catalog, each with a trust badge; opening one\n * goes to a workspace whose trust verdict GATES the actions (a Poor/unmeasured prediction can't be acted\n * on). \"+ New prediction\" opens the Model Development Agent (the deterministic builder) as a docked\n * co-pilot. Zero ML jargon — the analyst surfaces stay under the other nav items as \"Advanced\".\n */\n@RegisterClass(BaseResourceComponent, 'PredictiveStudioPredictionsResource')\n@Component({\n standalone: false,\n selector: 'mj-ps-predictions-resource',\n template: `\n <mj-page-header-interior\n [Title]=\"view === 'workspace' ? (selected?.title ?? 'Prediction') : 'Predictions'\"\n [Subtitle]=\"view === 'workspace' ? 'Who to focus on, how much to trust it, and what to do next' : 'Ready-to-use predictions for your records'\">\n <div actions>\n @if (view === 'catalog') {\n <button mjButton variant=\"primary\" size=\"sm\" data-testid=\"ps-new-prediction\" (click)=\"newPrediction()\">\n <i class=\"fa-solid fa-plus\"></i> New prediction\n </button>\n }\n </div>\n </mj-page-header-interior>\n <mj-page-body-interior [Flex]=\"true\" [Padding]=\"false\">\n @if (isLoading) {\n <mj-loading text=\"Loading your predictions…\" size=\"medium\"></mj-loading>\n } @else if (loadError) {\n <div class=\"ps-load-error\" data-testid=\"ps-load-error\" role=\"alert\">\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n <div class=\"ps-load-error-text\">\n <strong>Couldn't load {{ sectionTitle }}</strong>\n <span class=\"ps-load-error-detail\">{{ loadError }}</span>\n </div>\n <button mjButton variant=\"secondary\" size=\"sm\" (click)=\"retryLoad()\"><i class=\"fa-solid fa-rotate-right\"></i> Try again</button>\n </div>\n } @else {\n <div class=\"ps-biz-host\" [class.chat-open]=\"chatOpen\">\n <as-split direction=\"horizontal\" class=\"biz-copilot-splitter\" unit=\"percent\" [gutterSize]=\"chatOpen ? 6 : 0\" (dragEnd)=\"onCopilotSplitDragEnd($event.sizes)\">\n <as-split-area [size]=\"chatOpen ? mainSizePct : 100\" [minSize]=\"30\">\n <div class=\"ps-biz-main\">\n <!-- ───────── CATALOG ───────── -->\n @if (view === 'catalog') {\n @if (cards.length === 0) {\n <div class=\"ps-biz-intro\" data-testid=\"ps-predictions-empty\">\n <div class=\"ps-biz-intro-head\">\n <i class=\"fa-solid fa-wand-magic-sparkles\"></i>\n <h2>Predict what's next for your data</h2>\n <p>Predictive Studio turns your records into plain-language predictions — describe what you want to know, and the agent builds and trains a model with you. Here's what you can do:</p>\n </div>\n <div class=\"ps-cap-grid\">\n @for (cap of capabilityCards; track cap.title) {\n <div class=\"ps-cap-card\">\n <i [class]=\"cap.icon\"></i>\n <div class=\"ps-cap-title\">{{ cap.title }}</div>\n <div class=\"ps-cap-blurb\">{{ cap.blurb }}</div>\n </div>\n }\n </div>\n <button mjButton variant=\"primary\" size=\"md\" data-testid=\"ps-intro-build\" (click)=\"newPrediction()\"><i class=\"fa-solid fa-plus\"></i> Build your first prediction</button>\n </div>\n } @else {\n <div class=\"ps-biz-grid\" data-testid=\"ps-predictions-grid\">\n @for (c of cards; track c.modelId) {\n <div class=\"ps-biz-card\" [class.blocked]=\"!c.canOpen\" data-testid=\"ps-prediction-card\">\n <div class=\"ps-biz-card-top\">\n <span class=\"ps-trust-badge\" [class]=\"'trust-' + c.trust.grade.toLowerCase()\" data-testid=\"ps-trust-badge\">\n <i class=\"fa-solid fa-shield-halved\"></i> {{ c.canOpen ? c.trust.grade : 'Not ready' }}\n </span>\n </div>\n <h3 class=\"ps-biz-card-title\">{{ c.title }}</h3>\n <p class=\"ps-biz-card-line\">{{ c.canOpen ? c.trust.oneLiner : c.blockedReason }}</p>\n <div class=\"ps-biz-card-foot\">\n @if (c.canOpen) {\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-open-prediction\" (click)=\"open(c)\">Open <i class=\"fa-solid fa-arrow-right\"></i></button>\n } @else {\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-improve-prediction\" (click)=\"improvePrediction(c)\"><i class=\"fa-solid fa-wand-magic-sparkles\"></i> Improve this</button>\n }\n </div>\n </div>\n }\n </div>\n }\n }\n\n <!-- ───────── WORKSPACE (trust gate) ───────── -->\n @if (view === 'workspace' && selected) {\n <nav class=\"ps-biz-crumb\">\n <a (click)=\"backToCatalog()\" data-testid=\"ps-crumb-home\">Predictions</a>\n <i class=\"fa-solid fa-chevron-right\"></i> <span>{{ selected.title }}</span>\n </nav>\n\n <div class=\"ps-trust-banner\" [class]=\"'trust-' + selected.trust.grade.toLowerCase()\" data-testid=\"ps-trust-banner\">\n <div class=\"ps-trust-dots\">\n @for (d of [1,2,3,4,5]; track d) { <i class=\"fa-solid fa-star\" [class.on]=\"d <= dots(selected)\"></i> }\n </div>\n <div class=\"ps-trust-text\">\n <div class=\"ps-trust-grade\">{{ selected.canOpen ? 'You can rely on this — ' + selected.trust.grade : 'Not reliable yet' }}</div>\n <div class=\"ps-trust-line\">{{ selected.trust.oneLiner }}</div>\n <div class=\"ps-trust-explain muted\">{{ selected.trust.explanation }}</div>\n <div class=\"ps-trust-evidence muted\">{{ evidence() }}</div>\n </div>\n </div>\n\n <div class=\"ps-biz-workspace-body\" data-testid=\"ps-workspace-body\">\n @if (selected.canOpen) {\n @if (drivers.length > 0) {\n <div class=\"ps-drivers\" data-testid=\"ps-drivers\">\n <i class=\"fa-solid fa-lightbulb\"></i> <strong>Weighted most by this model:</strong>\n @for (d of drivers; track d) { <span class=\"ps-driver-chip\">{{ d }}</span> }\n </div>\n }\n <!-- Rendered once the latest run is resolved, so the grid reads that run once; its rows feed the counts, export and list. -->\n @if (LatestRunResolved) {\n <ps-predictions-grid\n data-testid=\"ps-atrisk-list\"\n #atriskList\n [modelId]=\"selected.modelId\"\n [runId]=\"LatestRunId\"\n [title]=\"selected.title\"\n [entityName]=\"selectedTargetEntityName\"\n [problemType]=\"selectedProblemType\"\n height=\"580px\"\n (RowsLoaded)=\"OnAtRiskRowsLoaded($event)\"\n (RowsLoadFailed)=\"OnAtRiskRowsLoadFailed($event)\">\n </ps-predictions-grid>\n } @else {\n <mj-loading text=\"Finding the latest predictions…\" size=\"small\"></mj-loading>\n }\n }\n <div class=\"ps-action-bar\" [class.locked]=\"!selected.canOpen\" data-testid=\"ps-action-bar\">\n @if (selected.canOpen) {\n <button mjButton variant=\"primary\" size=\"sm\" data-testid=\"ps-act-review\" (click)=\"scrollToList()\"><i class=\"fa-solid fa-list-check\"></i> Review the call list</button>\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-act-save\" (click)=\"askAgentTo('Save these prediction scores onto the records so my team can use them.')\"><i class=\"fa-solid fa-floppy-disk\"></i> Save scores to records</button>\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-act-list\" [disabled]=\"creatingList || atRiskRows.length === 0\" (click)=\"sendToList()\"><i class=\"fa-solid\" [class.fa-paper-plane]=\"!creatingList\" [class.fa-spinner]=\"creatingList\" [class.fa-spin]=\"creatingList\"></i> Send to a list</button>\n <button mjButton variant=\"secondary\" size=\"sm\" data-testid=\"ps-act-export\" [disabled]=\"atRiskRows.length === 0\" (click)=\"exportList()\"><i class=\"fa-solid fa-file-export\"></i> Share / export</button>\n } @else {\n <div class=\"ps-action-locked\"><i class=\"fa-solid fa-lock\"></i> {{ selected.trust.gateReason }}</div>\n }\n </div>\n @if (selected.canOpen && AtRiskCapped) { <div class=\"ps-list-result muted\" data-testid=\"ps-atrisk-capped\">The latest run has more than {{ MaxRunDetailRowsLabel }} predictions; this list shows the first {{ MaxRunDetailRowsLabel }}.</div> }\n @if (listResult) { <div class=\"ps-list-result muted\" data-testid=\"ps-list-result\">{{ listResult }}</div> }\n </div>\n }\n </div>\n </as-split-area>\n\n @if (chatOpen) {\n <as-split-area [size]=\"copilotSizePct\" [minSize]=\"20\" [maxSize]=\"65\">\n <aside class=\"ps-biz-copilot\" data-testid=\"ps-predictions-copilot\">\n <div class=\"ps-biz-copilot-head\">\n <div class=\"ps-biz-copilot-title\"><i class=\"fa-solid fa-robot\"></i> New prediction</div>\n <button class=\"ps-biz-copilot-close\" (click)=\"closeChat()\" aria-label=\"Close\"><i class=\"fa-solid fa-xmark\"></i></button>\n </div>\n <div class=\"ps-biz-copilot-body\">\n @if (currentUser) {\n <mj-conversation-chat-area\n [Provider]=\"Provider\" [environmentId]=\"chatEnvironmentId\" [currentUser]=\"currentUser\"\n [conversation]=\"chatConversation\" [conversationId]=\"chatConversationId\" [isNewConversation]=\"chatIsNewConversation\"\n [suppressNewConversationEmptyState]=\"true\" [allowMentions]=\"false\" [overlayMode]=\"true\"\n [showExportButton]=\"false\" [showShareButton]=\"false\" [showArtifactIndicator]=\"false\"\n [showAgentPicker]=\"false\" [showAgentModePicker]=\"false\"\n [defaultAgentId]=\"modelDevAgentId\" [pendingMessage]=\"pendingPrompt\"\n [applicationScope]=\"'Application'\" [applicationId]=\"applicationId\" [appContext]=\"chatAppContext\"\n (conversationCreated)=\"onChatConversationCreated($event)\"\n (pendingMessageConsumed)=\"onChatPendingMessageConsumed()\">\n </mj-conversation-chat-area>\n } @else { <div class=\"ps-biz-copilot-empty\"><mj-loading text=\"Connecting…\" size=\"small\"></mj-loading></div> }\n </div>\n </aside>\n </as-split-area>\n }\n </as-split>\n </div>\n }\n </mj-page-body-interior>\n `,\n styles: [\n `\n :host { display: flex; flex-direction: column; width: 100%; height: 100%; min-height: 0; }\n .ps-biz-host { display: flex; flex: 1; min-height: 0; overflow: hidden; }\n .biz-copilot-splitter { flex: 1; width: 100%; height: 100%; min-height: 0; min-width: 0; }\n .biz-copilot-splitter .as-split-gutter { background: transparent; transition: background-color 0.15s ease; position: relative; }\n .biz-copilot-splitter .as-split-gutter:hover { background-color: var(--mj-brand-primary, #6366f1); }\n .biz-copilot-splitter .as-split-gutter::after { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 2px; height: 24px; border-radius: 1px; background: var(--mj-border-strong, #cbd5e1); }\n .ps-biz-main { width: 100%; height: 100%; flex: 1; min-width: 0; overflow-y: auto; padding: 16px 18px 28px; }\n .ps-biz-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 16px; }\n .ps-biz-card { background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default); border-radius: var(--mj-radius-md); padding: 18px; display: flex; flex-direction: column; gap: 10px; transition: border-color .12s, background .12s; }\n .ps-biz-card:hover { border-color: var(--mj-brand-primary); background: color-mix(in srgb, var(--mj-brand-primary) 4%, var(--mj-bg-surface)); }\n .ps-biz-card.blocked { opacity: .85; background: var(--mj-bg-surface-card); }\n .ps-biz-card-title { font-size: var(--mj-text-lg); font-weight: 600; color: var(--mj-text-primary); margin: 0; }\n .ps-biz-card-line { color: var(--mj-text-secondary); font-size: var(--mj-text-sm); margin: 0; flex: 1; }\n .ps-biz-card-foot { display: flex; justify-content: flex-end; }\n .ps-trust-badge { display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px; border-radius: var(--mj-radius-full); font-size: var(--mj-text-xs); font-weight: 600; }\n .trust-good, .trust-excellent { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n .trust-fair { background: var(--mj-status-warning-bg); color: var(--mj-status-warning-text); }\n .trust-poor { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n .ps-biz-intro { max-width: 820px; margin: 32px auto; text-align: center; display: flex; flex-direction: column; align-items: center; gap: 20px; }\n .ps-biz-intro-head i { font-size: 40px; color: var(--mj-brand-primary); }\n .ps-biz-intro-head h2 { margin: 12px 0 6px; color: var(--mj-text-primary); font-size: var(--mj-text-xl); }\n .ps-biz-intro-head p { margin: 0 auto; max-width: 620px; color: var(--mj-text-secondary); font-size: var(--mj-text-sm); }\n .ps-cap-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 14px; width: 100%; }\n .ps-cap-card { background: var(--mj-bg-surface); border: 1px solid var(--mj-border-default); border-radius: var(--mj-radius-md); padding: 18px 16px; text-align: left; display: flex; flex-direction: column; gap: 6px; }\n .ps-cap-card i { font-size: 20px; color: var(--mj-brand-primary); }\n .ps-cap-title { font-weight: 600; color: var(--mj-text-primary); font-size: var(--mj-text-sm); }\n .ps-cap-blurb { color: var(--mj-text-secondary); font-size: var(--mj-text-xs); line-height: 1.45; }\n .ps-biz-crumb { display: flex; align-items: center; gap: 8px; font-size: var(--mj-text-sm); color: var(--mj-text-muted); margin-bottom: 14px; }\n .ps-biz-crumb a { color: var(--mj-text-link); cursor: pointer; }\n .ps-biz-crumb a:hover { text-decoration: underline; }\n .ps-biz-crumb i { font-size: 10px; }\n .ps-trust-banner { display: flex; gap: 16px; align-items: center; padding: 18px 20px; border-radius: var(--mj-radius-md); border: 1px solid; margin-bottom: 18px; }\n .ps-trust-banner.trust-good, .ps-trust-banner.trust-excellent { background: var(--mj-status-success-bg); border-color: var(--mj-status-success-border); }\n .ps-trust-banner.trust-fair { background: var(--mj-status-warning-bg); border-color: var(--mj-status-warning-border); }\n .ps-trust-banner.trust-poor { background: var(--mj-status-error-bg); border-color: var(--mj-status-error-border); }\n .ps-trust-dots { display: flex; gap: 3px; font-size: 18px; }\n .ps-trust-dots i { color: var(--mj-border-strong); } .ps-trust-dots i.on { color: var(--mj-status-warning); }\n .ps-trust-banner.trust-good .ps-trust-dots i.on, .ps-trust-banner.trust-excellent .ps-trust-dots i.on { color: var(--mj-status-success); }\n .ps-trust-grade { font-weight: 700; font-size: var(--mj-text-lg); color: var(--mj-text-primary); }\n .ps-trust-line { font-weight: 600; color: var(--mj-text-primary); margin-top: 2px; }\n .ps-trust-explain, .ps-trust-evidence { font-size: var(--mj-text-sm); margin-top: 4px; }\n .ps-action-bar { display: flex; gap: 10px; flex-wrap: wrap; padding: 14px 16px; border-radius: var(--mj-radius-md); background: var(--mj-bg-surface-card); border: 1px solid var(--mj-border-default); }\n .ps-action-bar.locked { background: var(--mj-status-error-bg); border-color: var(--mj-status-error-border); }\n .ps-action-locked { display: flex; align-items: center; gap: 8px; color: var(--mj-status-error-text); font-weight: 600; font-size: var(--mj-text-sm); }\n .ps-drivers { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 0 0 16px; color: var(--mj-text-secondary); font-size: var(--mj-text-sm); }\n .ps-drivers i { color: var(--mj-status-warning); }\n .ps-driver-chip { background: var(--mj-bg-surface-card); border: 1px solid var(--mj-border-default); border-radius: var(--mj-radius-full); padding: 2px 10px; font-weight: 600; color: var(--mj-text-primary); }\n .ps-atrisk { border: 1px solid var(--mj-border-default); border-radius: var(--mj-radius-md); overflow: hidden; margin-bottom: 16px; background: var(--mj-bg-surface); }\n .ps-atrisk-head { display: grid; grid-template-columns: 1fr 140px 52px; gap: 12px; padding: 8px 14px; background: var(--mj-bg-surface-card); border-bottom: 1px solid var(--mj-border-default); font-size: var(--mj-text-xs); font-weight: 600; color: var(--mj-text-muted); text-transform: uppercase; letter-spacing: .03em; }\n .ps-atrisk-rcol { grid-column: 2 / span 2; text-align: right; }\n .ps-atrisk-row { display: grid; grid-template-columns: 1fr 140px 52px; gap: 12px; align-items: center; padding: 9px 14px; border-bottom: 1px solid var(--mj-border-subtle); }\n .ps-atrisk-row:last-child { border-bottom: none; }\n .ps-atrisk-row:hover { background: var(--mj-bg-surface-hover); }\n .ps-atrisk-idcell { display: flex; flex-direction: column; gap: 4px; min-width: 0; }\n .ps-atrisk-id { font-size: var(--mj-text-xs); color: var(--mj-text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .ps-atrisk-why { display: flex; gap: 6px; flex-wrap: wrap; }\n .ps-why-chip { display: inline-flex; align-items: center; gap: 4px; font-size: 10px; font-weight: 600; padding: 1px 7px; border-radius: var(--mj-radius-full); max-width: 160px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .ps-why-chip i { font-size: 8px; }\n .ps-why-chip.up { background: var(--mj-status-error-bg); color: var(--mj-status-error-text); }\n .ps-why-chip.down { background: var(--mj-status-success-bg); color: var(--mj-status-success-text); }\n .ps-atrisk-bar { height: 8px; border-radius: var(--mj-radius-full); background: var(--mj-bg-surface-sunken); overflow: hidden; }\n .ps-atrisk-fill { display: block; height: 100%; border-radius: var(--mj-radius-full); }\n .ps-atrisk-pct { text-align: right; font-weight: 700; font-size: var(--mj-text-sm); font-variant-numeric: tabular-nums; }\n .ps-atrisk-fill.risk-high { background: var(--mj-status-error); }\n .ps-atrisk-fill.risk-medium { background: var(--mj-status-warning); }\n .ps-atrisk-fill.risk-low { background: var(--mj-status-success); }\n .ps-atrisk-pct.risk-high { color: var(--mj-status-error-text); }\n .ps-atrisk-pct.risk-medium { color: var(--mj-status-warning-text); }\n .ps-atrisk-pct.risk-low { color: var(--mj-status-success-text); }\n .ps-atrisk-foot { padding: 8px 14px; font-size: var(--mj-text-xs); }\n .ps-atrisk-empty { padding: 24px; text-align: center; border: 1px dashed var(--mj-border-default); border-radius: var(--mj-radius-md); margin-bottom: 16px; }\n .ps-atrisk-error { display: flex; align-items: center; gap: 10px; padding: 16px 18px; border: 1px solid var(--mj-status-error-border); background: var(--mj-status-error-bg); border-radius: var(--mj-radius-md); margin-bottom: 16px; color: var(--mj-status-error-text); font-size: var(--mj-text-sm); }\n .ps-atrisk-error i { color: var(--mj-status-error); }\n .ps-atrisk-error .ps-atrisk-error-msg { flex: 1; min-width: 0; word-break: break-word; }\n .mono { font-family: var(--mj-font-family-mono); }\n /* Kept local (not in the shared stylesheet) deliberately: shared styles are injected by the\n ViewEncapsulation.None PANEL components, and this banner renders precisely when panels DON'T. */\n .ps-load-error { display: flex; align-items: center; gap: 14px; max-width: 620px; margin: 32px auto; padding: 18px 20px; border: 1px solid var(--mj-status-error-border); background: var(--mj-status-error-bg); border-radius: var(--mj-radius-lg); }\n .ps-load-error > i { font-size: 24px; color: var(--mj-status-error); }\n .ps-load-error-text { display: flex; flex-direction: column; gap: 2px; flex: 1; min-width: 0; }\n .ps-load-error-text strong { color: var(--mj-text-primary); }\n .ps-load-error-detail { color: var(--mj-text-secondary); font-size: var(--mj-text-sm); word-break: break-word; }\n .ps-biz-copilot { width: 100%; height: 100%; max-width: none; flex: 1; border-left: 1px solid var(--mj-border-default); background: var(--mj-bg-surface); display: flex; flex-direction: column; min-height: 0; }\n .ps-biz-copilot-head { display: flex; align-items: center; justify-content: space-between; padding: 10px 14px; border-bottom: 1px solid var(--mj-border-default); }\n .ps-biz-copilot-title { display: flex; align-items: center; gap: 8px; font-weight: 600; color: var(--mj-text-primary); }\n .ps-biz-copilot-title i { color: var(--mj-brand-primary); }\n .ps-biz-copilot-close { background: transparent; border: none; cursor: pointer; padding: 6px 8px; border-radius: 6px; color: var(--mj-text-muted); }\n .ps-biz-copilot-close:hover { background: var(--mj-bg-surface-hover); color: var(--mj-text-secondary); }\n .ps-biz-copilot-body { flex: 1; min-height: 0; overflow: hidden; display: flex; flex-direction: column; }\n .ps-biz-copilot-body mj-conversation-chat-area { flex: 1; min-height: 0; display: block; }\n .ps-biz-copilot-empty { display: flex; align-items: center; justify-content: center; flex: 1; }\n @media (max-width: 1100px) { .ps-biz-host.chat-open .ps-biz-main { display: none; } .ps-biz-copilot { width: 100%; max-width: none; border-left: none; } }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class PSPredictionsResourceComponent extends PSResourceBase {\n protected readonly SectionKey = 'predictions';\n protected readonly SectionLabel = 'Predictions';\n protected readonly SectionIcon = 'fa-solid fa-wand-magic-sparkles';\n\n private readonly cdrLocal = inject(ChangeDetectorRef);\n\n /** catalog (the home grid) ↔ workspace (a selected prediction). */\n public View: 'catalog' | 'workspace' = 'catalog';\n\n /** @deprecated Use {@link View}. */\n public get view(): 'catalog' | 'workspace' {\n return this.View;\n }\n /** @deprecated Use {@link View}. */\n public set view(value: 'catalog' | 'workspace') {\n this.View = value;\n }\n public Selected: BusinessPredictionCard | null = null;\n\n /** @deprecated Use {@link Selected}. */\n public get selected(): BusinessPredictionCard | null {\n return this.Selected;\n }\n /** @deprecated Use {@link Selected}. */\n public set selected(value: BusinessPredictionCard | null) {\n this.Selected = value;\n }\n public ChatOpen = false;\n\n /** @deprecated Use {@link ChatOpen}. */\n public get chatOpen() {\n return this.ChatOpen;\n }\n /** @deprecated Use {@link ChatOpen}. */\n public set chatOpen(value) {\n this.ChatOpen = value;\n }\n public PendingPrompt: string | null = null;\n\n /** @deprecated Use {@link PendingPrompt}. */\n public get pendingPrompt(): string | null {\n return this.PendingPrompt;\n }\n /** @deprecated Use {@link PendingPrompt}. */\n public set pendingPrompt(value: string | null) {\n this.PendingPrompt = value;\n }\n private _modelDevAgentId: string | null = null;\n\n /**\n * Embedded co-pilot conversation state. The chat-area starts in \"new conversation\" mode; on the first\n * send it creates the conversation and emits `conversationCreated`, at which point we capture the live\n * conversation and flip out of new-mode so subsequent sends append to the same thread. Without this\n * wiring the suppressed empty-state input has no valid conversation to write into and the first send\n * silently no-ops (matches the proven Form Builder co-pilot pattern).\n */\n public ChatConversation: MJConversationEntity | null = null;\n\n /** @deprecated Use {@link ChatConversation}. */\n public get chatConversation(): MJConversationEntity | null {\n return this.ChatConversation;\n }\n /** @deprecated Use {@link ChatConversation}. */\n public set chatConversation(value: MJConversationEntity | null) {\n this.ChatConversation = value;\n }\n public ChatConversationId: string | null = null;\n\n /** @deprecated Use {@link ChatConversationId}. */\n public get chatConversationId(): string | null {\n return this.ChatConversationId;\n }\n /** @deprecated Use {@link ChatConversationId}. */\n public set chatConversationId(value: string | null) {\n this.ChatConversationId = value;\n }\n public ChatIsNewConversation = true;\n\n /** @deprecated Use {@link ChatIsNewConversation}. */\n public get chatIsNewConversation() {\n return this.ChatIsNewConversation;\n }\n /** @deprecated Use {@link ChatIsNewConversation}. */\n public set chatIsNewConversation(value) {\n this.ChatIsNewConversation = value;\n }\n public MainSizePct = 68;\n\n /** @deprecated Use {@link MainSizePct}. */\n public get mainSizePct() {\n return this.MainSizePct;\n }\n /** @deprecated Use {@link MainSizePct}. */\n public set mainSizePct(value) {\n this.MainSizePct = value;\n }\n public CopilotSizePct = 32;\n\n /** @deprecated Use {@link CopilotSizePct}. */\n public get copilotSizePct() {\n return this.CopilotSizePct;\n }\n /** @deprecated Use {@link CopilotSizePct}. */\n public set copilotSizePct(value) {\n this.CopilotSizePct = value;\n }\n\n override ngOnInit(): void {\n super.ngOnInit();\n this.loadLayoutPrefs();\n }\n\n public OnCopilotSplitDragEnd(sizes: readonly (number | '*')[]): void {\n if (Array.isArray(sizes) && sizes.length === 2 && typeof sizes[0] === 'number' && typeof sizes[1] === 'number') {\n this.MainSizePct = Math.round(sizes[0]);\n this.CopilotSizePct = Math.round(sizes[1]);\n this.saveLayoutPrefs();\n }\n }\n\n /** @deprecated Use {@link OnCopilotSplitDragEnd}. */\n public onCopilotSplitDragEnd(sizes: readonly (number | '*')[]): void {\n return this.OnCopilotSplitDragEnd(sizes);\n }\n\n private loadLayoutPrefs(): void {\n const saved = UserInfoEngine.Instance.GetSetting('mj.predictiveStudio.predictions.layout');\n if (saved) {\n try {\n const parsed = JSON.parse(saved);\n if (typeof parsed.copilotSizePct === 'number' && parsed.copilotSizePct >= 20 && parsed.copilotSizePct <= 60) {\n this.CopilotSizePct = parsed.copilotSizePct;\n this.MainSizePct = 100 - this.CopilotSizePct;\n }\n } catch {}\n }\n }\n\n private saveLayoutPrefs(): void {\n const prefs = {\n copilotSizePct: this.CopilotSizePct,\n mainSizePct: this.MainSizePct,\n };\n UserInfoEngine.Instance.SetSettingDebounced('mj.predictiveStudio.predictions.layout', JSON.stringify(prefs));\n }\n\n /** The ranked at-risk rows for the open prediction's latest run (empty until loaded / when no run yet). */\n public AtRiskRows: AtRiskRow[] = [];\n\n /** @deprecated Use {@link AtRiskRows}. */\n public get atRiskRows(): AtRiskRow[] {\n return this.AtRiskRows;\n }\n /** @deprecated Use {@link AtRiskRows}. */\n public set atRiskRows(value: AtRiskRow[]) {\n this.AtRiskRows = value;\n }\n /** The features the model weighted most for the open prediction (coefficient models only). */\n public Drivers: string[] = [];\n\n /** @deprecated Use {@link Drivers}. */\n public get drivers(): string[] {\n return this.Drivers;\n }\n /** @deprecated Use {@link Drivers}. */\n public set drivers(value: string[]) {\n this.Drivers = value;\n }\n /**\n * True when the latest run has more predictions than {@link PredictiveStudioEngine.MaxRunDetailRows}: the at-risk\n * list holds only the first ones, and the workspace says so.\n */\n public AtRiskCapped = false;\n\n /** The run-detail cap, formatted for the capped notice. */\n public readonly MaxRunDetailRowsLabel = PredictiveStudioEngine.MaxRunDetailRowsLabel;\n\n /** The most at-risk records \"Send to a list\" adds, highest risk first. */\n public static readonly AtRiskListLimit = 200;\n\n /** True once the open prediction's latest run is looked up (found or not): the grid then renders and reads it once. */\n public LatestRunResolved = false;\n\n /** Whether the at-risk list is loading for the open prediction. */\n public AtRiskLoading = false;\n\n /** @deprecated Use {@link AtRiskLoading}. */\n public get atRiskLoading() {\n return this.AtRiskLoading;\n }\n /** @deprecated Use {@link AtRiskLoading}. */\n public set atRiskLoading(value) {\n this.AtRiskLoading = value;\n }\n /** Set when the at-risk load fails — the workspace shows a \"couldn't load\" banner with retry instead of the misleading no-results empty state. */\n public AtRiskError: string | null = null;\n\n /** @deprecated Use {@link AtRiskError}. */\n public get atRiskError(): string | null {\n return this.AtRiskError;\n }\n /** @deprecated Use {@link AtRiskError}. */\n public set atRiskError(value: string | null) {\n this.AtRiskError = value;\n }\n /** \"Send to a list\" in-flight guard + last-result message (P1 #4). */\n public CreatingList = false;\n\n /** @deprecated Use {@link CreatingList}. */\n public get creatingList() {\n return this.CreatingList;\n }\n /** @deprecated Use {@link CreatingList}. */\n public set creatingList(value) {\n this.CreatingList = value;\n }\n public ListResult: string | null = null;\n\n /** @deprecated Use {@link ListResult}. */\n public get listResult(): string | null {\n return this.ListResult;\n }\n /** @deprecated Use {@link ListResult}. */\n public set listResult(value: string | null) {\n this.ListResult = value;\n }\n public LatestRunId: string | null = null;\n\n /** @deprecated Use {@link LatestRunId}. */\n public get latestRunId(): string | null {\n return this.LatestRunId;\n }\n /** @deprecated Use {@link LatestRunId}. */\n public set latestRunId(value: string | null) {\n this.LatestRunId = value;\n }\n\n /** Capability cards for the first-run intro (what PS can do), shown when the catalog is empty. */\n public readonly CapabilityCards: readonly PSCapabilityCard[] = PS_CAPABILITY_CARDS;\n\n /** @deprecated Use {@link CapabilityCards}. */\n public get capabilityCards(): readonly PSCapabilityCard[] {\n return this.CapabilityCards;\n }\n\n /** The business catalog cards, most-trustworthy first, derived from the engine's published models. */\n public get Cards(): BusinessPredictionCard[] {\n return buildBusinessCatalog(\n this.engine.PublishedModels.map((m: MJMLModelEntity) => ({\n modelId: m.ID,\n name: this.engine.ModelDisplayName(m),\n HoldoutMetrics: m.HoldoutMetrics,\n Metrics: m.Metrics,\n ProblemType: m.ProblemType,\n Lineage: m.Lineage,\n updatedAt: m.__mj_UpdatedAt ?? null,\n })),\n );\n }\n\n /** @deprecated Use {@link Cards}. */\n public get cards(): BusinessPredictionCard[] {\n return this.Cards;\n }\n\n public Dots(c: BusinessPredictionCard): number { return TrustVerdicts.TrustDots(c.trust.grade); }\n\n /** @deprecated Use {@link Dots}. */\n public dots(c: BusinessPredictionCard): number {\n return this.Dots(c);\n }\n public Evidence(): string { return TrustVerdicts.TrustEvidenceLine({ noun: 'records' }); }\n\n /** @deprecated Use {@link Evidence}. */\n public evidence(): string {\n return this.Evidence();\n }\n\n /** Deep agent context for the Predictions door: catalog counts + names, and (in workspace) the selection + at-risk breakdown. */\n protected override extraAgentContext(): Record<string, unknown> {\n const cards = this.Cards;\n return buildPredictionsAgentContext({\n View: this.View,\n PredictionCount: cards.length,\n ReadyPredictionCount: cards.filter((c) => c.canOpen).length,\n VisiblePredictionNames: cards.map((c) => c.title),\n ChatOpen: this.ChatOpen,\n Selected: this.Selected ? { Name: this.Selected.title, TrustGrade: this.Selected.trust.grade, CanOpen: this.Selected.canOpen } : null,\n AtRiskLoaded: this.View === 'workspace' && !this.AtRiskLoading && !this.AtRiskError,\n AtRiskCount: this.AtRiskRows.length,\n AtRiskCapped: this.AtRiskCapped,\n HighRiskCount: this.AtRiskRows.filter((r) => r.Band === 'high').length,\n MediumRiskCount: this.AtRiskRows.filter((r) => r.Band === 'medium').length,\n LowRiskCount: this.AtRiskRows.filter((r) => r.Band === 'low').length,\n Drivers: this.Drivers,\n });\n }\n\n /**\n * 🔒 Read/navigate-only agent tools for the Predictions door: open a (trust-cleared) prediction, go back\n * to the catalog, review the call list, export the at-risk list (CSV — read-only, mirrors Data Explorer's\n * ExportView), and open the \"+ New prediction\" co-pilot. **DELIBERATELY NOT exposed:** \"Save scores to\n * records\", \"Send to a list\" (both WRITE records), and any train/publish/delete — those stay behind the\n * user's clicks and the approve-gated builder.\n */\n protected override registerAgentTools(): void {\n this.navigationService.SetAgentClientTools(this, [\n {\n Name: 'OpenPrediction',\n Description:\n 'Open a prediction to its workspace (trust verdict + who-is-at-risk list). Pass the prediction ID or name (see VisiblePredictionNames). Only trust-cleared predictions can open; a blocked one returns why.',\n ParameterSchema: { type: 'object', properties: { prediction: { type: 'string', description: 'The prediction ID or name to open' } } },\n Handler: async (params: Record<string, unknown>) => {\n const check = validateStringParam(params['prediction'], 'prediction');\n if (!check.ok) return check.result;\n const candidates = this.Cards.map((c) => ({ ID: c.modelId, Name: c.title }));\n const match = resolvePSRecord(check.value, candidates);\n if (!match) return { Success: false, ErrorMessage: buildPSNotFoundError(check.value, candidates, 'prediction') };\n const card = this.Cards.find((c) => UUIDsEqual(c.modelId, match.ID));\n if (!card) return { Success: false, ErrorMessage: buildPSNotFoundError(check.value, candidates, 'prediction') };\n if (!card.canOpen) {\n return { Success: false, ErrorMessage: `\"${card.title}\" isn't ready to open: ${card.blockedReason ?? card.trust.gateReason ?? 'it needs an analyst first.'}` };\n }\n this.Open(card);\n return { Success: true, Data: { opened: card.title, trust: card.trust.grade } };\n },\n },\n {\n Name: 'BackToPredictionCatalog',\n Description: 'Return from a prediction workspace to the catalog (the grid of all predictions).',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.BackToCatalog();\n this.publishAgentContext();\n return { Success: true, Data: { view: 'catalog' } };\n },\n },\n {\n Name: 'ReviewCallList',\n Description: 'Scroll the open prediction workspace to its ranked at-risk \"call list\". Only meaningful when a prediction is open.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n if (this.View !== 'workspace' || !this.Selected) return { Success: false, ErrorMessage: 'No prediction is open. Use OpenPrediction first.' };\n this.ScrollToList();\n return { Success: true };\n },\n },\n {\n Name: 'ExportAtRiskList',\n Description: 'Download the open prediction\\'s at-risk list as a CSV (read-only export). Only works when a prediction is open and its list has loaded.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n if (this.View !== 'workspace' || this.AtRiskRows.length === 0) return { Success: false, ErrorMessage: 'No at-risk list is loaded to export. Open a prediction with results first.' };\n this.ExportList();\n return { Success: true, Data: { rows: this.AtRiskRows.length } };\n },\n },\n {\n Name: 'OpenNewPredictionCopilot',\n Description: 'Open the \"+ New prediction\" Model Development Agent co-pilot (does not send a message — the user drives the conversation). Use when the user wants to build a new prediction.',\n ParameterSchema: { type: 'object', properties: {} },\n Handler: async () => {\n this.OpenNewPredictionCopilot();\n return { Success: true, Data: { chatOpen: true } };\n },\n },\n ]);\n }\n\n public Open(c: BusinessPredictionCard): void {\n if (!c.canOpen) return;\n this.Selected = c;\n this.View = 'workspace';\n this.resetAtRiskState();\n this.ListResult = null;\n // Mark loading BEFORE the publish below: otherwise AtRiskLoaded computes true for one publish with\n // atRiskRows still [], fabricating \"0 at risk\" to the agent for a list that hasn't been fetched yet.\n this.AtRiskLoading = true;\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n void this.loadAtRisk(c);\n }\n\n /** @deprecated Use {@link Open}. */\n public open(c: BusinessPredictionCard): void {\n return this.Open(c);\n }\n\n /** Clears everything derived from the previously open prediction, so a model switch never shows its rows or notices. */\n private resetAtRiskState(): void {\n this.AtRiskRows = [];\n this.AtRiskCapped = false;\n this.Drivers = [];\n this.AtRiskError = null;\n this.LatestRunId = null;\n this.LatestRunResolved = false;\n }\n\n /**\n * Load the open prediction's plain-language drivers and resolve its latest run. The run's rows are read once, by the\n * embedded grid, and arrive through {@link OnAtRiskRowsLoaded}.\n */\n private async loadAtRisk(c: BusinessPredictionCard): Promise<void> {\n const model = this.engine.PublishedModels.find((m) => UUIDsEqual(m.ID, c.modelId));\n this.Drivers = ImportanceDisplay.GlobalDriversShowable(model?.Lineage) ? AtRiskRules.TopGlobalDrivers(model?.FeatureImportance || null, 3) : [];\n this.AtRiskLoading = true;\n this.AtRiskError = null;\n this.cdrLocal.detectChanges();\n try {\n const provider = this.ProviderToUse;\n const runs = await this.engine.LoadRecentRunsForModel(c.modelId, provider, provider.CurrentUser ?? undefined, { maxRows: 1 });\n if (!this.isStillOpen(c)) return;\n this.LatestRunId = runs[0]?.ID ?? null;\n } catch (err) {\n this.AtRiskError = err instanceof Error ? err.message : String(err);\n this.AtRiskLoading = false;\n LogError(`PSPredictionsResource.loadAtRisk: ${this.AtRiskError}`);\n } finally {\n if (this.isStillOpen(c)) {\n this.LatestRunResolved = true;\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n }\n }\n }\n\n /** True while `c` is still the open prediction (a slow lookup must not overwrite a newer one's state). */\n private isStillOpen(c: BusinessPredictionCard): boolean {\n return this.View === 'workspace' && this.Selected !== null && UUIDsEqual(this.Selected.modelId, c.modelId);\n }\n\n /** The grid parsed the latest run: its rows drive the counts, the export, \"Send to a list\" and the agent context. */\n public async OnAtRiskRowsLoaded(event: PredictionGridRowsLoadedEvent): Promise<void> {\n const selected = this.Selected;\n if (!selected) return;\n // Copies: the label lookup below writes Label onto these rows, and the grid owns the originals.\n this.AtRiskRows = event.Rows.map((r) => ({ ...r }));\n this.AtRiskCapped = event.Capped;\n this.AtRiskError = null;\n const model = this.engine.PublishedModels.find((m) => UUIDsEqual(m.ID, selected.modelId));\n await this.resolveAtRiskLabels(model);\n this.AtRiskLoading = false;\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n }\n\n /** The grid could not read the latest run (it shows the error and a retry itself). */\n public OnAtRiskRowsLoadFailed(message: string): void {\n this.AtRiskRows = [];\n this.AtRiskCapped = false;\n this.AtRiskError = message;\n this.AtRiskLoading = false;\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n }\n\n /** Retry loading the open prediction's at-risk list after a failure — bound to the at-risk error banner. */\n public RetryAtRisk(): void {\n if (this.Selected) void this.loadAtRisk(this.Selected);\n }\n\n /** @deprecated Use {@link RetryAtRisk}. */\n public retryAtRisk(): void {\n return this.RetryAtRisk();\n }\n\n /**\n * P1 #3 — resolve the raw record ids in the at-risk list to human labels (member name/email) from the\n * model's target entity, so the list reads like a call sheet instead of a column of UUIDs. Resolves the\n * top-risk rows (capped) to keep the lookup light; unresolved rows fall back to their id in the template.\n */\n public get SelectedTargetEntityName(): string | null {\n if (!this.Selected) return null;\n const model = this.engine.PublishedModels.find((m) => UUIDsEqual(m.ID, this.Selected?.modelId));\n return this.targetEntityForModel(model)?.name ?? null;\n }\n\n /** @deprecated Use {@link SelectedTargetEntityName}. */\n public get selectedTargetEntityName(): string | null {\n return this.SelectedTargetEntityName;\n }\n\n public get SelectedProblemType(): string | null {\n if (!this.Selected) return null;\n const model = this.engine.PublishedModels.find((m) => UUIDsEqual(m.ID, this.Selected?.modelId));\n return model?.ProblemType ?? null;\n }\n\n /** @deprecated Use {@link SelectedProblemType}. */\n public get selectedProblemType(): string | null {\n return this.SelectedProblemType;\n }\n\n private targetEntityForModel(model: MJMLModelEntity | undefined): { id: string; name: string } | null {\n const pipeline = model ? this.engine.Pipelines.find((pp) => UUIDsEqual(pp.ID, model.PipelineID)) : undefined;\n const id = pipeline?.TargetEntityID;\n if (!id) return null;\n const name = this.ProviderToUse.Entities.find((e) => UUIDsEqual(e.ID, id))?.Name;\n return name ? { id, name } : null;\n }\n\n private async resolveAtRiskLabels(model: MJMLModelEntity | undefined): Promise<void> {\n // Labels are cosmetic — any failure here degrades to record ids, it must never surface as a\n // \"couldn't load who's at risk\" error that hides a perfectly good list.\n try {\n const target = this.targetEntityForModel(model);\n if (!target || this.AtRiskRows.length === 0) return;\n const entity = this.ProviderToUse.EntityByName(target.name);\n if (!entity) return;\n // The target entity is arbitrary — its key can have any column name(s), including a composite key.\n const pkNames = entity.PrimaryKeys.map((pk) => pk.Name);\n const targets = this.AtRiskRows.slice(0, PSPredictionsResourceComponent.AtRiskListLimit); // the rows a user actually acts on\n const ids = targets.map((r) => r.RecordID);\n // Only fetch the columns LabelFromRecord can actually use (the entity's name field first) — a broad\n // no-Fields fetch pulls every column (incl. large text/JSON) of an arbitrary entity just to render a\n // display name. Fall back to the broad fetch only when the entity has none of the candidate label fields.\n const nameField = entity.NameField?.Name || null;\n const candidates = [...(nameField ? [nameField] : []), 'Name', 'FirstName', 'LastName', 'Email'];\n const labelFields = entity.Fields.filter((f) => candidates.some((c) => c.toLowerCase() === f.Name.toLowerCase())).map((f) => f.Name);\n const res = await RunView.FromMetadataProvider(this.ProviderToUse).RunView<Record<string, unknown>>(\n {\n EntityName: target.name,\n ExtraFilter: BuildRecordIdFilter(entity, ids),\n ...(labelFields.length > 0 ? { Fields: [...pkNames, ...labelFields] } : {}),\n ResultType: 'simple',\n MaxRows: ids.length,\n },\n this.ProviderToUse.CurrentUser ?? undefined,\n );\n if (!res.Success) return;\n const byId = new Map<string, Record<string, unknown>>();\n for (const row of res.Results ?? []) byId.set(NormalizeUUID(CompositeKey.FromEntityRecord(entity, row).ToCompactURLSegment()), row);\n for (const r of this.AtRiskRows) {\n const rec = byId.get(NormalizeUUID(r.RecordID));\n if (rec) r.Label = AtRiskRules.LabelFromRecord(rec, nameField);\n }\n } catch (err) {\n LogError(`PSPredictionsResource.resolveAtRiskLabels (cosmetic — list keeps ids): ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n public BackToCatalog(): void {\n this.View = 'catalog';\n this.Selected = null;\n this.resetAtRiskState();\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link BackToCatalog}. */\n public backToCatalog(): void {\n return this.BackToCatalog();\n }\n\n /** \"Review the call list\" — scroll the ranked at-risk list into view. */\n public ScrollToList(): void {\n document.querySelector('[data-testid=\"ps-atrisk-list\"]')?.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n\n /** @deprecated Use {@link ScrollToList}. */\n public scrollToList(): void {\n return this.ScrollToList();\n }\n\n /** \"Save scores\" — still routed conversationally through the co-pilot (needs a designated write-back column). */\n public AskAgentTo(prompt: string): void {\n this.PendingPrompt = prompt;\n this.ChatOpen = true;\n void this.ensureModelDevAgentResolved();\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link AskAgentTo}. */\n public askAgentTo(prompt: string): void {\n return this.AskAgentTo(prompt);\n }\n\n /**\n * P1 #4 — \"Send to a list\" as a one-click server action (no agent sentence to parse): create an MJ List\n * over the model's target entity and add the at-risk members (risk at least `AT_RISK_LIST_MIN_RISK_PCT`, highest\n * first, at most {@link AtRiskListLimit}) so a team can act on it immediately; the result line says how many of the\n * qualifying records were added.\n */\n public async SendToList(): Promise<void> {\n if (this.CreatingList || this.AtRiskRows.length === 0 || !this.Selected) return;\n const model = this.engine.PublishedModels.find((m) => UUIDsEqual(m.ID, this.Selected!.modelId));\n const target = this.targetEntityForModel(model);\n const entityId = target?.id;\n if (!entityId) return;\n this.CreatingList = true;\n this.ListResult = null;\n this.cdrLocal.detectChanges();\n try {\n const p = this.ProviderToUse;\n const user = p.CurrentUser ?? undefined;\n const list = await p.GetEntityObject<MJListEntity>('MJ: Lists', user);\n // Minute-resolution timestamp so two sends on the same day don't produce identical-named lists.\n const stamp = new Date().toISOString().slice(0, 16).replace('T', ' ');\n list.Name = AtRiskRules.FormatAtRiskListName(this.Selected.title, stamp);\n list.EntityID = entityId;\n if (user?.ID) list.UserID = user.ID;\n list.RefreshMode = 'Additive';\n list.UseSnapshot = false;\n if (!(await list.Save())) {\n this.ListResult = `Couldn't create the list: ${list.LatestResult?.CompleteMessage ?? 'unknown error'}`;\n return;\n }\n const qualifying = AtRiskRules.SelectAtRiskListMembers(this.AtRiskRows, this.AtRiskRows.length).length;\n const members = AtRiskRules.SelectAtRiskListMembers(this.AtRiskRows, PSPredictionsResourceComponent.AtRiskListLimit);\n let seq = 0;\n let added = 0;\n let firstFailure: string | null = null;\n for (const r of members) {\n const ld = await p.GetEntityObject<MJListDetailEntity>('MJ: List Details', user);\n ld.ListID = list.ID;\n ld.RecordID = r.RecordID;\n ld.Sequence = seq++;\n ld.Status = 'Active';\n if (await ld.Save()) {\n added++;\n } else if (!firstFailure) {\n firstFailure = ld.LatestResult?.CompleteMessage ?? 'unknown error';\n }\n }\n const failed = members.length - added;\n this.ListResult =\n failed === 0\n ? `Added ${added} of ${qualifying} at-risk record${qualifying === 1 ? '' : 's'} (highest risk first) to “${list.Name}”.`\n : `Added ${added} of ${members.length} records to “${list.Name}” — ${failed} failed to add (first error: ${firstFailure}).`;\n if (failed > 0) LogError(`PSPredictionsResource.sendToList: ${failed}/${members.length} adds failed. First: ${firstFailure}`);\n } catch (err) {\n this.ListResult = `Couldn't create the list: ${err instanceof Error ? err.message : String(err)}`;\n LogError(`PSPredictionsResource.sendToList: ${err instanceof Error ? err.message : String(err)}`);\n } finally {\n this.CreatingList = false;\n this.cdrLocal.detectChanges();\n }\n }\n\n /** @deprecated Use {@link SendToList}. */\n public async sendToList(): Promise<void> {\n return this.SendToList();\n }\n\n /**\n * Quote one CSV cell: RFC-4180 double-quote escaping (handles commas/quotes/newlines in labels) plus a\n * leading `'` on formula-starting characters (`=`, `+`, `-`, `@`) so a hostile label can't execute as an\n * Excel/Sheets formula on open.\n */\n private csvCell(value: string): string {\n const guarded = /^[=+\\-@]/.test(value) ? `'${value}` : value;\n return /[\",\\n\\r]/.test(guarded) ? `\"${guarded.replace(/\"/g, '\"\"')}\"` : guarded;\n }\n\n /** \"Share / export\" — download the at-risk list as a CSV (dependency-free). */\n public ExportList(): void {\n if (this.AtRiskRows.length === 0) return;\n const csv = [\n 'Record,Risk %,Predicted',\n ...this.AtRiskRows.map((r) => `${this.csvCell(r.Label || r.RecordID)},${r.RiskPct},${this.csvCell(r.Class || '')}`),\n ].join('\\n');\n const url = URL.createObjectURL(new Blob([csv], { type: 'text/csv' }));\n const a = document.createElement('a');\n a.href = url;\n a.download = `${(this.Selected?.title ?? 'prediction').replace(/[^a-z0-9]+/gi, '-').toLowerCase()}-at-risk.csv`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n /** @deprecated Use {@link ExportList}. */\n public exportList(): void {\n return this.ExportList();\n }\n\n /** \"+ New prediction\" — open the co-pilot to a clean chat (Sonar-style); the user describes their goal and the agent drives the build. */\n public NewPrediction(): void {\n this.PendingPrompt = null;\n this.ChatOpen = true;\n void this.ensureModelDevAgentResolved();\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link NewPrediction}. */\n public newPrediction(): void {\n return this.NewPrediction();\n }\n\n /**\n * \"Improve this\" on a blocked (not-trustworthy-enough) prediction — turns the trust dead-end into a next\n * step by opening the co-pilot seeded with the model's name + why it's held, so the agent proposes concrete\n * ways to make it reliable and can rebuild it.\n */\n public ImprovePrediction(c: BusinessPredictionCard): void {\n this.PendingPrompt = buildImprovePrompt({\n Name: c.title,\n TrustGrade: c.trust.grade,\n Reason: c.blockedReason ?? c.trust.gateReason ?? null,\n });\n this.ChatOpen = true;\n void this.ensureModelDevAgentResolved();\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link ImprovePrediction}. */\n public improvePrediction(c: BusinessPredictionCard): void {\n return this.ImprovePrediction(c);\n }\n\n /** Open the \"+ New prediction\" co-pilot (clean chat) — used by the read-only `OpenNewPredictionCopilot` agent tool. */\n public OpenNewPredictionCopilot(): void {\n this.PendingPrompt = null;\n this.ChatOpen = true;\n void this.ensureModelDevAgentResolved();\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link OpenNewPredictionCopilot}. */\n public openNewPredictionCopilot(): void {\n return this.OpenNewPredictionCopilot();\n }\n\n public CloseChat(): void {\n this.ChatOpen = false;\n this.PendingPrompt = null;\n this.publishAgentContext();\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link CloseChat}. */\n public closeChat(): void {\n return this.CloseChat();\n }\n\n /**\n * The chat-area created its backing conversation after the user's first message — capture the live\n * conversation, re-feed the pending message in the same change-detection cycle, and leave new-mode so\n * the thread renders (mirrors the Form Builder co-pilot's atomic state-flip).\n */\n public OnChatConversationCreated(event: { conversation: MJConversationEntity; pendingMessage?: string }): void {\n this.PendingPrompt = event.pendingMessage ?? null;\n this.ChatConversation = event.conversation;\n this.ChatConversationId = event.conversation.ID;\n this.ChatIsNewConversation = false;\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link OnChatConversationCreated}. */\n public onChatConversationCreated(event: { conversation: MJConversationEntity; pendingMessage?: string }): void {\n return this.OnChatConversationCreated(event);\n }\n\n /** The chat-area delivered the seeded prompt — clear the buffer so a re-render doesn't resend it. */\n public OnChatPendingMessageConsumed(): void {\n this.PendingPrompt = null;\n this.cdrLocal.detectChanges();\n }\n\n /** @deprecated Use {@link OnChatPendingMessageConsumed}. */\n public onChatPendingMessageConsumed(): void {\n return this.OnChatPendingMessageConsumed();\n }\n\n public get CurrentUser(): UserInfo | null { return this.ProviderToUse.CurrentUser ?? null; }\n\n /** @deprecated Use {@link CurrentUser}. */\n public get currentUser(): UserInfo | null {\n return this.CurrentUser;\n }\n public get ChatEnvironmentId(): string {\n return (this.Data?.Configuration?.['environmentId'] as string | undefined) || MJEnvironmentEntityExtended.DefaultEnvironmentID;\n }\n\n /** @deprecated Use {@link ChatEnvironmentId}. */\n public get chatEnvironmentId(): string {\n return this.ChatEnvironmentId;\n }\n public get applicationId(): string | null { return (this.Data?.Configuration?.['applicationId'] as string | undefined) ?? null; }\n public get ModelDevAgentId(): string | null { return this._modelDevAgentId; }\n\n /** @deprecated Use {@link ModelDevAgentId}. */\n public get modelDevAgentId(): string | null {\n return this.ModelDevAgentId;\n }\n public get ChatAppContext(): Record<string, unknown> {\n return { app: 'Predictive Studio', section: 'predictions', publishedModels: this.engine.PublishedModels.length };\n }\n\n /** @deprecated Use {@link ChatAppContext}. */\n public get chatAppContext(): Record<string, unknown> {\n return this.ChatAppContext;\n }\n\n private async ensureModelDevAgentResolved(): Promise<void> {\n if (this._modelDevAgentId) return;\n try {\n await AIEngineBase.Instance.Config(false, this.ProviderToUse.CurrentUser ?? undefined);\n this._modelDevAgentId =\n AIEngineBase.Instance.Agents?.find((a) => a.Name?.trim().toLowerCase() === MODEL_DEV_AGENT_NAME.toLowerCase())?.ID ?? null;\n if (!this._modelDevAgentId) LogError(`PSPredictionsResource: '${MODEL_DEV_AGENT_NAME}' not found — chat uses default-agent routing.`);\n this.cdrLocal.detectChanges();\n } catch (err) {\n LogError(`PSPredictionsResource.ensureModelDevAgentResolved: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n}\n\n/** Tree-shaking prevention — called from the subpath module so the @RegisterClass survives bundling. */\nexport function LoadPSPredictionsResource(): void {\n // intentionally empty\n}\n"]}
@@ -513,7 +513,7 @@ let PSStudioResourceComponent = class PSStudioResourceComponent extends PSResour
513
513
  home: 'Start a new prediction from your data, a template, or the agent.',
514
514
  pipelines: 'Assemble features and train from the algorithm catalog.',
515
515
  catalog: 'Browse algorithms with a fit guide for your use case.',
516
- experiments: 'Run and track model experiments.',
516
+ experiments: 'Review earlier model experiment sessions.',
517
517
  compare: 'Compare runs on the honest holdout score.',
518
518
  };
519
519
  return map[this.ActiveSection] ?? '';