@c8y/ngx-components 1023.43.3 → 1023.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/ai/agent-chat/index.d.ts +6 -1
  2. package/ai/agent-chat/index.d.ts.map +1 -1
  3. package/ai/ai-chat/index.d.ts.map +1 -1
  4. package/ai/index.d.ts +39 -30
  5. package/ai/index.d.ts.map +1 -1
  6. package/datapoints-export-selector/index.d.ts +2 -1
  7. package/datapoints-export-selector/index.d.ts.map +1 -1
  8. package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs +24 -9
  9. package/fesm2022/c8y-ngx-components-ai-agent-chat.mjs.map +1 -1
  10. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs +5 -4
  11. package/fesm2022/c8y-ngx-components-ai-ai-chat.mjs.map +1 -1
  12. package/fesm2022/c8y-ngx-components-ai.mjs +63 -33
  13. package/fesm2022/c8y-ngx-components-ai.mjs.map +1 -1
  14. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +1 -1
  15. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  16. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs +6 -3
  17. package/fesm2022/c8y-ngx-components-datapoints-export-selector.mjs.map +1 -1
  18. package/fesm2022/c8y-ngx-components-echart.mjs +3 -2
  19. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  20. package/fesm2022/c8y-ngx-components-global-context.mjs +29 -20
  21. package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
  22. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs +1 -5
  23. package/fesm2022/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
  24. package/fesm2022/c8y-ngx-components-upgrade.mjs +3 -33
  25. package/fesm2022/c8y-ngx-components-upgrade.mjs.map +1 -1
  26. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget-ai-config.mjs +1203 -34
  27. package/fesm2022/c8y-ngx-components-widgets-definitions-html-widget-ai-config.mjs.map +1 -1
  28. package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs +3 -2
  29. package/fesm2022/c8y-ngx-components-widgets-definitions-markdown.mjs.map +1 -1
  30. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +32 -4
  31. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  32. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs +1 -1
  33. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-table.mjs.map +1 -1
  34. package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs +122 -80
  35. package/fesm2022/c8y-ngx-components-widgets-implementations-markdown.mjs.map +1 -1
  36. package/fesm2022/c8y-ngx-components.mjs +55 -6
  37. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  38. package/global-context/index.d.ts.map +1 -1
  39. package/index.d.ts +28 -3
  40. package/index.d.ts.map +1 -1
  41. package/locales/de.po +9 -18
  42. package/locales/es.po +8 -17
  43. package/locales/fr.po +13 -22
  44. package/locales/ja_JP.po +8 -17
  45. package/locales/ko.po +8 -17
  46. package/locales/locales.pot +11 -17
  47. package/locales/nl.po +8 -17
  48. package/locales/pl.po +8 -17
  49. package/locales/pt_BR.po +8 -17
  50. package/locales/zh_CN.po +8 -17
  51. package/locales/zh_TW.po +8 -17
  52. package/package.json +1 -1
  53. package/trusted-certificates/index.d.ts +0 -2
  54. package/trusted-certificates/index.d.ts.map +1 -1
  55. package/upgrade/index.d.ts.map +1 -1
  56. package/widgets/definitions/markdown/index.d.ts +1 -1
  57. package/widgets/implementations/datapoints-graph/index.d.ts +3 -0
  58. package/widgets/implementations/datapoints-graph/index.d.ts.map +1 -1
  59. package/widgets/implementations/markdown/index.d.ts +23 -13
  60. package/widgets/implementations/markdown/index.d.ts.map +1 -1
  61. package/fesm2022/c8y-ngx-components-upgrade-not-found.component-CuCuYAkK.mjs +0 -19
  62. package/fesm2022/c8y-ngx-components-upgrade-not-found.component-CuCuYAkK.mjs.map +0 -1
@@ -4,7 +4,8 @@ import { ClientAgentDefinition, ToolResult, AIMessageStreamSteps, AgentStep, AIM
4
4
  import { BehaviorSubject, OperatorFunction } from 'rxjs';
5
5
 
6
6
  declare class AgentChatComponent implements OnInit, OnDestroy {
7
- agent: string | ClientAgentDefinition;
7
+ private _agent;
8
+ set agent(value: string | ClientAgentDefinition);
8
9
  suggestions: {
9
10
  label: string;
10
11
  prompt: string;
@@ -26,6 +27,7 @@ declare class AgentChatComponent implements OnInit, OnDestroy {
26
27
  */
27
28
  messages$: BehaviorSubject<AIMessageStreamSteps[]>;
28
29
  agentName: string;
30
+ agentDefinition: ClientAgentDefinition | undefined;
29
31
  hasError: boolean;
30
32
  canCreate: boolean;
31
33
  errorMsg: string;
@@ -33,8 +35,11 @@ declare class AgentChatComponent implements OnInit, OnDestroy {
33
35
  private aiService;
34
36
  private gainsightService;
35
37
  private alertService;
38
+ private pluginContextPath;
39
+ private appState;
36
40
  private abortController;
37
41
  private assistantSubscription;
42
+ private get currentContextPath();
38
43
  defaultAgentStepRendererPipe: OperatorFunction<AgentStep[], {
39
44
  content: Type<any> | string;
40
45
  origin: AgentStep;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sources":["../../../ai/agent-chat/agent-chat.component.ts","../../../ai/agent-chat/agent-step-feedback.component.ts","../../../ai/agent-chat/widget-ai-chat-section.component.ts"],"sourcesContent":[null,null,null],"names":[],"mappings":";;;;;AA8CA,cAAA,kBAAA,YAAA,MAAA,EAAA,SAAA;AAiB6B,oBAAA,qBAAA;AAClB;;;;AAA6D;;;;AAI7D;AACA;AACA,yBAAA,IAAA;AAEC,oBAAA,YAAA;AACA,mBAAA,YAAA;AACA,qBAAA,YAAA;AACA,kBAAA,YAAA,CAAA,UAAA;AAEV;AAEA;;AAEG;AACH,eAAA,eAAA,CAAA,oBAAA;;AAIA;AACA;AACA;AACA;;;;;;AAQA,kCAAA,gBAAA,CAAA,SAAA;AAEI,iBAAA,IAAA;;AAAgD;AAc9C,gBAAA,OAAA;;AAgDN;;AAYA,2BAAA,oBAAA;;;;AAsEA;AAoCA;;;AAyCD;;AClTD,cAAA,0BAAA,YAAA,MAAA,EAAA,SAAA;;;AAsBW;AACA;AACA;AAET;AAMA,yBAAA,aAAA;AAMA,gCAAA,SAAA;;;AAoBD;;AC5DD,cAAA,4BAAA,YAAA,MAAA;;;;AAQsD;AAEpD,oBAAA,qBAAA;AAEA;;AAIA;AAEA;AAAa;;AAEb;AAEA;AACA,0BAAA,IAAA;AAEA;AACA;AACA;AAEA;;;;;AAKG;;AAKH;;;;AAIG;;AAGH;;AAEG;AACG,gBAAA,OAAA;AAWN;;;AAGG;;;;AAoBJ;;;;"}
1
+ {"version":3,"file":"index.d.ts","sources":["../../../ai/agent-chat/agent-chat.component.ts","../../../ai/agent-chat/agent-step-feedback.component.ts","../../../ai/agent-chat/widget-ai-chat-section.component.ts"],"sourcesContent":[null,null,null],"names":[],"mappings":";;;;;AAgDA,cAAA,kBAAA,YAAA,MAAA,EAAA,SAAA;;AAmBE,8BAAA,qBAAA;AAWS;;;;AAA6D;;;;AAI7D;AACA;AACA,yBAAA,IAAA;AAEC,oBAAA,YAAA;AACA,mBAAA,YAAA;AACA,qBAAA,YAAA;AACA,kBAAA,YAAA,CAAA,UAAA;AAEV;AAEA;;AAEG;AACH,eAAA,eAAA,CAAA,oBAAA;;AAIA,qBAAA,qBAAA;AACA;AACA;AACA;AACA;;;;;;;;;AAcA,kCAAA,gBAAA,CAAA,SAAA;AAEI,iBAAA,IAAA;;AAAgD;AAc9C,gBAAA,OAAA;;AAkDN;;AAYA,2BAAA,oBAAA;;;;AAsEA;AAoCA;;;AAyCD;;ACzUD,cAAA,0BAAA,YAAA,MAAA,EAAA,SAAA;;;AAsBW;AACA;AACA;AAET;AAMA,yBAAA,aAAA;AAMA,gCAAA,SAAA;;;AAoBD;;AC5DD,cAAA,4BAAA,YAAA,MAAA;;;;AAQsD;AAEpD,oBAAA,qBAAA;AAEA;;AAIA;AAEA;AAAa;;AAEb;AAEA;AACA,0BAAA,IAAA;AAEA;AACA;AACA;AAEA;;;;;AAKG;;AAKH;;;;AAIG;;AAGH;;AAEG;AACG,gBAAA,OAAA;AAWN;;;AAGG;;;;AAoBJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sources":["../../../ai/ai-chat/ai-chat-message-action.component.ts","../../../ai/ai-chat/ai-chat-message.component.ts","../../../ai/ai-chat/ai-chat-suggestion.component.ts","../../../ai/ai-chat/ai-chat.component.ts"],"sourcesContent":[null,null,null,null],"names":["_angular_core"],"mappings":";;;;;AAKA;;;AAGG;AACH,cAAA,4BAAA;AAOE;;AAEG;AAEH;AAEA;;AAEG;AAEH;AAEA;;AAEG;;AAIH;;AAEG;AAEH,WAAA,YAAA;;;AACD;;AC/BD,cAAA,sBAAA;mBAOeA,EAAA,CAAA,WAAA;sBACGA,EAAA,CAAA,WAAA,CAAA,SAAA;AAChB;AAEA;AAIA;;;;AAIG;wBACeA,EAAA,CAAA,MAAA;AASlB;;;;AAIG;sCAC6BA,EAAA,CAAA,MAAA;;;AAcjC;;ACnDD;;;AAGG;AACH,cAAA,yBAAA;AAOE;;AAEG;;AAIH;;AAEG;;AAIH;;AAEG;;AAIH;;AAEG;AAEH;AAEA;;AAEG;AAEH;AAEA;;AAEG;AAEH,uBAAA,YAAA,CAAA,SAAA;AAEA;;AAEG;;;;AAQJ;;ACtDD;;;;AAIG;AACH,cAAA,eAAA;AAQE;;;AAGG;AAEH;AAEA;;AAEG;AAEH;AAEA;;AAEG;AAEH;AAEA;;;AAGG;AAEH,eAAA,YAAA,CAAA,SAAA;AAEA;;AAEG;AAEH,cAAA,YAAA;AAEA;;AAEG;AACsC,cAAA,SAAA,CAAA,sBAAA;;;AAoBzC;;;AAGG;;AAKH,kBAAA,OAAA,CAAA,UAAA;AAIA;;;;AAIG;AACH,wBAAA,KAAA;AAWA;;;AAGG;AACH;;;AAGD;;;;"}
1
+ {"version":3,"file":"index.d.ts","sources":["../../../ai/ai-chat/ai-chat-message-action.component.ts","../../../ai/ai-chat/ai-chat-message.component.ts","../../../ai/ai-chat/ai-chat-suggestion.component.ts","../../../ai/ai-chat/ai-chat.component.ts"],"sourcesContent":[null,null,null,null],"names":["_angular_core"],"mappings":";;;;;AAKA;;;AAGG;AACH,cAAA,4BAAA;AAOE;;AAEG;AAEH;AAEA;;AAEG;AAEH;AAEA;;AAEG;;AAIH;;AAEG;AAEH,WAAA,YAAA;;;AACD;;AC/BD,cAAA,sBAAA;mBAOeA,EAAA,CAAA,WAAA;sBACGA,EAAA,CAAA,WAAA,CAAA,SAAA;AAChB;AAEA;AAIA;;;;AAIG;wBACeA,EAAA,CAAA,MAAA;AASlB;;;;AAIG;sCAC6BA,EAAA,CAAA,MAAA;;;AAcjC;;ACnDD;;;AAGG;AACH,cAAA,yBAAA;AAOE;;AAEG;;AAIH;;AAEG;;AAIH;;AAEG;;AAIH;;AAEG;AAEH;AAEA;;AAEG;AAEH;AAEA;;AAEG;AAEH,uBAAA,YAAA,CAAA,SAAA;AAEA;;AAEG;;;;AAQJ;;ACtDD;;;;AAIG;AACH,cAAA,eAAA;AAQE;;;AAGG;AAEH;AAEA;;AAEG;AAEH;AAEA;;AAEG;AAEH;AAEA;;;AAGG;AAEH,eAAA,YAAA,CAAA,SAAA;AAEA;;AAEG;AAEH,cAAA,YAAA;AAEA;;AAEG;AACsC,cAAA,SAAA,CAAA,sBAAA;;;AAqBzC;;;AAGG;;AAKH,kBAAA,OAAA,CAAA,UAAA;AAIA;;;;AAIG;AACH,wBAAA,KAAA;AAWA;;;AAGG;AACH;;;AAGD;;;;"}
package/ai/index.d.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Type } from '@angular/core';
3
3
  import { Observable } from 'rxjs';
4
- import { FetchClient } from '@c8y/client';
5
4
 
6
5
  interface AIMessageStreamSteps extends AIMessage {
7
6
  componentSteps$?: Observable<{
@@ -27,6 +26,8 @@ interface AIMessageOptions {
27
26
  declare enum DataStreamType {
28
27
  TEXT_DELTA = "text-delta",
29
28
  TOOL_CALL = "tool-call",
29
+ TOOL_INPUT_START = "tool-input-start",
30
+ TOOL_INPUT_DELTA = "tool-input-delta",
30
31
  TOOL_CALL_STREAMING = "tool-call-streaming",
31
32
  TOOL_CALL_DELTA = "tool-call-delta",
32
33
  TOOL_RESULT = "tool-result",
@@ -58,7 +59,7 @@ type AgentStep = {
58
59
  };
59
60
  interface Tool {
60
61
  toolName: string;
61
- toolId: string;
62
+ toolCallId: string;
62
63
  type: 'tool-call' | 'tool-result';
63
64
  }
64
65
  interface ToolCall extends Tool {
@@ -67,7 +68,8 @@ interface ToolCall extends Tool {
67
68
  };
68
69
  }
69
70
  interface ToolResult extends Tool {
70
- result: {
71
+ input: any;
72
+ output: {
71
73
  content: {
72
74
  text: string;
73
75
  type: string;
@@ -76,7 +78,9 @@ interface ToolResult extends Tool {
76
78
  }
77
79
  interface ClientAgentDefinition {
78
80
  /**
79
- * If set to true, the agent will be created each time. This is useful for development.
81
+ * If set to true, the agent will use the test endpoint to generate responses.
82
+ * This is useful for development and testing purposes, but requires agent admin
83
+ * privileges.
80
84
  */
81
85
  snapshot: boolean;
82
86
  /**
@@ -84,29 +88,28 @@ interface ClientAgentDefinition {
84
88
  */
85
89
  label: string;
86
90
  /**
87
- * The definitions of the agent.
88
- *
89
- * You can use multiple definitions that can be used in an agent-2-agent scenario
90
- * The first definition is the entry point.
91
+ * The definition of the agent to use
91
92
  */
92
- definitions: {
93
- name: string;
94
- type: 'object' | 'text';
95
- agent: {
96
- system: string;
97
- [key: string]: any;
98
- };
99
- mcp: Array<{
100
- serverName: string;
101
- tools: string[];
102
- }>;
103
- }[];
93
+ definition: AgentDefinition;
94
+ }
95
+ interface AgentDefinition {
96
+ name: string;
97
+ type: 'object' | 'text';
98
+ agent: {
99
+ system: string;
100
+ [key: string]: any;
101
+ };
102
+ mcp: Array<{
103
+ serverName: string;
104
+ tools: string[];
105
+ }>;
104
106
  }
105
107
  interface ChatConfig {
106
108
  title: string;
107
109
  headline: string;
108
110
  welcomeText: string;
109
111
  placeholder: string;
112
+ placeholderAfterFirstMessage: string;
110
113
  sendButtonText: string;
111
114
  cancelButtonText: string;
112
115
  disclaimerText: string;
@@ -138,32 +141,38 @@ interface AgentHealthCheckResponse {
138
141
  }
139
142
 
140
143
  declare class AIService {
141
- private client;
142
144
  private baseUrl;
143
- constructor(client: FetchClient);
144
- createOrUpdateAgent(agentsDef: ClientAgentDefinition): Promise<void>;
145
+ private client;
146
+ /**
147
+ * Creates or updates an agent.
148
+ * @param def The agent definition
149
+ */
150
+ createOrUpdateAgent(def: AgentDefinition): Promise<void>;
145
151
  /**
146
152
  * Check if an agent exists.
147
- * @param name Agent name
153
+ * @param name Agent name (optional)
154
+ * @param fromApp The app context path to check for an agent. This can be used, if the agent should get distributed by the plugin (optional).
148
155
  * @returns Agent health check response.
149
156
  */
150
- getAgentHealth(name: string): Promise<AgentHealthCheckResponse>;
157
+ getAgentHealth(name?: string, fromApp?: string): Promise<AgentHealthCheckResponse>;
151
158
  /**
152
159
  * Send a text message to the agent.
153
160
  * @param name Agent name
154
161
  * @param messages Messages to send
155
162
  * @param variables Variables to include
163
+ * @param fromApp The app context path to check for an agent. This can be used, if the agent should get distributed by the plugin (optional).
156
164
  * @returns Text response from the agent.
157
165
  */
158
166
  text(name: string, messages: AIMessage[], variables: {
159
167
  [key: string]: any;
160
- }): Promise<string>;
168
+ }, fromApp?: string): Promise<string>;
161
169
  /**
162
170
  * Stream a text message to the agent.
163
- * @param agentName Agent name
171
+ * @param agent Agent name or an agent definition.
164
172
  * @param messages Messages to send
165
173
  * @param variables Variables to include
166
174
  * @param abortController An AbortController to cancel the request.
175
+ * @param fromApp The app context path to check for an agent. This can be used, if the agent should get distributed by the plugin (optional).
167
176
  * @returns An observable that emits partial AIMessage objects as they are received. The observable can be cancelled using the provided AbortController.
168
177
  * The observable will emit an error if the request fails or is aborted.
169
178
  * The observable will complete when the stream is finished.
@@ -192,9 +201,9 @@ declare class AIService {
192
201
  * subscription.unsubscribe();
193
202
  * ```
194
203
  */
195
- stream$(agentName: string, messages: AIMessage[], variables: {
204
+ stream$(agent: string | ClientAgentDefinition, messages: AIMessage[], variables: {
196
205
  [key: string]: any;
197
- }, abortController: AbortController): Promise<Observable<AIMessage>>;
206
+ }, abortController: AbortController, fromApp?: string): Promise<Observable<AIMessage>>;
198
207
  private parseMessages;
199
208
  private processLine;
200
209
  static ɵfac: i0.ɵɵFactoryDeclaration<AIService, never>;
@@ -202,5 +211,5 @@ declare class AIService {
202
211
  }
203
212
 
204
213
  export { AIService, DataStreamType };
205
- export type { AIMessage, AIMessageOptions, AIMessageStreamSteps, AgentHealthCheckResponse, AgentStep, ChatConfig, ClientAgentDefinition, Tool, ToolCall, ToolResult };
214
+ export type { AIMessage, AIMessageOptions, AIMessageStreamSteps, AgentDefinition, AgentHealthCheckResponse, AgentStep, ChatConfig, ClientAgentDefinition, Tool, ToolCall, ToolResult };
206
215
  //# sourceMappingURL=index.d.ts.map
package/ai/index.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sources":["../../ai/ai.model.ts","../../ai/ai.service.ts"],"sourcesContent":[null,null],"names":[],"mappings":";;;;;AAGM;;AAC2B;;AAAgD;AAChF;;AAGC;;;AAGA;AACA;;AAED;;;;AAKC;AAAc;;AACf;AAED;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACD;AAEK;AACJ;;;;AAIA;AACA;;;;;;AAOA;AACD;AAEK;AACJ;AAAa;;AACd;AAEK;AACJ;AACE;;;AAGC;;AAEJ;;AAGC;;AAEG;;AAEH;;AAEG;;AAEH;;;;;AAKG;AACH;;AAEE;AACA;;AAEE;;;;;AAEgD;AACnD;AACF;;;;;;;;;AAUC;;;;AACD;;AAGC;;;AAGG;;AAEH;;AAEG;;AAEH;;;AAGG;;AAEH;;;AAGG;AACH;AACD;;AC1HD;AAMc;;AAAQ;;AAuBpB;;;;AAIG;;AAkBH;;;;;;AAMG;;AAIY;;AAkBf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCG;;AAIY;;AAyEf;AAiBA;;;AA6ED;;;"}
1
+ {"version":3,"file":"index.d.ts","sources":["../../ai/ai.model.ts","../../ai/ai.service.ts"],"sourcesContent":[null,null],"names":[],"mappings":";;;;AAGM;;AAC2B;;AAAgD;AAChF;;AAGC;;;AAGA;AACA;;AAED;;;;AAKC;AAAc;;AACf;AAED;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACD;AAEK;AACJ;;;;AAIA;AACA;;;;;;AAOA;AACD;AAEK;AACJ;AAAa;;AACd;AAEK;;AAEJ;AACE;;;AAGC;;AAEJ;;AAGC;;;;AAIG;;AAEH;;AAEG;;AAEH;;AAEG;;AAEJ;;;AAIC;AACA;;AAEE;;;;;AAEgD;AACnD;;;;;;;;;;AAWC;;;;AACD;;AAGC;;;AAGG;;AAEH;;AAEG;;AAEH;;;AAGG;;AAEH;;;AAGG;AACH;AACD;;AC9HD;;;AAQE;;;AAGG;;AAoBH;;;;;AAKG;AACG;AAoBN;;;;;;;AAOG;;AAIY;;AAsBf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCG;AACG;AAGS;AAAoB;AAyFnC;AAiBA;;;AAuFD;;;"}
@@ -806,6 +806,7 @@ declare class DatapointsExportSelectorModalComponent {
806
806
  declare class DatapointsExportSelectorComponent {
807
807
  private bsModalService;
808
808
  private gainsightService;
809
+ displayMode: 'default' | 'icon-only';
809
810
  /**
810
811
  * CSS class for the container element.
811
812
  * Defaults to 'd-flex p-t-4 p-b-4' if not provided.
@@ -820,7 +821,7 @@ declare class DatapointsExportSelectorComponent {
820
821
  constructor(bsModalService: BsModalService, gainsightService: GainsightService);
821
822
  openExportModal(): Promise<void>;
822
823
  static ɵfac: i0.ɵɵFactoryDeclaration<DatapointsExportSelectorComponent, never>;
823
- static ɵcmp: i0.ɵɵComponentDeclaration<DatapointsExportSelectorComponent, "c8y-datapoints-export-selector", never, { "containerClass": { "alias": "containerClass"; "required": false; }; "exportConfig": { "alias": "exportConfig"; "required": false; }; }, { "isOpen": "isOpen"; }, never, never, true, never>;
824
+ static ɵcmp: i0.ɵɵComponentDeclaration<DatapointsExportSelectorComponent, "c8y-datapoints-export-selector", never, { "displayMode": { "alias": "displayMode"; "required": false; }; "containerClass": { "alias": "containerClass"; "required": false; }; "exportConfig": { "alias": "exportConfig"; "required": false; }; }, { "isOpen": "isOpen"; }, never, never, true, never>;
824
825
  }
825
826
 
826
827
  export { CSVGeneratorAdapter, DataFetchingService, DataPointsExportSelectorDataScopeComponent, DataPointsExportSelectorFileTypesComponent, DataPointsExportSelectorPreviewComponent, DataPointsExportSelectorTimeRangeComponent, DataProcessingService, DatapointsExportSelectorComponent, DatapointsExportSelectorFileExporterComponent, DatapointsExportSelectorFileExporterService, DatapointsExportSelectorModalComponent, EXPORT_MODE_LABELS, EXPORT_MODE_VALUES, ExcelDataTransformer, ExcelGeneratorAdapter, FILE_COMPRESSION_TYPES_VALUES, FILE_GENERATORS, HAS_ERROR, MEASUREMENTS_PREVIEW_ITEMS_LIMIT, PRODUCT_EXPERIENCE_DATAPOINTS_EXPORT_SELECTOR, SERIES_DATA_MERGED_FILE_NAME, UtilsService, dateRangeValidator };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sources":["../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.ts","../../datapoints-export-selector/datapoints-export-selector.model.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.ts","../../datapoints-export-selector/datapoints-export-selector.component.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":";;;;;;;;;;;AAEM;;;;;AAGJ;;AAEA;AACD;;;AAIC;AACE;;;AAGH;;AAGC;;AAED;;AAGC;AAAU;AAAkC;;AAE7C;;AAGC;AACD;;AAGC;AACD;AAED;AAEE;AA0CA;;;;;;;;;;;;;;;AAeG;;;;AAiBJ;;AC5GD;AACA;AACA;AAEA;;AAEG;;AAED;;;AAGG;;AAEH;;AAEG;;AAEH;;;AAGG;;AAEJ;AAED;;AAEG;;;;AAIF;;;;AAKA;;AAGC;AACD;;AAGC;;;;;;;;;AASD;;;;;;;;AASA;AAED;;AAEG;;AAED;AACA;;;AAGA;;AAEG;AACH;AACA;;AAEG;AACH;AACA;;;AAGG;AACH;AACA;AACD;;;AAIC;;;AAGD;AAED;;;AAGG;AACG;AACJ;AACA;AAAgB;AAAkC;AACnD;AACD;;;AAGG;;AAED;;;;AAID;AACD;;AAEG;;;;;;AAMF;AACD;;AAEG;;;;AAIF;AACD;;AAEG;;;;AAIF;AACD;;;AAGG;;;;;AAKF;;AAGC;;AAED;AACD;;;AAGG;AACG;;;AAMA;AACJ;;;;;;AAOD;AAED;;AAEG;AACG;;;;;AAMA;;;;AAKA;AAEA;AACN;;;AAGG;AACG;;;;AAUN;;;AAGG;AACG;AACJ;;AAGF;;;;AAKA;;;;;;;;;;;;;;;;;AAiBG;AACH;;;;AAKA;;;;AAKA;;;;;;;;;;;;;;;;;;ACxNA;AAKI;AACA;AACA;AACA;AAHQ;AAMV;;;;;;;;AAQG;;AA+CH;;;;;;;;;AASG;;AA8CH;;;;;;;;;;;;;;;AAeG;AACH;AAcA;;;;;;;AAOG;;AAmBG;AAcA;AA0BA;AAYA;AASN;;AAiCA;;;;;;;;;;;;AAYG;AACH;AAeA;;;;;;AAMG;AACH;;AAwDA;;;;;;;;;AASG;AACH;AAcA;;;;;;;;;AASG;AACG;AAkCN;;;;;;;;;;AAUG;;;;AAuEH;;;AAuBD;;ACjiBD;AAc6B;AACzB;AAXF;AACA;;;;;;;AASmC;AAenC;AAMA;;;;;;AAMG;;AAWH;;;;;AAKG;AACH;AAcA;;;;;;;;;AASG;AACH;;AAsDA;;;;;;;;;;;;;;;;AAgBG;AACG;AAsBN;;;;;AAKG;;AAWH;;;;;AAKG;;AAqBH;AAIA;;;;;;;;AAQG;;;;AAmBJ;;AC3PD;AAcI;AACA;AACA;AAZF;;AAEG;;AAEH;;AAEG;;;AASG;AAgBA;AAkBN;AAKA;AAOA;AAWA;AAwBA;;;;;;;;;AASG;;AAiBH;;;AAaD;;ACjGD;AAKA;AAwBA;AA6GI;AACA;AACA;AACA;AACA;AACyB;AACzB;;AApGQ;AAEV;;;AAGG;;;AAKH;;;AAGG;;AAEH;;;AAGG;AAEH;AAEA;;AAEG;;AAGH;AAEA;AACA;;;;AAIG;AACH;;;AAMA;;;AAGG;;AAEH;;AAEG;;AAEH;;AAEG;;AAEH;;;AAGG;;AAEH;;;AAGG;;AAEH;;;AAGG;;AAEH;;;;;AAKG;;AAEH;;;;AAIG;;AAEH;;AAEG;;;;;AAOH;AAA4B;;;AA0B5B;AAaM;AAuCN;AAMM;AAsBN;;AAUM;AAoCN;;;;;;;;;;;AAWG;;AAyBH;AAaA;;;;;;;;;;AAUG;;;AAgCH;AAIA;AAIM;;AAuCN;AAOA;AAsBA;AAOA;AA0BA;AAcA;AAQA;AAQA;AAMA;AAgBA;;AAiDA;AAuBA;AASA;;AA0BA;AAUA;AAKA;AAuBA;;;;;;;;;;;;;;;;;AAiBG;AACH;AAYA;;;AA8BD;;ACvxBD;;;;;;;AAYC;;ACRD;;;AASY;AAEA;AAEV;;;;;AAAiD;;AAEjD;;;AAAiD;;AAGjD;AAIA;;;AAGD;;AChCD;AAOW;AAA4B;;;;;AAEtC;;ACND;;AAQY;AACA;;;;;;;;;;;AAkBV;AAeA;;;AAID;;AC0HD;;AC7HA;AACE;AAqCA;AAWA;AAIA;AAGD;AA4RD;;ACjYA;AAoBc;;;AATZ;;AAGA;;AAMoB;;AASpB;AAKM;AAKN;;;AAGD;;ACvCD;AAqBI;AACA;AAfF;;;AAGG;;AAEH;;AAEG;;AAEO;;AAKA;AAIJ;;;AA0BP;;;"}
1
+ {"version":3,"file":"index.d.ts","sources":["../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/utils.service.ts","../../datapoints-export-selector/datapoints-export-selector.model.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-fetching.service.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/data-processing.service.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.service.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-file-exporter.component.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-export-selector-preview/datapoints-export-selector-preview.component.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-data-scope/datapoints-exports-selector-data-scope.component.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-file-types/datapoints-exports-selector-file-types.component.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/datapoints-exports-selector-time-range/datapoints-exports-selector-time-range.component.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/csv-generator.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-file-exporter/generators/excel-generator.ts","../../datapoints-export-selector/datapoints-export-selector-modal/datapoints-export-selector-modal.component.ts","../../datapoints-export-selector/datapoints-export-selector.component.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,null,null,null,null],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { NgClass, JsonPipe, AsyncPipe, NgComponentOutlet } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
3
  import { Input, Component, EventEmitter, inject, Output } from '@angular/core';
4
- import { ListGroupComponent, ListItemComponent, ListItemCollapseComponent, ListItemBodyComponent, ListItemIconComponent, MarkdownToHtmlPipe, C8yTranslatePipe, GainsightService, AlertService, LoadingComponent, EmptyStateComponent, ContextRouteService } from '@c8y/ngx-components';
4
+ import { ListGroupComponent, ListItemComponent, ListItemCollapseComponent, ListItemBodyComponent, ListItemIconComponent, MarkdownToHtmlPipe, C8yTranslatePipe, GainsightService, AlertService, C8Y_PLUGIN_CONTEXT_PATH, AppStateService, LoadingComponent, EmptyStateComponent, ContextRouteService } from '@c8y/ngx-components';
5
5
  import { AIService } from '@c8y/ngx-components/ai';
6
6
  import { AiChatComponent, AiChatSuggestionComponent, AiChatMessageComponent, AiChatMessageActionComponent } from '@c8y/ngx-components/ai/ai-chat';
7
7
  import { gettext } from '@c8y/ngx-components/gettext';
@@ -97,6 +97,8 @@ class AgentChatComponent {
97
97
  this.aiService = inject(AIService);
98
98
  this.gainsightService = inject(GainsightService);
99
99
  this.alertService = inject(AlertService);
100
+ this.pluginContextPath = inject(C8Y_PLUGIN_CONTEXT_PATH, { optional: true });
101
+ this.appState = inject(AppStateService);
100
102
  this.defaultAgentStepRendererPipe = (source) => {
101
103
  return source.pipe(map(steps => steps.map(step => {
102
104
  if (step.reasoning || step.toolCalls || step.toolResults) {
@@ -106,15 +108,28 @@ class AgentChatComponent {
106
108
  })));
107
109
  };
108
110
  }
111
+ set agent(value) {
112
+ if (typeof value === 'string') {
113
+ this.agentName = value;
114
+ this.agentDefinition = undefined;
115
+ }
116
+ else {
117
+ this.agentName = value.definition.name;
118
+ this.agentDefinition = value;
119
+ }
120
+ }
121
+ get currentContextPath() {
122
+ return this.pluginContextPath || this.appState.currentApplication?.value?.contextPath || '';
123
+ }
109
124
  async ngOnInit() {
125
+ if (this.agentDefinition.snapshot) {
126
+ this.hasError = false;
127
+ return;
128
+ }
110
129
  this.isLoading = true;
111
- this.agentName = typeof this.agent === 'string' ? this.agent : this.agent.definitions[0].name;
112
130
  try {
113
- const agentHealth = await this.aiService.getAgentHealth(this.agentName);
131
+ const agentHealth = await this.aiService.getAgentHealth(this.agentName, this.currentContextPath);
114
132
  this.composeErrorMessage(agentHealth);
115
- if (typeof this.agent !== 'string' && this.agent.snapshot) {
116
- this.createAgent();
117
- }
118
133
  }
119
134
  catch (ex) {
120
135
  this.errorMsg = gettext('Microservice not found. Please contact your administrator.');
@@ -131,7 +146,7 @@ class AgentChatComponent {
131
146
  content: ''
132
147
  };
133
148
  this.messages$.next([...this.messages$.value, currentAssistantMessage]);
134
- const stream = await this.aiService.stream$(this.agentName, this.messages$.value.filter(m => m !== currentAssistantMessage), this.variables, this.abortController);
149
+ const stream = await this.aiService.stream$(this.agentDefinition || this.agentName, this.messages$.value.filter(m => m !== currentAssistantMessage), this.variables, this.abortController, this.currentContextPath);
135
150
  if (this.assistantSubscription) {
136
151
  this.assistantSubscription.unsubscribe();
137
152
  }
@@ -197,7 +212,7 @@ class AgentChatComponent {
197
212
  async createAgent() {
198
213
  this.isLoading = true;
199
214
  try {
200
- await this.aiService.createOrUpdateAgent(this.agent);
215
+ await this.aiService.createOrUpdateAgent(this.agentDefinition.definition);
201
216
  this.hasError = false;
202
217
  }
203
218
  catch (ex) {
@@ -223,7 +238,7 @@ class AgentChatComponent {
223
238
  }
224
239
  if (agentHealth.canCreate && typeof this.agent !== 'string') {
225
240
  this.canCreate = true;
226
- if (this.autoInstallAgents) {
241
+ if (this.autoInstallAgents && this.agentDefinition) {
227
242
  this.createAgent();
228
243
  return;
229
244
  }
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-ai-agent-chat.mjs","sources":["../../ai/agent-chat/agent-step-feedback.component.ts","../../ai/agent-chat/agent-step-feedback.component.html","../../ai/agent-chat/agent-chat.component.ts","../../ai/agent-chat/agent-chat.component.html","../../ai/agent-chat/widget-ai-chat-section.component.ts","../../ai/agent-chat/widget-ai-chat-section.component.html","../../ai/agent-chat/c8y-ngx-components-ai-agent-chat.ts"],"sourcesContent":["import { JsonPipe, NgClass, AsyncPipe } from '@angular/common';\nimport { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport {\n ListGroupComponent,\n ListItemBodyComponent,\n ListItemCollapseComponent,\n ListItemComponent,\n ListItemIconComponent,\n MarkdownToHtmlPipe,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { AgentStep } from '@c8y/ngx-components/ai';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\n@Component({\n selector: 'c8y-agent-step-feedback',\n templateUrl: './agent-step-feedback.component.html',\n standalone: true,\n imports: [\n ListGroupComponent,\n ListItemComponent,\n ListItemCollapseComponent,\n ListItemBodyComponent,\n ListItemIconComponent,\n NgClass,\n JsonPipe,\n MarkdownToHtmlPipe,\n AsyncPipe,\n C8yTranslatePipe\n ],\n host: { class: 'agent-step-feedback' }\n})\nexport class AgentStepFeedbackComponent implements OnInit, OnChanges {\n @Input({ required: true }) step: AgentStep;\n\n @Input() label: string;\n @Input() loading = false;\n @Input() collapsed = true;\n @Input() canCollapse = false;\n\n ngOnInit(): void {\n if (this.step) {\n this.parseDefaultAgentStep(this.step);\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.step) {\n this.parseDefaultAgentStep(changes.step.currentValue);\n }\n }\n\n parseDefaultAgentStep(step: AgentStep): void {\n if (step.reasoning) {\n this.label = gettext('Reasoning');\n this.loading = false;\n this.canCollapse = true;\n this.collapsed = false;\n }\n\n if (step.toolCalls.length > 0 && !step.toolResults?.length) {\n this.label = gettext('Calling a tool');\n this.loading = true;\n this.canCollapse = true;\n this.collapsed = true;\n } else if (step.toolResults?.length > 0) {\n this.label = gettext('Tool result');\n this.loading = false;\n this.canCollapse = true;\n this.collapsed = true;\n }\n }\n}\n","@if (!step.reasoning) {\n <div [innerHTML]=\"step.text | markdownToHtml | async\"></div>\n}\n@if (label) {\n <c8y-list-group class=\"m-t-16 m-b-16\">\n <c8y-li\n [active]=\"!loading\"\n [collapsed]=\"collapsed\"\n >\n <c8y-li-icon>\n <span\n class=\"btn-ai btn-ai-hint btn-sm\"\n [ngClass]=\"{ working: loading }\"\n >\n <span></span>\n </span>\n </c8y-li-icon>\n <c8y-li-body>\n {{ label | translate }}\n </c8y-li-body>\n\n @if (canCollapse) {\n <c8y-li-collapse>\n @if (step.reasoning) {\n <div [innerHTML]=\"step.reasoning | markdownToHtml | async\"></div>\n } @else if (step) {\n <pre\n class=\"fit-w\"\n style=\"max-height: 320px\"\n >{{ step | json }}</pre\n >\n }\n </c8y-li-collapse>\n }\n </c8y-li>\n </c8y-list-group>\n}\n","import { AsyncPipe, NgComponentOutlet } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n Type\n} from '@angular/core';\nimport {\n AlertService,\n C8yTranslatePipe,\n EmptyStateComponent,\n GainsightService,\n LoadingComponent,\n MarkdownToHtmlPipe\n} from '@c8y/ngx-components';\nimport {\n AgentHealthCheckResponse,\n AgentStep,\n AIMessage,\n AIMessageStreamSteps,\n AIService,\n ClientAgentDefinition,\n ToolResult\n} from '@c8y/ngx-components/ai';\nimport {\n AiChatComponent,\n AiChatMessageActionComponent,\n AiChatMessageComponent,\n AiChatSuggestionComponent\n} from '@c8y/ngx-components/ai/ai-chat';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n BehaviorSubject,\n firstValueFrom,\n map,\n Observable,\n of,\n OperatorFunction,\n Subscription\n} from 'rxjs';\nimport { AgentStepFeedbackComponent } from './agent-step-feedback.component';\n\n@Component({\n selector: 'c8y-agent-chat',\n templateUrl: './agent-chat.component.html',\n imports: [\n AiChatComponent,\n AiChatSuggestionComponent,\n AiChatMessageComponent,\n AiChatMessageActionComponent,\n LoadingComponent,\n MarkdownToHtmlPipe,\n AsyncPipe,\n NgComponentOutlet,\n C8yTranslatePipe,\n EmptyStateComponent\n ]\n})\nexport class AgentChatComponent implements OnInit, OnDestroy {\n @Input({ required: true }) agent: string | ClientAgentDefinition;\n @Input() suggestions: { label: string; prompt: string; icon?: string }[] = [];\n @Input() title: string;\n @Input() headline: string = gettext('Welcome!');\n @Input() welcomeText: string;\n @Input() autoInstallAgents = true;\n @Input() variables = {};\n @Input() stepRenderComponent: Type<any> = AgentStepFeedbackComponent;\n\n @Output() onMessageDelta = new EventEmitter<string>();\n @Output() onMessageText = new EventEmitter<string>();\n @Output() onMessageFinish = new EventEmitter<string>();\n @Output() onToolResult = new EventEmitter<ToolResult>();\n\n isLoading = false;\n\n /**\n * A stream of AI messages representing the conversation.\n */\n messages$: BehaviorSubject<AIMessageStreamSteps[]> = new BehaviorSubject<AIMessageStreamSteps[]>(\n []\n );\n agentName: string;\n hasError = true;\n canCreate = false;\n errorMsg = '';\n prompt = '';\n\n private aiService = inject(AIService);\n private gainsightService = inject(GainsightService);\n private alertService = inject(AlertService);\n private abortController: AbortController;\n private assistantSubscription: Subscription;\n\n defaultAgentStepRendererPipe: OperatorFunction<\n AgentStep[],\n { content: Type<any> | string; origin: AgentStep }[]\n > = <T extends AgentStep[]>(source: Observable<T>) => {\n return source.pipe(\n map(steps =>\n steps.map(step => {\n if (step.reasoning || step.toolCalls || step.toolResults) {\n return { content: this.stepRenderComponent, origin: { ...step } };\n }\n return { content: step.text, origin: { ...step } };\n })\n )\n );\n };\n\n async ngOnInit(): Promise<void> {\n this.isLoading = true;\n this.agentName = typeof this.agent === 'string' ? this.agent : this.agent.definitions[0].name;\n try {\n const agentHealth: AgentHealthCheckResponse = await this.aiService.getAgentHealth(\n this.agentName\n );\n this.composeErrorMessage(agentHealth);\n if (typeof this.agent !== 'string' && this.agent.snapshot) {\n this.createAgent();\n }\n } catch (ex) {\n this.errorMsg = gettext('Microservice not found. Please contact your administrator.');\n this.hasError = true;\n }\n this.isLoading = false;\n }\n\n async sendMessage(message: AIMessage) {\n this.messages$.next([...this.messages$.value, message]);\n this.isLoading = true;\n this.abortController = new AbortController();\n const currentAssistantMessage: AIMessageStreamSteps = {\n role: 'assistant',\n content: ''\n };\n this.messages$.next([...this.messages$.value, currentAssistantMessage]);\n const stream = await this.aiService.stream$(\n this.agentName,\n this.messages$.value.filter(m => m !== currentAssistantMessage),\n this.variables,\n this.abortController\n );\n\n if (this.assistantSubscription) {\n this.assistantSubscription.unsubscribe();\n }\n\n this.assistantSubscription = stream.subscribe((messageFromAssistant: AIMessage) =>\n this.processAgentMessage(\n currentAssistantMessage,\n messageFromAssistant,\n this.agentName,\n message\n )\n );\n }\n\n ngOnDestroy(): void {\n this.cancel();\n }\n\n reprompt(userMessage: AIMessageStreamSteps) {\n const index = this.messages$.value.indexOf(userMessage);\n if (index > -1) {\n this.messages$.next(this.messages$.value.slice(0, index));\n this.prompt = userMessage.content;\n }\n }\n\n rate(assistantMessage: AIMessageStreamSteps, positive) {\n const agentName = typeof this.agent === 'string' ? this.agent : this.agent.label;\n this.gainsightService.triggerEvent('ai.agent.feedback', {\n positive,\n assistant: assistantMessage,\n user: this.messages$.value[this.messages$.value.indexOf(assistantMessage) - 1],\n agent: agentName\n });\n }\n\n reload(assistantMessage: AIMessageStreamSteps) {\n const index = this.messages$.value.indexOf(assistantMessage);\n const userMessage = this.messages$.value[index - 1];\n if (index > -1) {\n this.messages$.next(this.messages$.value.slice(0, index - 1));\n this.sendMessage({\n role: 'user',\n content: userMessage.content,\n timestamp: new Date().toISOString()\n });\n }\n }\n\n async cancel() {\n if (this.abortController) {\n this.abortController.abort();\n }\n\n const lastMessage = this.messages$.value[this.messages$.value.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n if (lastMessage.content === '') {\n // if message is aborted before content is even populated, remove it entirely\n this.messages$.next(this.messages$.value.slice(0, -1));\n } else {\n // if message has content, mark the last step as aborted to indicate incomplete processing\n const lastMessageSteps: AgentStep[] =\n (await firstValueFrom(lastMessage.componentSteps$))\n .map(s => s.origin)\n .map((step, index, arr) =>\n index === arr.length - 1 ? { ...step, aborted: true } : step\n ) || [];\n if (lastMessageSteps.length) {\n lastMessage.componentSteps$ = of(lastMessageSteps).pipe(\n this.defaultAgentStepRendererPipe\n );\n\n this.messages$.next([...this.messages$.value]);\n }\n }\n }\n\n if (this.assistantSubscription) {\n this.assistantSubscription.unsubscribe();\n }\n\n this.isLoading = false;\n }\n\n async createAgent() {\n this.isLoading = true;\n try {\n await this.aiService.createOrUpdateAgent(this.agent as ClientAgentDefinition);\n this.hasError = false;\n } catch (ex) {\n this.alertService.danger(gettext('Failed to create the agent.'));\n this.hasError = true;\n }\n this.isLoading = false;\n }\n\n private composeErrorMessage(agentHealth: AgentHealthCheckResponse) {\n if (agentHealth.exists) {\n this.errorMsg = '';\n this.hasError = false;\n return;\n }\n this.hasError = true;\n if (!agentHealth.isProviderConfigured) {\n this.errorMsg = gettext('AI provider is not configured. Please contact your administrator.');\n return;\n }\n if (agentHealth.canCreate && typeof this.agent === 'string') {\n this.errorMsg = gettext(\n 'The agent does not exist. Provide the agent definition in the agent manager to use it.'\n );\n return;\n }\n if (agentHealth.canCreate && typeof this.agent !== 'string') {\n this.canCreate = true;\n if (this.autoInstallAgents) {\n this.createAgent();\n return;\n }\n this.errorMsg = gettext('The agent does not exist. You can create it now.');\n return;\n }\n if (!agentHealth.canCreate) {\n this.errorMsg = gettext('The agent does not exist. Please contact your administrator.');\n if (agentHealth.messages?.length) {\n this.errorMsg += '\\n' + agentHealth.messages.join(' ');\n }\n return;\n }\n this.errorMsg = gettext('Unknown error. Please contact your administrator.');\n }\n\n private processAgentMessage(\n currentAssistantMessage: AIMessageStreamSteps,\n messageFromAssistant: AIMessage,\n agentName: string,\n message: AIMessage\n ) {\n currentAssistantMessage.content = messageFromAssistant.content;\n\n const steps = messageFromAssistant.steps || [];\n const lastStep = steps.length ? steps[steps.length - 1] : null;\n\n this.onMessageDelta.emit(lastStep.textDelta);\n this.onMessageText.emit(lastStep.text);\n currentAssistantMessage.componentSteps$ = of(steps).pipe(this.defaultAgentStepRendererPipe);\n\n if (messageFromAssistant.finishReason === 'stop') {\n currentAssistantMessage.timestamp = new Date().toISOString();\n this.onMessageFinish.emit(currentAssistantMessage.content);\n this.gainsightService.triggerEvent('ai.agent.message', {\n agent: agentName,\n user: message,\n assistant: currentAssistantMessage.content\n });\n this.isLoading = false;\n }\n\n if (messageFromAssistant.finishReason === 'error') {\n currentAssistantMessage.timestamp = new Date().toISOString();\n this.isLoading = false;\n }\n\n if (lastStep?.toolResults) {\n lastStep.toolResults.forEach(toolResult => {\n this.onToolResult.emit(toolResult);\n });\n }\n\n // as we are mutating the currentAssistantMessage object\n // which is already in the messages array we need to emit a new array reference\n this.messages$.next([...this.messages$.value]);\n }\n}\n","@if (hasError && isLoading) {\n <c8y-loading class=\"m-auto\"></c8y-loading>\n}\n@if (hasError && !isLoading) {\n <c8y-ui-empty-state\n class=\"m-auto\"\n [icon]=\"'disclaimer'\"\n [title]=\"'An error occurred' | translate\"\n [subtitle]=\"errorMsg | translate\"\n [horizontal]=\"true\"\n >\n @if (canCreate) {\n <div class=\"text-center m-t-16 m-b-16\">\n <button\n class=\"btn btn-primary\"\n (click)=\"createAgent()\"\n >\n {{ 'Create agent' | translate }}\n </button>\n </div>\n }\n </c8y-ui-empty-state>\n}\n\n@if (!hasError) {\n <c8y-ai-chat\n (onMessage)=\"sendMessage($event)\"\n [isLoading]=\"isLoading\"\n (onCancel)=\"cancel()\"\n [config]=\"{ title: title, headline: headline, welcomeText: welcomeText }\"\n [prompt]=\"prompt\"\n >\n @for (message of messages$ | async; track $index; let i = $index) {\n <c8y-ai-chat-message\n [message]=\"{ role: message.role, content: '', timestamp: message.timestamp }\"\n >\n @if (!message.componentSteps$) {\n <div [innerHTML]=\"message.content | markdownToHtml | async\"></div>\n }\n @for (step of message.componentSteps$ | async; track $index) {\n @if (typeof step.content === 'string') {\n <div [innerHTML]=\"step.content | markdownToHtml | async\"></div>\n } @else {\n <ng-container\n [ngComponentOutlet]=\"step.content\"\n [ngComponentOutletInputs]=\"{ step: step.origin }\"\n ></ng-container>\n }\n }\n\n @if (message.role === 'user') {\n <c8y-ai-chat-message-action\n icon=\"pencil\"\n [tooltip]=\"'Edit and resend this message' | translate\"\n [disabled]=\"isLoading\"\n (click)=\"reprompt(message)\"\n ></c8y-ai-chat-message-action>\n }\n\n @if (message.role === 'assistant' && (i < (messages$ | async)?.length - 1 || !isLoading)) {\n <c8y-ai-chat-message-action\n icon=\"thumbs-up\"\n [tooltip]=\"'This is useful' | translate\"\n [disabled]=\"isLoading\"\n (click)=\"rate(message, true)\"\n ></c8y-ai-chat-message-action>\n }\n\n @if (message.role === 'assistant' && (i < (messages$ | async)?.length - 1 || !isLoading)) {\n <c8y-ai-chat-message-action\n icon=\"thumbs-down\"\n [tooltip]=\"'This is not useful' | translate\"\n [disabled]=\"isLoading\"\n (click)=\"rate(message, false)\"\n ></c8y-ai-chat-message-action>\n }\n\n @if (message.role === 'assistant' && (i < (messages$ | async)?.length - 1 || !isLoading)) {\n <c8y-ai-chat-message-action\n icon=\"refresh\"\n [tooltip]=\"'Regenerate this response' | translate\"\n [disabled]=\"isLoading\"\n (click)=\"reload(message)\"\n ></c8y-ai-chat-message-action>\n }\n\n @if (\n !message.content && message.role === 'assistant' && i === (messages$ | async)?.length - 1\n ) {\n <div class=\"text-center\">\n <c8y-loading></c8y-loading>\n </div>\n }\n </c8y-ai-chat-message>\n }\n\n @for (suggestion of suggestions; track $index) {\n <c8y-ai-chat-suggestion\n [icon]=\"suggestion.icon || 'c8y-bulb'\"\n [useAiButtons]=\"true\"\n [label]=\"suggestion.label\"\n [prompt]=\"suggestion.prompt\"\n (suggestionClicked)=\"sendMessage($event)\"\n [disabled]=\"isLoading\"\n ></c8y-ai-chat-suggestion>\n }\n </c8y-ai-chat>\n}\n","import { AsyncPipe } from '@angular/common';\nimport { Component, inject, Input, OnInit, Type } from '@angular/core';\nimport { AlertService, C8yTranslatePipe, ContextRouteService } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { ClientAgentDefinition, ToolResult } from '@c8y/ngx-components/ai';\nimport {\n WidgetConfigFeedbackComponent,\n WidgetConfigService\n} from '@c8y/ngx-components/context-dashboard';\nimport { AgentChatComponent } from './agent-chat.component';\nimport { AgentStepFeedbackComponent } from './agent-step-feedback.component';\n\n@Component({\n selector: 'c8y-widget-ai-chat-section',\n imports: [AgentChatComponent, C8yTranslatePipe, AsyncPipe, WidgetConfigFeedbackComponent],\n standalone: true,\n templateUrl: './widget-ai-chat-section.component.html'\n})\nexport class WidgetAiChatSectionComponent implements OnInit {\n @Input()\n suggestions: Array<{ label: string; prompt: string }> = [];\n @Input()\n agent: string | ClientAgentDefinition;\n @Input()\n headline = gettext('Welcome!');\n @Input()\n title: string = gettext('What can I help you with?');\n @Input()\n welcomeText;\n @Input()\n variables: { [key: string]: any };\n @Input()\n useContextAsVariable = true;\n @Input()\n contextVariableName = 'c8yContext';\n _renderStepComponent: Type<any>;\n\n private readonly widgetConfigService = inject(WidgetConfigService);\n private readonly alertService = inject(AlertService);\n private readonly contextRouteService = inject(ContextRouteService);\n\n /**\n * A component that is used to render each step in the chat. By default, it uses the `AgentStepFeedbackComponent`.\n * You can provide your own component by returning it from this callback.\n *\n * @returns A promise that resolves to a component type.\n */\n @Input()\n loadRenderStepComponent: () => Promise<Type<any>> = () =>\n Promise.resolve(AgentStepFeedbackComponent);\n\n /**\n * A callback that is invoked when a tool result is returned. The function can return either:\n * - `undefined` or `void`: No action is taken.\n * - an object which is stored to the widget configuration.\n */\n onToolResult: (step: ToolResult) => undefined | any = () => undefined;\n\n /**\n * @ignore\n */\n async ngOnInit(): Promise<void> {\n if (!this.variables && this.useContextAsVariable) {\n const { contextData } = this.contextRouteService.activatedContextData;\n this.variables = {\n [this.contextVariableName]: contextData || this.widgetConfigService.currentConfig.device\n };\n }\n\n this._renderStepComponent = await this.loadRenderStepComponent();\n }\n\n /**\n * Handles the tool result returned from the AI agent.\n * @param tool The tool result returned from the AI agent.\n */\n toolResultHandler(tool: ToolResult) {\n try {\n const parsedResult = this.onToolResult(tool);\n if (!parsedResult) {\n return;\n }\n this.widgetConfigService.updateConfig(\n {\n config: {\n ...this.widgetConfigService.currentConfig,\n ...parsedResult\n }\n },\n true\n );\n } catch (e) {\n this.alertService.danger(gettext('There was an error processing the AI response.'));\n }\n }\n}\n","<c8y-widget-config-feedback>\n <div\n class=\"m-l-4 btn-ai btn-ai-hint btn-sm\"\n [title]=\"'AI code assistant' | translate\"\n >\n <span></span>\n </div>\n</c8y-widget-config-feedback>\n\n<c8y-agent-chat\n [title]=\"title | translate\"\n [headline]=\"headline | translate\"\n [welcomeText]=\"welcomeText | translate\"\n #agentChat\n [suggestions]=\"(agentChat.messages$ | async)?.length === 0 ? suggestions : []\"\n [agent]=\"agent\"\n [variables]=\"variables\"\n [stepRenderComponent]=\"_renderStepComponent\"\n (onToolResult)=\"toolResultHandler($event)\"\n></c8y-agent-chat>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"c8y-ngx-components-ai-agent-chat.mjs","sources":["../../ai/agent-chat/agent-step-feedback.component.ts","../../ai/agent-chat/agent-step-feedback.component.html","../../ai/agent-chat/agent-chat.component.ts","../../ai/agent-chat/agent-chat.component.html","../../ai/agent-chat/widget-ai-chat-section.component.ts","../../ai/agent-chat/widget-ai-chat-section.component.html","../../ai/agent-chat/c8y-ngx-components-ai-agent-chat.ts"],"sourcesContent":["import { JsonPipe, NgClass, AsyncPipe } from '@angular/common';\nimport { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\nimport {\n ListGroupComponent,\n ListItemBodyComponent,\n ListItemCollapseComponent,\n ListItemComponent,\n ListItemIconComponent,\n MarkdownToHtmlPipe,\n C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { AgentStep } from '@c8y/ngx-components/ai';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\n@Component({\n selector: 'c8y-agent-step-feedback',\n templateUrl: './agent-step-feedback.component.html',\n standalone: true,\n imports: [\n ListGroupComponent,\n ListItemComponent,\n ListItemCollapseComponent,\n ListItemBodyComponent,\n ListItemIconComponent,\n NgClass,\n JsonPipe,\n MarkdownToHtmlPipe,\n AsyncPipe,\n C8yTranslatePipe\n ],\n host: { class: 'agent-step-feedback' }\n})\nexport class AgentStepFeedbackComponent implements OnInit, OnChanges {\n @Input({ required: true }) step: AgentStep;\n\n @Input() label: string;\n @Input() loading = false;\n @Input() collapsed = true;\n @Input() canCollapse = false;\n\n ngOnInit(): void {\n if (this.step) {\n this.parseDefaultAgentStep(this.step);\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.step) {\n this.parseDefaultAgentStep(changes.step.currentValue);\n }\n }\n\n parseDefaultAgentStep(step: AgentStep): void {\n if (step.reasoning) {\n this.label = gettext('Reasoning');\n this.loading = false;\n this.canCollapse = true;\n this.collapsed = false;\n }\n\n if (step.toolCalls.length > 0 && !step.toolResults?.length) {\n this.label = gettext('Calling a tool');\n this.loading = true;\n this.canCollapse = true;\n this.collapsed = true;\n } else if (step.toolResults?.length > 0) {\n this.label = gettext('Tool result');\n this.loading = false;\n this.canCollapse = true;\n this.collapsed = true;\n }\n }\n}\n","@if (!step.reasoning) {\n <div [innerHTML]=\"step.text | markdownToHtml | async\"></div>\n}\n@if (label) {\n <c8y-list-group class=\"m-t-16 m-b-16\">\n <c8y-li\n [active]=\"!loading\"\n [collapsed]=\"collapsed\"\n >\n <c8y-li-icon>\n <span\n class=\"btn-ai btn-ai-hint btn-sm\"\n [ngClass]=\"{ working: loading }\"\n >\n <span></span>\n </span>\n </c8y-li-icon>\n <c8y-li-body>\n {{ label | translate }}\n </c8y-li-body>\n\n @if (canCollapse) {\n <c8y-li-collapse>\n @if (step.reasoning) {\n <div [innerHTML]=\"step.reasoning | markdownToHtml | async\"></div>\n } @else if (step) {\n <pre\n class=\"fit-w\"\n style=\"max-height: 320px\"\n >{{ step | json }}</pre\n >\n }\n </c8y-li-collapse>\n }\n </c8y-li>\n </c8y-list-group>\n}\n","import { AsyncPipe, NgComponentOutlet } from '@angular/common';\nimport {\n Component,\n EventEmitter,\n inject,\n Input,\n OnDestroy,\n OnInit,\n Output,\n Type\n} from '@angular/core';\nimport {\n AlertService,\n AppStateService,\n C8Y_PLUGIN_CONTEXT_PATH,\n C8yTranslatePipe,\n EmptyStateComponent,\n GainsightService,\n LoadingComponent,\n MarkdownToHtmlPipe\n} from '@c8y/ngx-components';\nimport {\n AgentHealthCheckResponse,\n AgentStep,\n AIMessage,\n AIMessageStreamSteps,\n AIService,\n ClientAgentDefinition,\n ToolResult\n} from '@c8y/ngx-components/ai';\nimport {\n AiChatComponent,\n AiChatMessageActionComponent,\n AiChatMessageComponent,\n AiChatSuggestionComponent\n} from '@c8y/ngx-components/ai/ai-chat';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n BehaviorSubject,\n firstValueFrom,\n map,\n Observable,\n of,\n OperatorFunction,\n Subscription\n} from 'rxjs';\nimport { AgentStepFeedbackComponent } from './agent-step-feedback.component';\n\n@Component({\n selector: 'c8y-agent-chat',\n templateUrl: './agent-chat.component.html',\n imports: [\n AiChatComponent,\n AiChatSuggestionComponent,\n AiChatMessageComponent,\n AiChatMessageActionComponent,\n LoadingComponent,\n MarkdownToHtmlPipe,\n AsyncPipe,\n NgComponentOutlet,\n C8yTranslatePipe,\n EmptyStateComponent\n ]\n})\nexport class AgentChatComponent implements OnInit, OnDestroy {\n private _agent: string | ClientAgentDefinition;\n\n @Input({ required: true })\n set agent(value: string | ClientAgentDefinition) {\n if (typeof value === 'string') {\n this.agentName = value;\n this.agentDefinition = undefined;\n } else {\n this.agentName = value.definition.name;\n this.agentDefinition = value;\n }\n }\n\n @Input() suggestions: { label: string; prompt: string; icon?: string }[] = [];\n @Input() title: string;\n @Input() headline: string = gettext('Welcome!');\n @Input() welcomeText: string;\n @Input() autoInstallAgents = true;\n @Input() variables = {};\n @Input() stepRenderComponent: Type<any> = AgentStepFeedbackComponent;\n\n @Output() onMessageDelta = new EventEmitter<string>();\n @Output() onMessageText = new EventEmitter<string>();\n @Output() onMessageFinish = new EventEmitter<string>();\n @Output() onToolResult = new EventEmitter<ToolResult>();\n\n isLoading = false;\n\n /**\n * A stream of AI messages representing the conversation.\n */\n messages$: BehaviorSubject<AIMessageStreamSteps[]> = new BehaviorSubject<AIMessageStreamSteps[]>(\n []\n );\n agentName: string;\n agentDefinition: ClientAgentDefinition | undefined;\n hasError = true;\n canCreate = false;\n errorMsg = '';\n prompt = '';\n\n private aiService = inject(AIService);\n private gainsightService = inject(GainsightService);\n private alertService = inject(AlertService);\n private pluginContextPath = inject(C8Y_PLUGIN_CONTEXT_PATH, { optional: true });\n private appState = inject(AppStateService);\n private abortController: AbortController;\n private assistantSubscription: Subscription;\n\n private get currentContextPath(): string {\n return this.pluginContextPath || this.appState.currentApplication?.value?.contextPath || '';\n }\n\n defaultAgentStepRendererPipe: OperatorFunction<\n AgentStep[],\n { content: Type<any> | string; origin: AgentStep }[]\n > = <T extends AgentStep[]>(source: Observable<T>) => {\n return source.pipe(\n map(steps =>\n steps.map(step => {\n if (step.reasoning || step.toolCalls || step.toolResults) {\n return { content: this.stepRenderComponent, origin: { ...step } };\n }\n return { content: step.text, origin: { ...step } };\n })\n )\n );\n };\n\n async ngOnInit(): Promise<void> {\n if (this.agentDefinition.snapshot) {\n this.hasError = false;\n return;\n }\n this.isLoading = true;\n try {\n const agentHealth: AgentHealthCheckResponse = await this.aiService.getAgentHealth(\n this.agentName,\n this.currentContextPath\n );\n this.composeErrorMessage(agentHealth);\n } catch (ex) {\n this.errorMsg = gettext('Microservice not found. Please contact your administrator.');\n this.hasError = true;\n }\n this.isLoading = false;\n }\n\n async sendMessage(message: AIMessage) {\n this.messages$.next([...this.messages$.value, message]);\n this.isLoading = true;\n this.abortController = new AbortController();\n const currentAssistantMessage: AIMessageStreamSteps = {\n role: 'assistant',\n content: ''\n };\n this.messages$.next([...this.messages$.value, currentAssistantMessage]);\n const stream = await this.aiService.stream$(\n this.agentDefinition || this.agentName,\n this.messages$.value.filter(m => m !== currentAssistantMessage),\n this.variables,\n this.abortController,\n this.currentContextPath\n );\n\n if (this.assistantSubscription) {\n this.assistantSubscription.unsubscribe();\n }\n\n this.assistantSubscription = stream.subscribe((messageFromAssistant: AIMessage) =>\n this.processAgentMessage(\n currentAssistantMessage,\n messageFromAssistant,\n this.agentName,\n message\n )\n );\n }\n\n ngOnDestroy(): void {\n this.cancel();\n }\n\n reprompt(userMessage: AIMessageStreamSteps) {\n const index = this.messages$.value.indexOf(userMessage);\n if (index > -1) {\n this.messages$.next(this.messages$.value.slice(0, index));\n this.prompt = userMessage.content;\n }\n }\n\n rate(assistantMessage: AIMessageStreamSteps, positive) {\n const agentName = typeof this.agent === 'string' ? this.agent : this.agent.label;\n this.gainsightService.triggerEvent('ai.agent.feedback', {\n positive,\n assistant: assistantMessage,\n user: this.messages$.value[this.messages$.value.indexOf(assistantMessage) - 1],\n agent: agentName\n });\n }\n\n reload(assistantMessage: AIMessageStreamSteps) {\n const index = this.messages$.value.indexOf(assistantMessage);\n const userMessage = this.messages$.value[index - 1];\n if (index > -1) {\n this.messages$.next(this.messages$.value.slice(0, index - 1));\n this.sendMessage({\n role: 'user',\n content: userMessage.content,\n timestamp: new Date().toISOString()\n });\n }\n }\n\n async cancel() {\n if (this.abortController) {\n this.abortController.abort();\n }\n\n const lastMessage = this.messages$.value[this.messages$.value.length - 1];\n if (lastMessage && lastMessage.role === 'assistant') {\n if (lastMessage.content === '') {\n // if message is aborted before content is even populated, remove it entirely\n this.messages$.next(this.messages$.value.slice(0, -1));\n } else {\n // if message has content, mark the last step as aborted to indicate incomplete processing\n const lastMessageSteps: AgentStep[] =\n (await firstValueFrom(lastMessage.componentSteps$))\n .map(s => s.origin)\n .map((step, index, arr) =>\n index === arr.length - 1 ? { ...step, aborted: true } : step\n ) || [];\n if (lastMessageSteps.length) {\n lastMessage.componentSteps$ = of(lastMessageSteps).pipe(\n this.defaultAgentStepRendererPipe\n );\n\n this.messages$.next([...this.messages$.value]);\n }\n }\n }\n\n if (this.assistantSubscription) {\n this.assistantSubscription.unsubscribe();\n }\n\n this.isLoading = false;\n }\n\n async createAgent() {\n this.isLoading = true;\n try {\n await this.aiService.createOrUpdateAgent(this.agentDefinition.definition);\n this.hasError = false;\n } catch (ex) {\n this.alertService.danger(gettext('Failed to create the agent.'));\n this.hasError = true;\n }\n this.isLoading = false;\n }\n\n private composeErrorMessage(agentHealth: AgentHealthCheckResponse) {\n if (agentHealth.exists) {\n this.errorMsg = '';\n this.hasError = false;\n return;\n }\n this.hasError = true;\n if (!agentHealth.isProviderConfigured) {\n this.errorMsg = gettext('AI provider is not configured. Please contact your administrator.');\n return;\n }\n if (agentHealth.canCreate && typeof this.agent === 'string') {\n this.errorMsg = gettext(\n 'The agent does not exist. Provide the agent definition in the agent manager to use it.'\n );\n return;\n }\n if (agentHealth.canCreate && typeof this.agent !== 'string') {\n this.canCreate = true;\n if (this.autoInstallAgents && this.agentDefinition) {\n this.createAgent();\n return;\n }\n this.errorMsg = gettext('The agent does not exist. You can create it now.');\n return;\n }\n if (!agentHealth.canCreate) {\n this.errorMsg = gettext('The agent does not exist. Please contact your administrator.');\n if (agentHealth.messages?.length) {\n this.errorMsg += '\\n' + agentHealth.messages.join(' ');\n }\n return;\n }\n this.errorMsg = gettext('Unknown error. Please contact your administrator.');\n }\n\n private processAgentMessage(\n currentAssistantMessage: AIMessageStreamSteps,\n messageFromAssistant: AIMessage,\n agentName: string,\n message: AIMessage\n ) {\n currentAssistantMessage.content = messageFromAssistant.content;\n\n const steps = messageFromAssistant.steps || [];\n const lastStep = steps.length ? steps[steps.length - 1] : null;\n\n this.onMessageDelta.emit(lastStep.textDelta);\n this.onMessageText.emit(lastStep.text);\n currentAssistantMessage.componentSteps$ = of(steps).pipe(this.defaultAgentStepRendererPipe);\n\n if (messageFromAssistant.finishReason === 'stop') {\n currentAssistantMessage.timestamp = new Date().toISOString();\n this.onMessageFinish.emit(currentAssistantMessage.content);\n this.gainsightService.triggerEvent('ai.agent.message', {\n agent: agentName,\n user: message,\n assistant: currentAssistantMessage.content\n });\n this.isLoading = false;\n }\n\n if (messageFromAssistant.finishReason === 'error') {\n currentAssistantMessage.timestamp = new Date().toISOString();\n this.isLoading = false;\n }\n\n if (lastStep?.toolResults) {\n lastStep.toolResults.forEach(toolResult => {\n this.onToolResult.emit(toolResult);\n });\n }\n\n // as we are mutating the currentAssistantMessage object\n // which is already in the messages array we need to emit a new array reference\n this.messages$.next([...this.messages$.value]);\n }\n}\n","@if (hasError && isLoading) {\n <c8y-loading class=\"m-auto\"></c8y-loading>\n}\n@if (hasError && !isLoading) {\n <c8y-ui-empty-state\n class=\"m-auto\"\n [icon]=\"'disclaimer'\"\n [title]=\"'An error occurred' | translate\"\n [subtitle]=\"errorMsg | translate\"\n [horizontal]=\"true\"\n >\n @if (canCreate) {\n <div class=\"text-center m-t-16 m-b-16\">\n <button\n class=\"btn btn-primary\"\n (click)=\"createAgent()\"\n >\n {{ 'Create agent' | translate }}\n </button>\n </div>\n }\n </c8y-ui-empty-state>\n}\n\n@if (!hasError) {\n <c8y-ai-chat\n (onMessage)=\"sendMessage($event)\"\n [isLoading]=\"isLoading\"\n (onCancel)=\"cancel()\"\n [config]=\"{ title: title, headline: headline, welcomeText: welcomeText }\"\n [prompt]=\"prompt\"\n >\n @for (message of messages$ | async; track $index; let i = $index) {\n <c8y-ai-chat-message\n [message]=\"{ role: message.role, content: '', timestamp: message.timestamp }\"\n >\n @if (!message.componentSteps$) {\n <div [innerHTML]=\"message.content | markdownToHtml | async\"></div>\n }\n @for (step of message.componentSteps$ | async; track $index) {\n @if (typeof step.content === 'string') {\n <div [innerHTML]=\"step.content | markdownToHtml | async\"></div>\n } @else {\n <ng-container\n [ngComponentOutlet]=\"step.content\"\n [ngComponentOutletInputs]=\"{ step: step.origin }\"\n ></ng-container>\n }\n }\n\n @if (message.role === 'user') {\n <c8y-ai-chat-message-action\n icon=\"pencil\"\n [tooltip]=\"'Edit and resend this message' | translate\"\n [disabled]=\"isLoading\"\n (click)=\"reprompt(message)\"\n ></c8y-ai-chat-message-action>\n }\n\n @if (message.role === 'assistant' && (i < (messages$ | async)?.length - 1 || !isLoading)) {\n <c8y-ai-chat-message-action\n icon=\"thumbs-up\"\n [tooltip]=\"'This is useful' | translate\"\n [disabled]=\"isLoading\"\n (click)=\"rate(message, true)\"\n ></c8y-ai-chat-message-action>\n }\n\n @if (message.role === 'assistant' && (i < (messages$ | async)?.length - 1 || !isLoading)) {\n <c8y-ai-chat-message-action\n icon=\"thumbs-down\"\n [tooltip]=\"'This is not useful' | translate\"\n [disabled]=\"isLoading\"\n (click)=\"rate(message, false)\"\n ></c8y-ai-chat-message-action>\n }\n\n @if (message.role === 'assistant' && (i < (messages$ | async)?.length - 1 || !isLoading)) {\n <c8y-ai-chat-message-action\n icon=\"refresh\"\n [tooltip]=\"'Regenerate this response' | translate\"\n [disabled]=\"isLoading\"\n (click)=\"reload(message)\"\n ></c8y-ai-chat-message-action>\n }\n\n @if (\n !message.content && message.role === 'assistant' && i === (messages$ | async)?.length - 1\n ) {\n <div class=\"text-center\">\n <c8y-loading></c8y-loading>\n </div>\n }\n </c8y-ai-chat-message>\n }\n\n @for (suggestion of suggestions; track $index) {\n <c8y-ai-chat-suggestion\n [icon]=\"suggestion.icon || 'c8y-bulb'\"\n [useAiButtons]=\"true\"\n [label]=\"suggestion.label\"\n [prompt]=\"suggestion.prompt\"\n (suggestionClicked)=\"sendMessage($event)\"\n [disabled]=\"isLoading\"\n ></c8y-ai-chat-suggestion>\n }\n </c8y-ai-chat>\n}\n","import { AsyncPipe } from '@angular/common';\nimport { Component, inject, Input, OnInit, Type } from '@angular/core';\nimport { AlertService, C8yTranslatePipe, ContextRouteService } from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { ClientAgentDefinition, ToolResult } from '@c8y/ngx-components/ai';\nimport {\n WidgetConfigFeedbackComponent,\n WidgetConfigService\n} from '@c8y/ngx-components/context-dashboard';\nimport { AgentChatComponent } from './agent-chat.component';\nimport { AgentStepFeedbackComponent } from './agent-step-feedback.component';\n\n@Component({\n selector: 'c8y-widget-ai-chat-section',\n imports: [AgentChatComponent, C8yTranslatePipe, AsyncPipe, WidgetConfigFeedbackComponent],\n standalone: true,\n templateUrl: './widget-ai-chat-section.component.html'\n})\nexport class WidgetAiChatSectionComponent implements OnInit {\n @Input()\n suggestions: Array<{ label: string; prompt: string }> = [];\n @Input()\n agent: string | ClientAgentDefinition;\n @Input()\n headline = gettext('Welcome!');\n @Input()\n title: string = gettext('What can I help you with?');\n @Input()\n welcomeText;\n @Input()\n variables: { [key: string]: any };\n @Input()\n useContextAsVariable = true;\n @Input()\n contextVariableName = 'c8yContext';\n _renderStepComponent: Type<any>;\n\n private readonly widgetConfigService = inject(WidgetConfigService);\n private readonly alertService = inject(AlertService);\n private readonly contextRouteService = inject(ContextRouteService);\n\n /**\n * A component that is used to render each step in the chat. By default, it uses the `AgentStepFeedbackComponent`.\n * You can provide your own component by returning it from this callback.\n *\n * @returns A promise that resolves to a component type.\n */\n @Input()\n loadRenderStepComponent: () => Promise<Type<any>> = () =>\n Promise.resolve(AgentStepFeedbackComponent);\n\n /**\n * A callback that is invoked when a tool result is returned. The function can return either:\n * - `undefined` or `void`: No action is taken.\n * - an object which is stored to the widget configuration.\n */\n onToolResult: (step: ToolResult) => undefined | any = () => undefined;\n\n /**\n * @ignore\n */\n async ngOnInit(): Promise<void> {\n if (!this.variables && this.useContextAsVariable) {\n const { contextData } = this.contextRouteService.activatedContextData;\n this.variables = {\n [this.contextVariableName]: contextData || this.widgetConfigService.currentConfig.device\n };\n }\n\n this._renderStepComponent = await this.loadRenderStepComponent();\n }\n\n /**\n * Handles the tool result returned from the AI agent.\n * @param tool The tool result returned from the AI agent.\n */\n toolResultHandler(tool: ToolResult) {\n try {\n const parsedResult = this.onToolResult(tool);\n if (!parsedResult) {\n return;\n }\n this.widgetConfigService.updateConfig(\n {\n config: {\n ...this.widgetConfigService.currentConfig,\n ...parsedResult\n }\n },\n true\n );\n } catch (e) {\n this.alertService.danger(gettext('There was an error processing the AI response.'));\n }\n }\n}\n","<c8y-widget-config-feedback>\n <div\n class=\"m-l-4 btn-ai btn-ai-hint btn-sm\"\n [title]=\"'AI code assistant' | translate\"\n >\n <span></span>\n </div>\n</c8y-widget-config-feedback>\n\n<c8y-agent-chat\n [title]=\"title | translate\"\n [headline]=\"headline | translate\"\n [welcomeText]=\"welcomeText | translate\"\n #agentChat\n [suggestions]=\"(agentChat.messages$ | async)?.length === 0 ? suggestions : []\"\n [agent]=\"agent\"\n [variables]=\"variables\"\n [stepRenderComponent]=\"_renderStepComponent\"\n (onToolResult)=\"toolResultHandler($event)\"\n></c8y-agent-chat>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -184,7 +184,8 @@ class AiChatComponent {
184
184
  headline: gettext('Welcome!'),
185
185
  welcomeText: '',
186
186
  title: gettext('What can I help you with?'),
187
- placeholder: gettext('Type your message here...'),
187
+ placeholder: gettext('Type your message here'),
188
+ placeholderAfterFirstMessage: gettext('Type your next message here…'),
188
189
  sendButtonText: gettext('Send'),
189
190
  cancelButtonText: gettext('Cancel'),
190
191
  disclaimerText: gettext('AI-generated responses can contain errors. Verify the details before use.'),
@@ -218,7 +219,7 @@ class AiChatComponent {
218
219
  content: this.prompt,
219
220
  timestamp: new Date().toISOString()
220
221
  });
221
- this.prompt = '';
222
+ // this.prompt = '';
222
223
  }
223
224
  /**
224
225
  * Handles cancellation of ongoing operations during loading state.
@@ -228,11 +229,11 @@ class AiChatComponent {
228
229
  this.onCancel.emit();
229
230
  }
230
231
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AiChatComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
231
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: AiChatComponent, isStandalone: true, selector: "c8y-ai-chat", inputs: { isLoading: "isLoading", disabled: "disabled", prompt: "prompt", config: "config" }, outputs: { onMessage: "onMessage", onCancel: "onCancel" }, host: { classAttribute: "d-contents" }, queries: [{ propertyName: "messages", predicate: AiChatMessageComponent }], ngImport: i0, template: "<div\n class=\"d-col fit-h fit-w flex-grow\"\n [attr.aria-label]=\"config.headline | translate\"\n role=\"region\"\n>\n @if (messages.length > 0) {\n <div\n class=\"inner-scroll flex-grow d-col-reverse min-height-0 bg-level-0\"\n [attr.aria-label]=\"'Chat conversation' | translate\"\n aria-live=\"polite\"\n aria-atomic=\"false\"\n role=\"log\"\n >\n <div class=\"d-col p-l-16 p-r-16\">\n <ng-content select=\"c8y-ai-chat-message\"></ng-content>\n <ng-content></ng-content>\n </div>\n </div>\n }\n <div [ngClass]=\"{ 'd-col fit-h': messages.length === 0 }\">\n @if (messages.length === 0) {\n <div\n class=\"p-24\"\n aria-live=\"polite\"\n role=\"status\"\n >\n <h4 class=\"m-b-16 text-medium\">{{ config.headline | translate }}</h4>\n <p class=\"p-b-8 text-balance\">{{ config.title | translate }}</p>\n <p class=\"text-muted text-balance\">{{ config.welcomeText | translate }}</p>\n </div>\n }\n <div class=\"chat-input bg-level-1\">\n <div class=\"d-flex inner-scroll a-i-center gap-8 p-l-16 p-r-16 p-b-8\">\n <ng-content select=\"c8y-ai-chat-suggestion\"></ng-content>\n </div>\n <div class=\"chat-input-group\">\n <label\n class=\"sr-only\"\n for=\"chat-input-{{ componentId }}\"\n >\n {{ config.placeholder | translate }}\n </label>\n <textarea\n class=\"form-control no-resize\"\n style=\"max-height: 200px !important\"\n [attr.aria-label]=\"config.placeholder | translate\"\n id=\"chat-input-{{ componentId }}\"\n placeholder=\"{{ config.placeholder | translate }}\"\n [attr.aria-describedby]=\"config.disclaimerText ? 'chat-disclaimer-' + componentId : null\"\n [attr.aria-busy]=\"isLoading\"\n [(ngModel)]=\"prompt\"\n (keydown.enter)=\"sendMessage($event)\"\n [disabled]=\"isLoading || disabled\"\n c8y-textarea-autoresize\n ></textarea>\n <div class=\"chat-input-group-btn\">\n @if (!isLoading) {\n <button\n class=\"btn btn-dot\"\n [attr.title]=\"config.sendButtonText | translate\"\n [attr.aria-label]=\"config.sendButtonText | translate\"\n type=\"button\"\n (click)=\"sendMessage($event)\"\n [disabled]=\"disabled || prompt.trim().length === 0\"\n >\n <i [c8yIcon]=\"config.userInterfaceIcons?.send || 'arrow-circle-right'\"></i>\n </button>\n } @else {\n <button\n class=\"btn btn-dot btn-dot--danger\"\n [attr.title]=\"config.cancelButtonText | translate\"\n [attr.aria-label]=\"config.cancelButtonText | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n <i [c8yIcon]=\"config.userInterfaceIcons?.cancel || 'stop'\"></i>\n </button>\n }\n </div>\n </div>\n @if (config.disclaimerText) {\n <div\n class=\"text-muted m-b-8 text-10 p-l-16\"\n id=\"chat-disclaimer-{{ componentId }}\"\n role=\"note\"\n >\n {{ config.disclaimerText | translate }}\n </div>\n }\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: TextareaAutoresizeDirective, selector: "[c8y-textarea-autoresize]" }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
232
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: AiChatComponent, isStandalone: true, selector: "c8y-ai-chat", inputs: { isLoading: "isLoading", disabled: "disabled", prompt: "prompt", config: "config" }, outputs: { onMessage: "onMessage", onCancel: "onCancel" }, host: { classAttribute: "d-contents" }, queries: [{ propertyName: "messages", predicate: AiChatMessageComponent }], ngImport: i0, template: "<div\n class=\"d-col fit-h fit-w flex-grow\"\n [attr.aria-label]=\"config.headline | translate\"\n role=\"region\"\n>\n @if (messages.length > 0) {\n <div\n class=\"inner-scroll flex-grow d-col-reverse min-height-0 bg-level-0\"\n [attr.aria-label]=\"'Chat conversation' | translate\"\n aria-live=\"polite\"\n aria-atomic=\"false\"\n role=\"log\"\n >\n <div class=\"d-col p-l-16 p-r-16\">\n <ng-content select=\"c8y-ai-chat-message\"></ng-content>\n <ng-content></ng-content>\n </div>\n </div>\n }\n <div [ngClass]=\"{ 'd-col fit-h': messages.length === 0 }\">\n @if (messages.length === 0) {\n <div\n class=\"p-24\"\n aria-live=\"polite\"\n role=\"status\"\n >\n <h4 class=\"m-b-16 text-medium\">{{ config.headline | translate }}</h4>\n <p class=\"p-b-8 text-balance\">{{ config.title | translate }}</p>\n <p class=\"text-muted text-balance\">{{ config.welcomeText | translate }}</p>\n </div>\n }\n <div class=\"chat-input bg-level-1\">\n <div class=\"d-flex inner-scroll a-i-center gap-8 p-l-16 p-r-16 p-b-8\">\n <ng-content select=\"c8y-ai-chat-suggestion\"></ng-content>\n </div>\n <div class=\"chat-input-group\">\n <label\n class=\"sr-only\"\n for=\"chat-input-{{ componentId }}\"\n >\n {{ config.placeholder | translate }}\n </label>\n <textarea\n class=\"form-control no-resize\"\n style=\"max-height: 200px !important\"\n [attr.aria-label]=\"config.placeholder | translate\"\n id=\"chat-input-{{ componentId }}\"\n [attr.aria-describedby]=\"config.disclaimerText ? 'chat-disclaimer-' + componentId : null\"\n [attr.aria-busy]=\"isLoading\"\n [placeholder]=\"\n (messages.length === 0 ? config.placeholder : config.placeholderAfterFirstMessage)\n | translate\n \"\n [(ngModel)]=\"prompt\"\n (keydown.enter)=\"sendMessage($event)\"\n [disabled]=\"isLoading || disabled\"\n c8y-textarea-autoresize\n ></textarea>\n <div class=\"chat-input-group-btn\">\n @if (!isLoading) {\n <button\n class=\"btn btn-dot\"\n [attr.title]=\"config.sendButtonText | translate\"\n [attr.aria-label]=\"config.sendButtonText | translate\"\n type=\"button\"\n (click)=\"sendMessage($event)\"\n [disabled]=\"disabled || prompt.trim().length === 0\"\n >\n <i [c8yIcon]=\"config.userInterfaceIcons?.send || 'arrow-circle-right'\"></i>\n </button>\n } @else {\n <button\n class=\"btn btn-dot btn-dot--danger\"\n [attr.title]=\"config.cancelButtonText | translate\"\n [attr.aria-label]=\"config.cancelButtonText | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n <i [c8yIcon]=\"config.userInterfaceIcons?.cancel || 'stop'\"></i>\n </button>\n }\n </div>\n </div>\n @if (config.disclaimerText) {\n <div\n class=\"text-muted m-b-8 text-10 p-l-16\"\n id=\"chat-disclaimer-{{ componentId }}\"\n role=\"note\"\n >\n {{ config.disclaimerText | translate }}\n </div>\n }\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: TextareaAutoresizeDirective, selector: "[c8y-textarea-autoresize]" }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
232
233
  }
233
234
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AiChatComponent, decorators: [{
234
235
  type: Component,
235
- args: [{ selector: 'c8y-ai-chat', imports: [C8yTranslatePipe, FormsModule, TextareaAutoresizeDirective, IconDirective, NgClass], standalone: true, host: { class: 'd-contents' }, template: "<div\n class=\"d-col fit-h fit-w flex-grow\"\n [attr.aria-label]=\"config.headline | translate\"\n role=\"region\"\n>\n @if (messages.length > 0) {\n <div\n class=\"inner-scroll flex-grow d-col-reverse min-height-0 bg-level-0\"\n [attr.aria-label]=\"'Chat conversation' | translate\"\n aria-live=\"polite\"\n aria-atomic=\"false\"\n role=\"log\"\n >\n <div class=\"d-col p-l-16 p-r-16\">\n <ng-content select=\"c8y-ai-chat-message\"></ng-content>\n <ng-content></ng-content>\n </div>\n </div>\n }\n <div [ngClass]=\"{ 'd-col fit-h': messages.length === 0 }\">\n @if (messages.length === 0) {\n <div\n class=\"p-24\"\n aria-live=\"polite\"\n role=\"status\"\n >\n <h4 class=\"m-b-16 text-medium\">{{ config.headline | translate }}</h4>\n <p class=\"p-b-8 text-balance\">{{ config.title | translate }}</p>\n <p class=\"text-muted text-balance\">{{ config.welcomeText | translate }}</p>\n </div>\n }\n <div class=\"chat-input bg-level-1\">\n <div class=\"d-flex inner-scroll a-i-center gap-8 p-l-16 p-r-16 p-b-8\">\n <ng-content select=\"c8y-ai-chat-suggestion\"></ng-content>\n </div>\n <div class=\"chat-input-group\">\n <label\n class=\"sr-only\"\n for=\"chat-input-{{ componentId }}\"\n >\n {{ config.placeholder | translate }}\n </label>\n <textarea\n class=\"form-control no-resize\"\n style=\"max-height: 200px !important\"\n [attr.aria-label]=\"config.placeholder | translate\"\n id=\"chat-input-{{ componentId }}\"\n placeholder=\"{{ config.placeholder | translate }}\"\n [attr.aria-describedby]=\"config.disclaimerText ? 'chat-disclaimer-' + componentId : null\"\n [attr.aria-busy]=\"isLoading\"\n [(ngModel)]=\"prompt\"\n (keydown.enter)=\"sendMessage($event)\"\n [disabled]=\"isLoading || disabled\"\n c8y-textarea-autoresize\n ></textarea>\n <div class=\"chat-input-group-btn\">\n @if (!isLoading) {\n <button\n class=\"btn btn-dot\"\n [attr.title]=\"config.sendButtonText | translate\"\n [attr.aria-label]=\"config.sendButtonText | translate\"\n type=\"button\"\n (click)=\"sendMessage($event)\"\n [disabled]=\"disabled || prompt.trim().length === 0\"\n >\n <i [c8yIcon]=\"config.userInterfaceIcons?.send || 'arrow-circle-right'\"></i>\n </button>\n } @else {\n <button\n class=\"btn btn-dot btn-dot--danger\"\n [attr.title]=\"config.cancelButtonText | translate\"\n [attr.aria-label]=\"config.cancelButtonText | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n <i [c8yIcon]=\"config.userInterfaceIcons?.cancel || 'stop'\"></i>\n </button>\n }\n </div>\n </div>\n @if (config.disclaimerText) {\n <div\n class=\"text-muted m-b-8 text-10 p-l-16\"\n id=\"chat-disclaimer-{{ componentId }}\"\n role=\"note\"\n >\n {{ config.disclaimerText | translate }}\n </div>\n }\n </div>\n </div>\n</div>\n" }]
236
+ args: [{ selector: 'c8y-ai-chat', imports: [C8yTranslatePipe, FormsModule, TextareaAutoresizeDirective, IconDirective, NgClass], standalone: true, host: { class: 'd-contents' }, template: "<div\n class=\"d-col fit-h fit-w flex-grow\"\n [attr.aria-label]=\"config.headline | translate\"\n role=\"region\"\n>\n @if (messages.length > 0) {\n <div\n class=\"inner-scroll flex-grow d-col-reverse min-height-0 bg-level-0\"\n [attr.aria-label]=\"'Chat conversation' | translate\"\n aria-live=\"polite\"\n aria-atomic=\"false\"\n role=\"log\"\n >\n <div class=\"d-col p-l-16 p-r-16\">\n <ng-content select=\"c8y-ai-chat-message\"></ng-content>\n <ng-content></ng-content>\n </div>\n </div>\n }\n <div [ngClass]=\"{ 'd-col fit-h': messages.length === 0 }\">\n @if (messages.length === 0) {\n <div\n class=\"p-24\"\n aria-live=\"polite\"\n role=\"status\"\n >\n <h4 class=\"m-b-16 text-medium\">{{ config.headline | translate }}</h4>\n <p class=\"p-b-8 text-balance\">{{ config.title | translate }}</p>\n <p class=\"text-muted text-balance\">{{ config.welcomeText | translate }}</p>\n </div>\n }\n <div class=\"chat-input bg-level-1\">\n <div class=\"d-flex inner-scroll a-i-center gap-8 p-l-16 p-r-16 p-b-8\">\n <ng-content select=\"c8y-ai-chat-suggestion\"></ng-content>\n </div>\n <div class=\"chat-input-group\">\n <label\n class=\"sr-only\"\n for=\"chat-input-{{ componentId }}\"\n >\n {{ config.placeholder | translate }}\n </label>\n <textarea\n class=\"form-control no-resize\"\n style=\"max-height: 200px !important\"\n [attr.aria-label]=\"config.placeholder | translate\"\n id=\"chat-input-{{ componentId }}\"\n [attr.aria-describedby]=\"config.disclaimerText ? 'chat-disclaimer-' + componentId : null\"\n [attr.aria-busy]=\"isLoading\"\n [placeholder]=\"\n (messages.length === 0 ? config.placeholder : config.placeholderAfterFirstMessage)\n | translate\n \"\n [(ngModel)]=\"prompt\"\n (keydown.enter)=\"sendMessage($event)\"\n [disabled]=\"isLoading || disabled\"\n c8y-textarea-autoresize\n ></textarea>\n <div class=\"chat-input-group-btn\">\n @if (!isLoading) {\n <button\n class=\"btn btn-dot\"\n [attr.title]=\"config.sendButtonText | translate\"\n [attr.aria-label]=\"config.sendButtonText | translate\"\n type=\"button\"\n (click)=\"sendMessage($event)\"\n [disabled]=\"disabled || prompt.trim().length === 0\"\n >\n <i [c8yIcon]=\"config.userInterfaceIcons?.send || 'arrow-circle-right'\"></i>\n </button>\n } @else {\n <button\n class=\"btn btn-dot btn-dot--danger\"\n [attr.title]=\"config.cancelButtonText | translate\"\n [attr.aria-label]=\"config.cancelButtonText | translate\"\n type=\"button\"\n (click)=\"cancel()\"\n >\n <i [c8yIcon]=\"config.userInterfaceIcons?.cancel || 'stop'\"></i>\n </button>\n }\n </div>\n </div>\n @if (config.disclaimerText) {\n <div\n class=\"text-muted m-b-8 text-10 p-l-16\"\n id=\"chat-disclaimer-{{ componentId }}\"\n role=\"note\"\n >\n {{ config.disclaimerText | translate }}\n </div>\n }\n </div>\n </div>\n</div>\n" }]
236
237
  }], propDecorators: { isLoading: [{
237
238
  type: Input
238
239
  }], disabled: [{