claude-flow-novice 2.15.6 → 2.15.7

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 (113) hide show
  1. package/.claude/skills/cfn-loop-orchestration/helpers/gate-check.sh +39 -577
  2. package/.claude/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +49 -270
  3. package/.claude/skills/cfn-loop-orchestration/src/helpers/consensus.ts +87 -0
  4. package/.claude/skills/cfn-loop-orchestration/src/helpers/gate-check.ts +115 -0
  5. package/.claude/skills/cfn-loop-orchestration/src/helpers/parse-test-results.ts +372 -0
  6. package/.claude/skills/cfn-loop-orchestration/tests/consensus.test.ts +142 -0
  7. package/.claude/skills/cfn-loop-orchestration/tests/deliverable-verifier.test.ts +199 -0
  8. package/.claude/skills/cfn-loop-orchestration/tests/gate-check.test.ts +325 -0
  9. package/.claude/skills/cfn-loop-orchestration/tests/iteration-manager.test.ts +132 -0
  10. package/.claude/skills/cfn-loop-orchestration/tests/parse-test-results.test.ts +382 -0
  11. package/.claude/skills/cfn-loop-orchestration/tests/timeout-calculator.test.ts +118 -0
  12. package/.claude/skills/cfn-redis-coordination/coverage/clover.xml +1447 -0
  13. package/.claude/skills/cfn-redis-coordination/coverage/coverage-final.json +13 -0
  14. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/agent-logger.ts.html +1423 -0
  15. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/agent-recovery.ts.html +1447 -0
  16. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/base.css +224 -0
  17. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/block-navigation.js +87 -0
  18. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/completion-reporter.ts.html +1273 -0
  19. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/context-manager.ts.html +1066 -0
  20. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/favicon.png +0 -0
  21. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/index.html +281 -0
  22. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/mode-detector.ts.html +550 -0
  23. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/prettify.css +1 -0
  24. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/prettify.js +2 -0
  25. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/redis-client.ts.html +2047 -0
  26. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/result-collector.ts.html +1396 -0
  27. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  28. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/sorter.js +210 -0
  29. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/swarm-manager.ts.html +1567 -0
  30. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/task-analyzer.ts.html +1297 -0
  31. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/task-executor.ts.html +1354 -0
  32. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/types.ts.html +790 -0
  33. package/.claude/skills/cfn-redis-coordination/coverage/lcov-report/waiting-coordinator.ts.html +1846 -0
  34. package/.claude/skills/cfn-redis-coordination/coverage/lcov.info +2650 -0
  35. package/.claude/skills/cfn-redis-coordination/dist/task-analyzer.js +1 -1
  36. package/.claude/skills/cfn-redis-coordination/src/task-analyzer.ts +1 -1
  37. package/.claude/skills/cfn-redis-coordination/tests/coordination.test.ts +18 -9
  38. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-frontend-coordinator.md +13 -72
  39. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +5 -65
  40. package/claude-assets/agents/cfn-dev-team/coordinators/consensus-builder.md +465 -508
  41. package/claude-assets/agents/cfn-dev-team/coordinators/handoff-coordinator.md +733 -743
  42. package/claude-assets/agents/cfn-dev-team/coordinators/multi-sprint-coordinator.md +13 -79
  43. package/claude-assets/agents/cfn-dev-team/dev-ops/docker-specialist.md +13 -18
  44. package/claude-assets/agents/cfn-dev-team/dev-ops/kubernetes-specialist.md +13 -18
  45. package/claude-assets/agents/cfn-dev-team/developers/api-gateway-specialist.md +13 -18
  46. package/claude-assets/agents/cfn-dev-team/developers/backend-developer.md +15 -17
  47. package/claude-assets/agents/cfn-dev-team/developers/data/data-engineer.md +15 -17
  48. package/claude-assets/agents/cfn-dev-team/developers/database/database-architect.md +15 -14
  49. package/claude-assets/agents/cfn-dev-team/developers/frontend/mobile-dev.md +15 -17
  50. package/claude-assets/agents/cfn-dev-team/developers/frontend/react-frontend-engineer.md +15 -17
  51. package/claude-assets/agents/cfn-dev-team/developers/frontend/typescript-specialist.md +15 -17
  52. package/claude-assets/agents/cfn-dev-team/developers/frontend/ui-designer.md +23 -30
  53. package/claude-assets/agents/cfn-dev-team/developers/graphql-specialist.md +13 -18
  54. package/claude-assets/agents/cfn-dev-team/developers/rust-developer.md +13 -18
  55. package/claude-assets/agents/cfn-dev-team/reviewers/code-reviewer.md +312 -317
  56. package/claude-assets/agents/cfn-dev-team/reviewers/quality/code-quality-validator.md +23 -20
  57. package/claude-assets/agents/cfn-dev-team/reviewers/quality/perf-analyzer.md +23 -20
  58. package/claude-assets/agents/cfn-dev-team/reviewers/quality/performance-benchmarker.md +23 -20
  59. package/claude-assets/agents/cfn-dev-team/reviewers/quality/security-specialist.md +23 -20
  60. package/claude-assets/agents/cfn-dev-team/testers/api-testing-specialist.md +15 -20
  61. package/claude-assets/agents/cfn-dev-team/testers/chaos-engineering-specialist.md +15 -20
  62. package/claude-assets/agents/cfn-dev-team/testers/contract-tester.md +718 -737
  63. package/claude-assets/agents/cfn-dev-team/testers/integration-tester.md +817 -828
  64. package/claude-assets/agents/cfn-dev-team/testers/interaction-tester.md +15 -20
  65. package/claude-assets/agents/cfn-dev-team/testers/load-testing-specialist.md +8 -9
  66. package/claude-assets/agents/cfn-dev-team/testers/mutation-testing-specialist.md +668 -684
  67. package/claude-assets/agents/cfn-dev-team/testers/playwright-tester.md +15 -20
  68. package/claude-assets/agents/cfn-dev-team/testers/tester.md +248 -253
  69. package/claude-assets/agents/cfn-dev-team/utility/epic-creator.md +13 -18
  70. package/claude-assets/agents/cfn-dev-team/utility/memory-leak-specialist.md +13 -18
  71. package/claude-assets/agents/cfn-dev-team/utility/z-ai-specialist.md +13 -18
  72. package/claude-assets/skills/cfn-loop-orchestration/helpers/gate-check.sh +39 -577
  73. package/claude-assets/skills/cfn-loop-orchestration/helpers/parse-test-results.sh +49 -270
  74. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/gate-check.ts +115 -0
  75. package/claude-assets/skills/cfn-loop-orchestration/src/helpers/parse-test-results.ts +372 -0
  76. package/claude-assets/skills/cfn-loop-orchestration/tests/consensus.test.ts +142 -0
  77. package/claude-assets/skills/cfn-loop-orchestration/tests/deliverable-verifier.test.ts +199 -0
  78. package/claude-assets/skills/cfn-loop-orchestration/tests/gate-check.test.ts +325 -0
  79. package/claude-assets/skills/cfn-loop-orchestration/tests/iteration-manager.test.ts +132 -0
  80. package/claude-assets/skills/cfn-loop-orchestration/tests/parse-test-results.test.ts +382 -0
  81. package/claude-assets/skills/cfn-loop-orchestration/tests/timeout-calculator.test.ts +118 -0
  82. package/claude-assets/skills/cfn-redis-coordination/coverage/clover.xml +1447 -0
  83. package/claude-assets/skills/cfn-redis-coordination/coverage/coverage-final.json +13 -0
  84. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/agent-logger.ts.html +1423 -0
  85. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/agent-recovery.ts.html +1447 -0
  86. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/base.css +224 -0
  87. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/block-navigation.js +87 -0
  88. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/completion-reporter.ts.html +1273 -0
  89. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/context-manager.ts.html +1066 -0
  90. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/favicon.png +0 -0
  91. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/index.html +281 -0
  92. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/mode-detector.ts.html +550 -0
  93. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/prettify.css +1 -0
  94. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/prettify.js +2 -0
  95. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/redis-client.ts.html +2047 -0
  96. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/result-collector.ts.html +1396 -0
  97. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  98. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/sorter.js +210 -0
  99. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/swarm-manager.ts.html +1567 -0
  100. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/task-analyzer.ts.html +1297 -0
  101. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/task-executor.ts.html +1354 -0
  102. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/types.ts.html +790 -0
  103. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov-report/waiting-coordinator.ts.html +1846 -0
  104. package/claude-assets/skills/cfn-redis-coordination/coverage/lcov.info +2650 -0
  105. package/claude-assets/skills/cfn-redis-coordination/dist/task-analyzer.js +1 -1
  106. package/claude-assets/skills/cfn-redis-coordination/src/task-analyzer.ts +1 -1
  107. package/claude-assets/skills/cfn-redis-coordination/tests/coordination.test.ts +18 -9
  108. package/dist/agents/agent-loader.js +165 -146
  109. package/dist/agents/agent-loader.js.map +1 -1
  110. package/dist/cli/config-manager.js +91 -109
  111. package/dist/cli/config-manager.js.map +1 -1
  112. package/package.json +1 -1
  113. package/scripts/clean-agent-profiles.sh +112 -0
@@ -0,0 +1,1396 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for result-collector.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> result-collector.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">22.68% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>27/119</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">13.75% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>11/80</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">41.17% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>7/17</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">20.86% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>24/115</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 low'></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>
277
+ <a name='L212'></a><a href='#L212'>212</a>
278
+ <a name='L213'></a><a href='#L213'>213</a>
279
+ <a name='L214'></a><a href='#L214'>214</a>
280
+ <a name='L215'></a><a href='#L215'>215</a>
281
+ <a name='L216'></a><a href='#L216'>216</a>
282
+ <a name='L217'></a><a href='#L217'>217</a>
283
+ <a name='L218'></a><a href='#L218'>218</a>
284
+ <a name='L219'></a><a href='#L219'>219</a>
285
+ <a name='L220'></a><a href='#L220'>220</a>
286
+ <a name='L221'></a><a href='#L221'>221</a>
287
+ <a name='L222'></a><a href='#L222'>222</a>
288
+ <a name='L223'></a><a href='#L223'>223</a>
289
+ <a name='L224'></a><a href='#L224'>224</a>
290
+ <a name='L225'></a><a href='#L225'>225</a>
291
+ <a name='L226'></a><a href='#L226'>226</a>
292
+ <a name='L227'></a><a href='#L227'>227</a>
293
+ <a name='L228'></a><a href='#L228'>228</a>
294
+ <a name='L229'></a><a href='#L229'>229</a>
295
+ <a name='L230'></a><a href='#L230'>230</a>
296
+ <a name='L231'></a><a href='#L231'>231</a>
297
+ <a name='L232'></a><a href='#L232'>232</a>
298
+ <a name='L233'></a><a href='#L233'>233</a>
299
+ <a name='L234'></a><a href='#L234'>234</a>
300
+ <a name='L235'></a><a href='#L235'>235</a>
301
+ <a name='L236'></a><a href='#L236'>236</a>
302
+ <a name='L237'></a><a href='#L237'>237</a>
303
+ <a name='L238'></a><a href='#L238'>238</a>
304
+ <a name='L239'></a><a href='#L239'>239</a>
305
+ <a name='L240'></a><a href='#L240'>240</a>
306
+ <a name='L241'></a><a href='#L241'>241</a>
307
+ <a name='L242'></a><a href='#L242'>242</a>
308
+ <a name='L243'></a><a href='#L243'>243</a>
309
+ <a name='L244'></a><a href='#L244'>244</a>
310
+ <a name='L245'></a><a href='#L245'>245</a>
311
+ <a name='L246'></a><a href='#L246'>246</a>
312
+ <a name='L247'></a><a href='#L247'>247</a>
313
+ <a name='L248'></a><a href='#L248'>248</a>
314
+ <a name='L249'></a><a href='#L249'>249</a>
315
+ <a name='L250'></a><a href='#L250'>250</a>
316
+ <a name='L251'></a><a href='#L251'>251</a>
317
+ <a name='L252'></a><a href='#L252'>252</a>
318
+ <a name='L253'></a><a href='#L253'>253</a>
319
+ <a name='L254'></a><a href='#L254'>254</a>
320
+ <a name='L255'></a><a href='#L255'>255</a>
321
+ <a name='L256'></a><a href='#L256'>256</a>
322
+ <a name='L257'></a><a href='#L257'>257</a>
323
+ <a name='L258'></a><a href='#L258'>258</a>
324
+ <a name='L259'></a><a href='#L259'>259</a>
325
+ <a name='L260'></a><a href='#L260'>260</a>
326
+ <a name='L261'></a><a href='#L261'>261</a>
327
+ <a name='L262'></a><a href='#L262'>262</a>
328
+ <a name='L263'></a><a href='#L263'>263</a>
329
+ <a name='L264'></a><a href='#L264'>264</a>
330
+ <a name='L265'></a><a href='#L265'>265</a>
331
+ <a name='L266'></a><a href='#L266'>266</a>
332
+ <a name='L267'></a><a href='#L267'>267</a>
333
+ <a name='L268'></a><a href='#L268'>268</a>
334
+ <a name='L269'></a><a href='#L269'>269</a>
335
+ <a name='L270'></a><a href='#L270'>270</a>
336
+ <a name='L271'></a><a href='#L271'>271</a>
337
+ <a name='L272'></a><a href='#L272'>272</a>
338
+ <a name='L273'></a><a href='#L273'>273</a>
339
+ <a name='L274'></a><a href='#L274'>274</a>
340
+ <a name='L275'></a><a href='#L275'>275</a>
341
+ <a name='L276'></a><a href='#L276'>276</a>
342
+ <a name='L277'></a><a href='#L277'>277</a>
343
+ <a name='L278'></a><a href='#L278'>278</a>
344
+ <a name='L279'></a><a href='#L279'>279</a>
345
+ <a name='L280'></a><a href='#L280'>280</a>
346
+ <a name='L281'></a><a href='#L281'>281</a>
347
+ <a name='L282'></a><a href='#L282'>282</a>
348
+ <a name='L283'></a><a href='#L283'>283</a>
349
+ <a name='L284'></a><a href='#L284'>284</a>
350
+ <a name='L285'></a><a href='#L285'>285</a>
351
+ <a name='L286'></a><a href='#L286'>286</a>
352
+ <a name='L287'></a><a href='#L287'>287</a>
353
+ <a name='L288'></a><a href='#L288'>288</a>
354
+ <a name='L289'></a><a href='#L289'>289</a>
355
+ <a name='L290'></a><a href='#L290'>290</a>
356
+ <a name='L291'></a><a href='#L291'>291</a>
357
+ <a name='L292'></a><a href='#L292'>292</a>
358
+ <a name='L293'></a><a href='#L293'>293</a>
359
+ <a name='L294'></a><a href='#L294'>294</a>
360
+ <a name='L295'></a><a href='#L295'>295</a>
361
+ <a name='L296'></a><a href='#L296'>296</a>
362
+ <a name='L297'></a><a href='#L297'>297</a>
363
+ <a name='L298'></a><a href='#L298'>298</a>
364
+ <a name='L299'></a><a href='#L299'>299</a>
365
+ <a name='L300'></a><a href='#L300'>300</a>
366
+ <a name='L301'></a><a href='#L301'>301</a>
367
+ <a name='L302'></a><a href='#L302'>302</a>
368
+ <a name='L303'></a><a href='#L303'>303</a>
369
+ <a name='L304'></a><a href='#L304'>304</a>
370
+ <a name='L305'></a><a href='#L305'>305</a>
371
+ <a name='L306'></a><a href='#L306'>306</a>
372
+ <a name='L307'></a><a href='#L307'>307</a>
373
+ <a name='L308'></a><a href='#L308'>308</a>
374
+ <a name='L309'></a><a href='#L309'>309</a>
375
+ <a name='L310'></a><a href='#L310'>310</a>
376
+ <a name='L311'></a><a href='#L311'>311</a>
377
+ <a name='L312'></a><a href='#L312'>312</a>
378
+ <a name='L313'></a><a href='#L313'>313</a>
379
+ <a name='L314'></a><a href='#L314'>314</a>
380
+ <a name='L315'></a><a href='#L315'>315</a>
381
+ <a name='L316'></a><a href='#L316'>316</a>
382
+ <a name='L317'></a><a href='#L317'>317</a>
383
+ <a name='L318'></a><a href='#L318'>318</a>
384
+ <a name='L319'></a><a href='#L319'>319</a>
385
+ <a name='L320'></a><a href='#L320'>320</a>
386
+ <a name='L321'></a><a href='#L321'>321</a>
387
+ <a name='L322'></a><a href='#L322'>322</a>
388
+ <a name='L323'></a><a href='#L323'>323</a>
389
+ <a name='L324'></a><a href='#L324'>324</a>
390
+ <a name='L325'></a><a href='#L325'>325</a>
391
+ <a name='L326'></a><a href='#L326'>326</a>
392
+ <a name='L327'></a><a href='#L327'>327</a>
393
+ <a name='L328'></a><a href='#L328'>328</a>
394
+ <a name='L329'></a><a href='#L329'>329</a>
395
+ <a name='L330'></a><a href='#L330'>330</a>
396
+ <a name='L331'></a><a href='#L331'>331</a>
397
+ <a name='L332'></a><a href='#L332'>332</a>
398
+ <a name='L333'></a><a href='#L333'>333</a>
399
+ <a name='L334'></a><a href='#L334'>334</a>
400
+ <a name='L335'></a><a href='#L335'>335</a>
401
+ <a name='L336'></a><a href='#L336'>336</a>
402
+ <a name='L337'></a><a href='#L337'>337</a>
403
+ <a name='L338'></a><a href='#L338'>338</a>
404
+ <a name='L339'></a><a href='#L339'>339</a>
405
+ <a name='L340'></a><a href='#L340'>340</a>
406
+ <a name='L341'></a><a href='#L341'>341</a>
407
+ <a name='L342'></a><a href='#L342'>342</a>
408
+ <a name='L343'></a><a href='#L343'>343</a>
409
+ <a name='L344'></a><a href='#L344'>344</a>
410
+ <a name='L345'></a><a href='#L345'>345</a>
411
+ <a name='L346'></a><a href='#L346'>346</a>
412
+ <a name='L347'></a><a href='#L347'>347</a>
413
+ <a name='L348'></a><a href='#L348'>348</a>
414
+ <a name='L349'></a><a href='#L349'>349</a>
415
+ <a name='L350'></a><a href='#L350'>350</a>
416
+ <a name='L351'></a><a href='#L351'>351</a>
417
+ <a name='L352'></a><a href='#L352'>352</a>
418
+ <a name='L353'></a><a href='#L353'>353</a>
419
+ <a name='L354'></a><a href='#L354'>354</a>
420
+ <a name='L355'></a><a href='#L355'>355</a>
421
+ <a name='L356'></a><a href='#L356'>356</a>
422
+ <a name='L357'></a><a href='#L357'>357</a>
423
+ <a name='L358'></a><a href='#L358'>358</a>
424
+ <a name='L359'></a><a href='#L359'>359</a>
425
+ <a name='L360'></a><a href='#L360'>360</a>
426
+ <a name='L361'></a><a href='#L361'>361</a>
427
+ <a name='L362'></a><a href='#L362'>362</a>
428
+ <a name='L363'></a><a href='#L363'>363</a>
429
+ <a name='L364'></a><a href='#L364'>364</a>
430
+ <a name='L365'></a><a href='#L365'>365</a>
431
+ <a name='L366'></a><a href='#L366'>366</a>
432
+ <a name='L367'></a><a href='#L367'>367</a>
433
+ <a name='L368'></a><a href='#L368'>368</a>
434
+ <a name='L369'></a><a href='#L369'>369</a>
435
+ <a name='L370'></a><a href='#L370'>370</a>
436
+ <a name='L371'></a><a href='#L371'>371</a>
437
+ <a name='L372'></a><a href='#L372'>372</a>
438
+ <a name='L373'></a><a href='#L373'>373</a>
439
+ <a name='L374'></a><a href='#L374'>374</a>
440
+ <a name='L375'></a><a href='#L375'>375</a>
441
+ <a name='L376'></a><a href='#L376'>376</a>
442
+ <a name='L377'></a><a href='#L377'>377</a>
443
+ <a name='L378'></a><a href='#L378'>378</a>
444
+ <a name='L379'></a><a href='#L379'>379</a>
445
+ <a name='L380'></a><a href='#L380'>380</a>
446
+ <a name='L381'></a><a href='#L381'>381</a>
447
+ <a name='L382'></a><a href='#L382'>382</a>
448
+ <a name='L383'></a><a href='#L383'>383</a>
449
+ <a name='L384'></a><a href='#L384'>384</a>
450
+ <a name='L385'></a><a href='#L385'>385</a>
451
+ <a name='L386'></a><a href='#L386'>386</a>
452
+ <a name='L387'></a><a href='#L387'>387</a>
453
+ <a name='L388'></a><a href='#L388'>388</a>
454
+ <a name='L389'></a><a href='#L389'>389</a>
455
+ <a name='L390'></a><a href='#L390'>390</a>
456
+ <a name='L391'></a><a href='#L391'>391</a>
457
+ <a name='L392'></a><a href='#L392'>392</a>
458
+ <a name='L393'></a><a href='#L393'>393</a>
459
+ <a name='L394'></a><a href='#L394'>394</a>
460
+ <a name='L395'></a><a href='#L395'>395</a>
461
+ <a name='L396'></a><a href='#L396'>396</a>
462
+ <a name='L397'></a><a href='#L397'>397</a>
463
+ <a name='L398'></a><a href='#L398'>398</a>
464
+ <a name='L399'></a><a href='#L399'>399</a>
465
+ <a name='L400'></a><a href='#L400'>400</a>
466
+ <a name='L401'></a><a href='#L401'>401</a>
467
+ <a name='L402'></a><a href='#L402'>402</a>
468
+ <a name='L403'></a><a href='#L403'>403</a>
469
+ <a name='L404'></a><a href='#L404'>404</a>
470
+ <a name='L405'></a><a href='#L405'>405</a>
471
+ <a name='L406'></a><a href='#L406'>406</a>
472
+ <a name='L407'></a><a href='#L407'>407</a>
473
+ <a name='L408'></a><a href='#L408'>408</a>
474
+ <a name='L409'></a><a href='#L409'>409</a>
475
+ <a name='L410'></a><a href='#L410'>410</a>
476
+ <a name='L411'></a><a href='#L411'>411</a>
477
+ <a name='L412'></a><a href='#L412'>412</a>
478
+ <a name='L413'></a><a href='#L413'>413</a>
479
+ <a name='L414'></a><a href='#L414'>414</a>
480
+ <a name='L415'></a><a href='#L415'>415</a>
481
+ <a name='L416'></a><a href='#L416'>416</a>
482
+ <a name='L417'></a><a href='#L417'>417</a>
483
+ <a name='L418'></a><a href='#L418'>418</a>
484
+ <a name='L419'></a><a href='#L419'>419</a>
485
+ <a name='L420'></a><a href='#L420'>420</a>
486
+ <a name='L421'></a><a href='#L421'>421</a>
487
+ <a name='L422'></a><a href='#L422'>422</a>
488
+ <a name='L423'></a><a href='#L423'>423</a>
489
+ <a name='L424'></a><a href='#L424'>424</a>
490
+ <a name='L425'></a><a href='#L425'>425</a>
491
+ <a name='L426'></a><a href='#L426'>426</a>
492
+ <a name='L427'></a><a href='#L427'>427</a>
493
+ <a name='L428'></a><a href='#L428'>428</a>
494
+ <a name='L429'></a><a href='#L429'>429</a>
495
+ <a name='L430'></a><a href='#L430'>430</a>
496
+ <a name='L431'></a><a href='#L431'>431</a>
497
+ <a name='L432'></a><a href='#L432'>432</a>
498
+ <a name='L433'></a><a href='#L433'>433</a>
499
+ <a name='L434'></a><a href='#L434'>434</a>
500
+ <a name='L435'></a><a href='#L435'>435</a>
501
+ <a name='L436'></a><a href='#L436'>436</a>
502
+ <a name='L437'></a><a href='#L437'>437</a>
503
+ <a name='L438'></a><a href='#L438'>438</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
504
+ <span class="cline-any cline-neutral">&nbsp;</span>
505
+ <span class="cline-any cline-neutral">&nbsp;</span>
506
+ <span class="cline-any cline-neutral">&nbsp;</span>
507
+ <span class="cline-any cline-neutral">&nbsp;</span>
508
+ <span class="cline-any cline-neutral">&nbsp;</span>
509
+ <span class="cline-any cline-neutral">&nbsp;</span>
510
+ <span class="cline-any cline-neutral">&nbsp;</span>
511
+ <span class="cline-any cline-neutral">&nbsp;</span>
512
+ <span class="cline-any cline-neutral">&nbsp;</span>
513
+ <span class="cline-any cline-neutral">&nbsp;</span>
514
+ <span class="cline-any cline-neutral">&nbsp;</span>
515
+ <span class="cline-any cline-neutral">&nbsp;</span>
516
+ <span class="cline-any cline-neutral">&nbsp;</span>
517
+ <span class="cline-any cline-neutral">&nbsp;</span>
518
+ <span class="cline-any cline-neutral">&nbsp;</span>
519
+ <span class="cline-any cline-yes">1x</span>
520
+ <span class="cline-any cline-neutral">&nbsp;</span>
521
+ <span class="cline-any cline-neutral">&nbsp;</span>
522
+ <span class="cline-any cline-neutral">&nbsp;</span>
523
+ <span class="cline-any cline-neutral">&nbsp;</span>
524
+ <span class="cline-any cline-neutral">&nbsp;</span>
525
+ <span class="cline-any cline-neutral">&nbsp;</span>
526
+ <span class="cline-any cline-neutral">&nbsp;</span>
527
+ <span class="cline-any cline-neutral">&nbsp;</span>
528
+ <span class="cline-any cline-neutral">&nbsp;</span>
529
+ <span class="cline-any cline-neutral">&nbsp;</span>
530
+ <span class="cline-any cline-neutral">&nbsp;</span>
531
+ <span class="cline-any cline-neutral">&nbsp;</span>
532
+ <span class="cline-any cline-neutral">&nbsp;</span>
533
+ <span class="cline-any cline-neutral">&nbsp;</span>
534
+ <span class="cline-any cline-neutral">&nbsp;</span>
535
+ <span class="cline-any cline-neutral">&nbsp;</span>
536
+ <span class="cline-any cline-neutral">&nbsp;</span>
537
+ <span class="cline-any cline-neutral">&nbsp;</span>
538
+ <span class="cline-any cline-neutral">&nbsp;</span>
539
+ <span class="cline-any cline-neutral">&nbsp;</span>
540
+ <span class="cline-any cline-neutral">&nbsp;</span>
541
+ <span class="cline-any cline-neutral">&nbsp;</span>
542
+ <span class="cline-any cline-neutral">&nbsp;</span>
543
+ <span class="cline-any cline-neutral">&nbsp;</span>
544
+ <span class="cline-any cline-yes">1x</span>
545
+ <span class="cline-any cline-neutral">&nbsp;</span>
546
+ <span class="cline-any cline-yes">3x</span>
547
+ <span class="cline-any cline-yes">3x</span>
548
+ <span class="cline-any cline-neutral">&nbsp;</span>
549
+ <span class="cline-any cline-neutral">&nbsp;</span>
550
+ <span class="cline-any cline-neutral">&nbsp;</span>
551
+ <span class="cline-any cline-neutral">&nbsp;</span>
552
+ <span class="cline-any cline-neutral">&nbsp;</span>
553
+ <span class="cline-any cline-neutral">&nbsp;</span>
554
+ <span class="cline-any cline-neutral">&nbsp;</span>
555
+ <span class="cline-any cline-neutral">&nbsp;</span>
556
+ <span class="cline-any cline-neutral">&nbsp;</span>
557
+ <span class="cline-any cline-neutral">&nbsp;</span>
558
+ <span class="cline-any cline-neutral">&nbsp;</span>
559
+ <span class="cline-any cline-neutral">&nbsp;</span>
560
+ <span class="cline-any cline-neutral">&nbsp;</span>
561
+ <span class="cline-any cline-neutral">&nbsp;</span>
562
+ <span class="cline-any cline-yes">1x</span>
563
+ <span class="cline-any cline-no">&nbsp;</span>
564
+ <span class="cline-any cline-neutral">&nbsp;</span>
565
+ <span class="cline-any cline-neutral">&nbsp;</span>
566
+ <span class="cline-any cline-neutral">&nbsp;</span>
567
+ <span class="cline-any cline-neutral">&nbsp;</span>
568
+ <span class="cline-any cline-neutral">&nbsp;</span>
569
+ <span class="cline-any cline-yes">1x</span>
570
+ <span class="cline-any cline-no">&nbsp;</span>
571
+ <span class="cline-any cline-neutral">&nbsp;</span>
572
+ <span class="cline-any cline-neutral">&nbsp;</span>
573
+ <span class="cline-any cline-neutral">&nbsp;</span>
574
+ <span class="cline-any cline-neutral">&nbsp;</span>
575
+ <span class="cline-any cline-neutral">&nbsp;</span>
576
+ <span class="cline-any cline-neutral">&nbsp;</span>
577
+ <span class="cline-any cline-yes">1x</span>
578
+ <span class="cline-any cline-yes">2x</span>
579
+ <span class="cline-any cline-no">&nbsp;</span>
580
+ <span class="cline-any cline-neutral">&nbsp;</span>
581
+ <span class="cline-any cline-neutral">&nbsp;</span>
582
+ <span class="cline-any cline-neutral">&nbsp;</span>
583
+ <span class="cline-any cline-neutral">&nbsp;</span>
584
+ <span class="cline-any cline-neutral">&nbsp;</span>
585
+ <span class="cline-any cline-neutral">&nbsp;</span>
586
+ <span class="cline-any cline-neutral">&nbsp;</span>
587
+ <span class="cline-any cline-yes">1x</span>
588
+ <span class="cline-any cline-yes">1x</span>
589
+ <span class="cline-any cline-yes">1x</span>
590
+ <span class="cline-any cline-neutral">&nbsp;</span>
591
+ <span class="cline-any cline-neutral">&nbsp;</span>
592
+ <span class="cline-any cline-neutral">&nbsp;</span>
593
+ <span class="cline-any cline-no">&nbsp;</span>
594
+ <span class="cline-any cline-neutral">&nbsp;</span>
595
+ <span class="cline-any cline-no">&nbsp;</span>
596
+ <span class="cline-any cline-no">&nbsp;</span>
597
+ <span class="cline-any cline-no">&nbsp;</span>
598
+ <span class="cline-any cline-no">&nbsp;</span>
599
+ <span class="cline-any cline-no">&nbsp;</span>
600
+ <span class="cline-any cline-neutral">&nbsp;</span>
601
+ <span class="cline-any cline-neutral">&nbsp;</span>
602
+ <span class="cline-any cline-no">&nbsp;</span>
603
+ <span class="cline-any cline-no">&nbsp;</span>
604
+ <span class="cline-any cline-neutral">&nbsp;</span>
605
+ <span class="cline-any cline-neutral">&nbsp;</span>
606
+ <span class="cline-any cline-no">&nbsp;</span>
607
+ <span class="cline-any cline-no">&nbsp;</span>
608
+ <span class="cline-any cline-neutral">&nbsp;</span>
609
+ <span class="cline-any cline-neutral">&nbsp;</span>
610
+ <span class="cline-any cline-neutral">&nbsp;</span>
611
+ <span class="cline-any cline-neutral">&nbsp;</span>
612
+ <span class="cline-any cline-no">&nbsp;</span>
613
+ <span class="cline-any cline-neutral">&nbsp;</span>
614
+ <span class="cline-any cline-no">&nbsp;</span>
615
+ <span class="cline-any cline-neutral">&nbsp;</span>
616
+ <span class="cline-any cline-neutral">&nbsp;</span>
617
+ <span class="cline-any cline-neutral">&nbsp;</span>
618
+ <span class="cline-any cline-neutral">&nbsp;</span>
619
+ <span class="cline-any cline-neutral">&nbsp;</span>
620
+ <span class="cline-any cline-neutral">&nbsp;</span>
621
+ <span class="cline-any cline-neutral">&nbsp;</span>
622
+ <span class="cline-any cline-no">&nbsp;</span>
623
+ <span class="cline-any cline-no">&nbsp;</span>
624
+ <span class="cline-any cline-neutral">&nbsp;</span>
625
+ <span class="cline-any cline-no">&nbsp;</span>
626
+ <span class="cline-any cline-no">&nbsp;</span>
627
+ <span class="cline-any cline-neutral">&nbsp;</span>
628
+ <span class="cline-any cline-neutral">&nbsp;</span>
629
+ <span class="cline-any cline-neutral">&nbsp;</span>
630
+ <span class="cline-any cline-neutral">&nbsp;</span>
631
+ <span class="cline-any cline-neutral">&nbsp;</span>
632
+ <span class="cline-any cline-neutral">&nbsp;</span>
633
+ <span class="cline-any cline-neutral">&nbsp;</span>
634
+ <span class="cline-any cline-neutral">&nbsp;</span>
635
+ <span class="cline-any cline-neutral">&nbsp;</span>
636
+ <span class="cline-any cline-neutral">&nbsp;</span>
637
+ <span class="cline-any cline-neutral">&nbsp;</span>
638
+ <span class="cline-any cline-neutral">&nbsp;</span>
639
+ <span class="cline-any cline-neutral">&nbsp;</span>
640
+ <span class="cline-any cline-neutral">&nbsp;</span>
641
+ <span class="cline-any cline-neutral">&nbsp;</span>
642
+ <span class="cline-any cline-neutral">&nbsp;</span>
643
+ <span class="cline-any cline-neutral">&nbsp;</span>
644
+ <span class="cline-any cline-neutral">&nbsp;</span>
645
+ <span class="cline-any cline-no">&nbsp;</span>
646
+ <span class="cline-any cline-no">&nbsp;</span>
647
+ <span class="cline-any cline-neutral">&nbsp;</span>
648
+ <span class="cline-any cline-neutral">&nbsp;</span>
649
+ <span class="cline-any cline-neutral">&nbsp;</span>
650
+ <span class="cline-any cline-neutral">&nbsp;</span>
651
+ <span class="cline-any cline-neutral">&nbsp;</span>
652
+ <span class="cline-any cline-no">&nbsp;</span>
653
+ <span class="cline-any cline-no">&nbsp;</span>
654
+ <span class="cline-any cline-neutral">&nbsp;</span>
655
+ <span class="cline-any cline-neutral">&nbsp;</span>
656
+ <span class="cline-any cline-neutral">&nbsp;</span>
657
+ <span class="cline-any cline-neutral">&nbsp;</span>
658
+ <span class="cline-any cline-neutral">&nbsp;</span>
659
+ <span class="cline-any cline-neutral">&nbsp;</span>
660
+ <span class="cline-any cline-no">&nbsp;</span>
661
+ <span class="cline-any cline-no">&nbsp;</span>
662
+ <span class="cline-any cline-no">&nbsp;</span>
663
+ <span class="cline-any cline-neutral">&nbsp;</span>
664
+ <span class="cline-any cline-neutral">&nbsp;</span>
665
+ <span class="cline-any cline-neutral">&nbsp;</span>
666
+ <span class="cline-any cline-no">&nbsp;</span>
667
+ <span class="cline-any cline-no">&nbsp;</span>
668
+ <span class="cline-any cline-neutral">&nbsp;</span>
669
+ <span class="cline-any cline-no">&nbsp;</span>
670
+ <span class="cline-any cline-no">&nbsp;</span>
671
+ <span class="cline-any cline-no">&nbsp;</span>
672
+ <span class="cline-any cline-no">&nbsp;</span>
673
+ <span class="cline-any cline-neutral">&nbsp;</span>
674
+ <span class="cline-any cline-no">&nbsp;</span>
675
+ <span class="cline-any cline-neutral">&nbsp;</span>
676
+ <span class="cline-any cline-neutral">&nbsp;</span>
677
+ <span class="cline-any cline-neutral">&nbsp;</span>
678
+ <span class="cline-any cline-neutral">&nbsp;</span>
679
+ <span class="cline-any cline-neutral">&nbsp;</span>
680
+ <span class="cline-any cline-no">&nbsp;</span>
681
+ <span class="cline-any cline-no">&nbsp;</span>
682
+ <span class="cline-any cline-neutral">&nbsp;</span>
683
+ <span class="cline-any cline-no">&nbsp;</span>
684
+ <span class="cline-any cline-no">&nbsp;</span>
685
+ <span class="cline-any cline-neutral">&nbsp;</span>
686
+ <span class="cline-any cline-neutral">&nbsp;</span>
687
+ <span class="cline-any cline-neutral">&nbsp;</span>
688
+ <span class="cline-any cline-neutral">&nbsp;</span>
689
+ <span class="cline-any cline-neutral">&nbsp;</span>
690
+ <span class="cline-any cline-neutral">&nbsp;</span>
691
+ <span class="cline-any cline-neutral">&nbsp;</span>
692
+ <span class="cline-any cline-neutral">&nbsp;</span>
693
+ <span class="cline-any cline-neutral">&nbsp;</span>
694
+ <span class="cline-any cline-neutral">&nbsp;</span>
695
+ <span class="cline-any cline-neutral">&nbsp;</span>
696
+ <span class="cline-any cline-neutral">&nbsp;</span>
697
+ <span class="cline-any cline-yes">2x</span>
698
+ <span class="cline-any cline-yes">1x</span>
699
+ <span class="cline-any cline-neutral">&nbsp;</span>
700
+ <span class="cline-any cline-neutral">&nbsp;</span>
701
+ <span class="cline-any cline-neutral">&nbsp;</span>
702
+ <span class="cline-any cline-neutral">&nbsp;</span>
703
+ <span class="cline-any cline-neutral">&nbsp;</span>
704
+ <span class="cline-any cline-yes">3x</span>
705
+ <span class="cline-any cline-yes">3x</span>
706
+ <span class="cline-any cline-yes">1x</span>
707
+ <span class="cline-any cline-neutral">&nbsp;</span>
708
+ <span class="cline-any cline-neutral">&nbsp;</span>
709
+ <span class="cline-any cline-neutral">&nbsp;</span>
710
+ <span class="cline-any cline-yes">1x</span>
711
+ <span class="cline-any cline-yes">3x</span>
712
+ <span class="cline-any cline-neutral">&nbsp;</span>
713
+ <span class="cline-any cline-neutral">&nbsp;</span>
714
+ <span class="cline-any cline-yes">1x</span>
715
+ <span class="cline-any cline-yes">1x</span>
716
+ <span class="cline-any cline-neutral">&nbsp;</span>
717
+ <span class="cline-any cline-neutral">&nbsp;</span>
718
+ <span class="cline-any cline-yes">3x</span>
719
+ <span class="cline-any cline-neutral">&nbsp;</span>
720
+ <span class="cline-any cline-neutral">&nbsp;</span>
721
+ <span class="cline-any cline-neutral">&nbsp;</span>
722
+ <span class="cline-any cline-neutral">&nbsp;</span>
723
+ <span class="cline-any cline-neutral">&nbsp;</span>
724
+ <span class="cline-any cline-neutral">&nbsp;</span>
725
+ <span class="cline-any cline-neutral">&nbsp;</span>
726
+ <span class="cline-any cline-yes">1x</span>
727
+ <span class="cline-any cline-neutral">&nbsp;</span>
728
+ <span class="cline-any cline-neutral">&nbsp;</span>
729
+ <span class="cline-any cline-neutral">&nbsp;</span>
730
+ <span class="cline-any cline-neutral">&nbsp;</span>
731
+ <span class="cline-any cline-neutral">&nbsp;</span>
732
+ <span class="cline-any cline-neutral">&nbsp;</span>
733
+ <span class="cline-any cline-neutral">&nbsp;</span>
734
+ <span class="cline-any cline-neutral">&nbsp;</span>
735
+ <span class="cline-any cline-neutral">&nbsp;</span>
736
+ <span class="cline-any cline-yes">1x</span>
737
+ <span class="cline-any cline-neutral">&nbsp;</span>
738
+ <span class="cline-any cline-neutral">&nbsp;</span>
739
+ <span class="cline-any cline-neutral">&nbsp;</span>
740
+ <span class="cline-any cline-neutral">&nbsp;</span>
741
+ <span class="cline-any cline-yes">1x</span>
742
+ <span class="cline-any cline-neutral">&nbsp;</span>
743
+ <span class="cline-any cline-neutral">&nbsp;</span>
744
+ <span class="cline-any cline-neutral">&nbsp;</span>
745
+ <span class="cline-any cline-neutral">&nbsp;</span>
746
+ <span class="cline-any cline-neutral">&nbsp;</span>
747
+ <span class="cline-any cline-neutral">&nbsp;</span>
748
+ <span class="cline-any cline-neutral">&nbsp;</span>
749
+ <span class="cline-any cline-neutral">&nbsp;</span>
750
+ <span class="cline-any cline-neutral">&nbsp;</span>
751
+ <span class="cline-any cline-neutral">&nbsp;</span>
752
+ <span class="cline-any cline-neutral">&nbsp;</span>
753
+ <span class="cline-any cline-neutral">&nbsp;</span>
754
+ <span class="cline-any cline-neutral">&nbsp;</span>
755
+ <span class="cline-any cline-neutral">&nbsp;</span>
756
+ <span class="cline-any cline-neutral">&nbsp;</span>
757
+ <span class="cline-any cline-no">&nbsp;</span>
758
+ <span class="cline-any cline-no">&nbsp;</span>
759
+ <span class="cline-any cline-neutral">&nbsp;</span>
760
+ <span class="cline-any cline-neutral">&nbsp;</span>
761
+ <span class="cline-any cline-neutral">&nbsp;</span>
762
+ <span class="cline-any cline-neutral">&nbsp;</span>
763
+ <span class="cline-any cline-neutral">&nbsp;</span>
764
+ <span class="cline-any cline-neutral">&nbsp;</span>
765
+ <span class="cline-any cline-no">&nbsp;</span>
766
+ <span class="cline-any cline-no">&nbsp;</span>
767
+ <span class="cline-any cline-no">&nbsp;</span>
768
+ <span class="cline-any cline-neutral">&nbsp;</span>
769
+ <span class="cline-any cline-neutral">&nbsp;</span>
770
+ <span class="cline-any cline-neutral">&nbsp;</span>
771
+ <span class="cline-any cline-no">&nbsp;</span>
772
+ <span class="cline-any cline-no">&nbsp;</span>
773
+ <span class="cline-any cline-neutral">&nbsp;</span>
774
+ <span class="cline-any cline-no">&nbsp;</span>
775
+ <span class="cline-any cline-neutral">&nbsp;</span>
776
+ <span class="cline-any cline-neutral">&nbsp;</span>
777
+ <span class="cline-any cline-neutral">&nbsp;</span>
778
+ <span class="cline-any cline-neutral">&nbsp;</span>
779
+ <span class="cline-any cline-neutral">&nbsp;</span>
780
+ <span class="cline-any cline-neutral">&nbsp;</span>
781
+ <span class="cline-any cline-neutral">&nbsp;</span>
782
+ <span class="cline-any cline-neutral">&nbsp;</span>
783
+ <span class="cline-any cline-neutral">&nbsp;</span>
784
+ <span class="cline-any cline-neutral">&nbsp;</span>
785
+ <span class="cline-any cline-neutral">&nbsp;</span>
786
+ <span class="cline-any cline-no">&nbsp;</span>
787
+ <span class="cline-any cline-neutral">&nbsp;</span>
788
+ <span class="cline-any cline-no">&nbsp;</span>
789
+ <span class="cline-any cline-neutral">&nbsp;</span>
790
+ <span class="cline-any cline-neutral">&nbsp;</span>
791
+ <span class="cline-any cline-neutral">&nbsp;</span>
792
+ <span class="cline-any cline-no">&nbsp;</span>
793
+ <span class="cline-any cline-no">&nbsp;</span>
794
+ <span class="cline-any cline-neutral">&nbsp;</span>
795
+ <span class="cline-any cline-neutral">&nbsp;</span>
796
+ <span class="cline-any cline-neutral">&nbsp;</span>
797
+ <span class="cline-any cline-neutral">&nbsp;</span>
798
+ <span class="cline-any cline-neutral">&nbsp;</span>
799
+ <span class="cline-any cline-neutral">&nbsp;</span>
800
+ <span class="cline-any cline-neutral">&nbsp;</span>
801
+ <span class="cline-any cline-neutral">&nbsp;</span>
802
+ <span class="cline-any cline-neutral">&nbsp;</span>
803
+ <span class="cline-any cline-neutral">&nbsp;</span>
804
+ <span class="cline-any cline-neutral">&nbsp;</span>
805
+ <span class="cline-any cline-neutral">&nbsp;</span>
806
+ <span class="cline-any cline-neutral">&nbsp;</span>
807
+ <span class="cline-any cline-neutral">&nbsp;</span>
808
+ <span class="cline-any cline-neutral">&nbsp;</span>
809
+ <span class="cline-any cline-no">&nbsp;</span>
810
+ <span class="cline-any cline-no">&nbsp;</span>
811
+ <span class="cline-any cline-neutral">&nbsp;</span>
812
+ <span class="cline-any cline-neutral">&nbsp;</span>
813
+ <span class="cline-any cline-neutral">&nbsp;</span>
814
+ <span class="cline-any cline-neutral">&nbsp;</span>
815
+ <span class="cline-any cline-neutral">&nbsp;</span>
816
+ <span class="cline-any cline-neutral">&nbsp;</span>
817
+ <span class="cline-any cline-no">&nbsp;</span>
818
+ <span class="cline-any cline-no">&nbsp;</span>
819
+ <span class="cline-any cline-no">&nbsp;</span>
820
+ <span class="cline-any cline-neutral">&nbsp;</span>
821
+ <span class="cline-any cline-neutral">&nbsp;</span>
822
+ <span class="cline-any cline-neutral">&nbsp;</span>
823
+ <span class="cline-any cline-no">&nbsp;</span>
824
+ <span class="cline-any cline-no">&nbsp;</span>
825
+ <span class="cline-any cline-no">&nbsp;</span>
826
+ <span class="cline-any cline-neutral">&nbsp;</span>
827
+ <span class="cline-any cline-no">&nbsp;</span>
828
+ <span class="cline-any cline-no">&nbsp;</span>
829
+ <span class="cline-any cline-no">&nbsp;</span>
830
+ <span class="cline-any cline-neutral">&nbsp;</span>
831
+ <span class="cline-any cline-neutral">&nbsp;</span>
832
+ <span class="cline-any cline-no">&nbsp;</span>
833
+ <span class="cline-any cline-neutral">&nbsp;</span>
834
+ <span class="cline-any cline-neutral">&nbsp;</span>
835
+ <span class="cline-any cline-neutral">&nbsp;</span>
836
+ <span class="cline-any cline-neutral">&nbsp;</span>
837
+ <span class="cline-any cline-neutral">&nbsp;</span>
838
+ <span class="cline-any cline-neutral">&nbsp;</span>
839
+ <span class="cline-any cline-neutral">&nbsp;</span>
840
+ <span class="cline-any cline-neutral">&nbsp;</span>
841
+ <span class="cline-any cline-neutral">&nbsp;</span>
842
+ <span class="cline-any cline-no">&nbsp;</span>
843
+ <span class="cline-any cline-neutral">&nbsp;</span>
844
+ <span class="cline-any cline-no">&nbsp;</span>
845
+ <span class="cline-any cline-no">&nbsp;</span>
846
+ <span class="cline-any cline-neutral">&nbsp;</span>
847
+ <span class="cline-any cline-neutral">&nbsp;</span>
848
+ <span class="cline-any cline-neutral">&nbsp;</span>
849
+ <span class="cline-any cline-neutral">&nbsp;</span>
850
+ <span class="cline-any cline-neutral">&nbsp;</span>
851
+ <span class="cline-any cline-neutral">&nbsp;</span>
852
+ <span class="cline-any cline-neutral">&nbsp;</span>
853
+ <span class="cline-any cline-neutral">&nbsp;</span>
854
+ <span class="cline-any cline-neutral">&nbsp;</span>
855
+ <span class="cline-any cline-neutral">&nbsp;</span>
856
+ <span class="cline-any cline-neutral">&nbsp;</span>
857
+ <span class="cline-any cline-neutral">&nbsp;</span>
858
+ <span class="cline-any cline-neutral">&nbsp;</span>
859
+ <span class="cline-any cline-neutral">&nbsp;</span>
860
+ <span class="cline-any cline-neutral">&nbsp;</span>
861
+ <span class="cline-any cline-neutral">&nbsp;</span>
862
+ <span class="cline-any cline-neutral">&nbsp;</span>
863
+ <span class="cline-any cline-neutral">&nbsp;</span>
864
+ <span class="cline-any cline-no">&nbsp;</span>
865
+ <span class="cline-any cline-neutral">&nbsp;</span>
866
+ <span class="cline-any cline-no">&nbsp;</span>
867
+ <span class="cline-any cline-no">&nbsp;</span>
868
+ <span class="cline-any cline-no">&nbsp;</span>
869
+ <span class="cline-any cline-neutral">&nbsp;</span>
870
+ <span class="cline-any cline-neutral">&nbsp;</span>
871
+ <span class="cline-any cline-no">&nbsp;</span>
872
+ <span class="cline-any cline-no">&nbsp;</span>
873
+ <span class="cline-any cline-no">&nbsp;</span>
874
+ <span class="cline-any cline-neutral">&nbsp;</span>
875
+ <span class="cline-any cline-no">&nbsp;</span>
876
+ <span class="cline-any cline-no">&nbsp;</span>
877
+ <span class="cline-any cline-neutral">&nbsp;</span>
878
+ <span class="cline-any cline-neutral">&nbsp;</span>
879
+ <span class="cline-any cline-no">&nbsp;</span>
880
+ <span class="cline-any cline-neutral">&nbsp;</span>
881
+ <span class="cline-any cline-neutral">&nbsp;</span>
882
+ <span class="cline-any cline-neutral">&nbsp;</span>
883
+ <span class="cline-any cline-neutral">&nbsp;</span>
884
+ <span class="cline-any cline-neutral">&nbsp;</span>
885
+ <span class="cline-any cline-neutral">&nbsp;</span>
886
+ <span class="cline-any cline-neutral">&nbsp;</span>
887
+ <span class="cline-any cline-neutral">&nbsp;</span>
888
+ <span class="cline-any cline-neutral">&nbsp;</span>
889
+ <span class="cline-any cline-neutral">&nbsp;</span>
890
+ <span class="cline-any cline-neutral">&nbsp;</span>
891
+ <span class="cline-any cline-neutral">&nbsp;</span>
892
+ <span class="cline-any cline-neutral">&nbsp;</span>
893
+ <span class="cline-any cline-neutral">&nbsp;</span>
894
+ <span class="cline-any cline-no">&nbsp;</span>
895
+ <span class="cline-any cline-no">&nbsp;</span>
896
+ <span class="cline-any cline-neutral">&nbsp;</span>
897
+ <span class="cline-any cline-neutral">&nbsp;</span>
898
+ <span class="cline-any cline-neutral">&nbsp;</span>
899
+ <span class="cline-any cline-neutral">&nbsp;</span>
900
+ <span class="cline-any cline-neutral">&nbsp;</span>
901
+ <span class="cline-any cline-no">&nbsp;</span>
902
+ <span class="cline-any cline-no">&nbsp;</span>
903
+ <span class="cline-any cline-no">&nbsp;</span>
904
+ <span class="cline-any cline-neutral">&nbsp;</span>
905
+ <span class="cline-any cline-neutral">&nbsp;</span>
906
+ <span class="cline-any cline-no">&nbsp;</span>
907
+ <span class="cline-any cline-no">&nbsp;</span>
908
+ <span class="cline-any cline-neutral">&nbsp;</span>
909
+ <span class="cline-any cline-no">&nbsp;</span>
910
+ <span class="cline-any cline-neutral">&nbsp;</span>
911
+ <span class="cline-any cline-no">&nbsp;</span>
912
+ <span class="cline-any cline-no">&nbsp;</span>
913
+ <span class="cline-any cline-no">&nbsp;</span>
914
+ <span class="cline-any cline-neutral">&nbsp;</span>
915
+ <span class="cline-any cline-neutral">&nbsp;</span>
916
+ <span class="cline-any cline-neutral">&nbsp;</span>
917
+ <span class="cline-any cline-neutral">&nbsp;</span>
918
+ <span class="cline-any cline-neutral">&nbsp;</span>
919
+ <span class="cline-any cline-neutral">&nbsp;</span>
920
+ <span class="cline-any cline-neutral">&nbsp;</span>
921
+ <span class="cline-any cline-neutral">&nbsp;</span>
922
+ <span class="cline-any cline-no">&nbsp;</span>
923
+ <span class="cline-any cline-neutral">&nbsp;</span>
924
+ <span class="cline-any cline-neutral">&nbsp;</span>
925
+ <span class="cline-any cline-neutral">&nbsp;</span>
926
+ <span class="cline-any cline-neutral">&nbsp;</span>
927
+ <span class="cline-any cline-no">&nbsp;</span>
928
+ <span class="cline-any cline-no">&nbsp;</span>
929
+ <span class="cline-any cline-no">&nbsp;</span>
930
+ <span class="cline-any cline-neutral">&nbsp;</span>
931
+ <span class="cline-any cline-neutral">&nbsp;</span>
932
+ <span class="cline-any cline-no">&nbsp;</span>
933
+ <span class="cline-any cline-no">&nbsp;</span>
934
+ <span class="cline-any cline-neutral">&nbsp;</span>
935
+ <span class="cline-any cline-neutral">&nbsp;</span>
936
+ <span class="cline-any cline-neutral">&nbsp;</span>
937
+ <span class="cline-any cline-neutral">&nbsp;</span>
938
+ <span class="cline-any cline-neutral">&nbsp;</span>
939
+ <span class="cline-any cline-neutral">&nbsp;</span>
940
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
941
+ * Result Collector
942
+ *
943
+ * Handles collecting results, confidence scores, and consensus from agents.
944
+ *
945
+ * Migrated from:
946
+ * - collect-results.sh (75 lines)
947
+ * - collect-confidence-scores.sh (209 lines)
948
+ */
949
+ &nbsp;
950
+ import type {
951
+ TaskId,
952
+ AgentId,
953
+ Logger,
954
+ ConsensusScore
955
+ } from './types';
956
+ import {
957
+ CoordinationError,
958
+ CoordinationErrorType,
959
+ isValidTaskId,
960
+ isValidAgentId
961
+ } from './types';
962
+ import { RedisCoordinator } from './redis-client';
963
+ &nbsp;
964
+ export interface CollectionResult {
965
+ agentId: AgentId;
966
+ confidence: number;
967
+ testPassRate?: number;
968
+ result?: Record&lt;string, unknown&gt;;
969
+ }
970
+ &nbsp;
971
+ export interface AggregatedScores {
972
+ avgConfidence: number;
973
+ minConfidence: number;
974
+ maxConfidence: number;
975
+ consensus: number;
976
+ agentCount: number;
977
+ scores: ConsensusScore[];
978
+ timestamp: string;
979
+ }
980
+ &nbsp;
981
+ export class ResultCollector {
982
+ constructor(
983
+ private redis: RedisCoordinator,
984
+ private logger: Logger
985
+ ) {}
986
+ &nbsp;
987
+ /**
988
+ * Collect results from multiple agents
989
+ *
990
+ * In Task Mode: Returns empty array
991
+ * In CLI Mode: Retrieves from Redis
992
+ */
993
+ async collectResults(
994
+ taskId: TaskId,
995
+ agentIds: AgentId[],
996
+ namespace: string = 'swarm'
997
+ ): Promise&lt;CollectionResult[]&gt; {
998
+ // Validate input
999
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!isValidTaskId(taskId)) {
1000
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1001
+ CoordinationErrorType.VALIDATION_ERROR,
1002
+ `Invalid task ID: ${taskId}`
1003
+ );
1004
+ }
1005
+ &nbsp;
1006
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!agentIds || agentIds.length === 0) {
1007
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1008
+ CoordinationErrorType.VALIDATION_ERROR,
1009
+ 'Agent IDs list cannot be empty'
1010
+ );
1011
+ }
1012
+ &nbsp;
1013
+ // Validate all agent IDs
1014
+ for (const agentId of agentIds) {
1015
+ <span class="missing-if-branch" title="if path not taken" >I</span>if (!isValidAgentId(agentId)) {
1016
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1017
+ CoordinationErrorType.VALIDATION_ERROR,
1018
+ `Invalid agent ID: ${agentId}`
1019
+ );
1020
+ }
1021
+ }
1022
+ &nbsp;
1023
+ // Graceful no-op in Task Mode
1024
+ <span class="missing-if-branch" title="else path not taken" >E</span>if (!this.redis.canUseRedis) {
1025
+ this.logger.info('Task Mode: No results available in Redis');
1026
+ return [];
1027
+ }
1028
+ &nbsp;
1029
+ // CLI Mode: Collect from Redis
1030
+ const results: CollectionResult[] = <span class="cstat-no" title="statement not covered" >[];</span>
1031
+ &nbsp;
1032
+ <span class="cstat-no" title="statement not covered" > try {</span>
1033
+ <span class="cstat-no" title="statement not covered" > for (const agentId of agentIds) {</span>
1034
+ const confidenceKey = <span class="cstat-no" title="statement not covered" >`${namespace}:${taskId}:${agentId}:confidence`;</span>
1035
+ const resultKey = <span class="cstat-no" title="statement not covered" >`${namespace}:${taskId}:${agentId}:result`;</span>
1036
+ const testResultsKey = <span class="cstat-no" title="statement not covered" >`${namespace}:${taskId}:${agentId}:test-results`;</span>
1037
+ &nbsp;
1038
+ // Get confidence score
1039
+ const confidenceStr = <span class="cstat-no" title="statement not covered" >await this.redis.get(confidenceKey);</span>
1040
+ const confidence = <span class="cstat-no" title="statement not covered" >confidenceStr ? parseFloat(confidenceStr) : 0;</span>
1041
+ &nbsp;
1042
+ // Get test pass rate if available
1043
+ const testResultsData = <span class="cstat-no" title="statement not covered" >await this.redis.hgetall(testResultsKey);</span>
1044
+ const testPassRate = <span class="cstat-no" title="statement not covered" >testResultsData?.passRate</span>
1045
+ ? parseFloat(testResultsData.passRate)
1046
+ : undefined;
1047
+ &nbsp;
1048
+ // Get full result
1049
+ const resultData = <span class="cstat-no" title="statement not covered" >await this.redis.hgetall(resultKey);</span>
1050
+ &nbsp;
1051
+ <span class="cstat-no" title="statement not covered" > results.push({</span>
1052
+ agentId,
1053
+ confidence,
1054
+ testPassRate,
1055
+ result: resultData &amp;&amp; Object.keys(resultData).length &gt; 0 ? resultData : undefined
1056
+ });
1057
+ }
1058
+ &nbsp;
1059
+ <span class="cstat-no" title="statement not covered" > this.logger.info(`✅ Collected results from ${results.length} agents`);</span>
1060
+ <span class="cstat-no" title="statement not covered" > return results;</span>
1061
+ } catch (error) {
1062
+ <span class="cstat-no" title="statement not covered" > this.logger.error('Failed to collect results', error as Error);</span>
1063
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1064
+ CoordinationErrorType.REDIS_UNAVAILABLE,
1065
+ `Failed to collect results: ${(error as Error).message}`
1066
+ );
1067
+ }
1068
+ }
1069
+ &nbsp;
1070
+ /**
1071
+ * Collect confidence scores from validator agents
1072
+ *
1073
+ * In Task Mode: Returns empty array
1074
+ * In CLI Mode: Retrieves from Redis and aggregates
1075
+ */
1076
+ <span class="fstat-no" title="function not covered" > async </span>collectConfidenceScores(
1077
+ taskId: TaskId,
1078
+ validatorIds: AgentId[],
1079
+ namespace: string = <span class="branch-0 cbranch-no" title="branch not covered" >'swarm'</span>
1080
+ ): Promise&lt;CollectionResult[]&gt; {
1081
+ // Validate input
1082
+ <span class="cstat-no" title="statement not covered" > if (!isValidTaskId(taskId)) {</span>
1083
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1084
+ CoordinationErrorType.VALIDATION_ERROR,
1085
+ `Invalid task ID: ${taskId}`
1086
+ );
1087
+ }
1088
+ &nbsp;
1089
+ <span class="cstat-no" title="statement not covered" > if (!validatorIds || validatorIds.length === 0) {</span>
1090
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1091
+ CoordinationErrorType.VALIDATION_ERROR,
1092
+ 'Validator IDs list cannot be empty'
1093
+ );
1094
+ }
1095
+ &nbsp;
1096
+ // Graceful no-op in Task Mode
1097
+ <span class="cstat-no" title="statement not covered" > if (!this.redis.canUseRedis) {</span>
1098
+ <span class="cstat-no" title="statement not covered" > this.logger.info('Task Mode: No confidence scores available in Redis');</span>
1099
+ <span class="cstat-no" title="statement not covered" > return [];</span>
1100
+ }
1101
+ &nbsp;
1102
+ // CLI Mode: Collect scores from validators
1103
+ <span class="cstat-no" title="statement not covered" > try {</span>
1104
+ const scores: CollectionResult[] = <span class="cstat-no" title="statement not covered" >[];</span>
1105
+ &nbsp;
1106
+ <span class="cstat-no" title="statement not covered" > for (const validatorId of validatorIds) {</span>
1107
+ const scoreKey = <span class="cstat-no" title="statement not covered" >`${namespace}:${taskId}:${validatorId}:confidence`;</span>
1108
+ const scoreStr = <span class="cstat-no" title="statement not covered" >await this.redis.get(scoreKey);</span>
1109
+ const confidence = <span class="cstat-no" title="statement not covered" >scoreStr ? parseFloat(scoreStr) : 0;</span>
1110
+ &nbsp;
1111
+ <span class="cstat-no" title="statement not covered" > scores.push({</span>
1112
+ agentId: validatorId,
1113
+ confidence
1114
+ });
1115
+ }
1116
+ &nbsp;
1117
+ <span class="cstat-no" title="statement not covered" > this.logger.info(`✅ Collected confidence scores from ${scores.length} validators`);</span>
1118
+ <span class="cstat-no" title="statement not covered" > return scores;</span>
1119
+ } catch (error) {
1120
+ <span class="cstat-no" title="statement not covered" > this.logger.error('Failed to collect confidence scores', error as Error);</span>
1121
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1122
+ CoordinationErrorType.REDIS_UNAVAILABLE,
1123
+ `Failed to collect confidence scores: ${(error as Error).message}`
1124
+ );
1125
+ }
1126
+ }
1127
+ &nbsp;
1128
+ /**
1129
+ * Aggregate confidence scores and calculate consensus
1130
+ *
1131
+ * Calculates average, min, max, and overall consensus score
1132
+ */
1133
+ aggregateScores(scores: CollectionResult[]): AggregatedScores {
1134
+ if (!scores || scores.length === 0) {
1135
+ throw new CoordinationError(
1136
+ CoordinationErrorType.VALIDATION_ERROR,
1137
+ 'Cannot aggregate empty scores array'
1138
+ );
1139
+ }
1140
+ &nbsp;
1141
+ const confidences = scores.map(s =&gt; s.confidence);
1142
+ const total = confidences.reduce((a, b) =&gt; a + b, 0);
1143
+ const avgConfidence = total / confidences.length;
1144
+ &nbsp;
1145
+ // Calculate consensus (how close scores are to each other)
1146
+ // Use standard deviation normalized to 0-1 range
1147
+ const variance = confidences.reduce(
1148
+ (sum, conf) =&gt; sum + Math.pow(conf - avgConfidence, 2),
1149
+ 0
1150
+ ) / confidences.length;
1151
+ const stdDev = Math.sqrt(variance);
1152
+ const consensus = Math.max(0, 1 - stdDev);
1153
+ &nbsp;
1154
+ // Convert to consensus scores for storage
1155
+ const consensusScores: ConsensusScore[] = scores.map(result =&gt; ({
1156
+ agentId: result.agentId,
1157
+ score: result.confidence,
1158
+ feedback: `Confidence score: ${(result.confidence * 100).toFixed(1)}%`,
1159
+ iteration: 1,
1160
+ timestamp: new Date().toISOString()
1161
+ }));
1162
+ &nbsp;
1163
+ const aggregated: AggregatedScores = {
1164
+ avgConfidence,
1165
+ minConfidence: Math.min(...confidences),
1166
+ maxConfidence: Math.max(...confidences),
1167
+ consensus,
1168
+ agentCount: scores.length,
1169
+ scores: consensusScores,
1170
+ timestamp: new Date().toISOString()
1171
+ };
1172
+ &nbsp;
1173
+ this.logger.info(
1174
+ `📊 Aggregated scores: Avg=${(avgConfidence * 100).toFixed(1)}%, ` +
1175
+ `Consensus=${(consensus * 100).toFixed(1)}%, Agents=${scores.length}`
1176
+ );
1177
+ &nbsp;
1178
+ return aggregated;
1179
+ }
1180
+ &nbsp;
1181
+ /**
1182
+ * Store aggregated scores in Redis
1183
+ *
1184
+ * In Task Mode: Logs and returns gracefully
1185
+ * In CLI Mode: Stores in Redis
1186
+ */
1187
+ <span class="fstat-no" title="function not covered" > async </span>storeAggregatedScores(
1188
+ taskId: TaskId,
1189
+ aggregated: AggregatedScores,
1190
+ iteration: number = <span class="branch-0 cbranch-no" title="branch not covered" >1,</span>
1191
+ namespace: string = <span class="branch-0 cbranch-no" title="branch not covered" >'swarm'</span>
1192
+ ): Promise&lt;void&gt; {
1193
+ // Validate input
1194
+ <span class="cstat-no" title="statement not covered" > if (!isValidTaskId(taskId)) {</span>
1195
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1196
+ CoordinationErrorType.VALIDATION_ERROR,
1197
+ `Invalid task ID: ${taskId}`
1198
+ );
1199
+ }
1200
+ &nbsp;
1201
+ // Graceful no-op in Task Mode
1202
+ <span class="cstat-no" title="statement not covered" > if (!this.redis.canUseRedis) {</span>
1203
+ <span class="cstat-no" title="statement not covered" > this.logger.info('Task Mode: Aggregated scores not stored (no Redis)');</span>
1204
+ <span class="cstat-no" title="statement not covered" > return;</span>
1205
+ }
1206
+ &nbsp;
1207
+ // CLI Mode: Store in Redis
1208
+ <span class="cstat-no" title="statement not covered" > try {</span>
1209
+ const key = <span class="cstat-no" title="statement not covered" >`${namespace}:${taskId}:aggregated-scores:iteration-${iteration}`;</span>
1210
+ &nbsp;
1211
+ <span class="cstat-no" title="statement not covered" > await this.redis.hset(</span>
1212
+ key,
1213
+ 'avgConfidence', String(aggregated.avgConfidence),
1214
+ 'minConfidence', String(aggregated.minConfidence),
1215
+ 'maxConfidence', String(aggregated.maxConfidence),
1216
+ 'consensus', String(aggregated.consensus),
1217
+ 'agentCount', String(aggregated.agentCount),
1218
+ 'iteration', String(iteration),
1219
+ 'timestamp', aggregated.timestamp
1220
+ );
1221
+ &nbsp;
1222
+ // Set TTL (24 hours)
1223
+ <span class="cstat-no" title="statement not covered" > await this.redis.expire(key, 86400);</span>
1224
+ &nbsp;
1225
+ <span class="cstat-no" title="statement not covered" > this.logger.info(</span>
1226
+ `✅ Aggregated scores stored: Consensus=${(aggregated.consensus * 100).toFixed(1)}%`
1227
+ );
1228
+ } catch (error) {
1229
+ <span class="cstat-no" title="statement not covered" > this.logger.error('Failed to store aggregated scores', error as Error);</span>
1230
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1231
+ CoordinationErrorType.REDIS_UNAVAILABLE,
1232
+ `Failed to store aggregated scores: ${(error as Error).message}`
1233
+ );
1234
+ }
1235
+ }
1236
+ &nbsp;
1237
+ /**
1238
+ * Get aggregated scores for an iteration
1239
+ */
1240
+ <span class="fstat-no" title="function not covered" > async </span>getAggregatedScores(
1241
+ taskId: TaskId,
1242
+ iteration: number = <span class="branch-0 cbranch-no" title="branch not covered" >1,</span>
1243
+ namespace: string = <span class="branch-0 cbranch-no" title="branch not covered" >'swarm'</span>
1244
+ ): Promise&lt;AggregatedScores | null&gt; {
1245
+ // Validate input
1246
+ <span class="cstat-no" title="statement not covered" > if (!isValidTaskId(taskId)) {</span>
1247
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1248
+ CoordinationErrorType.VALIDATION_ERROR,
1249
+ `Invalid task ID: ${taskId}`
1250
+ );
1251
+ }
1252
+ &nbsp;
1253
+ // Graceful no-op in Task Mode
1254
+ <span class="cstat-no" title="statement not covered" > if (!this.redis.canUseRedis) {</span>
1255
+ <span class="cstat-no" title="statement not covered" > this.logger.info('Task Mode: No aggregated scores available in Redis');</span>
1256
+ <span class="cstat-no" title="statement not covered" > return null;</span>
1257
+ }
1258
+ &nbsp;
1259
+ // CLI Mode: Retrieve from Redis
1260
+ <span class="cstat-no" title="statement not covered" > try {</span>
1261
+ const key = <span class="cstat-no" title="statement not covered" >`${namespace}:${taskId}:aggregated-scores:iteration-${iteration}`;</span>
1262
+ const data = <span class="cstat-no" title="statement not covered" >await this.redis.hgetall(key);</span>
1263
+ &nbsp;
1264
+ <span class="cstat-no" title="statement not covered" > if (!data || Object.keys(data).length === 0) {</span>
1265
+ <span class="cstat-no" title="statement not covered" > this.logger.warn(`No aggregated scores found for iteration ${iteration}`);</span>
1266
+ <span class="cstat-no" title="statement not covered" > return null;</span>
1267
+ }
1268
+ &nbsp;
1269
+ const aggregated: AggregatedScores = <span class="cstat-no" title="statement not covered" >{</span>
1270
+ avgConfidence: parseFloat(data.avgConfidence || '0'),
1271
+ minConfidence: parseFloat(data.minConfidence || '0'),
1272
+ maxConfidence: parseFloat(data.maxConfidence || '0'),
1273
+ consensus: parseFloat(data.consensus || '0'),
1274
+ agentCount: parseInt(data.agentCount || '0', 10),
1275
+ scores: [],
1276
+ timestamp: data.timestamp || new Date().toISOString()
1277
+ };
1278
+ &nbsp;
1279
+ <span class="cstat-no" title="statement not covered" > return aggregated;</span>
1280
+ } catch (error) {
1281
+ <span class="cstat-no" title="statement not covered" > this.logger.error('Failed to get aggregated scores', error as Error);</span>
1282
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1283
+ CoordinationErrorType.REDIS_UNAVAILABLE,
1284
+ `Failed to retrieve aggregated scores: ${(error as Error).message}`
1285
+ );
1286
+ }
1287
+ }
1288
+ &nbsp;
1289
+ /**
1290
+ * Get combined results with confidence and test metrics
1291
+ */
1292
+ <span class="fstat-no" title="function not covered" > async </span>getCombinedMetrics(
1293
+ taskId: TaskId,
1294
+ agentIds: AgentId[],
1295
+ namespace: string = <span class="branch-0 cbranch-no" title="branch not covered" >'swarm'</span>
1296
+ ): Promise&lt;{
1297
+ results: CollectionResult[];
1298
+ avgConfidence: number;
1299
+ overallTestPassRate?: number;
1300
+ }&gt; {
1301
+ const results = <span class="cstat-no" title="statement not covered" >await this.collectResults(taskId, agentIds, namespace);</span>
1302
+ &nbsp;
1303
+ const confidences = <span class="cstat-no" title="statement not covered" >results.map(<span class="fstat-no" title="function not covered" >r </span>=&gt; <span class="cstat-no" title="statement not covered" >r.confidence)</span>;</span>
1304
+ const avgConfidence = <span class="cstat-no" title="statement not covered" >confidences.length &gt; 0</span>
1305
+ ? confidences.reduce(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; <span class="cstat-no" title="statement not covered" >a + b,</span> 0) / confidences.length
1306
+ : 0;
1307
+ &nbsp;
1308
+ const testPassRates = <span class="cstat-no" title="statement not covered" >results</span>
1309
+ .filter(<span class="fstat-no" title="function not covered" >r </span>=&gt; <span class="cstat-no" title="statement not covered" >r.testPassRate !== undefined)</span>
1310
+ .map(<span class="fstat-no" title="function not covered" >r </span>=&gt; <span class="cstat-no" title="statement not covered" >r.testPassRate!)</span>;
1311
+ &nbsp;
1312
+ const overallTestPassRate = <span class="cstat-no" title="statement not covered" >testPassRates.length &gt; 0</span>
1313
+ ? testPassRates.reduce(<span class="fstat-no" title="function not covered" >(a</span>, b) =&gt; <span class="cstat-no" title="statement not covered" >a + b,</span> 0) / testPassRates.length
1314
+ : undefined;
1315
+ &nbsp;
1316
+ <span class="cstat-no" title="statement not covered" > return {</span>
1317
+ results,
1318
+ avgConfidence,
1319
+ overallTestPassRate
1320
+ };
1321
+ }
1322
+ &nbsp;
1323
+ /**
1324
+ * Clear results for a task
1325
+ */
1326
+ <span class="fstat-no" title="function not covered" > async </span>clearResults(
1327
+ taskId: TaskId,
1328
+ agentIds?: AgentId[],
1329
+ namespace: string = <span class="branch-0 cbranch-no" title="branch not covered" >'swarm'</span>
1330
+ ): Promise&lt;void&gt; {
1331
+ <span class="cstat-no" title="statement not covered" > if (!isValidTaskId(taskId)) {</span>
1332
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1333
+ CoordinationErrorType.VALIDATION_ERROR,
1334
+ `Invalid task ID: ${taskId}`
1335
+ );
1336
+ }
1337
+ &nbsp;
1338
+ <span class="cstat-no" title="statement not covered" > if (!this.redis.canUseRedis) {</span>
1339
+ <span class="cstat-no" title="statement not covered" > this.logger.info('Task Mode: Result cleanup skipped');</span>
1340
+ <span class="cstat-no" title="statement not covered" > return;</span>
1341
+ }
1342
+ &nbsp;
1343
+ <span class="cstat-no" title="statement not covered" > try {</span>
1344
+ const keysToDelete: string[] = <span class="cstat-no" title="statement not covered" >[];</span>
1345
+ &nbsp;
1346
+ <span class="cstat-no" title="statement not covered" > if (agentIds &amp;&amp; agentIds.length &gt; 0) {</span>
1347
+ // Clear specific agents' results
1348
+ <span class="cstat-no" title="statement not covered" > for (const agentId of agentIds) {</span>
1349
+ <span class="cstat-no" title="statement not covered" > if (isValidAgentId(agentId)) {</span>
1350
+ <span class="cstat-no" title="statement not covered" > keysToDelete.push(</span>
1351
+ `${namespace}:${taskId}:${agentId}:confidence`,
1352
+ `${namespace}:${taskId}:${agentId}:result`,
1353
+ `${namespace}:${taskId}:${agentId}:test-results`
1354
+ );
1355
+ }
1356
+ }
1357
+ } else {
1358
+ // Clear all results for task (pattern scan)
1359
+ const pattern = <span class="cstat-no" title="statement not covered" >`${namespace}:${taskId}:*:result`;</span>
1360
+ // Note: Full pattern scanning would require additional Redis operations
1361
+ // For now, we'll require specific agent IDs
1362
+ }
1363
+ &nbsp;
1364
+ <span class="cstat-no" title="statement not covered" > if (keysToDelete.length &gt; 0) {</span>
1365
+ <span class="cstat-no" title="statement not covered" > await this.redis.del(...keysToDelete);</span>
1366
+ <span class="cstat-no" title="statement not covered" > this.logger.info(`✅ Cleared results for ${keysToDelete.length / 3} agents`);</span>
1367
+ }
1368
+ } catch (error) {
1369
+ <span class="cstat-no" title="statement not covered" > this.logger.error('Failed to clear results', error as Error);</span>
1370
+ <span class="cstat-no" title="statement not covered" > throw new CoordinationError(</span>
1371
+ CoordinationErrorType.REDIS_UNAVAILABLE,
1372
+ `Failed to clear results: ${(error as Error).message}`
1373
+ );
1374
+ }
1375
+ }
1376
+ }
1377
+ &nbsp;</pre></td></tr></table></pre>
1378
+
1379
+ <div class='push'></div><!-- for sticky footer -->
1380
+ </div><!-- /wrapper -->
1381
+ <div class='footer quiet pad2 space-top1 center small'>
1382
+ Code coverage generated by
1383
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1384
+ at 2025-11-19T18:59:08.684Z
1385
+ </div>
1386
+ <script src="prettify.js"></script>
1387
+ <script>
1388
+ window.onload = function () {
1389
+ prettyPrint();
1390
+ };
1391
+ </script>
1392
+ <script src="sorter.js"></script>
1393
+ <script src="block-navigation.js"></script>
1394
+ </body>
1395
+ </html>
1396
+