@copilotkitnext/angular 0.0.28 → 0.0.30

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 (65) hide show
  1. package/coverage/clover.xml +2008 -0
  2. package/coverage/coverage-final.json +44 -0
  3. package/coverage/lcov-report/base.css +224 -0
  4. package/coverage/lcov-report/block-navigation.js +87 -0
  5. package/coverage/lcov-report/favicon.png +0 -0
  6. package/coverage/lcov-report/index.html +251 -0
  7. package/coverage/lcov-report/prettify.css +1 -0
  8. package/coverage/lcov-report/prettify.js +2 -0
  9. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  10. package/coverage/lcov-report/sorter.js +210 -0
  11. package/coverage/lcov-report/src/components/chat/copilot-chat-assistant-message-buttons.ts.html +1039 -0
  12. package/coverage/lcov-report/src/components/chat/copilot-chat-assistant-message-renderer.ts.html +1411 -0
  13. package/coverage/lcov-report/src/components/chat/copilot-chat-assistant-message-toolbar.ts.html +145 -0
  14. package/coverage/lcov-report/src/components/chat/copilot-chat-assistant-message.ts.html +1486 -0
  15. package/coverage/lcov-report/src/components/chat/copilot-chat-audio-recorder.ts.html +811 -0
  16. package/coverage/lcov-report/src/components/chat/copilot-chat-buttons.ts.html +1009 -0
  17. package/coverage/lcov-report/src/components/chat/copilot-chat-input.ts.html +1519 -0
  18. package/coverage/lcov-report/src/components/chat/copilot-chat-input.types.ts.html +529 -0
  19. package/coverage/lcov-report/src/components/chat/copilot-chat-message-view-cursor.ts.html +196 -0
  20. package/coverage/lcov-report/src/components/chat/copilot-chat-message-view.ts.html +715 -0
  21. package/coverage/lcov-report/src/components/chat/copilot-chat-textarea.ts.html +634 -0
  22. package/coverage/lcov-report/src/components/chat/copilot-chat-tool-calls-view.ts.html +889 -0
  23. package/coverage/lcov-report/src/components/chat/copilot-chat-toolbar.ts.html +175 -0
  24. package/coverage/lcov-report/src/components/chat/copilot-chat-tools-menu.ts.html +625 -0
  25. package/coverage/lcov-report/src/components/chat/copilot-chat-user-message-branch-navigation.ts.html +403 -0
  26. package/coverage/lcov-report/src/components/chat/copilot-chat-user-message-buttons.ts.html +580 -0
  27. package/coverage/lcov-report/src/components/chat/copilot-chat-user-message-renderer.ts.html +181 -0
  28. package/coverage/lcov-report/src/components/chat/copilot-chat-user-message-toolbar.ts.html +184 -0
  29. package/coverage/lcov-report/src/components/chat/copilot-chat-user-message.ts.html +784 -0
  30. package/coverage/lcov-report/src/components/chat/copilot-chat-view-handlers.ts.html +127 -0
  31. package/coverage/lcov-report/src/components/chat/index.html +401 -0
  32. package/coverage/lcov-report/src/core/chat-configuration/chat-configuration.providers.ts.html +304 -0
  33. package/coverage/lcov-report/src/core/chat-configuration/chat-configuration.ts.html +580 -0
  34. package/coverage/lcov-report/src/core/chat-configuration/chat-configuration.types.ts.html +256 -0
  35. package/coverage/lcov-report/src/core/chat-configuration/index.html +146 -0
  36. package/coverage/lcov-report/src/core/copilotkit.providers.ts.html +262 -0
  37. package/coverage/lcov-report/src/core/copilotkit.ts.html +1612 -0
  38. package/coverage/lcov-report/src/core/copilotkit.types.ts.html +478 -0
  39. package/coverage/lcov-report/src/core/index.html +146 -0
  40. package/coverage/lcov-report/src/directives/copilotkit-agent-context.ts.html +499 -0
  41. package/coverage/lcov-report/src/directives/copilotkit-agent.ts.html +742 -0
  42. package/coverage/lcov-report/src/directives/copilotkit-chat-config.ts.html +781 -0
  43. package/coverage/lcov-report/src/directives/copilotkit-config.ts.html +328 -0
  44. package/coverage/lcov-report/src/directives/copilotkit-frontend-tool.ts.html +517 -0
  45. package/coverage/lcov-report/src/directives/copilotkit-human-in-the-loop.ts.html +925 -0
  46. package/coverage/lcov-report/src/directives/index.html +191 -0
  47. package/coverage/lcov-report/src/lib/directives/index.html +116 -0
  48. package/coverage/lcov-report/src/lib/directives/tooltip.ts.html +958 -0
  49. package/coverage/lcov-report/src/lib/index.html +116 -0
  50. package/coverage/lcov-report/src/lib/slots/copilot-slot.ts.html +526 -0
  51. package/coverage/lcov-report/src/lib/slots/index.html +146 -0
  52. package/coverage/lcov-report/src/lib/slots/slot.types.ts.html +274 -0
  53. package/coverage/lcov-report/src/lib/slots/slot.utils.ts.html +985 -0
  54. package/coverage/lcov-report/src/lib/utils.ts.html +112 -0
  55. package/coverage/lcov-report/src/testing/index.html +116 -0
  56. package/coverage/lcov-report/src/testing/testing.utils.ts.html +835 -0
  57. package/coverage/lcov-report/src/utils/agent.utils.ts.html +850 -0
  58. package/coverage/lcov-report/src/utils/chat-config.utils.ts.html +745 -0
  59. package/coverage/lcov-report/src/utils/frontend-tool.utils.ts.html +871 -0
  60. package/coverage/lcov-report/src/utils/human-in-the-loop.utils.ts.html +1150 -0
  61. package/coverage/lcov-report/src/utils/index.html +161 -0
  62. package/coverage/lcov-report/test-mocks/index.html +116 -0
  63. package/coverage/lcov-report/test-mocks/marked.ts.html +127 -0
  64. package/coverage/lcov.info +4216 -0
  65. package/package.json +3 -3
@@ -0,0 +1,715 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/components/chat/copilot-chat-message-view.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../../../prettify.css" />
9
+ <link rel="stylesheet" href="../../../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../../../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../../../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../../../index.html">All files</a> / <a href="index.html">src/components/chat</a> copilot-chat-message-view.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">87.27% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>48/55</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">60% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>9/15</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">58.82% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>10/17</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">87.5% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>42/48</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a>
196
+ <a name='L131'></a><a href='#L131'>131</a>
197
+ <a name='L132'></a><a href='#L132'>132</a>
198
+ <a name='L133'></a><a href='#L133'>133</a>
199
+ <a name='L134'></a><a href='#L134'>134</a>
200
+ <a name='L135'></a><a href='#L135'>135</a>
201
+ <a name='L136'></a><a href='#L136'>136</a>
202
+ <a name='L137'></a><a href='#L137'>137</a>
203
+ <a name='L138'></a><a href='#L138'>138</a>
204
+ <a name='L139'></a><a href='#L139'>139</a>
205
+ <a name='L140'></a><a href='#L140'>140</a>
206
+ <a name='L141'></a><a href='#L141'>141</a>
207
+ <a name='L142'></a><a href='#L142'>142</a>
208
+ <a name='L143'></a><a href='#L143'>143</a>
209
+ <a name='L144'></a><a href='#L144'>144</a>
210
+ <a name='L145'></a><a href='#L145'>145</a>
211
+ <a name='L146'></a><a href='#L146'>146</a>
212
+ <a name='L147'></a><a href='#L147'>147</a>
213
+ <a name='L148'></a><a href='#L148'>148</a>
214
+ <a name='L149'></a><a href='#L149'>149</a>
215
+ <a name='L150'></a><a href='#L150'>150</a>
216
+ <a name='L151'></a><a href='#L151'>151</a>
217
+ <a name='L152'></a><a href='#L152'>152</a>
218
+ <a name='L153'></a><a href='#L153'>153</a>
219
+ <a name='L154'></a><a href='#L154'>154</a>
220
+ <a name='L155'></a><a href='#L155'>155</a>
221
+ <a name='L156'></a><a href='#L156'>156</a>
222
+ <a name='L157'></a><a href='#L157'>157</a>
223
+ <a name='L158'></a><a href='#L158'>158</a>
224
+ <a name='L159'></a><a href='#L159'>159</a>
225
+ <a name='L160'></a><a href='#L160'>160</a>
226
+ <a name='L161'></a><a href='#L161'>161</a>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a>
237
+ <a name='L172'></a><a href='#L172'>172</a>
238
+ <a name='L173'></a><a href='#L173'>173</a>
239
+ <a name='L174'></a><a href='#L174'>174</a>
240
+ <a name='L175'></a><a href='#L175'>175</a>
241
+ <a name='L176'></a><a href='#L176'>176</a>
242
+ <a name='L177'></a><a href='#L177'>177</a>
243
+ <a name='L178'></a><a href='#L178'>178</a>
244
+ <a name='L179'></a><a href='#L179'>179</a>
245
+ <a name='L180'></a><a href='#L180'>180</a>
246
+ <a name='L181'></a><a href='#L181'>181</a>
247
+ <a name='L182'></a><a href='#L182'>182</a>
248
+ <a name='L183'></a><a href='#L183'>183</a>
249
+ <a name='L184'></a><a href='#L184'>184</a>
250
+ <a name='L185'></a><a href='#L185'>185</a>
251
+ <a name='L186'></a><a href='#L186'>186</a>
252
+ <a name='L187'></a><a href='#L187'>187</a>
253
+ <a name='L188'></a><a href='#L188'>188</a>
254
+ <a name='L189'></a><a href='#L189'>189</a>
255
+ <a name='L190'></a><a href='#L190'>190</a>
256
+ <a name='L191'></a><a href='#L191'>191</a>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a>
275
+ <a name='L210'></a><a href='#L210'>210</a>
276
+ <a name='L211'></a><a href='#L211'>211</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
277
+ <span class="cline-any cline-neutral">&nbsp;</span>
278
+ <span class="cline-any cline-neutral">&nbsp;</span>
279
+ <span class="cline-any cline-neutral">&nbsp;</span>
280
+ <span class="cline-any cline-neutral">&nbsp;</span>
281
+ <span class="cline-any cline-neutral">&nbsp;</span>
282
+ <span class="cline-any cline-neutral">&nbsp;</span>
283
+ <span class="cline-any cline-neutral">&nbsp;</span>
284
+ <span class="cline-any cline-neutral">&nbsp;</span>
285
+ <span class="cline-any cline-neutral">&nbsp;</span>
286
+ <span class="cline-any cline-neutral">&nbsp;</span>
287
+ <span class="cline-any cline-yes">1x</span>
288
+ <span class="cline-any cline-yes">1x</span>
289
+ <span class="cline-any cline-neutral">&nbsp;</span>
290
+ <span class="cline-any cline-yes">1x</span>
291
+ <span class="cline-any cline-yes">1x</span>
292
+ <span class="cline-any cline-yes">1x</span>
293
+ <span class="cline-any cline-yes">1x</span>
294
+ <span class="cline-any cline-neutral">&nbsp;</span>
295
+ <span class="cline-any cline-neutral">&nbsp;</span>
296
+ <span class="cline-any cline-neutral">&nbsp;</span>
297
+ <span class="cline-any cline-neutral">&nbsp;</span>
298
+ <span class="cline-any cline-neutral">&nbsp;</span>
299
+ <span class="cline-any cline-neutral">&nbsp;</span>
300
+ <span class="cline-any cline-neutral">&nbsp;</span>
301
+ <span class="cline-any cline-neutral">&nbsp;</span>
302
+ <span class="cline-any cline-neutral">&nbsp;</span>
303
+ <span class="cline-any cline-neutral">&nbsp;</span>
304
+ <span class="cline-any cline-neutral">&nbsp;</span>
305
+ <span class="cline-any cline-neutral">&nbsp;</span>
306
+ <span class="cline-any cline-neutral">&nbsp;</span>
307
+ <span class="cline-any cline-neutral">&nbsp;</span>
308
+ <span class="cline-any cline-neutral">&nbsp;</span>
309
+ <span class="cline-any cline-neutral">&nbsp;</span>
310
+ <span class="cline-any cline-neutral">&nbsp;</span>
311
+ <span class="cline-any cline-neutral">&nbsp;</span>
312
+ <span class="cline-any cline-neutral">&nbsp;</span>
313
+ <span class="cline-any cline-neutral">&nbsp;</span>
314
+ <span class="cline-any cline-neutral">&nbsp;</span>
315
+ <span class="cline-any cline-neutral">&nbsp;</span>
316
+ <span class="cline-any cline-neutral">&nbsp;</span>
317
+ <span class="cline-any cline-neutral">&nbsp;</span>
318
+ <span class="cline-any cline-neutral">&nbsp;</span>
319
+ <span class="cline-any cline-neutral">&nbsp;</span>
320
+ <span class="cline-any cline-neutral">&nbsp;</span>
321
+ <span class="cline-any cline-neutral">&nbsp;</span>
322
+ <span class="cline-any cline-neutral">&nbsp;</span>
323
+ <span class="cline-any cline-neutral">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span>
325
+ <span class="cline-any cline-neutral">&nbsp;</span>
326
+ <span class="cline-any cline-neutral">&nbsp;</span>
327
+ <span class="cline-any cline-neutral">&nbsp;</span>
328
+ <span class="cline-any cline-neutral">&nbsp;</span>
329
+ <span class="cline-any cline-neutral">&nbsp;</span>
330
+ <span class="cline-any cline-neutral">&nbsp;</span>
331
+ <span class="cline-any cline-neutral">&nbsp;</span>
332
+ <span class="cline-any cline-neutral">&nbsp;</span>
333
+ <span class="cline-any cline-neutral">&nbsp;</span>
334
+ <span class="cline-any cline-neutral">&nbsp;</span>
335
+ <span class="cline-any cline-neutral">&nbsp;</span>
336
+ <span class="cline-any cline-neutral">&nbsp;</span>
337
+ <span class="cline-any cline-neutral">&nbsp;</span>
338
+ <span class="cline-any cline-neutral">&nbsp;</span>
339
+ <span class="cline-any cline-neutral">&nbsp;</span>
340
+ <span class="cline-any cline-neutral">&nbsp;</span>
341
+ <span class="cline-any cline-neutral">&nbsp;</span>
342
+ <span class="cline-any cline-neutral">&nbsp;</span>
343
+ <span class="cline-any cline-neutral">&nbsp;</span>
344
+ <span class="cline-any cline-neutral">&nbsp;</span>
345
+ <span class="cline-any cline-neutral">&nbsp;</span>
346
+ <span class="cline-any cline-neutral">&nbsp;</span>
347
+ <span class="cline-any cline-neutral">&nbsp;</span>
348
+ <span class="cline-any cline-neutral">&nbsp;</span>
349
+ <span class="cline-any cline-neutral">&nbsp;</span>
350
+ <span class="cline-any cline-neutral">&nbsp;</span>
351
+ <span class="cline-any cline-neutral">&nbsp;</span>
352
+ <span class="cline-any cline-neutral">&nbsp;</span>
353
+ <span class="cline-any cline-neutral">&nbsp;</span>
354
+ <span class="cline-any cline-neutral">&nbsp;</span>
355
+ <span class="cline-any cline-neutral">&nbsp;</span>
356
+ <span class="cline-any cline-neutral">&nbsp;</span>
357
+ <span class="cline-any cline-neutral">&nbsp;</span>
358
+ <span class="cline-any cline-neutral">&nbsp;</span>
359
+ <span class="cline-any cline-neutral">&nbsp;</span>
360
+ <span class="cline-any cline-neutral">&nbsp;</span>
361
+ <span class="cline-any cline-neutral">&nbsp;</span>
362
+ <span class="cline-any cline-neutral">&nbsp;</span>
363
+ <span class="cline-any cline-neutral">&nbsp;</span>
364
+ <span class="cline-any cline-neutral">&nbsp;</span>
365
+ <span class="cline-any cline-neutral">&nbsp;</span>
366
+ <span class="cline-any cline-neutral">&nbsp;</span>
367
+ <span class="cline-any cline-neutral">&nbsp;</span>
368
+ <span class="cline-any cline-neutral">&nbsp;</span>
369
+ <span class="cline-any cline-neutral">&nbsp;</span>
370
+ <span class="cline-any cline-neutral">&nbsp;</span>
371
+ <span class="cline-any cline-neutral">&nbsp;</span>
372
+ <span class="cline-any cline-neutral">&nbsp;</span>
373
+ <span class="cline-any cline-neutral">&nbsp;</span>
374
+ <span class="cline-any cline-neutral">&nbsp;</span>
375
+ <span class="cline-any cline-neutral">&nbsp;</span>
376
+ <span class="cline-any cline-yes">1x</span>
377
+ <span class="cline-any cline-neutral">&nbsp;</span>
378
+ <span class="cline-any cline-yes">26x</span>
379
+ <span class="cline-any cline-yes">26x</span>
380
+ <span class="cline-any cline-yes">26x</span>
381
+ <span class="cline-any cline-yes">26x</span>
382
+ <span class="cline-any cline-neutral">&nbsp;</span>
383
+ <span class="cline-any cline-neutral">&nbsp;</span>
384
+ <span class="cline-any cline-neutral">&nbsp;</span>
385
+ <span class="cline-any cline-neutral">&nbsp;</span>
386
+ <span class="cline-any cline-yes">26x</span>
387
+ <span class="cline-any cline-yes">26x</span>
388
+ <span class="cline-any cline-yes">26x</span>
389
+ <span class="cline-any cline-neutral">&nbsp;</span>
390
+ <span class="cline-any cline-neutral">&nbsp;</span>
391
+ <span class="cline-any cline-yes">26x</span>
392
+ <span class="cline-any cline-yes">26x</span>
393
+ <span class="cline-any cline-yes">26x</span>
394
+ <span class="cline-any cline-neutral">&nbsp;</span>
395
+ <span class="cline-any cline-neutral">&nbsp;</span>
396
+ <span class="cline-any cline-neutral">&nbsp;</span>
397
+ <span class="cline-any cline-yes">26x</span>
398
+ <span class="cline-any cline-yes">26x</span>
399
+ <span class="cline-any cline-yes">26x</span>
400
+ <span class="cline-any cline-neutral">&nbsp;</span>
401
+ <span class="cline-any cline-neutral">&nbsp;</span>
402
+ <span class="cline-any cline-neutral">&nbsp;</span>
403
+ <span class="cline-any cline-neutral">&nbsp;</span>
404
+ <span class="cline-any cline-neutral">&nbsp;</span>
405
+ <span class="cline-any cline-yes">26x</span>
406
+ <span class="cline-any cline-yes">26x</span>
407
+ <span class="cline-any cline-yes">26x</span>
408
+ <span class="cline-any cline-yes">26x</span>
409
+ <span class="cline-any cline-yes">26x</span>
410
+ <span class="cline-any cline-yes">26x</span>
411
+ <span class="cline-any cline-neutral">&nbsp;</span>
412
+ <span class="cline-any cline-neutral">&nbsp;</span>
413
+ <span class="cline-any cline-yes">26x</span>
414
+ <span class="cline-any cline-yes">26x</span>
415
+ <span class="cline-any cline-yes">26x</span>
416
+ <span class="cline-any cline-neutral">&nbsp;</span>
417
+ <span class="cline-any cline-neutral">&nbsp;</span>
418
+ <span class="cline-any cline-yes">26x</span>
419
+ <span class="cline-any cline-yes">26x</span>
420
+ <span class="cline-any cline-yes">26x</span>
421
+ <span class="cline-any cline-neutral">&nbsp;</span>
422
+ <span class="cline-any cline-neutral">&nbsp;</span>
423
+ <span class="cline-any cline-yes">26x</span>
424
+ <span class="cline-any cline-neutral">&nbsp;</span>
425
+ <span class="cline-any cline-neutral">&nbsp;</span>
426
+ <span class="cline-any cline-neutral">&nbsp;</span>
427
+ <span class="cline-any cline-yes">26x</span>
428
+ <span class="cline-any cline-neutral">&nbsp;</span>
429
+ <span class="cline-any cline-neutral">&nbsp;</span>
430
+ <span class="cline-any cline-neutral">&nbsp;</span>
431
+ <span class="cline-any cline-yes">2x</span>
432
+ <span class="cline-any cline-neutral">&nbsp;</span>
433
+ <span class="cline-any cline-neutral">&nbsp;</span>
434
+ <span class="cline-any cline-neutral">&nbsp;</span>
435
+ <span class="cline-any cline-yes">26x</span>
436
+ <span class="cline-any cline-no">&nbsp;</span>
437
+ <span class="cline-any cline-neutral">&nbsp;</span>
438
+ <span class="cline-any cline-neutral">&nbsp;</span>
439
+ <span class="cline-any cline-yes">26x</span>
440
+ <span class="cline-any cline-no">&nbsp;</span>
441
+ <span class="cline-any cline-neutral">&nbsp;</span>
442
+ <span class="cline-any cline-neutral">&nbsp;</span>
443
+ <span class="cline-any cline-yes">26x</span>
444
+ <span class="cline-any cline-neutral">&nbsp;</span>
445
+ <span class="cline-any cline-neutral">&nbsp;</span>
446
+ <span class="cline-any cline-neutral">&nbsp;</span>
447
+ <span class="cline-any cline-yes">1x</span>
448
+ <span class="cline-any cline-neutral">&nbsp;</span>
449
+ <span class="cline-any cline-neutral">&nbsp;</span>
450
+ <span class="cline-any cline-neutral">&nbsp;</span>
451
+ <span class="cline-any cline-neutral">&nbsp;</span>
452
+ <span class="cline-any cline-neutral">&nbsp;</span>
453
+ <span class="cline-any cline-neutral">&nbsp;</span>
454
+ <span class="cline-any cline-neutral">&nbsp;</span>
455
+ <span class="cline-any cline-neutral">&nbsp;</span>
456
+ <span class="cline-any cline-yes">1x</span>
457
+ <span class="cline-any cline-neutral">&nbsp;</span>
458
+ <span class="cline-any cline-neutral">&nbsp;</span>
459
+ <span class="cline-any cline-neutral">&nbsp;</span>
460
+ <span class="cline-any cline-neutral">&nbsp;</span>
461
+ <span class="cline-any cline-neutral">&nbsp;</span>
462
+ <span class="cline-any cline-neutral">&nbsp;</span>
463
+ <span class="cline-any cline-neutral">&nbsp;</span>
464
+ <span class="cline-any cline-yes">123x</span>
465
+ <span class="cline-any cline-neutral">&nbsp;</span>
466
+ <span class="cline-any cline-neutral">&nbsp;</span>
467
+ <span class="cline-any cline-neutral">&nbsp;</span>
468
+ <span class="cline-any cline-neutral">&nbsp;</span>
469
+ <span class="cline-any cline-neutral">&nbsp;</span>
470
+ <span class="cline-any cline-neutral">&nbsp;</span>
471
+ <span class="cline-any cline-no">&nbsp;</span>
472
+ <span class="cline-any cline-neutral">&nbsp;</span>
473
+ <span class="cline-any cline-neutral">&nbsp;</span>
474
+ <span class="cline-any cline-neutral">&nbsp;</span>
475
+ <span class="cline-any cline-no">&nbsp;</span>
476
+ <span class="cline-any cline-neutral">&nbsp;</span>
477
+ <span class="cline-any cline-neutral">&nbsp;</span>
478
+ <span class="cline-any cline-neutral">&nbsp;</span>
479
+ <span class="cline-any cline-no">&nbsp;</span>
480
+ <span class="cline-any cline-neutral">&nbsp;</span>
481
+ <span class="cline-any cline-neutral">&nbsp;</span>
482
+ <span class="cline-any cline-neutral">&nbsp;</span>
483
+ <span class="cline-any cline-no">&nbsp;</span>
484
+ <span class="cline-any cline-neutral">&nbsp;</span>
485
+ <span class="cline-any cline-neutral">&nbsp;</span>
486
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import {
487
+ Component,
488
+ input,
489
+ output,
490
+ ContentChild,
491
+ TemplateRef,
492
+ Type,
493
+ ChangeDetectionStrategy,
494
+ ViewEncapsulation,
495
+ computed
496
+ } from '@angular/core';
497
+ import { CommonModule } from '@angular/common';
498
+ import { CopilotSlot } from '../../lib/slots/copilot-slot';
499
+ import type { Message } from '@ag-ui/core';
500
+ import { CopilotChatAssistantMessage } from './copilot-chat-assistant-message';
501
+ import { CopilotChatUserMessage } from './copilot-chat-user-message';
502
+ import { CopilotChatMessageViewCursor } from './copilot-chat-message-view-cursor';
503
+ import { cn } from '../../lib/utils';
504
+ &nbsp;
505
+ /**
506
+ * CopilotChatMessageView component - Angular port of the React component.
507
+ * Renders a list of chat messages with support for custom slots and layouts.
508
+ * DOM structure and Tailwind classes match the React implementation exactly.
509
+ */
510
+ @Component({
511
+ standalone: true,
512
+ selector: 'copilot-chat-message-view',
513
+ imports: [
514
+ CommonModule,
515
+ CopilotSlot,
516
+ CopilotChatAssistantMessage,
517
+ CopilotChatUserMessage,
518
+ CopilotChatMessageViewCursor
519
+ ],
520
+ changeDetection: ChangeDetectionStrategy.OnPush,
521
+ encapsulation: ViewEncapsulation.None,
522
+ template: `
523
+ &lt;!-- Custom layout template support (render prop pattern) --&gt;
524
+ @if (customLayoutTemplate) {
525
+ &lt;ng-container [ngTemplateOutlet]="customLayoutTemplate" [ngTemplateOutletContext]="layoutContext()"&gt;&lt;/ng-container&gt;
526
+ } @else {
527
+ &lt;!-- Default layout - exact React DOM structure: div with "flex flex-col" classes --&gt;
528
+ &lt;div [class]="computedClass()"&gt;
529
+ &lt;!-- Message iteration - simplified without tool calls --&gt;
530
+ @for (message of messagesValue(); track trackByMessageId($index, message)) {
531
+ @if (message &amp;&amp; message.role === 'assistant') {
532
+ &lt;!-- Assistant message with slot support --&gt;
533
+ @if (assistantMessageComponent() || assistantMessageTemplate()) {
534
+ &lt;copilot-slot
535
+ [slot]="assistantMessageTemplate() || assistantMessageComponent()"
536
+ [context]="mergeAssistantProps(message)"
537
+ [defaultComponent]="defaultAssistantComponent"&gt;
538
+ &lt;/copilot-slot&gt;
539
+ } @else {
540
+ &lt;copilot-chat-assistant-message
541
+ [message]="message"
542
+ [messages]="messagesValue()"
543
+ [isLoading]="isLoadingValue()"
544
+ [inputClass]="assistantMessageClass()"
545
+ (thumbsUp)="handleAssistantThumbsUp($event)"
546
+ (thumbsDown)="handleAssistantThumbsDown($event)"
547
+ (readAloud)="handleAssistantReadAloud($event)"
548
+ (regenerate)="handleAssistantRegenerate($event)"&gt;
549
+ &lt;/copilot-chat-assistant-message&gt;
550
+ }
551
+ } @else if (message &amp;&amp; message.role === 'user') {
552
+ &lt;!-- User message with slot support --&gt;
553
+ @if (userMessageComponent() || userMessageTemplate()) {
554
+ &lt;copilot-slot
555
+ [slot]="userMessageTemplate() || userMessageComponent()"
556
+ [context]="mergeUserProps(message)"
557
+ [defaultComponent]="defaultUserComponent"&gt;
558
+ &lt;/copilot-slot&gt;
559
+ } @else {
560
+ &lt;copilot-chat-user-message
561
+ [message]="message"
562
+ [inputClass]="userMessageClass()"&gt;
563
+ &lt;/copilot-chat-user-message&gt;
564
+ }
565
+ }
566
+ }
567
+
568
+ &lt;!-- Cursor - exactly like React's conditional rendering --&gt;
569
+ @if (showCursorValue()) {
570
+ @if (cursorComponent() || cursorTemplate()) {
571
+ &lt;copilot-slot
572
+ [slot]="cursorTemplate() || cursorComponent()"
573
+ [context]="{ inputClass: cursorClass() }"
574
+ [defaultComponent]="defaultCursorComponent"&gt;
575
+ &lt;/copilot-slot&gt;
576
+ } @else {
577
+ &lt;copilot-chat-message-view-cursor
578
+ [inputClass]="cursorClass()"&gt;
579
+ &lt;/copilot-chat-message-view-cursor&gt;
580
+ }
581
+ }
582
+ &lt;/div&gt;
583
+ }
584
+ `
585
+ })
586
+ export class CopilotChatMessageView {
587
+ // Core inputs matching React props
588
+ messages = input&lt;Message[]&gt;([]);
589
+ showCursor = input&lt;boolean&gt;(false);
590
+ isLoading = input&lt;boolean&gt;(false);
591
+ inputClass = input&lt;string | undefined&gt;();
592
+
593
+ // Handler availability handled via DI service
594
+
595
+ // Assistant message slot inputs
596
+ assistantMessageComponent = input&lt;Type&lt;any&gt; | undefined&gt;();
597
+ assistantMessageTemplate = input&lt;TemplateRef&lt;any&gt; | undefined&gt;();
598
+ assistantMessageClass = input&lt;string | undefined&gt;();
599
+
600
+ // User message slot inputs
601
+ userMessageComponent = input&lt;Type&lt;any&gt; | undefined&gt;();
602
+ userMessageTemplate = input&lt;TemplateRef&lt;any&gt; | undefined&gt;();
603
+ userMessageClass = input&lt;string | undefined&gt;();
604
+
605
+
606
+ // Cursor slot inputs
607
+ cursorComponent = input&lt;Type&lt;any&gt; | undefined&gt;();
608
+ cursorTemplate = input&lt;TemplateRef&lt;any&gt; | undefined&gt;();
609
+ cursorClass = input&lt;string | undefined&gt;();
610
+
611
+ // Custom layout template (render prop pattern)
612
+ @ContentChild('customLayout') customLayoutTemplate?: TemplateRef&lt;any&gt;;
613
+
614
+ // Output events (bubbled from child components)
615
+ assistantMessageThumbsUp = output&lt;{ message: Message }&gt;();
616
+ assistantMessageThumbsDown = output&lt;{ message: Message }&gt;();
617
+ assistantMessageReadAloud = output&lt;{ message: Message }&gt;();
618
+ assistantMessageRegenerate = output&lt;{ message: Message }&gt;();
619
+ userMessageCopy = output&lt;{ message: Message }&gt;();
620
+ userMessageEdit = output&lt;{ message: Message }&gt;();
621
+
622
+ // Default components for slots
623
+ protected readonly defaultAssistantComponent = CopilotChatAssistantMessage;
624
+ protected readonly defaultUserComponent = CopilotChatUserMessage;
625
+ protected readonly defaultCursorComponent = CopilotChatMessageViewCursor;
626
+
627
+ // Derived values from inputs
628
+ protected messagesValue = computed(() =&gt; this.messages());
629
+ protected showCursorValue = computed(() =&gt; this.showCursor());
630
+ protected isLoadingValue = computed(() =&gt; this.isLoading());
631
+
632
+ // Computed class matching React: twMerge("flex flex-col", className)
633
+ computedClass = computed(() =&gt; cn('flex flex-col', this.inputClass()));
634
+
635
+
636
+ // Layout context for custom templates (render prop pattern)
637
+ layoutContext = computed(() =&gt; ({
638
+ isLoading: this.isLoadingValue(),
639
+ messages: this.messagesValue(),
640
+ showCursor: this.showCursorValue(),
641
+ messageElements: this.messagesValue().filter(m =&gt; m &amp;&amp; (m.role === 'assistant' || m.role === 'user'))
642
+ }));
643
+
644
+ // Slot resolution computed signals
645
+ assistantMessageSlot = computed(<span class="fstat-no" title="function not covered" >() =</span>&gt;
646
+ <span class="cstat-no" title="statement not covered" > this.assistantMessageComponent() || this.assistantMessageClass()</span>
647
+ );
648
+
649
+ userMessageSlot = computed(<span class="fstat-no" title="function not covered" >() =</span>&gt;
650
+ <span class="cstat-no" title="statement not covered" > this.userMessageComponent() || this.userMessageClass()</span>
651
+ );
652
+
653
+ cursorSlot = computed(<span class="fstat-no" title="function not covered" >() =</span>&gt; <span class="cstat-no" title="statement not covered" >this.cursorComponent() || this.cursorClass())</span>;
654
+
655
+ // Props merging helpers
656
+ mergeAssistantProps(message: Message) {
657
+ return {
658
+ message,
659
+ messages: this.messagesValue(),
660
+ isLoading: this.isLoadingValue(),
661
+ inputClass: this.assistantMessageClass()
662
+ };
663
+ }
664
+
665
+ mergeUserProps(message: Message) {
666
+ return {
667
+ message,
668
+ inputClass: this.userMessageClass()
669
+ };
670
+ }
671
+
672
+ // TrackBy function for performance optimization
673
+ trackByMessageId(index: number, message: Message): string {
674
+ return message?.id || `index-${index}`;
675
+ }
676
+
677
+ constructor() {}
678
+
679
+ // Event handlers - just pass them through
680
+ <span class="fstat-no" title="function not covered" > handleAssistantThumbsUp(</span>event: { message: Message }): void {
681
+ <span class="cstat-no" title="statement not covered" > this.assistantMessageThumbsUp.emit(event);</span>
682
+ }
683
+
684
+ <span class="fstat-no" title="function not covered" > handleAssistantThumbsDown(</span>event: { message: Message }): void {
685
+ <span class="cstat-no" title="statement not covered" > this.assistantMessageThumbsDown.emit(event);</span>
686
+ }
687
+
688
+ <span class="fstat-no" title="function not covered" > handleAssistantReadAloud(</span>event: { message: Message }): void {
689
+ <span class="cstat-no" title="statement not covered" > this.assistantMessageReadAloud.emit(event);</span>
690
+ }
691
+
692
+ <span class="fstat-no" title="function not covered" > handleAssistantRegenerate(</span>event: { message: Message }): void {
693
+ <span class="cstat-no" title="statement not covered" > this.assistantMessageRegenerate.emit(event);</span>
694
+ }
695
+ }
696
+ &nbsp;</pre></td></tr></table></pre>
697
+
698
+ <div class='push'></div><!-- for sticky footer -->
699
+ </div><!-- /wrapper -->
700
+ <div class='footer quiet pad2 space-top1 center small'>
701
+ Code coverage generated by
702
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
703
+ at 2025-09-15T01:22:45.642Z
704
+ </div>
705
+ <script src="../../../prettify.js"></script>
706
+ <script>
707
+ window.onload = function () {
708
+ prettyPrint();
709
+ };
710
+ </script>
711
+ <script src="../../../sorter.js"></script>
712
+ <script src="../../../block-navigation.js"></script>
713
+ </body>
714
+ </html>
715
+